@softspark/ai-toolkit 4.32.3 → 4.33.0
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 +61 -0
- package/README.md +17 -26
- package/app/.claude-plugin/plugin.json +1 -1
- package/app/ARCHITECTURE.md +1 -1
- package/app/claude-app/skills/ai-toolkit-rules/SKILL.md +8 -1
- package/app/rules/common/security.md +2 -1
- package/app/rules/common/testing.md +6 -0
- package/app/skills/api-patterns/SKILL.md +37 -11
- package/app/skills/api-patterns/reference/error-contracts.md +88 -0
- package/app/skills/review/SKILL.md +5 -0
- package/app/skills/security-patterns/SKILL.md +2 -2
- package/app/skills/security-patterns/reference/input-validation.md +69 -1
- package/app/skills/testing-patterns/SKILL.md +19 -0
- package/benchmarks/ecosystem-doctor-snapshot.json +13 -13
- package/kb/procedures/sop-post-release-testing.md +159 -58
- package/kb/procedures/sop-release-verification.md +43 -16
- package/kb/procedures/sop-release.md +9 -2
- package/kb/reference/architecture-overview.md +3 -3
- package/kb/reference/dsh-compatibility.md +85 -13
- package/kb/reference/language-rules.md +7 -1
- package/kb/reference/skills-catalog.md +2 -2
- package/llms-full.txt +309 -96
- package/manifest.json +3 -3
- package/package.json +2 -2
- package/scripts/ecosystem_tools.json +5 -5
- package/scripts/install_steps/dsh.py +506 -53
package/llms-full.txt
CHANGED
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
- **a11y-validate**: Accessibility validator: WCAG 2.1 AA, EN 301 549, EAA. Triggers: a11y, accessibility, WCAG, EAA, ARIA, contrast, keyboard, screen reader.
|
|
85
85
|
- **agent-creator**: Creates new specialized agents with frontmatter, tools, delegation. Triggers: new agent, create agent, agent scaffold, specialized agent.
|
|
86
86
|
- **analyze**: Analyzes code quality, complexity, patterns across codebase. Triggers: quality report, hotspot scan, code analysis, architecture signal.
|
|
87
|
-
- **api-patterns**:
|
|
87
|
+
- **api-patterns**: API design: naming, versioning, pagination, idempotency, OpenAPI, error contracts and safe retries. Triggers: API design, REST, GraphQL, OpenAPI, Swagger, error response, HTTP status, rate limit.
|
|
88
88
|
- **app-builder**: App scaffolding: Next.js, Vite, Nuxt, Astro, FastAPI, Django, Laravel, RN, Flutter. Triggers: scaffold, bootstrap, new project, starter, dashboard, mobile app.
|
|
89
89
|
- **architecture-audit**: Audits codebase for architectural friction, shallow modules; proposes RFCs. Triggers: improve architecture, shallow modules, deepen modules, reduce coupling.
|
|
90
90
|
- **architecture-decision**: Architecture decisions in ADR/RFC/RFD format: context, constraints, options, recommendation. Triggers: ADR, RFC, RFD, trade-offs, design choice, pick between, evaluate approach.
|
|
@@ -7721,10 +7721,10 @@ title: "SOP: Post-Release Testing"
|
|
|
7721
7721
|
category: procedures
|
|
7722
7722
|
service: ai-toolkit
|
|
7723
7723
|
tags: [sop, post-release, smoke-test, npm, sandbox, plugin-pack, provenance, isolation]
|
|
7724
|
-
version: "1.2.
|
|
7724
|
+
version: "1.2.1"
|
|
7725
7725
|
created: "2026-07-26"
|
|
7726
|
-
last_updated: "2026-
|
|
7727
|
-
description: "Smoke-test a published @softspark/ai-toolkit
|
|
7726
|
+
last_updated: "2026-09-06"
|
|
7727
|
+
description: "Smoke-test a published @softspark/ai-toolkit npm artifact in a disposable container or VM with its default HOME, no host settings or credential mounts, host-side configuration fingerprints, and retained evidence. Covers provenance, CLI, doctor, installed skill scripts, scanner wiring, and the plugin-pack lifecycle."
|
|
7728
7728
|
---
|
|
7729
7729
|
|
|
7730
7730
|
# SOP: Post-Release Testing
|
|
@@ -7734,73 +7734,147 @@ actually install, from npm, rather than the working tree.
|
|
|
7734
7734
|
|
|
7735
7735
|
Sibling procedures exist for `jira-mcp` and `legal-pl-pack`; this is the
|
|
7736
7736
|
ai-toolkit equivalent. It complements
|
|
7737
|
-
[Release Verification](sop-release-verification.md),
|
|
7738
|
-
|
|
7739
|
-
|
|
7737
|
+
[Release Verification](sop-release-verification.md), whose cross-editor checks
|
|
7738
|
+
must use the same isolated published artifact. Neither procedure installs or
|
|
7739
|
+
updates the maintainer's working copy.
|
|
7740
7740
|
|
|
7741
7741
|
**Time:** 10 minutes.
|
|
7742
7742
|
|
|
7743
7743
|
## Why isolation is the first step, not a detail
|
|
7744
7744
|
|
|
7745
|
-
The toolkit
|
|
7746
|
-
|
|
7747
|
-
|
|
7745
|
+
The toolkit writes settings beneath the current user's home directory. Run the
|
|
7746
|
+
published artifact in a disposable Docker container or VM with its normal HOME.
|
|
7747
|
+
Do not override host HOME, CODEX_HOME, or another editor's configuration root as
|
|
7748
|
+
a substitute for isolation. Do not expose the host home, credentials, SSH agent,
|
|
7749
|
+
Docker socket, or existing toolkit installation to the test environment.
|
|
7748
7750
|
|
|
7749
|
-
|
|
7750
|
-
Nothing is global.
|
|
7751
|
+
## Phase 1: Create and verify an isolated test environment
|
|
7751
7752
|
|
|
7752
|
-
|
|
7753
|
+
The recipe below uses Docker. A disposable VM is equivalent only when host shared
|
|
7754
|
+
folders and authentication forwarding are absent. The host needs Docker and
|
|
7755
|
+
Python 3; the container prerequisites are installed separately below.
|
|
7756
|
+
|
|
7757
|
+
**Host terminal:** keep this terminal open for Phases 7 and 8. The fingerprint
|
|
7758
|
+
reads only these toolkit-managed settings files and records hashes and presence,
|
|
7759
|
+
never their contents. Add a path only after verifying that the tested installer
|
|
7760
|
+
actually manages it.
|
|
7753
7761
|
|
|
7754
7762
|
```bash
|
|
7755
|
-
|
|
7756
|
-
|
|
7757
|
-
|
|
7758
|
-
|
|
7759
|
-
|
|
7763
|
+
set -o pipefail
|
|
7764
|
+
VERSION="X.Y.Z"
|
|
7765
|
+
EVIDENCE=$(mktemp -d "${TMPDIR:-/tmp}/ai-toolkit-release-${VERSION}.XXXXXX")
|
|
7766
|
+
SMOKE_CONTAINER=$(python3 -c 'import uuid; print("ai-toolkit-smoke-" + uuid.uuid4().hex)')
|
|
7767
|
+
|
|
7768
|
+
fingerprint_host() {
|
|
7769
|
+
python3 - <<'PY'
|
|
7770
|
+
import hashlib
|
|
7771
|
+
import json
|
|
7772
|
+
import os
|
|
7773
|
+
from pathlib import Path
|
|
7774
|
+
|
|
7775
|
+
home = Path.home()
|
|
7776
|
+
managed = [
|
|
7777
|
+
".claude/settings.json",
|
|
7778
|
+
".claude.json",
|
|
7779
|
+
".softspark/ai-toolkit/plugins.json",
|
|
7780
|
+
".codex/config.toml",
|
|
7781
|
+
".cursor/mcp.json",
|
|
7782
|
+
".gemini/settings.json",
|
|
7783
|
+
".config/opencode/opencode.json",
|
|
7784
|
+
]
|
|
7785
|
+
rows = {}
|
|
7786
|
+
for relative in managed:
|
|
7787
|
+
path = home / relative
|
|
7788
|
+
row = {"exists": path.exists() or path.is_symlink()}
|
|
7789
|
+
if path.is_symlink():
|
|
7790
|
+
row["link_sha256"] = hashlib.sha256(os.readlink(path).encode()).hexdigest()
|
|
7791
|
+
if path.is_file():
|
|
7792
|
+
row["sha256"] = hashlib.sha256(path.read_bytes()).hexdigest()
|
|
7793
|
+
rows[relative] = row
|
|
7794
|
+
print(json.dumps({
|
|
7795
|
+
"host_home_sha256": hashlib.sha256(str(home).encode()).hexdigest(),
|
|
7796
|
+
"files": rows,
|
|
7797
|
+
}, sort_keys=True, indent=2))
|
|
7798
|
+
PY
|
|
7799
|
+
}
|
|
7800
|
+
|
|
7801
|
+
fingerprint_host > "$EVIDENCE/host-before.json"
|
|
7802
|
+
docker run -d --name "$SMOKE_CONTAINER" \
|
|
7803
|
+
--label "org.softspark.release-smoke=$SMOKE_CONTAINER" \
|
|
7804
|
+
--env "VERSION=$VERSION" \
|
|
7805
|
+
node:22-bookworm sleep infinity
|
|
7806
|
+
docker inspect "$SMOKE_CONTAINER" > "$EVIDENCE/container-before.json"
|
|
7807
|
+
python3 - "$EVIDENCE/container-before.json" <<'PY'
|
|
7808
|
+
import json
|
|
7809
|
+
import sys
|
|
7810
|
+
|
|
7811
|
+
container = json.load(open(sys.argv[1], encoding="utf-8"))[0]
|
|
7812
|
+
assert container["Mounts"] == [], "Smoke container must have no mounts"
|
|
7813
|
+
host = container["HostConfig"]
|
|
7814
|
+
assert not host["Privileged"], "Privileged containers are forbidden"
|
|
7815
|
+
assert host["NetworkMode"] != "host", "Do not share the host network namespace"
|
|
7816
|
+
assert host["PidMode"] != "host", "Do not share host processes"
|
|
7817
|
+
PY
|
|
7818
|
+
docker exec "$SMOKE_CONTAINER" bash -lc \
|
|
7819
|
+
'test "$HOME" = "$(getent passwd "$(id -u)" | cut -d: -f6)"'
|
|
7820
|
+
docker exec "$SMOKE_CONTAINER" bash -lc \
|
|
7821
|
+
'apt-get update && apt-get install -y --no-install-recommends python3 python3-yaml git coreutils jq bats shellcheck ca-certificates curl util-linux' \
|
|
7822
|
+
2>&1 | tee "$EVIDENCE/bootstrap.log"
|
|
7823
|
+
```
|
|
7824
|
+
|
|
7825
|
+
Install any additional prerequisite declared by the pack under test only inside
|
|
7826
|
+
the container. GNU coreutils supplies timeout; util-linux supplies the session
|
|
7827
|
+
recorder. Use docker cp for evidence transfer, not host temporary-directory bind
|
|
7828
|
+
mounts: a remote Docker daemon may not see the host's /private/tmp.
|
|
7829
|
+
|
|
7830
|
+
**Enter the container, then run Phases 2 through 6 there:**
|
|
7831
|
+
|
|
7832
|
+
```bash
|
|
7833
|
+
docker exec -it "$SMOKE_CONTAINER" bash
|
|
7760
7834
|
```
|
|
7761
7835
|
|
|
7762
|
-
|
|
7836
|
+
Inside that container shell:
|
|
7763
7837
|
|
|
7764
7838
|
```bash
|
|
7765
|
-
|
|
7766
|
-
|
|
7767
|
-
p
|
|
7768
|
-
|
|
7769
|
-
|
|
7770
|
-
" 2>/dev/null
|
|
7771
|
-
# Simpler: note what exists today.
|
|
7772
|
-
cat ~/.softspark/ai-toolkit/plugins.json 2>/dev/null
|
|
7839
|
+
SB=/tmp/ai-toolkit-smoke
|
|
7840
|
+
AT="$SB/npm/bin/ai-toolkit"
|
|
7841
|
+
mkdir -p "$SB/npm" "$SB/evidence"
|
|
7842
|
+
export SB AT
|
|
7843
|
+
exec script -q -e -a "$SB/evidence/session.log" -c 'bash --noprofile --norc'
|
|
7773
7844
|
```
|
|
7774
7845
|
|
|
7846
|
+
Keep HOME at the container user's default. VERSION was passed when the container
|
|
7847
|
+
was created; SB and the npm prefix are disposable container paths. No command in
|
|
7848
|
+
Phases 2 through 6 runs in the host shell.
|
|
7849
|
+
|
|
7775
7850
|
## Phase 2: Provenance
|
|
7776
7851
|
|
|
7777
7852
|
Do this before installing anything: an unsigned publish is a release-blocking
|
|
7778
7853
|
regression, and there is no point smoke-testing a build you would have to redo.
|
|
7779
7854
|
|
|
7780
7855
|
```bash
|
|
7781
|
-
VERSION
|
|
7782
|
-
|
|
7783
|
-
| python3 -c "
|
|
7856
|
+
npm view "@softspark/ai-toolkit@${VERSION}" --json > "$SB/evidence/npm-view.json"
|
|
7857
|
+
python3 -c "
|
|
7784
7858
|
import json, sys
|
|
7785
|
-
d = json.load(sys.
|
|
7859
|
+
d = json.load(open(sys.argv[1], encoding='utf-8')); att = d['dist'].get('attestations', {})
|
|
7786
7860
|
pt = att.get('provenance', {}).get('predicateType')
|
|
7787
7861
|
assert pt == 'https://slsa.dev/provenance/v1', f'NO PROVENANCE: {pt}'
|
|
7788
7862
|
print('PROVENANCE OK:', att['url'])
|
|
7789
|
-
"
|
|
7863
|
+
" "$SB/evidence/npm-view.json"
|
|
7790
7864
|
```
|
|
7791
7865
|
|
|
7792
7866
|
## Phase 3: Install from npm
|
|
7793
7867
|
|
|
7794
7868
|
```bash
|
|
7795
7869
|
npm install -g --prefix "$SB/npm" "@softspark/ai-toolkit@${VERSION}"
|
|
7796
|
-
"$AT" --version # must equal VERSION
|
|
7870
|
+
"$AT" --version | tee "$SB/evidence/version.txt" # must equal VERSION
|
|
7797
7871
|
"$AT" --help >/dev/null && echo "help OK"
|
|
7798
7872
|
```
|
|
7799
7873
|
|
|
7800
7874
|
## Phase 4: Core surfaces
|
|
7801
7875
|
|
|
7802
7876
|
```bash
|
|
7803
|
-
"$AT" install #
|
|
7877
|
+
"$AT" install # global install inside the container's default HOME
|
|
7804
7878
|
"$AT" doctor # must end: Errors: 0 | Warnings: 0
|
|
7805
7879
|
"$AT" status
|
|
7806
7880
|
"$AT" plugin list # pack count must match app/plugins/
|
|
@@ -7838,8 +7912,13 @@ for D in "$HOME"/.claude/skills/*/; do
|
|
|
7838
7912
|
rel=${ref##*\$\{CLAUDE_SKILL_DIR\}/}
|
|
7839
7913
|
printf '%-22s %-10s %-26s ' "$s" "$interp" "$rel"
|
|
7840
7914
|
[ -f "$D/$rel" ] || { echo 'PATH DOES NOT RESOLVE'; continue; }
|
|
7841
|
-
out=$(CLAUDE_SKILL_DIR="$D" timeout 20 "$interp" "$D/$rel" --help </dev/null 2>&1
|
|
7842
|
-
|
|
7915
|
+
if out=$(CLAUDE_SKILL_DIR="$D" timeout 20 "$interp" "$D/$rel" --help </dev/null 2>&1); then
|
|
7916
|
+
rc=0
|
|
7917
|
+
else
|
|
7918
|
+
rc=$?
|
|
7919
|
+
fi
|
|
7920
|
+
printf '%s\n' "$out" > "$SB/evidence/skill-$s.log"
|
|
7921
|
+
printf 'rc=%s %s\n' "$rc" "$(printf '%s\n' "$out" | head -1 | cut -c1-40)"
|
|
7843
7922
|
done
|
|
7844
7923
|
```
|
|
7845
7924
|
|
|
@@ -7980,37 +8059,59 @@ again, pointing its source-override variable at a dead URL:
|
|
|
7980
8059
|
- [ ] `plugin status` says the pack is inert and names the fix
|
|
7981
8060
|
- [ ] Re-installing without the broken source recovers
|
|
7982
8061
|
|
|
7983
|
-
## Phase 7:
|
|
8062
|
+
## Phase 7: Verify the host configuration
|
|
8063
|
+
|
|
8064
|
+
Exit the recorded container shell. This returns to the unchanged host terminal
|
|
8065
|
+
from Phase 1. Run fingerprint_host there, not through docker exec and not in a
|
|
8066
|
+
shell that changed HOME:
|
|
7984
8067
|
|
|
7985
8068
|
```bash
|
|
7986
|
-
|
|
7987
|
-
|
|
7988
|
-
|
|
7989
|
-
|
|
7990
|
-
|
|
7991
|
-
|
|
7992
|
-
|
|
7993
|
-
"
|
|
8069
|
+
fingerprint_host > "$EVIDENCE/host-after.json"
|
|
8070
|
+
cmp -s "$EVIDENCE/host-before.json" "$EVIDENCE/host-after.json" || {
|
|
8071
|
+
diff -u "$EVIDENCE/host-before.json" "$EVIDENCE/host-after.json"
|
|
8072
|
+
echo "Host configuration changed: investigate before accepting the release."
|
|
8073
|
+
exit 1
|
|
8074
|
+
}
|
|
8075
|
+
docker inspect "$SMOKE_CONTAINER" > "$EVIDENCE/container-after.json"
|
|
7994
8076
|
```
|
|
7995
8077
|
|
|
7996
|
-
|
|
8078
|
+
The fingerprints must match. This proves the enumerated managed settings stayed
|
|
8079
|
+
unchanged; the recorded container configuration separately proves there were no
|
|
8080
|
+
host mounts or shared host namespaces. Do not claim to have hashed the whole
|
|
8081
|
+
home directory, or print settings contents to demonstrate isolation.
|
|
7997
8082
|
|
|
7998
|
-
## Phase 8:
|
|
8083
|
+
## Phase 8: Preserve evidence and remove only the owned container
|
|
7999
8084
|
|
|
8000
|
-
|
|
8001
|
-
|
|
8085
|
+
Run on the host, after leaving the container shell. Confirm ownership before any
|
|
8086
|
+
cleanup, then copy the recorded session, npm provenance metadata, and CLI version.
|
|
8087
|
+
Keep the host evidence directory for the release record.
|
|
8002
8088
|
|
|
8003
8089
|
```bash
|
|
8004
|
-
|
|
8005
|
-
|
|
8006
|
-
|
|
8007
|
-
|
|
8008
|
-
|
|
8009
|
-
|
|
8010
|
-
|
|
8011
|
-
"
|
|
8090
|
+
test "$(docker inspect --format '{{index .Config.Labels "org.softspark.release-smoke"}}' "$SMOKE_CONTAINER")" = "$SMOKE_CONTAINER" || {
|
|
8091
|
+
echo "Container ownership does not match; refusing cleanup."
|
|
8092
|
+
exit 1
|
|
8093
|
+
}
|
|
8094
|
+
docker logs "$SMOKE_CONTAINER" > "$EVIDENCE/container.log" 2>&1
|
|
8095
|
+
mkdir -p "$EVIDENCE/container"
|
|
8096
|
+
docker cp "$SMOKE_CONTAINER:/tmp/ai-toolkit-smoke/evidence/." "$EVIDENCE/container/" || {
|
|
8097
|
+
echo "Evidence transfer failed; keep the container and investigate."
|
|
8098
|
+
exit 1
|
|
8099
|
+
}
|
|
8100
|
+
test -f "$EVIDENCE/container/session.log" || {
|
|
8101
|
+
echo "Session evidence is missing; refusing cleanup."
|
|
8102
|
+
exit 1
|
|
8103
|
+
}
|
|
8104
|
+
docker stop "$SMOKE_CONTAINER"
|
|
8105
|
+
docker rm "$SMOKE_CONTAINER"
|
|
8106
|
+
printf 'Evidence retained: %s\n' "$EVIDENCE"
|
|
8012
8107
|
```
|
|
8013
8108
|
|
|
8109
|
+
There are no host bind mounts or named volumes to delete. Never bypass a
|
|
8110
|
+
destructive-command guard with Python, shutil.rmtree, another interpreter, or a
|
|
8111
|
+
different deletion tool. If a guard rejects cleanup, leave the owned container
|
|
8112
|
+
and evidence in place and report the rejection through the normal approval
|
|
8113
|
+
mechanism. Do not prune Docker resources or delete unrelated temporary files.
|
|
8114
|
+
|
|
8014
8115
|
## Success criteria
|
|
8015
8116
|
|
|
8016
8117
|
| Area | Criterion |
|
|
@@ -8024,12 +8125,12 @@ print(f'removed {sb} ({n} files)')
|
|
|
8024
8125
|
| Pack update | Current version silent; stale version updates and re-records |
|
|
8025
8126
|
| Pack removal | Zero residue in `~/.softspark` and `settings.json`; re-install works |
|
|
8026
8127
|
| Degraded path | Fetch failure is inert, loud in status, and recoverable |
|
|
8027
|
-
| Isolation |
|
|
8128
|
+
| Isolation | Host-side managed-settings fingerprints match; container has no host mounts or shared host namespaces |
|
|
8028
8129
|
|
|
8029
8130
|
## Related
|
|
8030
8131
|
|
|
8031
8132
|
- [Release Preparation](sop-release.md) — run before tagging
|
|
8032
|
-
- [Release Verification](sop-release-verification.md) — the
|
|
8133
|
+
- [Release Verification](sop-release-verification.md) — cross-editor checks of the isolated npm artifact
|
|
8033
8134
|
- [rtk-pack Retirement](../history/completed/rtk-pack-retirement-20260727.md) — what happened the one time this SOP was written and not run
|
|
8034
8135
|
|
|
8035
8136
|
---
|
|
@@ -8142,9 +8243,9 @@ title: "SOP: Release Verification"
|
|
|
8142
8243
|
category: procedures
|
|
8143
8244
|
service: ai-toolkit
|
|
8144
8245
|
tags: [sop, verification, release, smoke-test, install, update, qa, provenance, sarif, dsh]
|
|
8145
|
-
version: "1.8.
|
|
8246
|
+
version: "1.8.2"
|
|
8146
8247
|
created: "2026-04-08"
|
|
8147
|
-
last_updated: "2026-09-
|
|
8248
|
+
last_updated: "2026-09-06"
|
|
8148
8249
|
description: "End-to-end smoke test after installing or updating @softspark/ai-toolkit. Verifies CLI, native Codex and GitHub Copilot surfaces, explicit DSH lifecycle, Claude app export, doctor, validation, tests, eject, provenance, SARIF, and per-skill permissions."
|
|
8149
8250
|
---
|
|
8150
8251
|
|
|
@@ -8162,12 +8263,30 @@ Verifies all critical paths from the user's perspective.
|
|
|
8162
8263
|
|
|
8163
8264
|
**Prerequisites:**
|
|
8164
8265
|
- Node.js >= 18, Python 3, `bats`, git
|
|
8165
|
-
- `@softspark/ai-toolkit` installed
|
|
8266
|
+
- The target version of `@softspark/ai-toolkit` installed in a disposable test environment
|
|
8166
8267
|
|
|
8167
8268
|
**Time:** 10-15 minutes (full), 2 minutes (quick checklist)
|
|
8168
8269
|
|
|
8169
8270
|
---
|
|
8170
8271
|
|
|
8272
|
+
## Verification environment
|
|
8273
|
+
|
|
8274
|
+
Run installation, update, eject and editor smoke checks in a disposable
|
|
8275
|
+
container or VM with its own OS user and default home directory. Do not
|
|
8276
|
+
reassign `HOME` or `CODEX_HOME`, mount the operator's home/authentication
|
|
8277
|
+
directories, or alter the global installation used by an active session.
|
|
8278
|
+
Use the packed release candidate before publication and the exact npm version
|
|
8279
|
+
after publication; the installed package must be the source of runtime checks.
|
|
8280
|
+
Source validation and test commands still run from the matching release checkout.
|
|
8281
|
+
|
|
8282
|
+
A scratch project alone does not isolate home-scoped writes. In particular,
|
|
8283
|
+
the live Augment checks in Phase 9 write user settings. Execute them inside
|
|
8284
|
+
the disposable environment, retain logs outside it, and remove only resources
|
|
8285
|
+
created for this verification run. Do not treat a dry-run as proof that emitted
|
|
8286
|
+
files parse or that a second install is idempotent.
|
|
8287
|
+
|
|
8288
|
+
---
|
|
8289
|
+
|
|
8171
8290
|
## Quick Checklist (TL;DR)
|
|
8172
8291
|
|
|
8173
8292
|
The 14 core commands below must pass. Releases that change DSH must also complete Phase 10.
|
|
@@ -8262,9 +8381,11 @@ ai-toolkit status
|
|
|
8262
8381
|
```
|
|
8263
8382
|
|
|
8264
8383
|
**Verify `--dry-run`:**
|
|
8265
|
-
- [ ]
|
|
8266
|
-
|
|
8267
|
-
|
|
8384
|
+
- [ ] Agent and skill totals match the target package's `app/agents/` and
|
|
8385
|
+
`app/skills/*/SKILL.md` inventory; compare with that release's validator
|
|
8386
|
+
output and README badges, not a number copied from an older release
|
|
8387
|
+
- [ ] Dry-run describes the planned hook merge; the isolated installed copy
|
|
8388
|
+
contains the expected hooks in settings.json
|
|
8268
8389
|
- [ ] "Other AI Tools" lists documented global targets (with `--editors`): aider, antigravity, augment, cline, codex, copilot, cursor, gemini, opencode, roo, windsurf. Scope varies: Codex uses `$CODEX_HOME` (default `~/.codex`) plus `$HOME/.agents/skills`; Copilot uses `$COPILOT_HOME` (default `~/.copilot`); cursor has only `~/.cursor/hooks.json`; antigravity has the `~/.gemini/*/skills` pointer. Cursor and Antigravity rules remain project-only.
|
|
8269
8390
|
|
|
8270
8391
|
**Verify `status`:**
|
|
@@ -8334,9 +8455,12 @@ python3 scripts/audit_skills.py --ci
|
|
|
8334
8455
|
```
|
|
8335
8456
|
|
|
8336
8457
|
**Verify validate.py:**
|
|
8337
|
-
- [ ]
|
|
8338
|
-
|
|
8339
|
-
- [ ]
|
|
8458
|
+
- [ ] Agent, skill and Bats test totals match the current release inventory
|
|
8459
|
+
and README badges, as checked by the validator's metadata contracts
|
|
8460
|
+
- [ ] Hook events/scripts match `app/hooks.json` and the shipped hook files
|
|
8461
|
+
- [ ] Every shipped plugin pack and KB document passes its validator; compare
|
|
8462
|
+
inventory with the release checkout rather than requiring an obsolete
|
|
8463
|
+
fixed minimum number of packs or documents
|
|
8340
8464
|
- [ ] `Errors: 0 | Warnings: 0` → `VALIDATION PASSED`
|
|
8341
8465
|
|
|
8342
8466
|
**Verify audit_skills.py:**
|
|
@@ -8349,7 +8473,7 @@ python3 scripts/audit_skills.py --ci
|
|
|
8349
8473
|
## Phase 6: Tests (3-5 min)
|
|
8350
8474
|
|
|
8351
8475
|
```bash
|
|
8352
|
-
# Run ONCE, capture to file, then parse.
|
|
8476
|
+
# Run ONCE, capture to file, then parse. Use the current release's Bats count;
|
|
8353
8477
|
# re-running it per check (tail / grep ok / grep not ok piped separately)
|
|
8354
8478
|
# wastes minutes every release. Always cache the output.
|
|
8355
8479
|
npm test > /tmp/npm-test.log 2>&1
|
|
@@ -8362,7 +8486,7 @@ echo "exit: $exit"
|
|
|
8362
8486
|
|
|
8363
8487
|
**Verify:**
|
|
8364
8488
|
- [ ] `exit == 0`
|
|
8365
|
-
- [ ] `ok == expected test count`
|
|
8489
|
+
- [ ] `ok == expected test count` from the current release's metadata contracts
|
|
8366
8490
|
- [ ] `not ok == 0`
|
|
8367
8491
|
- [ ] Bats runs tests in parallel (4 jobs)
|
|
8368
8492
|
- [ ] Groups: agents, autodetect, cli, generators, guards, hooks, inject,
|
|
@@ -8473,7 +8597,7 @@ AI_TOOLKIT_STRICT_PIN=1 ai-toolkit update --dry-run
|
|
|
8473
8597
|
|
|
8474
8598
|
These verify the native-surface generators shipped in v3.0.0 actually emit the right files for the right profiles, and that the tool registry stays in sync with shipped generators.
|
|
8475
8599
|
|
|
8476
|
-
>
|
|
8600
|
+
> Run this phase inside the disposable verification environment. `--profile full` with `augment` writes to `$HOME/.augment/settings.json`, so a temporary project on the operator's machine is insufficient. Dry-run checks cover the planned paths; Phases 9.4 and 9.5 must also exercise actual writes in isolation.
|
|
8477
8601
|
|
|
8478
8602
|
### 9.1 `--profile full` emits every native surface
|
|
8479
8603
|
|
|
@@ -8550,7 +8674,9 @@ The bats suite validates JSON shape at generation time. This re-checks that what
|
|
|
8550
8674
|
D=/tmp/aitk-json-${RANDOM} && mkdir -p "$D" && cd "$D" && git init -q
|
|
8551
8675
|
ai-toolkit install --local --editors cursor,windsurf,gemini,augment,codex,copilot --profile full >/dev/null 2>&1
|
|
8552
8676
|
for f in .cursor/hooks.json .devin/hooks.v1.json .gemini/settings.json .codex/hooks.json .github/hooks/ai-toolkit.json "$HOME/.augment/settings.json"; do
|
|
8553
|
-
[ -f "$f" ]
|
|
8677
|
+
[ -f "$f" ] || { echo "MISSING: $f"; exit 1; }
|
|
8678
|
+
python3 -c 'import json, sys; json.load(open(sys.argv[1]))' "$f" || exit 1
|
|
8679
|
+
echo "OK: $f"
|
|
8554
8680
|
done
|
|
8555
8681
|
```
|
|
8556
8682
|
|
|
@@ -8587,15 +8713,17 @@ app-native rules skill, bundled agents/skills, and plugin-relative Cowork hooks.
|
|
|
8587
8713
|
|
|
8588
8714
|
Run this phase whenever the release changes the `dsh` target, package pins, preset lifecycle, or DSH compatibility documentation. Use a new task-specific `DSH_HOME`; never replace `HOME` or reuse a regular profile.
|
|
8589
8715
|
|
|
8590
|
-
Prerequisites: DSH `0.1.
|
|
8716
|
+
Prerequisites: DSH `0.1.2-rc.1`, pnpm `>=11.7.0,<12.0.0`, Codex logged in through ChatGPT, Claude Code logged in natively, and GitHub Copilot CLI logged in natively. Do not supply provider API keys. The lifecycle automatically installs the scoped Claude Agent SDK `0.3.263` override and checks the actual provider and SDK metadata; no manual vendor configuration is needed.
|
|
8591
8717
|
|
|
8592
8718
|
```bash
|
|
8593
8719
|
DSH_SMOKE_ROOT="$(mktemp -d)"
|
|
8594
8720
|
export DSH_HOME="$DSH_SMOKE_ROOT/dsh-home"
|
|
8721
|
+
export AI_TOOLKIT_HOME="$DSH_SMOKE_ROOT/toolkit-state"
|
|
8722
|
+
mkdir -p "$DSH_HOME"
|
|
8595
8723
|
|
|
8596
8724
|
ai-toolkit dsh install --profile web
|
|
8597
8725
|
ai-toolkit dsh doctor --profile web
|
|
8598
|
-
dsh --profile web --host 127.0.0.1 --port 0 --no-open
|
|
8726
|
+
DSH_TELEMETRY_DISABLED=1 dsh --profile web --host 127.0.0.1 --port 0 --no-open
|
|
8599
8727
|
```
|
|
8600
8728
|
|
|
8601
8729
|
In a new `softspark-orchestrator` session, select the `codex` provider and run two standalone marker prompts:
|
|
@@ -8609,7 +8737,7 @@ Stop DSH, then remove only the managed profile artifacts:
|
|
|
8609
8737
|
ai-toolkit dsh uninstall --profile web --yes
|
|
8610
8738
|
```
|
|
8611
8739
|
|
|
8612
|
-
**Verify:** both tool results have `isError=false`, both turns end as `completed`, `doctor` reports no recovery requirement before uninstall, and an unrelated preset fixture remains unchanged. Preserve only redacted event sequence evidence; never attach credentials, auth files, or full private prompts.
|
|
8740
|
+
**Verify:** both tool results have `isError=false`, both turns end as `completed`, `doctor` reports `Claude SDK: compatible (0.3.263)` and no recovery requirement before uninstall, and an unrelated preset fixture remains unchanged. The task-specific `AI_TOOLKIT_HOME` keeps lifecycle state separate from the operator's installation; `HOME` remains unchanged. Preserve only redacted event sequence evidence; never attach credentials, auth files, or full private prompts.
|
|
8613
8741
|
|
|
8614
8742
|
---
|
|
8615
8743
|
|
|
@@ -8682,9 +8810,9 @@ title: "SOP: Release Preparation"
|
|
|
8682
8810
|
category: procedures
|
|
8683
8811
|
service: ai-toolkit
|
|
8684
8812
|
tags: [sop, release, version, publish, changelog, semver, provenance, sarif, ecosystem, shellcheck]
|
|
8685
|
-
version: "1.15.
|
|
8813
|
+
version: "1.15.1"
|
|
8686
8814
|
created: "2026-04-10"
|
|
8687
|
-
last_updated: "2026-09-
|
|
8815
|
+
last_updated: "2026-09-06"
|
|
8688
8816
|
description: "Step-by-step checklist for preparing a new ai-toolkit release — ecosystem-sync drift check, version sync, changelog, artifact regeneration, validation, branch CI, and tagging. Run BEFORE every git tag. Includes mandatory Provenance, SARIF, checksum-pin, ShellCheck, licensing, exact-tag assertions, and a green Ubuntu/macOS branch-CI gate before any release tag is created."
|
|
8689
8817
|
---
|
|
8690
8818
|
|
|
@@ -8694,6 +8822,13 @@ Complete checklist for preparing a new `@softspark/ai-toolkit` release.
|
|
|
8694
8822
|
Run this **before** tagging. After tagging and publishing, run the
|
|
8695
8823
|
[Release Verification SOP](sop-release-verification.md) to smoke-test.
|
|
8696
8824
|
|
|
8825
|
+
Installation smoke uses a disposable container or VM with its own default
|
|
8826
|
+
home directory, as described in the verification SOP. Test the packed release
|
|
8827
|
+
candidate before publishing and the exact npm version afterward. Keep the
|
|
8828
|
+
operator's installed toolkit, editor settings and authentication directories
|
|
8829
|
+
outside that environment. Compare component counts with the current release
|
|
8830
|
+
inventory and validator output instead of historical constants in a checklist.
|
|
8831
|
+
|
|
8697
8832
|
**Pipeline:**
|
|
8698
8833
|
```
|
|
8699
8834
|
Ecosystem Sync SOP (drift check + generator updates)
|
|
@@ -9686,9 +9821,9 @@ title: "AI Toolkit - Architecture Overview"
|
|
|
9686
9821
|
category: reference
|
|
9687
9822
|
service: ai-toolkit
|
|
9688
9823
|
tags: [architecture, overview, design, structure]
|
|
9689
|
-
version: "1.10.
|
|
9824
|
+
version: "1.10.1"
|
|
9690
9825
|
created: "2026-03-23"
|
|
9691
|
-
last_updated: "2026-09-
|
|
9826
|
+
last_updated: "2026-09-06"
|
|
9692
9827
|
description: "Architecture of ai-toolkit: install ownership, runtime adapters, the explicit DSH target, skill tiers, and project integration."
|
|
9693
9828
|
---
|
|
9694
9829
|
|
|
@@ -9998,7 +10133,7 @@ Agents (code-reviewer, debugger, devops-implementer, ...)
|
|
|
9998
10133
|
|
|
9999
10134
|
## Quality Hooks
|
|
10000
10135
|
|
|
10001
|
-
|
|
10136
|
+
28 entries across 14 lifecycle events. See [hooks-catalog.md](hooks-catalog.md) for full details.
|
|
10002
10137
|
|
|
10003
10138
|
| Hook | Trigger | Script | Action |
|
|
10004
10139
|
|------|---------|--------|--------|
|
|
@@ -11939,9 +12074,9 @@ title: "AI Toolkit - DSH Compatibility"
|
|
|
11939
12074
|
category: reference
|
|
11940
12075
|
service: ai-toolkit
|
|
11941
12076
|
tags: [dsh, deepseek-harness, subscriptions, lifecycle, compatibility]
|
|
11942
|
-
version: "1.
|
|
12077
|
+
version: "1.8.0"
|
|
11943
12078
|
created: "2026-08-31"
|
|
11944
|
-
last_updated: "2026-09-
|
|
12079
|
+
last_updated: "2026-09-06"
|
|
11945
12080
|
description: "Compatibility contract for project skills and the explicit SoftSpark package lifecycle in DeepSeek Harness."
|
|
11946
12081
|
---
|
|
11947
12082
|
|
|
@@ -11951,14 +12086,14 @@ description: "Compatibility contract for project skills and the explicit SoftSpa
|
|
|
11951
12086
|
|
|
11952
12087
|
ai-toolkit supports DeepSeek Harness as an explicit developer-preview target. The integration is maintained by SoftSpark as a community compatibility layer. DeepSeek AI has not endorsed it.
|
|
11953
12088
|
|
|
11954
|
-
The
|
|
12089
|
+
The 4.33.0 lifecycle targets DSH `0.1.2-rc.1`, with the exact package pair below. Other upstream prereleases require their own qualification. Historical marker roundtrips from 2026-09-01 used DSH `0.1.1-rc.2`; version-specific evidence is recorded under Qualification below.
|
|
11955
12090
|
|
|
11956
12091
|
## Project vs Profile Outputs
|
|
11957
12092
|
|
|
11958
12093
|
| Surface | Command | Managed output | Explicit non-output |
|
|
11959
12094
|
|---|---|---|---|
|
|
11960
12095
|
| Project install | `ai-toolkit install --local --editors dsh` | `CLAUDE.md`, `.claude/settings.local.json`, `.claude/constitution.md`, detected language rules, other generic local outputs, and the DSH-specific one-level `.agents/skills/<name>/SKILL.md` catalog with bundled resources | No `$DSH_HOME` writes, npm package changes, profile changes, preset changes, or credential reads |
|
|
11961
|
-
| DSH profile | `ai-toolkit dsh install --profile web` | Two exact npm dependencies
|
|
12096
|
+
| DSH profile | `ai-toolkit dsh install --profile web` | Two exact npm dependencies, the scoped Claude SDK override and missing profile initialization files, the released `softspark-orchestrator` preset, and ai-toolkit ownership state | No project files, provider login, API keys, unrelated plugins, or user presets |
|
|
11962
12097
|
|
|
11963
12098
|
DSH is excluded from `--editors all`, auto-detection, default profiles, and default editor selection. Naming `dsh` without `--local` is not a supported project install route.
|
|
11964
12099
|
|
|
@@ -11986,13 +12121,31 @@ The DSH profile defaults to `web` when `--profile` is omitted. `DSH_HOME` select
|
|
|
11986
12121
|
|
|
11987
12122
|
| Component | Reviewed version | Role |
|
|
11988
12123
|
|---|---:|---|
|
|
11989
|
-
| DeepSeek Harness | `0.1.
|
|
12124
|
+
| DeepSeek Harness | `0.1.2-rc.1` | Profile host and plugin manager |
|
|
11990
12125
|
| pnpm | `>=11.7.0,<12.0.0` | Package manager used by the DSH plugin command |
|
|
11991
|
-
| `@softspark/dsh-codex` | `1.
|
|
11992
|
-
| `@softspark/dsh-orchestrator` | `
|
|
12126
|
+
| `@softspark/dsh-codex` | `1.5.0` | Codex parent provider through local `codex app-server` |
|
|
12127
|
+
| `@softspark/dsh-orchestrator` | `2.0.0` | Claude Code and GitHub Copilot Gemini delegation bundle plus released preset |
|
|
12128
|
+
| Claude Agent SDK | `0.3.263` | Exact profile override for the DSH Claude provider's bundled CLI |
|
|
11993
12129
|
|
|
11994
12130
|
Install and update use exact package arguments with `--save-exact`. Arbitrary DSH prereleases and unpinned SoftSpark packages are outside this contract.
|
|
11995
12131
|
|
|
12132
|
+
Install and update also configure the exact profile selector
|
|
12133
|
+
`@deepseek-ai/dsh-subagent-claude-code@0.1.2-rc.1>@anthropic-ai/claude-agent-sdk`
|
|
12134
|
+
to `0.3.263`. DSH's original SDK `0.3.241` embeds Claude Code `2.1.241`, which
|
|
12135
|
+
current models reject even when the standalone Claude command is up to date.
|
|
12136
|
+
The override is applied through pnpm's JSON configuration API. Unrelated
|
|
12137
|
+
settings and overrides are preserved; an incompatible SDK override or an
|
|
12138
|
+
explicit non-hoisted package layout fails with guidance before modification.
|
|
12139
|
+
The installed SDK's actual package metadata is checked before state is committed.
|
|
12140
|
+
|
|
12141
|
+
Upgrade the DSH runtime to `0.1.2-rc.1` before running this release's profile
|
|
12142
|
+
update. Ownership records for the earlier exact package pair remain valid and
|
|
12143
|
+
are migrated by `ai-toolkit dsh update`. On failure, rollback uses the versions
|
|
12144
|
+
recorded before the operation. The optional `dsh-file-preview` and
|
|
12145
|
+
`dsh-process-console` UI bundles are separate profile additions; their `2.0.0`
|
|
12146
|
+
line targets the new DSH client APIs, and the toolkit preserves them as unrelated
|
|
12147
|
+
dependencies.
|
|
12148
|
+
|
|
11996
12149
|
The reviewed DSH tag declares `pnpm@11.7.0`. The isolated cold-install environment used Corepack pnpm `11.24.0`, so the lifecycle accepts stable pnpm releases from `11.7.0` through the end of major 11. Before it creates the lifecycle lock or changes a profile, it resolves exact DSH and pnpm command paths from the minimal child `PATH`, records their command and resolved-file identities, and runs their version probes with a five-second bound. Missing, nonzero, timed-out, malformed, or unsupported pnpm probes fail with no package, preset, state, or lifecycle artifact.
|
|
11997
12150
|
|
|
11998
12151
|
## Subscription and Authentication Boundaries
|
|
@@ -12047,6 +12200,17 @@ The DSH record stores the canonical DSH home, profile, exact package versions, p
|
|
|
12047
12200
|
|
|
12048
12201
|
The published npm packages own their installed code. The canonical preset source is `@softspark/dsh-orchestrator/agent-presets/softspark-orchestrator` inside the exact installed package. ai-toolkit copies and verifies that tree. It does not reconstruct the preset.
|
|
12049
12202
|
|
|
12203
|
+
Missing profile initialization files are created exclusively under pinned
|
|
12204
|
+
directories using the qualified DSH profile schema before invoking the external
|
|
12205
|
+
configuration command. A file appearing concurrently is never adopted as owned,
|
|
12206
|
+
even when its bytes match. The transaction snapshots `pnpm-workspace.yaml` bytes, mode and file identity in
|
|
12207
|
+
addition to package state. Ordinary failures restore that prestate through the
|
|
12208
|
+
same guarded file restoration used for the profile manifest. Default profile
|
|
12209
|
+
files created during initialization are removed only while their recorded
|
|
12210
|
+
identities still match. Unexpected settings changes or ambiguous failed
|
|
12211
|
+
external writes remain preserved behind a recovery marker. Configuration
|
|
12212
|
+
contents are never copied into lifecycle state, receipts, or error messages.
|
|
12213
|
+
|
|
12050
12214
|
Mutations first take a nonblocking exclusive POSIX `flock` on the already pinned `DSH_HOME` directory descriptor, then claim the bounded canonical lifecycle lock and use the shared state lock with compare-and-swap publication. Directory locking is independent of the replaceable lock filename. It remains held across sentinel scans, package and preset mutation, normal canonical-lock release, or recovery-sentinel creation plus file and directory `fsync`. A competing lifecycle must acquire the same directory lock before it can scan recovery state or claim the canonical name. The immutable prerequisite record is revalidated after lock acquisition and before every package mutation or package rollback. A replaced or removed executable, or a new earlier `pnpm` PATH shadow, blocks the command. The verified pnpm command directory is placed first in the child PATH so DSH's literal `pnpm` lookup resolves to the probed command. Install, update, and uninstall verify the profile manifest, package trees, preset identity, and unrelated dependencies before and after each external package-manager command. Rollback restores the immutable pre-operation target. It does not reinterpret concurrent bytes as owned data.
|
|
12051
12215
|
|
|
12052
12216
|
Each DSH plugin add, update, remove, or rollback command has a 300-second process bound, separate from the short prerequisite probe. This bound accommodates cold package resolution without promising registry or network latency. Every mutation starts DSH in a dedicated POSIX session and process group. A timeout or interruption signals the complete group, escalates from `SIGTERM` to `SIGKILL` when needed, and waits for confirmed group exit before rollback. If exit cannot be confirmed, package rollback is blocked and deterministic inspection steps are reported. Child stdout and stderr remain suppressed from user-facing errors.
|
|
@@ -12080,8 +12244,17 @@ The first native target also excludes DSH hook bridging, MCP bridging, arbitrary
|
|
|
12080
12244
|
|
|
12081
12245
|
`ai-toolkit dsh doctor` is read-only. It reports the DSH runtime version, pnpm availability and version, package pins, package-tree and preset ownership, state consistency, lifecycle lock recovery artifacts, staging paths, and recovery markers. A recovery marker keeps `Recovery needed: yes` visible until the operator resolves the named paths.
|
|
12082
12246
|
|
|
12247
|
+
Doctor also checks the required SDK override and installed SDK version. It
|
|
12248
|
+
queries pnpm directly only when the profile directory exists. It never uses
|
|
12249
|
+
`dsh plugin` for inspection, because that command initializes missing profiles.
|
|
12250
|
+
|
|
12083
12251
|
`ai-toolkit dsh uninstall --yes` removes only the recorded SoftSpark packages, preset, and profile state. Drift or ownership ambiguity stops removal. Unrelated profile dependencies, patch files, presets, and state keys remain unchanged.
|
|
12084
12252
|
|
|
12253
|
+
Successful uninstall retains the scoped SDK compatibility setting and the
|
|
12254
|
+
profile's pnpm layout. They are runtime prerequisites for a later reinstall,
|
|
12255
|
+
not ownership of the user's entire profile. Failed operations restore their
|
|
12256
|
+
pre-operation configuration unless concurrent edits make that unsafe.
|
|
12257
|
+
|
|
12085
12258
|
## Verification
|
|
12086
12259
|
|
|
12087
12260
|
Run the static and isolated checks without modifying a regular DSH profile:
|
|
@@ -12099,11 +12272,45 @@ ai-toolkit dsh doctor --profile web
|
|
|
12099
12272
|
ai-toolkit dsh uninstall --profile web --dry-run --yes
|
|
12100
12273
|
```
|
|
12101
12274
|
|
|
12102
|
-
|
|
12275
|
+
### Historical qualification, 2026-09-01
|
|
12276
|
+
|
|
12277
|
+
The earlier DSH `0.1.1-rc.2` package pair completed real-profile qualification
|
|
12278
|
+
with a task-specific `DSH_HOME`, exact published package artifacts, and native
|
|
12279
|
+
vendor logins. The pre-tag candidate and registry package produced successful
|
|
12280
|
+
child and parent markers through `subagent_claude_code` and
|
|
12281
|
+
`subagent_gemini_copilot`. No provider API key was supplied or handled; the
|
|
12282
|
+
isolated processes stopped and the unrelated profile fixture remained intact.
|
|
12283
|
+
|
|
12284
|
+
### DSH 0.1.2-rc.1 qualification
|
|
12285
|
+
|
|
12286
|
+
On 2026-09-06, the installed 4.33.0 candidate completed install, doctor,
|
|
12287
|
+
update, doctor, a controlled second-package failure with real pnpm rollback,
|
|
12288
|
+
doctor and uninstall against the published Codex 1.5.0/orchestrator 2.0.0
|
|
12289
|
+
pair. Rollback preserved the manifest, pnpm settings, ownership state and
|
|
12290
|
+
unrelated preset byte for byte. Doctor reported the exact package versions,
|
|
12291
|
+
Claude SDK 0.3.263 and no recovery requirement. Uninstall removed the managed
|
|
12292
|
+
packages, preset and profile ownership while retaining the unrelated preset
|
|
12293
|
+
and runtime SDK prerequisite. Both state roots were disposable; HOME stayed
|
|
12294
|
+
unchanged.
|
|
12295
|
+
|
|
12296
|
+
The composed web host returned the Claude and Gemini child markers through
|
|
12297
|
+
the Codex parent. Browser checks covered cancellation, restart, the native
|
|
12298
|
+
child transcript and preservation of the parent session. The DSH package
|
|
12299
|
+
verification records retain those runtime results and their separate exact
|
|
12300
|
+
registry signature/provenance checks.
|
|
12301
|
+
|
|
12302
|
+
The toolkit candidate also passed 1,989 Bats and 354 Python tests. An
|
|
12303
|
+
unmounted disposable container passed global install, status, doctor, local
|
|
12304
|
+
installation for all editors, repeated installation, eject and the official
|
|
12305
|
+
Claude 2.1.263 plugin validator. Exact published toolkit artifact results are
|
|
12306
|
+
recorded on the 4.33.0 release page after publication.
|
|
12103
12307
|
|
|
12104
12308
|
## Preview and Upstream Drift
|
|
12105
12309
|
|
|
12106
|
-
DeepSeek Harness
|
|
12310
|
+
DeepSeek Harness is a developer preview with compatibility-breaking changes.
|
|
12311
|
+
On 2026-09-06, npm `latest` pointed to `0.1.2-rc.1`. GitHub also listed
|
|
12312
|
+
`0.1.3-alpha.1`, but that exact CLI version was absent from npm. It is outside
|
|
12313
|
+
this lifecycle contract.
|
|
12107
12314
|
|
|
12108
12315
|
Use the registry doctor to detect documentation, capability-marker, and local version changes. A new upstream version requires source review, focused fixture updates, isolated real-profile qualification, and explicit pin changes before support moves.
|
|
12109
12316
|
|
|
@@ -12111,10 +12318,10 @@ Use the registry doctor to detect documentation, capability-marker, and local ve
|
|
|
12111
12318
|
|
|
12112
12319
|
- [DeepSeek Harness documentation](https://deepseek-harness.github.io/deepseek-harness/)
|
|
12113
12320
|
- [DeepSeek Harness releases](https://github.com/deepseek-ai/deepseek-harness/releases)
|
|
12114
|
-
- [Reviewed DSH 0.1.
|
|
12115
|
-
- [Reviewed DSH package-manager declaration](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.
|
|
12116
|
-
- [Reviewed DSH CLI profile and plugin contract](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.
|
|
12117
|
-
- [Reviewed DSH skill discovery contract](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.
|
|
12321
|
+
- [Reviewed DSH 0.1.2-rc.1 release](https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.1.2-rc.1)
|
|
12322
|
+
- [Reviewed DSH package-manager declaration](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.2-rc.1/package.json)
|
|
12323
|
+
- [Reviewed DSH CLI profile and plugin contract](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.2-rc.1/apps/cli/reference/README.md)
|
|
12324
|
+
- [Reviewed DSH skill discovery contract](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.2-rc.1/docs/subsystems/skills.md)
|
|
12118
12325
|
- [PATH: kb/reference/manifest-install.md]
|
|
12119
12326
|
- [PATH: kb/history/completed/dsh-native-install-target-plan.md]
|
|
12120
12327
|
|
|
@@ -14066,7 +14273,7 @@ service: ai-toolkit
|
|
|
14066
14273
|
tags: [rules, languages, coding-style, testing, patterns, security]
|
|
14067
14274
|
version: "2.2.0"
|
|
14068
14275
|
created: "2026-04-07"
|
|
14069
|
-
last_updated: "2026-09-
|
|
14276
|
+
last_updated: "2026-09-06"
|
|
14070
14277
|
description: "Reference for the language-specific rules system: 13 per-language rule sets shipped as knowledge skills, plus common rules installed as Claude Code path-scoped project rules."
|
|
14071
14278
|
---
|
|
14072
14279
|
|
|
@@ -14139,6 +14346,12 @@ app/rules/
|
|
|
14139
14346
|
|
|
14140
14347
|
## Rule Categories
|
|
14141
14348
|
|
|
14349
|
+
The common security rules distinguish safe, actionable failure messages from
|
|
14350
|
+
private diagnostics. Common testing rules cover API error contracts and prohibit
|
|
14351
|
+
overlapping runners that reset a shared database. The `api-patterns` skill carries
|
|
14352
|
+
the focused error-contract guidance; the `review` checklist checks the same
|
|
14353
|
+
failure boundaries. These are content rules, not new hooks or runtime permissions.
|
|
14354
|
+
|
|
14142
14355
|
| Category | Filename | Content |
|
|
14143
14356
|
|----------|----------|---------|
|
|
14144
14357
|
| `coding-style` | `coding-style.md` | Naming, formatting, idiomatic constructs, linter config |
|
|
@@ -16265,7 +16478,7 @@ service: ai-toolkit
|
|
|
16265
16478
|
tags: [skills, domain-knowledge, catalog, task-skills, hybrid-skills]
|
|
16266
16479
|
version: "1.5.0"
|
|
16267
16480
|
created: "2026-03-23"
|
|
16268
|
-
last_updated: "2026-
|
|
16481
|
+
last_updated: "2026-09-06"
|
|
16269
16482
|
description: "Complete skills catalog with task, hybrid, and knowledge skills. Includes Codex adaptation notes, effort levels, skill-scoped hooks, executable scripts, security auditor, and persona presets."
|
|
16270
16483
|
---
|
|
16271
16484
|
|
|
@@ -16383,7 +16596,7 @@ Hybrid skills combine slash-command invocation with domain knowledge that agents
|
|
|
16383
16596
|
| Skill | Directory | Domain |
|
|
16384
16597
|
|-------|-----------|--------|
|
|
16385
16598
|
| **app-builder** | `skills/app-builder/` | Full-stack application architecture |
|
|
16386
|
-
| **api-patterns** | `skills/api-patterns/` |
|
|
16599
|
+
| **api-patterns** | `skills/api-patterns/` | API design, versioning, actionable error contracts and safe retries; focused `reference/error-contracts.md` |
|
|
16387
16600
|
| **database-patterns** | `skills/database-patterns/` | Schema design, indexing, query optimization |
|
|
16388
16601
|
| **flutter-patterns** | `skills/flutter-patterns/` | Flutter/Dart architecture, state management |
|
|
16389
16602
|
| **ecommerce-patterns** | `skills/ecommerce-patterns/` | E-commerce: catalog, cart, checkout, payments |
|