sigit-code 1.3.0__tar.gz → 1.3.2__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.3.0 → sigit_code-1.3.2}/CHANGELOG.md +38 -1
- {sigit_code-1.3.0 → sigit_code-1.3.2}/CLAUDE.md +66 -11
- {sigit_code-1.3.0 → sigit_code-1.3.2}/Cargo.lock +1 -1
- {sigit_code-1.3.0 → sigit_code-1.3.2}/Cargo.toml +1 -1
- {sigit_code-1.3.0 → sigit_code-1.3.2}/LICENSE +1 -1
- {sigit_code-1.3.0 → sigit_code-1.3.2}/PKG-INFO +2 -2
- {sigit_code-1.3.0 → sigit_code-1.3.2}/README.md +1 -1
- {sigit_code-1.3.0 → sigit_code-1.3.2}/npm/sigit/README.md +1 -1
- {sigit_code-1.3.0 → sigit_code-1.3.2}/pypi/README.md +1 -1
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/backend.rs +394 -6
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/chat.rs +311 -6
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/instructions.rs +20 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/main.rs +410 -26
- sigit_code-1.3.2/src/mcp.rs +954 -0
- sigit_code-1.3.2/src/permissions.rs +337 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/provider.rs +5 -5
- sigit_code-1.3.2/src/session_store.rs +167 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/settings.rs +134 -5
- sigit_code-1.3.2/src/tools.rs +3403 -0
- sigit_code-1.3.2/tests/acp_permissions.rs +353 -0
- sigit_code-1.3.0/src/tools.rs +0 -1453
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.agents/AGENTS.md +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.agents/skills/agent-client-protocol/SKILL.md +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.agents/skills/ai-assisted-coding/SKILL.md +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.agents/skills/branding/SKILL.md +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.agents/skills/sigit-code-release/SKILL.md +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.agents/skills/tool-calling/SKILL.md +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.claude/skills/run-sigit/SKILL.md +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.claude/skills/run-sigit/driver.mjs +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.claude/skills/run-sigit/tui-smoke.sh +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.github/workflows/ci.yml +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.github/workflows/release-crates.yml +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.github/workflows/release-github.yml +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.github/workflows/release-homebrew.yml +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.github/workflows/release-npm.yml +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.github/workflows/release-pypi.yml +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.gitignore +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/.nvmrc +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/examples/skills/README.md +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/examples/skills/commit-message/SKILL.md +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/npm/README.md.tmpl +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/npm/package-main.json.tmpl +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/npm/package.json.tmpl +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/npm/scripts/render-main-package.cjs +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/npm/scripts/render-platform-package.cjs +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/npm/sigit/.gitignore +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/npm/sigit/package.json +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/npm/sigit/src/index.ts +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/npm/sigit/tsconfig.json +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/pypi/pyproject.toml +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/pyproject.toml +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/rust-toolchain.toml +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/account.rs +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/credentials.rs +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/models.rs +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/setup.rs +0 -0
- {sigit_code-1.3.0 → sigit_code-1.3.2}/src/skills.rs +0 -0
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.3.2
|
|
4
|
+
|
|
5
|
+
Adds a tool permission system with plan mode, durable sessions with context
|
|
6
|
+
compaction, background command execution, a subagent research tool, and commit
|
|
7
|
+
co-author attribution.
|
|
8
|
+
|
|
9
|
+
### What changed
|
|
10
|
+
|
|
11
|
+
- Every tool call now passes a permission policy before executing. Read-only tools always run; mutating tools (and all MCP or unknown tools) are governed by, in order: plan mode, session grants, per-tool overrides, and a default mode from `[permissions]` in `settings.toml` (`allow`/`ask`/`deny`, default `ask`). On `ask`, editors get a native ACP permission dialog (allow once / allow for this session / deny) and the TUI pauses on a y/a/n prompt showing the tool and its arguments. `SIGIT_PERMISSIONS` overrides the default mode for headless runs and clients without permission support
|
|
12
|
+
- New `/plan [on|off]` command: plan mode blocks mutating tools and asks the model to present a plan while research tools keep working. `/permissions` prints the effective policy
|
|
13
|
+
- Sessions are durable: conversation history is saved per session under `~/.config/sigit/sessions/` after every turn. ACP `session/load` actually restores it, the TUI gets `/resume`, and `/clear` deletes the saved file
|
|
14
|
+
- Context compaction: `/compact` compresses the conversation on demand, and the agent compacts automatically once the history approaches a 24k-token budget, summarizing older turns and keeping the recent ones. The tool-round cap rises from 10 to 24 now that long sessions have a defense other than the cap
|
|
15
|
+
- `run_command` can run work in the background: pass `run_in_background` and the tool returns a task id immediately, so builds, test suites, and dev servers are no longer killed by the 120 second foreground timeout. Poll with the new `command_output` tool (read-only, never prompts) and stop with `kill_command`
|
|
16
|
+
- New `task` tool: delegate research to a fresh subagent conversation that only gets the read-only tools and returns its final answer, keeping the main context small. Available on OpenAI-compatible backends; on-device returns a clear fallback until onde supports a second context
|
|
17
|
+
- Commits created by the agent are co-authored: commit messages end with `Co-Authored-By: siGit Code <sigit@sigit.si>` (the [sigitc](https://github.com/sigitc) account), which GitHub renders next to the human author. If the model forgets the trailer, siGit amends it in, never rewriting commits that already exist on a remote
|
|
18
|
+
- ACP mode now honors the `OPENAI_BASE_URL`/`OPENAI_API_KEY` provider override at startup, matching the interactive client
|
|
19
|
+
|
|
20
|
+
## 1.3.1
|
|
21
|
+
|
|
22
|
+
Adds [Model Context Protocol](https://modelcontextprotocol.io) (MCP) client
|
|
23
|
+
support with the official siGit Code MCP server baked in, a set of agent tools
|
|
24
|
+
that close parity gaps in the tool layer, and refreshed branding and licensing.
|
|
25
|
+
|
|
26
|
+
### What changed
|
|
27
|
+
|
|
28
|
+
- siGit Code is now an MCP client: it connects to MCP servers over the Streamable HTTP transport (a single JSON-RPC endpoint), discovers the tools they expose, and offers them to the model alongside the built-in tools. When the model calls one, the call is forwarded to the owning server and the result fed back into the agent loop
|
|
29
|
+
- Bakes in the official siGit Code MCP server at `https://sigit.si/api/v1/mcp` (follows `SIGIT_CLOUD_URL`). When you are signed in (`sigit login`), the cloud session token is sent as the bearer credential
|
|
30
|
+
- Configure additional servers in `mcp.toml` — global (`~/.config/sigit/mcp.toml`) or project-local (`.sigit/mcp.toml`). Each `[[server]]` has a `name`, `url`, optional `enabled`, and optional `[server.headers]`; set `official = false` to opt out of the baked-in server
|
|
31
|
+
- MCP tools are namespaced `mcp__<server>__<tool>` so they never collide with built-in tools or across servers; tool output is capped to protect the model's context
|
|
32
|
+
- Discovery is best-effort at startup and bounded by a per-server timeout, so an unreachable server never blocks startup — it just contributes no tools
|
|
33
|
+
- Added a `/mcp` slash command (TUI and ACP) that lists configured servers, their connection status, and the tools each exposes
|
|
34
|
+
- Disable MCP entirely with `SIGIT_MCP=off`, or just the official server with `SIGIT_MCP_OFFICIAL=off`
|
|
35
|
+
- New agent tools that close parity gaps in the tool layer: `multi_edit` (apply a batch of exact-substring edits to one file atomically — written only if every edit matches), `glob` (locate files by name pattern with `**`/`*`/`?`/`{a,b}`, most-recently-modified first), `write_todos` (render a live task checklist through the tool result for multi-step work), and `remember` (append durable notes to the nearest `AGENTS.md`/`CLAUDE.md`)
|
|
36
|
+
- `edit_file` now supports `replace_all` and returns actionable failure context — naming the line whose trimmed text matches when only whitespace differs — so the model self-corrects in one round
|
|
37
|
+
- `search_files` gained a `file_glob` filter and a `max_results` cap (default 50, hard-capped at 1000) that also bounds the directory walk
|
|
38
|
+
- Refreshed branding and legal: updated `LICENSE`, `README`, and the npm/PyPI package descriptions
|
|
39
|
+
|
|
3
40
|
## 1.3.0
|
|
4
41
|
|
|
5
42
|
Adds a Local Inference on/off toggle, the open [Agent Skills](https://agentskills.io)
|
|
@@ -212,4 +249,4 @@ ACP and editor mode work on Windows. The part that is still missing is the inter
|
|
|
212
249
|
|
|
213
250
|
---
|
|
214
251
|
|
|
215
|
-
*© 2026 [
|
|
252
|
+
*© 2026 [Splitfire AB](https://5mb.app) ([siGit Code & Deploy](https://sigit.si)).*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CLAUDE.md
|
|
2
2
|
|
|
3
|
-
This file provides guidance to
|
|
3
|
+
This file provides guidance to AI coding agents when working with code in this repository.
|
|
4
4
|
|
|
5
5
|
## What this is
|
|
6
6
|
|
|
@@ -17,6 +17,33 @@ is a TTY:
|
|
|
17
17
|
Before the TTY/ACP split, `main` also dispatches the account subcommands `sigit login`,
|
|
18
18
|
`sigit logout`, `sigit whoami` (see `src/main.rs` `main()`).
|
|
19
19
|
|
|
20
|
+
## Working in this repo
|
|
21
|
+
|
|
22
|
+
**IMPORTANT — branch naming:** Prefix every working branch with `feature/` (new functionality)
|
|
23
|
+
or `fix/` (bug fixes) — never a tool- or agent-name prefix like `claude/`. Name the branch after
|
|
24
|
+
the *changes it contains*, as a short, descriptive, kebab-case slug that is self-explanatory
|
|
25
|
+
from the name alone (e.g. `feature/tool-permission-system`, `fix/glob-mtime-sort`), never after
|
|
26
|
+
a task, ticket, or session id (not `feature/task-q003hm`).
|
|
27
|
+
|
|
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.
|
|
30
|
+
|
|
31
|
+
**IMPORTANT — branch off `development`:** Start every working branch from the latest
|
|
32
|
+
`origin/development`. Exception: when new work *depends on* a feature branch that has not merged
|
|
33
|
+
yet (e.g. it builds on tools or APIs that branch introduces), it may be stacked on top of that
|
|
34
|
+
branch instead. When stacking: merge the base PR into `development` first, then rebase the
|
|
35
|
+
stacked branch onto `development` before opening its pull request, so each PR shows only its own
|
|
36
|
+
commits.
|
|
37
|
+
|
|
38
|
+
**IMPORTANT — run CI before pushing:** Run the full CI gate locally and confirm it is green
|
|
39
|
+
*before* pushing a branch or opening a pull request — never push work that fails these:
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
cargo fmt -- --check # formatting
|
|
43
|
+
cargo clippy --tests -- -D warnings # lint (warnings are errors)
|
|
44
|
+
cargo test --locked # tests
|
|
45
|
+
```
|
|
46
|
+
|
|
20
47
|
## Build / test / lint
|
|
21
48
|
|
|
22
49
|
```sh
|
|
@@ -36,10 +63,10 @@ Run a single test: `cargo test <test_name>`.
|
|
|
36
63
|
|
|
37
64
|
## Critical platform constraint: `#[cfg(unix)]` dead code
|
|
38
65
|
|
|
39
|
-
The interactive client
|
|
40
|
-
(`provider.rs`) are
|
|
41
|
-
|
|
42
|
-
|
|
66
|
+
The interactive client is `#[cfg(unix)]`-only. The `InferenceBackend` seam (`backend.rs`) and
|
|
67
|
+
provider resolution (`provider.rs`) are consumed by both the interactive client and the ACP
|
|
68
|
+
server, but several of their items are reached only through the Unix-only interactive paths, so
|
|
69
|
+
the dead-code lint is suppressed *on non-Unix targets only*.
|
|
43
70
|
|
|
44
71
|
Consequence: code can pass clippy on macOS/Linux but fail on the Windows target (or vice versa).
|
|
45
72
|
When touching `backend.rs`, `provider.rs`, or the interactive path, keep the `cfg` gates intact —
|
|
@@ -62,8 +89,12 @@ feeds results back. Neither the loop nor ACP/TUI surfaces depend on a concrete b
|
|
|
62
89
|
wins: (1) override via `OPENAI_BASE_URL`+`OPENAI_API_KEY` or active profile in
|
|
63
90
|
`~/.config/sigit/providers.toml`; (2) siGit Code Cloud when logged in; (3) on-device.
|
|
64
91
|
- **`src/tools.rs`** — agent tool schemas + execution: `read_file`, `create_directory`,
|
|
65
|
-
`list_directory`, `search_files`, `read_website`, `create_file`, `edit_file`,
|
|
66
|
-
`run_command`. Add a tool in both the
|
|
92
|
+
`list_directory`, `search_files`, `glob`, `read_website`, `create_file`, `edit_file`,
|
|
93
|
+
`multi_edit`, `delete_file`, `run_command`, `write_todos`, `remember`. Add a tool in both the
|
|
94
|
+
spec list (`all_tools`) and the execute `match` (`execute_tool`). `run_command` also enforces
|
|
95
|
+
commit attribution: when a command creates a new commit that lacks the
|
|
96
|
+
`Co-Authored-By: siGit Code` trailer (`COMMIT_CO_AUTHOR_TRAILER`), it amends the trailer in —
|
|
97
|
+
unless the commit already exists on a remote, which is never rewritten.
|
|
67
98
|
- **`src/skills.rs`** — [Agent Skills](https://agentskills.io) support. Discovers skill
|
|
68
99
|
folders (each with a `SKILL.md`: YAML frontmatter `name` + `description`, then Markdown
|
|
69
100
|
instructions) from `.sigit/skills/` and `.claude/skills/` in the cwd, `$SIGIT_CONFIG_DIR/skills/`,
|
|
@@ -72,6 +103,27 @@ feeds results back. Neither the loop nor ACP/TUI surfaces depend on a concrete b
|
|
|
72
103
|
calls `skill` with a name) loads the full `SKILL.md` body. The `skill` tool is appended in the
|
|
73
104
|
`*_as_specs`/`build_tool_specs` layer (not in `all_tools()`) so its description can be dynamic,
|
|
74
105
|
and only when at least one skill exists.
|
|
106
|
+
- **`src/mcp.rs`** — [Model Context Protocol](https://modelcontextprotocol.io) *client*. Connects to
|
|
107
|
+
MCP servers over the **Streamable HTTP** transport (one JSON-RPC POST endpoint; replies are
|
|
108
|
+
`application/json` or SSE), runs the `initialize`/`tools/list` handshake, and forwards `tools/call`.
|
|
109
|
+
Discovery is best-effort at startup (`mcp::init`, called from both branches of `main()`) and cached
|
|
110
|
+
in a process-global so the synchronous spec builders (`mcp::tool_specs`) and the async dispatch
|
|
111
|
+
(`mcp::call_tool`) can both read it. Tools are namespaced `mcp__<server>__<tool>`, appended in the
|
|
112
|
+
`*_as_specs`/`build_tool_specs` layer and routed in `tools::execute_tool` via `mcp::is_mcp_tool`. The
|
|
113
|
+
official server (`<cloud>/mcp`, default `https://sigit.si/api/v1/mcp`) is baked in and authed with the
|
|
114
|
+
cloud session token; extra servers live in `mcp.toml` (global `$SIGIT_CONFIG_DIR/mcp.toml` and
|
|
115
|
+
project-local `.sigit/mcp.toml`). stdio transport is not supported.
|
|
116
|
+
- **`src/permissions.rs`** — tool permission policy. Every tool call passes through
|
|
117
|
+
`decision_for` before executing: read-only tools always run; mutating tools (and all
|
|
118
|
+
`mcp__*`/unknown tools) are governed by, in order: per-session plan mode (`/plan` — deny all
|
|
119
|
+
mutating tools with a present-a-plan message), session "always allow" grants, per-tool
|
|
120
|
+
overrides and the default mode from `[permissions]` in `settings.toml` (`allow`/`ask`/`deny`,
|
|
121
|
+
default `ask`; `SIGIT_PERMISSIONS` env overrides the default). On `ask`, the ACP path sends
|
|
122
|
+
`session/request_permission` (allow once / allow for session / deny) and the TUI pauses the
|
|
123
|
+
inference task on a y/a/n prompt. Note: ACP turn-affecting handlers run in `cx.spawn`ed tasks
|
|
124
|
+
serialized by `SiGitAgent::turn_lock` so the dispatch loop can route the client's permission
|
|
125
|
+
answer mid-turn — don't move them back inline, and don't await client requests from inline
|
|
126
|
+
handlers (deadlock).
|
|
75
127
|
- **`src/instructions.rs`** — project instruction files, the always-on counterpart to skills.
|
|
76
128
|
Reads `AGENTS.md` (the cross-tool [agents.md](https://agents.md) standard) and `CLAUDE.md`,
|
|
77
129
|
walking from the session cwd up to the repo root (nearest ancestor with `.git`, never above it),
|
|
@@ -89,9 +141,9 @@ feeds results back. Neither the loop nor ACP/TUI surfaces depend on a concrete b
|
|
|
89
141
|
- **`src/credentials.rs`** — local session-token store (TOML, `0600` on Unix).
|
|
90
142
|
- **`src/models.rs`** — model-picker types shared across platforms.
|
|
91
143
|
|
|
92
|
-
Slash commands (`/help`, `/models`, `/skills`, `/login`, `/logout`, `/whoami`, `/reload`,
|
|
93
|
-
`/clear`, `/status`) are advertised via `advertise_commands` in `main.rs`
|
|
94
|
-
TUI and ACP sessions.
|
|
144
|
+
Slash commands (`/help`, `/models`, `/skills`, `/mcp`, `/login`, `/logout`, `/whoami`, `/reload`,
|
|
145
|
+
`/plan`, `/permissions`, `/clear`, `/status`) are advertised via `advertise_commands` in `main.rs`
|
|
146
|
+
and handled in both the TUI and ACP sessions.
|
|
95
147
|
|
|
96
148
|
## Model cache (macOS)
|
|
97
149
|
|
|
@@ -111,7 +163,10 @@ verbosity with `RUST_LOG`.
|
|
|
111
163
|
|
|
112
164
|
`OPENAI_BASE_URL` / `OPENAI_API_KEY` (provider override), `SIGIT_API_URL` (account API base,
|
|
113
165
|
default `https://sigit.si`), `SIGIT_CLOUD_URL`, `SIGIT_CONFIG_DIR` (default `~/.config/sigit`),
|
|
114
|
-
`SIGIT_MODEL`, `
|
|
166
|
+
`SIGIT_MODEL`, `SIGIT_MCP` (`off` disables MCP), `SIGIT_MCP_OFFICIAL` (`off` drops the baked-in
|
|
167
|
+
server), `SIGIT_PERMISSIONS` (`allow`/`ask`/`deny` — overrides the default permission mode for
|
|
168
|
+
mutating tools; the escape hatch for clients without permission-request support),
|
|
169
|
+
`HF_HOME` / `HF_HUB_CACHE`, `RUST_LOG`.
|
|
115
170
|
|
|
116
171
|
## Releasing
|
|
117
172
|
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
that a file or directory name be given on the same line as the
|
|
176
176
|
copyright notice for easier identification within third-party archives.
|
|
177
177
|
|
|
178
|
-
Copyright 2026
|
|
178
|
+
Copyright 2026 Splitfire AB (siGit Code & Deploy)
|
|
179
179
|
|
|
180
180
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
181
181
|
you may not use this file except in compliance with the License.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sigit-code
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.2
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Environment :: Console
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -111,5 +111,5 @@ This package ships a prebuilt binary. The source code lives at [github.com/getsi
|
|
|
111
111
|
|
|
112
112
|
## Copyright
|
|
113
113
|
|
|
114
|
-
© 2026 [
|
|
114
|
+
© 2026 [Splitfire AB](https://5mb.app) ([siGit Code & Deploy](https://sigit.si)).
|
|
115
115
|
|