xtrm-tools 0.7.16 → 0.7.18
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/.xtrm/config/hooks.json +2 -0
- package/.xtrm/config/instructions/agents-top.md +2 -1
- package/.xtrm/registry.json +432 -707
- package/.xtrm/skills/default/creating-service-skills/scripts/bootstrap.py +82 -156
- package/.xtrm/skills/default/creating-service-skills/scripts/scaffolder.py +73 -121
- package/.xtrm/skills/default/hook-development/references/patterns.md +1 -1
- package/.xtrm/skills/default/last30days/scripts/test-v1-vs-v2.sh +2 -2
- package/.xtrm/skills/default/planning/SKILL.md +75 -29
- package/.xtrm/skills/default/releasing/SKILL.md +163 -57
- package/.xtrm/skills/default/security-pipeline/SKILL.md +192 -0
- package/.xtrm/skills/default/security-pipeline/scripts/security-bootstrap.sh +294 -0
- package/.xtrm/skills/default/security-pipeline/templates/.githooks/pre-push.template +39 -0
- package/.xtrm/skills/default/security-pipeline/templates/.github/workflows/gitleaks.yml +33 -0
- package/.xtrm/skills/default/security-pipeline/templates/.github/workflows/osv-scanner.yml +33 -0
- package/.xtrm/skills/default/security-pipeline/templates/.github/workflows/semgrep.yml +41 -0
- package/.xtrm/skills/default/security-pipeline/templates/.gitleaks.toml +44 -0
- package/.xtrm/skills/default/security-pipeline/templates/.pre-commit-config.yaml +67 -0
- package/.xtrm/skills/default/security-pipeline/templates/.semgrepignore +46 -0
- package/.xtrm/skills/default/security-pipeline/templates/scripts/security-scan.sh +57 -0
- package/.xtrm/skills/default/security-pipeline/templates/scripts/semgrep-diff.sh +68 -0
- package/.xtrm/skills/default/session-close-report/SKILL.md +167 -6
- package/.xtrm/skills/default/sync-docs/SKILL.md +1 -1
- package/.xtrm/skills/default/update-specialists/SKILL.md +204 -77
- package/.xtrm/skills/default/update-xt/SKILL.md +270 -4
- package/.xtrm/skills/default/updating-service-skills/scripts/drift_detector.py +22 -0
- package/.xtrm/skills/default/using-kpi/SKILL.md +47 -5
- package/.xtrm/skills/default/using-script-specialists/SKILL.md +7 -5
- package/.xtrm/skills/default/using-specialists/SKILL.md +13 -12
- package/.xtrm/skills/default/using-specialists-auto/SKILL.md +137 -0
- package/.xtrm/skills/default/using-specialists-v2/SKILL.md +15 -22
- package/.xtrm/skills/default/using-specialists-v3/SKILL.md +1074 -0
- package/.xtrm/skills/default/vaultctl/SKILL.md +2 -2
- package/CHANGELOG.md +91 -3
- package/cli/dist/index.cjs +12425 -3770
- package/cli/dist/index.cjs.map +1 -1
- package/cli/package.json +9 -3
- package/package.json +27 -7
- package/packages/pi-extensions/extensions/xtrm-ui/index.ts +76 -1
- package/packages/pi-extensions/package.json +1 -1
- package/.xtrm/config/pi/extensions/custom-footer/.pi/structured-returns/83051fe4-97da-4e2c-bdaa-343b32f4e714.combined.log +0 -7
- package/.xtrm/config/pi/extensions/custom-footer/.pi/structured-returns/83051fe4-97da-4e2c-bdaa-343b32f4e714.stderr.log +0 -0
- package/.xtrm/config/pi/extensions/custom-footer/.pi/structured-returns/83051fe4-97da-4e2c-bdaa-343b32f4e714.stdout.log +0 -7
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/LICENSE +0 -22
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/README.md +0 -29
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.d.ts +0 -3
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.js +0 -2
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.d.ts +0 -8
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.js +0 -27
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.d.ts +0 -11
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.js +0 -100
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.d.ts +0 -25
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.js +0 -104
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.d.ts +0 -10
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.js +0 -293
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.d.ts +0 -10
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.js +0 -26
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.d.ts +0 -7
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.js +0 -51
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.d.ts +0 -7
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.js +0 -60
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.d.ts +0 -7
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.js +0 -38
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.d.ts +0 -5
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.js +0 -33
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.d.ts +0 -24
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.js +0 -30
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.d.ts +0 -11
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.js +0 -43
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.d.ts +0 -8
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.js +0 -41
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.d.ts +0 -8
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.js +0 -53
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.d.ts +0 -8
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.js +0 -27
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.d.ts +0 -7
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.js +0 -53
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.d.ts +0 -8
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.js +0 -60
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.d.ts +0 -7
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.js +0 -38
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.d.ts +0 -6
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.js +0 -257
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.d.ts +0 -8
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.js +0 -71
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.d.ts +0 -6
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.js +0 -173
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.d.ts +0 -26
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.js +0 -195
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.d.ts +0 -121
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.js +0 -2
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.d.ts +0 -2
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.js +0 -18
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.d.ts +0 -8
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.js +0 -110
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.d.ts +0 -2
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.js +0 -32
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.d.ts +0 -2
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.js +0 -13
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.d.ts +0 -2
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.js +0 -7
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.d.ts +0 -5
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.js +0 -58
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.d.ts +0 -2
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.js +0 -27
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.d.ts +0 -2
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.d.ts.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.js +0 -8
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.js.map +0 -1
- package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/package.json +0 -40
- package/.xtrm/skills/default/planning/evals/evals.json +0 -19
- package/.xtrm/skills/default/quality-gates/evals/evals.json +0 -181
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/FINAL-EVAL-SUMMARY.md +0 -75
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/edge-case-auto-fix-verification/with_skill/outputs/response.md +0 -59
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/edge-case-mixed-language-project/with_skill/outputs/response.md +0 -60
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/eval-summary.md +0 -105
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/partial-install-python-only/with_skill/outputs/response.md +0 -93
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/python-refactor-request/with_skill/outputs/response.md +0 -104
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/quality-gate-error-fix/with_skill/outputs/response.md +0 -74
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/should-not-trigger-general-chat/with_skill/outputs/response.md +0 -18
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/should-not-trigger-math-question/with_skill/outputs/response.md +0 -18
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/should-not-trigger-unrelated-coding/with_skill/outputs/response.md +0 -56
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/tdd-guard-blocking-confusion/with_skill/outputs/response.md +0 -67
- package/.xtrm/skills/default/quality-gates/workspace/iteration-1/typescript-feature-with-tests/with_skill/outputs/response.md +0 -97
- package/.xtrm/skills/default/sync-docs/evals/evals.json +0 -89
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/benchmark.json +0 -293
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/benchmark.md +0 -13
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/eval_metadata.json +0 -27
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/outputs/result.md +0 -210
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/grading.json +0 -28
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/timing.json +0 -1
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/outputs/result.md +0 -101
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/grading.json +0 -28
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/timing.json +0 -5
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/timing.json +0 -5
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/eval_metadata.json +0 -27
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/outputs/result.md +0 -198
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/grading.json +0 -28
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/timing.json +0 -1
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/outputs/result.md +0 -94
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/grading.json +0 -28
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/timing.json +0 -1
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/eval_metadata.json +0 -27
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/outputs/result.md +0 -237
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/grading.json +0 -28
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/timing.json +0 -1
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/outputs/result.md +0 -134
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/grading.json +0 -28
- package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/timing.json +0 -1
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/benchmark.json +0 -297
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/benchmark.md +0 -13
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/eval_metadata.json +0 -27
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/outputs/result.md +0 -137
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/grading.json +0 -92
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/timing.json +0 -1
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/outputs/result.md +0 -134
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/grading.json +0 -86
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/timing.json +0 -1
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/eval_metadata.json +0 -27
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/outputs/result.md +0 -193
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/grading.json +0 -72
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/timing.json +0 -1
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/outputs/result.md +0 -211
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/grading.json +0 -91
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/timing.json +0 -5
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/eval_metadata.json +0 -27
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/outputs/result.md +0 -182
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/grading.json +0 -95
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/timing.json +0 -1
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/outputs/result.md +0 -222
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/grading.json +0 -88
- package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/timing.json +0 -5
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/benchmark.json +0 -298
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/benchmark.md +0 -13
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/eval_metadata.json +0 -27
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/outputs/result.md +0 -125
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/grading.json +0 -97
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/timing.json +0 -5
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/outputs/result.md +0 -144
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/grading.json +0 -78
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/timing.json +0 -5
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/eval_metadata.json +0 -27
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/outputs/result.md +0 -104
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/grading.json +0 -91
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/timing.json +0 -5
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/outputs/result.md +0 -79
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/grading.json +0 -82
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/timing.json +0 -5
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/eval_metadata.json +0 -27
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase1_context.json +0 -302
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase2_drift.txt +0 -33
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase3_analysis.json +0 -114
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase4_fix.txt +0 -118
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase5_validate.txt +0 -38
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/result.md +0 -158
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/grading.json +0 -95
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/timing.json +0 -5
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/outputs/result.md +0 -71
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/grading.json +0 -90
- package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/timing.json +0 -5
- package/.xtrm/skills/default/test-planning/evals/evals.json +0 -23
- package/.xtrm/skills/default/using-specialists/SKILL.safe.md +0 -1082
- package/.xtrm/skills/default/using-specialists/SKILL.ultra.md +0 -1082
- package/.xtrm/skills/default/using-specialists/evals/evals.json +0 -68
- package/packages/pi-extensions/.serena/project.yml +0 -130
|
@@ -28,7 +28,8 @@ This is what a correctly installed project looks like. Check each item.
|
|
|
28
28
|
| `.xtrm/skills/active/` | Flat directory of symlinks to `../default/<skill>` |
|
|
29
29
|
| `active/pi/` subdirectory | Must NOT exist (stale — old runtime split) |
|
|
30
30
|
| `active/claude/` subdirectory | Must NOT exist (stale — old runtime split) |
|
|
31
|
-
| `.pi/settings.json` `.skills` array | Must include `"../.xtrm/skills/active"` |
|
|
31
|
+
| `.pi/settings.json` `.skills` array | Must include `"../.xtrm/skills/active"` (project-local, wins) |
|
|
32
|
+
| `.pi/settings.json` `.skills` array | Must include `"~/.xtrm/skills/default"` (user-level fallback — xtrm-4h6u) |
|
|
32
33
|
| `.pi/settings.json` `.skills` array | Must NOT include `"../.xtrm/skills/active/pi"` (old path) |
|
|
33
34
|
|
|
34
35
|
### Hooks wiring
|
|
@@ -65,10 +66,10 @@ readlink .claude/skills
|
|
|
65
66
|
ls .xtrm/skills/active/pi 2>/dev/null && echo "STALE: active/pi exists"
|
|
66
67
|
ls .xtrm/skills/active/claude 2>/dev/null && echo "STALE: active/claude exists"
|
|
67
68
|
|
|
68
|
-
# 5. Pi settings skills
|
|
69
|
+
# 5. Pi settings skills entries (both must be present since xtrm-4h6u)
|
|
69
70
|
node -e "const s=require('./.pi/settings.json'); console.log(s.skills)" 2>/dev/null
|
|
70
|
-
# Expected to include: ../.xtrm/skills/active
|
|
71
|
-
# Stale if includes: ../.xtrm/skills/active/pi
|
|
71
|
+
# Expected to include BOTH: ../.xtrm/skills/active AND ~/.xtrm/skills/default
|
|
72
|
+
# Stale if only first entry present, or if includes: ../.xtrm/skills/active/pi
|
|
72
73
|
|
|
73
74
|
# 6. Active view integrity (all entries must be valid symlinks)
|
|
74
75
|
for f in .xtrm/skills/active/*; do [ -L "$f" ] || echo "NOT A SYMLINK: $f"; done
|
|
@@ -167,6 +168,16 @@ cd cli && npm run build
|
|
|
167
168
|
xt init -y # now runs with updated code
|
|
168
169
|
```
|
|
169
170
|
|
|
171
|
+
**Worktree caveat**: `npm run build` from inside `.xtrm/worktrees/<name>/cli/` is blocked by a guard script — building from a worktree contaminates dist with worktree-specific absolute paths. If you're working in a worktree, build from a detached worktree outside `.xtrm/`:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
git worktree add --detach /tmp/xt-build HEAD
|
|
175
|
+
cd /tmp/xt-build/cli && npm ci && npm run build
|
|
176
|
+
cp dist/index.cjs <worktree-root>/cli/dist/index.cjs
|
|
177
|
+
cp dist/index.cjs.map <worktree-root>/cli/dist/index.cjs.map
|
|
178
|
+
git worktree remove /tmp/xt-build --force
|
|
179
|
+
```
|
|
180
|
+
|
|
170
181
|
## Verification
|
|
171
182
|
|
|
172
183
|
After all fixes, confirm canonical state is restored:
|
|
@@ -198,6 +209,261 @@ If `xt status` still shows drift after targeted fixes, run the full sync:
|
|
|
198
209
|
xt init
|
|
199
210
|
```
|
|
200
211
|
|
|
212
|
+
## Multi-Repo Sweep (Fleet Update)
|
|
213
|
+
|
|
214
|
+
For updating **many repos at once** after an xtrm-tools upgrade — much lighter than
|
|
215
|
+
running `xt init -y` per repo. The right pattern when you've just rebuilt xtrm-tools
|
|
216
|
+
locally or pulled a new tag.
|
|
217
|
+
|
|
218
|
+
### Dry-run discovery first
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
xt update --root ~/dev # walk the tree
|
|
222
|
+
xt update --root ~/projects/mercury # walk another tree
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Output classifies each discovered repo by `.xtrm/` state:
|
|
226
|
+
|
|
227
|
+
| Status | Meaning | Action |
|
|
228
|
+
|--------|---------|--------|
|
|
229
|
+
| `refreshed` | `.xtrm/registry.json` present; drift vs current package detected | `--apply` will reinstall managed assets |
|
|
230
|
+
| `already-current` | `.xtrm/registry.json` present; no drift | no action |
|
|
231
|
+
| `incomplete` | `.xtrm/` directory exists but `.xtrm/registry.json` is missing | `xt init -y` now seeds registry.json automatically (xtrm-ya2i, xtrm-tools ≥ 0.7.18). Older `.xtrm/` dirs created before that fix still need the recipe below. |
|
|
232
|
+
| `failed` | Hard error during drift check or install | inspect reason — common: PACK metadata drift, missing source files, fs-extra refusing to copy onto a symlink |
|
|
233
|
+
|
|
234
|
+
Transient worktree paths under `.worktrees/` (specialists) or `.xtrm/worktrees/`
|
|
235
|
+
(`xt claude` / `xt pi`) are **skipped** automatically — they're not real repos to
|
|
236
|
+
refresh.
|
|
237
|
+
|
|
238
|
+
### Apply
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
xt update --apply --root ~/dev
|
|
242
|
+
xt update --apply --root ~/projects/mercury
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
What `--apply` does for each managed repo:
|
|
246
|
+
- Runs the install flow with `force=true` — refreshes `.xtrm/config`, `.xtrm/hooks`, `.xtrm/skills/default` (mirror), `.pi/settings.json`, `.mcp.json`.
|
|
247
|
+
- Writes `dolt.shared-server: true` into `.beads/config.yaml` if not already set (so the worktree's bd routes to the shared dolt server instead of spawning per-worktree subprocesses).
|
|
248
|
+
- Globally installs any missing xt-managed Pi packages.
|
|
249
|
+
- Does NOT touch `incomplete` repos (deliberate — auto-fix would be destructive).
|
|
250
|
+
|
|
251
|
+
### Bootstrapping `incomplete` repos
|
|
252
|
+
|
|
253
|
+
Two scenarios:
|
|
254
|
+
|
|
255
|
+
**A. The repo legitimately needs full xtrm management:**
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
cd <repo>
|
|
259
|
+
xt init -y # scaffolds .xtrm/{config,hooks,skills} AND seeds registry.json
|
|
260
|
+
xt update --apply --repo . # bring everything in sync (registry-driven)
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
`xt init -y` now snapshots `.xtrm/registry.json` from the installed xtrm-tools package automatically (xtrm-ya2i). The previous manual `cp /path/to/xtrm-tools/.xtrm/registry.json .xtrm/` step is no longer needed on xtrm-tools ≥ 0.7.18. If you're on an older version (or the registry is missing for some other reason), fall back to:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
cp "$(npm root -g)/xtrm-tools/.xtrm/registry.json" .xtrm/
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
**B. The repo is intentionally not xtrm-managed.** Leave the `.xtrm/` partial dir
|
|
270
|
+
alone; `incomplete` is just a status row, not an error. If you want it to stop
|
|
271
|
+
appearing, remove the orphaned `.xtrm/` directory.
|
|
272
|
+
|
|
273
|
+
### When a repo fails
|
|
274
|
+
|
|
275
|
+
Common failure modes and fixes:
|
|
276
|
+
|
|
277
|
+
| Error | Cause | Fix |
|
|
278
|
+
|-------|-------|-----|
|
|
279
|
+
| `Source and destination must not be the same` | `npm link`'d xtrm-tools + repo has symlinked `.xtrm/skills/default → xtrm-tools` (link chain collapses to same canonical path) | Functionally fine — repo is already in sync via the live symlinks, not a real failure. If you want to **fully decouple** the project from the dev tree, follow the migration recipe below. |
|
|
280
|
+
| `PACK_METADATA_MISMATCH: metadata-only: X, filesystem-only: Y` | A user-skill-pack (`.xtrm/skills/user/packs/<name>/PACK.json`) lists a skill that has been renamed on disk | Edit `PACK.json` so the listed skill names match the directory names; re-run. |
|
|
281
|
+
| `Cannot read properties of null (reading 'dolt')` | Repo's `.beads/config.yaml` is comments-only (fresh `bd init` default); pre-`xtrm-16ec` xtrm crashes parsing it | Upgrade xtrm-tools to ≥ 0.7.18; the parse result is coerced to `{}` defensively now. |
|
|
282
|
+
|
|
283
|
+
## Migrating a dev-linked project to a real consumer install
|
|
284
|
+
|
|
285
|
+
A project ends up with `.xtrm/skills/default` (or another `.xtrm/` asset) as a **symlink** back to the dev tree when:
|
|
286
|
+
- xtrm-tools was `npm link`-ed globally (`/home/<user>/.nvm/.../node_modules/xtrm-tools` → `/home/<user>/dev/xtrm-tools/`), AND
|
|
287
|
+
- the project's `.xtrm/skills/default` was manually replaced with a symlink to the npm-global path (common dev-loop shortcut so skill edits propagate instantly).
|
|
288
|
+
|
|
289
|
+
`installFromRegistry`'s `scaffoldSkillsDefaultFromPackage` has an intentional branch (`registry-scaffold.ts:104`): *"if target is a symlink whose realpath equals the package realpath → noop"*. This **preserves the dev symlink** on every `xt update`. The arrangement is functional but the project is invisibly coupled to whatever lives in the dev tree (or whatever the global npm path points to).
|
|
290
|
+
|
|
291
|
+
### When to migrate
|
|
292
|
+
|
|
293
|
+
- Before publishing a consumer-facing release of the dependent project.
|
|
294
|
+
- Before handing the project to another developer / machine.
|
|
295
|
+
- When you want `xt update --apply` to actually *write files into the project* rather than no-op.
|
|
296
|
+
|
|
297
|
+
### Detection
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
# Is .xtrm/skills/default a symlink, and where does it point?
|
|
301
|
+
readlink <repo>/.xtrm/skills/default
|
|
302
|
+
# If empty / not-a-symlink: nothing to migrate.
|
|
303
|
+
# If points anywhere outside <repo>/: needs migration.
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Recipe
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
cd <repo>
|
|
310
|
+
|
|
311
|
+
# 1. Remove the symlink (does NOT touch the real files in the dev tree).
|
|
312
|
+
rm .xtrm/skills/default
|
|
313
|
+
|
|
314
|
+
# 2. Re-run init — copies real files from the installed xtrm-tools package
|
|
315
|
+
# into .xtrm/skills/default/ AND seeds .xtrm/registry.json (xtrm-ya2i).
|
|
316
|
+
xt init -y
|
|
317
|
+
|
|
318
|
+
# 3. If the symlink was committed (git ls-files showed it as mode 120000),
|
|
319
|
+
# flip the tracked entry to a real directory:
|
|
320
|
+
git rm --cached .xtrm/skills/default 2>/dev/null # ok if it was untracked
|
|
321
|
+
git add .xtrm/skills/default
|
|
322
|
+
git commit -m "chore: replace dev symlink with real xtrm skills payload"
|
|
323
|
+
|
|
324
|
+
# 4. Optional sanity: confirm no more symlinks point outside the repo.
|
|
325
|
+
find .xtrm -type l -lname '/*' -o -type l ! -lname '../*' -a ! -lname './*'
|
|
326
|
+
# Empty output means clean.
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### What `npm install -g xtrm-tools` alone does
|
|
330
|
+
|
|
331
|
+
Replacing the `npm link` with a real npm install (`npm install -g xtrm-tools`) breaks the dev-tree coupling — the global path becomes real files at the published version — **but it does not remove the project's symlink.** The symlink still points at the global npm path, which now resolves to immutable published files. The project keeps working but stays pinned to the npm-installed version forever, and `.xtrm/skills/default` remains a symlink on disk.
|
|
332
|
+
|
|
333
|
+
To get true isolation (real files inside `<repo>/.xtrm/skills/default/`), the recipe above is still required.
|
|
334
|
+
|
|
335
|
+
## Worktree hygiene: `.beads/` and `core.hooksPath`
|
|
336
|
+
|
|
337
|
+
Modern bd 1.0.3 stores `core.hooksPath` as an **absolute parent path** at `bd init`
|
|
338
|
+
time (e.g. `$HOME/repo/.beads/hooks`), so worktrees inherit parent hooks via
|
|
339
|
+
shared git config — no on-disk `.beads/` is needed inside a worktree. Since
|
|
340
|
+
`xtrm-cbjo` (xtrm-tools commit `937b151`) and `unitAI-yvqmf` (specialists commit
|
|
341
|
+
`986bc8e4`), `xt claude` / `xt pi` / `sp run` worktrees do **not** create a
|
|
342
|
+
`.beads/` symlink; they `rm -rf <worktree>/.beads` and `git update-index
|
|
343
|
+
--skip-worktree --` on tracked `.beads/*` paths. This eliminates the
|
|
344
|
+
squash-merge `.beads`-wipe hazard documented in projects/infra PR #39.
|
|
345
|
+
|
|
346
|
+
### Audit your `core.hooksPath` once (xtrm-2s44)
|
|
347
|
+
|
|
348
|
+
If your bd was installed before 1.0.3, `core.hooksPath` may be the relative
|
|
349
|
+
string `.beads/hooks`, which would resolve against a worktree's cwd — i.e.,
|
|
350
|
+
the (now-missing) worktree-local `.beads/hooks/`. To survey:
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
for r in ~/dev/*/ ~/projects/*/*/; do
|
|
354
|
+
[ -d "$r/.git" ] && [ -d "$r/.beads" ] || continue
|
|
355
|
+
hp=$(git -C "$r" config core.hooksPath 2>/dev/null || echo "<unset>")
|
|
356
|
+
case "$hp" in
|
|
357
|
+
/*) cat="ABSOLUTE" ;;
|
|
358
|
+
"<unset>") cat="UNSET" ;;
|
|
359
|
+
.beads/hooks) cat="RELATIVE-BD <- needs fix" ;;
|
|
360
|
+
*) cat="OTHER (project .githooks chain — leave alone)" ;;
|
|
361
|
+
esac
|
|
362
|
+
printf "%-50s %s\n" "${r#$HOME/} $cat" "$hp"
|
|
363
|
+
done
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
Classification:
|
|
367
|
+
- `ABSOLUTE` — correct, no action.
|
|
368
|
+
- `RELATIVE-BD` (literal `.beads/hooks` or `./.beads/hooks`) — rewrite once:
|
|
369
|
+
```bash
|
|
370
|
+
git -C <repo> config core.hooksPath "$(realpath <repo>/.beads/hooks)"
|
|
371
|
+
```
|
|
372
|
+
- `OTHER` like `.githooks` — project-specific hook chain, leave alone. bd in
|
|
373
|
+
these repos works via direct invocation (not git hooks), so worktree hygiene
|
|
374
|
+
is unaffected.
|
|
375
|
+
- `UNSET` — no hooks wired anywhere; same outcome as `OTHER`.
|
|
376
|
+
|
|
377
|
+
Survey across `~/dev` + `~/projects/mercury` on 2026-05-12 returned **0 repos
|
|
378
|
+
needing the fix**. The safety net in `launchWorktreeSession` /
|
|
379
|
+
`provisionWorktree` (`normalizeParentHooksPath`) auto-rewrites on next worktree
|
|
380
|
+
creation if a relative `.beads/hooks` ever does appear, so the survey is mostly
|
|
381
|
+
defensive.
|
|
382
|
+
|
|
383
|
+
### Worktree-internal artifact inventory (xtrm-x80f)
|
|
384
|
+
|
|
385
|
+
A worktree is a partial clone with extras: bd metadata, npm caches, runtime
|
|
386
|
+
state, per-worktree settings. None of these belong on a chain branch — but
|
|
387
|
+
the moment any of them get staged via `git add -A` or a checkpoint commit,
|
|
388
|
+
they can ride a PR into `main`. The matrix below documents what is protected
|
|
389
|
+
by which mechanism. Audit it whenever you add a new per-worktree artifact.
|
|
390
|
+
|
|
391
|
+
| Artifact | Source | Mechanism in a worktree | Status |
|
|
392
|
+
|----------|--------|-------------------------|--------|
|
|
393
|
+
| `.beads/*` | bd tracked dir | rm + `skip-worktree` (xtrm-cbjo) | ✅ |
|
|
394
|
+
| `.beads-credential-key`, `.beads/dolt-monitor.pid`, `.beads/dolt-server.activity` | bd runtime | gitignored at parent | ✅ |
|
|
395
|
+
| `.pi/npm/` | npm cache | gitignored + symlink to parent | ✅ |
|
|
396
|
+
| `.pi/extensions/` | pi runtime | gitignored under `.xtrm/extensions/**/.pi/` | ✅ |
|
|
397
|
+
| `.specialists/default` | (xtrm-tools: untracked) | symlink to parent in worktree | ✅ |
|
|
398
|
+
| `.specialists/user` | tracked (.json overrides) | symlink to parent in worktree | ⚠️ merge-hazard candidate, tracked at follow-up bead |
|
|
399
|
+
| `.specialists/{jobs,ready,trace.jsonl,db/*}` | runtime state | gitignored at parent | ✅ |
|
|
400
|
+
| `.claude/skills` | install symlink | gitignored | ✅ |
|
|
401
|
+
| `.claude/settings.local.json` | per-worktree write (`launchWorktreeSession`) | gitignored (user-global + project) | ✅ |
|
|
402
|
+
| `.claude/worktrees/`, `.claude/tdd-guard/data/` | runtime | gitignored | ✅ |
|
|
403
|
+
| `.xtrm/worktrees/`, `.xtrm/skills/active/`, `.xtrm/session-meta.json`, `.xtrm/statusline-claim`, `.xtrm/debug.db` | runtime | gitignored | ✅ |
|
|
404
|
+
| `AGENTS.md`, `CLAUDE.md` | tracked | gitnexus stat-counter scrubbed (xtrm-c6sf), build-gate prevents reintroduction | ✅ |
|
|
405
|
+
| `pnpm-workspace.yaml`, `cli/pnpm-workspace.yaml` | generated by pnpm in an npm-workspaces repo when specialist tooling shells out to pnpm | gitignored (xtrm-ombq) | ✅ |
|
|
406
|
+
| `.gitnexus/` | runtime | gitignored | ✅ |
|
|
407
|
+
| `.dolt/`, `*.db` | runtime | gitignored | ✅ |
|
|
408
|
+
|
|
409
|
+
The remaining ⚠️ is `.specialists/user/*.json`: the symlink swap in
|
|
410
|
+
`ensureWorktreeSpecialists` has the same shape as the pre-fix `.beads`
|
|
411
|
+
problem — a chain-branch checkpoint could capture the dir→symlink delta and
|
|
412
|
+
squash-merge would wipe the parent's `.specialists/user/`. Lower urgency
|
|
413
|
+
than `.beads` (smaller blast radius, files are intentional overrides) but
|
|
414
|
+
worth resolving with the same skip-worktree pattern when convenient.
|
|
415
|
+
|
|
416
|
+
The defense-in-depth pre-push guard in `xt end`
|
|
417
|
+
(`findBeadsSymlinkIntroductions`) currently only checks `.beads/*`. Extend
|
|
418
|
+
to `.specialists/*` if/when the symlink swap there becomes the next chain
|
|
419
|
+
of work.
|
|
420
|
+
|
|
421
|
+
## Pre-Release Validation Methodology
|
|
422
|
+
|
|
423
|
+
Before publishing a new xtrm-tools version, validate the operator-facing CLI locally
|
|
424
|
+
against every consumer repo. This is the procedure that surfaced two release-blockers
|
|
425
|
+
in 2026-05-12 alone (`xtrm-16ec` yaml-null crash, `xtrm-ny61` worktree over-discovery).
|
|
426
|
+
|
|
427
|
+
### Procedure
|
|
428
|
+
|
|
429
|
+
```bash
|
|
430
|
+
# 1. Build dist from the local checkout
|
|
431
|
+
cd /path/to/xtrm-tools && npm run build --workspace cli
|
|
432
|
+
|
|
433
|
+
# 2. Link globally so `xt` runs local source
|
|
434
|
+
npm link
|
|
435
|
+
|
|
436
|
+
# 3. Sweep across all consumer trees (dry-run first)
|
|
437
|
+
xt update --root ~/dev
|
|
438
|
+
xt update --root ~/projects/mercury
|
|
439
|
+
|
|
440
|
+
# 4. Identify failed/incomplete rows. Fix any real bugs in xtrm-tools FIRST,
|
|
441
|
+
# then re-build + re-link + re-sweep.
|
|
442
|
+
|
|
443
|
+
# 5. Once dry-run is clean, apply across the fleet:
|
|
444
|
+
xt update --apply --root ~/dev
|
|
445
|
+
xt update --apply --root ~/projects/mercury
|
|
446
|
+
|
|
447
|
+
# 6. Cut the public release only after the local apply succeeds end-to-end.
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### Why this beats publishing first and patching later
|
|
451
|
+
|
|
452
|
+
- A published `0.7.X` that crashes on a default-config consumer repo wastes a
|
|
453
|
+
version number — users see "upgrade and immediately break" and lose trust.
|
|
454
|
+
- Bugs that only manifest on real consumer state (comments-only YAML, transient
|
|
455
|
+
worktrees, drifted PACK metadata) are invisible from xtrm-tools' own test
|
|
456
|
+
suite — only a real sweep catches them.
|
|
457
|
+
- `npm link` flips between local-source-globally and published-version-globally
|
|
458
|
+
in seconds (`npm unlink` reverts), so the validation cost is minimal.
|
|
459
|
+
|
|
460
|
+
### Watch-fors during the sweep
|
|
461
|
+
|
|
462
|
+
- **Pi packages shown as `missing` when `npm ls -g` confirms them installed** —
|
|
463
|
+
detection bug, filed at `xtrm-ntf8`. Not a real problem; packages work.
|
|
464
|
+
- **xtrm-tools itself appearing as `failed` with "Source and destination..."** —
|
|
465
|
+
expected when xtrm-tools is npm-linked into itself; not a release blocker.
|
|
466
|
+
|
|
201
467
|
## Reporting to the user
|
|
202
468
|
|
|
203
469
|
After completing detection + remediation + verification, give the user a concise
|
|
@@ -28,6 +28,7 @@ from bootstrap import ( # noqa: E402
|
|
|
28
28
|
RootResolutionError,
|
|
29
29
|
find_service_for_path,
|
|
30
30
|
get_project_root,
|
|
31
|
+
get_registry_path,
|
|
31
32
|
get_service,
|
|
32
33
|
load_registry,
|
|
33
34
|
save_registry,
|
|
@@ -110,6 +111,22 @@ def check_drift_from_hook_stdin() -> None:
|
|
|
110
111
|
sys.exit(0)
|
|
111
112
|
|
|
112
113
|
|
|
114
|
+
def _print_missing_registry_hint(project_root: str | None = None) -> None:
|
|
115
|
+
if project_root is None:
|
|
116
|
+
try:
|
|
117
|
+
project_root = get_project_root()
|
|
118
|
+
except RootResolutionError:
|
|
119
|
+
project_root = "."
|
|
120
|
+
|
|
121
|
+
root = Path(project_root)
|
|
122
|
+
expected = (
|
|
123
|
+
f"Registry not found. Expected one of: {root / 'service-registry.json'}, "
|
|
124
|
+
f"{root / '.claude/skills/service-registry.json'}, "
|
|
125
|
+
f"{root / '.xtrm/skills/user/packs/*/service-registry.json'}"
|
|
126
|
+
)
|
|
127
|
+
print(expected, file=sys.stderr)
|
|
128
|
+
|
|
129
|
+
|
|
113
130
|
def update_sync_time(service_id: str, project_root: str | None = None) -> bool:
|
|
114
131
|
"""Update last_sync timestamp for a service in the registry."""
|
|
115
132
|
try:
|
|
@@ -140,6 +157,11 @@ def scan_drift(project_root: str | None = None) -> list[dict]:
|
|
|
140
157
|
return []
|
|
141
158
|
|
|
142
159
|
root = Path(project_root)
|
|
160
|
+
registry_path = get_registry_path(project_root)
|
|
161
|
+
if not registry_path.exists():
|
|
162
|
+
_print_missing_registry_hint(project_root)
|
|
163
|
+
return []
|
|
164
|
+
|
|
143
165
|
registry = load_registry(project_root)
|
|
144
166
|
drifted: list[dict] = []
|
|
145
167
|
|
|
@@ -179,14 +179,56 @@ for s, t, a in rows:
|
|
|
179
179
|
'
|
|
180
180
|
```
|
|
181
181
|
|
|
182
|
-
Component kinds: `system_prompt`, `mandatory_rule` (one event entry per attached rule), `skill` (path
|
|
182
|
+
Component kinds: `system_prompt`, `mandatory_rule` (one event entry per attached rule), `skill` (path/description label only — full bodies are eagerly injected at runtime but NOT counted here), `task_template`, `bead_context`, `memory`.
|
|
183
183
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
- `
|
|
184
|
+
**Important:** `skill` entries in `payload_breakdown` show only the path/description label (~10-40 tokens). The full skill body is forcefully injected via `skills.paths` on every run and IS billed as input tokens. To measure the real eager-skill cost, see Recipe 8.
|
|
185
|
+
|
|
186
|
+
Optimization signals (from breakdown alone):
|
|
187
|
+
- `mandatory_rule` total dominates: audit wrapper inflation by comparing `bytes` per rule in the event vs `wc -c config/mandatory-rules/<id>.md`. Mismatch >5x means a wrapper or richer source is adding hidden cost.
|
|
188
|
+
- `bead_context` huge: bead description is bloated — orchestrator should write more concise contracts.
|
|
188
189
|
- `memory` huge: stale or noisy memories — run `bd memories` cleanup or consolidation.
|
|
189
190
|
|
|
191
|
+
## Recipe 8 — eager skill-body cost per specialist
|
|
192
|
+
|
|
193
|
+
`skills.paths` are eagerly injected on every run; the bodies appear in the API-billed prompt but the `payload_breakdown` event records only the path label. To derive the real eager-skill cost:
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
eager_skill_cost ≈ first_turn_input_tokens − sum(payload_breakdown non-skill components)
|
|
197
|
+
− constant per-specialist framing/tool-defs overhead
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Two-step audit:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# Step 1: real first-turn input tokens per specialist (truth)
|
|
204
|
+
DB=.specialists/db/observability.db
|
|
205
|
+
sqlite3 "$DB" "
|
|
206
|
+
SELECT specialist, AVG(json_extract(token_trajectory_json, '\$[0].token_usage.input_tokens')) AS avg_first_in, COUNT(*) AS n
|
|
207
|
+
FROM specialist_job_metrics
|
|
208
|
+
WHERE token_trajectory_json IS NOT NULL AND status='done'
|
|
209
|
+
GROUP BY specialist ORDER BY avg_first_in DESC"
|
|
210
|
+
|
|
211
|
+
# Step 2: per-specialist measured non-skill components (post-kdl4n)
|
|
212
|
+
sqlite3 "$DB" "SELECT specialist, event_json FROM specialist_events WHERE type='payload_breakdown' GROUP BY specialist ORDER BY t DESC" \
|
|
213
|
+
| python3 -c '
|
|
214
|
+
import json, sys
|
|
215
|
+
for line in sys.stdin:
|
|
216
|
+
if "|" not in line: continue
|
|
217
|
+
spec, js = line.split("|", 1)
|
|
218
|
+
d = json.loads(js)
|
|
219
|
+
non_skill = sum(c["tokens"] for c in d["payload_breakdown"]["components"] if c["kind"] != "skill")
|
|
220
|
+
print(f"{spec:<22}{non_skill:>10}")
|
|
221
|
+
'
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Then `delta = first_in − non_skill_total`. The framing/tool-defs constant is roughly the same across specialists with the same model — you can estimate it by running a specialist with NO `skills.paths` attached as a baseline.
|
|
225
|
+
|
|
226
|
+
Per-skill body weight: `wc -c <skill-path>/SKILL.md` divided by 4 (cl100k_base approximation). High-frequency, large-body skills are the inlining candidates; low-frequency or small ones stay attached.
|
|
227
|
+
|
|
228
|
+
Optimization signals (skills):
|
|
229
|
+
- `delta` >> sum of attached skill body bytes/4: framing/tool defs are the bulk — leave skills alone.
|
|
230
|
+
- `delta` ≈ sum of skill body weights: skills dominate eager cost — inline frequently-used hot guidance into `system_prompt`, keep rare deep references as skills, consider splitting big mixed skills.
|
|
231
|
+
|
|
190
232
|
## References
|
|
191
233
|
|
|
192
234
|
- `docs/observability-metrics.md`
|
|
@@ -9,7 +9,9 @@ description: >
|
|
|
9
9
|
output immediately, or when the work is a single LLM call with structured
|
|
10
10
|
input/output. Do NOT use for tracked agent work — that belongs to
|
|
11
11
|
`using-specialists-v2`.
|
|
12
|
-
version: 1.0
|
|
12
|
+
version: 1.1.0
|
|
13
|
+
updated: 2026-05-06
|
|
14
|
+
synced_at: a0e54d0c
|
|
13
15
|
---
|
|
14
16
|
|
|
15
17
|
# Script-Class Specialists
|
|
@@ -54,7 +56,7 @@ A spec is rejected at request time (`specialist_load_error`) if any of:
|
|
|
54
56
|
- `execution.interactive` is `true`
|
|
55
57
|
- `execution.requires_worktree` is `true`
|
|
56
58
|
- `execution.permission_required` is anything other than `READ_ONLY`
|
|
57
|
-
- `skills.scripts` is non-empty
|
|
59
|
+
- `skills.scripts` is non-empty (always rejected; no `--allow-local-scripts` bypass)
|
|
58
60
|
- `prompt.task_template` is missing
|
|
59
61
|
- a referenced `$var` in the chosen template is not supplied (`template_variable_missing`)
|
|
60
62
|
|
|
@@ -101,9 +103,9 @@ sp script <specialist-name> \
|
|
|
101
103
|
Behaviour:
|
|
102
104
|
|
|
103
105
|
- Loads the spec via `SpecialistLoader` (same loader as `sp run`).
|
|
104
|
-
- Renders `prompt.task_template` (or named template) with `--vars
|
|
105
|
-
-
|
|
106
|
-
|
|
106
|
+
- Renders `prompt.task_template` (or named template) with `--vars`, then feeds the rendered prompt via stdin.
|
|
107
|
+
- `--db-path /path/to/observability.db` is an exact SQLite file path; omit it to use the project default `.specialists/db/observability.db`.
|
|
108
|
+
- Spawns `pi` in JSON mode with no session, no extensions, no tools, and offline; forwards the resolved model, optional `--thinking`, and `--system-prompt` when `prompt.system` is set (full override, not append).
|
|
107
109
|
- Returns the final assistant text on stdout. With `--json`, returns the full
|
|
108
110
|
`ScriptGenerateResult` envelope.
|
|
109
111
|
- Writes one row to `.specialists/db/observability.db` (same writer as `sp run`).
|
|
@@ -119,13 +119,13 @@ specialists status --job <job-id> # single-job detail view (legacy
|
|
|
119
119
|
# Epic lifecycle (canonical publication path)
|
|
120
120
|
specialists epic list [--unresolved] # list epics with lifecycle state
|
|
121
121
|
specialists epic status <epic-id> # show chains, blockers, readiness
|
|
122
|
-
specialists epic sync <epic-id> [--apply] #
|
|
123
|
-
specialists epic resolve <epic-id> # transition open -> resolving
|
|
122
|
+
specialists epic sync <epic-id> [--apply] # recompute derived readiness; repair drift
|
|
124
123
|
specialists epic abandon <epic-id> --reason <text> [--force] # terminal transition for stuck epics
|
|
125
|
-
specialists epic merge <epic-id> [--pr] # publish all epic-owned chains
|
|
124
|
+
specialists epic merge <epic-id> [--pr] # publish all epic-owned chains; auto-finalizes PASS chains
|
|
126
125
|
|
|
127
|
-
# Merge (
|
|
128
|
-
specialists merge <chain-root-bead> [--rebuild]
|
|
126
|
+
# Merge (per-chain or standalone; PASS chains can merge inside an active epic)
|
|
127
|
+
specialists merge <chain-root-bead> [--rebuild]
|
|
128
|
+
specialists finalize <chain-root-bead> # manual recovery if PASS auto-finalize did not fire
|
|
129
129
|
|
|
130
130
|
# Session close (chain-aware, epic-aware)
|
|
131
131
|
specialists end [--pr] # close session, publish via merge or PR
|
|
@@ -682,14 +682,15 @@ sp epic list --unresolved # show non-terminal epics
|
|
|
682
682
|
|
|
683
683
|
# Inspect one epic
|
|
684
684
|
sp epic status unitAI-3f7b
|
|
685
|
-
# Shows:
|
|
685
|
+
# Shows: derived readiness state, persisted state (audit only), chains[], blockers[], summary
|
|
686
686
|
|
|
687
|
-
#
|
|
688
|
-
sp epic
|
|
689
|
-
|
|
690
|
-
# Publish
|
|
691
|
-
sp epic merge unitAI-3f7b # merge_ready → merged
|
|
687
|
+
# Publish (no manual state transition — readiness is derived live)
|
|
688
|
+
sp epic merge unitAI-3f7b # batch publish all chains; auto-finalizes PASS chains
|
|
692
689
|
sp epic merge unitAI-3f7b --pr # PR mode
|
|
690
|
+
|
|
691
|
+
# Or per-chain (PASS chain inside active epic is allowed)
|
|
692
|
+
sp merge <chain-root-bead>
|
|
693
|
+
sp finalize <chain-root-bead> # manual recovery if PASS auto-finalize missed
|
|
693
694
|
```
|
|
694
695
|
|
|
695
696
|
### Conflict handling
|
|
@@ -1136,7 +1137,7 @@ sp stop <job-id> --force
|
|
|
1136
1137
|
|
|
1137
1138
|
### 5) `sp end` open-state loop fix
|
|
1138
1139
|
|
|
1139
|
-
If `sp end` detects open-state mismatch, tool
|
|
1140
|
+
If `sp end` detects open-state mismatch, tool surfaces the derived readiness summary (`sp epic status <epic-id>`) and the per-chain merge path. There is no `sp epic resolve` anymore — readiness is recomputed live from chain state.
|
|
1140
1141
|
|
|
1141
1142
|
- **RPC timeout on worktree job start** (30s, `command id=1`) → pi runs `npm install` in fresh
|
|
1142
1143
|
worktrees if `.pi/settings.json` lists local packages. Root cause: worktree gets a stale copy
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: using-specialists-auto
|
|
3
|
+
description: >
|
|
4
|
+
Operator-offline autonomous orchestration overlay. Activate when the user says
|
|
5
|
+
"auto mode", "full auto", "run autonomously", "I'll leave you alone", or
|
|
6
|
+
similar — and hands over a multi-item priority list. Layers on top of
|
|
7
|
+
`using-specialists-v3`: paranoid pacing, dispatch loop shape, dist-rebuild
|
|
8
|
+
discipline, escalation triggers specific to unsupervised runs. Does NOT
|
|
9
|
+
duplicate v3's bead contracts, sleep table, rebuttal patterns, escalation
|
|
10
|
+
matrix, or session-end handoff — refers to v3 for those.
|
|
11
|
+
version: 2.0
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Using Specialists — Auto Mode (overlay)
|
|
15
|
+
|
|
16
|
+
You are running unsupervised. Every shortcut you skip costs the operator on return. Move slowly enough to be correct.
|
|
17
|
+
|
|
18
|
+
`using-specialists-v3` is the canonical specialist orchestration skill — bead contracts, role selection, advisory passes, sleep cadence, rebuttal patterns, escalation matrix, session-end handoff all live there. This skill adds **only** the discipline overlay that changes when no operator is present to catch drift.
|
|
19
|
+
|
|
20
|
+
## When this skill activates
|
|
21
|
+
|
|
22
|
+
User explicitly hands over autonomy: "auto mode", "go", "I'll leave you alone", "run the list", "do them all". Skill stays active until session end or the operator returns. Do NOT activate on a single ad-hoc task.
|
|
23
|
+
|
|
24
|
+
## Auto-mode-specific rules (in addition to v3 hard rules)
|
|
25
|
+
|
|
26
|
+
These EXTEND v3's Non-Negotiable Rules + Escalation Matrix — they do not replace them.
|
|
27
|
+
|
|
28
|
+
1. **Default to serial chains.** Auto-mode rarely benefits from parallel chains; the project-wide commit gate (v3 → Bead Lifecycle) forces serial-tail anyway. Only parallelize when file scopes are provably disjoint AND the time savings outweigh the conflict-resolution cost (rare).
|
|
29
|
+
2. **Re-read each bead and defend each field in your head before launching.** If you can't, the bead isn't ready. Title-only beads waste a turn.
|
|
30
|
+
3. **Rebuild + smoke after each P0 (and after every chain touching `src/`).** Skipping breaks the next chain's baseline silently.
|
|
31
|
+
4. **One rebuttal per reviewer, then escalate.** v3 documents the rebuttal pattern — auto-mode just caps the loop count.
|
|
32
|
+
5. **Session-close report is non-optional.** Operator returning to a clean tree but no report = blind cold-start next session. Follow `/session-close-report` skill at session end.
|
|
33
|
+
|
|
34
|
+
## Per-item loop shape
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
read bead → write 7-section contract (child impl bead) → bd dep add parent→child
|
|
38
|
+
→ sp run executor --bead <impl> --keep-alive --context-depth 3 --background
|
|
39
|
+
→ sleep 10 && sp ps # confirm started, not stuck queued
|
|
40
|
+
→ sleep <role-typical from v3> & sp ps # check (see v3 Monitoring section)
|
|
41
|
+
→ sp result <exec-job> # consume immediately on transition to waiting
|
|
42
|
+
→ optional advisory passes per v3 (code-sanity if smelly, security-auditor if risk surface)
|
|
43
|
+
→ write reviewer bead contract → sp run reviewer --bead <review> --job <exec-job> --background
|
|
44
|
+
→ sleep 90 & sp ps
|
|
45
|
+
→ sp result <reviewer-job>
|
|
46
|
+
→ PASS? → sp finalize <exec> → sp merge → rebuild dist → smoke → close chain (memory ack first)
|
|
47
|
+
→ PARTIAL? → resume executor with exact findings → resume reviewer
|
|
48
|
+
→ FAIL with valid evidence? → stop and report (file follow-up bead)
|
|
49
|
+
→ FAIL with overcautious gate? → rebut once with cited evidence (v3 → Specialist Rebuttal As Routine)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Dist rebuild + commit after every P0 or src/-touching chain
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
bun build src/index.ts --target=bun --outfile=dist/index.js
|
|
56
|
+
sed -i '1s|#!/usr/bin/env node|#!/usr/bin/env bun|' dist/index.js
|
|
57
|
+
chmod +x dist/index.js
|
|
58
|
+
git add dist/index.js dist/types/<changed-paths> 2>/dev/null
|
|
59
|
+
git commit -m "build: rebuild dist after <bead-id> <one-line summary>"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Without this, the next chain's tests/smokes run against stale dist and the globally-installed `sp` binary (symlinked to local `dist/index.js`) silently uses pre-fix behavior.
|
|
63
|
+
|
|
64
|
+
## Smoke per chain
|
|
65
|
+
|
|
66
|
+
Tighter than v3's E2E Smoke Phase (which is integration-end). Per-chain smoke is:
|
|
67
|
+
|
|
68
|
+
- `bunx tsc --noEmit` clean
|
|
69
|
+
- The targeted test(s) the chain added — green
|
|
70
|
+
- After P0 also: `sp --version`, the specific CLI surface that changed, and (if runtime resolution touched) the same command from a non-repo cwd (`cd /tmp/smoke && sp <cmd>`)
|
|
71
|
+
|
|
72
|
+
If any chain in the session touched auth/secrets/input/dep-lock surface, do v3's cross-cutting security-auditor pass once at end before session close.
|
|
73
|
+
|
|
74
|
+
## Pre-merge state hygiene (transitional, until v3.14.2 ships globally)
|
|
75
|
+
|
|
76
|
+
`sp merge` now ignores `.beads/` and `.xtrm/skills/active/**` (per `unitAI-pqe96` shipped this session). The globally-installed `sp` symlinks to local `dist/index.js`, so after `npm install -g .` the fix is live locally. If you still see `sp merge` refuse on dirty state, the leftover is usually a STAGED `.beads/issues.jsonl` (`M ` not ` M`):
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
git restore --staged .beads/issues.jsonl 2>/dev/null
|
|
80
|
+
git checkout -- .beads/issues.jsonl 2>/dev/null
|
|
81
|
+
sp merge <chain-root-bead>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
In the worktree, drop noise stash before merging if `.xtrm/skills/active/...` files are dirty:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
git stash push -u -m "noise" -- .xtrm/
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
After merge cleanup: `git worktree remove <path> --force`, `git branch -D feature/<bead>-<role>`, `git worktree prune`, `rm -rf .worktrees/<bead>`.
|
|
91
|
+
|
|
92
|
+
## Auto-mode-specific escalation triggers
|
|
93
|
+
|
|
94
|
+
These supplement v3's Escalation Matrix — stop and report when:
|
|
95
|
+
|
|
96
|
+
- Reviewer FAIL twice after one rebuttal attempt (v3 rebuttal limit hit).
|
|
97
|
+
- Any chain looped twice with no progress.
|
|
98
|
+
- Repeated specialist crashes (>2 same role).
|
|
99
|
+
- Cross-project state pollution (specialists from another repo holding locks/processes).
|
|
100
|
+
- Anything that would otherwise require a v3 hard-rule break.
|
|
101
|
+
|
|
102
|
+
When you stop: file an issue bead with concrete evidence (PIDs, job IDs, exact error), save a memory if the failure mode is durable, write a partial session-close report, do NOT abandon mid-merge.
|
|
103
|
+
|
|
104
|
+
## Session start (auto-specific)
|
|
105
|
+
|
|
106
|
+
In addition to v3's session-start patterns (`bd prime`, `bv --robot-triage`):
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
specialists list --full # confirm current roles + models (registry may have drifted)
|
|
110
|
+
sp ps # 0 active expected
|
|
111
|
+
git worktree list # main only expected (specialist worktrees from prior sessions should be cleaned)
|
|
112
|
+
git status -s # clean expected
|
|
113
|
+
bd ready # work to pick up
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
If any of these are dirty (active jobs, lingering worktrees, dirty tree from prior session), reconcile before claiming new work.
|
|
117
|
+
|
|
118
|
+
## Session close (mandatory)
|
|
119
|
+
|
|
120
|
+
Per v3 → At Session End — Mandatory Handoff. Auto-mode addenda:
|
|
121
|
+
|
|
122
|
+
1. Confirm `sp ps` empty (0 running, 0 waiting) and `git worktree list` shows only main.
|
|
123
|
+
2. Drop accumulated stashes if they contain only known noise.
|
|
124
|
+
3. Memory gate at session level: `bd kv set "memory-gate-done:<session-id>" "saved: <durable-insights>"` (or `"nothing novel: <reason>"`).
|
|
125
|
+
4. Run `/session-close-report` skill — fills the canonical report template, drives CHANGELOG sync, commit, push.
|
|
126
|
+
|
|
127
|
+
## Telltale signs you're drifting from auto-mode discipline
|
|
128
|
+
|
|
129
|
+
- Skipping bead contracts because "the change is small" → write it anyway, costs nothing, downstream specialist needs it.
|
|
130
|
+
- Polling `sp ps` more often than v3's sleep table → wastes context.
|
|
131
|
+
- Letting executors run >2× expected without `sp feed` → blocking future work.
|
|
132
|
+
- Accepting reviewer FAIL without cited evidence in the rebuttal → produces longer loops.
|
|
133
|
+
- Manually editing a config file because "the executor would just do the same thing" → breaks v3 hard rule 13 (orchestrator never edits code), no audit trail.
|
|
134
|
+
- Skipping `bun run build` after src/ change → next chain's smoke fails for unrelated reason.
|
|
135
|
+
- Closing the parent bead before chain memory saved → loses durable insight forever.
|
|
136
|
+
|
|
137
|
+
Read once at session start. Re-read if you catch yourself drifting.
|