@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,250 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Workflow Steering Hook
4
+ *
5
+ * Injects phase-transition reminders after use_subagent calls complete and
6
+ * ambient workflow-state reminders at the start of the next user turn.
7
+ *
8
+ * Non-blocking — always exits 0.
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+
16
+ const STEERING = {
17
+ 'tool-planner': [
18
+ '⚡ PLAN COMPLETE — Next: execute-plan (step 3).',
19
+ 'Present plan to user. Get approval before executing.',
20
+ ].join(' '),
21
+
22
+ 'tool-worker': [
23
+ '⚡ EXECUTION COMPLETE — Next: review (step 4) then verify (step 5).',
24
+ 'Delegate to review-work for critique (report only — it cannot fix code).',
25
+ 'Then delegate to verify-work for evidence (report only — it cannot fix code).',
26
+ 'Do NOT deliver until review + verify are both clean.',
27
+ 'If this was a VISUAL change (UI, CSS, HTML), you MUST delegate to tool-playwright for screenshot verification before delivering.',
28
+ ].join(' '),
29
+
30
+ 'tool-code-reviewer': [
31
+ '⚡ REVIEW COMPLETE — Next: verify (step 5).',
32
+ 'Reviewer reported findings only — it did NOT fix anything.',
33
+ 'If CRITICAL/HIGH findings: route back to execute-plan, then re-review + re-verify.',
34
+ 'If clean: proceed to verify-work. If findings exist, route back through execute-plan or a user decision.',
35
+ ].join(' '),
36
+
37
+ 'tool-security-reviewer': [
38
+ '⚡ SECURITY REVIEW COMPLETE — Check findings.',
39
+ 'If CRITICAL security findings: route back to execute-plan, then re-review + re-verify.',
40
+ 'If clean: proceed to next step.',
41
+ ].join(' '),
42
+
43
+ 'tool-verifier': [
44
+ '⚡ VERIFICATION COMPLETE — Route on verdict.',
45
+ 'All PASS + no review issues → deliver.',
46
+ 'Any FAIL or unfixed findings → route back to execute-plan, then re-review + re-verify.',
47
+ 'Loop exits ONLY when review + verify are BOTH clean in the same iteration.',
48
+ ].join(' '),
49
+ };
50
+
51
+ const ACTIVE_STATE_STATUSES = new Set([
52
+ 'new',
53
+ 'planning',
54
+ 'planned',
55
+ 'in_progress',
56
+ 'blocked',
57
+ 'verifying',
58
+ 'verified',
59
+ 'needs_decision',
60
+ 'not_verified',
61
+ 'failed',
62
+ 'delivered',
63
+ ]);
64
+
65
+ function findRepoRoot(startDir) {
66
+ let dir = path.resolve(startDir || process.cwd());
67
+ const root = path.parse(dir).root;
68
+ for (let depth = 0; dir && depth < 40; depth++) {
69
+ if (fs.existsSync(path.join(dir, '.git')) || fs.existsSync(path.join(dir, 'AGENTS.md'))) return dir;
70
+ if (dir === root) break;
71
+ dir = path.dirname(dir);
72
+ }
73
+ return path.resolve(startDir || process.cwd());
74
+ }
75
+
76
+ function walkStateFiles(dir, out = []) {
77
+ if (!fs.existsSync(dir)) return out;
78
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
79
+ const full = path.join(dir, entry.name);
80
+ if (entry.isDirectory()) {
81
+ if (entry.name === 'archive') continue;
82
+ walkStateFiles(full, out);
83
+ } else if (entry.isFile() && entry.name === 'state.json') {
84
+ out.push(full);
85
+ }
86
+ }
87
+ return out;
88
+ }
89
+
90
+ function readJson(file) {
91
+ try {
92
+ return JSON.parse(fs.readFileSync(file, 'utf8'));
93
+ } catch {
94
+ return null;
95
+ }
96
+ }
97
+
98
+ function latestWorkflowState(root) {
99
+ const states = walkStateFiles(path.join(root, '.flow-agents'))
100
+ .map(file => {
101
+ let stat;
102
+ try { stat = fs.statSync(file); } catch { return null; }
103
+ const payload = readJson(file);
104
+ if (!payload || !ACTIVE_STATE_STATUSES.has(payload.status)) return null;
105
+ return { file, payload, mtimeMs: stat.mtimeMs };
106
+ })
107
+ .filter(Boolean)
108
+ .sort((a, b) => b.mtimeMs - a.mtimeMs);
109
+ return states[0] || null;
110
+ }
111
+
112
+ function safeStateText(value, maxLength = 240) {
113
+ const text = String(value || '').replace(/\s+/g, ' ').trim();
114
+ if (text.length <= maxLength) return text;
115
+ return `${text.slice(0, maxLength - 3)}...`;
116
+ }
117
+
118
+ function normalizedStateValue(value) {
119
+ return safeStateText(value, 80).toLowerCase();
120
+ }
121
+
122
+ function stateNeedsAmbientSteering(state) {
123
+ if (!state || typeof state !== 'object') return false;
124
+ const status = normalizedStateValue(state.status);
125
+ const nextStatus = normalizedStateValue(state.next_action && state.next_action.status);
126
+ return (
127
+ status === 'blocked' ||
128
+ status === 'failed' ||
129
+ status === 'needs_decision' ||
130
+ status === 'not_verified' ||
131
+ nextStatus === 'needs_user'
132
+ );
133
+ }
134
+
135
+ function critiqueSteering(workflowDir) {
136
+ const critique = readJson(path.join(workflowDir, 'critique.json'));
137
+ if (!critique || critique.required !== true) return '';
138
+ if (critique.status === 'pass' || critique.status === 'not_required') return '';
139
+ const critiques = Array.isArray(critique.critiques) ? critique.critiques : [];
140
+ const openFindings = [];
141
+ let nonPassReviews = 0;
142
+ for (const review of critiques) {
143
+ if (!review || typeof review !== 'object') continue;
144
+ if (review.verdict === 'fail' || review.verdict === 'not_verified') nonPassReviews += 1;
145
+ const findings = Array.isArray(review.findings) ? review.findings : [];
146
+ for (const finding of findings) {
147
+ if (finding && finding.status === 'open') openFindings.push(finding);
148
+ }
149
+ }
150
+ const parts = [
151
+ `CRITIQUE: required critique is status:${safeStateText(critique.status, 60)}.`,
152
+ ];
153
+ if (nonPassReviews) parts.push(`${nonPassReviews} review(s) have fail/not_verified verdicts.`);
154
+ if (openFindings.length) {
155
+ const severityCounts = openFindings.reduce((acc, finding) => {
156
+ const severity = safeStateText(finding.severity || 'unknown', 30);
157
+ acc[severity] = (acc[severity] || 0) + 1;
158
+ return acc;
159
+ }, {});
160
+ const counts = Object.entries(severityCounts)
161
+ .map(([severity, count]) => `${severity}:${count}`)
162
+ .join(', ');
163
+ parts.push(`Open findings: ${counts}.`);
164
+ parts.push(`First open finding: "${safeStateText(openFindings[0].description)}"`);
165
+ }
166
+ parts.push('Do not deliver as complete until required critique is pass or findings are explicitly accepted.');
167
+ return parts.join(' ');
168
+ }
169
+
170
+ function stateSteering(root) {
171
+ const current = latestWorkflowState(root);
172
+ if (!current) return '';
173
+ const state = current.payload;
174
+ const next = state.next_action || {};
175
+ if (next.status === 'done' || state.status === 'archived' || state.status === 'accepted') return '';
176
+ const parts = [
177
+ `STATE: ${state.task_slug || path.basename(path.dirname(current.file))} is status:${state.status} phase:${state.phase}.`,
178
+ ];
179
+ if (next.summary) parts.push(`Recorded next_action.summary: "${safeStateText(next.summary)}"`);
180
+ if (next.target_phase) parts.push(`Target phase: ${safeStateText(next.target_phase, 80)}.`);
181
+ if (next.status === 'needs_user' || state.status === 'needs_decision' || state.status === 'not_verified') {
182
+ parts.push('Do not deliver as complete until the user decision or accepted gap is recorded.');
183
+ }
184
+ if (state.status === 'failed') {
185
+ parts.push('Route back through execution, then re-review and re-verify.');
186
+ }
187
+ const critiqueHint = critiqueSteering(path.dirname(current.file));
188
+ if (critiqueHint) parts.push(critiqueHint);
189
+ return parts.join(' ');
190
+ }
191
+
192
+ function contextMapSteering(root) {
193
+ const mapPath = path.join(root, 'docs', 'context-map.md');
194
+ if (!fs.existsSync(mapPath)) return '';
195
+ return [
196
+ 'CONTEXT MAP: use docs/context-map.md before broad repo rediscovery.',
197
+ 'If structure, commands, schemas, skills, agents, or packs changed, run `npm run context-map -- --check`.',
198
+ ].join(' ');
199
+ }
200
+
201
+ function run(rawInput) {
202
+ try {
203
+ const input = JSON.parse(rawInput);
204
+ const event = input.hook_event_name || '';
205
+ const toolOutput = input.tool_response || input.tool_output || '';
206
+ const toolInput = input.tool_input || {};
207
+ const root = findRepoRoot(input.cwd || process.cwd());
208
+ const current = latestWorkflowState(root);
209
+ const hints = [];
210
+ let shouldAppendWorkflowContext = false;
211
+
212
+ if (toolInput.command === 'InvokeSubagents') {
213
+ const subagents = toolInput.content?.subagents || [];
214
+ hints.push(...subagents
215
+ .map(s => STEERING[s.agent_name])
216
+ .filter(Boolean));
217
+ shouldAppendWorkflowContext = hints.length > 0;
218
+ }
219
+
220
+ if (event === 'UserPromptSubmit' && current && stateNeedsAmbientSteering(current.payload)) {
221
+ hints.push('WORKFLOW STATE ATTENTION: current sidecars show unresolved workflow state at turn start.');
222
+ shouldAppendWorkflowContext = true;
223
+ }
224
+
225
+ if (shouldAppendWorkflowContext) {
226
+ const stateHint = stateSteering(root);
227
+ if (stateHint) hints.push(stateHint);
228
+ const contextHint = contextMapSteering(root);
229
+ if (contextHint) hints.push(contextHint);
230
+ }
231
+ if (hints.length === 0) return rawInput;
232
+
233
+ const steering = '\n\n---\n' + hints.join('\n') + '\n---';
234
+ return rawInput + steering;
235
+ } catch { /* pass through */ }
236
+ return rawInput;
237
+ }
238
+
239
+ if (require.main === module) {
240
+ let data = '';
241
+ process.stdin.setEncoding('utf8');
242
+ process.stdin.on('data', chunk => {
243
+ data += chunk;
244
+ });
245
+ process.stdin.on('end', () => {
246
+ process.stdout.write(String(run(data)));
247
+ });
248
+ }
249
+
250
+ module.exports = { run, stateSteering, critiqueSteering, contextMapSteering, latestWorkflowState, findRepoRoot, safeStateText, stateNeedsAmbientSteering };
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ # Named Console telemetry sink defaults used by install/setup helpers.
3
+
4
+ flow_agents_local_kontour_console_url() {
5
+ printf '%s\n' "${FLOW_AGENTS_LOCAL_KONTOUR_CONSOLE_URL:-http://127.0.0.1:3737}"
6
+ }
7
+
8
+ flow_agents_kontour_cloud_console_url() {
9
+ printf '%s\n' "${FLOW_AGENTS_KONTOUR_CLOUD_CONSOLE_URL:-https://console.kontourai.com}"
10
+ }
11
+
12
+ flow_agents_kontour_hosted_console_url() {
13
+ flow_agents_kontour_cloud_console_url
14
+ }
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env bash
2
+ # Persist optional Console telemetry settings into an installed telemetry.conf.
3
+ set -euo pipefail
4
+
5
+ usage() {
6
+ cat >&2 <<'EOF'
7
+ usage: install-console-config.sh /path/to/telemetry.conf [options]
8
+
9
+ Options:
10
+ --telemetry-sink NAME local-files, local-kontour-console,
11
+ kontour-hosted-console, user-hosted-console,
12
+ or legacy aliases. May be repeated.
13
+ --console-url URL Console base URL. Derives /api/telemetry/records.
14
+ --console-endpoint URL Full Console telemetry records endpoint URL.
15
+ --console-token-file PATH
16
+ File containing the bearer token.
17
+ --console-tenant ID Tenant identifier for hosted Console routing.
18
+ EOF
19
+ }
20
+
21
+ die() {
22
+ echo "install-console-config.sh: $*" >&2
23
+ exit 2
24
+ }
25
+
26
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
27
+ # shellcheck source=/dev/null
28
+ source "$SCRIPT_DIR/console-presets.sh"
29
+
30
+ append_sinks() {
31
+ local raw="$1"
32
+ local sink
33
+ raw="${raw//,/ }"
34
+ for sink in $raw; do
35
+ [[ -n "$sink" ]] && telemetry_sinks+=("$sink")
36
+ done
37
+ }
38
+
39
+ has_control_chars() {
40
+ [[ "$1" == *$'\n'* || "$1" == *$'\r'* || "$1" == *$'\t'* ]]
41
+ }
42
+
43
+ validate_url() {
44
+ local label="$1"
45
+ local value="$2"
46
+ [[ -z "$value" ]] && return 0
47
+ has_control_chars "$value" && die "$label must not contain control characters"
48
+ if [[ "$value" == https://* ]]; then
49
+ return 0
50
+ fi
51
+ if [[ "$value" == http://127.0.0.1:* || "$value" == http://127.0.0.1/* || "$value" == "http://127.0.0.1" ]]; then
52
+ return 0
53
+ fi
54
+ if [[ "$value" == http://localhost:* || "$value" == http://localhost/* || "$value" == "http://localhost" ]]; then
55
+ return 0
56
+ fi
57
+ die "$label must use https://, except localhost or 127.0.0.1 may use http://"
58
+ }
59
+
60
+ validate_token() {
61
+ local value="$1"
62
+ [[ -z "$value" ]] && return 0
63
+ [[ "${#value}" -le 4096 ]] || die "Console token must be 4096 characters or fewer"
64
+ has_control_chars "$value" && die "Console token must not contain control characters"
65
+ [[ "$value" =~ ^[A-Za-z0-9._~+/=-]+$ ]] || die "Console token contains unsupported characters"
66
+ }
67
+
68
+ read_token_file() {
69
+ local file="$1"
70
+ [[ -f "$file" ]] || die "--console-token-file does not exist: $file"
71
+ local value
72
+ value="$(tr -d '\r\n' <"$file")"
73
+ [[ -n "$value" ]] || die "--console-token-file is empty"
74
+ [[ "${#value}" -le 4096 ]] || die "Console token must be 4096 characters or fewer"
75
+ printf '%s\n' "$value"
76
+ }
77
+
78
+ validate_tenant() {
79
+ local value="$1"
80
+ [[ -z "$value" ]] && return 0
81
+ [[ "$value" =~ ^[A-Za-z0-9._:-]+$ ]] || die "--console-tenant contains unsupported characters"
82
+ }
83
+
84
+ set_config_key() {
85
+ local conf="$1"
86
+ local key="$2"
87
+ local value="$3"
88
+ [[ -z "$value" ]] && return 0
89
+ local tmp
90
+ tmp="$(mktemp "${TMPDIR:-/tmp}/flow-agents-telemetry-conf.XXXXXX")"
91
+ if [[ -f "$conf" ]]; then
92
+ awk -v key="$key" 'BEGIN { prefix = key "=" } index($0, prefix) != 1 { print }' "$conf" >"$tmp"
93
+ fi
94
+ printf '%s=%s\n' "$key" "$value" >>"$tmp"
95
+ mv "$tmp" "$conf"
96
+ }
97
+
98
+ main() {
99
+ [[ $# -ge 1 ]] || { usage; exit 2; }
100
+ local conf="$1"
101
+ shift
102
+
103
+ local console_url="${FLOW_AGENTS_CONSOLE_URL:-${CONSOLE_TELEMETRY_URL:-${CONSOLE_URL:-}}}"
104
+ local console_endpoint="${FLOW_AGENTS_CONSOLE_ENDPOINT_URL:-${CONSOLE_TELEMETRY_ENDPOINT_URL:-}}"
105
+ local console_token=""
106
+ local console_token_file="${FLOW_AGENTS_CONSOLE_TOKEN_FILE:-${CONSOLE_TELEMETRY_TOKEN_FILE:-}}"
107
+ local console_tenant="${FLOW_AGENTS_CONSOLE_TENANT:-${CONSOLE_TENANT_ID:-}}"
108
+ telemetry_sinks=()
109
+ if [[ -n "${FLOW_AGENTS_TELEMETRY_SINKS:-}" ]]; then
110
+ append_sinks "$FLOW_AGENTS_TELEMETRY_SINKS"
111
+ elif [[ -n "${FLOW_AGENTS_TELEMETRY_SINK:-}" ]]; then
112
+ append_sinks "$FLOW_AGENTS_TELEMETRY_SINK"
113
+ fi
114
+
115
+ while [[ $# -gt 0 ]]; do
116
+ case "$1" in
117
+ --telemetry-sink|--telemetry-sinks)
118
+ [[ $# -ge 2 ]] || die "$1 requires a value"
119
+ append_sinks "$2"
120
+ shift 2
121
+ ;;
122
+ --console-url)
123
+ [[ $# -ge 2 ]] || die "--console-url requires a value"
124
+ console_url="$2"
125
+ shift 2
126
+ ;;
127
+ --console-endpoint|--console-endpoint-url)
128
+ [[ $# -ge 2 ]] || die "$1 requires a value"
129
+ console_endpoint="$2"
130
+ shift 2
131
+ ;;
132
+ --console-token-file)
133
+ [[ $# -ge 2 ]] || die "--console-token-file requires a value"
134
+ console_token_file="$2"
135
+ shift 2
136
+ ;;
137
+ --console-tenant|--console-tenant-id)
138
+ [[ $# -ge 2 ]] || die "$1 requires a value"
139
+ console_tenant="$2"
140
+ shift 2
141
+ ;;
142
+ --help|-h)
143
+ usage
144
+ exit 0
145
+ ;;
146
+ *)
147
+ die "unknown option: $1"
148
+ ;;
149
+ esac
150
+ done
151
+
152
+ if [[ -n "$console_token_file" ]]; then
153
+ console_token="$(read_token_file "$console_token_file")"
154
+ fi
155
+
156
+ if [[ "${#telemetry_sinks[@]}" -eq 0 ]]; then
157
+ telemetry_sinks=("local-files")
158
+ fi
159
+ local sink
160
+ local console_sink_count=0
161
+ for sink in "${telemetry_sinks[@]}"; do
162
+ case "$sink" in
163
+ local-files)
164
+ ;;
165
+ local-kontour-console)
166
+ console_sink_count=$((console_sink_count + 1))
167
+ console_url="${console_url:-$(flow_agents_local_kontour_console_url)}"
168
+ ;;
169
+ kontour-hosted-console|kontour-cloud)
170
+ console_sink_count=$((console_sink_count + 1))
171
+ console_url="${console_url:-$(flow_agents_kontour_hosted_console_url)}"
172
+ ;;
173
+ user-hosted-console|hosted-kontour-console)
174
+ console_sink_count=$((console_sink_count + 1))
175
+ [[ -n "$console_url" || -n "$console_endpoint" ]] || die "user-hosted-console requires --console-url or --console-endpoint"
176
+ ;;
177
+ *)
178
+ die "unknown telemetry sink: $sink"
179
+ ;;
180
+ esac
181
+ done
182
+ [[ "$console_sink_count" -le 1 ]] || die "select at most one Console telemetry sink"
183
+
184
+ if [[ -z "$console_url" && -z "$console_endpoint" && -z "$console_token" && -z "$console_tenant" ]]; then
185
+ return 0
186
+ fi
187
+ if [[ -z "$console_url" && -z "$console_endpoint" && ( -n "$console_token" || -n "$console_tenant" ) ]]; then
188
+ die "--console-token-file and --console-tenant require --console-url or --console-endpoint"
189
+ fi
190
+
191
+ validate_url "--console-url" "$console_url"
192
+ validate_url "--console-endpoint" "$console_endpoint"
193
+ validate_token "$console_token"
194
+ validate_tenant "$console_tenant"
195
+
196
+ mkdir -p "$(dirname "$conf")"
197
+ [[ -f "$conf" ]] || : >"$conf"
198
+ set_config_key "$conf" "console_telemetry_url" "$console_url"
199
+ set_config_key "$conf" "console_telemetry_endpoint_url" "$console_endpoint"
200
+ set_config_key "$conf" "console_telemetry_token" "$console_token"
201
+ set_config_key "$conf" "console_tenant_id" "$console_tenant"
202
+ if [[ -n "$console_token" ]]; then
203
+ chmod 600 "$conf" 2>/dev/null || true
204
+ fi
205
+
206
+ local target="${console_endpoint:-$console_url}"
207
+ if [[ -n "$console_tenant" ]]; then
208
+ echo "Configured Console telemetry in $conf for $target (tenant: $console_tenant)"
209
+ else
210
+ echo "Configured Console telemetry in $conf for $target"
211
+ fi
212
+ }
213
+
214
+ main "$@"
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env bash
2
+ # config.sh — Load telemetry configuration with defaults
3
+
4
+ TELEMETRY_DIR="${TELEMETRY_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
5
+ TELEMETRY_CONFIG_FILE="${TELEMETRY_CONFIG_FILE:-${TELEMETRY_DIR}/telemetry.conf}"
6
+
7
+ # Defaults
8
+ TELEMETRY_ENABLED="${TELEMETRY_ENABLED:-true}"
9
+ TELEMETRY_DATA_DIR="${TELEMETRY_DATA_DIR:-$(cd "${TELEMETRY_DIR}/../../.." && pwd)/.telemetry}"
10
+ TELEMETRY_SESSION_DIR="${TELEMETRY_SESSION_DIR:-${TELEMETRY_DATA_DIR}/sessions}"
11
+ TELEMETRY_ENRICH_SYSTEM="${TELEMETRY_ENRICH_SYSTEM:-true}"
12
+ TELEMETRY_ENRICH_WORKSPACE="${TELEMETRY_ENRICH_WORKSPACE:-true}"
13
+ TELEMETRY_ENRICH_AUTH="${TELEMETRY_ENRICH_AUTH:-true}"
14
+ TELEMETRY_SYNC_INCLUDE="${TELEMETRY_SYNC_INCLUDE:-*}"
15
+ TELEMETRY_SYNC_EXCLUDE="${TELEMETRY_SYNC_EXCLUDE:-neo-*,Neo,local-gamma-*}"
16
+ TELEMETRY_MAX_LOG_SIZE_MB="${TELEMETRY_MAX_LOG_SIZE_MB:-50}"
17
+ TELEMETRY_MAX_LOG_FILES="${TELEMETRY_MAX_LOG_FILES:-3}"
18
+ TELEMETRY_CHANNELS="${TELEMETRY_CHANNELS:-full}"
19
+ FLOW_AGENTS_TELEMETRY_CAPTURE_RAW_HOOK_INPUT="${FLOW_AGENTS_TELEMETRY_CAPTURE_RAW_HOOK_INPUT:-false}"
20
+ TELEMETRY_USAGE_TRACKING="${TELEMETRY_USAGE_TRACKING:-true}"
21
+ TELEMETRY_NOTIFICATIONS="${TELEMETRY_NOTIFICATIONS:-true}"
22
+ TELEMETRY_NOTIFICATION_PROFILE="${TELEMETRY_NOTIFICATION_PROFILE:-standard}"
23
+ TELEMETRY_GOVERNANCE="${TELEMETRY_GOVERNANCE:-true}"
24
+ TELEMETRY_GOVERNANCE_AUDIT_MAX_SIZE_MB="${TELEMETRY_GOVERNANCE_AUDIT_MAX_SIZE_MB:-25}"
25
+ TELEMETRY_GOVERNANCE_AUDIT_MAX_FILES="${TELEMETRY_GOVERNANCE_AUDIT_MAX_FILES:-5}"
26
+
27
+ # Channel defaults
28
+ TELEMETRY_CHANNEL_FULL_LOG_FILE="${TELEMETRY_CHANNEL_FULL_LOG_FILE:-${TELEMETRY_DATA_DIR}/full.jsonl}"
29
+ TELEMETRY_CHANNEL_FULL_REDACT="${TELEMETRY_CHANNEL_FULL_REDACT:-hook.raw_input,turn.prompt_text,tool.input,tool.output}"
30
+ TELEMETRY_CHANNEL_ANALYTICS_LOG_FILE="${TELEMETRY_CHANNEL_ANALYTICS_LOG_FILE:-${TELEMETRY_DATA_DIR}/analytics.jsonl}"
31
+ TELEMETRY_CHANNEL_ANALYTICS_REDACT="${TELEMETRY_CHANNEL_ANALYTICS_REDACT:-tool.input,tool.output,turn.prompt_text,delegation.targets.query,context.cwd,hook.raw_input,hook.last_assistant_message,hook.transcript_path}"
32
+ TELEMETRY_CHANNEL_ANALYTICS_ENDPOINT_URL="${TELEMETRY_CHANNEL_ANALYTICS_ENDPOINT_URL:-}"
33
+ CONSOLE_TELEMETRY_URL="${CONSOLE_TELEMETRY_URL:-${CONSOLE_URL:-}}"
34
+ CONSOLE_TELEMETRY_ENDPOINT_URL="${CONSOLE_TELEMETRY_ENDPOINT_URL:-}"
35
+ CONSOLE_TELEMETRY_TOKEN="${CONSOLE_TELEMETRY_TOKEN:-${CONSOLE_AUTH_TOKEN:-}}"
36
+ CONSOLE_TENANT_ID="${CONSOLE_TENANT_ID:-}"
37
+
38
+ # Load config file if it exists
39
+ if [[ -f "$TELEMETRY_CONFIG_FILE" ]]; then
40
+ while IFS='=' read -r key value; do
41
+ [[ -z "$key" || "$key" =~ ^[[:space:]]*# ]] && continue
42
+ key=$(echo "$key" | tr -d '[:space:]')
43
+ value=$(echo "$value" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
44
+
45
+ # Handle channel-specific config
46
+ if [[ "$key" =~ ^channel\.([^.]+)\.(.+)$ ]]; then
47
+ channel_name="${BASH_REMATCH[1]}"
48
+ channel_key="${BASH_REMATCH[2]}"
49
+ if [[ "$channel_name" =~ ^[A-Za-z0-9_]+$ && "$channel_key" =~ ^[A-Za-z0-9_]+$ ]]; then
50
+ var_name="TELEMETRY_CHANNEL_$(echo "$channel_name" | tr '[:lower:]' '[:upper:]')_$(echo "$channel_key" | tr '[:lower:]' '[:upper:]')"
51
+ printf -v "$var_name" '%s' "$value"
52
+ fi
53
+ else
54
+ # Standard config
55
+ case "$key" in
56
+ enabled) TELEMETRY_ENABLED="$value" ;;
57
+ channels) TELEMETRY_CHANNELS="$value" ;;
58
+ enrich_system) TELEMETRY_ENRICH_SYSTEM="$value" ;;
59
+ enrich_workspace) TELEMETRY_ENRICH_WORKSPACE="$value" ;;
60
+ enrich_auth) TELEMETRY_ENRICH_AUTH="$value" ;;
61
+ max_log_size_mb) TELEMETRY_MAX_LOG_SIZE_MB="$value" ;;
62
+ max_log_files) TELEMETRY_MAX_LOG_FILES="$value" ;;
63
+ sync_include) TELEMETRY_SYNC_INCLUDE="$value" ;;
64
+ sync_exclude) TELEMETRY_SYNC_EXCLUDE="$value" ;;
65
+ usage_tracking) TELEMETRY_USAGE_TRACKING="$value" ;;
66
+ notifications) TELEMETRY_NOTIFICATIONS="$value" ;;
67
+ notification_profile) TELEMETRY_NOTIFICATION_PROFILE="$value" ;;
68
+ governance) TELEMETRY_GOVERNANCE="$value" ;;
69
+ governance_audit_max_size_mb) TELEMETRY_GOVERNANCE_AUDIT_MAX_SIZE_MB="$value" ;;
70
+ governance_audit_max_files) TELEMETRY_GOVERNANCE_AUDIT_MAX_FILES="$value" ;;
71
+ console_url) CONSOLE_TELEMETRY_URL="$value" ;;
72
+ console_telemetry_url) CONSOLE_TELEMETRY_URL="$value" ;;
73
+ console_telemetry_endpoint_url) CONSOLE_TELEMETRY_ENDPOINT_URL="$value" ;;
74
+ console_telemetry_token) CONSOLE_TELEMETRY_TOKEN="$value" ;;
75
+ console_tenant_id) CONSOLE_TENANT_ID="$value" ;;
76
+ console_telemetry_redact) CONSOLE_TELEMETRY_REDACT="$value" ;;
77
+ esac
78
+ fi
79
+ done < "$TELEMETRY_CONFIG_FILE"
80
+ fi
81
+
82
+ CONSOLE_TELEMETRY_REDACT="${CONSOLE_TELEMETRY_REDACT:-${TELEMETRY_CHANNEL_ANALYTICS_REDACT}}"
83
+
84
+ # Ensure directories exist
85
+ mkdir -p "$TELEMETRY_DATA_DIR" "$TELEMETRY_SESSION_DIR" 2>/dev/null
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env bash
2
+ # enrich.sh — Metadata enrichment functions
3
+
4
+ enrich_system() {
5
+ [[ "$TELEMETRY_ENRICH_SYSTEM" != "true" ]] && echo '{}' && return
6
+
7
+ local os os_version shell runtime_version node_version
8
+ os=$(uname -s | tr '[:upper:]' '[:lower:]')
9
+ os_version=$(uname -r)
10
+ shell=$(basename "${SHELL:-unknown}")
11
+ runtime_version=$(
12
+ kiro-cli --version 2>/dev/null &
13
+ _pid=$!; ( sleep 2; kill $_pid 2>/dev/null ) &
14
+ _guard=$!; wait $_pid 2>/dev/null; kill $_guard 2>/dev/null
15
+ wait $_pid 2>/dev/null
16
+ ) 2>/dev/null
17
+ runtime_version=$(echo "$runtime_version" | head -n1)
18
+ runtime_version="${runtime_version:-unknown}"
19
+ node_version=$(node --version 2>/dev/null || echo "unknown")
20
+
21
+ jq -nc \
22
+ --arg os "$os" \
23
+ --arg osv "$os_version" \
24
+ --arg shell "$shell" \
25
+ --arg rv "$runtime_version" \
26
+ --arg nv "$node_version" \
27
+ '{
28
+ os: $os,
29
+ os_version: $osv,
30
+ shell: $shell,
31
+ runtime_version: $rv,
32
+ node_version: $nv
33
+ }'
34
+ }
35
+
36
+ enrich_workspace() {
37
+ [[ "$TELEMETRY_ENRICH_WORKSPACE" != "true" ]] && echo '{}' && return
38
+
39
+ local session_id cache_file
40
+ session_id=$(session_get)
41
+ cache_file="${TELEMETRY_SESSION_DIR}/${session_id}.workspace"
42
+
43
+ # Return cached if exists
44
+ [[ -f "$cache_file" ]] && cat "$cache_file" && return
45
+
46
+ local has_git="false" git_branch="" git_hash=""
47
+ local file_count=0 workspace_size_mb=0 primary_languages=""
48
+
49
+ if git rev-parse --git-dir >/dev/null 2>&1; then
50
+ has_git="true"
51
+ git_branch=$(git branch --show-current 2>/dev/null || echo "unknown")
52
+ git_hash=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
53
+
54
+ # Only scan files inside a git repo to avoid scanning ~ or /
55
+ file_count=$(find . -maxdepth 4 -type f 2>/dev/null | head -10000 | wc -l | tr -d ' ')
56
+ primary_languages=$(find . -maxdepth 4 \( -name "*.js" -o -name "*.ts" -o -name "*.py" -o -name "*.sh" -o -name "*.go" -o -name "*.rs" \) 2>/dev/null | \
57
+ head -5000 | sed 's/.*\.//' | sort | uniq -c | sort -nr | head -3 | awk '{print $2}' | tr '\n' ',' | sed 's/,$//')
58
+ fi
59
+
60
+ local result
61
+ result=$(jq -nc \
62
+ --argjson hg "$has_git" \
63
+ --arg gb "$git_branch" \
64
+ --arg gh "$git_hash" \
65
+ --argjson fc "$file_count" \
66
+ --argjson ws "$workspace_size_mb" \
67
+ --arg pl "$primary_languages" \
68
+ '{
69
+ has_git: $hg,
70
+ git_branch_hash: ($gb + "@" + $gh),
71
+ file_count: $fc,
72
+ workspace_size_mb: $ws,
73
+ primary_languages: $pl
74
+ }')
75
+
76
+ echo "$result" | tee "$cache_file"
77
+ }
78
+
79
+ enrich_auth() {
80
+ [[ "$TELEMETRY_ENRICH_AUTH" != "true" ]] && echo '{}' && return
81
+
82
+ local mwinit_active="false" mwinit_age_minutes=0 cookie_exists="false"
83
+
84
+ # Check mwinit status
85
+ if command -v mwinit >/dev/null 2>&1; then
86
+ if mwinit status >/dev/null 2>&1; then
87
+ mwinit_active="true"
88
+ local mwinit_file="$HOME/.mwinit"
89
+ if [[ -f "$mwinit_file" ]]; then
90
+ local mwinit_mtime current_time
91
+ # Try GNU stat first, then BSD
92
+ if stat -c %Y "$mwinit_file" >/dev/null 2>&1; then
93
+ mwinit_mtime=$(stat -c %Y "$mwinit_file")
94
+ else
95
+ mwinit_mtime=$(stat -f %m "$mwinit_file" 2>/dev/null || echo "0")
96
+ fi
97
+ current_time=$(date +%s)
98
+ mwinit_age_minutes=$(((current_time - mwinit_mtime) / 60))
99
+ fi
100
+ fi
101
+ fi
102
+
103
+ # Check for auth cookies
104
+ [[ -f "$HOME/.aws/sso/cache" ]] && cookie_exists="true"
105
+
106
+ jq -nc \
107
+ --argjson ma "$mwinit_active" \
108
+ --argjson mam "$mwinit_age_minutes" \
109
+ --argjson ce "$cookie_exists" \
110
+ '{
111
+ mwinit_active: $ma,
112
+ mwinit_age_minutes: $mam,
113
+ cookie_exists: $ce
114
+ }'
115
+ }