Skip to content

Commit b8cb60a

Browse files
committed
chore: prepare v0.1.0 release
1 parent 7c5d396 commit b8cb60a

8 files changed

Lines changed: 276 additions & 20 deletions

File tree

.github/workflows/release.yml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,22 +160,28 @@ jobs:
160160
- name: Build linux packages
161161
shell: bash
162162
run: |
163-
cargo build --locked --profile dist --target x86_64-unknown-linux-gnu
163+
export CARGO_TARGET_DIR="${GITHUB_WORKSPACE}/target"
164+
165+
cargo build --locked --profile dist --target x86_64-unknown-linux-gnu -p keel
164166
strip --strip-unneeded target/x86_64-unknown-linux-gnu/dist/keel
165167
166168
version="$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[] | select(.name == "keel").version')"
167169
mkdir -p target/distrib
168170
169171
cargo deb \
172+
-p keel \
170173
--no-build \
171174
--profile dist \
172175
--target x86_64-unknown-linux-gnu \
173176
--output "target/distrib/keel_${version}_amd64.deb"
174177
175-
cargo generate-rpm \
176-
--profile dist \
177-
--target x86_64-unknown-linux-gnu \
178-
-o target/distrib
178+
(
179+
cd crates/keel-cli
180+
cargo generate-rpm \
181+
--profile dist \
182+
--target x86_64-unknown-linux-gnu \
183+
-o ../../target/distrib
184+
)
179185
180186
- name: Upload linux packages
181187
uses: actions/upload-artifact@v4

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ version = "0.1.0"
1313
edition = "2024"
1414
authors = ["keel contributors"]
1515
license = "MIT"
16-
repository = "https://github.com/rupurt/keel"
17-
homepage = "https://github.com/rupurt/keel"
16+
repository = "https://github.com/spoke-sh/keel"
17+
homepage = "https://github.com/spoke-sh/keel"
1818

1919
[workspace.dependencies]
2020
keel-core = { path = "crates/keel-core" }

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
> **Turn-based board engine for human/AI delivery teams.**
44
5-
[![Keel Board](https://img.shields.io/badge/Keel-Board-blue)](https://github.com/rupurt/keel/blob/main/.keel/README.md)
6-
[![CI](https://github.com/rupurt/keel/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/rupurt/keel/actions/workflows/ci.yml)
5+
[![Keel Board](https://img.shields.io/badge/Keel-Board-blue)](https://github.com/spoke-sh/keel/blob/main/.keel/README.md)
6+
[![CI](https://github.com/spoke-sh/keel/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/spoke-sh/keel/actions/workflows/ci.yml)
77

88
Welcome to Keel. This is not a notes app with automation bolted on; it is a board engine designed for the era of human-agent collaboration. Keel treats software development as a high-fidelity operating system where **Formal Rules** act as the physics, **Turns** are the unit of progress, and **Play** remains a first-class tool for discovery.
99

RELEASE.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ curl --proto '=https' --tlsv1.2 -LsSf https://github.com/spoke-sh/keel/releases/
2020
### Nix (Anywhere)
2121

2222
```bash
23-
nix run github:rupurt/keel
23+
nix run github:spoke-sh/keel
2424
```
2525

2626
### Upgrade an Existing Install
@@ -74,7 +74,7 @@ Pushing the tag triggers the [Release GitHub Action](.github/workflows/release.y
7474

7575
### 5. Verify the Release
7676
Once the GitHub Action completes:
77-
1. Go to the [Releases](https://github.com/rupurt/keel/releases) page.
77+
1. Go to the [Releases](https://github.com/spoke-sh/keel/releases) page.
7878
2. Verify that all artifacts (tarballs and installers) are attached.
7979
3. Ensure the `checksums.txt` file is present.
8080

crates/keel-cli/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ dist = true
2121
[package.metadata.deb]
2222
maintainer = "keel contributors"
2323
copyright = "2026, keel contributors"
24-
license-file = ["LICENSE", "0"]
24+
license-file = ["../../LICENSE", "0"]
2525
depends = "$auto"
2626
section = "utils"
2727
priority = "optional"
@@ -32,8 +32,8 @@ keel is a fast CLI for agentic SDLC management."""
3232
summary = "Fast CLI for project board management"
3333
assets = [
3434
{ source = "target/release/keel", dest = "/usr/bin/keel", mode = "755" },
35-
{ source = "README.md", dest = "/usr/share/doc/keel/README.md", mode = "644", doc = true },
36-
{ source = "LICENSE", dest = "/usr/share/doc/keel/LICENSE", mode = "644", doc = true },
35+
{ source = "../../README.md", dest = "/usr/share/doc/keel/README.md", mode = "644", doc = true },
36+
{ source = "../../LICENSE", dest = "/usr/share/doc/keel/LICENSE", mode = "644", doc = true },
3737
]
3838

3939
[dependencies]

crates/keel-cli/src/cli/commands/setup/hooks.rs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
//! `keel hooks install` — install git hooks that enforce the pacemaker protocol.
22
33
use std::fs;
4-
use std::os::unix::fs::PermissionsExt;
54
use std::path::Path;
65

76
use anyhow::{Context, Result, anyhow};
87

8+
#[cfg(unix)]
9+
use std::os::unix::fs::PermissionsExt;
10+
911
const PRE_COMMIT_HOOK: &str = r#"#!/bin/sh
1012
# keel pacemaker protocol — run quality checks and tests at the commit boundary.
1113
# Installed by `keel hooks install`. Do not edit manually.
@@ -116,8 +118,22 @@ fn install_hook(hooks_dir: &Path, name: &str, content: &str) -> Result<()> {
116118
fs::write(&hook_path, content)
117119
.with_context(|| format!("Failed to write hook: {}", hook_path.display()))?;
118120

119-
fs::set_permissions(&hook_path, fs::Permissions::from_mode(0o755))
120-
.with_context(|| format!("Failed to set permissions on: {}", hook_path.display()))?;
121+
set_hook_permissions(&hook_path)?;
122+
123+
Ok(())
124+
}
125+
126+
fn set_hook_permissions(hook_path: &Path) -> Result<()> {
127+
#[cfg(unix)]
128+
{
129+
fs::set_permissions(hook_path, fs::Permissions::from_mode(0o755))
130+
.with_context(|| format!("Failed to set permissions on: {}", hook_path.display()))?;
131+
}
132+
133+
#[cfg(not(unix))]
134+
{
135+
let _ = hook_path;
136+
}
121137

122138
Ok(())
123139
}
@@ -127,6 +143,9 @@ mod tests {
127143
use super::*;
128144
use tempfile::tempdir;
129145

146+
#[cfg(unix)]
147+
use std::os::unix::fs::PermissionsExt;
148+
130149
fn init_git_repo(dir: &Path) {
131150
std::process::Command::new("git")
132151
.args(["init", "--quiet"])
@@ -150,8 +169,11 @@ mod tests {
150169
assert!(pre_commit.exists());
151170
assert!(commit_msg.exists());
152171

153-
let pre_mode = fs::metadata(&pre_commit).unwrap().permissions().mode();
154-
assert_eq!(pre_mode & 0o755, 0o755);
172+
#[cfg(unix)]
173+
{
174+
let pre_mode = fs::metadata(&pre_commit).unwrap().permissions().mode();
175+
assert_eq!(pre_mode & 0o755, 0o755);
176+
}
155177

156178
let content = fs::read_to_string(&pre_commit).unwrap();
157179
assert!(content.contains("keel pacemaker protocol"));

crates/keel-cli/wix/main.wxs

Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
<?xml version='1.0' encoding='windows-1252'?>
2+
<!--
3+
Copyright (C) 2017 Christopher R. Field.
4+
5+
Licensed under the Apache License, Version 2.0 (the "License");
6+
you may not use this file except in compliance with the License.
7+
You may obtain a copy of the License at
8+
9+
http://www.apache.org/licenses/LICENSE-2.0
10+
11+
Unless required by applicable law or agreed to in writing, software
12+
distributed under the License is distributed on an "AS IS" BASIS,
13+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
See the License for the specific language governing permissions and
15+
limitations under the License.
16+
-->
17+
18+
<!--
19+
The "cargo wix" subcommand provides a variety of predefined variables available
20+
for customization of this template. The values for each variable are set at
21+
installer creation time. The following variables are available:
22+
23+
TargetTriple = The rustc target triple name.
24+
TargetEnv = The rustc target environment. This is typically either
25+
"msvc" or "gnu" depending on the toolchain downloaded and
26+
installed.
27+
TargetVendor = The rustc target vendor. This is typically "pc", but Rust
28+
does support other vendors, like "uwp".
29+
CargoTargetBinDir = The complete path to the directory containing the
30+
binaries (exes) to include. The default would be
31+
"target\release\". If an explicit rustc target triple is
32+
used, i.e. cross-compiling, then the default path would
33+
be "target\<CARGO_TARGET>\<CARGO_PROFILE>",
34+
where "<CARGO_TARGET>" is replaced with the "CargoTarget"
35+
variable value and "<CARGO_PROFILE>" is replaced with the
36+
value from the "CargoProfile" variable. This can also
37+
be overridden manually with the "target-bin-dir" flag.
38+
CargoTargetDir = The path to the directory for the build artifacts, i.e.
39+
"target".
40+
CargoProfile = The cargo profile used to build the binaries
41+
(usually "debug" or "release").
42+
Version = The version for the installer. The default is the
43+
"Major.Minor.Fix" semantic versioning number of the Rust
44+
package.
45+
-->
46+
47+
<!--
48+
Please do not remove these pre-processor If-Else blocks. These are used with
49+
the `cargo wix` subcommand to automatically determine the installation
50+
destination for 32-bit versus 64-bit installers. Removal of these lines will
51+
cause installation errors.
52+
-->
53+
<?if $(sys.BUILDARCH) = x64 or $(sys.BUILDARCH) = arm64 ?>
54+
<?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
55+
<?else ?>
56+
<?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
57+
<?endif ?>
58+
59+
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
60+
61+
<Product
62+
Id='*'
63+
Name='keel'
64+
UpgradeCode='A1F530AB-C0A0-4811-8BF3-80A08ACC3E7F'
65+
Manufacturer='keel contributors'
66+
Language='1033'
67+
Codepage='1252'
68+
Version='$(var.Version)'>
69+
70+
<Package Id='*'
71+
Keywords='Installer'
72+
Description='Fast CLI for project board management'
73+
Manufacturer='keel contributors'
74+
InstallerVersion='450'
75+
Languages='1033'
76+
Compressed='yes'
77+
InstallScope='perMachine'
78+
SummaryCodepage='1252'
79+
/>
80+
81+
<MajorUpgrade
82+
Schedule='afterInstallInitialize'
83+
DowngradeErrorMessage='A newer version of [ProductName] is already installed. Setup will now exit.'/>
84+
85+
<Media Id='1' Cabinet='media1.cab' EmbedCab='yes' DiskPrompt='CD-ROM #1'/>
86+
<Property Id='DiskPrompt' Value='keel Installation'/>
87+
88+
<Directory Id='TARGETDIR' Name='SourceDir'>
89+
<Directory Id='$(var.PlatformProgramFilesFolder)' Name='PFiles'>
90+
<Directory Id='APPLICATIONFOLDER' Name='keel'>
91+
92+
<!--
93+
Enabling the license sidecar file in the installer is a four step process:
94+
95+
1. Uncomment the `Component` tag and its contents.
96+
2. Change the value for the `Source` attribute in the `File` tag to a path
97+
to the file that should be included as the license sidecar file. The path
98+
can, and probably should be, relative to this file.
99+
3. Change the value for the `Name` attribute in the `File` tag to the
100+
desired name for the file when it is installed alongside the `bin` folder
101+
in the installation directory. This can be omitted if the desired name is
102+
the same as the file name.
103+
4. Uncomment the `ComponentRef` tag with the Id attribute value of "License"
104+
further down in this file.
105+
-->
106+
<!--
107+
<Component Id='License' Guid='*'>
108+
<File Id='LicenseFile' Name='ChangeMe' DiskId='1' Source='C:\Path\To\File' KeyPath='yes'/>
109+
</Component>
110+
-->
111+
112+
<Directory Id='Bin' Name='bin'>
113+
<Component Id='Path' Guid='5B298B7E-F56C-43DB-A7E1-AA2A97424EA8' KeyPath='yes'>
114+
<Environment
115+
Id='PATH'
116+
Name='PATH'
117+
Value='[Bin]'
118+
Permanent='no'
119+
Part='last'
120+
Action='set'
121+
System='yes'/>
122+
</Component>
123+
<Component Id='binary0' Guid='*'>
124+
<File
125+
Id='exe0'
126+
Name='keel.exe'
127+
DiskId='1'
128+
Source='$(var.CargoTargetBinDir)\keel.exe'
129+
KeyPath='yes'/>
130+
</Component>
131+
</Directory>
132+
</Directory>
133+
</Directory>
134+
</Directory>
135+
136+
<Feature
137+
Id='Binaries'
138+
Title='Application'
139+
Description='Installs all binaries and the license.'
140+
Level='1'
141+
ConfigurableDirectory='APPLICATIONFOLDER'
142+
AllowAdvertise='no'
143+
Display='expand'
144+
Absent='disallow'>
145+
146+
<!--
147+
Uncomment the following `ComponentRef` tag to add the license
148+
sidecar file to the installer.
149+
-->
150+
<!--<ComponentRef Id='License'/>-->
151+
152+
<ComponentRef Id='binary0'/>
153+
154+
<Feature
155+
Id='Environment'
156+
Title='PATH Environment Variable'
157+
Description='Add the install location of the [ProductName] executable to the PATH system environment variable. This allows the [ProductName] executable to be called from any location.'
158+
Level='1'
159+
Absent='allow'>
160+
<ComponentRef Id='Path'/>
161+
</Feature>
162+
</Feature>
163+
164+
<SetProperty Id='ARPINSTALLLOCATION' Value='[APPLICATIONFOLDER]' After='CostFinalize'/>
165+
166+
167+
<!--
168+
Uncomment the following `Icon` and `Property` tags to change the product icon.
169+
170+
The product icon is the graphic that appears in the Add/Remove
171+
Programs control panel for the application.
172+
-->
173+
<!--<Icon Id='ProductICO' SourceFile='wix\Product.ico'/>-->
174+
<!--<Property Id='ARPPRODUCTICON' Value='ProductICO' />-->
175+
176+
<Property Id='ARPHELPLINK' Value='https://github.com/spoke-sh/keel'/>
177+
178+
<UI>
179+
<UIRef Id='WixUI_FeatureTree'/>
180+
181+
<!--
182+
Enabling the EULA dialog in the installer is a three step process:
183+
184+
1. Comment out or remove the two `Publish` tags that follow the
185+
`WixVariable` tag.
186+
2. Uncomment the `<WixVariable Id='WixUILicenseRtf' Value='Path\to\Eula.rft'>` tag further down
187+
3. Replace the `Value` attribute of the `WixVariable` tag with
188+
the path to a RTF file that will be used as the EULA and
189+
displayed in the license agreement dialog.
190+
-->
191+
<Publish Dialog='WelcomeDlg' Control='Next' Event='NewDialog' Value='CustomizeDlg' Order='99'>1</Publish>
192+
<Publish Dialog='CustomizeDlg' Control='Back' Event='NewDialog' Value='WelcomeDlg' Order='99'>1</Publish>
193+
194+
</UI>
195+
196+
197+
<!--
198+
Enabling the EULA dialog in the installer requires uncommenting
199+
the following `WixUILicenseRTF` tag and changing the `Value`
200+
attribute.
201+
-->
202+
<!-- <WixVariable Id='WixUILicenseRtf' Value='Relative\Path\to\Eula.rtf'/> -->
203+
204+
205+
<!--
206+
Uncomment the next `WixVariable` tag to customize the installer's
207+
Graphical User Interface (GUI) and add a custom banner image across
208+
the top of each screen. See the WiX Toolset documentation for details
209+
about customization.
210+
211+
The banner BMP dimensions are 493 x 58 pixels.
212+
-->
213+
<!--<WixVariable Id='WixUIBannerBmp' Value='wix\Banner.bmp'/>-->
214+
215+
216+
<!--
217+
Uncomment the next `WixVariable` tag to customize the installer's
218+
Graphical User Interface (GUI) and add a custom image to the first
219+
dialog, or screen. See the WiX Toolset documentation for details about
220+
customization.
221+
222+
The dialog BMP dimensions are 493 x 312 pixels.
223+
-->
224+
<!--<WixVariable Id='WixUIDialogBmp' Value='wix\Dialog.bmp'/>-->
225+
226+
</Product>
227+
228+
</Wix>

wix/main.wxs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@
173173
<!--<Icon Id='ProductICO' SourceFile='wix\Product.ico'/>-->
174174
<!--<Property Id='ARPPRODUCTICON' Value='ProductICO' />-->
175175

176-
<Property Id='ARPHELPLINK' Value='https://github.com/rupurt/keel'/>
176+
<Property Id='ARPHELPLINK' Value='https://github.com/spoke-sh/keel'/>
177177

178178
<UI>
179179
<UIRef Id='WixUI_FeatureTree'/>

0 commit comments

Comments
 (0)