@mmerterden/multi-agent-pipeline 12.6.0 → 12.8.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.
Files changed (481) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/README.md +18 -18
  3. package/docs/FIGMA_PIPELINE.md +34 -34
  4. package/docs/adr/0001-three-model-triage.md +12 -12
  5. package/docs/adr/0002-instruction-driven-flag.md +5 -5
  6. package/docs/adr/0003-unified-shared-skills.md +5 -5
  7. package/docs/adr/0004-zero-dependency-philosophy.md +5 -5
  8. package/docs/adr/0005-lazy-phase-docs.md +2 -2
  9. package/docs/adr/0006-skills-core-external-split.md +6 -6
  10. package/docs/adr/0007-multi-tool-adapter-framework.md +19 -19
  11. package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +19 -19
  12. package/docs/adr/README.md +1 -1
  13. package/docs/best-practices.md +3 -3
  14. package/docs/features.md +28 -28
  15. package/docs/performance.md +16 -16
  16. package/docs/recovery-guide.md +39 -39
  17. package/index.js +4 -4
  18. package/install/_common.mjs +53 -11
  19. package/install/_copilot-instructions.mjs +2 -2
  20. package/install/_dev-only-files.mjs +126 -6
  21. package/install/_platform-filter.mjs +1 -1
  22. package/install/_telemetry.mjs +1 -1
  23. package/install/claude.mjs +20 -13
  24. package/install/copilot.mjs +11 -23
  25. package/install/index.mjs +7 -15
  26. package/install/templates/copilot-instructions.md +54 -54
  27. package/install.js +1 -1
  28. package/package.json +29 -11
  29. package/pipeline/commands/multi-agent/SKILL.md +1 -1
  30. package/pipeline/commands/multi-agent/analysis/SKILL.md +2 -2
  31. package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +1 -1
  32. package/pipeline/commands/multi-agent/autopilot/SKILL.md +1 -1
  33. package/pipeline/commands/multi-agent/build-optimize/SKILL.md +1 -1
  34. package/pipeline/commands/multi-agent/create-jira/SKILL.md +1 -1
  35. package/pipeline/commands/multi-agent/design-check/SKILL.md +1 -1
  36. package/pipeline/commands/multi-agent/dev/SKILL.md +1 -1
  37. package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +1 -1
  38. package/pipeline/commands/multi-agent/dev-local/SKILL.md +1 -1
  39. package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +1 -1
  40. package/pipeline/commands/multi-agent/diff-explain/SKILL.md +1 -1
  41. package/pipeline/commands/multi-agent/finish/SKILL.md +6 -6
  42. package/pipeline/commands/multi-agent/forget/SKILL.md +1 -1
  43. package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +1 -1
  44. package/pipeline/commands/multi-agent/help/SKILL.md +3 -3
  45. package/pipeline/commands/multi-agent/issue/SKILL.md +1 -1
  46. package/pipeline/commands/multi-agent/jira/SKILL.md +1 -1
  47. package/pipeline/commands/multi-agent/kill/SKILL.md +1 -1
  48. package/pipeline/commands/multi-agent/language/SKILL.md +1 -1
  49. package/pipeline/commands/multi-agent/local/SKILL.md +1 -1
  50. package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +1 -1
  51. package/pipeline/commands/multi-agent/log/SKILL.md +1 -1
  52. package/pipeline/commands/multi-agent/manual-test/SKILL.md +1 -1
  53. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +1 -1
  54. package/pipeline/commands/multi-agent/purge/SKILL.md +1 -1
  55. package/pipeline/commands/multi-agent/refactor/SKILL.md +16 -8
  56. package/pipeline/commands/multi-agent/resume/SKILL.md +2 -2
  57. package/pipeline/commands/multi-agent/review/SKILL.md +1 -1
  58. package/pipeline/commands/multi-agent/review-issue/SKILL.md +1 -1
  59. package/pipeline/commands/multi-agent/review-jira/SKILL.md +1 -1
  60. package/pipeline/commands/multi-agent/routines/SKILL.md +1 -1
  61. package/pipeline/commands/multi-agent/save/SKILL.md +1 -1
  62. package/pipeline/commands/multi-agent/scan/SKILL.md +1 -1
  63. package/pipeline/commands/multi-agent/search/SKILL.md +1 -1
  64. package/pipeline/commands/multi-agent/setup/SKILL.md +2 -2
  65. package/pipeline/commands/multi-agent/stack/SKILL.md +3 -3
  66. package/pipeline/commands/multi-agent/status/SKILL.md +1 -1
  67. package/pipeline/commands/multi-agent/sync/SKILL.md +5 -5
  68. package/pipeline/commands/multi-agent/test/SKILL.md +1 -1
  69. package/pipeline/commands/multi-agent/uninstall/SKILL.md +1 -1
  70. package/pipeline/commands/multi-agent/update/SKILL.md +3 -3
  71. package/pipeline/lib/account-resolver.sh +1 -1
  72. package/pipeline/lib/channels-multi-repo.sh +1 -1
  73. package/pipeline/lib/context-link-extractor.sh +1 -1
  74. package/pipeline/lib/credential-store.sh +21 -1
  75. package/pipeline/lib/fetch-confluence.sh +1 -1
  76. package/pipeline/lib/fetch-crashlytics.sh +1 -1
  77. package/pipeline/lib/fetch-fortify.sh +1 -1
  78. package/pipeline/lib/fetch-graylog.sh +1 -1
  79. package/pipeline/lib/fetch-swagger.sh +1 -1
  80. package/pipeline/lib/issue-fetcher.sh +1 -1
  81. package/pipeline/lib/multi-repo-pipeline.sh +1 -1
  82. package/pipeline/lib/repo-cache.sh +1 -1
  83. package/pipeline/lib/submodule-detector.sh +1 -1
  84. package/pipeline/multi-agent-refs/_account-picker.md +1 -1
  85. package/pipeline/multi-agent-refs/_dev-context.md +1 -1
  86. package/pipeline/multi-agent-refs/_repo-picker.md +1 -1
  87. package/pipeline/multi-agent-refs/component-dispatch.md +1 -1
  88. package/pipeline/multi-agent-refs/component-generation.md +121 -0
  89. package/pipeline/multi-agent-refs/cross-cli-contract.md +1 -1
  90. package/pipeline/multi-agent-refs/features/model-fallback.md +2 -2
  91. package/pipeline/multi-agent-refs/phases/operations.md +28 -0
  92. package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -0
  93. package/pipeline/multi-agent-refs/phases/phase-2-planning.md +1 -1
  94. package/pipeline/multi-agent-refs/phases/phase-3-dev.md +1 -2
  95. package/pipeline/multi-agent-refs/phases/phase-4-review.md +50 -5
  96. package/pipeline/preferences-template.json +5 -11
  97. package/pipeline/schemas/agent-state.schema.json +39 -9
  98. package/pipeline/schemas/analysis-output.schema.json +18 -4
  99. package/pipeline/schemas/analysis-spec.schema.json +120 -32
  100. package/pipeline/schemas/clarify-output.schema.json +15 -5
  101. package/pipeline/schemas/design-check-config.schema.json +32 -11
  102. package/pipeline/schemas/dev-critic-output.schema.json +20 -5
  103. package/pipeline/schemas/figma-project-config.schema.json +42 -10
  104. package/pipeline/schemas/learnings-ledger.schema.json +10 -2
  105. package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +1 -4
  106. package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +24 -7
  107. package/pipeline/schemas/plan-todos.schema.json +6 -3
  108. package/pipeline/schemas/planning-output.schema.json +5 -1
  109. package/pipeline/schemas/prefs.schema.json +97 -229
  110. package/pipeline/schemas/test-gap.schema.json +5 -5
  111. package/pipeline/schemas/token-budget.json +8 -8
  112. package/pipeline/schemas/triage-corpus.schema.json +1 -1
  113. package/pipeline/scripts/_smoke-root.sh +61 -0
  114. package/pipeline/scripts/aggregate-metrics.mjs +18 -6
  115. package/pipeline/scripts/audit-log.sh +25 -0
  116. package/pipeline/scripts/build-skills-index.mjs +6 -2
  117. package/pipeline/scripts/build-stack-plugins.mjs +142 -39
  118. package/pipeline/scripts/check-derived-drift.mjs +196 -0
  119. package/pipeline/scripts/classify-plan-safety.mjs +20 -7
  120. package/pipeline/scripts/cost-budget-check.mjs +2 -1
  121. package/pipeline/scripts/cost-table.json +1 -1
  122. package/pipeline/scripts/diff-explain.mjs +7 -3
  123. package/pipeline/scripts/diff-risk-score.mjs +13 -3
  124. package/pipeline/scripts/evidence-gate.mjs +7 -2
  125. package/pipeline/scripts/gen-mode-dispatch.mjs +38 -21
  126. package/pipeline/scripts/gen-skills-index.mjs +18 -3
  127. package/pipeline/scripts/learning-curve.mjs +13 -3
  128. package/pipeline/scripts/learnings-ledger.mjs +103 -36
  129. package/pipeline/scripts/localize-commands.mjs +6 -1
  130. package/pipeline/scripts/match-skills.mjs +15 -4
  131. package/pipeline/scripts/migrate-prefs.mjs +33 -16
  132. package/pipeline/scripts/phase-tracker.sh +3 -1
  133. package/pipeline/scripts/repo-map.mjs +110 -64
  134. package/pipeline/scripts/review-scope.mjs +7 -1
  135. package/pipeline/scripts/routine-registry.mjs +4 -9
  136. package/pipeline/scripts/run-aggregator.mjs +11 -5
  137. package/pipeline/scripts/run-metrics.mjs +13 -8
  138. package/pipeline/scripts/smoke-cross-cli-behavior.sh +21 -7
  139. package/pipeline/scripts/test-gap-scan.mjs +44 -12
  140. package/pipeline/scripts/test-integrity-gate.mjs +5 -1
  141. package/pipeline/scripts/token-budget-report.mjs +44 -21
  142. package/pipeline/scripts/triage-memory.mjs +126 -34
  143. package/pipeline/scripts/uninstall.mjs +74 -30
  144. package/pipeline/scripts/validate-analysis-doc.mjs +15 -5
  145. package/pipeline/scripts/validate-diff-risk.mjs +32 -18
  146. package/pipeline/scripts/validate-test-gap.mjs +17 -7
  147. package/pipeline/scripts/validate-triage.mjs +17 -5
  148. package/pipeline/scripts/write-state.mjs +32 -9
  149. package/pipeline/skills/.skills-index.json +91 -91
  150. package/pipeline/skills/shared/README.md +57 -57
  151. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +1 -1
  152. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +1 -1
  153. package/pipeline/skills/shared/core/multi-agent/SKILL.md +26 -279
  154. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +1 -1
  155. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +1 -1
  156. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +1 -1
  157. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  158. package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +1 -1
  159. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +1 -1
  160. package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +1 -1
  161. package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +1 -1
  162. package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +1 -1
  163. package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +1 -1
  164. package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +1 -1
  165. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  166. package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +1 -1
  167. package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +1 -1
  168. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
  169. package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +1 -1
  170. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +1 -1
  171. package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +1 -1
  172. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +1 -1
  173. package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +1 -1
  174. package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +1 -1
  175. package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +1 -1
  176. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +1 -1
  177. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +1 -1
  178. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +1 -1
  179. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +16 -8
  180. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +1 -1
  181. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +1 -1
  182. package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +1 -1
  183. package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +1 -1
  184. package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +1 -1
  185. package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +1 -1
  186. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +1 -1
  187. package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +1 -1
  188. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -1
  189. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +3 -3
  190. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +1 -1
  191. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +1 -1
  192. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +1 -1
  193. package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +1 -1
  194. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +1 -1
  195. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +1 -1
  196. package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -4
  197. package/pipeline/skills/shared/external/agentflow/SKILL.md +1 -1
  198. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +1 -1
  199. package/pipeline/skills/shared/external/android_ui_verification/SKILL.md +1 -1
  200. package/pipeline/skills/shared/external/api-patterns/SKILL.md +1 -1
  201. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +1 -1
  202. package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +1 -1
  203. package/pipeline/skills/shared/external/backlog/BACKLOG.md +1 -1
  204. package/pipeline/skills/shared/external/backlog/SKILL.md +12 -12
  205. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +1 -1
  206. package/pipeline/skills/shared/external/context-compression/SKILL.md +1 -1
  207. package/pipeline/skills/shared/external/council/SKILL.md +3 -3
  208. package/pipeline/skills/shared/external/css-modern/SKILL.md +1 -1
  209. package/pipeline/skills/shared/external/database-patterns/SKILL.md +1 -1
  210. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +1 -1
  211. package/pipeline/skills/shared/external/docker-expert/SKILL.md +1 -1
  212. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +1 -1
  213. package/pipeline/skills/shared/external/firebase/SKILL.md +1 -1
  214. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +1 -1
  215. package/pipeline/skills/shared/external/help-skills/SKILL.md +1 -1
  216. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +1 -1
  217. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +1 -1
  218. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +1 -1
  219. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +1 -1
  220. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +1 -1
  221. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +1 -1
  222. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +1 -1
  223. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +1 -1
  224. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +1 -1
  225. package/pipeline/skills/shared/external/html-semantic/SKILL.md +1 -1
  226. package/pipeline/skills/shared/external/humanizer/SKILL.md +1 -1
  227. package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +1 -1
  228. package/pipeline/skills/shared/external/ios-developer/SKILL.md +1 -1
  229. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +1 -1
  230. package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +1 -1
  231. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +1 -1
  232. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +1 -1
  233. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +1 -1
  234. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +1 -1
  235. package/pipeline/skills/shared/external/observability-engineer/SKILL.md +1 -1
  236. package/pipeline/skills/shared/external/python-patterns/SKILL.md +1 -1
  237. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -1
  238. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +1 -1
  239. package/pipeline/skills/shared/external/search-first/SKILL.md +2 -2
  240. package/pipeline/skills/shared/external/skill-creator/SKILL.md +12 -12
  241. package/pipeline/skills/shared/external/skill-creator/audit.md +21 -21
  242. package/pipeline/skills/shared/external/skill-creator/checklist.md +3 -3
  243. package/pipeline/skills/shared/external/skill-creator/examples.md +10 -10
  244. package/pipeline/skills/shared/external/skill-creator/label-check.md +17 -17
  245. package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +86 -50
  246. package/pipeline/skills/shared/external/skill-creator/template.md +9 -9
  247. package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +1 -1
  248. package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +1 -1
  249. package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +1 -1
  250. package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +1 -1
  251. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +1 -1
  252. package/pipeline/skills/shared/external/testing-backend/SKILL.md +1 -1
  253. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +1 -1
  254. package/pipeline/skills/shared/external/vue-composition/SKILL.md +1 -1
  255. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -1
  256. package/pipeline/skills/shared/external/web-performance/SKILL.md +1 -1
  257. package/pipeline/skills/shared/external/web-testing/SKILL.md +1 -1
  258. package/pipeline/skills/shared/external/xcode-build-benchmark/schemas/build-benchmark.schema.json +9 -49
  259. package/pipeline/skills/skills-index.md +57 -57
  260. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +0 -25
  261. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +0 -30
  262. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +0 -20
  263. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +0 -15
  264. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +0 -14
  265. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +0 -12
  266. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +0 -29
  267. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +0 -43
  268. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +0 -35
  269. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +0 -35
  270. package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +0 -14
  271. package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +0 -12
  272. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +0 -29
  273. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +0 -42
  274. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +0 -20
  275. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +0 -15
  276. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +0 -14
  277. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +0 -12
  278. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +0 -29
  279. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +0 -40
  280. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +0 -20
  281. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +0 -15
  282. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +0 -14
  283. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +0 -12
  284. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +0 -29
  285. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +0 -42
  286. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +0 -28
  287. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +0 -27
  288. package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +0 -14
  289. package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +0 -12
  290. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +0 -29
  291. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +0 -41
  292. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +0 -12
  293. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +0 -6
  294. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +0 -14
  295. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +0 -12
  296. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +0 -29
  297. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +0 -42
  298. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +0 -28
  299. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +0 -27
  300. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +0 -14
  301. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +0 -12
  302. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +0 -25
  303. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +0 -31
  304. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +0 -12
  305. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +0 -18
  306. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +0 -14
  307. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +0 -12
  308. package/pipeline/eval/golden-tasks/README.md +0 -65
  309. package/pipeline/eval/intent-cases.json +0 -40
  310. package/pipeline/eval/run-metrics-fixture.json +0 -46
  311. package/pipeline/eval/triage/01-empty-findings/expected.json +0 -6
  312. package/pipeline/eval/triage/01-empty-findings/input.json +0 -5
  313. package/pipeline/eval/triage/01-empty-findings/notes.md +0 -7
  314. package/pipeline/eval/triage/02-real-blocker/expected.json +0 -15
  315. package/pipeline/eval/triage/02-real-blocker/input.json +0 -14
  316. package/pipeline/eval/triage/02-real-blocker/notes.md +0 -7
  317. package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +0 -18
  318. package/pipeline/eval/triage/03-out-of-scope-defer/input.json +0 -14
  319. package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +0 -10
  320. package/pipeline/eval/triage/04-false-positive-reject/expected.json +0 -18
  321. package/pipeline/eval/triage/04-false-positive-reject/input.json +0 -14
  322. package/pipeline/eval/triage/04-false-positive-reject/notes.md +0 -10
  323. package/pipeline/eval/triage/05-mixed-classification/expected.json +0 -43
  324. package/pipeline/eval/triage/05-mixed-classification/input.json +0 -38
  325. package/pipeline/eval/triage/05-mixed-classification/notes.md +0 -17
  326. package/pipeline/eval/triage/06-severity-mismatch/expected.json +0 -15
  327. package/pipeline/eval/triage/06-severity-mismatch/input.json +0 -14
  328. package/pipeline/eval/triage/06-severity-mismatch/notes.md +0 -9
  329. package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +0 -27
  330. package/pipeline/eval/triage/07-duplicate-reviewers/input.json +0 -22
  331. package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +0 -9
  332. package/pipeline/eval/triage/08-style-misclassified/expected.json +0 -18
  333. package/pipeline/eval/triage/08-style-misclassified/input.json +0 -14
  334. package/pipeline/eval/triage/08-style-misclassified/notes.md +0 -9
  335. package/pipeline/eval/triage/09-cascading-finding/expected.json +0 -23
  336. package/pipeline/eval/triage/09-cascading-finding/input.json +0 -22
  337. package/pipeline/eval/triage/09-cascading-finding/notes.md +0 -9
  338. package/pipeline/eval/triage/10-deferred-crossref/expected.json +0 -18
  339. package/pipeline/eval/triage/10-deferred-crossref/input.json +0 -14
  340. package/pipeline/eval/triage/10-deferred-crossref/notes.md +0 -9
  341. package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +0 -27
  342. package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +0 -22
  343. package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +0 -14
  344. package/pipeline/eval/triage/README.md +0 -54
  345. package/pipeline/scripts/benchmark-phase-0.sh +0 -128
  346. package/pipeline/scripts/check-md-links.mjs +0 -84
  347. package/pipeline/scripts/eval-golden-tasks-live.mjs +0 -297
  348. package/pipeline/scripts/eval-golden-tasks.mjs +0 -212
  349. package/pipeline/scripts/eval-intent.mjs +0 -103
  350. package/pipeline/scripts/eval-mine-corpus.mjs +0 -201
  351. package/pipeline/scripts/eval-triage.mjs +0 -171
  352. package/pipeline/scripts/fixtures/diff-risk-android.diff +0 -40
  353. package/pipeline/scripts/fixtures/diff-risk-ios.diff +0 -48
  354. package/pipeline/scripts/fixtures/diff-risk-test-removal.diff +0 -40
  355. package/pipeline/scripts/fixtures/install-layout.tsv +0 -19
  356. package/pipeline/scripts/fixtures/pack-expected-count.txt +0 -1
  357. package/pipeline/scripts/fixtures/test-gap-node.diff +0 -30
  358. package/pipeline/scripts/fixtures/test-gap-python.diff +0 -32
  359. package/pipeline/scripts/lint-mcp-refs.mjs +0 -207
  360. package/pipeline/scripts/lint-skills.mjs +0 -143
  361. package/pipeline/scripts/run-smokes.mjs +0 -76
  362. package/pipeline/scripts/smoke-add-detail.sh +0 -137
  363. package/pipeline/scripts/smoke-agent-guard.sh +0 -74
  364. package/pipeline/scripts/smoke-agent-log-cost.sh +0 -262
  365. package/pipeline/scripts/smoke-agent-model-routing.sh +0 -87
  366. package/pipeline/scripts/smoke-ask-choice.sh +0 -42
  367. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +0 -36
  368. package/pipeline/scripts/smoke-bitbucket-contract.sh +0 -255
  369. package/pipeline/scripts/smoke-changelog-version.sh +0 -47
  370. package/pipeline/scripts/smoke-channels-approval-gate.sh +0 -60
  371. package/pipeline/scripts/smoke-channels-flow.sh +0 -130
  372. package/pipeline/scripts/smoke-ci-workflows.sh +0 -88
  373. package/pipeline/scripts/smoke-clarify.sh +0 -148
  374. package/pipeline/scripts/smoke-command-inventory.sh +0 -81
  375. package/pipeline/scripts/smoke-commands-skills-parity.sh +0 -87
  376. package/pipeline/scripts/smoke-community-gates.sh +0 -75
  377. package/pipeline/scripts/smoke-compliance-skills.sh +0 -119
  378. package/pipeline/scripts/smoke-config-hygiene.sh +0 -58
  379. package/pipeline/scripts/smoke-cost-budget.sh +0 -70
  380. package/pipeline/scripts/smoke-cost-summary.sh +0 -139
  381. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +0 -128
  382. package/pipeline/scripts/smoke-description-tr.sh +0 -82
  383. package/pipeline/scripts/smoke-dev-critic.sh +0 -144
  384. package/pipeline/scripts/smoke-diff-explain.sh +0 -147
  385. package/pipeline/scripts/smoke-diff-risk.sh +0 -190
  386. package/pipeline/scripts/smoke-dynamic-skill-loading.sh +0 -160
  387. package/pipeline/scripts/smoke-eval-live.sh +0 -136
  388. package/pipeline/scripts/smoke-evidence-gate.sh +0 -93
  389. package/pipeline/scripts/smoke-extract-conventions.sh +0 -163
  390. package/pipeline/scripts/smoke-fetchers-offline.sh +0 -448
  391. package/pipeline/scripts/smoke-figma-dispatch.sh +0 -112
  392. package/pipeline/scripts/smoke-gate-hooks.sh +0 -74
  393. package/pipeline/scripts/smoke-gc-tmp.sh +0 -130
  394. package/pipeline/scripts/smoke-gc-worktrees.sh +0 -125
  395. package/pipeline/scripts/smoke-generate-issue.sh +0 -120
  396. package/pipeline/scripts/smoke-handoff-contract.sh +0 -92
  397. package/pipeline/scripts/smoke-identity-isolation.sh +0 -70
  398. package/pipeline/scripts/smoke-install-layout.sh +0 -248
  399. package/pipeline/scripts/smoke-intent-guard.sh +0 -86
  400. package/pipeline/scripts/smoke-issue-comment-template.sh +0 -86
  401. package/pipeline/scripts/smoke-issue-jira-triad.sh +0 -120
  402. package/pipeline/scripts/smoke-keychain.sh +0 -158
  403. package/pipeline/scripts/smoke-language-axis.sh +0 -109
  404. package/pipeline/scripts/smoke-learning-curve.sh +0 -61
  405. package/pipeline/scripts/smoke-learnings-ledger.sh +0 -86
  406. package/pipeline/scripts/smoke-lib-scripts.sh +0 -448
  407. package/pipeline/scripts/smoke-mcp-gate.sh +0 -68
  408. package/pipeline/scripts/smoke-md-links.sh +0 -8
  409. package/pipeline/scripts/smoke-md2confluence.sh +0 -126
  410. package/pipeline/scripts/smoke-metrics-cache-ratio.sh +0 -72
  411. package/pipeline/scripts/smoke-migrate-state.sh +0 -102
  412. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +0 -161
  413. package/pipeline/scripts/smoke-model-fallback.sh +0 -89
  414. package/pipeline/scripts/smoke-multi-repo-integration.sh +0 -116
  415. package/pipeline/scripts/smoke-multi-repo-worktree.sh +0 -61
  416. package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +0 -115
  417. package/pipeline/scripts/smoke-no-token-prompt.sh +0 -85
  418. package/pipeline/scripts/smoke-pack-contents.sh +0 -140
  419. package/pipeline/scripts/smoke-pat-audit.sh +0 -128
  420. package/pipeline/scripts/smoke-per-repo-memory.sh +0 -156
  421. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +0 -170
  422. package/pipeline/scripts/smoke-phase-6-multi.sh +0 -79
  423. package/pipeline/scripts/smoke-phase-banner.sh +0 -101
  424. package/pipeline/scripts/smoke-phase-tracker.sh +0 -324
  425. package/pipeline/scripts/smoke-phase0-bridge-contract.sh +0 -241
  426. package/pipeline/scripts/smoke-phase4-gates.sh +0 -45
  427. package/pipeline/scripts/smoke-phase4-triage.sh +0 -229
  428. package/pipeline/scripts/smoke-plan-approval-gate.sh +0 -71
  429. package/pipeline/scripts/smoke-plan-safety.sh +0 -139
  430. package/pipeline/scripts/smoke-plan-todos.sh +0 -196
  431. package/pipeline/scripts/smoke-plugin-validate.sh +0 -64
  432. package/pipeline/scripts/smoke-pr-review-actions.sh +0 -152
  433. package/pipeline/scripts/smoke-pre-commit.sh +0 -170
  434. package/pipeline/scripts/smoke-pref-migration.sh +0 -226
  435. package/pipeline/scripts/smoke-prefs-language.sh +0 -134
  436. package/pipeline/scripts/smoke-progress-contract.sh +0 -127
  437. package/pipeline/scripts/smoke-prune-logs.sh +0 -137
  438. package/pipeline/scripts/smoke-purge.sh +0 -138
  439. package/pipeline/scripts/smoke-push-retry.sh +0 -75
  440. package/pipeline/scripts/smoke-repo-map.sh +0 -300
  441. package/pipeline/scripts/smoke-review-readiness.sh +0 -92
  442. package/pipeline/scripts/smoke-review-watch.sh +0 -146
  443. package/pipeline/scripts/smoke-routines.sh +0 -84
  444. package/pipeline/scripts/smoke-run-aggregator.sh +0 -216
  445. package/pipeline/scripts/smoke-run-metrics.sh +0 -50
  446. package/pipeline/scripts/smoke-search.sh +0 -187
  447. package/pipeline/scripts/smoke-shadow-git.sh +0 -224
  448. package/pipeline/scripts/smoke-skill-authoring.sh +0 -137
  449. package/pipeline/scripts/smoke-skill-language.sh +0 -83
  450. package/pipeline/scripts/smoke-skill-manifest.sh +0 -138
  451. package/pipeline/scripts/smoke-skill-scan.sh +0 -198
  452. package/pipeline/scripts/smoke-source-parity.sh +0 -85
  453. package/pipeline/scripts/smoke-subagent-validators.sh +0 -108
  454. package/pipeline/scripts/smoke-sync-parity.sh +0 -92
  455. package/pipeline/scripts/smoke-tasklist-ordering.sh +0 -112
  456. package/pipeline/scripts/smoke-telemetry.sh +0 -147
  457. package/pipeline/scripts/smoke-test-gap.sh +0 -183
  458. package/pipeline/scripts/smoke-token-budget.sh +0 -67
  459. package/pipeline/scripts/smoke-token-preflight.sh +0 -82
  460. package/pipeline/scripts/smoke-tracker-contract.sh +0 -191
  461. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +0 -73
  462. package/pipeline/scripts/smoke-triage-memory.sh +0 -174
  463. package/pipeline/scripts/smoke-update-check.sh +0 -135
  464. package/pipeline/scripts/smoke-url-enrichment.sh +0 -70
  465. package/pipeline/scripts/smoke-validate-analysis-doc.sh +0 -161
  466. package/pipeline/scripts/smoke-validator-contradiction.sh +0 -67
  467. package/pipeline/scripts/smoke-validator-gates.sh +0 -164
  468. package/pipeline/scripts/smoke-vercel-deploy-redact.sh +0 -129
  469. package/pipeline/scripts/smoke-verify-by-test.sh +0 -148
  470. package/pipeline/scripts/smoke-wiki-integration.sh +0 -122
  471. package/pipeline/scripts/smoke-work-summary.sh +0 -163
  472. package/pipeline/scripts/smoke-workflow-audit.sh +0 -69
  473. package/pipeline/scripts/smoke-worktree-path-convention.sh +0 -86
  474. package/pipeline/scripts/smoke-wrapper-preservation.sh +0 -68
  475. package/pipeline/scripts/smoke-write-state.sh +0 -115
  476. package/pipeline/scripts/sync-parity-check.sh +0 -135
  477. package/pipeline/scripts/test-gap-rules/android.json +0 -25
  478. package/pipeline/scripts/test-gap-rules/ios.json +0 -29
  479. package/pipeline/scripts/test-gap-rules/node.json +0 -17
  480. package/pipeline/scripts/test-gap-rules/python.json +0 -19
  481. package/pipeline/scripts/validate-schemas.mjs +0 -88
@@ -1,224 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-shadow-git.sh
3
- #
4
- # Verifies the shadow-git checkpoint surface:
5
- # 1. pipeline/lib/shadow-git.sh exists, parses cleanly
6
- # 2. --help / unknown subcommand exits non-zero with usage
7
- # 3. doctor runs cleanly on an empty environment
8
- # 4. Lifecycle: init → snapshot → list → restore (--files) → prune
9
- # 5. Baseline snapshot is auto-created by init
10
- # 6. snapshot with no changes is a no-op (exits 0, no new commit)
11
- # 7. node_modules / Pods / DerivedData NOT tracked even when ignored
12
- # isn't already in the project's .gitignore
13
- # 8. restore actually reverts file contents
14
- # 9. prune removes the shadow dir
15
- # 10. prefs schema exposes shadowGit.{enabled, mode, pruneAfterDays}
16
- # 11. shadowGit.enabled defaults to false (opt-in)
17
- # 12. shadowGit.mode default is per-todo-step
18
- # 13. Phase 3 doc documents shadow-git.sh wiring (init + snapshot + restore)
19
- #
20
- # Exit 0 = all pass, 1 = any failure.
21
-
22
- set -uo pipefail
23
-
24
- ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
25
- SG="$ROOT/pipeline/lib/shadow-git.sh"
26
- PREFS="$ROOT/pipeline/schemas/prefs.schema.json"
27
- P3="$ROOT/pipeline/multi-agent-refs/phases/phase-3-dev.md"
28
-
29
- pass=0
30
- fail=0
31
- failures=()
32
- record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
33
- record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
34
-
35
- printf '→ smoke-shadow-git: per-tool-call checkpoint contract\n'
36
-
37
- # 1. Script exists + parses
38
- if [ ! -f "$SG" ]; then
39
- record_fail "pipeline/lib/shadow-git.sh missing"
40
- elif ! bash -n "$SG" 2>/dev/null; then
41
- record_fail "shadow-git.sh syntax error"
42
- else
43
- record_pass "shadow-git.sh exists and parses"
44
- fi
45
-
46
- # 2. Unknown subcommand
47
- if bash "$SG" garbage >/dev/null 2>&1; then
48
- record_fail "unknown subcommand should exit non-zero"
49
- else
50
- record_pass "unknown subcommand rejected"
51
- fi
52
-
53
- # 3. Doctor on empty environment
54
- if bash "$SG" doctor >/dev/null 2>&1; then
55
- record_pass "doctor runs cleanly"
56
- else
57
- record_fail "doctor crashed on empty environment"
58
- fi
59
-
60
- # 4-9. Lifecycle on a temp project
61
- TMP=$(mktemp -d)
62
- # A failed cd here would run the relative `rm -rf DerivedData` below in the
63
- # caller's directory instead of the sandbox.
64
- cd "$TMP" || { record_fail "cannot cd into sandbox $TMP"; exit 1; }
65
- git init --quiet
66
- echo "node_modules/" > .gitignore
67
- echo "hello" > a.txt
68
- mkdir -p node_modules && echo "trash" > node_modules/x.txt
69
-
70
- TASK_ID="SMOKE-SG-$$"
71
- if bash "$SG" init "$TASK_ID" "$TMP" >/dev/null 2>&1; then
72
- record_pass "init creates shadow repo"
73
- else
74
- record_fail "init failed"
75
- fi
76
-
77
- # Baseline snapshot exists
78
- list_after_init=$(bash "$SG" list "$TASK_ID" 2>/dev/null | awk 'NF{c++} END{print c+0}')
79
- if [ "$list_after_init" -eq 1 ]; then
80
- record_pass "init created exactly one baseline snapshot"
81
- else
82
- record_fail "init should create baseline; got $list_after_init snapshots"
83
- fi
84
-
85
- # 6. No-op snapshot
86
- bash "$SG" snapshot "$TASK_ID" "$TMP" "no-op-attempt" >/dev/null 2>&1
87
- list_after_noop=$(bash "$SG" list "$TASK_ID" 2>/dev/null | awk 'NF{c++} END{print c+0}')
88
- if [ "$list_after_noop" -eq 1 ]; then
89
- record_pass "snapshot with no changes is a no-op (still 1 commit)"
90
- else
91
- record_fail "no-op snapshot created a phantom commit"
92
- fi
93
-
94
- # 7. node_modules NOT tracked
95
- if bash "$SG" list "$TASK_ID" >/dev/null 2>&1 \
96
- && ! git --git-dir="$HOME/.claude/state/shadow-git/$TASK_ID/.git" --work-tree="$TMP" \
97
- ls-files 2>/dev/null | grep -q "^node_modules/"; then
98
- record_pass "node_modules NOT tracked by shadow repo"
99
- else
100
- record_fail "node_modules leaked into shadow tracking"
101
- fi
102
-
103
- # 7b. Forced excludes apply even when NOT in the project .gitignore
104
- # (DerivedData is not in this fixture's .gitignore; it must be excluded via
105
- # the shadow repo's .git/info/exclude).
106
- mkdir -p DerivedData && echo "buildjunk" > DerivedData/junk.txt
107
- bash "$SG" snapshot "$TASK_ID" "$TMP" "derived-data-probe" >/dev/null 2>&1
108
- if ! git --git-dir="$HOME/.claude/state/shadow-git/$TASK_ID/.git" --work-tree="$TMP" \
109
- ls-files 2>/dev/null | grep -q "^DerivedData/"; then
110
- record_pass "DerivedData NOT tracked (forced exclude in .git/info/exclude)"
111
- else
112
- record_fail "DerivedData leaked into shadow tracking (forced excludes dead)"
113
- fi
114
- rm -rf DerivedData
115
-
116
- # Make a real edit + a brand-new file + snapshot
117
- echo "hello-changed" > a.txt
118
- echo "post-baseline" > b.txt
119
- sha_edit=$(bash "$SG" snapshot "$TASK_ID" "$TMP" "edited a.txt" 2>/dev/null | head -1)
120
- if [ -n "$sha_edit" ] && [ "${#sha_edit}" -ge 7 ]; then
121
- record_pass "snapshot after edit produced a sha: $sha_edit"
122
- else
123
- record_fail "snapshot after edit returned no sha"
124
- fi
125
-
126
- list_now=$(bash "$SG" list "$TASK_ID" 2>/dev/null | awk 'NF{c++} END{print c+0}')
127
- if [ "$list_now" -eq 2 ]; then
128
- record_pass "list now shows 2 snapshots"
129
- else
130
- record_fail "expected 2 snapshots, got $list_now"
131
- fi
132
-
133
- # 8. Restore the baseline
134
- echo "never-snapshotted" > c.txt # created after the last snapshot
135
- baseline_sha=$(bash "$SG" list "$TASK_ID" 2>/dev/null | tail -1 | awk '{print $1}')
136
- bash "$SG" restore "$TASK_ID" "$TMP" "$baseline_sha" --files >/dev/null 2>&1
137
- if [ "$(cat "$TMP/a.txt")" = "hello" ]; then
138
- record_pass "restore reverted a.txt to baseline content"
139
- else
140
- record_fail "restore did not revert a.txt (got '$(cat "$TMP/a.txt")')"
141
- fi
142
-
143
- # 8b. Restore removes files that did not exist in the snapshot
144
- if [ ! -f "$TMP/b.txt" ]; then
145
- record_pass "restore removed b.txt (committed after baseline)"
146
- else
147
- record_fail "restore left b.txt in place (created after snapshot must be removed)"
148
- fi
149
- if [ ! -f "$TMP/c.txt" ]; then
150
- record_pass "restore removed c.txt (never snapshotted)"
151
- else
152
- record_fail "restore left c.txt in place (untracked new file must be removed)"
153
- fi
154
- if [ -f "$TMP/node_modules/x.txt" ]; then
155
- record_pass "restore left ignored node_modules untouched"
156
- else
157
- record_fail "restore deleted ignored files (node_modules must survive clean)"
158
- fi
159
-
160
- # 9. Prune
161
- bash "$SG" prune "$TASK_ID" >/dev/null 2>&1
162
- if [ ! -d "$HOME/.claude/state/shadow-git/$TASK_ID" ]; then
163
- record_pass "prune removed the shadow repo"
164
- else
165
- record_fail "prune did not remove the shadow dir"
166
- fi
167
-
168
- # 9b. Task-id validation: traversal and separator ids are rejected before any
169
- # rm -rf (a "prune .." must never delete ~/.claude/state).
170
- for bad_id in ".." "." "a/b" "-x!"; do
171
- if bash "$SG" prune "$bad_id" >/dev/null 2>&1; then
172
- record_fail "prune accepted unsafe task id '$bad_id'"
173
- else
174
- record_pass "prune rejects unsafe task id '$bad_id'"
175
- fi
176
- done
177
- if [ -d "$HOME/.claude/state" ]; then
178
- record_pass "~/.claude/state survived unsafe prune attempts"
179
- else
180
- record_fail "~/.claude/state is GONE after unsafe prune attempts"
181
- fi
182
-
183
- cd - >/dev/null || true
184
- rm -rf "$TMP"
185
-
186
- # 10-12. Prefs schema
187
- for prop in enabled mode pruneAfterDays; do
188
- if jq -e ".properties.global.properties.shadowGit.properties.${prop}" "$PREFS" >/dev/null 2>&1; then
189
- record_pass "prefs schema exposes shadowGit.${prop}"
190
- else
191
- record_fail "prefs schema missing shadowGit.${prop}"
192
- fi
193
- done
194
- if jq -e '.properties.global.properties.shadowGit.properties.enabled
195
- | has("default") and .default == false' "$PREFS" >/dev/null 2>&1; then
196
- record_pass "shadowGit.enabled defaults to false"
197
- else
198
- record_fail "shadowGit.enabled should default to false"
199
- fi
200
- mode_default=$(jq -r '.properties.global.properties.shadowGit.properties.mode.default // empty' "$PREFS")
201
- if [ "$mode_default" = "per-todo-step" ]; then
202
- record_pass "shadowGit.mode defaults to per-todo-step"
203
- else
204
- record_fail "shadowGit.mode default should be per-todo-step (got: ${mode_default:-missing})"
205
- fi
206
-
207
- # 13. Phase 3 doc wiring
208
- if [ ! -f "$P3" ]; then
209
- record_fail "phase-3-dev.md missing"
210
- elif grep -qE 'shadow-git\.sh"? init' "$P3" \
211
- && grep -qE 'shadow-git\.sh"? snapshot' "$P3" \
212
- && grep -qE 'shadow-git\.sh"? restore' "$P3"; then
213
- record_pass "phase-3-dev.md documents init + snapshot + restore"
214
- else
215
- record_fail "phase-3-dev.md missing one of init/snapshot/restore wiring"
216
- fi
217
-
218
- printf '\n══ shadow-git smoke: %d passed, %d failed ══\n' "$pass" "$fail"
219
- if [ "$fail" -gt 0 ]; then
220
- printf '\nFailures:\n'
221
- for msg in "${failures[@]}"; do printf ' - %s\n' "$msg"; done
222
- exit 1
223
- fi
224
- exit 0
@@ -1,137 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-skill-authoring.sh - authoring-hygiene audit for OUR authored skills.
3
- #
4
- # Based on Anthropic's skill-authoring guide + alexop.dev "Stop Bloating Your
5
- # CLAUDE.md" (April 2026 community consensus).
6
- #
7
- # SCOPE: only skills we author. Specifically:
8
- #
9
- # pipeline/skills/shared/core/ - our orchestration + compliance skills
10
- #
11
- # INTENTIONALLY NOT AUDITED (upstream imports / different schema):
12
- #
13
- # pipeline/skills/shared/external/ - curated third-party skills (own frontmatter)
14
- #
15
- # Rules:
16
- # 1. Every SKILL.md has YAML frontmatter (--- ... ---)
17
- # 2. Frontmatter `name` matches the directory name
18
- # 3. `description` non-empty and ≥ 20 chars
19
- # 4. Body length ≤ 500 lines - WARN (split to SKILL.md + REFERENCE.md)
20
- # 5. Body length ≤ 1000 lines - HARD (catalog clearly doesn't belong in SKILL.md)
21
- #
22
- # Rule 4 is warn-only. Rule 5 fails the suite. Rules 1-3 fail the suite.
23
- #
24
- # Rationale: progressive disclosure is an emerging 2026 best practice. Large
25
- # skills poison the context window; splitting out REFERENCE.md keeps the
26
- # action-description short (what the model sees on skill dispatch) while
27
- # keeping the catalog discoverable on demand.
28
-
29
- set -euo pipefail
30
-
31
- HERE="$(cd "$(dirname "$0")" && pwd)"
32
- ROOT="$(cd "$HERE/../.." && pwd)"
33
-
34
- WARN_LINES=500
35
- FAIL_LINES=1000
36
- MIN_DESC_CHARS=20
37
-
38
- PASS=0
39
- WARN=0
40
- FAIL=0
41
-
42
- pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
43
- warn() { WARN=$((WARN+1)); echo " ⚠ $1"; }
44
- fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
45
-
46
- # Only our authored skill trees - upstream imports live under external/
47
- # and are exempt (own frontmatter conventions).
48
- TARGETS=(
49
- "$ROOT/pipeline/skills/shared/core"
50
- )
51
-
52
- # Collect the list once.
53
- SKILLS=$(find "${TARGETS[@]}" -name 'SKILL.md' -type f 2>/dev/null | sort)
54
- SKILL_COUNT=$(echo "$SKILLS" | grep -c . || true)
55
-
56
- echo "→ Scope: $SKILL_COUNT authored SKILL.md files under shared/core/"
57
- echo " (external/ intentionally excluded - upstream conventions)"
58
- echo ""
59
-
60
- echo "→ 1. Every SKILL.md has YAML frontmatter (--- ... ---)"
61
- MISSING_FM=0
62
- while IFS= read -r f; do
63
- [ -z "$f" ] && continue
64
- if ! head -1 "$f" | grep -q '^---$'; then
65
- fail "frontmatter missing: ${f#$ROOT/}"
66
- MISSING_FM=$((MISSING_FM+1))
67
- fi
68
- done <<< "$SKILLS"
69
- [ "$MISSING_FM" -eq 0 ] && pass "all authored skills have frontmatter"
70
-
71
- echo ""
72
- echo "→ 2. Frontmatter name matches directory name"
73
- MISMATCH=0
74
- while IFS= read -r f; do
75
- [ -z "$f" ] && continue
76
- dir_name=$(basename "$(dirname "$f")")
77
- fm_name=$(awk -F: '/^name:/ {sub(/^name:[[:space:]]*/,"",$0); sub(/^name:[[:space:]]*/,""); gsub(/"/,""); gsub(/^[[:space:]]+/,""); gsub(/[[:space:]]+$/,""); print; exit}' "$f" 2>/dev/null || true)
78
- if [ -z "$fm_name" ]; then
79
- fail "frontmatter missing name: ${f#$ROOT/}"
80
- MISMATCH=$((MISMATCH+1))
81
- elif [ "$dir_name" != "$fm_name" ]; then
82
- fail "dir='${dir_name}' vs name='${fm_name}': ${f#$ROOT/}"
83
- MISMATCH=$((MISMATCH+1))
84
- fi
85
- done <<< "$SKILLS"
86
- [ "$MISMATCH" -eq 0 ] && pass "all names match directory names"
87
-
88
- echo ""
89
- echo "→ 3. description field non-empty and ≥ $MIN_DESC_CHARS chars"
90
- SHORT_DESC=0
91
- while IFS= read -r f; do
92
- [ -z "$f" ] && continue
93
- desc=$(awk '
94
- BEGIN { in_fm=0 }
95
- /^---$/ { in_fm++; next }
96
- in_fm==1 && /^description:/ {
97
- sub(/^description:[[:space:]]*/,"");
98
- gsub(/^["'\''"]/,"");
99
- gsub(/["'\''"]$/,"");
100
- print;
101
- exit
102
- }
103
- ' "$f" 2>/dev/null || true)
104
- len=${#desc}
105
- if [ "$len" -lt "$MIN_DESC_CHARS" ]; then
106
- fail "description too short (${len} chars, need ≥${MIN_DESC_CHARS}): ${f#$ROOT/}"
107
- SHORT_DESC=$((SHORT_DESC+1))
108
- fi
109
- done <<< "$SKILLS"
110
- [ "$SHORT_DESC" -eq 0 ] && pass "all descriptions meet minimum length"
111
-
112
- echo ""
113
- echo "→ 4. Body length within budget (warn > $WARN_LINES, hard-fail > $FAIL_LINES)"
114
- WARN_COUNT=0
115
- HARD_COUNT=0
116
- while IFS= read -r f; do
117
- [ -z "$f" ] && continue
118
- total=$(wc -l < "$f")
119
- # Find the closing --- of frontmatter (line of 2nd ^---$).
120
- fm_end=$(awk '/^---$/ { n++; if (n==2) { print NR; exit } }' "$f")
121
- [ -z "$fm_end" ] && fm_end=0
122
- body=$((total - fm_end))
123
- if [ "$body" -gt "$FAIL_LINES" ]; then
124
- fail "body $body lines > $FAIL_LINES (HARD - split into REFERENCE.md): ${f#$ROOT/}"
125
- HARD_COUNT=$((HARD_COUNT+1))
126
- elif [ "$body" -gt "$WARN_LINES" ]; then
127
- warn "body $body lines > $WARN_LINES (consider SKILL.md + REFERENCE.md split): ${f#$ROOT/}"
128
- WARN_COUNT=$((WARN_COUNT+1))
129
- fi
130
- done <<< "$SKILLS"
131
- [ "$HARD_COUNT" -eq 0 ] && [ "$WARN_COUNT" -eq 0 ] && pass "all authored skills fit budget"
132
-
133
- echo ""
134
- echo "══ skill-authoring smoke: $PASS passed, $WARN warnings, $FAIL failed ══"
135
-
136
- # Warnings don't fail the suite; hard failures do.
137
- [ "$FAIL" -eq 0 ]
@@ -1,83 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-skill-language.sh - guard the "skill UI is always English" rule.
3
- #
4
- # Memory rule: skill picker / confirmation / error UI exposed by the CLI host
5
- # stays English regardless of the user's prefs.global.outputLanguage. The
6
- # host renders SKILL.md frontmatter (`description`, `argument-hint`) in its
7
- # selector - so those fields must be English.
8
- #
9
- # This smoke fails if any SKILL.md description/argument-hint field contains
10
- # Turkish-only characters (`ç`, `ğ`, `ı`, `ö`, `ş`, `ü`, plus uppercase
11
- # variants `Ç`, `Ğ`, `İ`, `Ö`, `Ş`, `Ü`) - a cheap proxy for "non-English
12
- # prose snuck into a host-visible field."
13
- #
14
- # What this DOES NOT enforce:
15
- # - The body of a SKILL.md may contain Turkish (the `language: tr` field
16
- # declares a runtime body language). Only frontmatter description and
17
- # argument-hint are checked.
18
- # - Loanwords and proper nouns in EN that happen to use diacritics are
19
- # rejected - adjust the allowlist below if a legitimate case appears.
20
- #
21
- # Exit codes: 0=pass, 1=violation, 2=structural error.
22
- set -uo pipefail
23
-
24
- REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
25
- SKILLS_ROOT="$REPO_ROOT/pipeline/skills/shared/core"
26
-
27
- if [ ! -d "$SKILLS_ROOT" ]; then
28
- echo "FAIL: $SKILLS_ROOT missing" >&2
29
- exit 2
30
- fi
31
-
32
- # Turkish-specific characters (lower + upper).
33
- TR_CHARS='çğıöşüÇĞİÖŞÜ'
34
-
35
- PASS=0
36
- FAIL=0
37
- pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
38
- fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
39
-
40
- extract_field() {
41
- local file="$1"
42
- local field="$2"
43
- awk -v f="$field" '
44
- /^---[[:space:]]*$/ { fm = !fm; next }
45
- fm && $0 ~ "^"f":" {
46
- sub("^"f":[[:space:]]*", "")
47
- gsub(/^"|"$/, "")
48
- print
49
- exit
50
- }
51
- ' "$file"
52
- }
53
-
54
- echo "→ Scanning SKILL.md files under $SKILLS_ROOT for Turkish chars in host-visible fields"
55
- echo ""
56
-
57
- while IFS= read -r -d '' skill_file; do
58
- rel="${skill_file#$REPO_ROOT/}"
59
-
60
- desc=$(extract_field "$skill_file" "description")
61
- hint=$(extract_field "$skill_file" "argument-hint")
62
-
63
- if [ -n "$desc" ]; then
64
- if [[ "$desc" =~ [$TR_CHARS] ]]; then
65
- fail "$rel: description contains Turkish chars → '$desc'"
66
- else
67
- pass "$rel: description is ASCII-clean"
68
- fi
69
- fi
70
-
71
- if [ -n "$hint" ]; then
72
- if [[ "$hint" =~ [$TR_CHARS] ]]; then
73
- fail "$rel: argument-hint contains Turkish chars → '$hint'"
74
- else
75
- pass "$rel: argument-hint is ASCII-clean"
76
- fi
77
- fi
78
- done < <(find "$SKILLS_ROOT" -name "SKILL.md" -print0)
79
-
80
- echo ""
81
- echo "══ smoke-skill-language: $PASS passed, $FAIL failed ══"
82
-
83
- [ "$FAIL" -eq 0 ] || exit 1
@@ -1,138 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-skill-manifest.sh - v6.2.H
3
- #
4
- # Asserts the sign-skills / verify-skills contract:
5
- # 1. sign-skills.sh produces a valid .skill-manifest.json with schemaVersion + entries
6
- # 2. verify-skills.sh exits 0 on clean baseline
7
- # 3. verify-skills.sh exits 2 when a SKILL.md is mutated
8
- # 4. verify-skills.sh exits 2 when a SKILL.md is deleted
9
- # 5. verify-skills.sh exits 3 when a new SKILL.md is added (not in manifest)
10
- # 6. verify-skills.sh fail-opens (exit 0) when manifest is absent
11
- #
12
- # Works on a temp sandbox - never touches the repo's real manifest.
13
-
14
- set -euo pipefail
15
-
16
- ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
17
- SIGN="$ROOT/pipeline/scripts/sign-skills.sh"
18
- VERIFY="$ROOT/pipeline/scripts/verify-skills.sh"
19
-
20
- pass=0
21
- fail=0
22
- failures=()
23
- record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
24
- record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
25
-
26
- printf '→ smoke-skill-manifest (v6.2.H): sign + verify integrity contract\n'
27
-
28
- sandbox=$(mktemp -d)
29
- skills="$sandbox/skills"
30
- mkdir -p "$skills/group-a" "$skills/group-b"
31
-
32
- cat > "$skills/group-a/SKILL.md" <<'S'
33
- ---
34
- name: group-a
35
- description: test skill A
36
- ---
37
- body A
38
- S
39
-
40
- cat > "$skills/group-b/SKILL.md" <<'S'
41
- ---
42
- name: group-b
43
- description: test skill B
44
- ---
45
- body B
46
- S
47
-
48
- # --- 1: sign produces manifest ---
49
- bash "$SIGN" --root "$skills" >/dev/null
50
- if [ -f "$skills/.skill-manifest.json" ] && \
51
- jq -e '.schemaVersion and .entries and (.skillCount == 2)' "$skills/.skill-manifest.json" >/dev/null; then
52
- record_pass "sign wrote valid manifest with 2 entries"
53
- else
54
- record_fail "sign output malformed"
55
- fi
56
-
57
- # --- 2: verify clean ---
58
- if bash "$VERIFY" --root "$skills" --quiet; then
59
- record_pass "verify exits 0 on clean baseline"
60
- else
61
- record_fail "verify should exit 0 on clean baseline"
62
- fi
63
-
64
- # --- 3: mutation → drift (exit 2) ---
65
- echo 'tampered' >> "$skills/group-a/SKILL.md"
66
- set +e
67
- bash "$VERIFY" --root "$skills" --quiet
68
- rc=$?
69
- set -e
70
- if [ "$rc" = "2" ]; then
71
- record_pass "verify detects mutation (exit 2)"
72
- else
73
- record_fail "verify should exit 2 on mutation (got $rc)"
74
- fi
75
-
76
- # restore
77
- bash "$SIGN" --root "$skills" >/dev/null
78
-
79
- # --- 4: deletion → missing (exit 2) ---
80
- rm "$skills/group-a/SKILL.md"
81
- set +e
82
- bash "$VERIFY" --root "$skills" --quiet
83
- rc=$?
84
- set -e
85
- if [ "$rc" = "2" ]; then
86
- record_pass "verify detects deletion (exit 2)"
87
- else
88
- record_fail "verify should exit 2 on deletion (got $rc)"
89
- fi
90
-
91
- # restore
92
- mkdir -p "$skills/group-a"
93
- cat > "$skills/group-a/SKILL.md" <<'S'
94
- ---
95
- name: group-a
96
- description: test skill A
97
- ---
98
- body A
99
- S
100
- bash "$SIGN" --root "$skills" >/dev/null
101
-
102
- # --- 5: addition → extra (exit 3) ---
103
- mkdir -p "$skills/group-c"
104
- cat > "$skills/group-c/SKILL.md" <<'S'
105
- ---
106
- name: group-c
107
- description: new skill not in manifest
108
- ---
109
- body C
110
- S
111
-
112
- set +e
113
- bash "$VERIFY" --root "$skills" --quiet
114
- rc=$?
115
- set -e
116
- if [ "$rc" = "3" ]; then
117
- record_pass "verify detects extra file (exit 3)"
118
- else
119
- record_fail "verify should exit 3 on extra file (got $rc)"
120
- fi
121
-
122
- # --- 6: missing manifest → fail-open exit 0 ---
123
- rm "$skills/.skill-manifest.json"
124
- if bash "$VERIFY" --root "$skills" --quiet; then
125
- record_pass "verify fail-opens when manifest absent (first install)"
126
- else
127
- record_fail "verify should fail-open with no manifest"
128
- fi
129
-
130
- rm -rf "$sandbox"
131
-
132
- printf '\n══ skill-manifest smoke: %d passed, %d failed ══\n' "$pass" "$fail"
133
- if [ "$fail" -gt 0 ]; then
134
- printf '\nFailures:\n'
135
- for m in "${failures[@]}"; do printf ' - %s\n' "$m"; done
136
- exit 1
137
- fi
138
- exit 0