sigit-code 1.5.4__tar.gz → 1.5.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/AGENTS.md +34 -7
- {sigit_code-1.5.4/.claude → sigit_code-1.5.6/.agents}/skills/branding/SKILL.md +6 -6
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/sigit-code-release/SKILL.md +15 -4
- {sigit_code-1.5.4/.agents → sigit_code-1.5.6/.claude}/skills/branding/SKILL.md +6 -6
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/sigit-code-release/SKILL.md +15 -4
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-npm.yml +21 -9
- sigit_code-1.5.6/.github/workflows/release-winget.yml +170 -0
- sigit_code-1.5.6/.nvmrc +1 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/AGENTS.md +34 -7
- {sigit_code-1.5.4 → sigit_code-1.5.6}/CHANGELOG.md +51 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/CLAUDE.md +34 -7
- {sigit_code-1.5.4 → sigit_code-1.5.6}/Cargo.lock +1 -1
- {sigit_code-1.5.4 → sigit_code-1.5.6}/Cargo.toml +1 -1
- {sigit_code-1.5.4 → sigit_code-1.5.6}/PKG-INFO +3 -3
- {sigit_code-1.5.4 → sigit_code-1.5.6}/README.md +2 -2
- {sigit_code-1.5.4 → sigit_code-1.5.6}/docs/mcp.md +5 -3
- {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/README.md.tmpl +10 -10
- {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/package-main.json.tmpl +7 -7
- {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/package.json.tmpl +1 -1
- {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/sigit/README.md +8 -8
- {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/sigit/package.json +7 -7
- {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/sigit/src/index.ts +1 -1
- {sigit_code-1.5.4 → sigit_code-1.5.6}/nuget/sigit/README.md +1 -1
- sigit_code-1.5.6/packaging/winget/getSigit.siGitCode.installer.yaml.in +18 -0
- sigit_code-1.5.6/packaging/winget/getSigit.siGitCode.locale.en-US.yaml.in +40 -0
- sigit_code-1.5.6/packaging/winget/getSigit.siGitCode.yaml.in +6 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/pypi/README.md +2 -2
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/backend.rs +202 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/headless.rs +17 -37
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/main.rs +194 -43
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/provider.rs +18 -5
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/tools.rs +40 -12
- {sigit_code-1.5.4 → sigit_code-1.5.6}/tests/acp_permissions.rs +231 -7
- {sigit_code-1.5.4 → sigit_code-1.5.6}/tests/headless_mode.rs +59 -0
- sigit_code-1.5.4/.github/workflows/release-mcp-registry.yml +0 -79
- sigit_code-1.5.4/.github/workflows/release-winget.yml +0 -71
- sigit_code-1.5.4/.nvmrc +0 -1
- sigit_code-1.5.4/server.json +0 -39
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/agent-client-protocol/SKILL.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/ai-assisted-coding/SKILL.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/run-sigit/SKILL.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/run-sigit/driver.mjs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/run-sigit/tui-smoke.sh +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/tool-calling/SKILL.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/agent-client-protocol/SKILL.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/ai-assisted-coding/SKILL.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/run-sigit/SKILL.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/run-sigit/driver.mjs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/run-sigit/tui-smoke.sh +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/tool-calling/SKILL.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/ci.yml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-aur.yml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-crates.yml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-github.yml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-homebrew.yml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-nuget.yml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-pypi.yml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-scoop.yml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/.gitignore +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/LICENSE +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/docs/hooks.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/examples/settings-with-hooks.toml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/examples/skills/README.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/examples/skills/commit-message/SKILL.md +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/scripts/render-main-package.cjs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/scripts/render-platform-package.cjs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/sigit/.gitignore +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/sigit/tsconfig.json +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/nuget/.gitignore +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/nuget/sigit/Program.cs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/nuget/sigit/SiGit.Code.csproj +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/packaging/aur/PKGBUILD.in +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/packaging/nfpm.yaml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/pypi/pyproject.toml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/pyproject.toml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/rust-toolchain.toml +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/account.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/browser_auth.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/chat.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/commands.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/credentials.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/frontmatter.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/hooks.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/instructions.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/mcp.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/models.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/permissions.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/session_store.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/settings.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/setup.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/skills.rs +0 -0
- {sigit_code-1.5.4 → sigit_code-1.5.6}/src/subagents.rs +0 -0
|
@@ -26,7 +26,23 @@ from the name alone (e.g. `feature/tool-permission-system`, `fix/glob-mtime-sort
|
|
|
26
26
|
a task, ticket, or session id (not `feature/task-q003hm`).
|
|
27
27
|
|
|
28
28
|
**IMPORTANT — pull request target:** Always open pull requests against the `development` branch,
|
|
29
|
-
never `main`. `main` is release-only; `development` is where day-to-day work integrates
|
|
29
|
+
never `main`. `main` is release-only; `development` is where day-to-day work integrates, and the
|
|
30
|
+
release merge (see the `sigit-code-release` skill) is the one thing that ever puts commits on
|
|
31
|
+
`main`.
|
|
32
|
+
|
|
33
|
+
This rule needs help to hold, because the repository's default branch is `main`: both
|
|
34
|
+
`gh pr create` and the GitHub web form pre-select it, so a PR lands on the wrong base unless the
|
|
35
|
+
base is passed explicitly. Pass it every time, and check that it took:
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
gh pr create --base development --head <branch>
|
|
39
|
+
gh pr view <number> --json baseRefName
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Retargeting a PR that was opened against `main` costs nothing before it merges:
|
|
43
|
+
`gh pr edit <number> --base development`. After it merges it costs real work — the change sits on
|
|
44
|
+
`main` while `development`, which the next release is cut from, does not have it, and someone has
|
|
45
|
+
to carry it back by hand. PR #65 went in that way.
|
|
30
46
|
|
|
31
47
|
**IMPORTANT — branch off `development`:** Start every working branch from the latest
|
|
32
48
|
`origin/development`. Exception: when new work *depends on* a feature branch that has not merged
|
|
@@ -182,10 +198,11 @@ feeds results back. Neither the loop nor ACP/TUI surfaces depend on a concrete b
|
|
|
182
198
|
`tests/mcp_stdio.rs`, driven by the test-only `src/bin/mcp_stdio_stub.rs` helper binary
|
|
183
199
|
(excluded from the published crate via `exclude` in `Cargo.toml`). The baked-in official
|
|
184
200
|
server is *also* listed in the public MCP Registry as `si.sigit/sigit` — a **remote**
|
|
185
|
-
Streamable-HTTP listing
|
|
186
|
-
`release-mcp-registry.yml`)
|
|
187
|
-
forces a domain namespace (`si.sigit` ↔
|
|
188
|
-
GitHub-OIDC scheme `smbcloud-cli` uses for its
|
|
201
|
+
Streamable-HTTP listing owned by the [`getsigit/si`](https://github.com/getsigit/si) repo
|
|
202
|
+
(`server.json` at its root, published by its `release-mcp-registry.yml`), not this one. Because
|
|
203
|
+
it's a remote server, the registry's URL-match rule forces a domain namespace (`si.sigit` ↔
|
|
204
|
+
`sigit.si`) verified by a DNS TXT record, not the GitHub-OIDC scheme `smbcloud-cli` uses for its
|
|
205
|
+
package listing.
|
|
189
206
|
- **`src/permissions.rs`** — tool permission policy. Every tool call passes through
|
|
190
207
|
`decision_for` before executing: read-only tools always run; mutating tools (and all
|
|
191
208
|
`mcp__*`/unknown tools) are governed by, in order: per-session plan mode (`/plan` — deny all
|
|
@@ -267,6 +284,12 @@ Publishing splits into two groups. **Language registries** each get their own ta
|
|
|
267
284
|
workflow: `release-crates`, `release-npm`, `release-nuget`, `release-pypi`. The `npm/`, `nuget/`,
|
|
268
285
|
and `pypi/` dirs hold their wrapper-package templates.
|
|
269
286
|
|
|
287
|
+
npm and NuGet authenticate with OIDC (Trusted Publishing), so neither needs a stored token. On
|
|
288
|
+
npm that is configured per package, not per org: all seven `@getsigit/*` names carry a trusted
|
|
289
|
+
publisher pointing at `release-npm.yml`, and a package added later needs the same setup or its
|
|
290
|
+
publish step will fail. OIDC also requires npm >= 11.5.1 and Node >= 22.14.0, which is why the
|
|
291
|
+
workflow upgrades npm and why `.nvmrc` cannot drop below 22.
|
|
292
|
+
|
|
270
293
|
**OS package managers** all publish somewhere outside this repo and all need checksums from the
|
|
271
294
|
GitHub release, so `release-github` builds the binaries, attaches the assets, and then dispatches
|
|
272
295
|
`release-homebrew`, `release-scoop`, `release-winget`, and `release-aur`. A dispatch failure in one
|
|
@@ -283,8 +306,12 @@ Three of these need credentials or a one-time manual step before they work:
|
|
|
283
306
|
- Scoop needs a `getsigit/scoop-bucket` repo and a `SCOOP_BUCKET_TOKEN` secret, mirroring the
|
|
284
307
|
Homebrew tap setup.
|
|
285
308
|
- winget needs a `WINGET_TOKEN` (PAT with `public_repo`) so `wingetcreate` can fork
|
|
286
|
-
`microsoft/winget-pkgs`.
|
|
287
|
-
|
|
309
|
+
`microsoft/winget-pkgs`. It is passed as `WINGET_CREATE_GITHUB_TOKEN` rather than `--token`,
|
|
310
|
+
which wingetcreate warns can leak the token into logs. `wingetcreate update` only works on a
|
|
311
|
+
package that already exists in `microsoft/winget-pkgs`, so the workflow checks the
|
|
312
|
+
`manifests/g/getSigit/siGitCode` path first and falls back to rendering
|
|
313
|
+
`packaging/winget/*.yaml.in` and running `wingetcreate submit` for a first submission. That
|
|
314
|
+
fallback runs once, then every later release takes the `update` path.
|
|
288
315
|
- The AUR needs `AUR_USERNAME`, `AUR_EMAIL`, and `AUR_SSH_PRIVATE_KEY`. It publishes `sigit-bin`
|
|
289
316
|
(a prebuilt binary) so Arch users are not compiling the on-device inference stack to install a
|
|
290
317
|
CLI.
|
|
@@ -14,7 +14,7 @@ The short version:
|
|
|
14
14
|
- **Product / brand name:** `siGit Code`
|
|
15
15
|
- **CLI command:** `sigit`
|
|
16
16
|
- **Rust crate:** `sigit`
|
|
17
|
-
- **npm package:** `@
|
|
17
|
+
- **npm package:** `@getsigit/sigit`
|
|
18
18
|
- **PyPI package:** `sigit-code`
|
|
19
19
|
- **Company name:** `smbCloud`
|
|
20
20
|
- **LLM backend name:** `Onde Inference`
|
|
@@ -38,7 +38,7 @@ These names are case-sensitive.
|
|
|
38
38
|
- **CLI command:** `sigit`
|
|
39
39
|
- **Rust crate:** `sigit`
|
|
40
40
|
- **Repository slug:** `getsigit/sigit`
|
|
41
|
-
- **npm package:** `@
|
|
41
|
+
- **npm package:** `@getsigit/sigit`
|
|
42
42
|
- **PyPI package:** `sigit-code`
|
|
43
43
|
- **Company:** `smbCloud`
|
|
44
44
|
- **LLM backend in prose:** `Onde Inference`
|
|
@@ -73,7 +73,7 @@ When you mean something users type, install, import, or clone, use the literal l
|
|
|
73
73
|
That means:
|
|
74
74
|
|
|
75
75
|
- `sigit` for the command, crate, and repo slug
|
|
76
|
-
- `@
|
|
76
|
+
- `@getsigit/sigit` for npm
|
|
77
77
|
- `sigit-code` for PyPI
|
|
78
78
|
- `onde` for the Rust crate
|
|
79
79
|
|
|
@@ -81,7 +81,7 @@ Examples:
|
|
|
81
81
|
|
|
82
82
|
- Run `sigit` in a terminal.
|
|
83
83
|
- Install with `cargo install sigit`.
|
|
84
|
-
- Install with `npm install -g @
|
|
84
|
+
- Install with `npm install -g @getsigit/sigit`.
|
|
85
85
|
- Install with `pip install sigit-code`.
|
|
86
86
|
- The repository is `getsigit/sigit`.
|
|
87
87
|
|
|
@@ -169,7 +169,7 @@ That includes:
|
|
|
169
169
|
- `Onde Inference`
|
|
170
170
|
- `ACP`
|
|
171
171
|
- `sigit`
|
|
172
|
-
- `@
|
|
172
|
+
- `@getsigit/sigit`
|
|
173
173
|
- `sigit-code`
|
|
174
174
|
- `onde`
|
|
175
175
|
|
|
@@ -181,7 +181,7 @@ Before you finish any doc or release-note edit, check these:
|
|
|
181
181
|
|
|
182
182
|
1. Did you use `siGit Code` when referring to the product?
|
|
183
183
|
2. Did you keep `sigit` lowercase for commands, crates, and repo references?
|
|
184
|
-
3. Did you keep `@
|
|
184
|
+
3. Did you keep `@getsigit/sigit` and `sigit-code` exact?
|
|
185
185
|
4. Did you keep `smbCloud` and `Onde Inference` cased correctly?
|
|
186
186
|
5. In setup examples, does the visible editor label say `siGit Code` while the command stays `sigit`?
|
|
187
187
|
|
|
@@ -29,8 +29,13 @@ Use this skill when preparing a release for this repository.
|
|
|
29
29
|
- Add or update the top changelog entry in `CHANGELOG.md` for the release being cut.
|
|
30
30
|
- Do not treat `npm/sigit/package.json` `0.0.0-dev` as a bug by default. The npm release workflow rewrites it at publish time using `npm/scripts/render-main-package.cjs` and the release tag.
|
|
31
31
|
- Do not add a hardcoded version to `pypi/pyproject.toml` for normal releases. PyPI uses `maturin` with `dynamic = ["version"]` and derives the published package version from `Cargo.toml`.
|
|
32
|
-
- Release workflows are tag-driven. `release-github.yml`, `release-npm.yml`, `release-pypi.yml`, `release-crates.yml`, and `release-
|
|
32
|
+
- Release workflows are tag-driven. `release-github.yml`, `release-npm.yml`, `release-pypi.yml`, `release-crates.yml`, `release-homebrew.yml`, `release-nuget.yml`, and `release-mcp-registry.yml` all derive `RELEASE_VERSION` from a `v*.*.*` tag or a manually supplied tag input.
|
|
33
33
|
- The crate is published to crates.io (`release-crates.yml`) and the Homebrew tap is updated (`release-homebrew.yml`) as part of the tag-driven flow. Per the siGit release flow, Homebrew is auto-triggered — do not dispatch it manually.
|
|
34
|
+
- `release-github.yml` builds the binaries, attaches them (plus a `.deb`/`.rpm` per Linux target built with nfpm from `packaging/nfpm.yaml`) to the GitHub release, then dispatches `release-homebrew`, `release-scoop`, `release-winget`, and `release-aur`. A dispatch failure in any one of those four is logged as a warning, not a hard failure — an unconfigured channel doesn't block the rest of the release. `release-nuget.yml` and `release-mcp-registry.yml`, by contrast, are tag-triggered directly like the other language-registry workflows, not dispatched from `release-github.yml`.
|
|
35
|
+
- Every release asset carries a `.sha256` sidecar (not just the macOS Homebrew tarball). Scoop, winget, and the AUR PKGBUILD each consume the raw binaries plus their sidecar checksum, rather than the tarball.
|
|
36
|
+
- npm and NuGet publish via OIDC trusted publishing — neither has a stored token in the repo. On npm this is configured per package (each `@getsigit/*` name has a trusted publisher pointing at `release-npm.yml`), so a new package needs the same setup before its first publish will work. OIDC requires npm >= 11.5.1 and Node >= 22.14.0.
|
|
37
|
+
- The NuGet package (`SiGit.Code`, `dotnet tool install --global SiGit.Code`) bundles all six platform binaries under `native/<os>-<arch>/` behind a managed shim, rather than shipping one package per platform like npm/PyPI. Watch the nuget.org 250 MB package-size limit if it ever grows.
|
|
38
|
+
- The baked-in official MCP server is separately listed in the public MCP Registry as `si.sigit/sigit` (`release-mcp-registry.yml`, driven by `server.json` at the repo root). It's a remote Streamable-HTTP listing, so it's verified by a DNS TXT record on the `sigit.si` domain rather than the GitHub-OIDC scheme used for package listings.
|
|
34
39
|
|
|
35
40
|
## Git release flow
|
|
36
41
|
|
|
@@ -42,6 +47,8 @@ Releases are cut from `development` and shipped on `main`. The published tags (`
|
|
|
42
47
|
4. Merge `development` into `main` (commit message: `Merge development into main for v<version> release`).
|
|
43
48
|
5. Tag `v<version>` on that `main` merge commit, then push `main` and the tag.
|
|
44
49
|
|
|
50
|
+
Step 4 is the only way commits are meant to reach `main`. A feature or fix PR targeting `main` breaks that: it puts work on the release branch that `development` does not have, so the next release is cut without it. Such PRs belong on `development` (see the pull request target rule in `AGENTS.md`).
|
|
51
|
+
|
|
45
52
|
Pushing the `v*.*.*` tag is what fires every release workflow, so create and push it only after the merge into `main` has landed. Do not commit, tag, or push until the user explicitly asks — confirm the version and that they want the release to go out first.
|
|
46
53
|
|
|
47
54
|
## Typical files to inspect
|
|
@@ -54,7 +61,10 @@ Pushing the `v*.*.*` tag is what fires every release workflow, so create and pus
|
|
|
54
61
|
- `npm/scripts/render-main-package.cjs`
|
|
55
62
|
- `npm/`
|
|
56
63
|
- `pypi/`
|
|
57
|
-
-
|
|
64
|
+
- `nuget/sigit/` (bundled-binary `.NET` tool packaging)
|
|
65
|
+
- `packaging/` (`nfpm.yaml` for `.deb`/`.rpm`, plus `aur/` and `winget/` templates)
|
|
66
|
+
- `server.json` (MCP Registry listing)
|
|
67
|
+
- `.github/workflows/` (`release-github.yml`, `release-npm.yml`, `release-pypi.yml`, `release-crates.yml`, `release-homebrew.yml`, `release-scoop.yml`, `release-winget.yml`, `release-aur.yml`, `release-nuget.yml`, `release-mcp-registry.yml`)
|
|
58
68
|
|
|
59
69
|
## Release checklist
|
|
60
70
|
|
|
@@ -67,5 +77,6 @@ Pushing the `v*.*.*` tag is what fires every release workflow, so create and pus
|
|
|
67
77
|
- Git flow followed: bump committed on `release/v<version>`, merged back to `development`, then `development` merged into `main`, with `v<version>` tagged on the `main` merge commit.
|
|
68
78
|
- Release notes or changelog entries match the actual changes.
|
|
69
79
|
- CI-equivalent local checks pass for the relevant platform or target.
|
|
70
|
-
- Package names, install commands, and branding stay consistent.
|
|
71
|
-
-
|
|
80
|
+
- Package names, install commands, and branding stay consistent across npm, PyPI, crates.io, Homebrew, NuGet, Scoop, winget, AUR, and the `.deb`/`.rpm` packages.
|
|
81
|
+
- Every release asset (including the new `.deb`/`.rpm`/raw binaries consumed by Scoop, winget, and AUR) has a matching `.sha256` sidecar.
|
|
82
|
+
- Any known release limitations are called out explicitly, including a dispatch failure in `release-scoop`/`release-winget`/`release-aur` (non-fatal — logged as a warning by `release-github.yml`) versus a hard failure in a directly tag-triggered workflow like `release-nuget` or `release-mcp-registry`.
|
|
@@ -14,7 +14,7 @@ The short version:
|
|
|
14
14
|
- **Product / brand name:** `siGit Code`
|
|
15
15
|
- **CLI command:** `sigit`
|
|
16
16
|
- **Rust crate:** `sigit`
|
|
17
|
-
- **npm package:** `@
|
|
17
|
+
- **npm package:** `@getsigit/sigit`
|
|
18
18
|
- **PyPI package:** `sigit-code`
|
|
19
19
|
- **Company name:** `smbCloud`
|
|
20
20
|
- **LLM backend name:** `Onde Inference`
|
|
@@ -38,7 +38,7 @@ These names are case-sensitive.
|
|
|
38
38
|
- **CLI command:** `sigit`
|
|
39
39
|
- **Rust crate:** `sigit`
|
|
40
40
|
- **Repository slug:** `getsigit/sigit`
|
|
41
|
-
- **npm package:** `@
|
|
41
|
+
- **npm package:** `@getsigit/sigit`
|
|
42
42
|
- **PyPI package:** `sigit-code`
|
|
43
43
|
- **Company:** `smbCloud`
|
|
44
44
|
- **LLM backend in prose:** `Onde Inference`
|
|
@@ -73,7 +73,7 @@ When you mean something users type, install, import, or clone, use the literal l
|
|
|
73
73
|
That means:
|
|
74
74
|
|
|
75
75
|
- `sigit` for the command, crate, and repo slug
|
|
76
|
-
- `@
|
|
76
|
+
- `@getsigit/sigit` for npm
|
|
77
77
|
- `sigit-code` for PyPI
|
|
78
78
|
- `onde` for the Rust crate
|
|
79
79
|
|
|
@@ -81,7 +81,7 @@ Examples:
|
|
|
81
81
|
|
|
82
82
|
- Run `sigit` in a terminal.
|
|
83
83
|
- Install with `cargo install sigit`.
|
|
84
|
-
- Install with `npm install -g @
|
|
84
|
+
- Install with `npm install -g @getsigit/sigit`.
|
|
85
85
|
- Install with `pip install sigit-code`.
|
|
86
86
|
- The repository is `getsigit/sigit`.
|
|
87
87
|
|
|
@@ -169,7 +169,7 @@ That includes:
|
|
|
169
169
|
- `Onde Inference`
|
|
170
170
|
- `ACP`
|
|
171
171
|
- `sigit`
|
|
172
|
-
- `@
|
|
172
|
+
- `@getsigit/sigit`
|
|
173
173
|
- `sigit-code`
|
|
174
174
|
- `onde`
|
|
175
175
|
|
|
@@ -181,7 +181,7 @@ Before you finish any doc or release-note edit, check these:
|
|
|
181
181
|
|
|
182
182
|
1. Did you use `siGit Code` when referring to the product?
|
|
183
183
|
2. Did you keep `sigit` lowercase for commands, crates, and repo references?
|
|
184
|
-
3. Did you keep `@
|
|
184
|
+
3. Did you keep `@getsigit/sigit` and `sigit-code` exact?
|
|
185
185
|
4. Did you keep `smbCloud` and `Onde Inference` cased correctly?
|
|
186
186
|
5. In setup examples, does the visible editor label say `siGit Code` while the command stays `sigit`?
|
|
187
187
|
|
|
@@ -29,8 +29,13 @@ Use this skill when preparing a release for this repository.
|
|
|
29
29
|
- Add or update the top changelog entry in `CHANGELOG.md` for the release being cut.
|
|
30
30
|
- Do not treat `npm/sigit/package.json` `0.0.0-dev` as a bug by default. The npm release workflow rewrites it at publish time using `npm/scripts/render-main-package.cjs` and the release tag.
|
|
31
31
|
- Do not add a hardcoded version to `pypi/pyproject.toml` for normal releases. PyPI uses `maturin` with `dynamic = ["version"]` and derives the published package version from `Cargo.toml`.
|
|
32
|
-
- Release workflows are tag-driven. `release-github.yml`, `release-npm.yml`, `release-pypi.yml`, `release-crates.yml`, and `release-
|
|
32
|
+
- Release workflows are tag-driven. `release-github.yml`, `release-npm.yml`, `release-pypi.yml`, `release-crates.yml`, `release-homebrew.yml`, `release-nuget.yml`, and `release-mcp-registry.yml` all derive `RELEASE_VERSION` from a `v*.*.*` tag or a manually supplied tag input.
|
|
33
33
|
- The crate is published to crates.io (`release-crates.yml`) and the Homebrew tap is updated (`release-homebrew.yml`) as part of the tag-driven flow. Per the siGit release flow, Homebrew is auto-triggered — do not dispatch it manually.
|
|
34
|
+
- `release-github.yml` builds the binaries, attaches them (plus a `.deb`/`.rpm` per Linux target built with nfpm from `packaging/nfpm.yaml`) to the GitHub release, then dispatches `release-homebrew`, `release-scoop`, `release-winget`, and `release-aur`. A dispatch failure in any one of those four is logged as a warning, not a hard failure — an unconfigured channel doesn't block the rest of the release. `release-nuget.yml` and `release-mcp-registry.yml`, by contrast, are tag-triggered directly like the other language-registry workflows, not dispatched from `release-github.yml`.
|
|
35
|
+
- Every release asset carries a `.sha256` sidecar (not just the macOS Homebrew tarball). Scoop, winget, and the AUR PKGBUILD each consume the raw binaries plus their sidecar checksum, rather than the tarball.
|
|
36
|
+
- npm and NuGet publish via OIDC trusted publishing — neither has a stored token in the repo. On npm this is configured per package (each `@getsigit/*` name has a trusted publisher pointing at `release-npm.yml`), so a new package needs the same setup before its first publish will work. OIDC requires npm >= 11.5.1 and Node >= 22.14.0.
|
|
37
|
+
- The NuGet package (`SiGit.Code`, `dotnet tool install --global SiGit.Code`) bundles all six platform binaries under `native/<os>-<arch>/` behind a managed shim, rather than shipping one package per platform like npm/PyPI. Watch the nuget.org 250 MB package-size limit if it ever grows.
|
|
38
|
+
- The baked-in official MCP server is separately listed in the public MCP Registry as `si.sigit/sigit` (`release-mcp-registry.yml`, driven by `server.json` at the repo root). It's a remote Streamable-HTTP listing, so it's verified by a DNS TXT record on the `sigit.si` domain rather than the GitHub-OIDC scheme used for package listings.
|
|
34
39
|
|
|
35
40
|
## Git release flow
|
|
36
41
|
|
|
@@ -42,6 +47,8 @@ Releases are cut from `development` and shipped on `main`. The published tags (`
|
|
|
42
47
|
4. Merge `development` into `main` (commit message: `Merge development into main for v<version> release`).
|
|
43
48
|
5. Tag `v<version>` on that `main` merge commit, then push `main` and the tag.
|
|
44
49
|
|
|
50
|
+
Step 4 is the only way commits are meant to reach `main`. A feature or fix PR targeting `main` breaks that: it puts work on the release branch that `development` does not have, so the next release is cut without it. Such PRs belong on `development` (see the pull request target rule in `AGENTS.md`).
|
|
51
|
+
|
|
45
52
|
Pushing the `v*.*.*` tag is what fires every release workflow, so create and push it only after the merge into `main` has landed. Do not commit, tag, or push until the user explicitly asks — confirm the version and that they want the release to go out first.
|
|
46
53
|
|
|
47
54
|
## Typical files to inspect
|
|
@@ -54,7 +61,10 @@ Pushing the `v*.*.*` tag is what fires every release workflow, so create and pus
|
|
|
54
61
|
- `npm/scripts/render-main-package.cjs`
|
|
55
62
|
- `npm/`
|
|
56
63
|
- `pypi/`
|
|
57
|
-
-
|
|
64
|
+
- `nuget/sigit/` (bundled-binary `.NET` tool packaging)
|
|
65
|
+
- `packaging/` (`nfpm.yaml` for `.deb`/`.rpm`, plus `aur/` and `winget/` templates)
|
|
66
|
+
- `server.json` (MCP Registry listing)
|
|
67
|
+
- `.github/workflows/` (`release-github.yml`, `release-npm.yml`, `release-pypi.yml`, `release-crates.yml`, `release-homebrew.yml`, `release-scoop.yml`, `release-winget.yml`, `release-aur.yml`, `release-nuget.yml`, `release-mcp-registry.yml`)
|
|
58
68
|
|
|
59
69
|
## Release checklist
|
|
60
70
|
|
|
@@ -67,5 +77,6 @@ Pushing the `v*.*.*` tag is what fires every release workflow, so create and pus
|
|
|
67
77
|
- Git flow followed: bump committed on `release/v<version>`, merged back to `development`, then `development` merged into `main`, with `v<version>` tagged on the `main` merge commit.
|
|
68
78
|
- Release notes or changelog entries match the actual changes.
|
|
69
79
|
- CI-equivalent local checks pass for the relevant platform or target.
|
|
70
|
-
- Package names, install commands, and branding stay consistent.
|
|
71
|
-
-
|
|
80
|
+
- Package names, install commands, and branding stay consistent across npm, PyPI, crates.io, Homebrew, NuGet, Scoop, winget, AUR, and the `.deb`/`.rpm` packages.
|
|
81
|
+
- Every release asset (including the new `.deb`/`.rpm`/raw binaries consumed by Scoop, winget, and AUR) has a matching `.sha256` sidecar.
|
|
82
|
+
- Any known release limitations are called out explicitly, including a dispatch failure in `release-scoop`/`release-winget`/`release-aur` (non-fatal — logged as a warning by `release-github.yml`) versus a hard failure in a directly tag-triggered workflow like `release-nuget` or `release-mcp-registry`.
|
|
@@ -101,9 +101,16 @@ jobs:
|
|
|
101
101
|
node-version-file: .nvmrc
|
|
102
102
|
registry-url: "https://registry.npmjs.org"
|
|
103
103
|
|
|
104
|
+
# Trusted Publishing (OIDC) needs npm >= 11.5.1. .nvmrc pins the Node
|
|
105
|
+
# version (>= 22.14.0, also an OIDC requirement); npm still needs
|
|
106
|
+
# upgrading past whatever ships with it.
|
|
107
|
+
- name: Upgrade npm for Trusted Publishing
|
|
108
|
+
shell: bash
|
|
109
|
+
run: npm install -g npm@latest
|
|
110
|
+
|
|
111
|
+
# Authentication is OIDC: each @getsigit/* package has a Trusted
|
|
112
|
+
# Publisher pointing at this workflow, so there is no token to leak.
|
|
104
113
|
- name: Publish platform package to NPM
|
|
105
|
-
env:
|
|
106
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
107
114
|
shell: bash
|
|
108
115
|
run: |
|
|
109
116
|
cd npm
|
|
@@ -150,16 +157,16 @@ jobs:
|
|
|
150
157
|
|
|
151
158
|
cd "${node_pkg}"
|
|
152
159
|
|
|
153
|
-
npm_package_name="@
|
|
160
|
+
npm_package_name="@getsigit/${node_pkg}"
|
|
154
161
|
if npm view "${npm_package_name}@${node_version}" version >/dev/null 2>&1; then
|
|
155
162
|
echo "${npm_package_name}@${node_version} already exists on npm, skipping publish"
|
|
156
163
|
exit 0
|
|
157
164
|
fi
|
|
158
165
|
|
|
159
|
-
npm publish --access public
|
|
166
|
+
npm publish --access public
|
|
160
167
|
|
|
161
168
|
publish-npm-base:
|
|
162
|
-
name: Publish base NPM package (@
|
|
169
|
+
name: Publish base NPM package (@getsigit/sigit)
|
|
163
170
|
needs: publish-npm-binaries
|
|
164
171
|
runs-on: ubuntu-latest
|
|
165
172
|
|
|
@@ -186,9 +193,14 @@ jobs:
|
|
|
186
193
|
node-version-file: .nvmrc
|
|
187
194
|
registry-url: "https://registry.npmjs.org"
|
|
188
195
|
|
|
196
|
+
# Trusted Publishing (OIDC) needs npm >= 11.5.1. .nvmrc pins the Node
|
|
197
|
+
# version (>= 22.14.0, also an OIDC requirement); npm still needs
|
|
198
|
+
# upgrading past whatever ships with it.
|
|
199
|
+
- name: Upgrade npm for Trusted Publishing
|
|
200
|
+
shell: bash
|
|
201
|
+
run: npm install -g npm@latest
|
|
202
|
+
|
|
189
203
|
- name: Publish base package to NPM
|
|
190
|
-
env:
|
|
191
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
192
204
|
shell: bash
|
|
193
205
|
run: |
|
|
194
206
|
cd npm/sigit
|
|
@@ -199,7 +211,7 @@ jobs:
|
|
|
199
211
|
"./package.json" \
|
|
200
212
|
"${{ env.RELEASE_VERSION }}"
|
|
201
213
|
|
|
202
|
-
npm_package_name="@
|
|
214
|
+
npm_package_name="@getsigit/sigit"
|
|
203
215
|
npm_package_version="${{ env.RELEASE_VERSION }}"
|
|
204
216
|
|
|
205
217
|
if npm view "${npm_package_name}@${npm_package_version}" version >/dev/null 2>&1; then
|
|
@@ -209,4 +221,4 @@ jobs:
|
|
|
209
221
|
|
|
210
222
|
npm install
|
|
211
223
|
npm run build
|
|
212
|
-
npm publish --access public
|
|
224
|
+
npm publish --access public
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
name: winget Release
|
|
2
|
+
|
|
3
|
+
# Dispatched by release-github.yml once the release and its checksums exist.
|
|
4
|
+
#
|
|
5
|
+
# winget manifests live in microsoft/winget-pkgs, and `wingetcreate update`
|
|
6
|
+
# only works on a package that is already there. So this workflow branches:
|
|
7
|
+
#
|
|
8
|
+
# - package already in winget-pkgs -> `wingetcreate update`, which rewrites
|
|
9
|
+
# the URLs and re-hashes the installers for us.
|
|
10
|
+
# - package not there yet -> render the manifests in packaging/winget/ and
|
|
11
|
+
# `wingetcreate submit` them as a new package.
|
|
12
|
+
#
|
|
13
|
+
# The second path only runs once, but keeping it here means a first release
|
|
14
|
+
# does not need someone to sit at a Windows box running `wingetcreate new`
|
|
15
|
+
# interactively.
|
|
16
|
+
on:
|
|
17
|
+
workflow_dispatch:
|
|
18
|
+
inputs:
|
|
19
|
+
tag:
|
|
20
|
+
description: "Release tag (e.g. v1.5.2)"
|
|
21
|
+
required: true
|
|
22
|
+
|
|
23
|
+
permissions:
|
|
24
|
+
contents: read
|
|
25
|
+
|
|
26
|
+
env:
|
|
27
|
+
REPO: getsigit/sigit
|
|
28
|
+
PACKAGE_IDENTIFIER: getSigit.siGitCode
|
|
29
|
+
|
|
30
|
+
jobs:
|
|
31
|
+
submit-winget-manifest:
|
|
32
|
+
name: Submit winget manifest
|
|
33
|
+
# wingetcreate is a Windows-only tool.
|
|
34
|
+
runs-on: windows-latest
|
|
35
|
+
|
|
36
|
+
steps:
|
|
37
|
+
- name: Check out repository
|
|
38
|
+
uses: actions/checkout@v6
|
|
39
|
+
|
|
40
|
+
- name: Resolve tag, version and release date
|
|
41
|
+
id: release
|
|
42
|
+
shell: bash
|
|
43
|
+
env:
|
|
44
|
+
GH_TOKEN: ${{ github.token }}
|
|
45
|
+
run: |
|
|
46
|
+
TAG="${{ github.event.inputs.tag }}"
|
|
47
|
+
VERSION="${TAG#v}"
|
|
48
|
+
# wingetcreate wants ReleaseDate as YYYY-MM-DD.
|
|
49
|
+
DATE=$(gh release view "$TAG" --repo "$REPO" --json publishedAt --jq '.publishedAt[0:10]')
|
|
50
|
+
|
|
51
|
+
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
|
|
52
|
+
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
|
53
|
+
echo "date=${DATE}" >> "$GITHUB_OUTPUT"
|
|
54
|
+
|
|
55
|
+
- name: Check whether the package is already in winget-pkgs
|
|
56
|
+
id: exists
|
|
57
|
+
shell: bash
|
|
58
|
+
env:
|
|
59
|
+
GH_TOKEN: ${{ github.token }}
|
|
60
|
+
run: |
|
|
61
|
+
# manifests are filed under the lowercased first letter of the
|
|
62
|
+
# publisher, e.g. manifests/g/getSigit/siGitCode.
|
|
63
|
+
PUBLISHER="${PACKAGE_IDENTIFIER%%.*}"
|
|
64
|
+
NAME="${PACKAGE_IDENTIFIER#*.}"
|
|
65
|
+
FIRST=$(echo "${PUBLISHER:0:1}" | tr '[:upper:]' '[:lower:]')
|
|
66
|
+
PATH_IN_REPO="manifests/${FIRST}/${PUBLISHER}/${NAME}"
|
|
67
|
+
|
|
68
|
+
if gh api "repos/microsoft/winget-pkgs/contents/${PATH_IN_REPO}" >/dev/null 2>&1; then
|
|
69
|
+
echo "Found ${PACKAGE_IDENTIFIER} at ${PATH_IN_REPO}; submitting an update."
|
|
70
|
+
echo "found=true" >> "$GITHUB_OUTPUT"
|
|
71
|
+
else
|
|
72
|
+
echo "No ${PACKAGE_IDENTIFIER} at ${PATH_IN_REPO}; submitting it as a new package."
|
|
73
|
+
echo "found=false" >> "$GITHUB_OUTPUT"
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
- name: Render manifests for a first submission
|
|
77
|
+
if: steps.exists.outputs.found == 'false'
|
|
78
|
+
shell: bash
|
|
79
|
+
env:
|
|
80
|
+
GH_TOKEN: ${{ github.token }}
|
|
81
|
+
run: |
|
|
82
|
+
TAG="${{ steps.release.outputs.tag }}"
|
|
83
|
+
VERSION="${{ steps.release.outputs.version }}"
|
|
84
|
+
|
|
85
|
+
mkdir -p artifacts manifests
|
|
86
|
+
|
|
87
|
+
gh release download "$TAG" \
|
|
88
|
+
--repo "$REPO" \
|
|
89
|
+
--pattern "sigit-win-*.exe.sha256" \
|
|
90
|
+
--dir artifacts/
|
|
91
|
+
|
|
92
|
+
# The schema wants 64 hex characters; the community validation
|
|
93
|
+
# pipeline writes them uppercase, so match that.
|
|
94
|
+
SHA_AMD64=$(tr -d '[:space:]' < artifacts/sigit-win-amd64.exe.sha256 | tr '[:lower:]' '[:upper:]')
|
|
95
|
+
SHA_ARM64=$(tr -d '[:space:]' < artifacts/sigit-win-arm64.exe.sha256 | tr '[:lower:]' '[:upper:]')
|
|
96
|
+
|
|
97
|
+
RELEASE_DATE="${{ steps.release.outputs.date }}"
|
|
98
|
+
|
|
99
|
+
for template in packaging/winget/*.yaml.in; do
|
|
100
|
+
out="manifests/$(basename "$template" .in)"
|
|
101
|
+
sed \
|
|
102
|
+
-e "s|@VERSION@|${VERSION}|g" \
|
|
103
|
+
-e "s|@TAG@|${TAG}|g" \
|
|
104
|
+
-e "s|@REPO@|${REPO}|g" \
|
|
105
|
+
-e "s|@SHA_AMD64@|${SHA_AMD64}|g" \
|
|
106
|
+
-e "s|@SHA_ARM64@|${SHA_ARM64}|g" \
|
|
107
|
+
-e "s|@RELEASE_DATE@|${RELEASE_DATE}|g" \
|
|
108
|
+
"$template" > "$out"
|
|
109
|
+
|
|
110
|
+
echo "--- ${out} ---"
|
|
111
|
+
cat "$out"
|
|
112
|
+
done
|
|
113
|
+
|
|
114
|
+
- name: Download wingetcreate
|
|
115
|
+
shell: pwsh
|
|
116
|
+
run: Invoke-WebRequest -Uri "https://aka.ms/wingetcreate/latest" -OutFile wingetcreate.exe
|
|
117
|
+
|
|
118
|
+
- name: Submit new package
|
|
119
|
+
if: steps.exists.outputs.found == 'false'
|
|
120
|
+
shell: pwsh
|
|
121
|
+
env:
|
|
122
|
+
# wingetcreate reads the token from this variable. Passing it as
|
|
123
|
+
# --token instead makes the tool warn that the token can end up in
|
|
124
|
+
# logs, which on a shared runner is not a warning worth ignoring.
|
|
125
|
+
WINGET_CREATE_GITHUB_TOKEN: ${{ secrets.WINGET_TOKEN }}
|
|
126
|
+
run: |
|
|
127
|
+
if (-not $env:WINGET_CREATE_GITHUB_TOKEN) {
|
|
128
|
+
Write-Error "WINGET_TOKEN is not set. It needs a PAT with public_repo scope so wingetcreate can fork microsoft/winget-pkgs and open the manifest PR."
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
$version = "${{ steps.release.outputs.version }}"
|
|
132
|
+
|
|
133
|
+
# --no-open because the runner has no browser to open the PR in.
|
|
134
|
+
.\wingetcreate.exe submit manifests `
|
|
135
|
+
--prtitle "New package: $env:PACKAGE_IDENTIFIER version $version" `
|
|
136
|
+
--no-open
|
|
137
|
+
|
|
138
|
+
if ($LASTEXITCODE -ne 0) {
|
|
139
|
+
Write-Error "wingetcreate submit failed with exit code $LASTEXITCODE"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
- name: Submit manifest update
|
|
143
|
+
if: steps.exists.outputs.found == 'true'
|
|
144
|
+
shell: pwsh
|
|
145
|
+
env:
|
|
146
|
+
WINGET_CREATE_GITHUB_TOKEN: ${{ secrets.WINGET_TOKEN }}
|
|
147
|
+
run: |
|
|
148
|
+
if (-not $env:WINGET_CREATE_GITHUB_TOKEN) {
|
|
149
|
+
Write-Error "WINGET_TOKEN is not set. It needs a PAT with public_repo scope so wingetcreate can fork microsoft/winget-pkgs and open the manifest PR."
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
$tag = "${{ steps.release.outputs.tag }}"
|
|
153
|
+
$version = "${{ steps.release.outputs.version }}"
|
|
154
|
+
$base = "https://github.com/${env:REPO}/releases/download/$tag"
|
|
155
|
+
|
|
156
|
+
# The trailing |x64 and |arm64 tell wingetcreate which installer
|
|
157
|
+
# entry each URL replaces. Without them it guesses from the file
|
|
158
|
+
# name, and "sigit-win-amd64.exe" is not a spelling it recognises.
|
|
159
|
+
.\wingetcreate.exe update $env:PACKAGE_IDENTIFIER `
|
|
160
|
+
--version $version `
|
|
161
|
+
--urls "$base/sigit-win-amd64.exe|x64" "$base/sigit-win-arm64.exe|arm64" `
|
|
162
|
+
--release-notes-url "https://github.com/${env:REPO}/releases/tag/$tag" `
|
|
163
|
+
--release-date "${{ steps.release.outputs.date }}" `
|
|
164
|
+
--prtitle "Update $env:PACKAGE_IDENTIFIER to version $version" `
|
|
165
|
+
--submit `
|
|
166
|
+
--no-open
|
|
167
|
+
|
|
168
|
+
if ($LASTEXITCODE -ne 0) {
|
|
169
|
+
Write-Error "wingetcreate failed with exit code $LASTEXITCODE"
|
|
170
|
+
}
|
sigit_code-1.5.6/.nvmrc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
22
|
|
@@ -26,7 +26,23 @@ from the name alone (e.g. `feature/tool-permission-system`, `fix/glob-mtime-sort
|
|
|
26
26
|
a task, ticket, or session id (not `feature/task-q003hm`).
|
|
27
27
|
|
|
28
28
|
**IMPORTANT — pull request target:** Always open pull requests against the `development` branch,
|
|
29
|
-
never `main`. `main` is release-only; `development` is where day-to-day work integrates
|
|
29
|
+
never `main`. `main` is release-only; `development` is where day-to-day work integrates, and the
|
|
30
|
+
release merge (see the `sigit-code-release` skill) is the one thing that ever puts commits on
|
|
31
|
+
`main`.
|
|
32
|
+
|
|
33
|
+
This rule needs help to hold, because the repository's default branch is `main`: both
|
|
34
|
+
`gh pr create` and the GitHub web form pre-select it, so a PR lands on the wrong base unless the
|
|
35
|
+
base is passed explicitly. Pass it every time, and check that it took:
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
gh pr create --base development --head <branch>
|
|
39
|
+
gh pr view <number> --json baseRefName
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Retargeting a PR that was opened against `main` costs nothing before it merges:
|
|
43
|
+
`gh pr edit <number> --base development`. After it merges it costs real work — the change sits on
|
|
44
|
+
`main` while `development`, which the next release is cut from, does not have it, and someone has
|
|
45
|
+
to carry it back by hand. PR #65 went in that way.
|
|
30
46
|
|
|
31
47
|
**IMPORTANT — branch off `development`:** Start every working branch from the latest
|
|
32
48
|
`origin/development`. Exception: when new work *depends on* a feature branch that has not merged
|
|
@@ -182,10 +198,11 @@ feeds results back. Neither the loop nor ACP/TUI surfaces depend on a concrete b
|
|
|
182
198
|
`tests/mcp_stdio.rs`, driven by the test-only `src/bin/mcp_stdio_stub.rs` helper binary
|
|
183
199
|
(excluded from the published crate via `exclude` in `Cargo.toml`). The baked-in official
|
|
184
200
|
server is *also* listed in the public MCP Registry as `si.sigit/sigit` — a **remote**
|
|
185
|
-
Streamable-HTTP listing
|
|
186
|
-
`release-mcp-registry.yml`)
|
|
187
|
-
forces a domain namespace (`si.sigit` ↔
|
|
188
|
-
GitHub-OIDC scheme `smbcloud-cli` uses for its
|
|
201
|
+
Streamable-HTTP listing owned by the [`getsigit/si`](https://github.com/getsigit/si) repo
|
|
202
|
+
(`server.json` at its root, published by its `release-mcp-registry.yml`), not this one. Because
|
|
203
|
+
it's a remote server, the registry's URL-match rule forces a domain namespace (`si.sigit` ↔
|
|
204
|
+
`sigit.si`) verified by a DNS TXT record, not the GitHub-OIDC scheme `smbcloud-cli` uses for its
|
|
205
|
+
package listing.
|
|
189
206
|
- **`src/permissions.rs`** — tool permission policy. Every tool call passes through
|
|
190
207
|
`decision_for` before executing: read-only tools always run; mutating tools (and all
|
|
191
208
|
`mcp__*`/unknown tools) are governed by, in order: per-session plan mode (`/plan` — deny all
|
|
@@ -267,6 +284,12 @@ Publishing splits into two groups. **Language registries** each get their own ta
|
|
|
267
284
|
workflow: `release-crates`, `release-npm`, `release-nuget`, `release-pypi`. The `npm/`, `nuget/`,
|
|
268
285
|
and `pypi/` dirs hold their wrapper-package templates.
|
|
269
286
|
|
|
287
|
+
npm and NuGet authenticate with OIDC (Trusted Publishing), so neither needs a stored token. On
|
|
288
|
+
npm that is configured per package, not per org: all seven `@getsigit/*` names carry a trusted
|
|
289
|
+
publisher pointing at `release-npm.yml`, and a package added later needs the same setup or its
|
|
290
|
+
publish step will fail. OIDC also requires npm >= 11.5.1 and Node >= 22.14.0, which is why the
|
|
291
|
+
workflow upgrades npm and why `.nvmrc` cannot drop below 22.
|
|
292
|
+
|
|
270
293
|
**OS package managers** all publish somewhere outside this repo and all need checksums from the
|
|
271
294
|
GitHub release, so `release-github` builds the binaries, attaches the assets, and then dispatches
|
|
272
295
|
`release-homebrew`, `release-scoop`, `release-winget`, and `release-aur`. A dispatch failure in one
|
|
@@ -283,8 +306,12 @@ Three of these need credentials or a one-time manual step before they work:
|
|
|
283
306
|
- Scoop needs a `getsigit/scoop-bucket` repo and a `SCOOP_BUCKET_TOKEN` secret, mirroring the
|
|
284
307
|
Homebrew tap setup.
|
|
285
308
|
- winget needs a `WINGET_TOKEN` (PAT with `public_repo`) so `wingetcreate` can fork
|
|
286
|
-
`microsoft/winget-pkgs`.
|
|
287
|
-
|
|
309
|
+
`microsoft/winget-pkgs`. It is passed as `WINGET_CREATE_GITHUB_TOKEN` rather than `--token`,
|
|
310
|
+
which wingetcreate warns can leak the token into logs. `wingetcreate update` only works on a
|
|
311
|
+
package that already exists in `microsoft/winget-pkgs`, so the workflow checks the
|
|
312
|
+
`manifests/g/getSigit/siGitCode` path first and falls back to rendering
|
|
313
|
+
`packaging/winget/*.yaml.in` and running `wingetcreate submit` for a first submission. That
|
|
314
|
+
fallback runs once, then every later release takes the `update` path.
|
|
288
315
|
- The AUR needs `AUR_USERNAME`, `AUR_EMAIL`, and `AUR_SSH_PRIVATE_KEY`. It publishes `sigit-bin`
|
|
289
316
|
(a prebuilt binary) so Arch users are not compiling the on-device inference stack to install a
|
|
290
317
|
CLI.
|
|
@@ -1,5 +1,56 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.5.6
|
|
4
|
+
|
|
5
|
+
### What changed
|
|
6
|
+
|
|
7
|
+
- **Switching models mid-conversation no longer restarts it.** Both switching
|
|
8
|
+
to a local GGUF model and picking a different cloud tier now carry the live
|
|
9
|
+
conversation history across, repairing any half-finished tool call so
|
|
10
|
+
strict OpenAI-compatible endpoints don't reject the session
|
|
11
|
+
- **Long-running tools now show progress in ACP clients.** Synchronous tools
|
|
12
|
+
(shell commands, file operations, `read_website`, ...) run on a blocking
|
|
13
|
+
thread pool instead of the ACP connection's own task, so a slow command's
|
|
14
|
+
`in_progress` update reaches the client — and Zed's spinner — while the
|
|
15
|
+
command is still running instead of arriving with the result
|
|
16
|
+
- **Text from consecutive tool rounds no longer runs together.** ACP and
|
|
17
|
+
headless clients concatenate consecutive message chunks, so a reply that
|
|
18
|
+
continued after a tool call used to glue onto the previous round's last
|
|
19
|
+
sentence with no space. A blank line now opens the next round's text
|
|
20
|
+
- **New onde-cloud model tiers.** The model picker (`/models` in the TUI, the
|
|
21
|
+
config panel in editors) now offers five additional siGit Code Cloud tiers —
|
|
22
|
+
`flux`, `apex`, `aura`, `orbit`, and `nova` — alongside the existing Fast,
|
|
23
|
+
Balanced, Large, Mini, Air, Pro, and KKK options. The tier list mirrors
|
|
24
|
+
onde-cloud's router catalogue, so all three sides (the picker, the router,
|
|
25
|
+
and the cloud catalogue) have to be updated together when a tier is added
|
|
26
|
+
- **MCP Registry listing moved to `getsigit/si`.** The `server.json` manifest
|
|
27
|
+
and its `release-mcp-registry.yml` publish workflow now live in the
|
|
28
|
+
[`getsigit/si`](https://github.com/getsigit/si) repo alongside the si CLI's
|
|
29
|
+
other code, since the registry entry describes the si platform rather than
|
|
30
|
+
the coding agent
|
|
31
|
+
|
|
32
|
+
## 1.5.5
|
|
33
|
+
|
|
34
|
+
A distribution release. siGit Code itself is unchanged. What moved is how it
|
|
35
|
+
reaches you on npm and on Windows.
|
|
36
|
+
|
|
37
|
+
### What changed
|
|
38
|
+
|
|
39
|
+
- **The npm package is now `@getsigit/sigit`.** The six platform packages moved
|
|
40
|
+
with it. `@smbcloud/sigit` stays on the registry but stops receiving updates,
|
|
41
|
+
so upgrading means switching names:
|
|
42
|
+
`npm uninstall -g @smbcloud/sigit && npm install -g @getsigit/sigit`. The old
|
|
43
|
+
package had been stuck at 1.5.2, so this picks up 1.5.3 and 1.5.4 as well.
|
|
44
|
+
- **npm publishes over OIDC.** Every `@getsigit/*` package has a trusted
|
|
45
|
+
publisher pointing at the release workflow, so no npm token is stored in the
|
|
46
|
+
repository. The release workflow moves to Node 22, which trusted publishing
|
|
47
|
+
requires.
|
|
48
|
+
- **winget releases actually go out.** The workflow could only update a package
|
|
49
|
+
already present in `microsoft/winget-pkgs`, and siGit Code had never been
|
|
50
|
+
submitted there, so every dispatch failed. It now submits the package the
|
|
51
|
+
first time and updates it on later releases. The identifier is
|
|
52
|
+
`getSigit.siGitCode`.
|
|
53
|
+
|
|
3
54
|
## 1.5.4
|
|
4
55
|
|
|
5
56
|
- **CI**: nfpm config expanded to include package version and binary path
|