@1aboveio/skills 0.10.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 (397) hide show
  1. package/LICENSE +3 -0
  2. package/README.md +90 -0
  3. package/bin/1aboveio-skills.mjs +18 -0
  4. package/package.json +28 -0
  5. package/runtime/skills/distribution/generated/recipes.json +1189 -0
  6. package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
  7. package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  8. package/skills/backend/airflow-dag-develop/LICENSE +3 -0
  9. package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
  10. package/skills/backend/app-debug/LICENSE +3 -0
  11. package/skills/backend/app-debug/SKILL.md +109 -0
  12. package/skills/backend/app-debug/references/common-errors.md +128 -0
  13. package/skills/backend/python-backend/LICENSE +3 -0
  14. package/skills/backend/python-backend/SKILL.md +326 -0
  15. package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
  16. package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
  17. package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
  18. package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
  19. package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
  20. package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
  21. package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
  22. package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
  23. package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
  24. package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
  25. package/skills/cicd-pipeline/docker/LICENSE +3 -0
  26. package/skills/cicd-pipeline/docker/SKILL.md +126 -0
  27. package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
  28. package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
  29. package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
  30. package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
  31. package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
  32. package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
  33. package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
  34. package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
  35. package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
  36. package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
  37. package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
  38. package/skills/cicd-pipeline/mergify/LICENSE +3 -0
  39. package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
  40. package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
  41. package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
  42. package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
  43. package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
  44. package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
  45. package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
  46. package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
  47. package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
  48. package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
  49. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
  50. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
  51. package/skills/cicd-pipeline/podman/LICENSE +3 -0
  52. package/skills/cicd-pipeline/podman/SKILL.md +70 -0
  53. package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
  54. package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
  55. package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
  56. package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
  57. package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
  58. package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
  59. package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
  60. package/skills/engineering/e2e-test/LICENSE +3 -0
  61. package/skills/engineering/e2e-test/SKILL.md +156 -0
  62. package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
  63. package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
  64. package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
  65. package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
  66. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
  67. package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
  68. package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
  69. package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
  70. package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
  71. package/skills/engineering/e2e-test/references/debugging.md +36 -0
  72. package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
  73. package/skills/engineering/e2e-test/references/reviewing.md +39 -0
  74. package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
  75. package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
  76. package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
  77. package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
  78. package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
  79. package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
  80. package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
  81. package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
  82. package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
  83. package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
  84. package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
  85. package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
  86. package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -0
  87. package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
  88. package/skills/engineering/engineering-runtime/LICENSE +3 -0
  89. package/skills/engineering/engineering-runtime/SKILL.md +10 -0
  90. package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
  91. package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -0
  92. package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
  93. package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
  94. package/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  95. package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
  96. package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
  97. package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
  98. package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
  99. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +576 -0
  100. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
  101. package/skills/engineering/ensure-coverage/LICENSE +3 -0
  102. package/skills/engineering/ensure-coverage/SKILL.md +136 -0
  103. package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
  104. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
  105. package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -0
  106. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
  107. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
  108. package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
  109. package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +25 -0
  110. package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
  111. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
  112. package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
  113. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
  114. package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
  115. package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
  116. package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
  117. package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
  118. package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
  119. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
  120. package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
  121. package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
  122. package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
  123. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
  124. package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
  125. package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
  126. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
  127. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
  128. package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
  129. package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
  130. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
  131. package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
  132. package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
  133. package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
  134. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
  135. package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
  136. package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
  137. package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
  138. package/skills/engineering/harness-runtime/LICENSE +3 -0
  139. package/skills/engineering/harness-runtime/SKILL.md +18 -0
  140. package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
  141. package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
  142. package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
  143. package/skills/engineering/harness-runtime/contracts.md +15 -0
  144. package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
  145. package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
  146. package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
  147. package/skills/engineering/harness-runtime/index.mjs +767 -0
  148. package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
  149. package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
  150. package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
  151. package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
  152. package/skills/engineering/implement-and-pr/LICENSE +3 -0
  153. package/skills/engineering/implement-and-pr/SKILL.md +176 -0
  154. package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
  155. package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
  156. package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
  157. package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
  158. package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
  159. package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
  160. package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
  161. package/skills/engineering/resolve-issues/LICENSE +3 -0
  162. package/skills/engineering/resolve-issues/SKILL.md +167 -0
  163. package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
  164. package/skills/engineering/resolve-issues/references/breaker.md +82 -0
  165. package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
  166. package/skills/engineering/resolve-issues/references/delivery.md +108 -0
  167. package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
  168. package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
  169. package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
  170. package/skills/engineering/resolve-issues/references/finalization.md +68 -0
  171. package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
  172. package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
  173. package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
  174. package/skills/engineering/resolve-issues/references/intake.md +86 -0
  175. package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
  176. package/skills/engineering/resolve-issues/references/interference.md +87 -0
  177. package/skills/engineering/resolve-issues/references/loop.md +134 -0
  178. package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
  179. package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
  180. package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
  181. package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
  182. package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
  183. package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
  184. package/skills/engineering/resolve-issues/references/run-state.md +288 -0
  185. package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
  186. package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
  187. package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
  188. package/skills/engineering/resolve-issues/references/why.md +653 -0
  189. package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
  190. package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
  191. package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
  192. package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
  193. package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
  194. package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
  195. package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
  196. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
  197. package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
  198. package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
  199. package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
  200. package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
  201. package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
  202. package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
  203. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
  204. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
  205. package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
  206. package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
  207. package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
  208. package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
  209. package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
  210. package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
  211. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
  212. package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
  213. package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
  214. package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
  215. package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
  216. package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
  217. package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
  218. package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
  219. package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
  220. package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
  221. package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
  222. package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
  223. package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
  224. package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
  225. package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
  226. package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
  227. package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
  228. package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
  229. package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
  230. package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
  231. package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
  232. package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
  233. package/skills/engineering/resolve-release/LICENSE +3 -0
  234. package/skills/engineering/resolve-release/SKILL.md +112 -0
  235. package/skills/engineering/resolve-release/references/assembly.md +137 -0
  236. package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
  237. package/skills/engineering/resolve-release/references/candidate.md +167 -0
  238. package/skills/engineering/resolve-release/references/exposure.md +178 -0
  239. package/skills/engineering/resolve-release/references/handoff.md +24 -0
  240. package/skills/engineering/resolve-release/references/postmortem.md +230 -0
  241. package/skills/engineering/resolve-release/references/preflight.md +207 -0
  242. package/skills/engineering/resolve-release/references/principles.md +94 -0
  243. package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
  244. package/skills/engineering/resolve-release/references/related-skills.md +12 -0
  245. package/skills/engineering/resolve-release/references/routing.md +149 -0
  246. package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
  247. package/skills/engineering/resolve-release/references/versioning.md +202 -0
  248. package/skills/engineering/resolve-release/references/why.md +53 -0
  249. package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
  250. package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
  251. package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
  252. package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
  253. package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
  254. package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
  255. package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
  256. package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
  257. package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
  258. package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
  259. package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
  260. package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
  261. package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
  262. package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
  263. package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
  264. package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
  265. package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
  266. package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
  267. package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
  268. package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
  269. package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
  270. package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
  271. package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
  272. package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
  273. package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
  274. package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
  275. package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
  276. package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
  277. package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
  278. package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
  279. package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
  280. package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
  281. package/skills/engineering/resolve-release/vendor/README.md +60 -0
  282. package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
  283. package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
  284. package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
  285. package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
  286. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
  287. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
  288. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
  289. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
  290. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
  291. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
  292. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
  293. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
  294. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
  295. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
  296. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
  297. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
  298. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
  299. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
  300. package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
  301. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
  302. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
  303. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
  304. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
  305. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
  306. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
  307. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
  308. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
  309. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
  310. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
  311. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
  312. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
  313. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
  314. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
  315. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
  316. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
  317. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
  318. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
  319. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
  320. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
  321. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
  322. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
  323. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
  324. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
  325. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
  326. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
  327. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
  328. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
  329. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
  330. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
  331. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
  332. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
  333. package/skills/engineering/review-pr/LICENSE +3 -0
  334. package/skills/engineering/review-pr/SKILL.md +123 -0
  335. package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
  336. package/skills/engineering/review-pr/references/code-correctness.md +5 -0
  337. package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
  338. package/skills/engineering/review-pr/references/coordination.md +18 -0
  339. package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
  340. package/skills/engineering/review-pr/references/finding-themes.md +7 -0
  341. package/skills/engineering/review-pr/references/github-posting.md +98 -0
  342. package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
  343. package/skills/engineering/review-pr/references/incremental-output.md +16 -0
  344. package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
  345. package/skills/engineering/review-pr/references/output-format.md +99 -0
  346. package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
  347. package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
  348. package/skills/engineering/review-pr/references/re-review.md +18 -0
  349. package/skills/engineering/review-pr/references/review-method.md +199 -0
  350. package/skills/engineering/review-pr/references/review-mode.md +30 -0
  351. package/skills/engineering/review-pr/references/review-posture.md +53 -0
  352. package/skills/engineering/review-pr/references/round1-depth.md +62 -0
  353. package/skills/engineering/review-pr/references/scripts.md +17 -0
  354. package/skills/engineering/review-pr/references/workflow.md +16 -0
  355. package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
  356. package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
  357. package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
  358. package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
  359. package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
  360. package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
  361. package/skills/engineering/smoke/LICENSE +3 -0
  362. package/skills/engineering/smoke/SKILL.md +131 -0
  363. package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
  364. package/skills/engineering/smoke/references/manifest.md +192 -0
  365. package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
  366. package/skills/fullstack/better-auth/LICENSE +3 -0
  367. package/skills/fullstack/better-auth/SKILL.md +601 -0
  368. package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
  369. package/skills/fullstack/monorepo/LICENSE +3 -0
  370. package/skills/fullstack/monorepo/SKILL.md +465 -0
  371. package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
  372. package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
  373. package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
  374. package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
  375. package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
  376. package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
  377. package/skills/fullstack/prisma-setup/LICENSE +3 -0
  378. package/skills/fullstack/prisma-setup/SKILL.md +180 -0
  379. package/skills/fullstack/prisma-setup/nextjs.md +258 -0
  380. package/skills/fullstack/prisma-setup/turborepo.md +301 -0
  381. package/skills/fullstack/shadcn/LICENSE +3 -0
  382. package/skills/fullstack/shadcn/SKILL.md +119 -0
  383. package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
  384. package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
  385. package/skills/fullstack/shadcn/cli.md +411 -0
  386. package/skills/fullstack/shadcn/customization.md +224 -0
  387. package/skills/fullstack/shadcn/evals/evals.json +90 -0
  388. package/skills/fullstack/shadcn/mcp.md +101 -0
  389. package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
  390. package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
  391. package/skills/fullstack/shadcn/rules/composition.md +195 -0
  392. package/skills/fullstack/shadcn/rules/data-table.md +201 -0
  393. package/skills/fullstack/shadcn/rules/forms.md +255 -0
  394. package/skills/fullstack/shadcn/rules/icons.md +103 -0
  395. package/skills/fullstack/shadcn/rules/styling.md +167 -0
  396. package/skills/fullstack/zod-v4/LICENSE +3 -0
  397. package/skills/fullstack/zod-v4/SKILL.md +287 -0
@@ -0,0 +1,576 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
3
+ import { isAbsolute, join, normalize, relative } from 'node:path';
4
+ import { isDeepStrictEqual } from 'node:util';
5
+
6
+ import { isMainModule } from './main-module.mjs';
7
+ import {
8
+ HARNESS_RUNTIME_DEPENDENCY_MEMBERS,
9
+ MATT_DEPENDENCY_MEMBERS,
10
+ WORKFLOW_OWNED_MEMBERS,
11
+ WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES,
12
+ WORKFLOW_TRUSTED_REPAIR_RECIPE,
13
+ WORKFLOW_TRUSTED_SOURCES,
14
+ } from './workflow-policy.mjs';
15
+
16
+ export {
17
+ HARNESS_RUNTIME_DEPENDENCY_MEMBERS,
18
+ MATT_DEPENDENCY_MEMBERS,
19
+ WORKFLOW_OWNED_MEMBERS,
20
+ WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES,
21
+ WORKFLOW_TRUSTED_REPAIR_RECIPE,
22
+ } from './workflow-policy.mjs';
23
+
24
+ // v2 (#996): a first-party member digests its PUBLISHED content — the file set the release ships on
25
+ // every render target — while an external member still digests its reviewed upstream tree exactly.
26
+ // v1 digested the exact tree for both, which made the same first-party release digest differently in
27
+ // a private checkout and in the npm package and reported every correctly installed member modified.
28
+ export const WORKFLOW_DIGEST_ALGORITHM = 'sha256-path-content-v2';
29
+ export const WORKFLOW_COHERENCE_PATH = 'skills/engineering/engineering-runtime/coherence/workflow.json';
30
+ const DIGEST = /^[0-9a-f]{64}$/;
31
+
32
+ function deepFreeze(value) {
33
+ if (value && typeof value === 'object' && !Object.isFrozen(value)) {
34
+ for (const child of Object.values(value)) deepFreeze(child);
35
+ Object.freeze(value);
36
+ }
37
+ return value;
38
+ }
39
+
40
+ const FIRST_PARTY_SOURCE = WORKFLOW_TRUSTED_SOURCES.firstParty;
41
+ const MATT_SOURCE = WORKFLOW_TRUSTED_SOURCES.matt;
42
+ const MATT_MEMBER_PATHS = Object.freeze({
43
+ 'batch-grill-me': 'skills/in-progress/batch-grill-me',
44
+ 'code-review': 'skills/engineering/code-review',
45
+ 'codebase-design': 'skills/engineering/codebase-design',
46
+ 'diagnosing-bugs': 'skills/engineering/diagnosing-bugs',
47
+ 'domain-modeling': 'skills/engineering/domain-modeling',
48
+ 'grill-me': 'skills/productivity/grill-me',
49
+ 'grill-with-docs': 'skills/engineering/grill-with-docs',
50
+ grilling: 'skills/productivity/grilling',
51
+ handoff: 'skills/productivity/handoff',
52
+ 'improve-codebase-architecture': 'skills/engineering/improve-codebase-architecture',
53
+ prototype: 'skills/engineering/prototype',
54
+ research: 'skills/engineering/research',
55
+ 'resolving-merge-conflicts': 'skills/engineering/resolving-merge-conflicts',
56
+ 'setup-matt-pocock-skills': 'skills/engineering/setup-matt-pocock-skills',
57
+ tdd: 'skills/engineering/tdd',
58
+ 'to-spec': 'skills/engineering/to-spec',
59
+ 'to-tickets': 'skills/engineering/to-tickets',
60
+ triage: 'skills/engineering/triage',
61
+ wayfinder: 'skills/engineering/wayfinder',
62
+ });
63
+ export const WORKFLOW_TRUSTED_POLICY = deepFreeze({
64
+ members: [
65
+ ...MATT_DEPENDENCY_MEMBERS.map((installName) => ({
66
+ installName,
67
+ ownership: 'dependency',
68
+ sourcePath: MATT_MEMBER_PATHS[installName],
69
+ expectedSource: MATT_SOURCE,
70
+ })),
71
+ ...HARNESS_RUNTIME_DEPENDENCY_MEMBERS.map((installName) => ({
72
+ installName,
73
+ ownership: 'dependency',
74
+ sourcePath: 'skills/engineering/harness-runtime',
75
+ expectedSource: FIRST_PARTY_SOURCE,
76
+ })),
77
+ ...WORKFLOW_OWNED_MEMBERS.map((installName) => ({
78
+ installName,
79
+ ownership: 'owned',
80
+ sourcePath: `skills/engineering/${installName}`,
81
+ expectedSource: FIRST_PARTY_SOURCE,
82
+ })),
83
+ ],
84
+ dependencyClosures: WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES,
85
+ repairRecipe: WORKFLOW_TRUSTED_REPAIR_RECIPE,
86
+ });
87
+
88
+ const TRUSTED_MEMBER_BY_NAME = new Map(
89
+ WORKFLOW_TRUSTED_POLICY.members.map((member) => [member.installName, member]),
90
+ );
91
+ const REPAIR_RECIPE_REFERENCE = deepFreeze({
92
+ id: WORKFLOW_TRUSTED_REPAIR_RECIPE.id,
93
+ generatedFrom: WORKFLOW_TRUSTED_REPAIR_RECIPE.generatedFrom,
94
+ groupId: WORKFLOW_TRUSTED_REPAIR_RECIPE.groupId,
95
+ lifecycle: WORKFLOW_TRUSTED_REPAIR_RECIPE.lifecycle,
96
+ });
97
+ const FALLBACK_SOURCE = FIRST_PARTY_SOURCE;
98
+
99
+ // Install / OS debris that must never enter a member content digest. Same names
100
+ // distribution.mjs skips when walking trees for census/generate. Without this,
101
+ // a local `npm install` that drops package-lock.json or node_modules (gitignored)
102
+ // silently changes digests and CI (which has a clean checkout) reports
103
+ // member-content-modified / committed drift — residual of #791/#792 digest chores.
104
+ const DIGEST_SKIP_NAMES = new Set([
105
+ 'node_modules',
106
+ 'package-lock.json',
107
+ '.DS_Store',
108
+ '.git',
109
+ '.unit-git',
110
+ '.system',
111
+ ]);
112
+
113
+ // `<name>.fixture.<ext>` / `<name>.fixtures.<ext>` — this repository's convention for a recorded
114
+ // payload that exists only so a `*.test.mjs` can replay it. Anchored on a FILE extension, which is
115
+ // what keeps fixture DIRECTORIES included: `harness-runtime/fixtures/` is cited by a shipped
116
+ // reference document as its machine-readable schema summary, so it is genuine payload and its name
117
+ // (`fixtures`, no extension) cannot match.
118
+ const TEST_FIXTURE = /\.fixtures?\.[^.]+$/;
119
+
120
+ // What a first-party member's PUBLISHED content is NOT. This is the packaging rule — the same
121
+ // predicate `skills/distribution/scripts/package-build.mjs` stages the public package with, imported
122
+ // from here so the two cannot drift. A file the package does not carry must not enter a first-party
123
+ // member's digest: otherwise one release digests differently on its two render targets, and the
124
+ // checkout digest committed into workflow.json condemns every correct npm installation as modified.
125
+ // Deliberately NOT a way to hide runtime content — everything the release ships is still digested.
126
+ //
127
+ // The clauses, and why each is here rather than only in one of the two callers:
128
+ //
129
+ // `.`-prefixed — `.git`, `.DS_Store` and any local tooling dotfile.
130
+ // node_modules — installed dependencies, never authored payload.
131
+ // `*-workspace` — this repository's gitignored eval fixture convention.
132
+ // `*.test.mjs` — tests are not runtime payload.
133
+ // TEST_FIXTURE — dropping the test while keeping the recording it replays publishes a test
134
+ // artifact, which the distribution boundary excludes on its own terms and which in
135
+ // practice carries material a public tarball must not: the Mergify comment fixture
136
+ // is a verbatim capture of a private-repository pull request, private repository
137
+ // name included, and it was staged into the tarball for exactly as long as the two
138
+ // rules disagreed (#995).
139
+ //
140
+ // Accepted consequence, stated rather than implied (#999): under a private-checkout install, a
141
+ // modified `*.test.mjs` — or a modified recorded fixture — inside an installed member is no longer
142
+ // detected by coherence, and neither reaches the public channel at all. Tests are not runtime and
143
+ // `walkRuntimeModules` (distribution.mjs) skips them by name. The recorded fixtures in this tree are
144
+ // all `*.fixture.json`, which that walk skips only because it collects `.mjs` alone — so a
145
+ // `*.fixture.mjs` would be the one shape where the release scope and the dependency-closure walk
146
+ // disagree, with the closure reaching a module the package does not ship. None exists; this note is
147
+ // here so that the first one is a decision rather than a discovery.
148
+ export function publishedContentExcluded(name) {
149
+ return name.startsWith('.')
150
+ || name === 'node_modules'
151
+ || name.endsWith('-workspace')
152
+ || name.endsWith('.test.mjs')
153
+ || TEST_FIXTURE.test(name);
154
+ }
155
+
156
+ // Whether a member's expected source identity is the first-party release — the ONE place that
157
+ // question is answered, for the generator that computes a digest and the validator that checks it.
158
+ //
159
+ // It exists because the two ends used to read different fields of the same object: the generator
160
+ // tested `expectedSource.id`, the runtime digest scope tested `expectedSource.type`. Those agree
161
+ // today only because the manifest's first-party source happens to be NAMED `first-party`. Rename
162
+ // that source id and the generator would digest the whole checkout tree while the validator digested
163
+ // published content only, so every first-party member of a correct installation would report as
164
+ // modified — on both transports, which is the exact failure the published scope exists to prevent.
165
+ // `type` is the field carrying the meaning (`expectedSourceIdentity` branches on `source.type`, and
166
+ // `first-party`/`external` is the source TAXONOMY); `id` is a name and may change.
167
+ export function firstPartySource(expectedSource) {
168
+ return expectedSource?.type === 'first-party';
169
+ }
170
+
171
+ function collectFiles(baseDir, currentDir, excludedPaths, files, published) {
172
+ for (const entry of readdirSync(currentDir, { withFileTypes: true })) {
173
+ if (DIGEST_SKIP_NAMES.has(entry.name) || entry.name.endsWith('-workspace')) continue;
174
+ if (published && publishedContentExcluded(entry.name)) continue;
175
+ const path = join(currentDir, entry.name);
176
+ const relativePath = relative(baseDir, path).replaceAll('\\', '/');
177
+ if (excludedPaths.has(relativePath)) continue;
178
+ if (entry.isDirectory()) collectFiles(baseDir, path, excludedPaths, files, published);
179
+ else if (entry.isFile()) files.push({ path, relativePath });
180
+ else throw new Error(`Unsupported member content entry: ${relativePath}`);
181
+ }
182
+ }
183
+
184
+ /**
185
+ * @param {object} [options]
186
+ * @param {string[]} [options.exclude] member-relative paths to omit
187
+ * @param {object[]} [options.injected] generated content to digest instead of reading from disk
188
+ * @param {boolean} [options.published] digest the member's published content — the file set the
189
+ * release ships — rather than its exact tree. Set for first-party members, whose authority is the
190
+ * published release; left off for external members, whose authority is the reviewed upstream tree
191
+ * byte for byte. See {@link publishedContentExcluded}.
192
+ */
193
+ export function contentDigest(directory, { exclude = [], injected = [], published = false } = {}) {
194
+ const files = [];
195
+ const excluded = new Set(exclude);
196
+ for (const file of injected) excluded.add(file.relativePath);
197
+ collectFiles(directory, directory, excluded, files, published);
198
+ for (const file of injected) files.push({ relativePath: file.relativePath, contents: file.contents });
199
+ files.sort((left, right) => left.relativePath.localeCompare(right.relativePath));
200
+ const hash = createHash('sha256');
201
+ for (const file of files) {
202
+ hash.update(file.relativePath);
203
+ hash.update(file.contents ?? readFileSync(file.path));
204
+ }
205
+ return hash.digest('hex');
206
+ }
207
+
208
+ export function workflowReleaseIdentity(releaseData) {
209
+ return createHash('sha256').update(JSON.stringify(releaseData)).digest('hex');
210
+ }
211
+
212
+ function validRelativePath(path) {
213
+ return typeof path === 'string'
214
+ && path.length > 0
215
+ && !isAbsolute(path)
216
+ && !path.split('/').includes('..')
217
+ && normalize(path).replaceAll('\\', '/') === path;
218
+ }
219
+
220
+ function releaseData(manifest) {
221
+ return {
222
+ schemaVersion: manifest.schemaVersion,
223
+ groupId: manifest.groupId,
224
+ ownedMembers: manifest.ownedMembers,
225
+ dependencies: manifest.dependencies,
226
+ dependencyClosures: manifest.dependencyClosures,
227
+ digestAlgorithm: manifest.digestAlgorithm,
228
+ members: manifest.members,
229
+ };
230
+ }
231
+
232
+ function repairRecipeReference() {
233
+ return REPAIR_RECIPE_REFERENCE;
234
+ }
235
+
236
+ function finding({ state, code, member, ownership, expectedSource, manifest, expectedDigest, actualDigest, detail }) {
237
+ return {
238
+ state,
239
+ code,
240
+ member,
241
+ ownership,
242
+ expectedSource,
243
+ ...(expectedDigest ? { expectedDigest } : {}),
244
+ ...(actualDigest ? { actualDigest } : {}),
245
+ detail,
246
+ repairRecipe: repairRecipeReference(manifest),
247
+ };
248
+ }
249
+
250
+ function exactContract(actual, expected) {
251
+ return isDeepStrictEqual(actual, expected);
252
+ }
253
+
254
+ function validateManifest(manifest) {
255
+ const findings = [];
256
+ const memberByName = new Map(Array.isArray(manifest?.members)
257
+ ? manifest.members.map((member) => [member?.installName, member])
258
+ : []);
259
+ const add = (code, memberName, detail) => {
260
+ const expectedMember = TRUSTED_MEMBER_BY_NAME.get(memberName);
261
+ const ownership = expectedMember?.ownership
262
+ ?? (WORKFLOW_OWNED_MEMBERS.includes(memberName) ? 'owned' : 'dependency');
263
+ findings.push(finding({
264
+ state: 'missing-manifest',
265
+ code,
266
+ member: memberName,
267
+ ownership,
268
+ expectedSource: expectedMember?.expectedSource ?? FALLBACK_SOURCE,
269
+ manifest,
270
+ detail,
271
+ }));
272
+ };
273
+
274
+ if (!manifest || manifest.schemaVersion !== 1 || manifest.groupId !== 'engineering-workflow') {
275
+ add('manifest-identity-invalid', 'engineering-runtime', 'The coherence schema or group identity is missing or malformed.');
276
+ return findings;
277
+ }
278
+ if (manifest.lifecycleAuthority !== 'native-skills-cli') {
279
+ add('lifecycle-authority-invalid', 'engineering-runtime', 'The coherence data must point to the native Skills CLI lifecycle authority.');
280
+ }
281
+ if (manifest.digestAlgorithm !== WORKFLOW_DIGEST_ALGORITHM) {
282
+ add('digest-algorithm-invalid', 'engineering-runtime', 'The coherence digest algorithm is missing or unsupported.');
283
+ }
284
+ if (JSON.stringify(manifest.ownedMembers) !== JSON.stringify(WORKFLOW_OWNED_MEMBERS)) {
285
+ add('owned-census-invalid', 'engineering-runtime', 'The exact eight-member Workflow ownership census is missing or malformed.');
286
+ }
287
+ if (JSON.stringify(manifest.dependencies) !== JSON.stringify([
288
+ { groupId: 'matt-pocock-toolkit', members: MATT_DEPENDENCY_MEMBERS },
289
+ { groupId: 'harness-runtime', members: HARNESS_RUNTIME_DEPENDENCY_MEMBERS },
290
+ ])) {
291
+ add('dependency-census-invalid', 'engineering-runtime', 'The exact Matt and harness runtime dependency census is missing or malformed.');
292
+ }
293
+ if (!exactContract(manifest.dependencyClosures, WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES)) {
294
+ const names = new Set(Array.isArray(manifest.dependencyClosures)
295
+ ? manifest.dependencyClosures.map((closure) => closure?.invokedSkill)
296
+ : []);
297
+ const member = WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES.find((closure) => !names.has(closure.invokedSkill))?.invokedSkill
298
+ ?? 'resolve-issues';
299
+ add('dependency-closure-invalid', member, 'The invoked-skill dependency closure is missing, weakened, reordered or malformed.');
300
+ }
301
+
302
+ const expectedOrder = [
303
+ ...MATT_DEPENDENCY_MEMBERS,
304
+ ...HARNESS_RUNTIME_DEPENDENCY_MEMBERS,
305
+ ...WORKFLOW_OWNED_MEMBERS,
306
+ ];
307
+ if (!Array.isArray(manifest.members)
308
+ || JSON.stringify(manifest.members.map((member) => member?.installName)) !== JSON.stringify(expectedOrder)) {
309
+ add('member-census-invalid', 'engineering-runtime', 'The dependency-first member records are missing, reordered or malformed.');
310
+ } else {
311
+ for (const memberName of expectedOrder) {
312
+ const member = memberByName.get(memberName);
313
+ const expectedMember = TRUSTED_MEMBER_BY_NAME.get(memberName);
314
+ const firstParty = firstPartySource(expectedMember.expectedSource);
315
+ if (member.ownership !== expectedMember.ownership) {
316
+ add('member-ownership-invalid', memberName, 'The member ownership identity is missing or malformed.');
317
+ }
318
+ if (!validRelativePath(member.sourcePath) || member.sourcePath !== expectedMember.sourcePath) {
319
+ add('member-source-path-invalid', memberName, 'The expected source-relative member path is missing or malformed.');
320
+ }
321
+ if (!DIGEST.test(member.contentDigest ?? '')) {
322
+ add('member-digest-invalid', memberName, 'The expected member content digest is missing or malformed.');
323
+ }
324
+ if (!exactContract(member.expectedSource, expectedMember.expectedSource)) {
325
+ add('member-source-identity-invalid', memberName, 'The expected member source identity is missing or malformed.');
326
+ }
327
+ const expectedExcludes = firstParty && memberName === 'engineering-runtime'
328
+ ? ['coherence/workflow.json']
329
+ : [];
330
+ if (Object.hasOwn(member, 'releaseMarker')
331
+ || JSON.stringify(member.digestExcludes) !== JSON.stringify(expectedExcludes)) {
332
+ add('member-digest-contract-invalid', memberName, 'The member digest exclusion contract is missing or malformed.');
333
+ }
334
+ }
335
+ }
336
+
337
+ if (!exactContract(manifest.repairRecipe, WORKFLOW_TRUSTED_REPAIR_RECIPE)) {
338
+ add('repair-recipe-invalid', 'engineering-runtime', 'The generated dependency-first repair recipe is missing or malformed.');
339
+ }
340
+ if (!DIGEST.test(manifest.releaseIdentity ?? '')
341
+ || workflowReleaseIdentity(releaseData(manifest)) !== manifest.releaseIdentity) {
342
+ add('release-identity-invalid', 'engineering-runtime', 'The release identity is missing, malformed or inconsistent with member data.');
343
+ }
344
+ return findings;
345
+ }
346
+
347
+ function memberDirectory(member, options) {
348
+ if (options.layout === 'installed') return join(options.skillsRoot, member.installName);
349
+ const sourceRoot = options.sourceRoots?.[member.expectedSource.id];
350
+ return sourceRoot ? join(sourceRoot, member.sourcePath) : null;
351
+ }
352
+
353
+ function missingManifestResult(layout, code, detail, invokedSkills) {
354
+ return {
355
+ schemaVersion: 1,
356
+ groupId: 'engineering-workflow',
357
+ layout,
358
+ releaseIdentity: null,
359
+ ...(Array.isArray(invokedSkills) ? { scope: { invokedSkills: [...invokedSkills], members: [], generatedIdentities: [] } } : {}),
360
+ coherent: false,
361
+ findings: [finding({
362
+ state: 'missing-manifest',
363
+ code,
364
+ member: 'engineering-runtime',
365
+ ownership: 'owned',
366
+ expectedSource: FALLBACK_SOURCE,
367
+ detail,
368
+ })],
369
+ repairRecipe: WORKFLOW_TRUSTED_REPAIR_RECIPE,
370
+ };
371
+ }
372
+
373
+ export function verifyWorkflowCoherence(options = {}) {
374
+ const layout = options.layout ?? 'installed';
375
+ if (!['installed', 'source'].includes(layout)) {
376
+ return missingManifestResult(layout, 'layout-invalid', 'The requested installation layout is unsupported.', options.invokedSkills);
377
+ }
378
+ const manifestPath = options.manifestPath ?? (layout === 'installed'
379
+ ? join(options.skillsRoot ?? '', 'engineering-runtime', 'coherence', 'workflow.json')
380
+ : join(options.sourceRoots?.['first-party'] ?? '', WORKFLOW_COHERENCE_PATH));
381
+ if (!manifestPath || !existsSync(manifestPath)) {
382
+ return missingManifestResult(layout, 'manifest-missing', 'The Workflow coherence manifest is missing.', options.invokedSkills);
383
+ }
384
+
385
+ let manifest;
386
+ try {
387
+ manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
388
+ } catch {
389
+ return missingManifestResult(layout, 'manifest-malformed', 'The Workflow coherence manifest is not valid JSON.', options.invokedSkills);
390
+ }
391
+ const manifestFindings = validateManifest(manifest);
392
+ if (manifestFindings.length > 0) {
393
+ return {
394
+ schemaVersion: 1,
395
+ groupId: 'engineering-workflow',
396
+ layout,
397
+ releaseIdentity: DIGEST.test(manifest.releaseIdentity ?? '') ? manifest.releaseIdentity : null,
398
+ ...(Array.isArray(options.invokedSkills) ? { scope: { invokedSkills: [...options.invokedSkills], members: [], generatedIdentities: [] } } : {}),
399
+ coherent: false,
400
+ findings: manifestFindings,
401
+ repairRecipe: manifestFindings.some((candidate) => candidate.code === 'repair-recipe-invalid')
402
+ ? WORKFLOW_TRUSTED_REPAIR_RECIPE
403
+ : manifest.repairRecipe,
404
+ };
405
+ }
406
+
407
+ const findings = [];
408
+ const requested = options.invokedSkills;
409
+ const invokedSkills = requested === undefined ? [] : requested;
410
+ const closureBySkill = new Map(manifest.dependencyClosures.map((closure) => [closure.invokedSkill, closure]));
411
+ const selectedNames = new Set();
412
+ const selectedGenerated = new Map();
413
+ if (!Array.isArray(invokedSkills) || invokedSkills.length === 0 && requested !== undefined
414
+ || invokedSkills.some((skill) => typeof skill !== 'string' || !skill.trim())
415
+ || new Set(invokedSkills).size !== invokedSkills.length) {
416
+ findings.push(finding({
417
+ state: 'missing-manifest', code: 'invoked-skill-invalid', member: 'engineering-runtime', ownership: 'owned',
418
+ expectedSource: FALLBACK_SOURCE, manifest,
419
+ detail: 'invokedSkills must be a non-empty array of unique installed skill names when scoped verification is requested.',
420
+ }));
421
+ } else if (requested === undefined) {
422
+ for (const member of manifest.members) selectedNames.add(member.installName);
423
+ for (const closure of manifest.dependencyClosures) {
424
+ for (const identity of closure.generatedIdentities) selectedGenerated.set(`${identity.member}:${identity.path}`, identity);
425
+ }
426
+ } else {
427
+ for (const invokedSkill of invokedSkills) {
428
+ const closure = closureBySkill.get(invokedSkill);
429
+ if (!closure) {
430
+ const expected = TRUSTED_MEMBER_BY_NAME.get(invokedSkill);
431
+ findings.push(finding({
432
+ state: 'missing-manifest', code: 'invoked-skill-unknown', member: invokedSkill,
433
+ ownership: expected?.ownership ?? 'owned', expectedSource: expected?.expectedSource ?? FALLBACK_SOURCE,
434
+ manifest, detail: `No trusted dependency closure exists for invoked skill ${JSON.stringify(invokedSkill)}.`,
435
+ }));
436
+ continue;
437
+ }
438
+ for (const memberName of closure.members) selectedNames.add(memberName);
439
+ for (const identity of closure.generatedIdentities) selectedGenerated.set(`${identity.member}:${identity.path}`, identity);
440
+ }
441
+ }
442
+
443
+ const selectedMembers = manifest.members.filter((member) => selectedNames.has(member.installName));
444
+ for (const member of selectedMembers) {
445
+ const directory = memberDirectory(member, { ...options, layout });
446
+ if (!directory || !existsSync(directory)) {
447
+ findings.push(finding({
448
+ state: 'missing',
449
+ code: 'member-missing',
450
+ member: member.installName,
451
+ ownership: member.ownership,
452
+ expectedSource: member.expectedSource,
453
+ expectedDigest: member.contentDigest,
454
+ manifest,
455
+ detail: 'The expected member directory is missing.',
456
+ }));
457
+ continue;
458
+ }
459
+
460
+ let actualDigest;
461
+ try {
462
+ // First-party members are digested over the release's file set on BOTH transports (ADR 0004
463
+ // decision 4), so a correct npm installation is not reported as modified. The scope is derived
464
+ // from the member's declared source rather than carried as a second field, so there is no way
465
+ // for a member to claim a scope its source does not have — and `validateManifest` has already
466
+ // proved `expectedSource` deep-equal to the trusted policy above (`member-source-identity-
467
+ // invalid` returns before this loop), so the derivation reads trusted data, not manifest claims.
468
+ actualDigest = contentDigest(directory, {
469
+ exclude: member.digestExcludes,
470
+ published: firstPartySource(member.expectedSource),
471
+ });
472
+ } catch (error) {
473
+ findings.push(finding({
474
+ state: 'modified',
475
+ code: 'member-content-unreadable',
476
+ member: member.installName,
477
+ ownership: member.ownership,
478
+ expectedSource: member.expectedSource,
479
+ expectedDigest: member.contentDigest,
480
+ manifest,
481
+ detail: error.message,
482
+ }));
483
+ continue;
484
+ }
485
+ if (actualDigest !== member.contentDigest) {
486
+ findings.push(finding({
487
+ state: 'modified',
488
+ code: 'member-content-modified',
489
+ member: member.installName,
490
+ ownership: member.ownership,
491
+ expectedSource: member.expectedSource,
492
+ expectedDigest: member.contentDigest,
493
+ actualDigest,
494
+ manifest,
495
+ detail: 'The installed member content does not match its deterministic digest.',
496
+ }));
497
+ }
498
+ }
499
+
500
+ const generatedIdentities = [];
501
+ const memberByName = new Map(manifest.members.map((member) => [member.installName, member]));
502
+ for (const identity of selectedGenerated.values()) {
503
+ const member = memberByName.get(identity.member);
504
+ const directory = member ? memberDirectory(member, { ...options, layout }) : null;
505
+ const generatedPath = directory ? join(directory, identity.path) : null;
506
+ let actualDigest = null;
507
+ if (generatedPath && existsSync(generatedPath)) {
508
+ try { actualDigest = createHash('sha256').update(readFileSync(generatedPath)).digest('hex'); } catch {}
509
+ }
510
+ generatedIdentities.push({ ...identity, digestAlgorithm: 'sha256', actualDigest });
511
+ if (actualDigest === null) {
512
+ findings.push(finding({
513
+ state: 'missing', code: 'generated-identity-missing', member: identity.member,
514
+ ownership: member?.ownership ?? 'owned', expectedSource: member?.expectedSource ?? FALLBACK_SOURCE,
515
+ manifest, detail: `Generated identity ${identity.path} is missing or unreadable.`,
516
+ }));
517
+ }
518
+ }
519
+
520
+ return {
521
+ schemaVersion: 1,
522
+ groupId: manifest.groupId,
523
+ layout,
524
+ releaseIdentity: manifest.releaseIdentity,
525
+ scope: {
526
+ invokedSkills: [...invokedSkills],
527
+ members: selectedMembers.map((member) => member.installName),
528
+ generatedIdentities,
529
+ },
530
+ coherent: findings.length === 0,
531
+ findings,
532
+ repairRecipe: manifest.repairRecipe,
533
+ };
534
+ }
535
+
536
+ export function runWorkflowCoherenceCli(args) {
537
+ if (args[0] !== 'verify') {
538
+ process.stderr.write(
539
+ 'Usage: workflow-coherence.mjs verify --layout installed --skills-root <path> [--manifest <path>] [--invoked-skill <name>]...\n'
540
+ + ' or: workflow-coherence.mjs verify --layout source --source-root <id=path>... [--manifest <path>] [--invoked-skill <name>]...\n',
541
+ );
542
+ return 2;
543
+ }
544
+
545
+ const options = { sourceRoots: {} };
546
+ for (let index = 1; index < args.length; index += 1) {
547
+ const argument = args[index];
548
+ const value = args[index + 1];
549
+ if (argument === '--layout' || argument === '--skills-root' || argument === '--manifest') {
550
+ if (!value) return 2;
551
+ const key = argument === '--layout' ? 'layout' : argument === '--skills-root' ? 'skillsRoot' : 'manifestPath';
552
+ options[key] = value;
553
+ index += 1;
554
+ } else if (argument === '--source-root') {
555
+ const separator = value?.indexOf('=') ?? -1;
556
+ if (separator < 1 || separator === value.length - 1) return 2;
557
+ options.sourceRoots[value.slice(0, separator)] = value.slice(separator + 1);
558
+ index += 1;
559
+ } else if (argument === '--invoked-skill') {
560
+ if (!value) return 2;
561
+ if (!options.invokedSkills) options.invokedSkills = [];
562
+ options.invokedSkills.push(value);
563
+ index += 1;
564
+ } else {
565
+ return 2;
566
+ }
567
+ }
568
+
569
+ const result = verifyWorkflowCoherence(options);
570
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
571
+ return result.coherent ? 0 : 1;
572
+ }
573
+
574
+ if (isMainModule(import.meta.url)) {
575
+ process.exitCode = runWorkflowCoherenceCli(process.argv.slice(2));
576
+ }