@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,56 @@
1
+ {
2
+ "allowedTools" : [ "read", "imageRead", "glob", "grep", "ls", "code", "shell" ],
3
+ "hooks" : {
4
+ "agentSpawn" : [ {
5
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh agentSpawn tool-security-reviewer",
6
+ "timeout_ms" : 5000
7
+ } ],
8
+ "postToolUse" : [ {
9
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh postToolUse tool-security-reviewer",
10
+ "matcher" : "*",
11
+ "timeout_ms" : 3000
12
+ }, {
13
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js post:edit:accumulator post-edit-accumulator.js standard,strict",
14
+ "matcher" : "fs_write",
15
+ "timeout_ms" : 5000
16
+ }, {
17
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js post:quality-gate quality-gate.js strict",
18
+ "matcher" : "fs_write",
19
+ "timeout_ms" : 15000
20
+ } ],
21
+ "preToolUse" : [ {
22
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh preToolUse tool-security-reviewer",
23
+ "matcher" : "*",
24
+ "timeout_ms" : 3000
25
+ }, {
26
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js pre:config-protection config-protection.js standard,strict",
27
+ "matcher" : "fs_write",
28
+ "timeout_ms" : 5000
29
+ }, {
30
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js pre:commit-quality pre-commit-quality.js standard,strict",
31
+ "matcher" : "execute_bash",
32
+ "timeout_ms" : 30000
33
+ }, {
34
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js pre:report-only-guard report-only-guard.js standard,strict",
35
+ "matcher" : "fs_write",
36
+ "timeout_ms" : 3000
37
+ } ],
38
+ "stop" : [ {
39
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh stop tool-security-reviewer",
40
+ "timeout_ms" : 5000
41
+ }, {
42
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js stop:format-typecheck stop-format-typecheck.js standard,strict",
43
+ "timeout_ms" : 300000
44
+ } ],
45
+ "userPromptSubmit" : [ {
46
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh userPromptSubmit tool-security-reviewer",
47
+ "timeout_ms" : 5000
48
+ } ]
49
+ },
50
+ "resources" : [ "file://AGENTS.md", "file://.kiro/steering/**/*.md", "file://~/.kiro/steering/**/*.md", "file://~/.flow-agents/context/*.md" ],
51
+ "tools" : [ "read", "imageRead", "glob", "grep", "ls", "code", "shell" ],
52
+ "name" : "tool-security-reviewer",
53
+ "description" : "Delegate to me for security analysis. Checks OWASP Top 10, secrets detection, input validation, injection vulnerabilities, auth/authz, and rate limiting. Read-only analysis with shell for scanning tools.",
54
+ "prompt" : "You are a security reviewer. You analyze source code for vulnerabilities and produce a structured security report.\n\n## Input\nYou receive:\n- A list of files to review\n- Optional focus area (auth, input handling, DB, etc.)\n\n## Security Checklist\n\nFor each file, check:\n- **Hardcoded secrets**: API keys, tokens, passwords, connection strings, private keys\n- **SQL injection**: string concatenation in queries, missing parameterization\n- **XSS**: unescaped user input in HTML/templates, innerHTML usage\n- **CSRF**: missing CSRF tokens on state-changing endpoints\n- **Path traversal**: user input in file paths without sanitization\n- **Auth bypasses**: missing auth checks, broken access control, privilege escalation\n- **Rate limiting**: unprotected endpoints susceptible to abuse\n- **Error leakage**: stack traces, internal paths, or system info in error responses\n- **Dependency vulnerabilities**: run npm audit / pip-audit / cargo audit if available\n\n## OWASP Top 10 Mapping\n\nTag each finding with its OWASP category:\n- A01: Broken Access Control\n- A02: Cryptographic Failures\n- A03: Injection\n- A04: Insecure Design\n- A05: Security Misconfiguration\n- A06: Vulnerable Components\n- A07: Auth Failures\n- A08: Data Integrity Failures\n- A09: Logging Failures\n- A10: SSRF\n\n## Trigger Conditions\n\nPrioritize review of code involving:\n- Authentication or authorization logic\n- User input handling (forms, query params, headers)\n- Database queries\n- File system operations\n- External API calls\n- Cryptographic operations\n- Payment or financial code\n\n## Secret Patterns\n\nScan for common patterns:\n- `AKIA[0-9A-Z]{16}` (AWS access keys)\n- `-----BEGIN (RSA |EC )?PRIVATE KEY-----`\n- `(password|secret|token|api_key)\\s*[:=]\\s*['\"][^'\"]+['\"]`\n- Base64-encoded strings >40 chars in assignments\n\n## Output\n\nReturn a structured security report:\n```markdown\n## Security Review\n\nFiles analyzed: <count>\nFindings: <count by severity>\n\n### Findings\n\n#### [CRITICAL/HIGH/MEDIUM/LOW] <OWASP-ID> — <file>:<line> — <title>\n<description with evidence>\n**Remediation:** <specific fix>\n\n### Summary\n<overall assessment>\n```\n\n## Rules\n- No false positives without evidence. Show the vulnerable code.\n- Run dependency audit tools if available (npm audit, pip-audit, cargo audit).\n- If no security issues found, say so clearly — don't invent findings.\n- This is read-only analysis. Do not modify any files.",
55
+ "model" : "claude-sonnet-4.6-1m"
56
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "allowedTools" : [ "read", "imageRead", "glob", "grep", "ls", "code", "shell", "write" ],
3
+ "hooks" : {
4
+ "agentSpawn" : [ {
5
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh agentSpawn tool-verifier",
6
+ "timeout_ms" : 5000
7
+ } ],
8
+ "postToolUse" : [ {
9
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh postToolUse tool-verifier",
10
+ "matcher" : "*",
11
+ "timeout_ms" : 3000
12
+ }, {
13
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js post:edit:accumulator post-edit-accumulator.js standard,strict",
14
+ "matcher" : "fs_write",
15
+ "timeout_ms" : 5000
16
+ }, {
17
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js post:quality-gate quality-gate.js strict",
18
+ "matcher" : "fs_write",
19
+ "timeout_ms" : 15000
20
+ } ],
21
+ "preToolUse" : [ {
22
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh preToolUse tool-verifier",
23
+ "matcher" : "*",
24
+ "timeout_ms" : 3000
25
+ }, {
26
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js pre:config-protection config-protection.js standard,strict",
27
+ "matcher" : "fs_write",
28
+ "timeout_ms" : 5000
29
+ }, {
30
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js pre:commit-quality pre-commit-quality.js standard,strict",
31
+ "matcher" : "execute_bash",
32
+ "timeout_ms" : 30000
33
+ }, {
34
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js pre:report-only-guard report-only-guard.js standard,strict",
35
+ "matcher" : "fs_write",
36
+ "timeout_ms" : 3000
37
+ } ],
38
+ "stop" : [ {
39
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh stop tool-verifier",
40
+ "timeout_ms" : 5000
41
+ }, {
42
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js stop:format-typecheck stop-format-typecheck.js standard,strict",
43
+ "timeout_ms" : 300000
44
+ } ],
45
+ "userPromptSubmit" : [ {
46
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh userPromptSubmit tool-verifier",
47
+ "timeout_ms" : 5000
48
+ } ]
49
+ },
50
+ "resources" : [ "file://AGENTS.md", "file://docs/context-map.md", "file://.kiro/steering/**/*.md", "file://~/.kiro/steering/**/*.md", "file://~/.flow-agents/context/*.md", "file://~/.flow-agents/context/contracts/*.md", "file://~/.flow-agents/schemas/*.json" ],
51
+ "tools" : [ "read", "imageRead", "glob", "grep", "ls", "code", "shell", "write" ],
52
+ "toolsSettings" : {
53
+ "write" : {
54
+ "allowedPaths" : [ ".flow-agents/**/*" ]
55
+ }
56
+ },
57
+ "name" : "tool-verifier",
58
+ "description" : "Delegate to me for implementation verification. Read-only + shell for source code; writes review/evidence artifacts under .flow-agents. Verifies acceptance criteria and produces PASS/FAIL/NOT_VERIFIED verdicts with evidence. No production file modifications.",
59
+ "prompt" : "You are a verification auditor. You review implementation against a plan and produce structured verdicts.\n\n## Shared Contracts\nFollow `context/contracts/artifact-contract.md` and `context/contracts/verification-contract.md`. Those contracts are the source of truth for report-only behavior, verification phases, verdicts, review artifact format, structured evidence sidecars, evidence requirements, Goal Fit checks, and NOT_VERIFIED handling.\n\n## Input\nYou receive acceptance criteria, modified files, verification commands, and usually a todo_file path for the orchestrator's session artifact. If no todo_file is provided, run standalone verification against the current working directory and return the full report directly.\n\n## Process\n1. Read `docs/context-map.md` when it exists, then detect the project type and relevant build, type, lint, test, security, and diff-review checks.\n2. Run the checks that are available and relevant.\n3. Map every acceptance criterion to PASS, FAIL, or NOT_VERIFIED with evidence.\n4. Check Goal Fit when a Definition Of Done or user-facing outcome is available.\n5. Write a review artifact beside the session artifact when a todo_file is provided.\n6. When a todo_file is provided, create or update `evidence.json`, `acceptance.json`, and `state.json` beside the workflow artifact using the schemas under `schemas/`.\n7. Return the full report and sidecar paths to the orchestrator.\n\n## Rules\n- Report only. Do not modify source files, apply format fixes, lint autofixes, or patches.\n- Evidence is mandatory for PASS.\n- NOT_VERIFIED means evidence could not be collected; include the reason.\n- `evidence.json` must include normalized checks, a lowercase verdict, and any not_verified_gaps.\n- `acceptance.json` must map every criterion to pass, fail, not_verified, or accepted_gap.\n- If a command fails, capture the actual error output.\n- A technically green build is not enough for PASS when the user-facing Definition Of Done is unmet.",
60
+ "model" : "claude-sonnet-4.6-1m"
61
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "allowedTools" : [ "@builtin" ],
3
+ "hooks" : {
4
+ "agentSpawn" : [ {
5
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh agentSpawn tool-worker",
6
+ "timeout_ms" : 5000
7
+ } ],
8
+ "postToolUse" : [ {
9
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh postToolUse tool-worker",
10
+ "matcher" : "*",
11
+ "timeout_ms" : 3000
12
+ }, {
13
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js post:edit:accumulator post-edit-accumulator.js standard,strict",
14
+ "matcher" : "fs_write",
15
+ "timeout_ms" : 5000
16
+ }, {
17
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js post:quality-gate quality-gate.js strict",
18
+ "matcher" : "fs_write",
19
+ "timeout_ms" : 15000
20
+ } ],
21
+ "preToolUse" : [ {
22
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh preToolUse tool-worker",
23
+ "matcher" : "*",
24
+ "timeout_ms" : 3000
25
+ }, {
26
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js pre:config-protection config-protection.js standard,strict",
27
+ "matcher" : "fs_write",
28
+ "timeout_ms" : 5000
29
+ }, {
30
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js pre:commit-quality pre-commit-quality.js standard,strict",
31
+ "matcher" : "execute_bash",
32
+ "timeout_ms" : 30000
33
+ } ],
34
+ "stop" : [ {
35
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh stop tool-worker",
36
+ "timeout_ms" : 5000
37
+ }, {
38
+ "command" : "node ~/.flow-agents/scripts/hooks/run-hook.js stop:format-typecheck stop-format-typecheck.js standard,strict",
39
+ "timeout_ms" : 300000
40
+ } ],
41
+ "userPromptSubmit" : [ {
42
+ "command" : "bash ~/.flow-agents/scripts/telemetry/telemetry.sh userPromptSubmit tool-worker",
43
+ "timeout_ms" : 5000
44
+ } ]
45
+ },
46
+ "resources" : [ "file://AGENTS.md", "file://docs/context-map.md", "file://.kiro/steering/**/*.md", "file://~/.kiro/steering/**/*.md", "file://~/.flow-agents/context/common/subagents.md", "file://~/.flow-agents/context/contracts/*.md" ],
47
+ "tools" : [ "@builtin" ],
48
+ "toolsSettings" : {
49
+ "shell" : {
50
+ "allowedPaths" : [ ],
51
+ "autoAllowReadonly" : true
52
+ }
53
+ },
54
+ "name" : "tool-worker",
55
+ "description" : "Delegate to me for writing and developing source code for a project. Works best when a detailed plan can be provided. NO access to web tools. Can be used in parallel for any coding tasks that require trusted access to the write and shell tools. WARNING: May spawn a `git worktree`",
56
+ "prompt" : "You are an autonomous coding worker. You execute well-defined tasks without human interaction. If instructions are insufficient, stop and report the blocker clearly.\n\n## Shared Contracts\nFollow `context/contracts/artifact-contract.md` and `context/contracts/execution-contract.md`. Those contracts are the source of truth for task artifacts, modified file tracking, conflict checks, parallel wave behavior, validation expectations, and completion rules.\n\n## Input\nYou receive a task from an approved plan, including files, changes, acceptance criteria, Definition Of Done items, context, and usually the plan artifact path.\n\n## Workflow\n1. Read `docs/context-map.md` when it exists, then check existing workflow artifacts for overlapping work and modified file conflicts.\n2. Validate that the task has clear scope, expected behavior, files, and acceptance criteria.\n3. Implement using existing project patterns and the smallest change that satisfies the plan.\n4. Update task/session artifacts with modified files and progress.\n5. Run relevant validation for changed areas.\n6. Report what changed, which files changed, what validation ran, and any blockers or deferred gaps.\n\n## Rules\n- Do not revert unrelated user or agent changes.\n- Do not invent speculative features or silent fallbacks.\n- If another in-progress task blocks this work, report it instead of forcing through.\n- If validation fails because of your changes, fix and re-run validation before reporting complete.\n- If validation cannot be run, report it as NOT_VERIFIED with the reason.",
57
+ "model" : "claude-sonnet-4.6-1m"
58
+ }
@@ -0,0 +1,123 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { flagBool, flagString, parseArgs } from "../lib/args.js";
4
+ import { buildWorkflowLearningProjection, readWorkflowLearningSources } from "../lib/workflow-learning-projection.js";
5
+ const SAFE_SEGMENT = /^[A-Za-z0-9._-]+$/;
6
+ function printHelp() {
7
+ console.log("Usage: flow-agents console-learning-projection [options]");
8
+ console.log("");
9
+ console.log("Build an inert Console learning projection from local workflow learning sidecars.");
10
+ console.log("");
11
+ console.log("Options:");
12
+ console.log(" --artifact-root <path> Workflow artifact root to scan (default: .flow-agents)");
13
+ console.log(" --kontour-root <path> Local Kontour root to write under (default: .kontour)");
14
+ console.log(" --scope <id> Projection scope id (default: current directory name)");
15
+ console.log(" --scope-kind <kind> Projection scope kind (default: repo)");
16
+ console.log(" --producer <id> Projection producer id (default: flow-agents-learning)");
17
+ console.log(" --generated-at <ISO> Override generated timestamp for deterministic output");
18
+ console.log(" --dry-run Do not write a projection file");
19
+ console.log(" --json Print stable JSON summary");
20
+ console.log(" --help Show this help");
21
+ }
22
+ function defaultScopeId() {
23
+ return path.basename(process.cwd()) || "local";
24
+ }
25
+ function requireSafeSegment(value, label) {
26
+ if (!SAFE_SEGMENT.test(value)) {
27
+ throw new Error(`${label} must contain only letters, numbers, dot, underscore, or hyphen: ${value}`);
28
+ }
29
+ return value;
30
+ }
31
+ function ensureNoSymlinkPath(target) {
32
+ const resolved = path.resolve(target);
33
+ const root = path.parse(resolved).root;
34
+ const parts = path.relative(root, resolved).split(path.sep).filter(Boolean);
35
+ let cursor = root;
36
+ for (const part of parts) {
37
+ cursor = path.join(cursor, part);
38
+ if (fs.existsSync(cursor) && fs.lstatSync(cursor).isSymbolicLink()) {
39
+ throw new Error(`refusing to write through symlink path: ${cursor}`);
40
+ }
41
+ }
42
+ }
43
+ function ensureDirectory(target) {
44
+ ensureNoSymlinkPath(target);
45
+ fs.mkdirSync(target, { recursive: true });
46
+ ensureNoSymlinkPath(target);
47
+ const stat = fs.statSync(target);
48
+ if (!stat.isDirectory())
49
+ throw new Error(`destination directory is not a directory: ${target}`);
50
+ }
51
+ function containedPath(root, destination) {
52
+ const relative = path.relative(root, destination);
53
+ if (relative === "" || relative.startsWith("..") || path.isAbsolute(relative)) {
54
+ throw new Error(`destination escapes kontour root: ${destination}`);
55
+ }
56
+ }
57
+ function destinationPath(kontourRoot, producer, scopeKind, scopeId) {
58
+ const root = path.resolve(kontourRoot);
59
+ const destination = path.resolve(root, "projections", producer, `${scopeKind}-${scopeId}.json`);
60
+ containedPath(root, destination);
61
+ return destination;
62
+ }
63
+ function writeProjection(file, root, projection) {
64
+ containedPath(root, file);
65
+ ensureDirectory(path.dirname(file));
66
+ if (fs.existsSync(file) && fs.lstatSync(file).isSymbolicLink()) {
67
+ throw new Error(`refusing to write symlinked projection file: ${file}`);
68
+ }
69
+ fs.writeFileSync(file, `${JSON.stringify(projection, null, 2)}\n`, "utf8");
70
+ }
71
+ function printText(summary) {
72
+ console.log(`Scanned learning files: ${summary.scanned_learning_file_count}`);
73
+ console.log(`Emitted learnings: ${summary.emitted_learning_count}`);
74
+ if (summary.dry_run)
75
+ console.log("Dry run: no projection written");
76
+ else
77
+ console.log(`Projection: ${summary.destination}`);
78
+ }
79
+ export function main(argv = process.argv.slice(2)) {
80
+ const { flags } = parseArgs(argv);
81
+ if (flagBool(flags, "help") || flagBool(flags, "h")) {
82
+ printHelp();
83
+ return 0;
84
+ }
85
+ try {
86
+ const artifactRoot = path.resolve(flagString(flags, "artifact-root", ".flow-agents") ?? ".flow-agents");
87
+ const kontourRoot = path.resolve(flagString(flags, "kontour-root", ".kontour") ?? ".kontour");
88
+ const producer = requireSafeSegment(flagString(flags, "producer", "flow-agents-learning") ?? "flow-agents-learning", "--producer");
89
+ const scope = {
90
+ kind: requireSafeSegment(flagString(flags, "scope-kind", "repo") ?? "repo", "--scope-kind"),
91
+ id: requireSafeSegment(flagString(flags, "scope", defaultScopeId()) ?? defaultScopeId(), "--scope"),
92
+ };
93
+ const dryRun = flagBool(flags, "dry-run");
94
+ const sources = readWorkflowLearningSources(artifactRoot);
95
+ const projection = buildWorkflowLearningProjection(sources, {
96
+ scope,
97
+ producer: { id: producer, product: "flow-agents" },
98
+ generatedAt: flagString(flags, "generated-at"),
99
+ });
100
+ const destination = dryRun ? null : destinationPath(kontourRoot, producer, scope.kind, scope.id);
101
+ if (destination)
102
+ writeProjection(destination, kontourRoot, projection);
103
+ const summary = {
104
+ scanned_learning_file_count: sources.length,
105
+ emitted_learning_count: projection.learnings.length,
106
+ destination,
107
+ producer,
108
+ scope,
109
+ dry_run: dryRun,
110
+ };
111
+ if (flagBool(flags, "json"))
112
+ console.log(JSON.stringify(summary, null, 2));
113
+ else
114
+ printText(summary);
115
+ return 0;
116
+ }
117
+ catch (error) {
118
+ console.error(`console-learning-projection: ${error instanceof Error ? error.message : String(error)}`);
119
+ return 1;
120
+ }
121
+ }
122
+ if (import.meta.url === `file://${process.argv[1]}`)
123
+ process.exit(main());
@@ -0,0 +1,39 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ function esc(value) {
4
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
5
+ }
6
+ function titleFor(file, text) {
7
+ return text.match(/^title:\s*(.+)$/m)?.[1].trim() ?? text.split(/\r?\n/).find((line) => line.startsWith("# "))?.slice(2).trim() ?? path.basename(file, ".md").replace(/-/g, " ");
8
+ }
9
+ function render(text) {
10
+ return text.replace(/^---\n.*?\n---\n/s, "").split(/\r?\n/).map((line) => {
11
+ if (line.startsWith("# "))
12
+ return `<h1>${esc(line.slice(2).trim())}</h1>`;
13
+ if (line.startsWith("## "))
14
+ return `<h2>${esc(line.slice(3).trim())}</h2>`;
15
+ if (line.startsWith("- "))
16
+ return `<li>${esc(line.slice(2).trim())}</li>`;
17
+ return line.trim() ? `<p>${esc(line.trim())}</p>` : "";
18
+ }).join("\n");
19
+ }
20
+ export function main() {
21
+ const root = path.resolve(path.dirname(process.argv[1]), "..");
22
+ const docs = path.join(root, "docs");
23
+ const out = path.join(root, "_site");
24
+ fs.rmSync(out, { recursive: true, force: true });
25
+ fs.mkdirSync(out, { recursive: true });
26
+ const assets = path.join(docs, "assets");
27
+ if (fs.existsSync(assets))
28
+ fs.cpSync(assets, path.join(out, "assets"), { recursive: true });
29
+ for (const file of fs.readdirSync(docs).filter((name) => name.endsWith(".md")).sort()) {
30
+ const source = path.join(docs, file);
31
+ const text = fs.readFileSync(source, "utf8");
32
+ const title = titleFor(file, text);
33
+ fs.writeFileSync(path.join(out, `${path.basename(file, ".md")}.html`), `<!doctype html><html><head><meta charset="utf-8"><title>${esc(title)}</title><link rel="stylesheet" href="assets/site.css"></head><body>${render(text)}<script src="assets/site.js" defer></script></body></html>`, "utf8");
34
+ }
35
+ console.log(`Built local docs preview: ${out}`);
36
+ return 0;
37
+ }
38
+ if (import.meta.url === `file://${process.argv[1]}`)
39
+ process.exit(main());
@@ -0,0 +1,102 @@
1
+ import * as child_process from "node:child_process";
2
+ import * as fs from "node:fs";
3
+ import * as os from "node:os";
4
+ import * as path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { parseArgs, flagString, flagBool } from "../lib/args.js";
7
+ import { readJson } from "../lib/fs.js";
8
+ const PROJECT_SETTINGS_RELATIVE_PATH = path.join("context", "settings", "backlog-provider-settings.json");
9
+ function loadSettings(file) {
10
+ if (!fs.existsSync(file))
11
+ return null;
12
+ const data = readJson(file);
13
+ if (data.schema_version !== "1.0")
14
+ throw new Error(`${file}: unsupported schema_version ${String(data.schema_version)}`);
15
+ return data;
16
+ }
17
+ function repoFromText(text) {
18
+ const match = text.trim().match(/github\.com[:/]([^/]+)\/([^/.]+)(?:\.git)?$/);
19
+ return match ? { owner: match[1], name: match[2] } : null;
20
+ }
21
+ function currentRepo(repoPath) {
22
+ try {
23
+ const out = child_process.execFileSync("git", ["-C", repoPath, "remote", "get-url", "origin"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
24
+ const repo = repoFromText(out);
25
+ if (repo)
26
+ return repo;
27
+ }
28
+ catch { }
29
+ const packagePath = path.join(repoPath, "package.json");
30
+ if (fs.existsSync(packagePath)) {
31
+ const data = readJson(packagePath);
32
+ const repository = data.repository;
33
+ const url = typeof repository === "object" && repository !== null ? repository.url : repository;
34
+ if (typeof url === "string")
35
+ return repoFromText(url);
36
+ }
37
+ return null;
38
+ }
39
+ function merge(base, override) {
40
+ if (!base && !override)
41
+ return null;
42
+ if (!base)
43
+ return structuredClone(override);
44
+ if (!override)
45
+ return structuredClone(base);
46
+ const out = structuredClone(base);
47
+ for (const [key, value] of Object.entries(override)) {
48
+ out[key] = typeof value === "object" && value !== null && typeof out[key] === "object" && out[key] !== null && !Array.isArray(value)
49
+ ? merge(out[key], value)
50
+ : structuredClone(value);
51
+ }
52
+ return out;
53
+ }
54
+ function findProject(settings, repo) {
55
+ const projects = settings?.projects;
56
+ if (!Array.isArray(projects))
57
+ return null;
58
+ return projects.find((project) => {
59
+ const projectRepo = (project.project?.repo ?? {});
60
+ return projectRepo.owner === repo.owner && projectRepo.name === repo.name;
61
+ }) ?? null;
62
+ }
63
+ function defaultProjectSettingsPath() {
64
+ let cursor = path.dirname(fileURLToPath(import.meta.url));
65
+ while (true) {
66
+ const candidate = path.join(cursor, PROJECT_SETTINGS_RELATIVE_PATH);
67
+ if (fs.existsSync(candidate))
68
+ return candidate;
69
+ const parent = path.dirname(cursor);
70
+ if (parent === cursor)
71
+ return path.resolve(PROJECT_SETTINGS_RELATIVE_PATH);
72
+ cursor = parent;
73
+ }
74
+ }
75
+ function effective(repoPath, projectSettings, globalSettings) {
76
+ const repo = currentRepo(repoPath);
77
+ const projectDoc = loadSettings(projectSettings);
78
+ const globalDoc = loadSettings(globalSettings);
79
+ if (!repo)
80
+ return [{ status: "ask_user", reason: "could_not_identify_current_repo", message: "Ask the user which backlog WorkItemProvider and BoardProvider to use for this workspace.", resolution: { project_settings_path: projectSettings, global_settings_path: globalSettings } }, 2];
81
+ const effectiveSettings = merge(merge(merge(globalDoc?.defaults, findProject(globalDoc, repo)), projectDoc?.defaults), findProject(projectDoc, repo));
82
+ if (!effectiveSettings)
83
+ return [{ status: "ask_user", reason: "no_backlog_provider_settings", message: "Ask the user which backlog WorkItemProvider and BoardProvider to use before selecting work.", current_repo: repo, resolution: { project_settings_path: projectSettings, global_settings_path: globalSettings, checked: ["project", "global"] } }, 2];
84
+ return [{ status: "configured", current_repo: repo, source: findProject(projectDoc, repo) || projectDoc?.defaults ? "project" : "global", precedence: ["project.projects match", "project.defaults", "global.projects match", "global.defaults"], settings: effectiveSettings }, 0];
85
+ }
86
+ export function main(argv = process.argv.slice(2)) {
87
+ const args = parseArgs(argv);
88
+ try {
89
+ const [result, code] = effective(path.resolve(flagString(args.flags, "repo-path", ".") ?? "."), path.resolve(flagString(args.flags, "project-settings", defaultProjectSettingsPath()) ?? ""), path.resolve(flagString(args.flags, "global-settings", path.join(os.homedir(), ".config", "flow-agents", "backlog-provider-settings.json")) ?? ""));
90
+ if (flagBool(args.flags, "json"))
91
+ console.log(JSON.stringify(result, null, 2));
92
+ else
93
+ console.log(`status: ${String(result.status)}`);
94
+ return code;
95
+ }
96
+ catch (error) {
97
+ console.error(`error: ${error.message}`);
98
+ return 1;
99
+ }
100
+ }
101
+ if (import.meta.url === `file://${process.argv[1]}`)
102
+ process.exit(main());
@@ -0,0 +1,38 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ function esc(value) {
5
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
6
+ }
7
+ export function main(argv = process.argv.slice(2)) {
8
+ if (argv.length < 1) {
9
+ console.log("Usage: export-bookmarks <bookmarks.md> [output.html]");
10
+ return 1;
11
+ }
12
+ const input = argv[0];
13
+ const output = argv[1] ?? path.join(os.homedir(), "Downloads", "bookmarks_organized.html");
14
+ if (!fs.existsSync(input)) {
15
+ console.log(`Error: ${input} not found`);
16
+ return 1;
17
+ }
18
+ const links = Array.from(fs.readFileSync(input, "utf8").matchAll(/^- \*\*[\d-]+\*\* \[(\w+)\]: (.+?) — (https?:\/\/\S+)(?: — (.+))?$/gm), (m) => ({ tag: m[1], title: m[2], url: m[3] }));
19
+ const timestamp = Math.floor(Date.now() / 1000);
20
+ const byTag = new Map();
21
+ for (const link of links)
22
+ byTag.set(link.tag, [...(byTag.get(link.tag) ?? []), link]);
23
+ const lines = ["<!DOCTYPE NETSCAPE-Bookmark-file-1>", '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">', "<TITLE>Bookmarks</TITLE>", "<H1>Bookmarks</H1>", "<DL><p>"];
24
+ for (const tag of Array.from(byTag.keys()).sort()) {
25
+ lines.push(` <DT><H3 ADD_DATE="${timestamp}" LAST_MODIFIED="${timestamp}">${esc(tag)}</H3>`, " <DL><p>");
26
+ for (const link of (byTag.get(tag) ?? []).sort((a, b) => a.title.localeCompare(b.title)))
27
+ lines.push(` <DT><A HREF="${esc(link.url)}" ADD_DATE="${timestamp}">${esc(link.title)}</A>`);
28
+ lines.push(" </DL><p>");
29
+ }
30
+ lines.push("</DL><p>");
31
+ fs.writeFileSync(output, lines.join("\n"), "utf8");
32
+ console.log("Bookmarks exported");
33
+ console.log(`Source: ${input} (${links.length} links)`);
34
+ console.log(`Output: ${output}`);
35
+ return 0;
36
+ }
37
+ if (import.meta.url === `file://${process.argv[1]}`)
38
+ process.exit(main());
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env node
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ const root = path.resolve(".");
5
+ const fixtureRoot = "evals/fixtures";
6
+ const ownerScanRoots = ["evals/static", "evals/integration", "scripts"];
7
+ const textExtensions = new Set([".md", ".yaml", ".yml", ".json", ".sh", ".js", ".ts"]);
8
+ const selfAuditRefs = new Set([
9
+ "evals/integration/test_fixture_retirement_audit.sh",
10
+ ]);
11
+ function printHelp() {
12
+ console.log("Usage: flow-agents fixture-retirement-audit [--json]");
13
+ console.log("");
14
+ console.log("Read-only audit for canonical eval fixture retirement candidates.");
15
+ console.log("");
16
+ console.log("A fixture group is kept when docs/fixture-ownership.md lists existing");
17
+ console.log("owners and at least one live eval/script reference still points at it.");
18
+ console.log("The command never deletes, archives, or rewrites fixtures.");
19
+ }
20
+ function readText(file) {
21
+ return fs.readFileSync(path.join(root, file), "utf8");
22
+ }
23
+ function walkFiles(dir) {
24
+ const abs = path.join(root, dir);
25
+ if (!fs.existsSync(abs))
26
+ return [];
27
+ const out = [];
28
+ for (const entry of fs.readdirSync(abs, { withFileTypes: true })) {
29
+ const full = path.join(abs, entry.name);
30
+ if (entry.isDirectory())
31
+ out.push(...walkFiles(path.relative(root, full).split(path.sep).join("/")));
32
+ else if (entry.isFile())
33
+ out.push(path.relative(root, full).split(path.sep).join("/"));
34
+ }
35
+ return out;
36
+ }
37
+ function fixtureDirs() {
38
+ const abs = path.join(root, fixtureRoot);
39
+ return fs.readdirSync(abs, { withFileTypes: true })
40
+ .filter((entry) => entry.isDirectory())
41
+ .map((entry) => `${fixtureRoot}/${entry.name}`)
42
+ .sort();
43
+ }
44
+ function ownerInventory() {
45
+ const doc = readText("docs/fixture-ownership.md");
46
+ const rows = new Map();
47
+ for (const line of doc.split(/\r?\n/)) {
48
+ if (!line.startsWith("| `evals/fixtures/"))
49
+ continue;
50
+ const cells = line.split("|").map((cell) => cell.trim());
51
+ const fixture = cells[1]?.replace(/^`|`$/g, "");
52
+ const ownersCell = cells[3] ?? "";
53
+ if (!fixture)
54
+ continue;
55
+ const owners = [...ownersCell.matchAll(/`([^`]+)`/g)].map((match) => match[1]).sort();
56
+ rows.set(fixture, owners);
57
+ }
58
+ return rows;
59
+ }
60
+ function scanFiles() {
61
+ return ownerScanRoots
62
+ .flatMap((dir) => walkFiles(dir))
63
+ .filter((file) => textExtensions.has(path.extname(file)))
64
+ .sort();
65
+ }
66
+ function audit() {
67
+ const inventory = ownerInventory();
68
+ const files = scanFiles();
69
+ const fixtures = fixtureDirs().map((fixture) => {
70
+ const owners = inventory.get(fixture) ?? [];
71
+ const directRefs = files
72
+ .filter((file) => readText(file).includes(fixture))
73
+ .filter((file) => !file.startsWith(`${fixture}/`))
74
+ .filter((file) => !selfAuditRefs.has(file))
75
+ .sort();
76
+ const reasons = [];
77
+ if (!inventory.has(fixture))
78
+ reasons.push("missing from docs/fixture-ownership.md");
79
+ const missingOwners = owners.filter((owner) => !fs.existsSync(path.join(root, owner)));
80
+ if (missingOwners.length)
81
+ reasons.push(`owner path missing: ${missingOwners.join(", ")}`);
82
+ if (!owners.length)
83
+ reasons.push("no owners listed");
84
+ if (!directRefs.length)
85
+ reasons.push("no direct eval/script references");
86
+ const unlistedRefs = directRefs.filter((ref) => !owners.includes(ref));
87
+ if (unlistedRefs.length)
88
+ reasons.push(`direct references not listed as owners: ${unlistedRefs.join(", ")}`);
89
+ return {
90
+ fixture,
91
+ classification: reasons.length ? "retire_candidate" : "kept",
92
+ owners,
93
+ direct_refs: directRefs,
94
+ reasons: reasons.length ? reasons : ["owned fixture with live eval/script references"],
95
+ };
96
+ });
97
+ return {
98
+ fixture_root: path.join(root, fixtureRoot),
99
+ totals: {
100
+ scanned: fixtures.length,
101
+ kept: fixtures.filter((item) => item.classification === "kept").length,
102
+ retire_candidates: fixtures.filter((item) => item.classification === "retire_candidate").length,
103
+ },
104
+ fixtures,
105
+ };
106
+ }
107
+ function printText(result) {
108
+ console.log("Fixture retirement audit (dry run, read-only)");
109
+ console.log(`Fixture root: ${result.fixture_root}`);
110
+ console.log(`Scanned fixture groups: ${result.totals.scanned}`);
111
+ console.log(`Kept: ${result.totals.kept}`);
112
+ console.log(`Retire candidates: ${result.totals.retire_candidates}`);
113
+ for (const item of result.fixtures) {
114
+ console.log(`- ${item.classification}: ${item.fixture}`);
115
+ console.log(` owners: ${item.owners.join(", ") || "none"}`);
116
+ console.log(` direct_refs: ${item.direct_refs.join(", ") || "none"}`);
117
+ for (const reason of item.reasons)
118
+ console.log(` reason: ${reason}`);
119
+ }
120
+ }
121
+ export function main(argv = process.argv.slice(2)) {
122
+ try {
123
+ if (argv.includes("--help") || argv.includes("-h")) {
124
+ printHelp();
125
+ return 0;
126
+ }
127
+ const result = audit();
128
+ if (argv.includes("--json"))
129
+ console.log(JSON.stringify(result, null, 2));
130
+ else
131
+ printText(result);
132
+ return 0;
133
+ }
134
+ catch (error) {
135
+ console.error(`fixture-retirement-audit: ${error instanceof Error ? error.message : String(error)}`);
136
+ return 1;
137
+ }
138
+ }
139
+ if (import.meta.url === `file://${process.argv[1]}`)
140
+ process.exit(main());