@mmerterden/multi-agent-pipeline 8.6.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 (817) hide show
  1. package/CHANGELOG.md +2623 -0
  2. package/LICENSE +21 -0
  3. package/README.md +852 -0
  4. package/docs/FIGMA_PIPELINE.md +138 -0
  5. package/docs/GENERICITY-REVIEW.md +277 -0
  6. package/docs/STABILITY-FIX-PLAN.md +168 -0
  7. package/docs/adr/0001-three-model-triage.md +81 -0
  8. package/docs/adr/0002-instruction-driven-flag.md +62 -0
  9. package/docs/adr/0003-unified-shared-skills.md +55 -0
  10. package/docs/adr/0004-zero-dependency-philosophy.md +60 -0
  11. package/docs/adr/0005-lazy-phase-docs.md +68 -0
  12. package/docs/adr/0006-skills-core-external-split.md +52 -0
  13. package/docs/adr/0007-multi-tool-adapter-framework.md +110 -0
  14. package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +98 -0
  15. package/docs/adr/README.md +33 -0
  16. package/docs/architecture.md +181 -0
  17. package/docs/best-practices.md +93 -0
  18. package/docs/features.md +274 -0
  19. package/docs/performance.md +116 -0
  20. package/docs/recovery-guide.md +479 -0
  21. package/index.js +76 -0
  22. package/install/_adapters.mjs +69 -0
  23. package/install/_common.mjs +150 -0
  24. package/install/_copilot-instructions.mjs +32 -0
  25. package/install/_dev-only-files.mjs +23 -0
  26. package/install/_platform-filter.mjs +132 -0
  27. package/install/_telemetry.mjs +79 -0
  28. package/install/claude.mjs +332 -0
  29. package/install/copilot.mjs +254 -0
  30. package/install/index.mjs +179 -0
  31. package/install/templates/copilot-instructions.md +319 -0
  32. package/install.js +24 -0
  33. package/package.json +78 -0
  34. package/pipeline/adapters/_base.mjs +288 -0
  35. package/pipeline/adapters/copilot-chat.mjs +158 -0
  36. package/pipeline/adapters/cursor.mjs +187 -0
  37. package/pipeline/agents/android-architect.md +42 -0
  38. package/pipeline/agents/backend-architect.md +43 -0
  39. package/pipeline/agents/code-reviewer.md +57 -0
  40. package/pipeline/agents/dev-critic.md +148 -0
  41. package/pipeline/agents/explorer.md +34 -0
  42. package/pipeline/agents/ios-architect.md +41 -0
  43. package/pipeline/agents/security-auditor.md +98 -0
  44. package/pipeline/agents/task-clarifier.md +113 -0
  45. package/pipeline/claude-md-template.md +55 -0
  46. package/pipeline/commands/archive-guard.md +45 -0
  47. package/pipeline/commands/deploy.md +54 -0
  48. package/pipeline/commands/figma-to-swiftui.md +295 -0
  49. package/pipeline/commands/multi-agent/_account-picker.md +90 -0
  50. package/pipeline/commands/multi-agent/_dev-context.md +111 -0
  51. package/pipeline/commands/multi-agent/_input-parser.md +43 -0
  52. package/pipeline/commands/multi-agent/_repo-picker.md +76 -0
  53. package/pipeline/commands/multi-agent/autopilot.md +116 -0
  54. package/pipeline/commands/multi-agent/channels.md +465 -0
  55. package/pipeline/commands/multi-agent/delete.md +66 -0
  56. package/pipeline/commands/multi-agent/dev-autopilot.md +120 -0
  57. package/pipeline/commands/multi-agent/dev-local-autopilot.md +110 -0
  58. package/pipeline/commands/multi-agent/dev-local.md +105 -0
  59. package/pipeline/commands/multi-agent/dev.md +246 -0
  60. package/pipeline/commands/multi-agent/diff-explain.md +68 -0
  61. package/pipeline/commands/multi-agent/help.md +422 -0
  62. package/pipeline/commands/multi-agent/issue.md +79 -0
  63. package/pipeline/commands/multi-agent/jira.md +132 -0
  64. package/pipeline/commands/multi-agent/kill.md +38 -0
  65. package/pipeline/commands/multi-agent/language.md +94 -0
  66. package/pipeline/commands/multi-agent/local-autopilot.md +139 -0
  67. package/pipeline/commands/multi-agent/local.md +117 -0
  68. package/pipeline/commands/multi-agent/log.md +25 -0
  69. package/pipeline/commands/multi-agent/manual-test.md +43 -0
  70. package/pipeline/commands/multi-agent/purge.md +39 -0
  71. package/pipeline/commands/multi-agent/refactor.md +188 -0
  72. package/pipeline/commands/multi-agent/refs/android-guide.md +250 -0
  73. package/pipeline/commands/multi-agent/refs/audit-guide.md +240 -0
  74. package/pipeline/commands/multi-agent/refs/backend-guide.md +135 -0
  75. package/pipeline/commands/multi-agent/refs/channels/confluence.md +153 -0
  76. package/pipeline/commands/multi-agent/refs/channels/issue-comment.md +141 -0
  77. package/pipeline/commands/multi-agent/refs/channels/jira.md +127 -0
  78. package/pipeline/commands/multi-agent/refs/channels/pr-review-actions.md +135 -0
  79. package/pipeline/commands/multi-agent/refs/channels/pr.md +139 -0
  80. package/pipeline/commands/multi-agent/refs/channels/wiki.md +66 -0
  81. package/pipeline/commands/multi-agent/refs/component-dispatch.md +92 -0
  82. package/pipeline/commands/multi-agent/refs/cross-cli-contract.md +326 -0
  83. package/pipeline/commands/multi-agent/refs/frontend-guide.md +136 -0
  84. package/pipeline/commands/multi-agent/refs/issue-jira-triad.md +104 -0
  85. package/pipeline/commands/multi-agent/refs/keychain.md +80 -0
  86. package/pipeline/commands/multi-agent/refs/knowledge.md +112 -0
  87. package/pipeline/commands/multi-agent/refs/multi-repo-integration-build.md +207 -0
  88. package/pipeline/commands/multi-agent/refs/phases/log-format.md +89 -0
  89. package/pipeline/commands/multi-agent/refs/phases/modes.md +156 -0
  90. package/pipeline/commands/multi-agent/refs/phases/operations.md +91 -0
  91. package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +481 -0
  92. package/pipeline/commands/multi-agent/refs/phases/phase-1-analysis.md +264 -0
  93. package/pipeline/commands/multi-agent/refs/phases/phase-2-planning.md +278 -0
  94. package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +364 -0
  95. package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +378 -0
  96. package/pipeline/commands/multi-agent/refs/phases/phase-5-test.md +129 -0
  97. package/pipeline/commands/multi-agent/refs/phases/phase-6-commit.md +339 -0
  98. package/pipeline/commands/multi-agent/refs/phases/phase-7-report.md +361 -0
  99. package/pipeline/commands/multi-agent/refs/phases.md +187 -0
  100. package/pipeline/commands/multi-agent/refs/progress-contract.md +155 -0
  101. package/pipeline/commands/multi-agent/refs/rules.md +189 -0
  102. package/pipeline/commands/multi-agent/refs/swiftui-guide.md +254 -0
  103. package/pipeline/commands/multi-agent/refs/tracker-contract.md +256 -0
  104. package/pipeline/commands/multi-agent/refs/wiki-capture.md +109 -0
  105. package/pipeline/commands/multi-agent/resume.md +28 -0
  106. package/pipeline/commands/multi-agent/review.md +228 -0
  107. package/pipeline/commands/multi-agent/scan.md +74 -0
  108. package/pipeline/commands/multi-agent/search.md +97 -0
  109. package/pipeline/commands/multi-agent/setup.md +767 -0
  110. package/pipeline/commands/multi-agent/stack.md +48 -0
  111. package/pipeline/commands/multi-agent/status.md +38 -0
  112. package/pipeline/commands/multi-agent/sync.md +319 -0
  113. package/pipeline/commands/multi-agent/test.md +39 -0
  114. package/pipeline/commands/multi-agent/update.md +88 -0
  115. package/pipeline/commands/multi-agent.md +293 -0
  116. package/pipeline/commands/security-review.md +6 -0
  117. package/pipeline/commands/sim-test.md +256 -0
  118. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +25 -0
  119. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +30 -0
  120. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +20 -0
  121. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +15 -0
  122. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +14 -0
  123. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +12 -0
  124. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +29 -0
  125. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +43 -0
  126. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +35 -0
  127. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +35 -0
  128. package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +14 -0
  129. package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +12 -0
  130. package/pipeline/eval/golden-tasks/README.md +65 -0
  131. package/pipeline/eval/triage/01-empty-findings/expected.json +6 -0
  132. package/pipeline/eval/triage/01-empty-findings/input.json +5 -0
  133. package/pipeline/eval/triage/01-empty-findings/notes.md +7 -0
  134. package/pipeline/eval/triage/02-real-blocker/expected.json +15 -0
  135. package/pipeline/eval/triage/02-real-blocker/input.json +14 -0
  136. package/pipeline/eval/triage/02-real-blocker/notes.md +7 -0
  137. package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +18 -0
  138. package/pipeline/eval/triage/03-out-of-scope-defer/input.json +14 -0
  139. package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +10 -0
  140. package/pipeline/eval/triage/04-false-positive-reject/expected.json +18 -0
  141. package/pipeline/eval/triage/04-false-positive-reject/input.json +14 -0
  142. package/pipeline/eval/triage/04-false-positive-reject/notes.md +10 -0
  143. package/pipeline/eval/triage/05-mixed-classification/expected.json +43 -0
  144. package/pipeline/eval/triage/05-mixed-classification/input.json +38 -0
  145. package/pipeline/eval/triage/05-mixed-classification/notes.md +17 -0
  146. package/pipeline/eval/triage/06-severity-mismatch/expected.json +15 -0
  147. package/pipeline/eval/triage/06-severity-mismatch/input.json +14 -0
  148. package/pipeline/eval/triage/06-severity-mismatch/notes.md +9 -0
  149. package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +27 -0
  150. package/pipeline/eval/triage/07-duplicate-reviewers/input.json +22 -0
  151. package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +9 -0
  152. package/pipeline/eval/triage/08-style-misclassified/expected.json +18 -0
  153. package/pipeline/eval/triage/08-style-misclassified/input.json +14 -0
  154. package/pipeline/eval/triage/08-style-misclassified/notes.md +9 -0
  155. package/pipeline/eval/triage/09-cascading-finding/expected.json +23 -0
  156. package/pipeline/eval/triage/09-cascading-finding/input.json +22 -0
  157. package/pipeline/eval/triage/09-cascading-finding/notes.md +9 -0
  158. package/pipeline/eval/triage/10-deferred-crossref/expected.json +18 -0
  159. package/pipeline/eval/triage/10-deferred-crossref/input.json +14 -0
  160. package/pipeline/eval/triage/10-deferred-crossref/notes.md +9 -0
  161. package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +27 -0
  162. package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +22 -0
  163. package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +14 -0
  164. package/pipeline/eval/triage/README.md +54 -0
  165. package/pipeline/lib/account-resolver.sh +204 -0
  166. package/pipeline/lib/channels-multi-repo.sh +218 -0
  167. package/pipeline/lib/context-link-extractor.sh +192 -0
  168. package/pipeline/lib/credential-store-resolver.sh +57 -0
  169. package/pipeline/lib/credential-store.sh +226 -0
  170. package/pipeline/lib/fetch-confluence.sh +358 -0
  171. package/pipeline/lib/fetch-crashlytics.sh +314 -0
  172. package/pipeline/lib/fetch-fortify.sh +321 -0
  173. package/pipeline/lib/fetch-swagger.sh +270 -0
  174. package/pipeline/lib/issue-fetcher.sh +333 -0
  175. package/pipeline/lib/multi-repo-pipeline.sh +252 -0
  176. package/pipeline/lib/plan-todos.sh +284 -0
  177. package/pipeline/lib/post-pr-review.sh +374 -0
  178. package/pipeline/lib/repo-cache.sh +231 -0
  179. package/pipeline/lib/review-watch.sh +244 -0
  180. package/pipeline/lib/shadow-git.sh +222 -0
  181. package/pipeline/lib/submodule-detector.sh +177 -0
  182. package/pipeline/lib/vercel-deploy.sh +170 -0
  183. package/pipeline/preferences-template.json +132 -0
  184. package/pipeline/rules/app-store-guidelines.md +59 -0
  185. package/pipeline/rules/code-review.md +27 -0
  186. package/pipeline/rules/code-style.md +37 -0
  187. package/pipeline/rules/debugging.md +24 -0
  188. package/pipeline/rules/figma-pipeline.md +190 -0
  189. package/pipeline/rules/git-conventions.md +29 -0
  190. package/pipeline/rules/kotlin-android.md +92 -0
  191. package/pipeline/rules/performance.md +23 -0
  192. package/pipeline/rules/security.md +39 -0
  193. package/pipeline/rules/swiftui-qa.md +32 -0
  194. package/pipeline/rules/tdd.md +25 -0
  195. package/pipeline/rules/testing.md +37 -0
  196. package/pipeline/schemas/agent-state.schema.json +273 -0
  197. package/pipeline/schemas/analysis-output.schema.json +59 -0
  198. package/pipeline/schemas/clarify-output.schema.json +74 -0
  199. package/pipeline/schemas/dev-critic-output.schema.json +104 -0
  200. package/pipeline/schemas/diff-risk.schema.json +78 -0
  201. package/pipeline/schemas/figma-project-config.schema.json +372 -0
  202. package/pipeline/schemas/migrations/README.md +73 -0
  203. package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +112 -0
  204. package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +75 -0
  205. package/pipeline/schemas/migrations/prefs-2.1.0-to-2.2.0.mjs +64 -0
  206. package/pipeline/schemas/migrations/prefs-2.2.0-to-2.3.0.mjs +36 -0
  207. package/pipeline/schemas/migrations/state-2.0.0-to-2.1.0.mjs +34 -0
  208. package/pipeline/schemas/plan-todos.schema.json +62 -0
  209. package/pipeline/schemas/planning-output.schema.json +57 -0
  210. package/pipeline/schemas/prefs.schema.json +1137 -0
  211. package/pipeline/schemas/reviewer-output.schema.json +55 -0
  212. package/pipeline/schemas/test-gap.schema.json +64 -0
  213. package/pipeline/schemas/token-budget.json +17 -0
  214. package/pipeline/schemas/triage-corpus.schema.json +31 -0
  215. package/pipeline/schemas/triage-output.schema.json +115 -0
  216. package/pipeline/scripts/.last-figma-sync-plan.json +23 -0
  217. package/pipeline/scripts/README-figma-smokes.md +34 -0
  218. package/pipeline/scripts/README.md +104 -0
  219. package/pipeline/scripts/aggregate-metrics.mjs +310 -0
  220. package/pipeline/scripts/audit-log-rotate.sh +61 -0
  221. package/pipeline/scripts/audit-log.sh +69 -0
  222. package/pipeline/scripts/benchmark-phase-0.sh +128 -0
  223. package/pipeline/scripts/build-skills-index.mjs +139 -0
  224. package/pipeline/scripts/classify-plan-safety.mjs +177 -0
  225. package/pipeline/scripts/cost-table.json +27 -0
  226. package/pipeline/scripts/diff-explain.mjs +276 -0
  227. package/pipeline/scripts/diff-risk-score.mjs +328 -0
  228. package/pipeline/scripts/eval-golden-tasks-live.mjs +294 -0
  229. package/pipeline/scripts/eval-golden-tasks.mjs +223 -0
  230. package/pipeline/scripts/eval-triage.mjs +171 -0
  231. package/pipeline/scripts/figma-placeholder-map.json +191 -0
  232. package/pipeline/scripts/fixtures/diff-risk-android.diff +40 -0
  233. package/pipeline/scripts/fixtures/diff-risk-ios.diff +48 -0
  234. package/pipeline/scripts/fixtures/install-layout.tsv +16 -0
  235. package/pipeline/scripts/fixtures/test-gap-node.diff +30 -0
  236. package/pipeline/scripts/fixtures/test-gap-python.diff +32 -0
  237. package/pipeline/scripts/gen-mode-dispatch.mjs +170 -0
  238. package/pipeline/scripts/gen-skills-index.mjs +90 -0
  239. package/pipeline/scripts/github-ssh-setup.sh +103 -0
  240. package/pipeline/scripts/import-figma-skills.sh +253 -0
  241. package/pipeline/scripts/keychain-save.sh +74 -0
  242. package/pipeline/scripts/keychain.py +294 -0
  243. package/pipeline/scripts/log-metric.sh +98 -0
  244. package/pipeline/scripts/match-skills.mjs +167 -0
  245. package/pipeline/scripts/memory-load.sh +46 -0
  246. package/pipeline/scripts/memory-save.sh +76 -0
  247. package/pipeline/scripts/migrate-prefs.mjs +390 -0
  248. package/pipeline/scripts/migrate-state.mjs +215 -0
  249. package/pipeline/scripts/output-quality-check.sh +125 -0
  250. package/pipeline/scripts/phase-banner.sh +158 -0
  251. package/pipeline/scripts/phase-tracker.sh +548 -0
  252. package/pipeline/scripts/pre-commit-check.sh +69 -0
  253. package/pipeline/scripts/pre-push-check.sh +77 -0
  254. package/pipeline/scripts/render-agent-log-cost.sh +149 -0
  255. package/pipeline/scripts/render-cost-summary.sh +137 -0
  256. package/pipeline/scripts/render-work-summary.sh +195 -0
  257. package/pipeline/scripts/repo-map.mjs +367 -0
  258. package/pipeline/scripts/run-aggregator.mjs +298 -0
  259. package/pipeline/scripts/scan-skills.sh +332 -0
  260. package/pipeline/scripts/search-logs.sh +291 -0
  261. package/pipeline/scripts/sign-skills.sh +67 -0
  262. package/pipeline/scripts/smoke-adapters.sh +207 -0
  263. package/pipeline/scripts/smoke-add-detail.sh +137 -0
  264. package/pipeline/scripts/smoke-agent-log-cost.sh +183 -0
  265. package/pipeline/scripts/smoke-agent-model-routing.sh +87 -0
  266. package/pipeline/scripts/smoke-bitbucket-contract.sh +223 -0
  267. package/pipeline/scripts/smoke-channels-flow.sh +130 -0
  268. package/pipeline/scripts/smoke-ci-workflows.sh +88 -0
  269. package/pipeline/scripts/smoke-clarify.sh +148 -0
  270. package/pipeline/scripts/smoke-commands-skills-parity.sh +87 -0
  271. package/pipeline/scripts/smoke-compliance-skills.sh +119 -0
  272. package/pipeline/scripts/smoke-cost-summary.sh +139 -0
  273. package/pipeline/scripts/smoke-cross-cli-behavior.sh +198 -0
  274. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +128 -0
  275. package/pipeline/scripts/smoke-delete-flow.sh +151 -0
  276. package/pipeline/scripts/smoke-dev-critic.sh +144 -0
  277. package/pipeline/scripts/smoke-diff-explain.sh +128 -0
  278. package/pipeline/scripts/smoke-diff-risk.sh +161 -0
  279. package/pipeline/scripts/smoke-dynamic-skill-loading.sh +160 -0
  280. package/pipeline/scripts/smoke-eval-live.sh +136 -0
  281. package/pipeline/scripts/smoke-existing-discovery-gate.sh +71 -0
  282. package/pipeline/scripts/smoke-figma-android-parity.sh +148 -0
  283. package/pipeline/scripts/smoke-figma-config-schema.sh +144 -0
  284. package/pipeline/scripts/smoke-figma-credential-store.sh +105 -0
  285. package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +177 -0
  286. package/pipeline/scripts/smoke-figma-dispatch.sh +123 -0
  287. package/pipeline/scripts/smoke-figma-skill-import.sh +174 -0
  288. package/pipeline/scripts/smoke-figma-sync.sh +149 -0
  289. package/pipeline/scripts/smoke-identity-isolation.sh +70 -0
  290. package/pipeline/scripts/smoke-install-layout.sh +241 -0
  291. package/pipeline/scripts/smoke-install-leak-gate.sh +125 -0
  292. package/pipeline/scripts/smoke-issue-comment-template.sh +86 -0
  293. package/pipeline/scripts/smoke-issue-jira-triad.sh +120 -0
  294. package/pipeline/scripts/smoke-keychain.sh +158 -0
  295. package/pipeline/scripts/smoke-language-axis.sh +109 -0
  296. package/pipeline/scripts/smoke-lib-scripts.sh +395 -0
  297. package/pipeline/scripts/smoke-migrate-state.sh +102 -0
  298. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +158 -0
  299. package/pipeline/scripts/smoke-multi-repo-integration.sh +116 -0
  300. package/pipeline/scripts/smoke-multi-repo-worktree.sh +61 -0
  301. package/pipeline/scripts/smoke-no-token-prompt.sh +69 -0
  302. package/pipeline/scripts/smoke-pat-audit.sh +107 -0
  303. package/pipeline/scripts/smoke-per-repo-memory.sh +156 -0
  304. package/pipeline/scripts/smoke-personal-data.sh +82 -0
  305. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +170 -0
  306. package/pipeline/scripts/smoke-phase-6-multi.sh +79 -0
  307. package/pipeline/scripts/smoke-phase-banner.sh +101 -0
  308. package/pipeline/scripts/smoke-phase-tracker.sh +255 -0
  309. package/pipeline/scripts/smoke-phase0-bridge-contract.sh +241 -0
  310. package/pipeline/scripts/smoke-phase4-triage.sh +142 -0
  311. package/pipeline/scripts/smoke-plan-approval-gate.sh +71 -0
  312. package/pipeline/scripts/smoke-plan-safety.sh +139 -0
  313. package/pipeline/scripts/smoke-plan-todos.sh +193 -0
  314. package/pipeline/scripts/smoke-pr-review-actions.sh +152 -0
  315. package/pipeline/scripts/smoke-pre-commit.sh +138 -0
  316. package/pipeline/scripts/smoke-pref-migration.sh +224 -0
  317. package/pipeline/scripts/smoke-prefs-language.sh +134 -0
  318. package/pipeline/scripts/smoke-progress-contract.sh +118 -0
  319. package/pipeline/scripts/smoke-push-retry.sh +75 -0
  320. package/pipeline/scripts/smoke-readme-counts.sh +120 -0
  321. package/pipeline/scripts/smoke-repo-map.sh +300 -0
  322. package/pipeline/scripts/smoke-review-watch.sh +134 -0
  323. package/pipeline/scripts/smoke-run-aggregator.sh +216 -0
  324. package/pipeline/scripts/smoke-schema-validation.sh +173 -0
  325. package/pipeline/scripts/smoke-search.sh +187 -0
  326. package/pipeline/scripts/smoke-shadow-git.sh +175 -0
  327. package/pipeline/scripts/smoke-skill-authoring.sh +142 -0
  328. package/pipeline/scripts/smoke-skill-language.sh +83 -0
  329. package/pipeline/scripts/smoke-skill-manifest.sh +138 -0
  330. package/pipeline/scripts/smoke-skill-scan.sh +198 -0
  331. package/pipeline/scripts/smoke-stack-swap.sh +132 -0
  332. package/pipeline/scripts/smoke-subagent-validators.sh +105 -0
  333. package/pipeline/scripts/smoke-sync-delegation.sh +74 -0
  334. package/pipeline/scripts/smoke-sync-parity.sh +92 -0
  335. package/pipeline/scripts/smoke-tasklist-ordering.sh +111 -0
  336. package/pipeline/scripts/smoke-telemetry.sh +147 -0
  337. package/pipeline/scripts/smoke-test-gap.sh +183 -0
  338. package/pipeline/scripts/smoke-token-budget.sh +67 -0
  339. package/pipeline/scripts/smoke-tracker-contract.sh +129 -0
  340. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +65 -0
  341. package/pipeline/scripts/smoke-triage-memory.sh +174 -0
  342. package/pipeline/scripts/smoke-url-enrichment.sh +70 -0
  343. package/pipeline/scripts/smoke-validator-contradiction.sh +67 -0
  344. package/pipeline/scripts/smoke-vercel-deploy-redact.sh +129 -0
  345. package/pipeline/scripts/smoke-wiki-integration.sh +146 -0
  346. package/pipeline/scripts/smoke-work-summary.sh +163 -0
  347. package/pipeline/scripts/smoke-worktree-path-convention.sh +86 -0
  348. package/pipeline/scripts/smoke-write-state.sh +115 -0
  349. package/pipeline/scripts/stack-swap.sh +182 -0
  350. package/pipeline/scripts/sync-figma-source.sh +228 -0
  351. package/pipeline/scripts/sync-parity-check.sh +135 -0
  352. package/pipeline/scripts/test-gap-rules/android.json +25 -0
  353. package/pipeline/scripts/test-gap-rules/ios.json +29 -0
  354. package/pipeline/scripts/test-gap-rules/node.json +17 -0
  355. package/pipeline/scripts/test-gap-rules/python.json +19 -0
  356. package/pipeline/scripts/test-gap-scan.mjs +343 -0
  357. package/pipeline/scripts/token-budget-report.mjs +145 -0
  358. package/pipeline/scripts/triage-memory.mjs +258 -0
  359. package/pipeline/scripts/ui-tree-dumper.swift +122 -0
  360. package/pipeline/scripts/uninstall.mjs +331 -0
  361. package/pipeline/scripts/update-issue-progress.sh +146 -0
  362. package/pipeline/scripts/validate-analysis.mjs +132 -0
  363. package/pipeline/scripts/validate-diff-risk.mjs +117 -0
  364. package/pipeline/scripts/validate-planning.mjs +180 -0
  365. package/pipeline/scripts/validate-reviewer.mjs +131 -0
  366. package/pipeline/scripts/validate-schemas.mjs +88 -0
  367. package/pipeline/scripts/validate-test-gap.mjs +90 -0
  368. package/pipeline/scripts/validate-triage.mjs +175 -0
  369. package/pipeline/scripts/verify-skills.sh +126 -0
  370. package/pipeline/scripts/write-state.mjs +175 -0
  371. package/pipeline/skills/.skill-manifest.json +779 -0
  372. package/pipeline/skills/.skills-index.json +1771 -0
  373. package/pipeline/skills/figma-android/README.md +36 -0
  374. package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +62 -0
  375. package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +158 -0
  376. package/pipeline/skills/figma-android/figma-component-test/SKILL.md +120 -0
  377. package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +35 -0
  378. package/pipeline/skills/figma-android/figma-to-component/SKILL.md +124 -0
  379. package/pipeline/skills/figma-common/README.md +57 -0
  380. package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +277 -0
  381. package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +498 -0
  382. package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +283 -0
  383. package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +362 -0
  384. package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +206 -0
  385. package/pipeline/skills/figma-common/figma-commit/REVIEW.md +337 -0
  386. package/pipeline/skills/figma-common/figma-commit/SKILL.md +211 -0
  387. package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +218 -0
  388. package/pipeline/skills/figma-common/figma-component-start/SKILL.md +246 -0
  389. package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +73 -0
  390. package/pipeline/skills/figma-common/figma-fix/SKILL.md +316 -0
  391. package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +542 -0
  392. package/pipeline/skills/figma-common/figma-issue/SKILL.md +745 -0
  393. package/pipeline/skills/figma-common/figma-iterate/SKILL.md +203 -0
  394. package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +1015 -0
  395. package/pipeline/skills/figma-common/figma-mend/SKILL.md +331 -0
  396. package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +398 -0
  397. package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +104 -0
  398. package/pipeline/skills/figma-common/figma-review/SKILL.md +395 -0
  399. package/pipeline/skills/figma-common/figma-setup/SKILL.md +514 -0
  400. package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +592 -0
  401. package/pipeline/skills/figma-common/figma-skip/SKILL.md +129 -0
  402. package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +104 -0
  403. package/pipeline/skills/figma-common/figma-utility/SKILL.md +274 -0
  404. package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +808 -0
  405. package/pipeline/skills/figma-common/figma-validate/SKILL.md +633 -0
  406. package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +711 -0
  407. package/pipeline/skills/figma-common/performance-review-next/SKILL.md +233 -0
  408. package/pipeline/skills/figma-common/performance-start/SKILL.md +425 -0
  409. package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +706 -0
  410. package/pipeline/skills/figma-common/performance-tour/SKILL.md +418 -0
  411. package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +67 -0
  412. package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +178 -0
  413. package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +184 -0
  414. package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +219 -0
  415. package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +274 -0
  416. package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +401 -0
  417. package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +57 -0
  418. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +307 -0
  419. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +119 -0
  420. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +174 -0
  421. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +333 -0
  422. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +368 -0
  423. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +393 -0
  424. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +617 -0
  425. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +352 -0
  426. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +337 -0
  427. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +206 -0
  428. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +235 -0
  429. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +214 -0
  430. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +871 -0
  431. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +156 -0
  432. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +175 -0
  433. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +176 -0
  434. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +333 -0
  435. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +412 -0
  436. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +336 -0
  437. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +695 -0
  438. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +332 -0
  439. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +380 -0
  440. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +262 -0
  441. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +482 -0
  442. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +274 -0
  443. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +636 -0
  444. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +142 -0
  445. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +547 -0
  446. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +39 -0
  447. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +659 -0
  448. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +580 -0
  449. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +51 -0
  450. package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +129 -0
  451. package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +64 -0
  452. package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +531 -0
  453. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +89 -0
  454. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +155 -0
  455. package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +196 -0
  456. package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +57 -0
  457. package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +89 -0
  458. package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +227 -0
  459. package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +157 -0
  460. package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +90 -0
  461. package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +116 -0
  462. package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +153 -0
  463. package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +130 -0
  464. package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +218 -0
  465. package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +188 -0
  466. package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +93 -0
  467. package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +98 -0
  468. package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +261 -0
  469. package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +147 -0
  470. package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +182 -0
  471. package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +185 -0
  472. package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +609 -0
  473. package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +332 -0
  474. package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +261 -0
  475. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +184 -0
  476. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +188 -0
  477. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +768 -0
  478. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +191 -0
  479. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +420 -0
  480. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.json +94 -0
  481. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +336 -0
  482. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +391 -0
  483. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +292 -0
  484. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +1 -0
  485. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +93 -0
  486. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +299 -0
  487. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +343 -0
  488. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +206 -0
  489. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +149 -0
  490. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +281 -0
  491. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +332 -0
  492. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +176 -0
  493. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +98 -0
  494. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +298 -0
  495. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +195 -0
  496. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +1298 -0
  497. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +228 -0
  498. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +1089 -0
  499. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +141 -0
  500. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +106 -0
  501. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +162 -0
  502. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +105 -0
  503. package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +179 -0
  504. package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +260 -0
  505. package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +260 -0
  506. package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +86 -0
  507. package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +321 -0
  508. package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +1470 -0
  509. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +176 -0
  510. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +147 -0
  511. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +629 -0
  512. package/pipeline/skills/shared/README.md +212 -0
  513. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +315 -0
  514. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +348 -0
  515. package/pipeline/skills/shared/core/multi-agent/SKILL.md +944 -0
  516. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +51 -0
  517. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +300 -0
  518. package/pipeline/skills/shared/core/multi-agent-delete/SKILL.md +63 -0
  519. package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +64 -0
  520. package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +56 -0
  521. package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +36 -0
  522. package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +42 -0
  523. package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +66 -0
  524. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +292 -0
  525. package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +35 -0
  526. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +38 -0
  527. package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +41 -0
  528. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +87 -0
  529. package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +37 -0
  530. package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +53 -0
  531. package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +28 -0
  532. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +47 -0
  533. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +42 -0
  534. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +191 -0
  535. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +31 -0
  536. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +61 -0
  537. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +61 -0
  538. package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +62 -0
  539. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +309 -0
  540. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +55 -0
  541. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +41 -0
  542. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +184 -0
  543. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +44 -0
  544. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +34 -0
  545. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +45 -0
  546. package/pipeline/skills/shared/external/agentflow/SKILL.md +199 -0
  547. package/pipeline/skills/shared/external/alarmkit/SKILL.md +438 -0
  548. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +584 -0
  549. package/pipeline/skills/shared/external/android-architecture/SKILL.md +407 -0
  550. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +153 -0
  551. package/pipeline/skills/shared/external/android-performance/SKILL.md +736 -0
  552. package/pipeline/skills/shared/external/android-security/SKILL.md +577 -0
  553. package/pipeline/skills/shared/external/android_ui_verification/SKILL.md +66 -0
  554. package/pipeline/skills/shared/external/api-patterns/SKILL.md +85 -0
  555. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +910 -0
  556. package/pipeline/skills/shared/external/app-clips/SKILL.md +436 -0
  557. package/pipeline/skills/shared/external/app-intents/SKILL.md +489 -0
  558. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +1076 -0
  559. package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +75 -0
  560. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +409 -0
  561. package/pipeline/skills/shared/external/app-store-review/SKILL.md +411 -0
  562. package/pipeline/skills/shared/external/app-store-review/references/code-signing.md +259 -0
  563. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +90 -0
  564. package/pipeline/skills/shared/external/app-store-review/references/rejection-patterns.md +152 -0
  565. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +118 -0
  566. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +500 -0
  567. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +425 -0
  568. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +344 -0
  569. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +508 -0
  570. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +285 -0
  571. package/pipeline/skills/shared/external/architecture/SKILL.md +60 -0
  572. package/pipeline/skills/shared/external/authentication/SKILL.md +496 -0
  573. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +211 -0
  574. package/pipeline/skills/shared/external/background-processing/SKILL.md +499 -0
  575. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +390 -0
  576. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +461 -0
  577. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +425 -0
  578. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +462 -0
  579. package/pipeline/skills/shared/external/clean-code/SKILL.md +94 -0
  580. package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +116 -0
  581. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +492 -0
  582. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +461 -0
  583. package/pipeline/skills/shared/external/compose-components/SKILL.md +441 -0
  584. package/pipeline/skills/shared/external/compose-navigation/SKILL.md +436 -0
  585. package/pipeline/skills/shared/external/compose-testing/SKILL.md +527 -0
  586. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +425 -0
  587. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +409 -0
  588. package/pipeline/skills/shared/external/context-compression/SKILL.md +266 -0
  589. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +491 -0
  590. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +435 -0
  591. package/pipeline/skills/shared/external/core-motion/SKILL.md +388 -0
  592. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +405 -0
  593. package/pipeline/skills/shared/external/core-nfc/SKILL.md +495 -0
  594. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +420 -0
  595. package/pipeline/skills/shared/external/coreml/SKILL.md +458 -0
  596. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +765 -0
  597. package/pipeline/skills/shared/external/css-modern/SKILL.md +467 -0
  598. package/pipeline/skills/shared/external/database-patterns/SKILL.md +335 -0
  599. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +422 -0
  600. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +387 -0
  601. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +298 -0
  602. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +37 -0
  603. package/pipeline/skills/shared/external/device-integrity/SKILL.md +477 -0
  604. package/pipeline/skills/shared/external/docker-expert/SKILL.md +413 -0
  605. package/pipeline/skills/shared/external/energykit/SKILL.md +460 -0
  606. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +541 -0
  607. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +483 -0
  608. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +326 -0
  609. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +190 -0
  610. package/pipeline/skills/shared/external/firebase/SKILL.md +61 -0
  611. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +348 -0
  612. package/pipeline/skills/shared/external/gradle-kotlin-dsl/SKILL.md +552 -0
  613. package/pipeline/skills/shared/external/healthkit/SKILL.md +498 -0
  614. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +602 -0
  615. package/pipeline/skills/shared/external/help-skills/SKILL.md +166 -0
  616. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +81 -0
  617. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +95 -0
  618. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +82 -0
  619. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +101 -0
  620. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +94 -0
  621. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +110 -0
  622. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +99 -0
  623. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +81 -0
  624. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +125 -0
  625. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +496 -0
  626. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +455 -0
  627. package/pipeline/skills/shared/external/html-semantic/SKILL.md +301 -0
  628. package/pipeline/skills/shared/external/humanizer/SKILL.md +118 -0
  629. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +301 -0
  630. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +140 -0
  631. package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +59 -0
  632. package/pipeline/skills/shared/external/ios-developer/SKILL.md +217 -0
  633. package/pipeline/skills/shared/external/ios-localization/SKILL.md +418 -0
  634. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +627 -0
  635. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +462 -0
  636. package/pipeline/skills/shared/external/ios-networking/SKILL.md +441 -0
  637. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +862 -0
  638. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -0
  639. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +563 -0
  640. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +1116 -0
  641. package/pipeline/skills/shared/external/ios-security/SKILL.md +496 -0
  642. package/pipeline/skills/shared/external/ios-security/references/app-review-guidelines.md +174 -0
  643. package/pipeline/skills/shared/external/ios-security/references/cryptokit-advanced.md +297 -0
  644. package/pipeline/skills/shared/external/ios-security/references/file-storage-patterns.md +354 -0
  645. package/pipeline/skills/shared/external/ios-security/references/privacy-manifest.md +117 -0
  646. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +101 -0
  647. package/pipeline/skills/shared/external/live-activities/SKILL.md +500 -0
  648. package/pipeline/skills/shared/external/live-activities/references/live-activity-patterns.md +868 -0
  649. package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +109 -0
  650. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +110 -0
  651. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +485 -0
  652. package/pipeline/skills/shared/external/mapkit-location/references/corelocation-patterns.md +730 -0
  653. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +748 -0
  654. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +479 -0
  655. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +64 -0
  656. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +395 -0
  657. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +363 -0
  658. package/pipeline/skills/shared/external/natural-language/SKILL.md +412 -0
  659. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +311 -0
  660. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +418 -0
  661. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +38 -0
  662. package/pipeline/skills/shared/external/observability-engineer/SKILL.md +235 -0
  663. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +398 -0
  664. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +254 -0
  665. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +387 -0
  666. package/pipeline/skills/shared/external/pencilkit-drawing/references/paperkit-integration.md +376 -0
  667. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +302 -0
  668. package/pipeline/skills/shared/external/permissionkit/SKILL.md +446 -0
  669. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +435 -0
  670. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +501 -0
  671. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +701 -0
  672. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +774 -0
  673. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +869 -0
  674. package/pipeline/skills/shared/external/photos-camera-media/references/photospicker-patterns.md +597 -0
  675. package/pipeline/skills/shared/external/play-store-review/SKILL.md +350 -0
  676. package/pipeline/skills/shared/external/push-notifications/SKILL.md +501 -0
  677. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +677 -0
  678. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +745 -0
  679. package/pipeline/skills/shared/external/python-patterns/SKILL.md +383 -0
  680. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +290 -0
  681. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +479 -0
  682. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +480 -0
  683. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +386 -0
  684. package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +506 -0
  685. package/pipeline/skills/shared/external/room-database/SKILL.md +564 -0
  686. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +483 -0
  687. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +544 -0
  688. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +485 -0
  689. package/pipeline/skills/shared/external/storekit/SKILL.md +478 -0
  690. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +58 -0
  691. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +755 -0
  692. package/pipeline/skills/shared/external/swift-charts/SKILL.md +487 -0
  693. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +895 -0
  694. package/pipeline/skills/shared/external/swift-codable/SKILL.md +467 -0
  695. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +408 -0
  696. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +80 -0
  697. package/pipeline/skills/shared/external/swift-concurrency/references/swift-6-2-concurrency.md +233 -0
  698. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +187 -0
  699. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +341 -0
  700. package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +113 -0
  701. package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +124 -0
  702. package/pipeline/skills/shared/external/swift-concurrency-pro/references/actors.md +155 -0
  703. package/pipeline/skills/shared/external/swift-concurrency-pro/references/async-streams.md +67 -0
  704. package/pipeline/skills/shared/external/swift-concurrency-pro/references/bridging.md +52 -0
  705. package/pipeline/skills/shared/external/swift-concurrency-pro/references/bug-patterns.md +100 -0
  706. package/pipeline/skills/shared/external/swift-concurrency-pro/references/cancellation.md +107 -0
  707. package/pipeline/skills/shared/external/swift-concurrency-pro/references/diagnostics.md +70 -0
  708. package/pipeline/skills/shared/external/swift-concurrency-pro/references/hotspots.md +47 -0
  709. package/pipeline/skills/shared/external/swift-concurrency-pro/references/interop.md +129 -0
  710. package/pipeline/skills/shared/external/swift-concurrency-pro/references/new-features.md +224 -0
  711. package/pipeline/skills/shared/external/swift-concurrency-pro/references/structured.md +101 -0
  712. package/pipeline/skills/shared/external/swift-concurrency-pro/references/testing.md +218 -0
  713. package/pipeline/skills/shared/external/swift-concurrency-pro/references/unstructured.md +61 -0
  714. package/pipeline/skills/shared/external/swift-language/SKILL.md +498 -0
  715. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +505 -0
  716. package/pipeline/skills/shared/external/swift-testing/SKILL.md +462 -0
  717. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +504 -0
  718. package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +97 -0
  719. package/pipeline/skills/shared/external/swift-testing-pro/references/async-tests.md +252 -0
  720. package/pipeline/skills/shared/external/swift-testing-pro/references/core-rules.md +52 -0
  721. package/pipeline/skills/shared/external/swift-testing-pro/references/migrating-from-xctest.md +34 -0
  722. package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +318 -0
  723. package/pipeline/skills/shared/external/swift-testing-pro/references/writing-better-tests.md +254 -0
  724. package/pipeline/skills/shared/external/swiftdata/SKILL.md +334 -0
  725. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +504 -0
  726. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +975 -0
  727. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +675 -0
  728. package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +102 -0
  729. package/pipeline/skills/shared/external/swiftdata-pro/references/class-inheritance.md +104 -0
  730. package/pipeline/skills/shared/external/swiftdata-pro/references/cloudkit.md +10 -0
  731. package/pipeline/skills/shared/external/swiftdata-pro/references/core-rules.md +20 -0
  732. package/pipeline/skills/shared/external/swiftdata-pro/references/indexing.md +27 -0
  733. package/pipeline/skills/shared/external/swiftdata-pro/references/predicates.md +73 -0
  734. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +503 -0
  735. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +821 -0
  736. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +553 -0
  737. package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +102 -0
  738. package/pipeline/skills/shared/external/swiftui-expert-skill/references/accessibility-patterns.md +215 -0
  739. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-advanced.md +403 -0
  740. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-basics.md +284 -0
  741. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-transitions.md +326 -0
  742. package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts-accessibility.md +135 -0
  743. package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts.md +602 -0
  744. package/pipeline/skills/shared/external/swiftui-expert-skill/references/image-optimization.md +203 -0
  745. package/pipeline/skills/shared/external/swiftui-expert-skill/references/latest-apis.md +464 -0
  746. package/pipeline/skills/shared/external/swiftui-expert-skill/references/layout-best-practices.md +266 -0
  747. package/pipeline/skills/shared/external/swiftui-expert-skill/references/liquid-glass.md +416 -0
  748. package/pipeline/skills/shared/external/swiftui-expert-skill/references/list-patterns.md +394 -0
  749. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-scenes.md +318 -0
  750. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-views.md +357 -0
  751. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-window-styling.md +303 -0
  752. package/pipeline/skills/shared/external/swiftui-expert-skill/references/performance-patterns.md +403 -0
  753. package/pipeline/skills/shared/external/swiftui-expert-skill/references/scroll-patterns.md +293 -0
  754. package/pipeline/skills/shared/external/swiftui-expert-skill/references/sheet-navigation-patterns.md +363 -0
  755. package/pipeline/skills/shared/external/swiftui-expert-skill/references/state-management.md +417 -0
  756. package/pipeline/skills/shared/external/swiftui-expert-skill/references/view-structure.md +389 -0
  757. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +450 -0
  758. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +425 -0
  759. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +336 -0
  760. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +97 -0
  761. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +69 -0
  762. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +99 -0
  763. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +147 -0
  764. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +98 -0
  765. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +262 -0
  766. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +207 -0
  767. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +177 -0
  768. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +169 -0
  769. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +178 -0
  770. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +371 -0
  771. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +486 -0
  772. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +1097 -0
  773. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +780 -0
  774. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +696 -0
  775. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +487 -0
  776. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +46 -0
  777. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +29 -0
  778. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +33 -0
  779. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +52 -0
  780. package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +114 -0
  781. package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +108 -0
  782. package/pipeline/skills/shared/external/swiftui-pro/references/accessibility.md +13 -0
  783. package/pipeline/skills/shared/external/swiftui-pro/references/api.md +39 -0
  784. package/pipeline/skills/shared/external/swiftui-pro/references/data.md +43 -0
  785. package/pipeline/skills/shared/external/swiftui-pro/references/design.md +31 -0
  786. package/pipeline/skills/shared/external/swiftui-pro/references/hygiene.md +9 -0
  787. package/pipeline/skills/shared/external/swiftui-pro/references/navigation.md +14 -0
  788. package/pipeline/skills/shared/external/swiftui-pro/references/performance.md +46 -0
  789. package/pipeline/skills/shared/external/swiftui-pro/references/swift.md +56 -0
  790. package/pipeline/skills/shared/external/swiftui-pro/references/views.md +35 -0
  791. package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +103 -0
  792. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +428 -0
  793. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +534 -0
  794. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +948 -0
  795. package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +210 -0
  796. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +273 -0
  797. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +151 -0
  798. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +95 -0
  799. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +51 -0
  800. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +111 -0
  801. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +309 -0
  802. package/pipeline/skills/shared/external/testing-backend/SKILL.md +393 -0
  803. package/pipeline/skills/shared/external/tipkit/SKILL.md +494 -0
  804. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +782 -0
  805. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +336 -0
  806. package/pipeline/skills/shared/external/vision-framework/SKILL.md +475 -0
  807. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +736 -0
  808. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +738 -0
  809. package/pipeline/skills/shared/external/vue-composition/SKILL.md +371 -0
  810. package/pipeline/skills/shared/external/weatherkit/SKILL.md +410 -0
  811. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +567 -0
  812. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +373 -0
  813. package/pipeline/skills/shared/external/web-performance/SKILL.md +345 -0
  814. package/pipeline/skills/shared/external/web-testing/SKILL.md +385 -0
  815. package/pipeline/skills/shared/external/widgetkit/SKILL.md +497 -0
  816. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +871 -0
  817. package/pipeline/skills/skills-index.md +205 -0
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env bash
2
+ # smoke-tasklist-ordering.sh — v8.3.1
3
+ #
4
+ # Enforces the TaskCreate ordering contract: every mode entry point doc on
5
+ # Claude Code AND the Copilot full-inline orchestrator MUST carry the
6
+ # explicit "TaskCreate calls MUST fire in strict phase-number order BEFORE
7
+ # any TaskUpdate is applied" rule.
8
+ #
9
+ # Why this smoke exists: the native TaskList widget renders tiles in
10
+ # TaskCreate creation order, not by phase-number metadata. An agent that
11
+ # pre-creates "completed" tiles for skipped phases before Phase 0 starts
12
+ # produces visually scrambled tile stacks (1✓ · 2✓ · 4✓ · 0▶ · 3☐) even
13
+ # when the underlying tracker state is correct. Centralizing the rule in
14
+ # refs/tracker-contract.md is necessary but not sufficient — the LLM
15
+ # orchestrating each mode reads the mode entry doc, so the rule must
16
+ # appear in every mode entry doc.
17
+ #
18
+ # Exit 0 = all required surfaces declare the rule, 1 = any missing.
19
+
20
+ set -uo pipefail
21
+
22
+ ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
23
+
24
+ pass=0
25
+ fail=0
26
+ failures=()
27
+ record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
28
+ record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
29
+
30
+ printf '→ smoke-tasklist-ordering (v8.3.1): TaskCreate phase-number ordering contract\n'
31
+
32
+ # 1. tracker-contract.md — primary source of the rule
33
+ TRACKER_CONTRACT="$ROOT/pipeline/commands/multi-agent/refs/tracker-contract.md"
34
+ if grep -qE 'TaskCreate ordering \(strict\)' "$TRACKER_CONTRACT" \
35
+ && grep -qE 'phase-number order' "$TRACKER_CONTRACT" \
36
+ && grep -qE 'BEFORE any TaskUpdate' "$TRACKER_CONTRACT"; then
37
+ record_pass "tracker-contract.md declares the canonical ordering rule"
38
+ else
39
+ record_fail "tracker-contract.md missing the canonical ordering rule"
40
+ fi
41
+
42
+ # 2. Phase 0 init ref doc — the agent always reads this on Phase 0
43
+ PHASE0="$ROOT/pipeline/commands/multi-agent/refs/phases/phase-0-init.md"
44
+ if grep -qE '(strict|required).*(TaskCreate|ordering)' "$PHASE0" \
45
+ && grep -qE 'phase-number order' "$PHASE0"; then
46
+ record_pass "phase-0-init.md reinforces the ordering rule on Phase 0 entry"
47
+ else
48
+ record_fail "phase-0-init.md missing the ordering reinforcement"
49
+ fi
50
+
51
+ # 3. Every Claude Code mode entry doc — the rule must appear in each
52
+ MODE_ENTRY_DOCS=(
53
+ "pipeline/commands/multi-agent/dev.md"
54
+ "pipeline/commands/multi-agent/autopilot.md"
55
+ "pipeline/commands/multi-agent/local.md"
56
+ "pipeline/commands/multi-agent/local-autopilot.md"
57
+ "pipeline/commands/multi-agent/dev-autopilot.md"
58
+ "pipeline/commands/multi-agent/dev-local.md"
59
+ "pipeline/commands/multi-agent/dev-local-autopilot.md"
60
+ )
61
+ for rel in "${MODE_ENTRY_DOCS[@]}"; do
62
+ abs="$ROOT/$rel"
63
+ base="$(basename "$rel")"
64
+ if [ ! -f "$abs" ]; then
65
+ record_fail "$base missing from repo (inventory drift)"
66
+ continue
67
+ fi
68
+ if grep -qE 'TaskCreate ordering \(strict\)' "$abs" \
69
+ && grep -qE 'phase-number order' "$abs"; then
70
+ record_pass "$base declares the TaskCreate ordering rule"
71
+ else
72
+ record_fail "$base missing the TaskCreate ordering rule"
73
+ fi
74
+ done
75
+
76
+ # 4. Copilot full-inline orchestrator — Claude Code is single-CLI but the
77
+ # Copilot SKILL.md mirror must declare the same rule so the cross-CLI
78
+ # contract holds and any future Copilot-side TaskList equivalent inherits it.
79
+ COPILOT_SKILL="$ROOT/pipeline/skills/shared/core/multi-agent/SKILL.md"
80
+ if grep -qE 'TaskCreate ordering \(strict\)' "$COPILOT_SKILL" \
81
+ && grep -qE 'phase-number order' "$COPILOT_SKILL"; then
82
+ record_pass "Copilot multi-agent SKILL.md declares the TaskCreate ordering rule"
83
+ else
84
+ record_fail "Copilot multi-agent SKILL.md missing the TaskCreate ordering rule"
85
+ fi
86
+
87
+ # 5. Negative check — no doc should still carry the old "pre-mark skipped
88
+ # phases as completed" wording without the new ordering reinforcement.
89
+ LEGACY_ANTI_PATTERN='register the tile at startup, then mark it completed with .activeForm: "\[SKIPPED\]"'
90
+ LEGACY_HITS=$(grep -rlE "$LEGACY_ANTI_PATTERN" "$ROOT/pipeline/commands/multi-agent" 2>/dev/null || true)
91
+ if [ -z "$LEGACY_HITS" ]; then
92
+ record_pass "no legacy 'pre-mark skipped' wording lingering without the new rule"
93
+ else
94
+ for h in $LEGACY_HITS; do
95
+ if grep -qE 'TaskCreate ordering \(strict\)' "$h"; then
96
+ record_pass "$(basename "$h") carries legacy pattern but ALSO the ordering rule"
97
+ else
98
+ record_fail "$(basename "$h") still carries legacy 'pre-mark skipped' wording without the ordering rule"
99
+ fi
100
+ done
101
+ fi
102
+
103
+ # Summary
104
+ total=$((pass + fail))
105
+ printf '\n→ smoke-tasklist-ordering: %d/%d passed\n' "$pass" "$total"
106
+ if [ "$fail" -ne 0 ]; then
107
+ printf '\nFailures:\n'
108
+ for f in "${failures[@]}"; do printf ' - %s\n' "$f"; done
109
+ exit 1
110
+ fi
111
+ exit 0
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env bash
2
+ # smoke-telemetry.sh — contract check for log-metric.sh + aggregate-metrics.mjs.
3
+ #
4
+ # Verifies:
5
+ # 1. log-metric.sh appends valid JSONL (one line, parses, has required fields).
6
+ # 2. Type coercion works (booleans, ints, strings).
7
+ # 3. Concurrent appends don't interleave (10 parallel writers → 10 lines).
8
+ # 4. aggregate-metrics.mjs handles missing file gracefully.
9
+ # 5. aggregate-metrics.mjs computes accept_rate / reject_rate correctly.
10
+ # 6. aggregate-metrics.mjs --json produces valid JSON.
11
+
12
+ set -uo pipefail
13
+
14
+ HERE="$(cd "$(dirname "$0")" && pwd)"
15
+ ROOT="$(cd "$HERE/../.." && pwd)"
16
+ TMP="$(mktemp -d -t multi-agent-smoke-XXXX)"
17
+ trap 'rm -rf "$TMP"' EXIT
18
+
19
+ PASS=0
20
+ FAIL=0
21
+ pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
22
+ fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
23
+
24
+ need() { command -v "$1" >/dev/null 2>&1 || { echo "error: $1 is required" >&2; exit 127; }; }
25
+ need node
26
+ need jq
27
+
28
+ LOG="$ROOT/pipeline/scripts/log-metric.sh"
29
+ AGG="$ROOT/pipeline/scripts/aggregate-metrics.mjs"
30
+ export METRICS_FILE="$TMP/metrics.jsonl"
31
+
32
+ echo "→ 1. log-metric writes a JSONL line with required fields"
33
+ "$LOG" TASK-1 4 review.completed raw_count=8 accepted=3 deferred=2 rejected=3 approved=true
34
+ LINE=$(tail -1 "$METRICS_FILE")
35
+ if echo "$LINE" | jq -e '.ts and .task_id and .phase and .event and .details' >/dev/null; then
36
+ pass "JSONL line has all required fields"
37
+ else
38
+ fail "missing required field in: $LINE"
39
+ fi
40
+
41
+ echo ""
42
+ echo "→ 2. type coercion: bool, int, string"
43
+ TYPES=$(echo "$LINE" | jq -r '.details | "approved=" + (.approved | type) + " accepted=" + (.accepted | type) + " raw_count=" + (.raw_count | type)')
44
+ if [ "$TYPES" = "approved=boolean accepted=number raw_count=number" ]; then
45
+ pass "bool/int coerce correctly: $TYPES"
46
+ else
47
+ fail "type coercion wrong: $TYPES"
48
+ fi
49
+ "$LOG" TASK-1 4 triage.edge_case case=high-rejection-rate
50
+ STR_TYPE=$(tail -1 "$METRICS_FILE" | jq -r '.details.case | type')
51
+ if [ "$STR_TYPE" = "string" ]; then
52
+ pass "non-numeric strings stay strings"
53
+ else
54
+ fail "string coercion wrong: got $STR_TYPE"
55
+ fi
56
+
57
+ echo ""
58
+ echo "→ 3. concurrent appends (10 parallel writers → 10 lines)"
59
+ rm -f "$METRICS_FILE"
60
+ PIDS=()
61
+ for i in 1 2 3 4 5 6 7 8 9 10; do
62
+ "$LOG" TASK-$i 4 review.completed raw_count=$i accepted=0 deferred=0 rejected=0 approved=true &
63
+ PIDS+=($!)
64
+ done
65
+ FAILED=0
66
+ for pid in "${PIDS[@]}"; do
67
+ wait "$pid" || FAILED=$((FAILED+1))
68
+ done
69
+ if [ "$FAILED" -gt 0 ]; then
70
+ fail "$FAILED of 10 background log-metric calls failed"
71
+ fi
72
+ LINE_COUNT=$(wc -l < "$METRICS_FILE" | tr -d ' ')
73
+ if [ "$LINE_COUNT" = "10" ]; then
74
+ pass "10 concurrent writes produced 10 lines (no interleaving)"
75
+ else
76
+ fail "expected 10 lines, got $LINE_COUNT"
77
+ fi
78
+ PARSE_OK=$(awk '{ print }' "$METRICS_FILE" | jq -e '.task_id' >/dev/null && echo ok || echo fail)
79
+ if [ "$PARSE_OK" = "ok" ]; then
80
+ pass "all 10 lines parse as valid JSON"
81
+ else
82
+ fail "concurrent append corrupted JSON"
83
+ fi
84
+
85
+ echo ""
86
+ echo "→ 4. aggregator handles missing file gracefully"
87
+ EXIT_OK=0
88
+ node "$AGG" --json >/dev/null 2>&1 || EXIT_OK=$?
89
+ # Above call uses default METRICS_FILE which IS set, so let's force missing.
90
+ unset METRICS_FILE
91
+ EXIT_MISSING=0
92
+ METRICS_FILE="$TMP/does-not-exist.jsonl" node "$AGG" --json > "$TMP/missing-out.json" 2>&1 || EXIT_MISSING=$?
93
+ if [ "$EXIT_MISSING" = "0" ] && jq -e '.ok == false' "$TMP/missing-out.json" >/dev/null 2>&1; then
94
+ pass "missing file → exit 0 + ok:false"
95
+ else
96
+ fail "missing file handling wrong (exit=$EXIT_MISSING)"
97
+ fi
98
+ export METRICS_FILE="$TMP/metrics.jsonl"
99
+
100
+ echo ""
101
+ echo "→ 5. accept_rate and reject_rate computed correctly"
102
+ rm -f "$METRICS_FILE"
103
+ "$LOG" T 4 review.completed raw_count=10 accepted=4 deferred=2 rejected=4 approved=true
104
+ "$LOG" T 4 review.completed raw_count=10 accepted=2 deferred=4 rejected=4 approved=true
105
+ # Total: raw=20, accepted=6, deferred=6, rejected=8 → accept=0.30, reject=0.40
106
+ SUMMARY=$(node "$AGG" --json)
107
+ ACCEPT_RATE=$(echo "$SUMMARY" | jq -r '.triage_totals.accept_rate')
108
+ REJECT_RATE=$(echo "$SUMMARY" | jq -r '.triage_totals.reject_rate')
109
+ if [ "$ACCEPT_RATE" = "0.3" ] && [ "$REJECT_RATE" = "0.4" ]; then
110
+ pass "accept_rate=$ACCEPT_RATE reject_rate=$REJECT_RATE (expected 0.3 / 0.4)"
111
+ else
112
+ fail "rates wrong: accept=$ACCEPT_RATE reject=$REJECT_RATE"
113
+ fi
114
+
115
+ echo ""
116
+ echo "→ 6. --json output is valid JSON"
117
+ if echo "$SUMMARY" | jq empty >/dev/null 2>&1; then
118
+ pass "--json output parses"
119
+ else
120
+ fail "--json output is not valid JSON"
121
+ fi
122
+
123
+ echo ""
124
+ echo "→ 7. cost_per_model section aggregates per-model totals"
125
+ rm -f "$METRICS_FILE"
126
+ "$LOG" T 4 review.completed model=opus duration_ms=12000 tokens_in=4500 tokens_out=600
127
+ "$LOG" T 4 review.completed model=opus duration_ms=8000 tokens_in=3000 tokens_out=400
128
+ "$LOG" T 4 review.completed model=sonnet duration_ms=5000 tokens_in=4500 tokens_out=350
129
+ SUMMARY=$(node "$AGG" --json)
130
+ OPUS_CALLS=$(echo "$SUMMARY" | jq -r '.cost_per_model.opus.calls')
131
+ OPUS_TOKENS_IN=$(echo "$SUMMARY" | jq -r '.cost_per_model.opus.tokens_in')
132
+ SONNET_DURATION=$(echo "$SUMMARY" | jq -r '.cost_per_model.sonnet.duration_ms')
133
+ [ "$OPUS_CALLS" = "2" ] && pass "opus calls summed (=2)" || fail "opus calls expected 2, got $OPUS_CALLS"
134
+ [ "$OPUS_TOKENS_IN" = "7500" ] && pass "opus tokens_in summed (=7500)" || fail "opus tokens_in expected 7500, got $OPUS_TOKENS_IN"
135
+ [ "$SONNET_DURATION" = "5000" ] && pass "sonnet duration_ms summed (=5000)" || fail "sonnet duration_ms expected 5000, got $SONNET_DURATION"
136
+
137
+ echo ""
138
+ echo "→ 8. cost section absent when no model fields present"
139
+ rm -f "$METRICS_FILE"
140
+ "$LOG" T 0 init.completed phases=8
141
+ SUMMARY=$(node "$AGG" --json)
142
+ COST_KEYS=$(echo "$SUMMARY" | jq -r '.cost_per_model | keys | length')
143
+ [ "$COST_KEYS" = "0" ] && pass "cost_per_model is empty when no model fields emitted" || fail "expected 0 keys, got $COST_KEYS"
144
+
145
+ echo ""
146
+ echo "══ telemetry smoke: $PASS passed, $FAIL failed ══"
147
+ [ "$FAIL" -eq 0 ]
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env bash
2
+ # smoke-test-gap.sh — v8.3.0
3
+ #
4
+ # Verifies the Phase 5 test-gap pipeline:
5
+ # 1. Rules files load + parse for ios/android/python/node
6
+ # 2. iOS fixture: scanner finds save/load/fetch as gaps; testRenders
7
+ # isn't a gap because it's the test, not source
8
+ # 3. Android fixture: composable_fun symbol gets `important` severity
9
+ # 4. Python fixture: detects async_def + top_def, ignores test files
10
+ # 5. Node fixture: catches named_export Parser; tokenize is covered by
11
+ # paired test → no gap
12
+ # 6. validate-test-gap.mjs accepts valid output, rejects malformed
13
+ # 7. --severity-promote bumps suggestion → important
14
+ # 8. Empty / wrong-stack diff exits 2
15
+ # 9. phase-5-test.md ref doc declares the Test Gap Report step
16
+ # 10. prefs.schema.json exposes testGap settings group
17
+ #
18
+ # Exit 0 = all pass, 1 = any failure.
19
+
20
+ set -euo pipefail
21
+
22
+ ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
23
+ SCAN="$ROOT/pipeline/scripts/test-gap-scan.mjs"
24
+ VAL="$ROOT/pipeline/scripts/validate-test-gap.mjs"
25
+ PHASE5="$ROOT/pipeline/commands/multi-agent/refs/phases/phase-5-test.md"
26
+ PREFS="$ROOT/pipeline/schemas/prefs.schema.json"
27
+ RULES_DIR="$ROOT/pipeline/scripts/test-gap-rules"
28
+ FIX_IOS="$ROOT/pipeline/scripts/fixtures/diff-risk-ios.diff"
29
+ FIX_AND="$ROOT/pipeline/scripts/fixtures/diff-risk-android.diff"
30
+ FIX_PY="$ROOT/pipeline/scripts/fixtures/test-gap-python.diff"
31
+ FIX_NODE="$ROOT/pipeline/scripts/fixtures/test-gap-node.diff"
32
+
33
+ pass=0
34
+ fail=0
35
+ failures=()
36
+ record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
37
+ record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
38
+
39
+ printf '→ smoke-test-gap (v8.3.0): Phase 5 test-gap detector contract\n'
40
+
41
+ # --- 1: rules files exist + parse for each stack ---
42
+ for stack in ios android python node; do
43
+ if jq -e '.stack and .sourceExtensions and .publicApiPatterns' "$RULES_DIR/$stack.json" >/dev/null 2>&1; then
44
+ record_pass "$stack rules parse and contain stack/extensions/patterns"
45
+ else
46
+ record_fail "$stack rules malformed"
47
+ fi
48
+ done
49
+
50
+ # --- 2: iOS fixture — KeychainStore.save/load + ApiClient.fetch detected ---
51
+ out_ios=$(node "$SCAN" --diff "$FIX_IOS" --stack ios 2>/dev/null)
52
+ gap_count=$(jq '.totals.gapCount' <<< "$out_ios")
53
+ if [ "$gap_count" -ge 3 ]; then
54
+ record_pass "iOS: at least 3 gaps reported (got $gap_count)"
55
+ else
56
+ record_fail "iOS: expected >=3 gaps, got $gap_count"
57
+ fi
58
+ if jq -e '.gaps[] | select(.symbol == "save")' <<< "$out_ios" >/dev/null 2>&1; then
59
+ record_pass "iOS: KeychainStore.save flagged as gap"
60
+ else
61
+ record_fail "iOS: KeychainStore.save missing from gaps"
62
+ fi
63
+ if jq -e '.gaps[] | select(.symbol == "fetch")' <<< "$out_ios" >/dev/null 2>&1; then
64
+ record_pass "iOS: ApiClient.fetch flagged as gap"
65
+ else
66
+ record_fail "iOS: ApiClient.fetch missing from gaps"
67
+ fi
68
+ # Test method itself shouldn't show up as a gap
69
+ if jq -e '.gaps[] | select(.symbol == "testRenders")' <<< "$out_ios" >/dev/null 2>&1; then
70
+ record_fail "iOS: testRenders should not be a gap (it's already a test)"
71
+ else
72
+ record_pass "iOS: test methods excluded from gap list"
73
+ fi
74
+
75
+ # --- 3: Android fixture — composable_fun → important severity ---
76
+ out_and=$(node "$SCAN" --diff "$FIX_AND" --stack android 2>/dev/null)
77
+ if jq -e '.gaps[] | select(.kind == "composable_fun" and .severity == "important")' <<< "$out_and" >/dev/null 2>&1; then
78
+ record_pass "Android: composable_fun gets 'important' severity"
79
+ else
80
+ record_fail "Android: composable_fun severity wrong"
81
+ fi
82
+ if jq -e '.gaps[] | select(.symbol == "login")' <<< "$out_and" >/dev/null 2>&1; then
83
+ record_pass "Android: AuthRepository.login flagged"
84
+ else
85
+ record_fail "Android: AuthRepository.login missing"
86
+ fi
87
+
88
+ # --- 4: Python fixture — async_def + top_def detected, test file ignored ---
89
+ out_py=$(node "$SCAN" --diff "$FIX_PY" --stack python 2>/dev/null)
90
+ if jq -e '.gaps[] | select(.kind == "async_def" and .symbol == "refund")' <<< "$out_py" >/dev/null 2>&1; then
91
+ record_pass "Python: async_def refund detected"
92
+ else
93
+ record_fail "Python: async_def refund missing"
94
+ fi
95
+ if jq -e '.gaps[] | select(.symbol == "normalize_currency")' <<< "$out_py" >/dev/null 2>&1; then
96
+ record_pass "Python: normalize_currency detected"
97
+ else
98
+ record_fail "Python: normalize_currency missing"
99
+ fi
100
+ if jq -e '.totals.testsScanned >= 1' <<< "$out_py" >/dev/null 2>&1; then
101
+ record_pass "Python: test file recognised in counter"
102
+ else
103
+ record_fail "Python: testsScanned should include the new test_processor.py"
104
+ fi
105
+
106
+ # --- 5: Node fixture — Parser flagged, tokenize covered by paired test ---
107
+ out_node=$(node "$SCAN" --diff "$FIX_NODE" --stack node 2>/dev/null)
108
+ if jq -e '.gaps[] | select(.symbol == "Parser")' <<< "$out_node" >/dev/null 2>&1; then
109
+ record_pass "Node: Parser export flagged"
110
+ else
111
+ record_fail "Node: Parser export missing from gaps"
112
+ fi
113
+ if jq -e '.gaps[] | select(.symbol == "tokenize")' <<< "$out_node" >/dev/null 2>&1; then
114
+ record_fail "Node: tokenize should be covered by added test, not flagged"
115
+ else
116
+ record_pass "Node: tokenize correctly excluded (paired test mentions it)"
117
+ fi
118
+
119
+ # --- 6: Validator accepts/rejects ---
120
+ set +e
121
+ echo "$out_ios" | node "$VAL" - >/dev/null 2>&1
122
+ rc_ok=$?
123
+ echo '{"schemaVersion":"0.0.0","gaps":[]}' | node "$VAL" - >/dev/null 2>&1
124
+ rc_bad=$?
125
+ set -e
126
+ if [ "$rc_ok" -eq 0 ]; then record_pass "validator accepts valid output"; else record_fail "validator rejected valid output"; fi
127
+ if [ "$rc_bad" -ne 0 ]; then record_pass "validator rejects malformed"; else record_fail "validator should reject malformed"; fi
128
+
129
+ # --- 7: --severity-promote ---
130
+ out_prom=$(node "$SCAN" --diff "$FIX_IOS" --stack ios --severity-promote 2>/dev/null)
131
+ if jq -e 'all(.gaps[]; .severity == "important")' <<< "$out_prom" >/dev/null 2>&1; then
132
+ record_pass "--severity-promote forces all gaps to 'important'"
133
+ else
134
+ record_fail "--severity-promote did not promote severities"
135
+ fi
136
+
137
+ # --- 8: Empty diff exits 2 ---
138
+ empty=$(mktemp)
139
+ set +e
140
+ node "$SCAN" --diff "$empty" --stack ios >/dev/null 2>&1
141
+ rc=$?
142
+ set -e
143
+ rm -f "$empty"
144
+ if [ "$rc" -eq 2 ]; then
145
+ record_pass "empty diff exits 2"
146
+ else
147
+ record_fail "empty diff should exit 2 (got $rc)"
148
+ fi
149
+
150
+ # Wrong-stack: iOS diff scanned with python rules → no python sources → exit 2
151
+ set +e
152
+ node "$SCAN" --diff "$FIX_IOS" --stack python >/dev/null 2>&1
153
+ rc=$?
154
+ set -e
155
+ if [ "$rc" -eq 2 ]; then
156
+ record_pass "iOS diff with python rules exits 2 (no matching sources)"
157
+ else
158
+ record_fail "wrong-stack should exit 2 (got $rc)"
159
+ fi
160
+
161
+ # --- 9: phase-5-test.md declares the Test Gap Report step ---
162
+ if grep -qE 'Test Gap Report|test-gap-scan\.mjs' "$PHASE5"; then
163
+ record_pass "phase-5-test.md declares Test Gap Report step"
164
+ else
165
+ record_fail "phase-5-test.md missing Test Gap Report step"
166
+ fi
167
+
168
+ # --- 10: prefs schema exposes testGap group ---
169
+ if jq -e '.properties.global.properties.testGap' "$PREFS" >/dev/null 2>&1; then
170
+ record_pass "prefs schema exposes testGap settings group"
171
+ else
172
+ record_fail "prefs.schema.json missing global.testGap group"
173
+ fi
174
+
175
+ # --- Summary ---
176
+ total=$((pass + fail))
177
+ printf '\n→ smoke-test-gap: %d/%d passed\n' "$pass" "$total"
178
+ if [ "$fail" -ne 0 ]; then
179
+ printf '\nFailures:\n'
180
+ for f in "${failures[@]}"; do printf ' - %s\n' "$f"; done
181
+ exit 1
182
+ fi
183
+ exit 0
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env bash
2
+ # smoke-token-budget.sh — verify phase docs stay within token budget.
3
+ # Reads token-budget.json and checks each phase doc's char count / 4.
4
+ # Fails if any phase exceeds its max_tokens limit.
5
+
6
+ set -euo pipefail
7
+
8
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
9
+ PIPELINE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
10
+ BUDGET_FILE="$PIPELINE_DIR/schemas/token-budget.json"
11
+ PHASES_DIR="$PIPELINE_DIR/commands/multi-agent/refs/phases"
12
+
13
+ if [ ! -f "$BUDGET_FILE" ]; then
14
+ echo "FAIL: token-budget.json not found at $BUDGET_FILE" >&2
15
+ exit 1
16
+ fi
17
+
18
+ command -v jq >/dev/null 2>&1 || { echo "jq is required" >&2; exit 64; }
19
+
20
+ PASS=0
21
+ FAIL=0
22
+ WARN=0
23
+
24
+ pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
25
+ warn() { WARN=$((WARN+1)); echo " ⚠ $1"; }
26
+ fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
27
+
28
+ TOTAL_TOKENS=0
29
+ TOTAL_MAX=$(jq -r '.total_max_tokens' "$BUDGET_FILE")
30
+
31
+ echo "→ Token budget check (chars/4 estimate)"
32
+ echo ""
33
+
34
+ for phase_key in $(jq -r '.phases | keys[]' "$BUDGET_FILE"); do
35
+ file="$PHASES_DIR/${phase_key}.md"
36
+ max_tokens=$(jq -r ".phases[\"$phase_key\"].max_tokens" "$BUDGET_FILE")
37
+ warn_tokens=$(jq -r ".phases[\"$phase_key\"].warn_tokens" "$BUDGET_FILE")
38
+
39
+ if [ ! -f "$file" ]; then
40
+ fail "$phase_key: file not found ($file)"
41
+ continue
42
+ fi
43
+
44
+ chars=$(wc -c < "$file" | tr -d ' ')
45
+ tokens=$(( (chars + 3) / 4 ))
46
+ TOTAL_TOKENS=$((TOTAL_TOKENS + tokens))
47
+
48
+ if [ "$tokens" -gt "$max_tokens" ]; then
49
+ fail "$phase_key: ${tokens} tokens > max ${max_tokens} (${chars} chars)"
50
+ elif [ "$tokens" -gt "$warn_tokens" ]; then
51
+ warn "$phase_key: ${tokens} tokens > warn ${warn_tokens} (within max ${max_tokens})"
52
+ else
53
+ pass "$phase_key: ${tokens} tokens ≤ ${warn_tokens} warn (max ${max_tokens})"
54
+ fi
55
+ done
56
+
57
+ echo ""
58
+ echo "→ Total phase doc budget"
59
+ if [ "$TOTAL_TOKENS" -gt "$TOTAL_MAX" ]; then
60
+ fail "total: ${TOTAL_TOKENS} tokens > max ${TOTAL_MAX}"
61
+ else
62
+ pass "total: ${TOTAL_TOKENS} tokens ≤ max ${TOTAL_MAX}"
63
+ fi
64
+
65
+ echo ""
66
+ echo "══ token-budget smoke: $((PASS)) passed, $((WARN)) warnings, $((FAIL)) failed ══"
67
+ [ "$FAIL" -eq 0 ]
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env bash
2
+ # smoke-tracker-contract.sh — v7.9.1
3
+ #
4
+ # Validates that every mode dispatch file (dev.md, dev-local.md, autopilot.md,
5
+ # etc.) carries the mandatory phase-tracker.sh invocation contract.
6
+ #
7
+ # Without this, agent prompts can fall through to TaskCreate/TaskList UI which
8
+ # does NOT track elapsed time or token counts — users see only static
9
+ # checkboxes with no progress info. The 2026-04-27 regression that prompted
10
+ # this smoke: 8 mode dispatch files shipped through v7.6 → v7.9 with zero
11
+ # tracker references; agent went straight to Claude Code's plan UI.
12
+ #
13
+ # What this enforces:
14
+ # 1. Each mode file references phase-tracker.sh at least N times (init +
15
+ # add + update + tokens + render at minimum)
16
+ # 2. Each mode file links to refs/tracker-contract.md
17
+ # 3. The shared contract file exists and documents the invocation pattern
18
+ #
19
+ # What this does NOT enforce:
20
+ # - Runtime — that the agent actually invokes the tracker. That's a contract
21
+ # test the orchestrator carries; this smoke catches the prompt-side gap.
22
+
23
+ set -uo pipefail
24
+
25
+ REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
26
+ CMDS_DIR="$REPO_ROOT/pipeline/commands/multi-agent"
27
+ CONTRACT_FILE="$CMDS_DIR/refs/tracker-contract.md"
28
+
29
+ # Mode dispatch files that must reference the tracker contract.
30
+ # Updated when new mode files ship; no auto-discovery (false positives on
31
+ # helpers like _account-picker, status, log).
32
+ MODE_FILES=(
33
+ dev.md
34
+ dev-local.md
35
+ dev-autopilot.md
36
+ dev-local-autopilot.md
37
+ autopilot.md
38
+ local.md
39
+ local-autopilot.md
40
+ )
41
+
42
+ # Minimum tracker references per file (init + at least one of the verbs).
43
+ # Set conservatively — the section template emits 6 references; bump if
44
+ # template is shortened in future.
45
+ MIN_REFS=4
46
+
47
+ PASS=0
48
+ FAIL=0
49
+ pass() { PASS=$((PASS + 1)); echo " ✓ $1"; }
50
+ fail() { FAIL=$((FAIL + 1)); echo " ✗ $1"; }
51
+
52
+ # ──────────────────────────────────────────────────────────────────────────
53
+ echo "→ 1. Tracker contract reference file exists"
54
+ if [ -f "$CONTRACT_FILE" ]; then
55
+ pass "refs/tracker-contract.md present"
56
+ else
57
+ fail "refs/tracker-contract.md missing — mode files have nowhere to link to"
58
+ fi
59
+
60
+ # ──────────────────────────────────────────────────────────────────────────
61
+ echo "→ 2. Contract file documents the full invocation pattern"
62
+ if [ -f "$CONTRACT_FILE" ]; then
63
+ for verb in "init" "add" "update" "tokens" "render"; do
64
+ if grep -q "phase-tracker.sh $verb" "$CONTRACT_FILE"; then
65
+ pass "contract documents '$verb' verb"
66
+ else
67
+ fail "contract missing '$verb' verb in invocation pattern"
68
+ fi
69
+ done
70
+ fi
71
+
72
+ # ──────────────────────────────────────────────────────────────────────────
73
+ echo "→ 3. Every mode file references phase-tracker.sh"
74
+ for mode_file in "${MODE_FILES[@]}"; do
75
+ full="$CMDS_DIR/$mode_file"
76
+ if [ ! -f "$full" ]; then
77
+ fail "$mode_file missing"
78
+ continue
79
+ fi
80
+ refs=$(grep -c "phase-tracker" "$full" || true)
81
+ if [ "$refs" -ge "$MIN_REFS" ]; then
82
+ pass "$mode_file: $refs tracker references (≥ $MIN_REFS)"
83
+ else
84
+ fail "$mode_file: only $refs tracker references (< $MIN_REFS expected)"
85
+ fi
86
+ done
87
+
88
+ # ──────────────────────────────────────────────────────────────────────────
89
+ echo "→ 4. Every mode file links to refs/tracker-contract.md"
90
+ for mode_file in "${MODE_FILES[@]}"; do
91
+ full="$CMDS_DIR/$mode_file"
92
+ [ -f "$full" ] || continue
93
+ if grep -q "tracker-contract" "$full"; then
94
+ pass "$mode_file → links to tracker-contract.md"
95
+ else
96
+ fail "$mode_file missing link to refs/tracker-contract.md"
97
+ fi
98
+ done
99
+
100
+ # ──────────────────────────────────────────────────────────────────────────
101
+ echo "→ 5. Anti-pattern guard — mode files warn against TaskCreate fallback"
102
+ for mode_file in "${MODE_FILES[@]}"; do
103
+ full="$CMDS_DIR/$mode_file"
104
+ [ -f "$full" ] || continue
105
+ if grep -qE "TaskCreate|checkbox UI" "$full"; then
106
+ pass "$mode_file mentions anti-pattern (TaskCreate / checkbox UI)"
107
+ else
108
+ fail "$mode_file has no anti-pattern guard"
109
+ fi
110
+ done
111
+
112
+ # ──────────────────────────────────────────────────────────────────────────
113
+ echo "→ 6. Phase 0 init pattern present in dispatch templates"
114
+ # This catches the specific bug from 2026-04-27: tracker was never init'd
115
+ # because dispatch files said "see refs" without inlining the call.
116
+ for mode_file in "${MODE_FILES[@]}"; do
117
+ full="$CMDS_DIR/$mode_file"
118
+ [ -f "$full" ] || continue
119
+ if grep -q 'phase-tracker.sh init' "$full"; then
120
+ pass "$mode_file inlines 'phase-tracker.sh init' (refs-only is not enough)"
121
+ else
122
+ fail "$mode_file does not inline init call"
123
+ fi
124
+ done
125
+
126
+ # ──────────────────────────────────────────────────────────────────────────
127
+ echo ""
128
+ echo "══ tracker-contract smoke: $PASS passed, $FAIL failed ══"
129
+ [ "$FAIL" -eq 0 ]