@kontourai/flow-agents 0.1.1

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 (418) hide show
  1. package/.githooks/pre-push +11 -0
  2. package/.github/workflows/ci.yml +210 -0
  3. package/.github/workflows/docs-pages.yml +52 -0
  4. package/.github/workflows/publish-npm.yml +104 -0
  5. package/AGENTS.md +26 -0
  6. package/CHANGELOG.md +66 -0
  7. package/CODE_OF_CONDUCT.md +25 -0
  8. package/CONTEXT.md +300 -0
  9. package/CONTRIBUTING.md +44 -0
  10. package/LICENSE +201 -0
  11. package/README.md +129 -0
  12. package/SECURITY.md +33 -0
  13. package/agent-cards/dev.json +19 -0
  14. package/agents/dev.json +127 -0
  15. package/agents/tool-code-reviewer.json +61 -0
  16. package/agents/tool-dependencies-updater.json +118 -0
  17. package/agents/tool-explore-config.json +92 -0
  18. package/agents/tool-explore-deps.json +92 -0
  19. package/agents/tool-explore-entry.json +92 -0
  20. package/agents/tool-explore-patterns.json +92 -0
  21. package/agents/tool-explore-structure.json +92 -0
  22. package/agents/tool-explore-tests.json +92 -0
  23. package/agents/tool-planner.json +57 -0
  24. package/agents/tool-playwright.json +145 -0
  25. package/agents/tool-security-reviewer.json +56 -0
  26. package/agents/tool-verifier.json +61 -0
  27. package/agents/tool-worker.json +58 -0
  28. package/build/src/cli/console-learning-projection.js +123 -0
  29. package/build/src/cli/docs-preview.js +39 -0
  30. package/build/src/cli/effective-backlog-settings.js +102 -0
  31. package/build/src/cli/export-bookmarks.js +38 -0
  32. package/build/src/cli/fixture-retirement-audit.js +140 -0
  33. package/build/src/cli/flow-kit.js +138 -0
  34. package/build/src/cli/import-bookmarks.js +50 -0
  35. package/build/src/cli/init.js +239 -0
  36. package/build/src/cli/instinct-cli.js +93 -0
  37. package/build/src/cli/promote-workflow-artifact.js +63 -0
  38. package/build/src/cli/publish-change-helper.js +154 -0
  39. package/build/src/cli/pull-work-provider.js +469 -0
  40. package/build/src/cli/runtime-adapter.js +23 -0
  41. package/build/src/cli/telemetry-doctor.js +221 -0
  42. package/build/src/cli/usage-feedback.js +443 -0
  43. package/build/src/cli/validate-hook-influence.js +152 -0
  44. package/build/src/cli/validate-source-tree.js +31 -0
  45. package/build/src/cli/validate-workflow-artifacts.js +486 -0
  46. package/build/src/cli/veritas-governance.js +262 -0
  47. package/build/src/cli/workflow-artifact-cleanup-audit.js +272 -0
  48. package/build/src/cli/workflow-sidecar.js +816 -0
  49. package/build/src/cli.js +89 -0
  50. package/build/src/flow-kit/validate.js +75 -0
  51. package/build/src/lib/args.js +45 -0
  52. package/build/src/lib/fs.js +62 -0
  53. package/build/src/lib/workflow-learning-projection.js +334 -0
  54. package/build/src/runtime-adapters.js +146 -0
  55. package/build/src/tools/build-universal-bundles.js +397 -0
  56. package/build/src/tools/common.js +56 -0
  57. package/build/src/tools/filter-installed-packs.js +132 -0
  58. package/build/src/tools/generate-context-map.js +198 -0
  59. package/build/src/tools/validate-package.js +64 -0
  60. package/build/src/tools/validate-source-tree.js +622 -0
  61. package/console.telemetry.json +176 -0
  62. package/context/base-rules.md +17 -0
  63. package/context/code-review-standards.md +62 -0
  64. package/context/coding-standards.md +42 -0
  65. package/context/common/orchestrators.md +12 -0
  66. package/context/common/subagents.md +28 -0
  67. package/context/contracts/artifact-contract.md +182 -0
  68. package/context/contracts/builder-kit-workflow-state-contract.md +319 -0
  69. package/context/contracts/delivery-contract.md +69 -0
  70. package/context/contracts/execution-contract.md +53 -0
  71. package/context/contracts/governance-adapter-contract.md +67 -0
  72. package/context/contracts/planning-contract.md +85 -0
  73. package/context/contracts/review-contract.md +104 -0
  74. package/context/contracts/sandbox-policy.md +52 -0
  75. package/context/contracts/verification-contract.md +134 -0
  76. package/context/contracts/work-item-contract.md +215 -0
  77. package/context/deferred/demo-mode.md +33 -0
  78. package/context/deferred/languages/go.md +31 -0
  79. package/context/deferred/languages/python.md +31 -0
  80. package/context/deferred/languages/typescript.md +34 -0
  81. package/context/deferred/parallelization.md +35 -0
  82. package/context/deferred/worktree-isolation.md +24 -0
  83. package/context/development-workflow.md +50 -0
  84. package/context/scripts/context-budget/budget-scan.sh +166 -0
  85. package/context/scripts/detect-tools.sh +3 -0
  86. package/context/scripts/discover-agents.sh +28 -0
  87. package/context/scripts/git-status.sh +49 -0
  88. package/context/scripts/hooks/config-protection.js +79 -0
  89. package/context/scripts/hooks/desktop-notify.sh +39 -0
  90. package/context/scripts/hooks/governance-audit.sh +135 -0
  91. package/context/scripts/hooks/lib/audit-transport.sh +40 -0
  92. package/context/scripts/hooks/lib/hook-flags.js +49 -0
  93. package/context/scripts/hooks/lib/patterns.sh +57 -0
  94. package/context/scripts/hooks/lib/resolve-formatter.js +80 -0
  95. package/context/scripts/hooks/post-edit-accumulator.js +66 -0
  96. package/context/scripts/hooks/pre-commit-quality.js +194 -0
  97. package/context/scripts/hooks/quality-gate.js +93 -0
  98. package/context/scripts/hooks/report-only-guard.js +21 -0
  99. package/context/scripts/hooks/run-hook.js +136 -0
  100. package/context/scripts/hooks/stop-format-typecheck.js +141 -0
  101. package/context/scripts/hooks/stop-goal-fit.js +337 -0
  102. package/context/scripts/hooks/workflow-steering.js +250 -0
  103. package/context/scripts/telemetry/console-presets.sh +14 -0
  104. package/context/scripts/telemetry/install-console-config.sh +214 -0
  105. package/context/scripts/telemetry/lib/config.sh +85 -0
  106. package/context/scripts/telemetry/lib/enrich.sh +115 -0
  107. package/context/scripts/telemetry/lib/redact.sh +22 -0
  108. package/context/scripts/telemetry/lib/session.sh +63 -0
  109. package/context/scripts/telemetry/lib/transport.sh +183 -0
  110. package/context/scripts/telemetry/lib/usage.sh +29 -0
  111. package/context/scripts/telemetry/sync-agents.sh +173 -0
  112. package/context/scripts/telemetry/telemetry.conf +23 -0
  113. package/context/scripts/telemetry/telemetry.sh +387 -0
  114. package/context/scripts/validate-package.sh +89 -0
  115. package/context/settings/backlog-provider-settings.json +54 -0
  116. package/context/templates/core/identity.md +26 -0
  117. package/context/templates/core/user.md +15 -0
  118. package/docs/_config.yml +15 -0
  119. package/docs/_layouts/default.html +87 -0
  120. package/docs/adr/0001-flow-agents-consumes-flow.md +77 -0
  121. package/docs/adr/0002-flow-kits-as-extension-unit.md +13 -0
  122. package/docs/adr/0003-flow-agents-coordinates-kits-and-adapters.md +13 -0
  123. package/docs/adr/0004-gates-expect-surface-claims.md +15 -0
  124. package/docs/adr/0005-kubernetes-inspired-resource-contracts.md +48 -0
  125. package/docs/adr/0006-typescript-first-source-policy.md +98 -0
  126. package/docs/agent-system-guidebook.md +391 -0
  127. package/docs/agent-usage-feedback-loop.md +351 -0
  128. package/docs/assets/favicon.svg +13 -0
  129. package/docs/assets/og-image.png +0 -0
  130. package/docs/assets/site.css +774 -0
  131. package/docs/assets/site.js +139 -0
  132. package/docs/configurable-workflow-routing.md +174 -0
  133. package/docs/context-map.md +145 -0
  134. package/docs/developer-architecture.md +145 -0
  135. package/docs/developer-hook-setup.md +61 -0
  136. package/docs/fixture-ownership.md +44 -0
  137. package/docs/flow-kit-repository-contract.md +180 -0
  138. package/docs/index.md +129 -0
  139. package/docs/kontour-resource-contract.md +358 -0
  140. package/docs/migrations.md +64 -0
  141. package/docs/north-star.md +322 -0
  142. package/docs/operating-layers.md +110 -0
  143. package/docs/repository-structure.md +132 -0
  144. package/docs/sandbox-policy.md +56 -0
  145. package/docs/skills-map.md +203 -0
  146. package/docs/standards-register.md +96 -0
  147. package/docs/veritas-integration.md +165 -0
  148. package/docs/work-item-adapters.md +72 -0
  149. package/docs/workflow-artifact-lifecycle.md +141 -0
  150. package/docs/workflow-eval-strategy.md +295 -0
  151. package/docs/workflow-shared-contracts.md +51 -0
  152. package/docs/workflow-usage-guide.md +443 -0
  153. package/evals/ARCHITECTURE.md +143 -0
  154. package/evals/CONVENTIONS.md +58 -0
  155. package/evals/README.md +128 -0
  156. package/evals/acceptance/run.sh +29 -0
  157. package/evals/acceptance/test_claude_harness.sh +242 -0
  158. package/evals/acceptance/test_codex_harness.sh +108 -0
  159. package/evals/acceptance/test_kiro_harness.sh +128 -0
  160. package/evals/cases/dev/404.html +97 -0
  161. package/evals/cases/dev/code-review.yaml +44 -0
  162. package/evals/cases/dev/dashboard.html +300 -0
  163. package/evals/cases/dev/deliver.yaml +66 -0
  164. package/evals/cases/dev/dependency-update.yaml +16 -0
  165. package/evals/cases/dev/explore.yaml +20 -0
  166. package/evals/cases/dev/index.html +370 -0
  167. package/evals/cases/dev/package-lock.json +28 -0
  168. package/evals/cases/dev/package.json +16 -0
  169. package/evals/cases/dev/plan-work.yaml +20 -0
  170. package/evals/cases/dev/promptfooconfig.yaml +666 -0
  171. package/evals/cases/dev/search-first.yaml +20 -0
  172. package/evals/cases/dev/tdd-workflow.yaml +48 -0
  173. package/evals/cases/dev/verify-work.yaml +44 -0
  174. package/evals/cases/dev/workflow.yaml +34 -0
  175. package/evals/ci/run-baseline.sh +283 -0
  176. package/evals/fixtures/backlog-provider-settings/global-default.json +44 -0
  177. package/evals/fixtures/backlog-provider-settings/project-override.json +53 -0
  178. package/evals/fixtures/builder-kit-workflow-state/baseline-freshness-resolution-hint.json +139 -0
  179. package/evals/fixtures/builder-kit-workflow-state/direct-primitive-stop.json +59 -0
  180. package/evals/fixtures/builder-kit-workflow-state/empty-board-route-shape.json +55 -0
  181. package/evals/fixtures/builder-kit-workflow-state/happy-path.json +71 -0
  182. package/evals/fixtures/builder-kit-workflow-state/mid-work-resume.json +80 -0
  183. package/evals/fixtures/builder-kit-workflow-state/missing-prestep-recovery.json +65 -0
  184. package/evals/fixtures/builder-kit-workflow-state/product-build-chaining.json +60 -0
  185. package/evals/fixtures/builder-kit-workflow-state/stale-continuation-requires-new-probe.json +57 -0
  186. package/evals/fixtures/console-learning-projection/artifacts/console-learning-correction/learning.json +50 -0
  187. package/evals/fixtures/console-learning-projection/artifacts/console-learning-open-route/learning.json +41 -0
  188. package/evals/fixtures/flow-kit-repository/invalid-absolute-path/kit.json +8 -0
  189. package/evals/fixtures/flow-kit-repository/invalid-asset-section/flows/review.flow.json +6 -0
  190. package/evals/fixtures/flow-kit-repository/invalid-asset-section/kit.json +11 -0
  191. package/evals/fixtures/flow-kit-repository/invalid-duplicate-flow/flows/review.flow.json +6 -0
  192. package/evals/fixtures/flow-kit-repository/invalid-duplicate-flow/kit.json +9 -0
  193. package/evals/fixtures/flow-kit-repository/invalid-id/flows/review.flow.json +6 -0
  194. package/evals/fixtures/flow-kit-repository/invalid-id/kit.json +8 -0
  195. package/evals/fixtures/flow-kit-repository/invalid-malformed-json/kit.json +8 -0
  196. package/evals/fixtures/flow-kit-repository/invalid-missing-flow/kit.json +8 -0
  197. package/evals/fixtures/flow-kit-repository/invalid-missing-id/flows/review.flow.json +6 -0
  198. package/evals/fixtures/flow-kit-repository/invalid-missing-id/kit.json +7 -0
  199. package/evals/fixtures/flow-kit-repository/invalid-missing-schema-version/flows/review.flow.json +6 -0
  200. package/evals/fixtures/flow-kit-repository/invalid-missing-schema-version/kit.json +7 -0
  201. package/evals/fixtures/flow-kit-repository/invalid-name/flows/review.flow.json +6 -0
  202. package/evals/fixtures/flow-kit-repository/invalid-name/kit.json +8 -0
  203. package/evals/fixtures/flow-kit-repository/invalid-schema-version/flows/review.flow.json +6 -0
  204. package/evals/fixtures/flow-kit-repository/invalid-schema-version/kit.json +8 -0
  205. package/evals/fixtures/flow-kit-repository/invalid-traversal/kit.json +8 -0
  206. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/adapters/example.json +3 -0
  207. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/assets/example.txt +1 -0
  208. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/docs/README.md +3 -0
  209. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/flows/runtime.flow.json +26 -0
  210. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit-evals/example.json +3 -0
  211. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit-skills/mixed/SKILL.md +3 -0
  212. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit.json +44 -0
  213. package/evals/fixtures/flow-kit-repository/valid-local-kit/docs/README.md +3 -0
  214. package/evals/fixtures/flow-kit-repository/valid-local-kit/flows/review.flow.json +26 -0
  215. package/evals/fixtures/flow-kit-repository/valid-local-kit/kit.json +20 -0
  216. package/evals/fixtures/hook-influence/cases.json +336 -0
  217. package/evals/fixtures/pull-work-provider/github-issues.json +170 -0
  218. package/evals/fixtures/pull-work-wip-shepherding/global-wip-informs.json +43 -0
  219. package/evals/fixtures/pull-work-wip-shepherding/personal-wip-blocks.json +42 -0
  220. package/evals/fixtures/surface-trust/accepted-claim-trust-report.json +31 -0
  221. package/evals/fixtures/surface-trust/artifact-absent.json +19 -0
  222. package/evals/fixtures/surface-trust/integrity-mismatch-trust-report.json +32 -0
  223. package/evals/fixtures/surface-trust/missing-authority-trust-report.json +27 -0
  224. package/evals/fixtures/surface-trust/provider-absent.json +19 -0
  225. package/evals/fixtures/surface-trust/rejected-claim-trust-report.json +30 -0
  226. package/evals/fixtures/surface-trust/stale-claim-trust-snapshot.json +31 -0
  227. package/evals/fixtures/usage-feedback/sample-full.jsonl +11 -0
  228. package/evals/fixtures/usage-feedback/sample-outcomes.jsonl +1 -0
  229. package/evals/fixtures/veritas-governance-adapter/fake-veritas-pass.sh +18 -0
  230. package/evals/fixtures/veritas-governance-adapter/fake-veritas-secret-fail.sh +10 -0
  231. package/evals/fixtures/veritas-governance-adapter/fake-veritas-unconfigured.sh +4 -0
  232. package/evals/integration/test_bundle_install.sh +541 -0
  233. package/evals/integration/test_console_learning_projection.sh +192 -0
  234. package/evals/integration/test_context_map.sh +65 -0
  235. package/evals/integration/test_effective_backlog_settings.sh +58 -0
  236. package/evals/integration/test_fixture_retirement_audit.sh +58 -0
  237. package/evals/integration/test_flow_agents_statusline.sh +93 -0
  238. package/evals/integration/test_flow_kit_repository.sh +90 -0
  239. package/evals/integration/test_goal_fit_hook.sh +482 -0
  240. package/evals/integration/test_hook_category_behaviors.sh +190 -0
  241. package/evals/integration/test_hook_influence_cases.sh +69 -0
  242. package/evals/integration/test_local_flow_kit_install.sh +145 -0
  243. package/evals/integration/test_publish_change_helper.sh +176 -0
  244. package/evals/integration/test_pull_work_provider.sh +140 -0
  245. package/evals/integration/test_runtime_adapter_activation.sh +106 -0
  246. package/evals/integration/test_telemetry.sh +485 -0
  247. package/evals/integration/test_telemetry_doctor.sh +193 -0
  248. package/evals/integration/test_usage_feedback_dashboard.sh +169 -0
  249. package/evals/integration/test_usage_feedback_global.sh +117 -0
  250. package/evals/integration/test_usage_feedback_import.sh +227 -0
  251. package/evals/integration/test_usage_feedback_outcomes.sh +165 -0
  252. package/evals/integration/test_usage_feedback_report.sh +263 -0
  253. package/evals/integration/test_veritas_governance_adapter.sh +235 -0
  254. package/evals/integration/test_workflow_artifact_cleanup_audit.sh +287 -0
  255. package/evals/integration/test_workflow_artifacts.sh +1247 -0
  256. package/evals/integration/test_workflow_sidecar_writer.sh +2112 -0
  257. package/evals/integration/test_workflow_steering_hook.sh +337 -0
  258. package/evals/lib/assertions/delegated-to.js +40 -0
  259. package/evals/lib/assertions/max-tool-calls.js +15 -0
  260. package/evals/lib/assertions/no-write-tools.js +27 -0
  261. package/evals/lib/assertions/pass-at-k.js +39 -0
  262. package/evals/lib/assertions/telemetry-utils.js +105 -0
  263. package/evals/lib/assertions/tool-called.js +39 -0
  264. package/evals/lib/assertions/verify-after-fix.js +61 -0
  265. package/evals/lib/claude-judge.sh +40 -0
  266. package/evals/lib/claude-provider.sh +74 -0
  267. package/evals/lib/codex-judge.sh +39 -0
  268. package/evals/lib/codex-provider.sh +81 -0
  269. package/evals/lib/eval-dev.sh +5 -0
  270. package/evals/lib/eval-judge.sh +22 -0
  271. package/evals/lib/eval-provider.sh +26 -0
  272. package/evals/lib/eval-report.sh +73 -0
  273. package/evals/lib/kiro-dev.sh +4 -0
  274. package/evals/lib/kiro-judge.sh +17 -0
  275. package/evals/lib/kiro-provider.sh +62 -0
  276. package/evals/lib/node.sh +111 -0
  277. package/evals/promptfooconfig.yaml +70 -0
  278. package/evals/run.sh +309 -0
  279. package/evals/static/test_evidence_refs.sh +141 -0
  280. package/evals/static/test_package.sh +407 -0
  281. package/evals/static/test_repo_hooks.sh +68 -0
  282. package/evals/static/test_universal_bundles.sh +274 -0
  283. package/evals/static/test_workflow_skills.sh +1207 -0
  284. package/install.sh +64 -0
  285. package/integrations/veritas/flow-agents.adapter.json +138 -0
  286. package/integrations/veritas/flow-agents.authority-settings.json +26 -0
  287. package/integrations/veritas/flow-agents.repo-standards.json +82 -0
  288. package/kits/builder/flows/build.flow.json +218 -0
  289. package/kits/builder/flows/shape.flow.json +127 -0
  290. package/kits/builder/kit.json +19 -0
  291. package/kits/catalog.json +11 -0
  292. package/package.json +130 -0
  293. package/packaging/README.md +60 -0
  294. package/packaging/manifest.json +173 -0
  295. package/packaging/packs.json +69 -0
  296. package/powers/dependency-checker/POWER.md +20 -0
  297. package/powers/dependency-checker/mcp.json +20 -0
  298. package/powers/playwright/POWER.md +25 -0
  299. package/powers/playwright/mcp.json +12 -0
  300. package/prompts/code-audit.md +123 -0
  301. package/prompts/kcommit.md +88 -0
  302. package/schemas/backlog-provider-settings.schema.json +138 -0
  303. package/schemas/workflow-acceptance.schema.json +216 -0
  304. package/schemas/workflow-critique.schema.json +113 -0
  305. package/schemas/workflow-evidence.schema.json +357 -0
  306. package/schemas/workflow-handoff.schema.json +52 -0
  307. package/schemas/workflow-learning.schema.json +223 -0
  308. package/schemas/workflow-release.schema.json +172 -0
  309. package/schemas/workflow-state.schema.json +80 -0
  310. package/scripts/README.md +111 -0
  311. package/scripts/build-universal-bundles.js +3 -0
  312. package/scripts/check-content-boundary.cjs +99 -0
  313. package/scripts/context-budget/budget-scan.sh +166 -0
  314. package/scripts/detect-tools.sh +3 -0
  315. package/scripts/discover-agents.sh +28 -0
  316. package/scripts/effective-backlog-settings.js +2 -0
  317. package/scripts/filter-installed-packs.js +2 -0
  318. package/scripts/flow-kit.js +2 -0
  319. package/scripts/generate-context-map.js +2 -0
  320. package/scripts/git-status.sh +49 -0
  321. package/scripts/hooks/claude-hook-adapter.js +174 -0
  322. package/scripts/hooks/claude-telemetry-hook.js +115 -0
  323. package/scripts/hooks/codex-hook-adapter.js +176 -0
  324. package/scripts/hooks/codex-telemetry-hook.js +95 -0
  325. package/scripts/hooks/config-protection.js +79 -0
  326. package/scripts/hooks/desktop-notify.sh +39 -0
  327. package/scripts/hooks/governance-audit.sh +135 -0
  328. package/scripts/hooks/lib/audit-transport.sh +40 -0
  329. package/scripts/hooks/lib/hook-flags.js +49 -0
  330. package/scripts/hooks/lib/patterns.sh +57 -0
  331. package/scripts/hooks/lib/resolve-formatter.js +80 -0
  332. package/scripts/hooks/post-edit-accumulator.js +66 -0
  333. package/scripts/hooks/pre-commit-quality.js +194 -0
  334. package/scripts/hooks/quality-gate.js +93 -0
  335. package/scripts/hooks/report-only-guard.js +21 -0
  336. package/scripts/hooks/run-hook.js +136 -0
  337. package/scripts/hooks/stop-format-typecheck.js +141 -0
  338. package/scripts/hooks/stop-goal-fit.js +337 -0
  339. package/scripts/hooks/workflow-steering.js +250 -0
  340. package/scripts/install-codex-home.sh +106 -0
  341. package/scripts/package.json +3 -0
  342. package/scripts/promote-workflow-artifact.js +2 -0
  343. package/scripts/publish-change-helper.js +2 -0
  344. package/scripts/pull-work-provider.js +2 -0
  345. package/scripts/setup-repo-hooks.sh +8 -0
  346. package/scripts/statusline/flow-agents-statusline.js +157 -0
  347. package/scripts/telemetry/console-presets.sh +14 -0
  348. package/scripts/telemetry/install-console-config.sh +214 -0
  349. package/scripts/telemetry/lib/config.sh +85 -0
  350. package/scripts/telemetry/lib/enrich.sh +115 -0
  351. package/scripts/telemetry/lib/redact.sh +22 -0
  352. package/scripts/telemetry/lib/session.sh +63 -0
  353. package/scripts/telemetry/lib/transport.sh +183 -0
  354. package/scripts/telemetry/lib/usage.sh +29 -0
  355. package/scripts/telemetry/sync-agents.sh +173 -0
  356. package/scripts/telemetry/telemetry.conf +23 -0
  357. package/scripts/telemetry/telemetry.sh +387 -0
  358. package/scripts/usage-feedback.js +2 -0
  359. package/scripts/validate-hook-influence-cases.js +2 -0
  360. package/scripts/validate-package.sh +89 -0
  361. package/scripts/validate-source-tree.js +9 -0
  362. package/skills/agentic-engineering/SKILL.md +62 -0
  363. package/skills/browser-test/SKILL.md +51 -0
  364. package/skills/builder-shape/SKILL.md +76 -0
  365. package/skills/context-budget/SKILL.md +40 -0
  366. package/skills/deliver/SKILL.md +241 -0
  367. package/skills/dependency-update/SKILL.md +68 -0
  368. package/skills/design-probe/SKILL.md +107 -0
  369. package/skills/eval-rebuild/SKILL.md +39 -0
  370. package/skills/evidence-gate/SKILL.md +186 -0
  371. package/skills/execute-plan/SKILL.md +110 -0
  372. package/skills/explore/SKILL.md +137 -0
  373. package/skills/feedback-loop/SKILL.md +87 -0
  374. package/skills/fix-bug/SKILL.md +133 -0
  375. package/skills/frontend-design/SKILL.md +80 -0
  376. package/skills/github-cli/SKILL.md +63 -0
  377. package/skills/idea-to-backlog/SKILL.md +267 -0
  378. package/skills/knowledge-capture/SKILL.md +55 -0
  379. package/skills/learning-review/SKILL.md +115 -0
  380. package/skills/pickup-probe/SKILL.md +114 -0
  381. package/skills/plan-work/SKILL.md +176 -0
  382. package/skills/pull-work/SKILL.md +309 -0
  383. package/skills/release-readiness/SKILL.md +121 -0
  384. package/skills/review-work/SKILL.md +161 -0
  385. package/skills/search-first/SKILL.md +66 -0
  386. package/skills/tdd-workflow/SKILL.md +140 -0
  387. package/skills/verify-work/SKILL.md +109 -0
  388. package/src/cli/console-learning-projection.ts +140 -0
  389. package/src/cli/effective-backlog-settings.ts +99 -0
  390. package/src/cli/fixture-retirement-audit.ts +154 -0
  391. package/src/cli/flow-kit.ts +139 -0
  392. package/src/cli/init.ts +248 -0
  393. package/src/cli/promote-workflow-artifact.ts +64 -0
  394. package/src/cli/publish-change-helper.ts +143 -0
  395. package/src/cli/pull-work-provider.ts +481 -0
  396. package/src/cli/runtime-adapter.ts +24 -0
  397. package/src/cli/telemetry-doctor.ts +243 -0
  398. package/src/cli/usage-feedback.ts +418 -0
  399. package/src/cli/validate-hook-influence.ts +119 -0
  400. package/src/cli/validate-source-tree.ts +30 -0
  401. package/src/cli/validate-workflow-artifacts.ts +411 -0
  402. package/src/cli/veritas-governance.ts +322 -0
  403. package/src/cli/workflow-artifact-cleanup-audit.ts +281 -0
  404. package/src/cli/workflow-sidecar.ts +676 -0
  405. package/src/cli.ts +95 -0
  406. package/src/flow-kit/validate.ts +74 -0
  407. package/src/lib/args.ts +43 -0
  408. package/src/lib/fs.ts +62 -0
  409. package/src/lib/workflow-learning-projection.ts +491 -0
  410. package/src/runtime-adapters.ts +154 -0
  411. package/src/tools/build-universal-bundles.ts +366 -0
  412. package/src/tools/common.ts +61 -0
  413. package/src/tools/filter-installed-packs.ts +129 -0
  414. package/src/tools/generate-context-map.ts +199 -0
  415. package/src/tools/validate-package.ts +57 -0
  416. package/src/tools/validate-source-tree.ts +488 -0
  417. package/tsconfig.json +19 -0
  418. package/veritas.claims.json +6 -0
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { loadJson, writeText } from "./common.js";
6
+ function splitPacks(value) {
7
+ return new Set(value.split(",").map((item) => item.trim()).filter(Boolean));
8
+ }
9
+ function namesFor(packs) {
10
+ return new Set((packs.packs ?? []).map((pack) => String(pack.name ?? "")));
11
+ }
12
+ function entries(pack, field) {
13
+ const value = pack[field];
14
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
15
+ }
16
+ function assertSafeName(name, label) {
17
+ if (!/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*$/.test(name))
18
+ throw new Error(`${label} contains unsafe pack member name: ${name}`);
19
+ }
20
+ function assertContained(rootDir, target) {
21
+ const rootReal = fs.realpathSync(rootDir);
22
+ const parentReal = fs.realpathSync(path.dirname(target));
23
+ const resolved = path.resolve(parentReal, path.basename(target));
24
+ const relative = path.relative(rootReal, resolved);
25
+ if (!relative || relative.startsWith("..") || path.isAbsolute(relative))
26
+ throw new Error(`refusing to remove path outside install root: ${target}`);
27
+ if (fs.existsSync(target)) {
28
+ const targetReal = fs.realpathSync(target);
29
+ const targetRelative = path.relative(rootReal, targetReal);
30
+ if (!targetRelative || targetRelative.startsWith("..") || path.isAbsolute(targetRelative))
31
+ throw new Error(`refusing to remove path outside install root: ${target}`);
32
+ }
33
+ }
34
+ function packSelection(packs, requested) {
35
+ const selectedNames = new Set();
36
+ for (const pack of packs.packs ?? [])
37
+ if (pack.default === true)
38
+ selectedNames.add(String(pack.name));
39
+ for (const name of requested)
40
+ selectedNames.add(name);
41
+ const unknown = [...selectedNames].filter((name) => !namesFor(packs).has(name)).sort();
42
+ if (unknown.length)
43
+ throw new Error(`unknown pack(s): ${unknown.join(", ")}`);
44
+ const selected = { skills: new Set(), agents: new Set(), powers: new Set() };
45
+ for (const pack of packs.packs ?? []) {
46
+ if (!selectedNames.has(String(pack.name)))
47
+ continue;
48
+ for (const field of Object.keys(selected)) {
49
+ for (const item of entries(pack, field))
50
+ selected[field].add(item);
51
+ }
52
+ }
53
+ return [selectedNames, selected];
54
+ }
55
+ function allPackMembers(packs, field) {
56
+ const values = new Set();
57
+ for (const pack of packs.packs ?? [])
58
+ for (const item of entries(pack, field))
59
+ values.add(item);
60
+ return values;
61
+ }
62
+ function removePath(rootDir, target, dryRun) {
63
+ if (!fs.existsSync(target))
64
+ return false;
65
+ assertContained(rootDir, target);
66
+ if (dryRun) {
67
+ console.log(`would remove ${target}`);
68
+ return true;
69
+ }
70
+ fs.rmSync(target, { recursive: true, force: true });
71
+ console.log(`removed ${target}`);
72
+ return true;
73
+ }
74
+ function pruneNamedDirs(rootDir, parent, known, keep, dryRun) {
75
+ let removed = 0;
76
+ for (const name of [...known].filter((name) => !keep.has(name)).sort()) {
77
+ assertSafeName(name, parent);
78
+ if (removePath(rootDir, path.join(rootDir, parent, name), dryRun))
79
+ removed += 1;
80
+ }
81
+ return removed;
82
+ }
83
+ function pruneAgentFiles(rootDir, parent, suffix, known, keep, dryRun) {
84
+ let removed = 0;
85
+ for (const name of [...known].filter((name) => !keep.has(name)).sort()) {
86
+ assertSafeName(name, parent);
87
+ if (removePath(rootDir, path.join(rootDir, parent, `${name}${suffix}`), dryRun))
88
+ removed += 1;
89
+ }
90
+ return removed;
91
+ }
92
+ export function main(argv = process.argv.slice(2)) {
93
+ const args = argv;
94
+ const dryRun = args.includes("--dry-run");
95
+ const rootArg = args.find((arg) => !arg.startsWith("--"));
96
+ const packsFlag = args.indexOf("--packs");
97
+ if (!rootArg || packsFlag < 0 || !args[packsFlag + 1]) {
98
+ console.error("usage: filter-installed-packs <root> --packs <packs> [--dry-run]");
99
+ return 2;
100
+ }
101
+ const rootDir = path.resolve(rootArg);
102
+ const packsPath = path.join(rootDir, "packaging", "packs.json");
103
+ if (!fs.existsSync(packsPath))
104
+ throw new Error(`pack manifest not found: ${packsPath}`);
105
+ const packs = loadJson(packsPath);
106
+ const [selectedNames, selected] = packSelection(packs, splitPacks(args[packsFlag + 1]));
107
+ let removed = 0;
108
+ removed += pruneNamedDirs(rootDir, "skills", allPackMembers(packs, "skills"), selected.skills, dryRun);
109
+ removed += pruneNamedDirs(rootDir, ".claude/skills", allPackMembers(packs, "skills"), selected.skills, dryRun);
110
+ removed += pruneNamedDirs(rootDir, ".codex/skills", allPackMembers(packs, "skills"), selected.skills, dryRun);
111
+ removed += pruneNamedDirs(rootDir, "powers", allPackMembers(packs, "powers"), selected.powers, dryRun);
112
+ removed += pruneAgentFiles(rootDir, "agents", ".json", allPackMembers(packs, "agents"), selected.agents, dryRun);
113
+ removed += pruneAgentFiles(rootDir, ".claude/agents", ".md", allPackMembers(packs, "agents"), selected.agents, dryRun);
114
+ removed += pruneAgentFiles(rootDir, ".codex/agents", ".toml", allPackMembers(packs, "agents"), selected.agents, dryRun);
115
+ const summary = {
116
+ selected_packs: [...selectedNames].sort(),
117
+ removed_entries: removed,
118
+ kept: Object.fromEntries(Object.entries(selected).map(([field, values]) => [field, [...values].sort()])),
119
+ };
120
+ if (!dryRun)
121
+ writeText(path.join(rootDir, ".flow-agents/installed-packs.json"), `${JSON.stringify(summary, null, 2)}\n`);
122
+ console.log(JSON.stringify(summary, null, 2));
123
+ return 0;
124
+ }
125
+ if (process.argv[1] && fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(path.resolve(process.argv[1])))
126
+ try {
127
+ process.exit(main());
128
+ }
129
+ catch (error) {
130
+ console.error(error instanceof Error ? error.message : String(error));
131
+ process.exit(1);
132
+ }
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { exists, loadJson, markdownTable, oneLine, readText, rel, root, writeText } from "./common.js";
5
+ const defaultOutput = path.join(root, "docs/context-map.md");
6
+ const dirDescriptions = {
7
+ agents: "Canonical agent specs and routing prompts.",
8
+ "agent-cards": "Install/discovery cards that point at canonical agents.",
9
+ context: "Shared contracts, routing notes, templates, and reusable guidance.",
10
+ docs: "Long-lived project documentation and GitHub Pages content.",
11
+ evals: "Static, integration, install, and behavioral eval fixtures.",
12
+ powers: "Optional MCP/tool integration packs.",
13
+ prompts: "Reusable prompt entry points.",
14
+ schemas: "JSON Schema contracts for machine-readable workflow artifacts.",
15
+ scripts: "Build, validation, hook, telemetry, workflow, and import/export utilities.",
16
+ skills: "On-demand capability instructions and workflow primitives.",
17
+ };
18
+ const workflowSkills = new Set(["idea-to-backlog", "pull-work", "plan-work", "execute-plan", "review-work", "verify-work", "evidence-gate", "release-readiness", "learning-review", "deliver", "fix-bug", "tdd-workflow"]);
19
+ const commands = [
20
+ ["Source tree", "npm run validate:source"],
21
+ ["Static suite", "bash evals/run.sh static"],
22
+ ["Integration suite", "bash evals/run.sh integration"],
23
+ ["Workflow artifacts", "npm run workflow:validate-artifacts -- --require-sidecars --require-critique .flow-agents/<slug>"],
24
+ ["Workflow sidecars", "npm run workflow:sidecar -- --help"],
25
+ ["Context map drift", "npm run context-map:check"],
26
+ ["Bundle build", "npm run build:bundles"],
27
+ ];
28
+ function frontmatter(text) {
29
+ if (!text.startsWith("---"))
30
+ return {};
31
+ const end = text.indexOf("\n---", 3);
32
+ if (end < 0)
33
+ return {};
34
+ const fields = {};
35
+ const lines = text.slice(3, end).split(/\r?\n/);
36
+ for (let index = 0; index < lines.length;) {
37
+ const match = /^([A-Za-z0-9_-]+):\s*(.+)$/.exec(lines[index].trim());
38
+ if (!match) {
39
+ index += 1;
40
+ continue;
41
+ }
42
+ const key = match[1];
43
+ const value = match[2].trim();
44
+ index += 1;
45
+ if ([">", ">-", "|", "|-"].includes(value)) {
46
+ const block = [];
47
+ while (index < lines.length && (lines[index].startsWith(" ") || !lines[index].trim())) {
48
+ if (lines[index].trim())
49
+ block.push(lines[index].trim());
50
+ index += 1;
51
+ }
52
+ fields[key] = block.join(" ");
53
+ }
54
+ else {
55
+ const parts = [value.replace(/^"|"$/g, "")];
56
+ while (index < lines.length && (lines[index].startsWith(" ") || !lines[index].trim())) {
57
+ if (lines[index].trim())
58
+ parts.push(lines[index].trim().replace(/^"|"$/g, ""));
59
+ index += 1;
60
+ }
61
+ fields[key] = parts.join(" ");
62
+ }
63
+ }
64
+ return fields;
65
+ }
66
+ function repoShape(manifest) {
67
+ const canonical = new Set(Array.isArray(manifest.canonical_copy_dirs) ? manifest.canonical_copy_dirs.map(String) : []);
68
+ const dirs = [...new Set([...canonical, ...Object.keys(dirDescriptions)])].sort();
69
+ const rows = dirs.filter((dir) => exists(path.join(root, dir))).map((dir) => [dir, canonical.has(dir) ? "canonical copy" : "source", dirDescriptions[dir] ?? "Project directory."]);
70
+ for (const dir of Array.isArray(manifest.optional_copy_dirs) ? manifest.optional_copy_dirs.map(String) : []) {
71
+ rows.push([dir, "optional", "Optional local/user pack copied when present."]);
72
+ }
73
+ rows.push(["dist", "generated", "Generated bundle exports. Do not edit by hand."]);
74
+ rows.push([".flow-agents", "runtime", "Cross-session workflow artifacts and sidecars. Not committed by default."]);
75
+ return rows;
76
+ }
77
+ function listSkillRows() {
78
+ const workflowRows = [];
79
+ const supportRows = [];
80
+ const skillsDir = path.join(root, "skills");
81
+ for (const name of fs.readdirSync(skillsDir).sort()) {
82
+ const skillPath = path.join(skillsDir, name, "SKILL.md");
83
+ if (!exists(skillPath))
84
+ continue;
85
+ const meta = frontmatter(readText(skillPath));
86
+ const row = [meta.name ?? name, rel(skillPath), oneLine(meta.description ?? "")];
87
+ if (workflowSkills.has(row[0]))
88
+ workflowRows.push(row);
89
+ else
90
+ supportRows.push(row);
91
+ }
92
+ return [workflowRows, supportRows];
93
+ }
94
+ function agents() {
95
+ const dir = path.join(root, "agents");
96
+ return fs.readdirSync(dir).filter((name) => name.endsWith(".json")).sort().map((name) => {
97
+ const file = path.join(dir, name);
98
+ const data = loadJson(file);
99
+ const tools = Array.isArray(data.tools) ? data.tools : Array.isArray(data.allowedTools) ? data.allowedTools : [];
100
+ return [String(data.name ?? path.basename(name, ".json")), String(data.model ?? ""), String(tools.length), oneLine(String(data.description ?? ""))];
101
+ });
102
+ }
103
+ function schemas() {
104
+ const dir = path.join(root, "schemas");
105
+ return fs.readdirSync(dir).filter((name) => name.endsWith(".schema.json")).sort().map((name) => {
106
+ const data = loadJson(path.join(dir, name));
107
+ return [name, oneLine(String(data.title ?? "")), oneLine(String(data.$id ?? ""))];
108
+ });
109
+ }
110
+ function powers() {
111
+ const dir = path.join(root, "powers");
112
+ return fs.readdirSync(dir).sort().flatMap((name) => exists(path.join(dir, name, "POWER.md")) ? [[name, rel(path.join(dir, name, "POWER.md"))]] : []);
113
+ }
114
+ function packs() {
115
+ const data = loadJson(path.join(root, "packaging/packs.json"));
116
+ return (data.packs ?? []).map((pack) => [
117
+ String(pack.name ?? ""),
118
+ pack.default ? "yes" : "no",
119
+ String(Array.isArray(pack.skills) ? pack.skills.length : 0),
120
+ String(Array.isArray(pack.agents) ? pack.agents.length : 0),
121
+ String(Array.isArray(pack.powers) ? pack.powers.length : 0),
122
+ oneLine(String(pack.description ?? "")),
123
+ ]);
124
+ }
125
+ function latestRuntimeStates(includeRuntime) {
126
+ if (!includeRuntime) {
127
+ return [
128
+ "Runtime workflow state is excluded from the committed map.",
129
+ "Regenerate locally with `npm run context-map -- --include-runtime` to include recent `.flow-agents` state.",
130
+ ];
131
+ }
132
+ const workflowDir = path.join(root, ".flow-agents");
133
+ if (!exists(workflowDir))
134
+ return ["No local workflow state found under `.flow-agents`."];
135
+ const states = fs.readdirSync(workflowDir).map((name) => path.join(workflowDir, name, "state.json")).filter(exists).sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
136
+ if (!states.length)
137
+ return ["No local workflow state found under `.flow-agents`."];
138
+ const rows = states.slice(0, 8).map((file) => {
139
+ const data = loadJson(file);
140
+ const next = typeof data.next_action === "object" && data.next_action ? data.next_action : {};
141
+ return [String(data.task_slug ?? path.basename(path.dirname(file))), String(data.status ?? ""), String(data.phase ?? ""), oneLine(String(next.summary ?? ""))];
142
+ });
143
+ return markdownTable(["Task", "Status", "Phase", "Next Action"], rows);
144
+ }
145
+ function render(includeRuntime) {
146
+ const manifest = loadJson(path.join(root, "packaging/manifest.json"));
147
+ const [workflowRows, supportRows] = listSkillRows();
148
+ return [
149
+ "---", "title: Context Map", "---", "", "# Context Map", "",
150
+ "Generated by `npm run context-map`. Regenerate after changing agents, skills, schemas, workflow contracts, or core commands.", "",
151
+ "## How To Use This", "",
152
+ "- Start here when a session is long, resumed, or context-constrained.",
153
+ "- Load only the specific skill, contract, schema, or doc that matches the task.",
154
+ "- Treat `.flow-agents` as runtime state and `dist/` as generated output.", "",
155
+ "## Repository Shape", "", ...markdownTable(["Path", "Role", "Purpose"], repoShape(manifest)), "",
156
+ "## Core Commands", "", ...markdownTable(["Use", "Command"], commands), "",
157
+ "## Workflow Sidecars", "",
158
+ "Machine-readable workflow state lives beside Markdown artifacts in `.flow-agents/<slug>/`.", "",
159
+ ...markdownTable(["Schema", "Title", "ID"], schemas()), "",
160
+ "Primary tools: `npm run workflow:sidecar`, `npm run workflow:validate-artifacts`, `scripts/hooks/stop-goal-fit.js`, and `scripts/hooks/workflow-steering.js`.", "",
161
+ "## Workflow Skills", "", ...markdownTable(["Skill", "Source", "When To Load"], workflowRows), "",
162
+ "## Support Skills", "", ...markdownTable(["Skill", "Source", "When To Load"], supportRows), "",
163
+ "## Agents", "", ...markdownTable(["Agent", "Model", "Tools", "Role"], agents()), "",
164
+ "## Optional Powers", "", ...markdownTable(["Power", "Source"], powers()), "",
165
+ "## Packs", "",
166
+ "Pack composition is defined in `packaging/packs.json`. The current builder exports pack metadata in bundle catalogs, and generated install scripts support opt-in `FLOW_AGENTS_PACKS` filtering while leaving all packs installed by default.", "",
167
+ ...markdownTable(["Pack", "Default", "Skills", "Agents", "Powers", "Purpose"], packs()), "",
168
+ "## Current Workflow State", "", ...latestRuntimeStates(includeRuntime), "",
169
+ "## Context Loading Rules", "",
170
+ "- For delivery work, load `deliver`, then the specific primitive skill for the current phase.",
171
+ "- For planning, verification, release, learning, or artifact validation, load `context/contracts/artifact-contract.md` plus the phase contract.",
172
+ "- For unknown external APIs or libraries, use `search-first` before implementation.",
173
+ "- For large or noisy sessions, prefer sidecars and this map over rereading broad docs.",
174
+ "- For generated exports, edit source files and rebuild instead of editing `dist/`.", "",
175
+ ].join("\n");
176
+ }
177
+ export function main(argv = process.argv.slice(2)) {
178
+ const args = argv;
179
+ const check = args.includes("--check");
180
+ const includeRuntime = args.includes("--include-runtime");
181
+ const outputIndex = args.indexOf("--output");
182
+ const output = outputIndex >= 0 && args[outputIndex + 1] ? path.resolve(args[outputIndex + 1]) : defaultOutput;
183
+ const text = render(includeRuntime);
184
+ if (check) {
185
+ const current = exists(output) ? readText(output) : "";
186
+ if (current !== text) {
187
+ console.error(`${rel(output)} is stale; run npm run context-map`);
188
+ return 1;
189
+ }
190
+ console.log(`${rel(output)} is current.`);
191
+ return 0;
192
+ }
193
+ writeText(output, text);
194
+ console.log(`Wrote ${rel(output)}`);
195
+ return 0;
196
+ }
197
+ if (import.meta.url === `file://${process.argv[1]}`)
198
+ process.exit(main());
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ export function main(argv = process.argv.slice(2)) {
5
+ const [prefixArg, localFlag] = argv;
6
+ if (!prefixArg) {
7
+ console.error("Usage: validate-package <package-prefix> [--local]");
8
+ return 2;
9
+ }
10
+ const prefix = localFlag === "--local" ? `local-${prefixArg}` : prefixArg;
11
+ const agentsDir = path.join(process.env.HOME ?? "", ".kiro/agents");
12
+ console.log(`Package: ${prefix}\n`);
13
+ const files = fs.existsSync(agentsDir) ? fs.readdirSync(agentsDir).filter((name) => name.startsWith(`${prefix}-`) && name.endsWith(".json")).map((name) => path.join(agentsDir, name)) : [];
14
+ console.log(`Agents: ${files.length} found`);
15
+ if (files.length === 0) {
16
+ console.log("✗ No agents found");
17
+ return 1;
18
+ }
19
+ console.log("");
20
+ let errors = 0;
21
+ let specOk = 0;
22
+ let specFail = 0;
23
+ for (const file of files) {
24
+ const data = JSON.parse(fs.readFileSync(file, "utf8"));
25
+ const name = data.name ?? "";
26
+ if (!data.name || !data.prompt || !data.model || !data.description) {
27
+ console.log(` ✗ ${path.basename(file)}: missing required field(s)`);
28
+ specFail += 1;
29
+ }
30
+ else if (!/^[a-z][a-z0-9-]*$/.test(name)) {
31
+ console.log(` ✗ ${name}: invalid name format`);
32
+ specFail += 1;
33
+ }
34
+ else
35
+ specOk += 1;
36
+ }
37
+ console.log(`${specFail === 0 ? "✓" : "✗"} Agent specs: ${specOk}/${files.length} well-formed`);
38
+ errors += specFail;
39
+ let hookTotal = 0;
40
+ let hookFail = 0;
41
+ for (const file of files) {
42
+ const data = JSON.parse(fs.readFileSync(file, "utf8"));
43
+ for (const [hookType, entries] of Object.entries(data.hooks ?? {})) {
44
+ for (const entry of Array.isArray(entries) ? entries : []) {
45
+ hookTotal += 1;
46
+ const command = String(entry.command ?? "");
47
+ if (!command)
48
+ continue;
49
+ const script = command.replace(/^bash\s+/, "").split(/\s+/)[0].replace(/^~/, process.env.HOME ?? "");
50
+ if (!fs.existsSync(script)) {
51
+ console.log(` ✗ ${data.name} → ${hookType}: ${path.basename(script)} (not found)`);
52
+ hookFail += 1;
53
+ }
54
+ }
55
+ }
56
+ }
57
+ console.log(`${hookFail === 0 ? "✓" : "✗"} Hook scripts: ${hookTotal - hookFail}/${hookTotal} resolved`);
58
+ errors += hookFail;
59
+ console.log("✓ Resources: checked\n");
60
+ console.log(errors === 0 ? "Result: PASS" : `Result: FAIL (${errors} error(s))`);
61
+ return errors === 0 ? 0 : 1;
62
+ }
63
+ if (import.meta.url === `file://${process.argv[1]}`)
64
+ process.exit(main());