@softspark/ai-toolkit 4.9.0 → 4.10.1
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.
- package/CHANGELOG.md +27 -0
- package/README.md +11 -9
- package/app/.claude-plugin/plugin.json +1 -1
- package/app/constitution.md +1 -1
- package/app/hooks/_session-paths.sh +40 -0
- package/app/hooks/loop-guard.sh +0 -1
- package/app/hooks/pre-compact.sh +6 -4
- package/app/hooks/save-session.sh +4 -2
- package/app/hooks/session-end.sh +7 -6
- package/app/hooks/session-start.sh +3 -1
- package/app/hooks.json +0 -10
- package/benchmarks/ecosystem-doctor-snapshot.json +20 -19
- package/kb/reference/architecture-overview.md +2 -3
- package/kb/reference/codex-cli-compatibility.md +10 -4
- package/kb/reference/hooks-catalog.md +19 -22
- package/kb/reference/opencode-compatibility.md +1 -1
- package/kb/reference/supported-tools-registry.md +9 -9
- package/kb/reference/unique-features.md +0 -1
- package/llms-full.txt +41 -40
- package/manifest.json +1 -1
- package/package.json +3 -1
- package/scripts/ecosystem_tools.json +2 -1
- package/scripts/generate_augment_hooks.py +0 -1
- package/scripts/generate_codex_hooks.py +0 -5
- package/scripts/generate_copilot.py +6 -0
- package/scripts/generate_cursor_hooks.py +0 -1
- package/scripts/generate_devin_hooks.py +0 -5
- package/scripts/generate_gemini_hooks.py +0 -5
- package/scripts/generate_opencode_plugin.py +1 -2
- package/scripts/generate_windsurf_hooks.py +0 -3
- package/scripts/install_steps/ai_tools.py +35 -1
- package/app/hooks/session-context.sh +0 -63
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,33 @@ Versioning follows [Semantic Versioning](https://semver.org/).
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## v4.10.1 — Copilot AGENTS.md install + Claude KB-first rule (2026-06-23)
|
|
11
|
+
|
|
12
|
+
Patch release. Fixes two governance regressions found in the editor-update audit: Copilot installs now emit the root `AGENTS.md` surface documented in the registry, and Claude Code receives the KB-first rule in `CLAUDE.md`, which it actually reads. Test count: 1195 → 1198.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- **GitHub Copilot local install now emits root `AGENTS.md`.** `ai-toolkit install --local --editors copilot` writes the generated agent catalog into a `TOOLKIT:copilot-agents` section without clobbering existing Codex/opencode `TOOLKIT:ai-toolkit` sections or user-authored content. Dry-run output and tests now cover the `.github/copilot-instructions.md + AGENTS.md` contract.
|
|
16
|
+
- **Claude Code KB-first rule restored in the right instruction file.** `CLAUDE.md` now explicitly requires `smart_query()` or `hybrid_search_kb()` before technical/project answers; the prior generated `AGENTS.md` placement was not sufficient for Claude Code runtime enforcement.
|
|
17
|
+
- **Codex PostToolUse no longer emits unsupported `suppressOutput`.** `loop-guard.sh` no longer forces `AI_TOOLKIT_HOOK_FORMAT=json`; under Codex it stays quiet/plain unless the generator explicitly opts into a supported JSON schema.
|
|
18
|
+
- **Npm package excludes local Claude session artifacts.** `package.json` now excludes `app/**/.claude/**` so ignored maintainer-local session files cannot leak into `npm pack`.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- **Editor registry/docs aligned with implementation.** README, architecture overview, and the supported-tools registry now describe Copilot's root `AGENTS.md` emission consistently.
|
|
22
|
+
- **Ecosystem doctor baseline refreshed.** Snapshot updated for upstream Claude Code and Gemini CLI documentation content hash drift; no generator changes were required.
|
|
23
|
+
|
|
24
|
+
## v4.10.0 — Per-repo session storage outside the repo + drop dead session-context hook (2026-06-17)
|
|
25
|
+
|
|
26
|
+
Minor release. Session lifecycle hooks stop writing auto-generated files into each project's `.claude/` directory and store them per-repo under `~/.softspark/ai-toolkit/`. The dead `session-context.sh` hook (write-only, no consumer) is removed across all editor generators. Test count: 1197 → 1195.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
- **Session lifecycle hooks store artifacts outside the repo.** `save-session.sh`, `session-end.sh`, `session-start.sh`, and `pre-compact.sh` now read/write the auto-generated session files (`session-context.md`, `session-end.md`, `session-context.md.checkpoints`, `decisions.md`) under `~/.softspark/ai-toolkit/sessions/<repo-key>/` instead of the project's `.claude/` directory. `<repo-key>` is the git work-tree root path (fallback: cwd) with `/` replaced by `-`, keyed per repo so projects stay isolated. Stops these files from piling up in every repository. New shared helper `app/hooks/_session-paths.sh` is the single source of path resolution. No migration of pre-existing in-repo files: the new store starts fresh, old `.claude/session-*.md` left for the user to delete.
|
|
30
|
+
- **Constitution Art. I §5** updated to point proactive checkpointing at the per-repo session store.
|
|
31
|
+
|
|
32
|
+
### Removed
|
|
33
|
+
- **Dropped the dead `session-context.sh` hook.** It fired on `SessionStart` and wrote an environment snapshot (`~/.softspark/ai-toolkit/sessions/<id>.json`: pwd, git branch/status, node/python versions) that no hook, script, or tool ever read — pure write-only dead code (Constitution Art. VI.1). Removed the script, its `app/hooks.json` wiring, its entries across all 7 editor hook generators (cursor, windsurf, codex, devin, augment, gemini, opencode), its tests, and its catalog/overview docs. Editors that had it as the sole entry for an event (windsurf `post_setup_worktree`, codex `PostCompact`, gemini `BeforeModel`, devin `SessionStart`) drop that event. Not related to the session-storage change above — it never wrote to the repo.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
10
37
|
## v4.9.0 - Epistemic integrity rules + deep-research skill + custom-rule leak fix (2026-06-15)
|
|
11
38
|
|
|
12
39
|
Minor release. Adds a constitution article on injection resistance and grounding, a new web-research methodology skill, and an anti-sycophancy/formatting pass across the voice layer. Also fixes a leak where a maintainer's personal registered rules were baked into the toolkit's own committed editor files. Skill count: 107 → 108. Constitution: 6 → 7 articles. Test count: 1196 → 1197.
|
package/README.md
CHANGED
|
@@ -6,16 +6,18 @@
|
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](app/skills/)
|
|
8
8
|
[](app/agents/)
|
|
9
|
-
[](tests/)
|
|
10
10
|
|
|
11
|
-
## What's New in v4.
|
|
11
|
+
## What's New in v4.10.1
|
|
12
12
|
|
|
13
|
-
v4.
|
|
13
|
+
v4.10.1 fixes editor-governance gaps found in the release audit.
|
|
14
14
|
|
|
15
|
-
- **
|
|
16
|
-
-
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
15
|
+
- **Copilot local installs now emit root `AGENTS.md`**: `ai-toolkit install --local --editors copilot` writes the generated agent catalog into a `TOOLKIT:copilot-agents` section while preserving existing Codex/opencode sections and user text.
|
|
16
|
+
- **Claude Code KB-first enforcement restored**: `CLAUDE.md` now carries the mandatory `smart_query()` / `hybrid_search_kb()` rule before technical/project answers, instead of relying on generated `AGENTS.md`.
|
|
17
|
+
- **Codex PostToolUse hook output fixed**: `loop-guard.sh` no longer forces Claude-style JSON with `suppressOutput` under quiet Codex hooks.
|
|
18
|
+
- **Release packaging hardened**: local `.claude` session artifacts under `app/` are excluded from `npm pack`, even if they exist in a maintainer checkout.
|
|
19
|
+
- **Docs and ecosystem baseline refreshed**: README, registry, and architecture docs now match the Copilot implementation; ecosystem-doctor snapshot is refreshed for upstream Claude/Gemini docs hash drift.
|
|
20
|
+
- **Test count**: 1195 → 1198.
|
|
19
21
|
|
|
20
22
|
See [CHANGELOG.md](CHANGELOG.md) for full history.
|
|
21
23
|
|
|
@@ -104,7 +106,7 @@ See [CLI Reference](kb/reference/cli-reference.md) for all commands and options.
|
|
|
104
106
|
| Cursor | `.cursor/rules/*.mdc` + `.cursor/mcp.json` + `.cursor/skills/*` | ✅ | project (`~/.cursor/mcp.json` for MCP only) |
|
|
105
107
|
| Windsurf (Devin Desktop) | `~/.codeium/.../global_rules.md` + `~/.codeium/windsurf/skills/*` + `.devin/rules/*.md` + `.windsurf/rules/*.md` (legacy) | ✅ | global + project |
|
|
106
108
|
| Gemini CLI | `~/.gemini/GEMINI.md` | ✅ | global |
|
|
107
|
-
| GitHub Copilot | `.github/copilot-instructions.md` | — | project |
|
|
109
|
+
| GitHub Copilot | `.github/copilot-instructions.md` + `.github/instructions/*` + `.github/prompts/*` + `AGENTS.md` | — | project |
|
|
108
110
|
| Cline | `~/Documents/Cline/Rules/*.md` + `~/.cline/skills/*` + `.clinerules/*.md` | — | global + project |
|
|
109
111
|
| Roo Code | `~/.roo/rules/*.md` + `.roomodes` + `.roo/rules/*.md` | — | global rules + project |
|
|
110
112
|
| Aider | `~/.aider.conf.yml` + `.aider.conf.yml` + `CONVENTIONS.md` | — | global + project |
|
|
@@ -148,7 +150,7 @@ ai-toolkit/
|
|
|
148
150
|
│ └── ARCHITECTURE.md # Full system design
|
|
149
151
|
├── kb/ # Reference docs, procedures, plans
|
|
150
152
|
├── scripts/ # Validation, install, evaluation scripts
|
|
151
|
-
├── tests/ # Bats test suite (
|
|
153
|
+
├── tests/ # Bats test suite (1198 tests)
|
|
152
154
|
└── CHANGELOG.md
|
|
153
155
|
```
|
|
154
156
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-toolkit",
|
|
3
3
|
"description": "Professional-grade Claude Code toolkit with persona presets, skill security auditor, expanded lifecycle hooks, experimental opt-in plugin packs, benchmark harvesting, and multi-tool support.",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.10.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SoftSpark",
|
|
7
7
|
"url": "https://github.com/softspark"
|
package/app/constitution.md
CHANGED
|
@@ -21,7 +21,7 @@ status: IMMUTABLE
|
|
|
21
21
|
- Exceeding limits requires explicit user override
|
|
22
22
|
|
|
23
23
|
### Section 5: Proactive Context Checkpointing
|
|
24
|
-
- During multi-step tasks (>5 tool calls),
|
|
24
|
+
- During multi-step tasks (>5 tool calls), append milestones to the per-repo session-context store after each major milestone. Auto-generated session files live under `~/.softspark/ai-toolkit/sessions/<repo-root-with-/-as->/` (the repo work-tree root path with `/` replaced by `-`), NOT inside the project repo. Append agent checkpoints to `session-context.md.checkpoints` in that directory; the Stop hook folds them into the session summary
|
|
25
25
|
- Checkpoint MUST include: current objective, completed steps, pending steps, files modified, key decisions
|
|
26
26
|
- Minimum frequency: after every completed task phase, workflow stage, or subagent handoff
|
|
27
27
|
- Agent SHOULD checkpoint before any risky or destructive operation
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# _session-paths.sh — shared per-repo session storage paths for lifecycle hooks.
|
|
3
|
+
#
|
|
4
|
+
# All auto-generated session artifacts live OUTSIDE the project repo, under a
|
|
5
|
+
# per-repo subdirectory of ~/.softspark/ai-toolkit/sessions/. This keeps generated
|
|
6
|
+
# files (session context, handoff note, checkpoints, decisions) from polluting
|
|
7
|
+
# every project's .claude/ directory.
|
|
8
|
+
#
|
|
9
|
+
# Usage (in a hook script):
|
|
10
|
+
# source "$(dirname "$0")/_session-paths.sh"
|
|
11
|
+
# Then use the exported SESSION_* paths.
|
|
12
|
+
#
|
|
13
|
+
# Repo key: the git work-tree root (fallback: cwd) with "/" replaced by "-",
|
|
14
|
+
# mirroring Claude Code's own ~/.claude/projects/<encoded-path> convention so the
|
|
15
|
+
# location is derivable by an agent, not an opaque hash.
|
|
16
|
+
|
|
17
|
+
_session_repo_root() {
|
|
18
|
+
if command -v git >/dev/null 2>&1 && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
19
|
+
local top
|
|
20
|
+
top="$(git rev-parse --show-toplevel 2>/dev/null)"
|
|
21
|
+
if [ -n "$top" ]; then
|
|
22
|
+
printf '%s' "$top"
|
|
23
|
+
return 0
|
|
24
|
+
fi
|
|
25
|
+
fi
|
|
26
|
+
pwd
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
SESSION_REPO_ROOT="$(_session_repo_root)"
|
|
30
|
+
SESSION_REPO_KEY="${SESSION_REPO_ROOT//\//-}"
|
|
31
|
+
SESSION_DIR="$HOME/.softspark/ai-toolkit/sessions/$SESSION_REPO_KEY"
|
|
32
|
+
SESSION_CONTEXT_FILE="$SESSION_DIR/session-context.md"
|
|
33
|
+
SESSION_CHECKPOINTS_FILE="$SESSION_DIR/session-context.md.checkpoints"
|
|
34
|
+
SESSION_END_FILE="$SESSION_DIR/session-end.md"
|
|
35
|
+
SESSION_DECISIONS_FILE="$SESSION_DIR/decisions.md"
|
|
36
|
+
|
|
37
|
+
export SESSION_REPO_ROOT SESSION_REPO_KEY SESSION_DIR
|
|
38
|
+
export SESSION_CONTEXT_FILE SESSION_CHECKPOINTS_FILE SESSION_END_FILE SESSION_DECISIONS_FILE
|
|
39
|
+
|
|
40
|
+
unset -f _session_repo_root
|
package/app/hooks/loop-guard.sh
CHANGED
|
@@ -53,7 +53,6 @@ fi
|
|
|
53
53
|
COUNT=$(grep -cxF "$HASH" "$LOG" 2>/dev/null | tr -d ' ')
|
|
54
54
|
[ -z "$COUNT" ] && COUNT=0
|
|
55
55
|
if [ "$COUNT" -ge "$THRESHOLD" ]; then
|
|
56
|
-
export AI_TOOLKIT_HOOK_FORMAT=json
|
|
57
56
|
hook_emit_context "PostToolUse" \
|
|
58
57
|
"Loop guard: the same ${TOOL_NAME} action has repeated ${COUNT}x within the last ${WINDOW} steps. If you are not making progress, stop and reassess — try a different approach or ask the user — instead of retrying the identical action."
|
|
59
58
|
fi
|
package/app/hooks/pre-compact.sh
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
# shellcheck source=_profile-check.sh
|
|
10
10
|
source "$(dirname "$0")/_profile-check.sh"
|
|
11
|
+
# shellcheck source=_session-paths.sh
|
|
12
|
+
source "$(dirname "$0")/_session-paths.sh"
|
|
11
13
|
|
|
12
14
|
# ---------------------------------------------------------------------------
|
|
13
15
|
# 1. Mandatory reload reminder (highest priority — always survives)
|
|
@@ -32,9 +34,9 @@ fi
|
|
|
32
34
|
# ---------------------------------------------------------------------------
|
|
33
35
|
# 3. Current task state (medium priority — what we're doing)
|
|
34
36
|
# ---------------------------------------------------------------------------
|
|
35
|
-
if [ -f "
|
|
37
|
+
if [ -f "$SESSION_CONTEXT_FILE" ]; then
|
|
36
38
|
echo "=== Session Context ==="
|
|
37
|
-
cat "
|
|
39
|
+
cat "$SESSION_CONTEXT_FILE"
|
|
38
40
|
echo "======================="
|
|
39
41
|
fi
|
|
40
42
|
|
|
@@ -55,10 +57,10 @@ fi
|
|
|
55
57
|
# ---------------------------------------------------------------------------
|
|
56
58
|
# 5. Key decisions file (if user has been noting decisions this session)
|
|
57
59
|
# ---------------------------------------------------------------------------
|
|
58
|
-
if [ -f "
|
|
60
|
+
if [ -f "$SESSION_DECISIONS_FILE" ]; then
|
|
59
61
|
echo "=== Key Decisions This Session ==="
|
|
60
62
|
# Only show last 10 lines to keep token budget tight
|
|
61
|
-
tail -10 "
|
|
63
|
+
tail -10 "$SESSION_DECISIONS_FILE"
|
|
62
64
|
echo "=================================="
|
|
63
65
|
fi
|
|
64
66
|
|
|
@@ -6,16 +6,18 @@
|
|
|
6
6
|
|
|
7
7
|
# shellcheck source=_profile-check.sh
|
|
8
8
|
source "$(dirname "$0")/_profile-check.sh"
|
|
9
|
+
# shellcheck source=_session-paths.sh
|
|
10
|
+
source "$(dirname "$0")/_session-paths.sh"
|
|
9
11
|
|
|
10
12
|
# Read from stdin (Claude Code passes JSON with .session_id, .last_assistant_message)
|
|
11
13
|
INPUT=$(cat)
|
|
12
14
|
SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // empty' 2>/dev/null)
|
|
13
15
|
LAST_MSG=$(echo "$INPUT" | jq -r '.last_assistant_message // "No summary available"' 2>/dev/null | head -5)
|
|
14
16
|
|
|
15
|
-
SESSION_FILE="
|
|
17
|
+
SESSION_FILE="$SESSION_CONTEXT_FILE"
|
|
16
18
|
|
|
17
19
|
if [ -n "$SESSION_ID" ]; then
|
|
18
|
-
mkdir -p
|
|
20
|
+
mkdir -p "$SESSION_DIR"
|
|
19
21
|
|
|
20
22
|
# Gather git state for richer context
|
|
21
23
|
GIT_BRANCH=""
|
package/app/hooks/session-end.sh
CHANGED
|
@@ -7,13 +7,14 @@
|
|
|
7
7
|
|
|
8
8
|
# shellcheck source=_profile-check.sh
|
|
9
9
|
source "$(dirname "$0")/_profile-check.sh"
|
|
10
|
+
# shellcheck source=_session-paths.sh
|
|
11
|
+
source "$(dirname "$0")/_session-paths.sh"
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
HANDOFF_FILE="$STATE_DIR/session-end.md"
|
|
13
|
+
SESSION_FILE="$SESSION_CONTEXT_FILE"
|
|
14
|
+
HANDOFF_FILE="$SESSION_END_FILE"
|
|
14
15
|
STAMP="$(date -u +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date)"
|
|
15
16
|
|
|
16
|
-
mkdir -p "$
|
|
17
|
+
mkdir -p "$SESSION_DIR"
|
|
17
18
|
|
|
18
19
|
{
|
|
19
20
|
echo "# Session End Snapshot"
|
|
@@ -28,9 +29,9 @@ mkdir -p "$STATE_DIR"
|
|
|
28
29
|
} > "$HANDOFF_FILE"
|
|
29
30
|
|
|
30
31
|
if [ -f "$SESSION_FILE" ]; then
|
|
31
|
-
echo "SessionEnd: wrote
|
|
32
|
+
echo "SessionEnd: wrote $HANDOFF_FILE and preserved existing session-context for the next session."
|
|
32
33
|
else
|
|
33
|
-
echo "SessionEnd: wrote .
|
|
34
|
+
echo "SessionEnd: wrote $HANDOFF_FILE. Consider persisting open tasks in the session-context file before ending long workstreams."
|
|
34
35
|
fi
|
|
35
36
|
|
|
36
37
|
exit 0
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
# shellcheck source=_locate-toolkit.sh
|
|
8
8
|
source "$(dirname "$0")/_locate-toolkit.sh"
|
|
9
|
+
# shellcheck source=_session-paths.sh
|
|
10
|
+
source "$(dirname "$0")/_session-paths.sh"
|
|
9
11
|
|
|
10
12
|
emit_context() {
|
|
11
13
|
[ "${AI_TOOLKIT_HOOK_QUIET:-0}" = "1" ] && return 0
|
|
@@ -51,7 +53,7 @@ if [ -n "$VERSION_MSG" ]; then
|
|
|
51
53
|
fi
|
|
52
54
|
|
|
53
55
|
# 3. Load session context (if available)
|
|
54
|
-
SESSION_FILE="
|
|
56
|
+
SESSION_FILE="$SESSION_CONTEXT_FILE"
|
|
55
57
|
if [ -f "$SESSION_FILE" ] && [ "${AI_TOOLKIT_HOOK_QUIET:-0}" != "1" ] && [ "${AI_TOOLKIT_HOOK_VERBOSE:-0}" = "1" ]; then
|
|
56
58
|
printf '%s\n' "=== Session Context ==="
|
|
57
59
|
cat "$SESSION_FILE"
|
package/app/hooks.json
CHANGED
|
@@ -20,16 +20,6 @@
|
|
|
20
20
|
"command": "\"$HOME/.softspark/ai-toolkit/hooks/mcp-health.sh\""
|
|
21
21
|
}
|
|
22
22
|
]
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"_source": "ai-toolkit",
|
|
26
|
-
"matcher": "startup|compact",
|
|
27
|
-
"hooks": [
|
|
28
|
-
{
|
|
29
|
-
"type": "command",
|
|
30
|
-
"command": "\"$HOME/.softspark/ai-toolkit/hooks/session-context.sh\""
|
|
31
|
-
}
|
|
32
|
-
]
|
|
33
23
|
}
|
|
34
24
|
],
|
|
35
25
|
"Notification": [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"last_run": "2026-06-
|
|
2
|
+
"last_run": "2026-06-23T07:06:46Z",
|
|
3
3
|
"schema_version": 1,
|
|
4
4
|
"tools": {
|
|
5
5
|
"aider": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"augment": {
|
|
27
|
-
"docs_hash": "
|
|
27
|
+
"docs_hash": "a0c51061febc16c4",
|
|
28
28
|
"headings": [
|
|
29
29
|
"Admin",
|
|
30
30
|
"Auggie CLI",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
"claude-code": {
|
|
69
|
-
"docs_hash": "
|
|
69
|
+
"docs_hash": "c20e5688ed230a66",
|
|
70
70
|
"headings": [
|
|
71
71
|
"Core concepts",
|
|
72
72
|
"Documentation Index",
|
|
@@ -122,10 +122,10 @@
|
|
|
122
122
|
"slash command": true,
|
|
123
123
|
"sub-agent": true
|
|
124
124
|
},
|
|
125
|
-
"version": "2.1.
|
|
125
|
+
"version": "2.1.186 (Claude Code)"
|
|
126
126
|
},
|
|
127
127
|
"cline": {
|
|
128
|
-
"docs_hash": "
|
|
128
|
+
"docs_hash": "858fa542e2aacde5",
|
|
129
129
|
"headings": [
|
|
130
130
|
"API Reference",
|
|
131
131
|
"Best Practices",
|
|
@@ -168,7 +168,7 @@
|
|
|
168
168
|
}
|
|
169
169
|
},
|
|
170
170
|
"codex-cli": {
|
|
171
|
-
"docs_hash": "
|
|
171
|
+
"docs_hash": "eeb0e17a839b09bd",
|
|
172
172
|
"headings": [
|
|
173
173
|
"API",
|
|
174
174
|
"API Reference",
|
|
@@ -235,10 +235,10 @@
|
|
|
235
235
|
"mcp_servers": false,
|
|
236
236
|
"sandbox": true
|
|
237
237
|
},
|
|
238
|
-
"version": "codex-cli 0.
|
|
238
|
+
"version": "codex-cli 0.142.0"
|
|
239
239
|
},
|
|
240
240
|
"cursor": {
|
|
241
|
-
"docs_hash": "
|
|
241
|
+
"docs_hash": "86b6d48e8ab40d90",
|
|
242
242
|
"headings": [],
|
|
243
243
|
"markers": {
|
|
244
244
|
".cursor/rules": false,
|
|
@@ -254,7 +254,7 @@
|
|
|
254
254
|
}
|
|
255
255
|
},
|
|
256
256
|
"gemini-cli": {
|
|
257
|
-
"docs_hash": "
|
|
257
|
+
"docs_hash": "c3ba6d09d810f9c3",
|
|
258
258
|
"headings": [
|
|
259
259
|
"Breadcrumbs",
|
|
260
260
|
"Directory actions",
|
|
@@ -296,7 +296,7 @@
|
|
|
296
296
|
}
|
|
297
297
|
},
|
|
298
298
|
"github-copilot": {
|
|
299
|
-
"docs_hash": "
|
|
299
|
+
"docs_hash": "df7c22e121dbb3d1",
|
|
300
300
|
"headings": [
|
|
301
301
|
"About Copilot auto model selection",
|
|
302
302
|
"About Copilot automations",
|
|
@@ -317,6 +317,7 @@
|
|
|
317
317
|
"Still need help?"
|
|
318
318
|
],
|
|
319
319
|
"markers": {
|
|
320
|
+
"AGENTS.md": false,
|
|
320
321
|
"Copilot Chat": true,
|
|
321
322
|
"Copilot Workspace": false,
|
|
322
323
|
"Copilot cloud agent": true,
|
|
@@ -329,7 +330,7 @@
|
|
|
329
330
|
}
|
|
330
331
|
},
|
|
331
332
|
"google-antigravity": {
|
|
332
|
-
"docs_hash": "
|
|
333
|
+
"docs_hash": "e6c90b9d937dd9f0",
|
|
333
334
|
"headings": [],
|
|
334
335
|
"markers": {
|
|
335
336
|
"AGENTS.md": false,
|
|
@@ -346,7 +347,7 @@
|
|
|
346
347
|
}
|
|
347
348
|
},
|
|
348
349
|
"opencode": {
|
|
349
|
-
"docs_hash": "
|
|
350
|
+
"docs_hash": "302de3ac69940747",
|
|
350
351
|
"headings": [
|
|
351
352
|
"Add features",
|
|
352
353
|
"Ask questions",
|
|
@@ -406,8 +407,9 @@
|
|
|
406
407
|
}
|
|
407
408
|
},
|
|
408
409
|
"windsurf": {
|
|
409
|
-
"docs_hash": "
|
|
410
|
+
"docs_hash": "cdd657d4d684c68a",
|
|
410
411
|
"headings": [
|
|
412
|
+
"Accounts",
|
|
411
413
|
"Advanced",
|
|
412
414
|
"Agent Command Center",
|
|
413
415
|
"App Deploys",
|
|
@@ -420,15 +422,15 @@
|
|
|
420
422
|
"On this page",
|
|
421
423
|
"Recommended Plugins",
|
|
422
424
|
"Releases",
|
|
425
|
+
"Security",
|
|
423
426
|
"Terminal",
|
|
424
427
|
"Usage",
|
|
425
428
|
"Welcome to Devin Desktop",
|
|
426
429
|
"Windsurf Plugins",
|
|
427
430
|
"Workflows",
|
|
428
|
-
"\u200b1. Select
|
|
429
|
-
"\u200b2.
|
|
430
|
-
"\u200b3.
|
|
431
|
-
"\u200b4. Let\u2019s Surf!",
|
|
431
|
+
"\u200b1. Select your preferred theme",
|
|
432
|
+
"\u200b2. Log In / Sign Up",
|
|
433
|
+
"\u200b3. Start Building with Devin!",
|
|
432
434
|
"\u200bCustom App Icons (beta)",
|
|
433
435
|
"\u200bDevin Desktop Next",
|
|
434
436
|
"\u200bForgot to Import VS Code Configurations?",
|
|
@@ -436,8 +438,7 @@
|
|
|
436
438
|
"\u200bOnboarding",
|
|
437
439
|
"\u200bSet Up",
|
|
438
440
|
"\u200bThings to Try",
|
|
439
|
-
"\u200bUninstall Devin Desktop"
|
|
440
|
-
"\u200bUpdate Devin Desktop"
|
|
441
|
+
"\u200bUninstall Devin Desktop"
|
|
441
442
|
],
|
|
442
443
|
"markers": {
|
|
443
444
|
"AGENTS.md": true,
|
|
@@ -54,7 +54,7 @@ ai-toolkit/
|
|
|
54
54
|
generate_agents_md.py # Regenerates AGENTS.md
|
|
55
55
|
generate_cursor_rules.py # Generates .cursorrules (sources _common.py)
|
|
56
56
|
generate_windsurf.py # Generates .windsurfrules (sources _common.py)
|
|
57
|
-
generate_copilot.py # Generates .github
|
|
57
|
+
generate_copilot.py # Generates Copilot .github/* surfaces; install also injects AGENTS.md
|
|
58
58
|
generate_gemini.py # Generates GEMINI.md (sources _common.py)
|
|
59
59
|
generate_cline.py # Generates .clinerules (sources _common.py)
|
|
60
60
|
generate_roo_modes.py # Generates .roomodes
|
|
@@ -109,7 +109,7 @@ Machine (global) Project (local)
|
|
|
109
109
|
- `--editors cursor,aider` — install only selected editors
|
|
110
110
|
- (no flag) — auto-detect from existing project files; `update --local` picks up whatever editors already have configs
|
|
111
111
|
|
|
112
|
-
Each editor gets directory-based format (`.cursor/rules/*.mdc`, `.devin/rules/*.md` + `.windsurf/rules/*.md` (dual-emit since the Devin Desktop rebrand), `.clinerules/*.md`, `.roo/rules/*.md`, `.augment/rules/ai-toolkit-*.md`, `.agents/rules/*.md`, `CONVENTIONS.md`). Full-profile installs also emit native skill pointer catalogues for Cursor, Windsurf, and Cline. Codex local install additionally generates `AGENTS.md` (universal coding rules inlined — Codex reads only AGENTS.md, not `.agents/rules/`), `.agents/skills/*`, and `.codex/hooks.json`. Hooks are global-only — not merged into project settings except for editor-native local hook files such as Codex `.codex/hooks.json`. Experimental plugin packs can also layer a global Codex target in `HOME` (`~/AGENTS.md`, `~/.agents/`, `~/.codex/hooks.json`) when installed with `ai-toolkit plugin install --editor codex`.
|
|
112
|
+
Each editor gets directory-based format (`.cursor/rules/*.mdc`, `.devin/rules/*.md` + `.windsurf/rules/*.md` (dual-emit since the Devin Desktop rebrand), `.github/instructions/*.instructions.md` + `.github/prompts/*.prompt.md` + root `AGENTS.md` for Copilot agent instructions, `.clinerules/*.md`, `.roo/rules/*.md`, `.augment/rules/ai-toolkit-*.md`, `.agents/rules/*.md`, `CONVENTIONS.md`). Full-profile installs also emit native skill pointer catalogues for Cursor, Windsurf, and Cline. Codex local install additionally generates `AGENTS.md` (universal coding rules inlined — Codex reads only AGENTS.md, not `.agents/rules/`), `.agents/skills/*`, and `.codex/hooks.json`. Hooks are global-only — not merged into project settings except for editor-native local hook files such as Codex `.codex/hooks.json`. Experimental plugin packs can also layer a global Codex target in `HOME` (`~/AGENTS.md`, `~/.agents/`, `~/.codex/hooks.json`) when installed with `ai-toolkit plugin install --editor codex`.
|
|
113
113
|
|
|
114
114
|
If a project already has `.mcp.json`, local install mirrors its `mcpServers` entries into `.claude/settings.local.json` plus any selected editors with project-scoped native MCP files (`.cursor/mcp.json`, `.github/mcp.json`).
|
|
115
115
|
|
|
@@ -269,7 +269,6 @@ Agents (code-reviewer, debugger, devops-implementer, ...)
|
|
|
269
269
|
|------|---------|--------|--------|
|
|
270
270
|
| SessionStart | Session start + compact | `session-start.sh` | MANDATORY rules reminder + session context + instincts |
|
|
271
271
|
| SessionStart | Session start | `mcp-health.sh` | Check MCP runtime availability |
|
|
272
|
-
| SessionStart | Session start | `session-context.sh` | Capture environment snapshot |
|
|
273
272
|
| Notification | Claude waiting for input | *(inline)* | macOS desktop notification |
|
|
274
273
|
| PreToolUse | Before Bash | `guard-destructive.sh` | Block destructive commands |
|
|
275
274
|
| PreToolUse | Before file ops (Bash, Read, Edit, Write, MultiEdit, Glob, Grep, NotebookEdit, mcp\_filesystem) | `guard-path.sh` | Block wrong-user path hallucination |
|
|
@@ -116,16 +116,22 @@ by default because Codex currently renders `additionalContext` as visible hook
|
|
|
116
116
|
context in the TUI. This keeps prompt-submit output quiet while preserving hook
|
|
117
117
|
side effects and blocking decisions such as search-first Stop enforcement.
|
|
118
118
|
|
|
119
|
-
Codex
|
|
120
|
-
|
|
119
|
+
Codex hooks must not force Claude-only JSON output fields such as
|
|
120
|
+
`suppressOutput`. In particular, advisory `PostToolUse` hooks like
|
|
121
|
+
`loop-guard.sh` run in quiet/plain mode under Codex; they keep side effects but
|
|
122
|
+
do not emit hidden Claude-style context unless a future Codex runtime explicitly
|
|
123
|
+
supports that schema.
|
|
124
|
+
|
|
125
|
+
If a future Codex runtime enables JSON context output for `UserPromptSubmit`,
|
|
126
|
+
the output must be event-specific and include the event name alongside the
|
|
127
|
+
context:
|
|
121
128
|
|
|
122
129
|
```json
|
|
123
130
|
{
|
|
124
131
|
"hookSpecificOutput": {
|
|
125
132
|
"hookEventName": "UserPromptSubmit",
|
|
126
133
|
"additionalContext": "..."
|
|
127
|
-
}
|
|
128
|
-
"suppressOutput": true
|
|
134
|
+
}
|
|
129
135
|
}
|
|
130
136
|
```
|
|
131
137
|
|
|
@@ -47,13 +47,21 @@ ai-toolkit update # re-copies scripts, re-merges (idempotent)
|
|
|
47
47
|
**Actions:**
|
|
48
48
|
1. Injects MANDATORY reminder to follow CLAUDE.md rules
|
|
49
49
|
2. Injects REMINDER about tests and documentation
|
|
50
|
-
3. Loads session context from
|
|
50
|
+
3. Loads session context from the per-repo session store (if exists)
|
|
51
51
|
4. Loads active instincts from `.claude/instincts/*.md` (if any)
|
|
52
52
|
|
|
53
53
|
By default the hook performs session-state reset, stale search-flag cleanup, and
|
|
54
54
|
update notification side effects without printing informational stdout. Set
|
|
55
|
-
`AI_TOOLKIT_HOOK_VERBOSE=1` to print the startup reminders and loaded context
|
|
56
|
-
|
|
55
|
+
`AI_TOOLKIT_HOOK_VERBOSE=1` to print the startup reminders and loaded context for
|
|
56
|
+
debugging; `AI_TOOLKIT_HOOK_QUIET=1` keeps it silent explicitly.
|
|
57
|
+
|
|
58
|
+
> **Session storage:** auto-generated session artifacts (context, handoff note,
|
|
59
|
+
> checkpoints, decisions) are stored **outside the project repo** under
|
|
60
|
+
> `~/.softspark/ai-toolkit/sessions/<repo-key>/`, where `<repo-key>` is the git
|
|
61
|
+
> work-tree root path (fallback: cwd) with `/` replaced by `-` (mirrors Claude
|
|
62
|
+
> Code's own `~/.claude/projects/` convention). This keeps generated files from
|
|
63
|
+
> piling up in every project's `.claude/` directory. Path resolution lives in the
|
|
64
|
+
> shared helper `app/hooks/_session-paths.sh`.
|
|
57
65
|
|
|
58
66
|
### Notification — `notify-waiting.sh`
|
|
59
67
|
|
|
@@ -192,10 +200,10 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
192
200
|
| Script | `~/.softspark/ai-toolkit/hooks/save-session.sh` |
|
|
193
201
|
| Fires | After every Claude response |
|
|
194
202
|
|
|
195
|
-
**Action:** Writes enriched session context to
|
|
203
|
+
**Action:** Writes enriched session context to the per-repo session store (`~/.softspark/ai-toolkit/sessions/<repo-key>/session-context.md`) for cross-session persistence. Captures:
|
|
196
204
|
- Session ID and last assistant message (first 5 lines)
|
|
197
205
|
- Git branch, uncommitted change count, and diff stat (last 5 lines)
|
|
198
|
-
- Agent-written checkpoints from
|
|
206
|
+
- Agent-written checkpoints from `session-context.md.checkpoints` in the same store (if present — written by proactive checkpointing per Constitution Art. I §5)
|
|
199
207
|
|
|
200
208
|
Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
201
209
|
|
|
@@ -263,9 +271,9 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
263
271
|
**Actions (prioritized — higher priority items survive tighter token budgets):**
|
|
264
272
|
1. **Mandatory reload reminder** — always emitted, instructs Claude to re-read CLAUDE.md and active tasks
|
|
265
273
|
2. **Active instincts** — lists each instinct with confidence score and pattern name from `.claude/instincts/*.md`
|
|
266
|
-
3. **Session context** — preserves task state from
|
|
274
|
+
3. **Session context** — preserves task state from the per-repo session store (if exists)
|
|
267
275
|
4. **Git working state** — branch name, uncommitted change count, last commit (if inside a git repo)
|
|
268
|
-
5. **Key decisions** — last 10 lines from
|
|
276
|
+
5. **Key decisions** — last 10 lines from `decisions.md` in the per-repo session store (if exists)
|
|
269
277
|
|
|
270
278
|
Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
271
279
|
|
|
@@ -278,7 +286,7 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
278
286
|
| Script | `~/.softspark/ai-toolkit/hooks/session-end.sh` |
|
|
279
287
|
| Fires | When a Claude session ends |
|
|
280
288
|
|
|
281
|
-
**Action:** Writes
|
|
289
|
+
**Action:** Writes `session-end.md` to the per-repo session store (`~/.softspark/ai-toolkit/sessions/<repo-key>/`) with a lightweight handoff note for the next session and reminds the next session to review preserved context.
|
|
282
290
|
|
|
283
291
|
Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
284
292
|
|
|
@@ -351,17 +359,6 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
351
359
|
|
|
352
360
|
**Action:** Non-blocking (always exits 0). Inspects Bash commands containing `git commit`. Extracts the commit message from the `-m` flag and checks it against Conventional Commits format (`type: description`, where type is one of feat/fix/docs/refactor/test/chore/ci/perf/style/revert). Emits an advisory warning if the message does not match — the commit is not blocked, only nudged. Commands without `git commit` or without a `-m` message (e.g. interactive commits) are ignored.
|
|
353
361
|
|
|
354
|
-
### SessionStart — `session-context.sh`
|
|
355
|
-
|
|
356
|
-
| Field | Value |
|
|
357
|
-
|-------|-------|
|
|
358
|
-
| Event | `SessionStart` |
|
|
359
|
-
| Matcher | *(all)* |
|
|
360
|
-
| Script | `~/.softspark/ai-toolkit/hooks/session-context.sh` |
|
|
361
|
-
| Fires | Session start |
|
|
362
|
-
|
|
363
|
-
**Action:** Captures an environment snapshot to `~/.softspark/ai-toolkit/sessions/current-context.json`. Records working directory, git branch, git status summary, Node.js version, Python version, and timestamp. Used by other hooks and tools to access session metadata without re-running discovery commands. Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
364
|
-
|
|
365
362
|
---
|
|
366
363
|
|
|
367
364
|
## New Hooks (Constitution Art. VI Enforcement)
|
|
@@ -520,8 +517,8 @@ commands explicitly silent, and Codex-generated hooks plus Claude's bundled
|
|
|
520
517
|
├── _locate-toolkit.sh # NEW: shared $TOOLKIT_DIR locator
|
|
521
518
|
├── _hook-io.sh # NEW: shared multi-editor payload/output adapter
|
|
522
519
|
├── _search-capability.sh # NEW: capability-aware search-first enforcement
|
|
520
|
+
├── _session-paths.sh # NEW: per-repo session storage path resolver
|
|
523
521
|
├── session-start.sh
|
|
524
|
-
├── session-context.sh
|
|
525
522
|
├── guard-destructive.sh
|
|
526
523
|
├── guard-path.sh
|
|
527
524
|
├── guard-config.sh
|
|
@@ -549,7 +546,7 @@ commands explicitly silent, and Codex-generated hooks plus Claude's bundled
|
|
|
549
546
|
|
|
550
547
|
~/.claude/settings.json
|
|
551
548
|
└── hooks: # Hook definitions referencing ~/.softspark/ai-toolkit/hooks/
|
|
552
|
-
├── SessionStart → session-start.sh, mcp-health.sh
|
|
549
|
+
├── SessionStart → session-start.sh, mcp-health.sh
|
|
553
550
|
├── Notification → notify-waiting.sh
|
|
554
551
|
├── PreToolUse → guard-destructive.sh, guard-path.sh, guard-config.sh, commit-quality.sh, revert-guard.sh
|
|
555
552
|
├── UserPromptSubmit → user-prompt-submit.sh, track-usage.sh
|
|
@@ -590,7 +587,7 @@ Windsurf rebranded to Devin Desktop (2026-06-02); the Cascade agent — and its
|
|
|
590
587
|
Devin CLI uses a **Claude-compatible** hook format (docs.devin.ai/cli/extensibility/hooks). Key facts driving the generator:
|
|
591
588
|
|
|
592
589
|
- **Standalone file shape:** in `.devin/hooks.v1.json` the entire file IS the hooks object — no top-level `"hooks"` wrapper key (unlike `.claude/settings.json`).
|
|
593
|
-
- **Events:** Claude-style PascalCase — `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `Stop
|
|
590
|
+
- **Events:** Claude-style PascalCase — `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `Stop`. `post_cascade_response` maps to `Stop` (which carries no response text on stdin).
|
|
594
591
|
- **Matchers:** regex against the Devin **tool name** (`read`, `edit`, `exec`, `grep`, `glob`, `mcp__<server>__<tool>`) — NOT Claude's `Bash`/`Edit`, so the shared guards reliably fire.
|
|
595
592
|
- **Block contract:** the guard scripts emit `{"decision":"block","reason":...}` on stdout (plain mode) AND exit 2 — Devin honors both. Hooks run **without** `AI_TOOLKIT_HOOK_FORMAT=json` because Devin expects the flat `{"decision","reason"}` shape, not Claude's `hookSpecificOutput` envelope.
|
|
596
593
|
- **Stdin payload:** flat `{ "hook_event_name", "tool_name", "tool_input" }` — already handled by `_hook-io.sh` via its `.tool_name` / `.tool_input.*` branches, so no normalizer change was needed.
|
|
@@ -79,7 +79,7 @@ Each command file carries the prompt in its markdown body (built from the SKILL.
|
|
|
79
79
|
|
|
80
80
|
| opencode event | Bash hook(s) |
|
|
81
81
|
|----------------------------|--------------------------------------------------------------------|
|
|
82
|
-
| `session.created` | `session-start.sh` + `
|
|
82
|
+
| `session.created` | `session-start.sh` + `mcp-health.sh` |
|
|
83
83
|
| `session.compacted` | `pre-compact.sh` + `pre-compact-save.sh` (PreCompact equivalent) |
|
|
84
84
|
| `session.deleted` | `session-end.sh` + `save-session.sh` |
|
|
85
85
|
| `message.updated` | `user-prompt-submit.sh` + `track-usage.sh` |
|
|
@@ -3,9 +3,9 @@ title: "Supported Tools Registry"
|
|
|
3
3
|
category: reference
|
|
4
4
|
service: ai-toolkit
|
|
5
5
|
tags: [editors, platforms, generators, integration, ecosystem]
|
|
6
|
-
version: "1.
|
|
6
|
+
version: "1.7.0"
|
|
7
7
|
created: "2026-04-23"
|
|
8
|
-
last_updated: "2026-06-
|
|
8
|
+
last_updated: "2026-06-23"
|
|
9
9
|
description: "Human-readable view of scripts/ecosystem_tools.json — the canonical list of tools ai-toolkit integrates with (Claude Code + 11 editors), their documentation URLs, config paths, our generators, and tracked capability markers."
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -28,7 +28,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
28
28
|
| ID | `claude-code` |
|
|
29
29
|
| Docs | https://code.claude.com/docs (platform.claude.com/docs 307-redirects here) |
|
|
30
30
|
| Release notes | https://github.com/anthropics/claude-code/releases |
|
|
31
|
-
| Changelog | https://code.claude.com/docs/en/changelog (lists current 2.1.
|
|
31
|
+
| Changelog | https://code.claude.com/docs/en/changelog (lists current 2.1.186) |
|
|
32
32
|
| Config paths | `~/.claude/settings.json`, `.claude/settings.json` (project, committed), `.claude/settings.local.json`, `CLAUDE.md`, `.claude/rules/*.md`, `.claude/agents/*.md`, `.claude/skills/*/SKILL.md`, `~/.claude/themes/*.json` (v2.1.118+) |
|
|
33
33
|
| Our generators | — (Claude Code is the primary target; toolkit content ships directly as `.md` files and `settings.json` merges) |
|
|
34
34
|
| Tracked hook events | Core: `SessionStart`, `SessionEnd`, `UserPromptSubmit`, `Notification`, `MessageDisplay`. Tool: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PostToolBatch`. Turn: `Stop`, `StopFailure`, `UserPromptExpansion`. Subagent: `SubagentStart`, `SubagentStop`. Compaction: `PreCompact`, `PostCompact`. Permissions: `PermissionRequest`, `PermissionDenied`. Elicitation: `Elicitation`, `ElicitationResult`. Teams: `TaskCreated`, `TaskCompleted`, `TeammateIdle`. Worktrees/env: `WorktreeCreate`, `WorktreeRemove`, `CwdChanged`, `FileChanged`, `ConfigChange`. Setup: `Setup`, `InstructionsLoaded` |
|
|
@@ -79,8 +79,8 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
79
79
|
| Release notes | https://github.blog/changelog/label/copilot/ |
|
|
80
80
|
| Config paths | `.github/copilot-instructions.md`, `.github/instructions/*.instructions.md`, `.github/prompts/*.prompt.md`, `AGENTS.md` |
|
|
81
81
|
| Our generators | `scripts/generate_copilot.py` |
|
|
82
|
-
| Tracked capabilities | `copilot-instructions.md`, Copilot Chat, Copilot Workspace, Copilot cloud agent, `applyTo`, custom agents, prompt files, `instructions.md`, MCP |
|
|
83
|
-
| Tier notes | Custom agents (`.github/agents/*.agent.md`) and repo-level MCP config are Pro/Pro+/Business/Enterprise only and intentionally not integrated (class C per ecosystem-sync SOP). |
|
|
82
|
+
| Tracked capabilities | `copilot-instructions.md`, Copilot Chat, Copilot Workspace, Copilot cloud agent, `applyTo`, custom agents, prompt files, `instructions.md`, `AGENTS.md`, MCP |
|
|
83
|
+
| Tier notes | Custom agents (`.github/agents/*.agent.md`) and repo-level MCP config are Pro/Pro+/Business/Enterprise only and intentionally not integrated (class C per ecosystem-sync SOP). Copilot code review reads the nearest `AGENTS.md` automatically since the 2026-06-18 GA (all tiers); `ai-toolkit install --local --editors copilot` injects a `TOOLKIT:copilot-agents` section generated from `generate_agents_md.py` without clobbering Codex/opencode sections in the same file. The 4000-char cap on `copilot-instructions.md` / `*.instructions.md` was also removed (2026-06-12). |
|
|
84
84
|
|
|
85
85
|
### Gemini CLI
|
|
86
86
|
|
|
@@ -93,7 +93,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
93
93
|
| Our generators | `scripts/generate_gemini.py`, `scripts/generate_gemini_hooks.py` (profile>=standard), `scripts/generate_gemini_commands.py` (profile=full), `scripts/generate_gemini_skills.py` (profile=full) |
|
|
94
94
|
| Tracked capabilities | `GEMINI.md`, `mcpServers`, tools, `settings.json`, `BeforeTool`, `AfterTool`, `BeforeToolSelection`, `BeforeAgent`, `AfterAgent`, `BeforeModel`, `AfterModel`, `Notification`, `PreCompress`, `SessionStart`, `SessionEnd`, `SKILL.md`, `activate_skill`, custom commands, `gemini-extension.json` (no native `Stop` event — generator maps Stop-equivalent to `AfterAgent`; 11 documented hook events total) |
|
|
95
95
|
| Version probe | `gemini --version` |
|
|
96
|
-
| Latest upstream | v0.
|
|
96
|
+
| Latest upstream | v0.47.0 (2026-06-18). NOTE: Gemini CLI dropped free/paid individual tiers on 2026-06-18 in favor of Antigravity CLI (we ship `generate_antigravity.py`); enterprise Code Assist and paid API keys keep Gemini CLI, so the integration stays. The 11 hook events are unchanged. v0.48 preview migrates the `coreTools` setting to `tools.core` (a tool-allowlist key we do not emit, so no generator change). |
|
|
97
97
|
|
|
98
98
|
### Cline
|
|
99
99
|
|
|
@@ -165,12 +165,12 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
165
165
|
| Field | Value |
|
|
166
166
|
|-------|-------|
|
|
167
167
|
| ID | `codex-cli` |
|
|
168
|
-
| Docs | https://developers.openai.com/codex (live docs site; config pages split into `/codex/config-basic`, `/codex/config-reference`, `/codex/config-advanced` plus `/codex/hooks`, `/codex/skills`; latest stable codex-cli 0.
|
|
168
|
+
| Docs | https://developers.openai.com/codex (live docs site; config pages split into `/codex/config-basic`, `/codex/config-reference`, `/codex/config-advanced` plus `/codex/hooks`, `/codex/skills`; latest stable codex-cli 0.142.0, 2026-06) |
|
|
169
169
|
| Release notes | https://github.com/openai/codex/releases |
|
|
170
170
|
| Config paths | `AGENTS.md`, `.agents/skills/*/SKILL.md`, `.codex/hooks.json`, `.codex/config.toml` (project layers, root→cwd, closest wins, trusted projects only), `~/.codex/config.toml` |
|
|
171
171
|
| Our generators | `scripts/generate_codex.py`, `scripts/generate_codex_hooks.py`, `scripts/generate_codex_skills.py` (opt-in via `--codex-skills`) |
|
|
172
172
|
| Rules delivery | Universal coding rules are inlined into `AGENTS.md` (Codex reads instructions only from AGENTS.md, not `.agents/rules/`); language rules ship as `<lang>-rules` skills under `.agents/skills/`. |
|
|
173
|
-
| Tracked hook events | Upstream canonical (codex-rs `HookEventName` enum): `PreToolUse`, `PostToolUse`, `PermissionRequest`, `PreCompact`, `PostCompact`, `SessionStart`, `UserPromptSubmit`, `SubagentStart`, `SubagentStop`, `Stop` (10 events). We wire
|
|
173
|
+
| Tracked hook events | Upstream canonical (codex-rs `HookEventName` enum): `PreToolUse`, `PostToolUse`, `PermissionRequest`, `PreCompact`, `PostCompact`, `SessionStart`, `UserPromptSubmit`, `SubagentStart`, `SubagentStop`, `Stop` (10 events). We wire 9 of these to shared toolkit hook scripts, mirroring the Claude Code mapping in `app/hooks.json`. `PostCompact` is not wired (its only hook was the removed environment-snapshot probe). |
|
|
174
174
|
| Tracked handler types | `command` (emitted by default); `prompt` and `agent` available upstream but authored by hand |
|
|
175
175
|
| Other capabilities | `AGENTS.md`, `config.toml`, `mcp_servers`, sandbox policies, `.agents/skills/*/SKILL.md` (native Codex skill discovery path) |
|
|
176
176
|
| Version probe | `codex --version` |
|
|
@@ -187,7 +187,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
187
187
|
| Tracked plugin events | `session.created`, `session.compacted`, `session.deleted`, `message.updated`, `tool.execute.before`, `tool.execute.after`, `permission.asked`, `command.executed` |
|
|
188
188
|
| Other capabilities | `opencode.json` config, primary + subagent modes, `@`-mention subagents, `/`-invocation commands, MCP (local + remote), plugin hooks in JS/TS, native `SKILL.md` discovery with Claude-compatible fallback, `permission.skill.*` matrix |
|
|
189
189
|
| Version probe | `opencode --version` |
|
|
190
|
-
| Watch item | v1.16.0 (2026-06-05)
|
|
190
|
+
| Watch item | v1.16.0 (2026-06-05) shipped an experimental v2 skill registry (flat-file skills, `slash` frontmatter key). As of the 2026-06-23 sync (upstream v1.17.9) it is still undocumented and not stabilized: the skills docs show only the nested `SKILL.md` layout with no `slash` key, so `generate_opencode*.py` is unchanged. Re-check next sync. |
|
|
191
191
|
|
|
192
192
|
---
|
|
193
193
|
|
|
@@ -27,7 +27,6 @@ Hook logic lives in `app/hooks/*.sh` — not inline JSON one-liners. Scripts are
|
|
|
27
27
|
|-------|--------|--------|
|
|
28
28
|
| SessionStart | `session-start.sh` | MANDATORY rules reminder + session context + instincts + reset session-edit state |
|
|
29
29
|
| SessionStart | `mcp-health.sh` | Check MCP server command availability (non-blocking warning) |
|
|
30
|
-
| SessionStart | `session-context.sh` | Capture environment snapshot to `~/.softspark/ai-toolkit/sessions/current-context.json` |
|
|
31
30
|
| Notification | `notify-waiting.sh` | Cross-platform desktop notification |
|
|
32
31
|
| PreToolUse | `guard-destructive.sh` | Block `rm -rf`, `DROP TABLE`, etc. |
|
|
33
32
|
| PreToolUse | `guard-path.sh` | Block wrong-user path hallucination |
|
package/llms-full.txt
CHANGED
|
@@ -6286,7 +6286,7 @@ ai-toolkit/
|
|
|
6286
6286
|
generate_agents_md.py # Regenerates AGENTS.md
|
|
6287
6287
|
generate_cursor_rules.py # Generates .cursorrules (sources _common.py)
|
|
6288
6288
|
generate_windsurf.py # Generates .windsurfrules (sources _common.py)
|
|
6289
|
-
generate_copilot.py # Generates .github
|
|
6289
|
+
generate_copilot.py # Generates Copilot .github/* surfaces; install also injects AGENTS.md
|
|
6290
6290
|
generate_gemini.py # Generates GEMINI.md (sources _common.py)
|
|
6291
6291
|
generate_cline.py # Generates .clinerules (sources _common.py)
|
|
6292
6292
|
generate_roo_modes.py # Generates .roomodes
|
|
@@ -6341,7 +6341,7 @@ Machine (global) Project (local)
|
|
|
6341
6341
|
- `--editors cursor,aider` — install only selected editors
|
|
6342
6342
|
- (no flag) — auto-detect from existing project files; `update --local` picks up whatever editors already have configs
|
|
6343
6343
|
|
|
6344
|
-
Each editor gets directory-based format (`.cursor/rules/*.mdc`, `.devin/rules/*.md` + `.windsurf/rules/*.md` (dual-emit since the Devin Desktop rebrand), `.clinerules/*.md`, `.roo/rules/*.md`, `.augment/rules/ai-toolkit-*.md`, `.agents/rules/*.md`, `CONVENTIONS.md`). Full-profile installs also emit native skill pointer catalogues for Cursor, Windsurf, and Cline. Codex local install additionally generates `AGENTS.md` (universal coding rules inlined — Codex reads only AGENTS.md, not `.agents/rules/`), `.agents/skills/*`, and `.codex/hooks.json`. Hooks are global-only — not merged into project settings except for editor-native local hook files such as Codex `.codex/hooks.json`. Experimental plugin packs can also layer a global Codex target in `HOME` (`~/AGENTS.md`, `~/.agents/`, `~/.codex/hooks.json`) when installed with `ai-toolkit plugin install --editor codex`.
|
|
6344
|
+
Each editor gets directory-based format (`.cursor/rules/*.mdc`, `.devin/rules/*.md` + `.windsurf/rules/*.md` (dual-emit since the Devin Desktop rebrand), `.github/instructions/*.instructions.md` + `.github/prompts/*.prompt.md` + root `AGENTS.md` for Copilot agent instructions, `.clinerules/*.md`, `.roo/rules/*.md`, `.augment/rules/ai-toolkit-*.md`, `.agents/rules/*.md`, `CONVENTIONS.md`). Full-profile installs also emit native skill pointer catalogues for Cursor, Windsurf, and Cline. Codex local install additionally generates `AGENTS.md` (universal coding rules inlined — Codex reads only AGENTS.md, not `.agents/rules/`), `.agents/skills/*`, and `.codex/hooks.json`. Hooks are global-only — not merged into project settings except for editor-native local hook files such as Codex `.codex/hooks.json`. Experimental plugin packs can also layer a global Codex target in `HOME` (`~/AGENTS.md`, `~/.agents/`, `~/.codex/hooks.json`) when installed with `ai-toolkit plugin install --editor codex`.
|
|
6345
6345
|
|
|
6346
6346
|
If a project already has `.mcp.json`, local install mirrors its `mcpServers` entries into `.claude/settings.local.json` plus any selected editors with project-scoped native MCP files (`.cursor/mcp.json`, `.github/mcp.json`).
|
|
6347
6347
|
|
|
@@ -6501,7 +6501,6 @@ Agents (code-reviewer, debugger, devops-implementer, ...)
|
|
|
6501
6501
|
|------|---------|--------|--------|
|
|
6502
6502
|
| SessionStart | Session start + compact | `session-start.sh` | MANDATORY rules reminder + session context + instincts |
|
|
6503
6503
|
| SessionStart | Session start | `mcp-health.sh` | Check MCP runtime availability |
|
|
6504
|
-
| SessionStart | Session start | `session-context.sh` | Capture environment snapshot |
|
|
6505
6504
|
| Notification | Claude waiting for input | *(inline)* | macOS desktop notification |
|
|
6506
6505
|
| PreToolUse | Before Bash | `guard-destructive.sh` | Block destructive commands |
|
|
6507
6506
|
| PreToolUse | Before file ops (Bash, Read, Edit, Write, MultiEdit, Glob, Grep, NotebookEdit, mcp\_filesystem) | `guard-path.sh` | Block wrong-user path hallucination |
|
|
@@ -7182,16 +7181,22 @@ by default because Codex currently renders `additionalContext` as visible hook
|
|
|
7182
7181
|
context in the TUI. This keeps prompt-submit output quiet while preserving hook
|
|
7183
7182
|
side effects and blocking decisions such as search-first Stop enforcement.
|
|
7184
7183
|
|
|
7185
|
-
Codex
|
|
7186
|
-
|
|
7184
|
+
Codex hooks must not force Claude-only JSON output fields such as
|
|
7185
|
+
`suppressOutput`. In particular, advisory `PostToolUse` hooks like
|
|
7186
|
+
`loop-guard.sh` run in quiet/plain mode under Codex; they keep side effects but
|
|
7187
|
+
do not emit hidden Claude-style context unless a future Codex runtime explicitly
|
|
7188
|
+
supports that schema.
|
|
7189
|
+
|
|
7190
|
+
If a future Codex runtime enables JSON context output for `UserPromptSubmit`,
|
|
7191
|
+
the output must be event-specific and include the event name alongside the
|
|
7192
|
+
context:
|
|
7187
7193
|
|
|
7188
7194
|
```json
|
|
7189
7195
|
{
|
|
7190
7196
|
"hookSpecificOutput": {
|
|
7191
7197
|
"hookEventName": "UserPromptSubmit",
|
|
7192
7198
|
"additionalContext": "..."
|
|
7193
|
-
}
|
|
7194
|
-
"suppressOutput": true
|
|
7199
|
+
}
|
|
7195
7200
|
}
|
|
7196
7201
|
```
|
|
7197
7202
|
|
|
@@ -9043,13 +9048,21 @@ ai-toolkit update # re-copies scripts, re-merges (idempotent)
|
|
|
9043
9048
|
**Actions:**
|
|
9044
9049
|
1. Injects MANDATORY reminder to follow CLAUDE.md rules
|
|
9045
9050
|
2. Injects REMINDER about tests and documentation
|
|
9046
|
-
3. Loads session context from
|
|
9051
|
+
3. Loads session context from the per-repo session store (if exists)
|
|
9047
9052
|
4. Loads active instincts from `.claude/instincts/*.md` (if any)
|
|
9048
9053
|
|
|
9049
9054
|
By default the hook performs session-state reset, stale search-flag cleanup, and
|
|
9050
9055
|
update notification side effects without printing informational stdout. Set
|
|
9051
|
-
`AI_TOOLKIT_HOOK_VERBOSE=1` to print the startup reminders and loaded context
|
|
9052
|
-
|
|
9056
|
+
`AI_TOOLKIT_HOOK_VERBOSE=1` to print the startup reminders and loaded context for
|
|
9057
|
+
debugging; `AI_TOOLKIT_HOOK_QUIET=1` keeps it silent explicitly.
|
|
9058
|
+
|
|
9059
|
+
> **Session storage:** auto-generated session artifacts (context, handoff note,
|
|
9060
|
+
> checkpoints, decisions) are stored **outside the project repo** under
|
|
9061
|
+
> `~/.softspark/ai-toolkit/sessions/<repo-key>/`, where `<repo-key>` is the git
|
|
9062
|
+
> work-tree root path (fallback: cwd) with `/` replaced by `-` (mirrors Claude
|
|
9063
|
+
> Code's own `~/.claude/projects/` convention). This keeps generated files from
|
|
9064
|
+
> piling up in every project's `.claude/` directory. Path resolution lives in the
|
|
9065
|
+
> shared helper `app/hooks/_session-paths.sh`.
|
|
9053
9066
|
|
|
9054
9067
|
### Notification — `notify-waiting.sh`
|
|
9055
9068
|
|
|
@@ -9188,10 +9201,10 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
9188
9201
|
| Script | `~/.softspark/ai-toolkit/hooks/save-session.sh` |
|
|
9189
9202
|
| Fires | After every Claude response |
|
|
9190
9203
|
|
|
9191
|
-
**Action:** Writes enriched session context to
|
|
9204
|
+
**Action:** Writes enriched session context to the per-repo session store (`~/.softspark/ai-toolkit/sessions/<repo-key>/session-context.md`) for cross-session persistence. Captures:
|
|
9192
9205
|
- Session ID and last assistant message (first 5 lines)
|
|
9193
9206
|
- Git branch, uncommitted change count, and diff stat (last 5 lines)
|
|
9194
|
-
- Agent-written checkpoints from
|
|
9207
|
+
- Agent-written checkpoints from `session-context.md.checkpoints` in the same store (if present — written by proactive checkpointing per Constitution Art. I §5)
|
|
9195
9208
|
|
|
9196
9209
|
Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
9197
9210
|
|
|
@@ -9259,9 +9272,9 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
9259
9272
|
**Actions (prioritized — higher priority items survive tighter token budgets):**
|
|
9260
9273
|
1. **Mandatory reload reminder** — always emitted, instructs Claude to re-read CLAUDE.md and active tasks
|
|
9261
9274
|
2. **Active instincts** — lists each instinct with confidence score and pattern name from `.claude/instincts/*.md`
|
|
9262
|
-
3. **Session context** — preserves task state from
|
|
9275
|
+
3. **Session context** — preserves task state from the per-repo session store (if exists)
|
|
9263
9276
|
4. **Git working state** — branch name, uncommitted change count, last commit (if inside a git repo)
|
|
9264
|
-
5. **Key decisions** — last 10 lines from
|
|
9277
|
+
5. **Key decisions** — last 10 lines from `decisions.md` in the per-repo session store (if exists)
|
|
9265
9278
|
|
|
9266
9279
|
Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
9267
9280
|
|
|
@@ -9274,7 +9287,7 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
9274
9287
|
| Script | `~/.softspark/ai-toolkit/hooks/session-end.sh` |
|
|
9275
9288
|
| Fires | When a Claude session ends |
|
|
9276
9289
|
|
|
9277
|
-
**Action:** Writes
|
|
9290
|
+
**Action:** Writes `session-end.md` to the per-repo session store (`~/.softspark/ai-toolkit/sessions/<repo-key>/`) with a lightweight handoff note for the next session and reminds the next session to review preserved context.
|
|
9278
9291
|
|
|
9279
9292
|
Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
9280
9293
|
|
|
@@ -9347,17 +9360,6 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
9347
9360
|
|
|
9348
9361
|
**Action:** Non-blocking (always exits 0). Inspects Bash commands containing `git commit`. Extracts the commit message from the `-m` flag and checks it against Conventional Commits format (`type: description`, where type is one of feat/fix/docs/refactor/test/chore/ci/perf/style/revert). Emits an advisory warning if the message does not match — the commit is not blocked, only nudged. Commands without `git commit` or without a `-m` message (e.g. interactive commits) are ignored.
|
|
9349
9362
|
|
|
9350
|
-
### SessionStart — `session-context.sh`
|
|
9351
|
-
|
|
9352
|
-
| Field | Value |
|
|
9353
|
-
|-------|-------|
|
|
9354
|
-
| Event | `SessionStart` |
|
|
9355
|
-
| Matcher | *(all)* |
|
|
9356
|
-
| Script | `~/.softspark/ai-toolkit/hooks/session-context.sh` |
|
|
9357
|
-
| Fires | Session start |
|
|
9358
|
-
|
|
9359
|
-
**Action:** Captures an environment snapshot to `~/.softspark/ai-toolkit/sessions/current-context.json`. Records working directory, git branch, git status summary, Node.js version, Python version, and timestamp. Used by other hooks and tools to access session metadata without re-running discovery commands. Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
9360
|
-
|
|
9361
9363
|
---
|
|
9362
9364
|
|
|
9363
9365
|
## New Hooks (Constitution Art. VI Enforcement)
|
|
@@ -9516,8 +9518,8 @@ commands explicitly silent, and Codex-generated hooks plus Claude's bundled
|
|
|
9516
9518
|
├── _locate-toolkit.sh # NEW: shared $TOOLKIT_DIR locator
|
|
9517
9519
|
├── _hook-io.sh # NEW: shared multi-editor payload/output adapter
|
|
9518
9520
|
├── _search-capability.sh # NEW: capability-aware search-first enforcement
|
|
9521
|
+
├── _session-paths.sh # NEW: per-repo session storage path resolver
|
|
9519
9522
|
├── session-start.sh
|
|
9520
|
-
├── session-context.sh
|
|
9521
9523
|
├── guard-destructive.sh
|
|
9522
9524
|
├── guard-path.sh
|
|
9523
9525
|
├── guard-config.sh
|
|
@@ -9545,7 +9547,7 @@ commands explicitly silent, and Codex-generated hooks plus Claude's bundled
|
|
|
9545
9547
|
|
|
9546
9548
|
~/.claude/settings.json
|
|
9547
9549
|
└── hooks: # Hook definitions referencing ~/.softspark/ai-toolkit/hooks/
|
|
9548
|
-
├── SessionStart → session-start.sh, mcp-health.sh
|
|
9550
|
+
├── SessionStart → session-start.sh, mcp-health.sh
|
|
9549
9551
|
├── Notification → notify-waiting.sh
|
|
9550
9552
|
├── PreToolUse → guard-destructive.sh, guard-path.sh, guard-config.sh, commit-quality.sh, revert-guard.sh
|
|
9551
9553
|
├── UserPromptSubmit → user-prompt-submit.sh, track-usage.sh
|
|
@@ -9586,7 +9588,7 @@ Windsurf rebranded to Devin Desktop (2026-06-02); the Cascade agent — and its
|
|
|
9586
9588
|
Devin CLI uses a **Claude-compatible** hook format (docs.devin.ai/cli/extensibility/hooks). Key facts driving the generator:
|
|
9587
9589
|
|
|
9588
9590
|
- **Standalone file shape:** in `.devin/hooks.v1.json` the entire file IS the hooks object — no top-level `"hooks"` wrapper key (unlike `.claude/settings.json`).
|
|
9589
|
-
- **Events:** Claude-style PascalCase — `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `Stop
|
|
9591
|
+
- **Events:** Claude-style PascalCase — `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `Stop`. `post_cascade_response` maps to `Stop` (which carries no response text on stdin).
|
|
9590
9592
|
- **Matchers:** regex against the Devin **tool name** (`read`, `edit`, `exec`, `grep`, `glob`, `mcp__<server>__<tool>`) — NOT Claude's `Bash`/`Edit`, so the shared guards reliably fire.
|
|
9591
9593
|
- **Block contract:** the guard scripts emit `{"decision":"block","reason":...}` on stdout (plain mode) AND exit 2 — Devin honors both. Hooks run **without** `AI_TOOLKIT_HOOK_FORMAT=json` because Devin expects the flat `{"decision","reason"}` shape, not Claude's `hookSpecificOutput` envelope.
|
|
9592
9594
|
- **Stdin payload:** flat `{ "hook_event_name", "tool_name", "tool_input" }` — already handled by `_hook-io.sh` via its `.tool_name` / `.tool_input.*` branches, so no normalizer change was needed.
|
|
@@ -11057,7 +11059,7 @@ Each command file carries the prompt in its markdown body (built from the SKILL.
|
|
|
11057
11059
|
|
|
11058
11060
|
| opencode event | Bash hook(s) |
|
|
11059
11061
|
|----------------------------|--------------------------------------------------------------------|
|
|
11060
|
-
| `session.created` | `session-start.sh` + `
|
|
11062
|
+
| `session.created` | `session-start.sh` + `mcp-health.sh` |
|
|
11061
11063
|
| `session.compacted` | `pre-compact.sh` + `pre-compact-save.sh` (PreCompact equivalent) |
|
|
11062
11064
|
| `session.deleted` | `session-end.sh` + `save-session.sh` |
|
|
11063
11065
|
| `message.updated` | `user-prompt-submit.sh` + `track-usage.sh` |
|
|
@@ -11895,9 +11897,9 @@ title: "Supported Tools Registry"
|
|
|
11895
11897
|
category: reference
|
|
11896
11898
|
service: ai-toolkit
|
|
11897
11899
|
tags: [editors, platforms, generators, integration, ecosystem]
|
|
11898
|
-
version: "1.
|
|
11900
|
+
version: "1.7.0"
|
|
11899
11901
|
created: "2026-04-23"
|
|
11900
|
-
last_updated: "2026-06-
|
|
11902
|
+
last_updated: "2026-06-23"
|
|
11901
11903
|
description: "Human-readable view of scripts/ecosystem_tools.json — the canonical list of tools ai-toolkit integrates with (Claude Code + 11 editors), their documentation URLs, config paths, our generators, and tracked capability markers."
|
|
11902
11904
|
---
|
|
11903
11905
|
|
|
@@ -11920,7 +11922,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
11920
11922
|
| ID | `claude-code` |
|
|
11921
11923
|
| Docs | https://code.claude.com/docs (platform.claude.com/docs 307-redirects here) |
|
|
11922
11924
|
| Release notes | https://github.com/anthropics/claude-code/releases |
|
|
11923
|
-
| Changelog | https://code.claude.com/docs/en/changelog (lists current 2.1.
|
|
11925
|
+
| Changelog | https://code.claude.com/docs/en/changelog (lists current 2.1.186) |
|
|
11924
11926
|
| Config paths | `~/.claude/settings.json`, `.claude/settings.json` (project, committed), `.claude/settings.local.json`, `CLAUDE.md`, `.claude/rules/*.md`, `.claude/agents/*.md`, `.claude/skills/*/SKILL.md`, `~/.claude/themes/*.json` (v2.1.118+) |
|
|
11925
11927
|
| Our generators | — (Claude Code is the primary target; toolkit content ships directly as `.md` files and `settings.json` merges) |
|
|
11926
11928
|
| Tracked hook events | Core: `SessionStart`, `SessionEnd`, `UserPromptSubmit`, `Notification`, `MessageDisplay`. Tool: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PostToolBatch`. Turn: `Stop`, `StopFailure`, `UserPromptExpansion`. Subagent: `SubagentStart`, `SubagentStop`. Compaction: `PreCompact`, `PostCompact`. Permissions: `PermissionRequest`, `PermissionDenied`. Elicitation: `Elicitation`, `ElicitationResult`. Teams: `TaskCreated`, `TaskCompleted`, `TeammateIdle`. Worktrees/env: `WorktreeCreate`, `WorktreeRemove`, `CwdChanged`, `FileChanged`, `ConfigChange`. Setup: `Setup`, `InstructionsLoaded` |
|
|
@@ -11971,8 +11973,8 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
11971
11973
|
| Release notes | https://github.blog/changelog/label/copilot/ |
|
|
11972
11974
|
| Config paths | `.github/copilot-instructions.md`, `.github/instructions/*.instructions.md`, `.github/prompts/*.prompt.md`, `AGENTS.md` |
|
|
11973
11975
|
| Our generators | `scripts/generate_copilot.py` |
|
|
11974
|
-
| Tracked capabilities | `copilot-instructions.md`, Copilot Chat, Copilot Workspace, Copilot cloud agent, `applyTo`, custom agents, prompt files, `instructions.md`, MCP |
|
|
11975
|
-
| Tier notes | Custom agents (`.github/agents/*.agent.md`) and repo-level MCP config are Pro/Pro+/Business/Enterprise only and intentionally not integrated (class C per ecosystem-sync SOP). |
|
|
11976
|
+
| Tracked capabilities | `copilot-instructions.md`, Copilot Chat, Copilot Workspace, Copilot cloud agent, `applyTo`, custom agents, prompt files, `instructions.md`, `AGENTS.md`, MCP |
|
|
11977
|
+
| Tier notes | Custom agents (`.github/agents/*.agent.md`) and repo-level MCP config are Pro/Pro+/Business/Enterprise only and intentionally not integrated (class C per ecosystem-sync SOP). Copilot code review reads the nearest `AGENTS.md` automatically since the 2026-06-18 GA (all tiers); `ai-toolkit install --local --editors copilot` injects a `TOOLKIT:copilot-agents` section generated from `generate_agents_md.py` without clobbering Codex/opencode sections in the same file. The 4000-char cap on `copilot-instructions.md` / `*.instructions.md` was also removed (2026-06-12). |
|
|
11976
11978
|
|
|
11977
11979
|
### Gemini CLI
|
|
11978
11980
|
|
|
@@ -11985,7 +11987,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
11985
11987
|
| Our generators | `scripts/generate_gemini.py`, `scripts/generate_gemini_hooks.py` (profile>=standard), `scripts/generate_gemini_commands.py` (profile=full), `scripts/generate_gemini_skills.py` (profile=full) |
|
|
11986
11988
|
| Tracked capabilities | `GEMINI.md`, `mcpServers`, tools, `settings.json`, `BeforeTool`, `AfterTool`, `BeforeToolSelection`, `BeforeAgent`, `AfterAgent`, `BeforeModel`, `AfterModel`, `Notification`, `PreCompress`, `SessionStart`, `SessionEnd`, `SKILL.md`, `activate_skill`, custom commands, `gemini-extension.json` (no native `Stop` event — generator maps Stop-equivalent to `AfterAgent`; 11 documented hook events total) |
|
|
11987
11989
|
| Version probe | `gemini --version` |
|
|
11988
|
-
| Latest upstream | v0.
|
|
11990
|
+
| Latest upstream | v0.47.0 (2026-06-18). NOTE: Gemini CLI dropped free/paid individual tiers on 2026-06-18 in favor of Antigravity CLI (we ship `generate_antigravity.py`); enterprise Code Assist and paid API keys keep Gemini CLI, so the integration stays. The 11 hook events are unchanged. v0.48 preview migrates the `coreTools` setting to `tools.core` (a tool-allowlist key we do not emit, so no generator change). |
|
|
11989
11991
|
|
|
11990
11992
|
### Cline
|
|
11991
11993
|
|
|
@@ -12057,12 +12059,12 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
12057
12059
|
| Field | Value |
|
|
12058
12060
|
|-------|-------|
|
|
12059
12061
|
| ID | `codex-cli` |
|
|
12060
|
-
| Docs | https://developers.openai.com/codex (live docs site; config pages split into `/codex/config-basic`, `/codex/config-reference`, `/codex/config-advanced` plus `/codex/hooks`, `/codex/skills`; latest stable codex-cli 0.
|
|
12062
|
+
| Docs | https://developers.openai.com/codex (live docs site; config pages split into `/codex/config-basic`, `/codex/config-reference`, `/codex/config-advanced` plus `/codex/hooks`, `/codex/skills`; latest stable codex-cli 0.142.0, 2026-06) |
|
|
12061
12063
|
| Release notes | https://github.com/openai/codex/releases |
|
|
12062
12064
|
| Config paths | `AGENTS.md`, `.agents/skills/*/SKILL.md`, `.codex/hooks.json`, `.codex/config.toml` (project layers, root→cwd, closest wins, trusted projects only), `~/.codex/config.toml` |
|
|
12063
12065
|
| Our generators | `scripts/generate_codex.py`, `scripts/generate_codex_hooks.py`, `scripts/generate_codex_skills.py` (opt-in via `--codex-skills`) |
|
|
12064
12066
|
| Rules delivery | Universal coding rules are inlined into `AGENTS.md` (Codex reads instructions only from AGENTS.md, not `.agents/rules/`); language rules ship as `<lang>-rules` skills under `.agents/skills/`. |
|
|
12065
|
-
| Tracked hook events | Upstream canonical (codex-rs `HookEventName` enum): `PreToolUse`, `PostToolUse`, `PermissionRequest`, `PreCompact`, `PostCompact`, `SessionStart`, `UserPromptSubmit`, `SubagentStart`, `SubagentStop`, `Stop` (10 events). We wire
|
|
12067
|
+
| Tracked hook events | Upstream canonical (codex-rs `HookEventName` enum): `PreToolUse`, `PostToolUse`, `PermissionRequest`, `PreCompact`, `PostCompact`, `SessionStart`, `UserPromptSubmit`, `SubagentStart`, `SubagentStop`, `Stop` (10 events). We wire 9 of these to shared toolkit hook scripts, mirroring the Claude Code mapping in `app/hooks.json`. `PostCompact` is not wired (its only hook was the removed environment-snapshot probe). |
|
|
12066
12068
|
| Tracked handler types | `command` (emitted by default); `prompt` and `agent` available upstream but authored by hand |
|
|
12067
12069
|
| Other capabilities | `AGENTS.md`, `config.toml`, `mcp_servers`, sandbox policies, `.agents/skills/*/SKILL.md` (native Codex skill discovery path) |
|
|
12068
12070
|
| Version probe | `codex --version` |
|
|
@@ -12079,7 +12081,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
12079
12081
|
| Tracked plugin events | `session.created`, `session.compacted`, `session.deleted`, `message.updated`, `tool.execute.before`, `tool.execute.after`, `permission.asked`, `command.executed` |
|
|
12080
12082
|
| Other capabilities | `opencode.json` config, primary + subagent modes, `@`-mention subagents, `/`-invocation commands, MCP (local + remote), plugin hooks in JS/TS, native `SKILL.md` discovery with Claude-compatible fallback, `permission.skill.*` matrix |
|
|
12081
12083
|
| Version probe | `opencode --version` |
|
|
12082
|
-
| Watch item | v1.16.0 (2026-06-05)
|
|
12084
|
+
| Watch item | v1.16.0 (2026-06-05) shipped an experimental v2 skill registry (flat-file skills, `slash` frontmatter key). As of the 2026-06-23 sync (upstream v1.17.9) it is still undocumented and not stabilized: the skills docs show only the nested `SKILL.md` layout with no `slash` key, so `generate_opencode*.py` is unchanged. Re-check next sync. |
|
|
12083
12085
|
|
|
12084
12086
|
---
|
|
12085
12087
|
|
|
@@ -12244,7 +12246,6 @@ Hook logic lives in `app/hooks/*.sh` — not inline JSON one-liners. Scripts are
|
|
|
12244
12246
|
|-------|--------|--------|
|
|
12245
12247
|
| SessionStart | `session-start.sh` | MANDATORY rules reminder + session context + instincts + reset session-edit state |
|
|
12246
12248
|
| SessionStart | `mcp-health.sh` | Check MCP server command availability (non-blocking warning) |
|
|
12247
|
-
| SessionStart | `session-context.sh` | Capture environment snapshot to `~/.softspark/ai-toolkit/sessions/current-context.json` |
|
|
12248
12249
|
| Notification | `notify-waiting.sh` | Cross-platform desktop notification |
|
|
12249
12250
|
| PreToolUse | `guard-destructive.sh` | Block `rm -rf`, `DROP TABLE`, etc. |
|
|
12250
12251
|
| PreToolUse | `guard-path.sh` | Block wrong-user path hallucination |
|
package/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@softspark/ai-toolkit",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.10.1",
|
|
4
4
|
"description": "AI coding toolkit: 108 skills, 44 agents, 12-editor write-through (Claude, Cursor, Windsurf, Copilot, Gemini, Cline, Roo, Aider, Augment, Antigravity, Codex, opencode), machine-enforced safety constitution, SARIF audit, signed npm provenance.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
@@ -71,6 +71,8 @@
|
|
|
71
71
|
"files": [
|
|
72
72
|
"bin/",
|
|
73
73
|
"app/",
|
|
74
|
+
"!app/**/.claude",
|
|
75
|
+
"!app/**/.claude/**",
|
|
74
76
|
"!app/**/__pycache__",
|
|
75
77
|
"!app/**/*.pyc",
|
|
76
78
|
"scripts/",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"description": "Authoritative registry of tools ai-toolkit integrates with. Consumed by scripts/ecosystem_doctor.py to detect upstream doc/version drift.",
|
|
4
|
-
"last_updated": "2026-06-
|
|
4
|
+
"last_updated": "2026-06-23",
|
|
5
5
|
"tools": [
|
|
6
6
|
{
|
|
7
7
|
"id": "claude-code",
|
|
@@ -200,6 +200,7 @@
|
|
|
200
200
|
"custom agents",
|
|
201
201
|
"prompt files",
|
|
202
202
|
"instructions.md",
|
|
203
|
+
"AGENTS.md",
|
|
203
204
|
"MCP"
|
|
204
205
|
],
|
|
205
206
|
"version_probe": null
|
|
@@ -33,7 +33,6 @@ CODEX_HOOKS: dict[str, list[tuple[str, str]]] = {
|
|
|
33
33
|
"SessionStart": [
|
|
34
34
|
("startup|resume", "session-start.sh"),
|
|
35
35
|
("startup|resume", "mcp-health.sh"),
|
|
36
|
-
("startup|resume", "session-context.sh"),
|
|
37
36
|
],
|
|
38
37
|
"PreToolUse": [
|
|
39
38
|
("Bash", "guard-destructive.sh"),
|
|
@@ -67,10 +66,6 @@ CODEX_HOOKS: dict[str, list[tuple[str, str]]] = {
|
|
|
67
66
|
("", "pre-compact.sh"),
|
|
68
67
|
("", "pre-compact-save.sh"),
|
|
69
68
|
],
|
|
70
|
-
"PostCompact": [
|
|
71
|
-
# Re-establish working context after compaction.
|
|
72
|
-
("", "session-context.sh"),
|
|
73
|
-
],
|
|
74
69
|
"Stop": [
|
|
75
70
|
("", "quality-check.sh"),
|
|
76
71
|
("", "save-session.sh"),
|
|
@@ -17,6 +17,12 @@ This generator produces three surfaces, all on the OSS/Free/Pro tier
|
|
|
17
17
|
Invoked manually in VS Code Copilot Chat via ``/name``. Written only
|
|
18
18
|
when ``generate()`` is called with a target directory.
|
|
19
19
|
|
|
20
|
+
GitHub Copilot code review (generally available 2026-06-18, all tiers) now
|
|
21
|
+
automatically reads the root-level ``AGENTS.md`` when generating review
|
|
22
|
+
feedback. We already emit that file via ``scripts/generate_agents_md.py``, so
|
|
23
|
+
no Copilot-specific emission is added here; ``AGENTS.md`` is tracked in this
|
|
24
|
+
tool's ``capability_markers`` in ``scripts/ecosystem_tools.json``.
|
|
25
|
+
|
|
20
26
|
Features that live on Pro/Pro+/Business/Enterprise tiers are intentionally
|
|
21
27
|
not generated (classified as class C in the ecosystem-sync SOP):
|
|
22
28
|
* ``.github/agents/*.agent.md`` — custom agent profiles (tier-gated)
|
|
@@ -61,11 +61,6 @@ DEVIN_HOOKS: dict[str, list[tuple[str, list[str]]]] = {
|
|
|
61
61
|
"Stop": [
|
|
62
62
|
("", ["quality-check.sh", "save-session.sh", "stop-search-check.sh"]),
|
|
63
63
|
],
|
|
64
|
-
# Cascade's post_setup_worktree has no Devin equivalent; session-context
|
|
65
|
-
# moves to SessionStart (Devin fires SessionStart when a session begins).
|
|
66
|
-
"SessionStart": [
|
|
67
|
-
("", ["session-context.sh"]),
|
|
68
|
-
],
|
|
69
64
|
}
|
|
70
65
|
|
|
71
66
|
|
|
@@ -40,7 +40,6 @@ GEMINI_HOOKS: dict[str, list[tuple[str, str]]] = {
|
|
|
40
40
|
"SessionStart": [
|
|
41
41
|
("", "session-start.sh"),
|
|
42
42
|
("", "mcp-health.sh"),
|
|
43
|
-
("", "session-context.sh"),
|
|
44
43
|
],
|
|
45
44
|
"BeforeTool": [
|
|
46
45
|
# run_shell_command covers Bash-equivalent destructive patterns
|
|
@@ -67,10 +66,6 @@ GEMINI_HOOKS: dict[str, list[tuple[str, str]]] = {
|
|
|
67
66
|
("", "save-session.sh"),
|
|
68
67
|
("", "stop-search-check.sh"),
|
|
69
68
|
],
|
|
70
|
-
"BeforeModel": [
|
|
71
|
-
# Light-weight observability slot. Reuses the session-context probe.
|
|
72
|
-
("", "session-context.sh"),
|
|
73
|
-
],
|
|
74
69
|
"SessionEnd": [
|
|
75
70
|
("", "session-end.sh"),
|
|
76
71
|
],
|
|
@@ -11,7 +11,7 @@ opencode lifecycle events. Coverage map:
|
|
|
11
11
|
|
|
12
12
|
opencode event -> ai-toolkit Bash hook(s)
|
|
13
13
|
---------------------------------------------------------------
|
|
14
|
-
session.created -> session-start.sh +
|
|
14
|
+
session.created -> session-start.sh + mcp-health.sh
|
|
15
15
|
session.compacted -> pre-compact.sh + pre-compact-save.sh
|
|
16
16
|
session.deleted -> session-end.sh + save-session.sh
|
|
17
17
|
message.updated -> user-prompt-submit.sh + track-usage.sh
|
|
@@ -79,7 +79,6 @@ export const AiToolkitHooks = async ({ $, project, directory, worktree }) => ({
|
|
|
79
79
|
switch (event.type) {
|
|
80
80
|
case "session.created":
|
|
81
81
|
await runHook($, "session-start.sh", payload);
|
|
82
|
-
await runHook($, "session-context.sh", payload);
|
|
83
82
|
await runHook($, "mcp-health.sh", payload);
|
|
84
83
|
break;
|
|
85
84
|
case "session.compacted":
|
|
@@ -352,6 +352,39 @@ def inject_with_rules(
|
|
|
352
352
|
print(f" Updated: {target_file}")
|
|
353
353
|
|
|
354
354
|
|
|
355
|
+
def _inject_text_section(target_file: Path, section: str, text: str) -> None:
|
|
356
|
+
"""Inject generated text into one marker section without touching others."""
|
|
357
|
+
target_file.parent.mkdir(parents=True, exist_ok=True)
|
|
358
|
+
existing = target_file.read_text(encoding="utf-8") if target_file.is_file() else ""
|
|
359
|
+
existing = _trim_trailing_blanks(_strip_section(existing, section))
|
|
360
|
+
|
|
361
|
+
parts: list[str] = []
|
|
362
|
+
if existing.strip():
|
|
363
|
+
parts.append(existing)
|
|
364
|
+
parts.append("")
|
|
365
|
+
parts.extend([
|
|
366
|
+
f"<!-- TOOLKIT:{section} START -->",
|
|
367
|
+
"<!-- Auto-injected by ai-toolkit. Re-run to update. -->",
|
|
368
|
+
"",
|
|
369
|
+
text.rstrip("\n"),
|
|
370
|
+
"",
|
|
371
|
+
f"<!-- TOOLKIT:{section} END -->",
|
|
372
|
+
])
|
|
373
|
+
|
|
374
|
+
output = _collapse_blank_runs("\n".join(parts) + "\n").lstrip("\n")
|
|
375
|
+
target_file.write_text(output, encoding="utf-8")
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
def _install_copilot_agents_md(cwd: Path) -> None:
|
|
379
|
+
"""Emit root AGENTS.md for GitHub Copilot without clobbering other tools."""
|
|
380
|
+
generated = run_script("generate_agents_md.py", capture=True)
|
|
381
|
+
if not generated.strip():
|
|
382
|
+
print(" ERROR: generate_agents_md.py produced no output")
|
|
383
|
+
return
|
|
384
|
+
_inject_text_section(cwd / "AGENTS.md", "copilot-agents", generated)
|
|
385
|
+
print(" Updated: AGENTS.md (Copilot agent instructions)")
|
|
386
|
+
|
|
387
|
+
|
|
355
388
|
def run_script(script_name: str, *args: str, capture: bool = False) -> str:
|
|
356
389
|
"""Run a script from the scripts/ directory (prefers .py over .sh)."""
|
|
357
390
|
scripts_dir = toolkit_dir / "scripts"
|
|
@@ -724,7 +757,7 @@ def _install_local_dry_run(reset: bool, editors: list[str] | None = None,
|
|
|
724
757
|
|
|
725
758
|
# Editor-specific dry-run messages
|
|
726
759
|
_EDITOR_DRY_RUN = {
|
|
727
|
-
"copilot": " Would inject: .github/copilot-instructions.md",
|
|
760
|
+
"copilot": " Would inject: .github/copilot-instructions.md + AGENTS.md",
|
|
728
761
|
"cursor": " Would generate: .cursorrules + .cursor/rules/*.mdc",
|
|
729
762
|
"windsurf": " Would generate: .windsurfrules + .devin/rules/*.md + .windsurf/rules/*.md",
|
|
730
763
|
"cline": " Would generate: .clinerules/*.md",
|
|
@@ -949,6 +982,7 @@ def _create_local_ai_tool_configs(cwd: Path, rules_dir: Path,
|
|
|
949
982
|
cwd / ".github" / "copilot-instructions.md",
|
|
950
983
|
rules_dir,
|
|
951
984
|
)
|
|
985
|
+
_install_copilot_agents_md(cwd)
|
|
952
986
|
# `standard` and above: emit path-specific instructions + prompt files
|
|
953
987
|
# (directory mode). `minimal` stays backwards-compatible with v2.
|
|
954
988
|
if add_copilot_dir:
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# session-context.sh — Capture session context at start for later reference.
|
|
3
|
-
#
|
|
4
|
-
# Fires on: SessionStart
|
|
5
|
-
# Saves environment snapshot to JSON for cross-hook and cross-session use.
|
|
6
|
-
# Skipped when TOOLKIT_HOOK_PROFILE=minimal.
|
|
7
|
-
|
|
8
|
-
# shellcheck source=_profile-check.sh
|
|
9
|
-
source "$(dirname "$0")/_profile-check.sh"
|
|
10
|
-
|
|
11
|
-
# Read from stdin (Claude Code passes JSON with .session_id)
|
|
12
|
-
INPUT=$(cat)
|
|
13
|
-
SESSION=$(echo "$INPUT" | jq -r '.session_id // empty' 2>/dev/null)
|
|
14
|
-
[ -z "$SESSION" ] && SESSION="$$"
|
|
15
|
-
SESSIONS_DIR="$HOME/.softspark/ai-toolkit/sessions"
|
|
16
|
-
mkdir -p "$SESSIONS_DIR"
|
|
17
|
-
|
|
18
|
-
CONTEXT_FILE="$SESSIONS_DIR/${SESSION}.json"
|
|
19
|
-
|
|
20
|
-
# Gather context
|
|
21
|
-
WORKDIR="$(pwd)"
|
|
22
|
-
GIT_BRANCH=""
|
|
23
|
-
GIT_STATUS=""
|
|
24
|
-
if command -v git >/dev/null 2>&1 && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
25
|
-
GIT_BRANCH=$(git branch --show-current 2>/dev/null || echo "detached")
|
|
26
|
-
GIT_STATUS=$(git status --short 2>/dev/null | head -20)
|
|
27
|
-
fi
|
|
28
|
-
|
|
29
|
-
NODE_VERSION=""
|
|
30
|
-
if command -v node >/dev/null 2>&1; then
|
|
31
|
-
NODE_VERSION=$(node --version 2>/dev/null)
|
|
32
|
-
fi
|
|
33
|
-
|
|
34
|
-
PYTHON_VERSION=""
|
|
35
|
-
if command -v python3 >/dev/null 2>&1; then
|
|
36
|
-
PYTHON_VERSION=$(python3 --version 2>/dev/null | awk '{print $2}')
|
|
37
|
-
fi
|
|
38
|
-
|
|
39
|
-
CURRENT_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
40
|
-
|
|
41
|
-
# Write JSON using python3 for proper escaping
|
|
42
|
-
python3 - "$CONTEXT_FILE" "$WORKDIR" "$GIT_BRANCH" "$GIT_STATUS" "$CURRENT_DATE" "$NODE_VERSION" "$PYTHON_VERSION" <<'PY'
|
|
43
|
-
import json
|
|
44
|
-
import sys
|
|
45
|
-
import os
|
|
46
|
-
|
|
47
|
-
context_file = sys.argv[1]
|
|
48
|
-
data = {
|
|
49
|
-
"pwd": sys.argv[2],
|
|
50
|
-
"git_branch": sys.argv[3],
|
|
51
|
-
"git_status": sys.argv[4],
|
|
52
|
-
"date": sys.argv[5],
|
|
53
|
-
"node_version": sys.argv[6],
|
|
54
|
-
"python_version": sys.argv[7],
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
tmp = context_file + ".tmp"
|
|
58
|
-
with open(tmp, "w") as f:
|
|
59
|
-
json.dump(data, f, indent=2)
|
|
60
|
-
os.replace(tmp, context_file)
|
|
61
|
-
PY
|
|
62
|
-
|
|
63
|
-
exit 0
|