@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,387 @@
1
+ #!/usr/bin/env bash
2
+ # telemetry.sh — Kiro adapter for generic agent telemetry schema v0.3.0
3
+ # Usage: echo '<hook_event_json>' | bash telemetry.sh <event_type> <agent_name>
4
+ set -o pipefail
5
+
6
+ TELEMETRY_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
+
8
+ source "${TELEMETRY_DIR}/lib/config.sh"
9
+ source "${TELEMETRY_DIR}/lib/session.sh"
10
+ source "${TELEMETRY_DIR}/lib/enrich.sh"
11
+ source "${TELEMETRY_DIR}/lib/transport.sh"
12
+ source "${TELEMETRY_DIR}/lib/usage.sh"
13
+
14
+ normalize_tool_name() {
15
+ case "$1" in
16
+ Bash|bash|shell|execute_bash) echo "execute_bash" ;;
17
+ apply_patch|Edit|Write|fs_write|write|code) echo "fs_write" ;;
18
+ spawn_agent|use_subagent|InvokeSubagents|Task|Agent|"delegate to a specialist agent") echo "use_subagent" ;;
19
+ Read|read|fs_read) echo "fs_read" ;;
20
+ *) echo "$1" ;;
21
+ esac
22
+ }
23
+
24
+ telemetry_session_id() {
25
+ local event_type="$1" agent_name="$2"
26
+ local session_id=""
27
+ case "$event_type" in
28
+ agentSpawn)
29
+ session_id=$(session_start "$agent_name")
30
+ session_cleanup
31
+ ;;
32
+ stop)
33
+ session_id=$(session_get)
34
+ session_end
35
+ ;;
36
+ *)
37
+ session_id=$(session_get)
38
+ # Touch session file so mtime reflects last activity
39
+ local _sf="${TELEMETRY_SESSION_DIR}/telemetry-${PPID}"
40
+ [[ -f "$_sf" ]] && touch "$_sf" 2>/dev/null
41
+ ;;
42
+ esac
43
+ echo "${session_id:-no-session}"
44
+ }
45
+
46
+ schema_event_type() {
47
+ local event_type="$1"
48
+ case "$event_type" in
49
+ agentSpawn|SessionStart) echo "session.start" ;;
50
+ stop|Stop|SessionEnd) echo "session.end" ;;
51
+ userPromptSubmit|UserPromptSubmit) echo "turn.user" ;;
52
+ preToolUse|PreToolUse) echo "tool.invoke" ;;
53
+ permissionRequest|PermissionRequest) echo "tool.permission_request" ;;
54
+ postToolUse|PostToolUse|PostToolUseFailure) echo "tool.result" ;;
55
+ *) echo "unknown" ;;
56
+ esac
57
+ }
58
+
59
+ runtime_version() {
60
+ local runtime_name runtime_binary runtime_version
61
+ runtime_name="$1"
62
+ case "$runtime_name" in
63
+ codex) runtime_binary="codex" ;;
64
+ claude|claude-code) runtime_binary="claude"; runtime_name="claude-code" ;;
65
+ kiro|kiro-cli) runtime_binary="kiro-cli"; runtime_name="kiro-cli" ;;
66
+ *) runtime_binary="$runtime_name" ;;
67
+ esac
68
+ runtime_version=$(
69
+ "$runtime_binary" --version 2>/dev/null &
70
+ _pid=$!; ( sleep 2; kill $_pid 2>/dev/null ) &
71
+ _guard=$!; wait $_pid 2>/dev/null; kill $_guard 2>/dev/null
72
+ wait $_pid 2>/dev/null
73
+ ) 2>/dev/null
74
+ runtime_version=$(echo "$runtime_version" | head -n1)
75
+ echo "${runtime_version:-unknown}"
76
+ }
77
+
78
+ build_base_event() {
79
+ local session_id="$1" schema_event_type="$2" agent_name="$3"
80
+ local runtime_name="${FLOW_AGENTS_TELEMETRY_RUNTIME:-kiro-cli}"
81
+ case "$runtime_name" in
82
+ claude|claude-code) runtime_name="claude-code" ;;
83
+ kiro|kiro-cli) runtime_name="kiro-cli" ;;
84
+ esac
85
+ jq -nc \
86
+ --arg sv "0.3.0" \
87
+ --arg ts "$(date +%s)000" \
88
+ --arg sid "$session_id" \
89
+ --arg eid "$(uuidgen 2>/dev/null || echo "e-$(date +%s)-$$")" \
90
+ --arg et "$schema_event_type" \
91
+ --arg an "$agent_name" \
92
+ --arg rv "$(runtime_version "$runtime_name")" \
93
+ --arg rn "$runtime_name" \
94
+ '{
95
+ schema_version: $sv,
96
+ timestamp: $ts,
97
+ session_id: $sid,
98
+ event_id: $eid,
99
+ event_type: $et,
100
+ agent: {
101
+ name: $an,
102
+ runtime: $rn,
103
+ version: $rv
104
+ }
105
+ }'
106
+ }
107
+
108
+ add_hook_context() {
109
+ local event="$1" event_type="$2" stdin_json="$3"
110
+ local cwd tty_name pid runtime_session_id runtime_turn_id transcript_path hook_event_name model_name source stop_hook_active last_assistant_message raw_hook_input
111
+ cwd=$(echo "$stdin_json" | jq -r '.cwd // ""')
112
+ runtime_session_id=$(echo "$stdin_json" | jq -r '.session_id // ""')
113
+ runtime_turn_id=$(echo "$stdin_json" | jq -r '.turn_id // ""')
114
+ transcript_path=$(echo "$stdin_json" | jq -r '.transcript_path // ""')
115
+ hook_event_name=$(echo "$stdin_json" | jq -r '.hook_event_name // ""')
116
+ model_name=$(echo "$stdin_json" | jq -r '.model // ""')
117
+ source=$(echo "$stdin_json" | jq -r '.source // ""')
118
+ stop_hook_active=$(echo "$stdin_json" | jq -r '.stop_hook_active // empty')
119
+ last_assistant_message=$(echo "$stdin_json" | jq -r '.last_assistant_message // ""')
120
+ if [[ "$FLOW_AGENTS_TELEMETRY_CAPTURE_RAW_HOOK_INPUT" == "true" ]]; then
121
+ raw_hook_input="$stdin_json"
122
+ else
123
+ raw_hook_input="null"
124
+ fi
125
+ tty_name=$(session_get_tty)
126
+ pid=$(cat "${TELEMETRY_SESSION_DIR}/${session_id}.session" 2>/dev/null | jq -r '.pid // empty')
127
+ echo "$event" | jq -c \
128
+ --arg event_name "${hook_event_name:-$event_type}" \
129
+ --arg runtime_session_id "$runtime_session_id" \
130
+ --arg turn_id "$runtime_turn_id" \
131
+ --arg transcript_path "$transcript_path" \
132
+ --arg model "$model_name" \
133
+ --arg source "$source" \
134
+ --arg stop_hook_active "$stop_hook_active" \
135
+ --arg last_assistant_message "$last_assistant_message" \
136
+ --argjson raw "$raw_hook_input" \
137
+ '. + {
138
+ hook: {
139
+ event_name: $event_name,
140
+ runtime_session_id: $runtime_session_id,
141
+ turn_id: $turn_id,
142
+ transcript_path: $transcript_path,
143
+ model: $model,
144
+ source: $source,
145
+ stop_hook_active: (if $stop_hook_active == "" then null else ($stop_hook_active == "true") end),
146
+ last_assistant_message: $last_assistant_message,
147
+ raw_input: $raw
148
+ }
149
+ }'
150
+ }
151
+
152
+ add_runtime_context() {
153
+ local event="$1" event_type="$2" stdin_json="$3"
154
+ local cwd tty_name pid
155
+ cwd=$(echo "$stdin_json" | jq -r '.cwd // ""')
156
+ tty_name=$(session_get_tty)
157
+ pid=$(cat "${TELEMETRY_SESSION_DIR}/${session_id}.session" 2>/dev/null | jq -r '.pid // empty')
158
+ if [[ "$event_type" == "agentSpawn" ]]; then
159
+ local sys_json ws_json auth_json
160
+ sys_json=$(enrich_system)
161
+ ws_json=$(enrich_workspace)
162
+ auth_json=$(enrich_auth)
163
+
164
+ local os shell
165
+ os=$(echo "$sys_json" | jq -r '.os // "unknown"')
166
+ shell=$(echo "$sys_json" | jq -r '.shell // "unknown"')
167
+
168
+ echo "$event" | jq -c \
169
+ --arg cwd "$cwd" \
170
+ --arg tty "$tty_name" \
171
+ --arg os "$os" \
172
+ --arg shell "$shell" \
173
+ --argjson pid "${pid:-0}" \
174
+ --argjson sys "$sys_json" \
175
+ --argjson ws "$ws_json" \
176
+ --argjson auth "$auth_json" \
177
+ '. + {
178
+ context: {cwd: $cwd, tty: $tty, os: $os, shell: $shell, pid: $pid},
179
+ enrichment: {system: $sys, workspace: $ws, auth: $auth}
180
+ }'
181
+ else
182
+ echo "$event" | jq -c \
183
+ --arg cwd "$cwd" \
184
+ --arg tty "$tty_name" \
185
+ --argjson pid "${pid:-0}" \
186
+ '. + {context: {cwd: $cwd, tty: $tty, pid: $pid}}'
187
+ fi
188
+ }
189
+
190
+ add_user_prompt_data() {
191
+ local event="$1" stdin_json="$2"
192
+ local prompt_text prompt_length
193
+ prompt_text=$(echo "$stdin_json" | jq -r '.prompt // ""')
194
+ prompt_length=${#prompt_text}
195
+ echo "$event" | jq -c \
196
+ --arg pt "$prompt_text" \
197
+ --argjson pl "$prompt_length" \
198
+ '. + {turn: {prompt_text: $pt, prompt_length: $pl}}'
199
+ }
200
+
201
+ add_tool_event_data() {
202
+ local event="$1" event_type="$2" stdin_json="$3"
203
+ local tool_name tool_normalized_name tool_input tool_output permission_description
204
+ tool_name=$(echo "$stdin_json" | jq -r '.tool_name // ""')
205
+ tool_normalized_name=$(normalize_tool_name "$tool_name")
206
+ tool_input=$(echo "$stdin_json" | jq -c '.tool_input // null')
207
+ tool_output=$(echo "$stdin_json" | jq -c '.tool_response // null')
208
+ permission_description=$(echo "$stdin_json" | jq -r '.tool_input.description // ""')
209
+
210
+ if [[ "$event_type" == "preToolUse" ]]; then
211
+ event=$(echo "$event" | jq -c \
212
+ --arg tn "$tool_name" \
213
+ --arg nn "$tool_normalized_name" \
214
+ --argjson ti "$tool_input" \
215
+ '. + {tool: {name: $tn, normalized_name: $nn, input: $ti}}')
216
+ elif [[ "$event_type" == "permissionRequest" || "$event_type" == "PermissionRequest" ]]; then
217
+ event=$(echo "$event" | jq -c \
218
+ --arg tn "$tool_name" \
219
+ --arg nn "$tool_normalized_name" \
220
+ --argjson ti "$tool_input" \
221
+ --arg desc "$permission_description" \
222
+ '. + {tool: {name: $tn, normalized_name: $nn, input: $ti}, permission: {description: $desc}}')
223
+ else
224
+ event=$(echo "$event" | jq -c \
225
+ --arg tn "$tool_name" \
226
+ --arg nn "$tool_normalized_name" \
227
+ --argjson to "$tool_output" \
228
+ '. + {tool: {name: $tn, normalized_name: $nn, output: $to}}')
229
+ fi
230
+
231
+ echo "$event"
232
+ }
233
+
234
+ emit_delegation_event() {
235
+ local event="$1" event_type="$2" stdin_json="$3"
236
+ local tool_name tool_input
237
+ tool_name=$(echo "$stdin_json" | jq -r '.tool_name // ""')
238
+ tool_input=$(echo "$stdin_json" | jq -c '.tool_input // null')
239
+
240
+ if [[ "$tool_name" == "InvokeSubagents" && "$event_type" == "preToolUse" ]]; then
241
+ local targets
242
+ targets=$(echo "$tool_input" | jq -c '.targets // []')
243
+ if [[ "$targets" != "[]" ]]; then
244
+ local delegate_event
245
+ delegate_event=$(echo "$event" | jq -c \
246
+ --argjson targets "$targets" \
247
+ '.event_type = "agent.delegate" | . + {delegation: {targets: $targets}} | del(.tool)')
248
+ transport_emit "$delegate_event"
249
+ fi
250
+ elif [[ "$tool_name" == "spawn_agent" && "$event_type" == "preToolUse" ]]; then
251
+ local target
252
+ target=$(echo "$tool_input" | jq -r '.agent_type // "default"')
253
+ if [[ -n "$target" && "$target" != "null" ]]; then
254
+ local delegate_event
255
+ delegate_event=$(echo "$event" | jq -c \
256
+ --arg target "$target" \
257
+ '.event_type = "agent.delegate" | . + {delegation: {targets: [$target]}} | del(.tool)')
258
+ transport_emit "$delegate_event"
259
+ fi
260
+ elif [[ "$tool_name" == "use_subagent" || "$tool_name" == "subagent" || "$tool_name" == "delegate to a specialist agent" ]] && [[ "$event_type" == "preToolUse" ]]; then
261
+ local targets
262
+ targets=$(echo "$tool_input" | jq -c '
263
+ if (.targets? | type) == "array" then .targets
264
+ elif (.subagents? | type) == "array" then .subagents | map(.agent_name // .agent // .subagent_type // .name // "subagent")
265
+ elif (.content.subagents? | type) == "array" then .content.subagents | map(.agent_name // .agent // .subagent_type // .name // "subagent")
266
+ elif (.agent_name? // .agent? // .subagent_type? // empty) != "" then [(.agent_name // .agent // .subagent_type)]
267
+ else ["subagent"]
268
+ end
269
+ ')
270
+ if [[ "$targets" != "[]" ]]; then
271
+ local delegate_event
272
+ delegate_event=$(echo "$event" | jq -c \
273
+ --argjson targets "$targets" \
274
+ '.event_type = "agent.delegate" | . + {delegation: {targets: $targets}} | del(.tool)')
275
+ transport_emit "$delegate_event"
276
+ fi
277
+ elif [[ "$tool_name" == "Task" || "$tool_name" == "Agent" ]] && [[ "$event_type" == "preToolUse" ]]; then
278
+ local target
279
+ target=$(echo "$tool_input" | jq -r '.subagent_type // .agent_type // .agent // "general-purpose"')
280
+ if [[ -n "$target" && "$target" != "null" ]]; then
281
+ local delegate_event
282
+ delegate_event=$(echo "$event" | jq -c \
283
+ --arg target "$target" \
284
+ '.event_type = "agent.delegate" | . + {delegation: {targets: [$target]}} | del(.tool)')
285
+ transport_emit "$delegate_event"
286
+ fi
287
+ fi
288
+ }
289
+
290
+ add_tool_data_and_emit_delegation() {
291
+ local event="$1" event_type="$2" stdin_json="$3"
292
+ event=$(add_tool_event_data "$event" "$event_type" "$stdin_json")
293
+ emit_delegation_event "$event" "$event_type" "$stdin_json"
294
+ echo "$event"
295
+ }
296
+
297
+ add_stop_data_and_emit_usage() {
298
+ local event="$1" agent_name="$2"
299
+ local duration_s
300
+ duration_s=$(cat "${TELEMETRY_SESSION_DIR}/${session_id}.session" 2>/dev/null | jq -r '.duration_s // 0')
301
+ event=$(echo "$event" | jq -c \
302
+ --argjson ds "$duration_s" \
303
+ '. + {session: {duration_s: $ds}}')
304
+
305
+ if [[ "$TELEMETRY_USAGE_TRACKING" == "true" ]]; then
306
+ local model tool_count delegation_count
307
+ model=$(usage_get_model "$agent_name")
308
+ local full_log="${TELEMETRY_CHANNEL_FULL_LOG_FILE}"
309
+ tool_count=$(usage_count_tool_calls "$session_id" "$full_log")
310
+ delegation_count=$(usage_count_delegations "$session_id" "$full_log")
311
+
312
+ local usage_event
313
+ usage_event=$(echo "$event" | jq -c \
314
+ --arg m "$model" \
315
+ --argjson tc "$tool_count" \
316
+ --argjson dc "$delegation_count" \
317
+ '.event_type = "session.usage" | .event_id = (.event_id + "-usage") | . + {
318
+ usage: {model: $m, duration_s: .session.duration_s, tool_invocations: $tc, delegations: $dc, input_tokens: null, output_tokens: null, estimated_cost_usd: null}
319
+ }')
320
+ transport_emit "$usage_event"
321
+ fi
322
+
323
+ echo "$event"
324
+ }
325
+
326
+ add_event_specific_data() {
327
+ local event="$1" event_type="$2" agent_name="$3" stdin_json="$4"
328
+ case "$event_type" in
329
+ userPromptSubmit|UserPromptSubmit)
330
+ add_user_prompt_data "$event" "$stdin_json"
331
+ ;;
332
+ preToolUse|PreToolUse|permissionRequest|PermissionRequest|postToolUse|PostToolUse|PostToolUseFailure)
333
+ add_tool_data_and_emit_delegation "$event" "$event_type" "$stdin_json"
334
+ ;;
335
+ stop|Stop|SessionEnd)
336
+ add_stop_data_and_emit_usage "$event" "$agent_name"
337
+ ;;
338
+ *)
339
+ echo "$event"
340
+ ;;
341
+ esac
342
+ }
343
+
344
+ main() {
345
+ [[ "$TELEMETRY_ENABLED" != "true" ]] && return 0
346
+
347
+ local event_type="${1:-unknown}" agent_name="${2:-unknown}"
348
+ local stdin_json="${3:-}"
349
+ [[ -z "$stdin_json" ]] && stdin_json='{}'
350
+
351
+ session_id=$(telemetry_session_id "$event_type" "$agent_name")
352
+ local event
353
+ event=$(build_base_event "$session_id" "$(schema_event_type "$event_type")" "$agent_name")
354
+ event=$(add_hook_context "$event" "$event_type" "$stdin_json")
355
+ event=$(add_runtime_context "$event" "$event_type" "$stdin_json")
356
+ event=$(add_event_specific_data "$event" "$event_type" "$agent_name" "$stdin_json")
357
+
358
+ transport_emit "$event"
359
+
360
+ [[ "$event_type" == "stop" ]] && transport_maybe_rotate
361
+ }
362
+
363
+ # Capture stdin before backgrounding (background subshell gets /dev/null)
364
+ _stdin=$(cat)
365
+ if [[ "${FLOW_AGENTS_TELEMETRY_FOREGROUND:-false}" == "true" ]]; then
366
+ main "$@" "$_stdin"
367
+ else
368
+ (main "$@" "$_stdin") </dev/null &>/dev/null &
369
+ disown 2>/dev/null
370
+ fi
371
+
372
+ if [[ "${FLOW_AGENTS_TELEMETRY_RUNTIME:-kiro-cli}" == "codex" ]]; then
373
+ _hook_event_name=$(printf '%s' "$_stdin" | jq -r '.hook_event_name // ""' 2>/dev/null)
374
+ case "$_hook_event_name" in
375
+ SessionStart)
376
+ printf '{"continue":true,"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext":"Flow Agents telemetry hooks are active for this session."}}\n'
377
+ ;;
378
+ UserPromptSubmit)
379
+ printf '{"continue":true,"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":"Flow Agents telemetry captured this prompt."}}\n'
380
+ ;;
381
+ Stop)
382
+ printf '{"continue":true}\n'
383
+ ;;
384
+ esac
385
+ fi
386
+
387
+ exit 0
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import("../build/src/cli/usage-feedback.js").then(({ main }) => process.exit(main()));
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import("../build/src/cli/validate-hook-influence.js").then(({ main }) => process.exit(main(process.argv.slice(2))));
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env bash
2
+ # validate-package.sh — Validate an installed Flow Agents bundle
3
+ # Usage: bash validate-package.sh <package-prefix> [--local]
4
+ set -uo pipefail
5
+
6
+ PREFIX="${1:?Usage: validate-package.sh <package-prefix> [--local]}"
7
+ [[ "${2:-}" == "--local" ]] && PREFIX="local-${PREFIX}"
8
+
9
+ AGENTS_DIR="$HOME/.kiro/agents"
10
+ errors=0
11
+
12
+ echo "Package: ${PREFIX}"
13
+ echo ""
14
+
15
+ # Find agents
16
+ count=$(ls "$AGENTS_DIR/${PREFIX}-"*.json 2>/dev/null | wc -l | tr -d ' ')
17
+ echo "Agents: ${count} found"
18
+ [[ "$count" -eq 0 ]] && echo "✗ No agents found" && exit 1
19
+ echo ""
20
+
21
+ # 1. Well-formedness
22
+ spec_ok=0; spec_fail=0
23
+ for f in "$AGENTS_DIR/${PREFIX}-"*.json; do
24
+ name=$(jq -r '.name // empty' "$f")
25
+ has_all=$(jq -r 'if .name and .prompt and .model and .description then "yes" else "no" end' "$f")
26
+ if [[ "$has_all" != "yes" ]]; then
27
+ echo " ✗ $(basename $f): missing required field(s)"
28
+ spec_fail=$((spec_fail + 1))
29
+ elif ! echo "$name" | grep -qE '^[a-z][a-z0-9-]*$'; then
30
+ echo " ✗ $name: invalid name format"
31
+ spec_fail=$((spec_fail + 1))
32
+ else
33
+ spec_ok=$((spec_ok + 1))
34
+ fi
35
+ done
36
+ echo "$([ $spec_fail -eq 0 ] && echo ✓ || echo ✗) Agent specs: ${spec_ok}/${count} well-formed"
37
+ errors=$((errors + spec_fail))
38
+
39
+ # 2. Hook scripts
40
+ hook_total=0; hook_fail=0
41
+ for f in "$AGENTS_DIR/${PREFIX}-"*.json; do
42
+ name=$(jq -r '.name' "$f")
43
+ for cmd in $(jq -r '.hooks // {} | .[] | .[] | .command // empty' "$f" 2>/dev/null); do
44
+ : # jq gives full command, need line-by-line
45
+ done
46
+ jq -r '.hooks // {} | to_entries[] | .key as $t | .value[] | "\($t)|\(.command // empty)"' "$f" 2>/dev/null | while IFS='|' read -r htype cmd; do
47
+ [[ -z "$cmd" ]] && continue
48
+ script=$(echo "$cmd" | sed 's/^bash //' | awk '{print $1}')
49
+ script="${script/#\~/$HOME}"
50
+ if [[ ! -f "$script" ]]; then
51
+ echo " ✗ $name → $htype: $(basename $script) (not found)"
52
+ fi
53
+ done
54
+ done
55
+ hook_total=$(for f in "$AGENTS_DIR/${PREFIX}-"*.json; do jq '[.hooks // {} | .[] | .[]] | length' "$f" 2>/dev/null; done | awk '{s+=$1}END{print s}')
56
+ hook_fail=$(for f in "$AGENTS_DIR/${PREFIX}-"*.json; do
57
+ jq -r '.hooks // {} | .[] | .[] | .command // empty' "$f" 2>/dev/null | while read cmd; do
58
+ [[ -z "$cmd" ]] && continue
59
+ script=$(echo "$cmd" | sed 's/^bash //' | awk '{print $1}')
60
+ script="${script/#\~/$HOME}"
61
+ [[ ! -f "$script" ]] && echo "x"
62
+ done
63
+ done | wc -l | tr -d ' ')
64
+ hook_ok=$((hook_total - hook_fail))
65
+ echo "$([ $hook_fail -eq 0 ] && echo ✓ || echo ✗) Hook scripts: ${hook_ok}/${hook_total} resolved"
66
+ errors=$((errors + hook_fail))
67
+
68
+ # 3. Absolute resource paths
69
+ res_fail=0
70
+ for f in "$AGENTS_DIR/${PREFIX}-"*.json; do
71
+ name=$(jq -r '.name' "$f")
72
+ jq -r '.resources // [] | .[] | select(startswith("file://"))' "$f" 2>/dev/null | while read res; do
73
+ path="${res#file://}"
74
+ path="${path/#\~/$HOME}"
75
+ [[ "$path" == *"*"* || "$path" != /* ]] && continue
76
+ if [[ ! -f "$path" && ! -d "$path" ]]; then
77
+ echo " ✗ $name: missing $path"
78
+ fi
79
+ done
80
+ done
81
+ echo "✓ Resources: checked"
82
+
83
+ # 4. Summary
84
+ echo ""
85
+ if [[ $errors -eq 0 ]]; then
86
+ echo "Result: PASS"
87
+ else
88
+ echo "Result: FAIL ($errors error(s))"
89
+ fi
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import("node:child_process").then(({ spawnSync }) => {
3
+ const result = spawnSync("npm", ["run", "validate:source", "--silent", "--", ...process.argv.slice(2)], {
4
+ cwd: new URL("..", import.meta.url),
5
+ encoding: "utf8",
6
+ stdio: "inherit",
7
+ });
8
+ process.exit(result.status ?? 1);
9
+ });
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: agentic-engineering
3
+ description: "Eval-first execution, task decomposition, and cost-aware model routing for AI-driven development workflows."
4
+ ---
5
+
6
+ # Agentic Engineering
7
+
8
+ Principles for AI-driven development: eval-first loops, disciplined decomposition, and cost-aware model selection.
9
+
10
+ ## Eval-First Loop
11
+
12
+ Every implementation follows this cycle:
13
+
14
+ 1. **Define eval** — write the acceptance criteria as a runnable check (test, script, assertion)
15
+ 2. **Run baseline** — capture current behavior against the eval
16
+ 3. **Implement** — make the change
17
+ 4. **Re-run eval** — verify improvement
18
+ 5. **Check regressions** — run the full suite, not just the new eval
19
+
20
+ Never ship without steps 4-5. If you can't define an eval, the requirement isn't clear enough.
21
+
22
+ ## 15-Minute Unit Rule
23
+
24
+ Decompose every task into units where each:
25
+ - Is **independently verifiable** — has its own eval or test
26
+ - Has a **single dominant risk** — one thing that could go wrong
27
+ - Has a **clear done condition** — unambiguous pass/fail
28
+ - Takes **~15 minutes** of focused agent work
29
+
30
+ If a unit can't be verified independently, it's too coupled. If it has multiple risks, split it.
31
+
32
+ ## Model Routing
33
+
34
+ Match model tier to task complexity:
35
+
36
+ | Tier | Model class | Use for |
37
+ |------|-------------|---------|
38
+ | Fast | Haiku | Boilerplate, narrow edits, formatting, simple transforms |
39
+ | Standard | Sonnet | Implementation, refactors, test writing, code review |
40
+ | Reasoning | Opus | Architecture decisions, root-cause analysis, complex debugging |
41
+
42
+ ### Cost Discipline
43
+ - Start at the lowest tier that could work
44
+ - Escalate only when the lower tier fails with a **clear reasoning gap** (not just a wrong answer — a structural inability to solve the problem)
45
+ - Document the escalation reason: "Sonnet couldn't hold the full dependency graph → escalated to Opus"
46
+ - Never use Opus for tasks Sonnet handles correctly
47
+
48
+ ## Session Strategy
49
+
50
+ - **Continue** session for coupled units within the same phase
51
+ - **Fresh** session after phase transitions (plan → implement, implement → verify)
52
+ - **Compact** after milestones — summarize context, drop intermediate artifacts
53
+
54
+ ## Review Focus for AI-Generated Code
55
+
56
+ AI code passes syntax checks easily but fails on subtler dimensions. Prioritize reviewing:
57
+
58
+ - **Invariants** — are assumptions about state actually enforced?
59
+ - **Edge cases** — empty inputs, boundary values, concurrent access
60
+ - **Error boundaries** — does the error surface or get swallowed?
61
+ - **Security assumptions** — auth checks, input sanitization, secret handling
62
+ - **Hidden coupling** — does this change break something non-obvious elsewhere?
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: "browser-test"
3
+ description: "Headless browser automation via Playwright — screenshots, accessibility checks, form filling, UI testing, DOM inspection."
4
+ ---
5
+
6
+ # Browser Testing
7
+
8
+ Delegate browser automation and testing tasks to `tool-playwright` for real browser interaction — page loading, accessibility snapshots, form filling, screenshots, and user flow testing.
9
+
10
+ ## Trigger Patterns
11
+
12
+ This skill activates when the user:
13
+
14
+ - Wants to load a URL and inspect the page
15
+ - Wants to test a user flow (click, type, navigate)
16
+ - Wants to check accessibility (ARIA roles, tab order, snapshots)
17
+ - Wants a screenshot for visual verification
18
+ - Wants to fill forms or interact with UI elements
19
+ - Mentions Playwright, browser testing, or DOM inspection
20
+ - Needs to debug frontend behavior in a live browser
21
+
22
+ ## Workflow
23
+
24
+ ### Step 1: CLARIFY TARGET
25
+ Identify what the user wants tested — a URL, a local dev server, a specific flow. If a local server is needed and not running, tell the user to start it first and provide the URL.
26
+
27
+ ### Step 2: DELEGATE
28
+ Hand off to `tool-playwright` with a clear prompt describing:
29
+ - The URL to load
30
+ - What to inspect or test (accessibility, visual, flow)
31
+ - Any specific interactions (click X, fill Y, navigate to Z)
32
+
33
+ ### Step 3: REPORT
34
+ Relay `tool-playwright`'s findings back to the user. Highlight:
35
+ - Accessibility issues found via snapshots
36
+ - Visual anomalies from screenshots
37
+ - Flow failures or unexpected behavior
38
+ - Suggested fixes if applicable
39
+
40
+ ## NOT For
41
+
42
+ - General web search or fetching page content for research — use web search tools instead
43
+ - Scraping data from websites
44
+ - API testing — use curl or httpie directly
45
+
46
+ ## Key Principles
47
+
48
+ - ALWAYS delegate to `tool-playwright` — do not attempt browser interaction directly
49
+ - Prefer accessibility snapshots (`browser_snapshot`) over screenshots for understanding page structure
50
+ - If the user provides a localhost URL, confirm the dev server is running before delegating
51
+ - Close the browser when done