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.
Files changed (92) hide show
  1. {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/AGENTS.md +34 -7
  2. {sigit_code-1.5.4/.claude → sigit_code-1.5.6/.agents}/skills/branding/SKILL.md +6 -6
  3. {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/sigit-code-release/SKILL.md +15 -4
  4. {sigit_code-1.5.4/.agents → sigit_code-1.5.6/.claude}/skills/branding/SKILL.md +6 -6
  5. {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/sigit-code-release/SKILL.md +15 -4
  6. {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-npm.yml +21 -9
  7. sigit_code-1.5.6/.github/workflows/release-winget.yml +170 -0
  8. sigit_code-1.5.6/.nvmrc +1 -0
  9. {sigit_code-1.5.4 → sigit_code-1.5.6}/AGENTS.md +34 -7
  10. {sigit_code-1.5.4 → sigit_code-1.5.6}/CHANGELOG.md +51 -0
  11. {sigit_code-1.5.4 → sigit_code-1.5.6}/CLAUDE.md +34 -7
  12. {sigit_code-1.5.4 → sigit_code-1.5.6}/Cargo.lock +1 -1
  13. {sigit_code-1.5.4 → sigit_code-1.5.6}/Cargo.toml +1 -1
  14. {sigit_code-1.5.4 → sigit_code-1.5.6}/PKG-INFO +3 -3
  15. {sigit_code-1.5.4 → sigit_code-1.5.6}/README.md +2 -2
  16. {sigit_code-1.5.4 → sigit_code-1.5.6}/docs/mcp.md +5 -3
  17. {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/README.md.tmpl +10 -10
  18. {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/package-main.json.tmpl +7 -7
  19. {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/package.json.tmpl +1 -1
  20. {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/sigit/README.md +8 -8
  21. {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/sigit/package.json +7 -7
  22. {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/sigit/src/index.ts +1 -1
  23. {sigit_code-1.5.4 → sigit_code-1.5.6}/nuget/sigit/README.md +1 -1
  24. sigit_code-1.5.6/packaging/winget/getSigit.siGitCode.installer.yaml.in +18 -0
  25. sigit_code-1.5.6/packaging/winget/getSigit.siGitCode.locale.en-US.yaml.in +40 -0
  26. sigit_code-1.5.6/packaging/winget/getSigit.siGitCode.yaml.in +6 -0
  27. {sigit_code-1.5.4 → sigit_code-1.5.6}/pypi/README.md +2 -2
  28. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/backend.rs +202 -0
  29. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/headless.rs +17 -37
  30. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/main.rs +194 -43
  31. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/provider.rs +18 -5
  32. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/tools.rs +40 -12
  33. {sigit_code-1.5.4 → sigit_code-1.5.6}/tests/acp_permissions.rs +231 -7
  34. {sigit_code-1.5.4 → sigit_code-1.5.6}/tests/headless_mode.rs +59 -0
  35. sigit_code-1.5.4/.github/workflows/release-mcp-registry.yml +0 -79
  36. sigit_code-1.5.4/.github/workflows/release-winget.yml +0 -71
  37. sigit_code-1.5.4/.nvmrc +0 -1
  38. sigit_code-1.5.4/server.json +0 -39
  39. {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/agent-client-protocol/SKILL.md +0 -0
  40. {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/ai-assisted-coding/SKILL.md +0 -0
  41. {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/run-sigit/SKILL.md +0 -0
  42. {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/run-sigit/driver.mjs +0 -0
  43. {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/run-sigit/tui-smoke.sh +0 -0
  44. {sigit_code-1.5.4 → sigit_code-1.5.6}/.agents/skills/tool-calling/SKILL.md +0 -0
  45. {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/agent-client-protocol/SKILL.md +0 -0
  46. {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/ai-assisted-coding/SKILL.md +0 -0
  47. {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/run-sigit/SKILL.md +0 -0
  48. {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/run-sigit/driver.mjs +0 -0
  49. {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/run-sigit/tui-smoke.sh +0 -0
  50. {sigit_code-1.5.4 → sigit_code-1.5.6}/.claude/skills/tool-calling/SKILL.md +0 -0
  51. {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/ci.yml +0 -0
  52. {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-aur.yml +0 -0
  53. {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-crates.yml +0 -0
  54. {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-github.yml +0 -0
  55. {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-homebrew.yml +0 -0
  56. {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-nuget.yml +0 -0
  57. {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-pypi.yml +0 -0
  58. {sigit_code-1.5.4 → sigit_code-1.5.6}/.github/workflows/release-scoop.yml +0 -0
  59. {sigit_code-1.5.4 → sigit_code-1.5.6}/.gitignore +0 -0
  60. {sigit_code-1.5.4 → sigit_code-1.5.6}/LICENSE +0 -0
  61. {sigit_code-1.5.4 → sigit_code-1.5.6}/docs/hooks.md +0 -0
  62. {sigit_code-1.5.4 → sigit_code-1.5.6}/examples/settings-with-hooks.toml +0 -0
  63. {sigit_code-1.5.4 → sigit_code-1.5.6}/examples/skills/README.md +0 -0
  64. {sigit_code-1.5.4 → sigit_code-1.5.6}/examples/skills/commit-message/SKILL.md +0 -0
  65. {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/scripts/render-main-package.cjs +0 -0
  66. {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/scripts/render-platform-package.cjs +0 -0
  67. {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/sigit/.gitignore +0 -0
  68. {sigit_code-1.5.4 → sigit_code-1.5.6}/npm/sigit/tsconfig.json +0 -0
  69. {sigit_code-1.5.4 → sigit_code-1.5.6}/nuget/.gitignore +0 -0
  70. {sigit_code-1.5.4 → sigit_code-1.5.6}/nuget/sigit/Program.cs +0 -0
  71. {sigit_code-1.5.4 → sigit_code-1.5.6}/nuget/sigit/SiGit.Code.csproj +0 -0
  72. {sigit_code-1.5.4 → sigit_code-1.5.6}/packaging/aur/PKGBUILD.in +0 -0
  73. {sigit_code-1.5.4 → sigit_code-1.5.6}/packaging/nfpm.yaml +0 -0
  74. {sigit_code-1.5.4 → sigit_code-1.5.6}/pypi/pyproject.toml +0 -0
  75. {sigit_code-1.5.4 → sigit_code-1.5.6}/pyproject.toml +0 -0
  76. {sigit_code-1.5.4 → sigit_code-1.5.6}/rust-toolchain.toml +0 -0
  77. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/account.rs +0 -0
  78. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/browser_auth.rs +0 -0
  79. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/chat.rs +0 -0
  80. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/commands.rs +0 -0
  81. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/credentials.rs +0 -0
  82. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/frontmatter.rs +0 -0
  83. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/hooks.rs +0 -0
  84. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/instructions.rs +0 -0
  85. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/mcp.rs +0 -0
  86. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/models.rs +0 -0
  87. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/permissions.rs +0 -0
  88. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/session_store.rs +0 -0
  89. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/settings.rs +0 -0
  90. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/setup.rs +0 -0
  91. {sigit_code-1.5.4 → sigit_code-1.5.6}/src/skills.rs +0 -0
  92. {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 (`server.json` at the repo root, published by
186
- `release-mcp-registry.yml`). Because it's a remote server, the registry's URL-match rule
187
- forces a domain namespace (`si.sigit` ↔ `sigit.si`) verified by a DNS TXT record, not the
188
- GitHub-OIDC scheme `smbcloud-cli` uses for its package listing.
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`. The workflow only handles *updates*; the first submission has to be made
287
- by hand with `wingetcreate new`, since a package must exist before it can be updated.
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:** `@smbcloud/sigit`
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:** `@smbcloud/sigit`
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
- - `@smbcloud/sigit` for npm
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 @smbcloud/sigit`.
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
- - `@smbcloud/sigit`
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 `@smbcloud/sigit` and `sigit-code` exact?
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-homebrew.yml` all derive `RELEASE_VERSION` from a `v*.*.*` tag or a manually supplied tag input.
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
- - `.github/workflows/` (`release-github.yml`, `release-npm.yml`, `release-pypi.yml`, `release-crates.yml`, `release-homebrew.yml`)
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
- - Any known release limitations are called out explicitly.
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:** `@smbcloud/sigit`
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:** `@smbcloud/sigit`
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
- - `@smbcloud/sigit` for npm
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 @smbcloud/sigit`.
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
- - `@smbcloud/sigit`
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 `@smbcloud/sigit` and `sigit-code` exact?
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-homebrew.yml` all derive `RELEASE_VERSION` from a `v*.*.*` tag or a manually supplied tag input.
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
- - `.github/workflows/` (`release-github.yml`, `release-npm.yml`, `release-pypi.yml`, `release-crates.yml`, `release-homebrew.yml`)
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
- - Any known release limitations are called out explicitly.
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="@smbcloud/${node_pkg}"
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 --provenance
166
+ npm publish --access public
160
167
 
161
168
  publish-npm-base:
162
- name: Publish base NPM package (@smbcloud/sigit)
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="@smbcloud/sigit"
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 --provenance
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
+ }
@@ -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 (`server.json` at the repo root, published by
186
- `release-mcp-registry.yml`). Because it's a remote server, the registry's URL-match rule
187
- forces a domain namespace (`si.sigit` ↔ `sigit.si`) verified by a DNS TXT record, not the
188
- GitHub-OIDC scheme `smbcloud-cli` uses for its package listing.
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`. The workflow only handles *updates*; the first submission has to be made
287
- by hand with `wingetcreate new`, since a package must exist before it can be updated.
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