@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,2 @@
1
+ #!/usr/bin/env node
2
+ import("../build/src/cli/promote-workflow-artifact.js").then(({ main }) => process.exit(main()));
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import("../build/src/cli/publish-change-helper.js").then(({ main }) => process.exit(main()));
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import("../build/src/cli/pull-work-provider.js").then(({ main }) => process.exit(main()));
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR="$(git rev-parse --show-toplevel)"
5
+ cd "$ROOT_DIR"
6
+
7
+ git config --local core.hooksPath .githooks
8
+ echo "Configured repo-local Git hooks: core.hooksPath=.githooks"
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Compact Flow Agents workflow status for runtimes with status bar support.
4
+ *
5
+ * Reads optional runtime JSON from stdin, discovers `.flow-agents`, and
6
+ * prints one ASCII line suitable for Claude Code statusLine or Pi setStatus.
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+
14
+ const MAX_SUMMARY = 72;
15
+
16
+ function readStdin() {
17
+ return new Promise(resolve => {
18
+ let raw = '';
19
+ process.stdin.setEncoding('utf8');
20
+ process.stdin.on('data', chunk => {
21
+ raw += chunk;
22
+ });
23
+ process.stdin.on('end', () => resolve(raw));
24
+ process.stdin.on('error', () => resolve(raw));
25
+ });
26
+ }
27
+
28
+ function parseJson(raw) {
29
+ try {
30
+ return raw.trim() ? JSON.parse(raw) : {};
31
+ } catch {
32
+ return {};
33
+ }
34
+ }
35
+
36
+ function readJson(file) {
37
+ try {
38
+ return JSON.parse(fs.readFileSync(file, 'utf8'));
39
+ } catch {
40
+ return null;
41
+ }
42
+ }
43
+
44
+ function runtimeCwd(input) {
45
+ return (
46
+ input.cwd ||
47
+ input.current_dir ||
48
+ input.workspace?.current_dir ||
49
+ input.workspace?.cwd ||
50
+ process.env.CLAUDE_PROJECT_DIR ||
51
+ process.env.PWD ||
52
+ process.cwd()
53
+ );
54
+ }
55
+
56
+ function findWorkflowRoot(startDir) {
57
+ let current = path.resolve(startDir || process.cwd());
58
+ for (;;) {
59
+ const candidate = path.join(current, '.flow-agents');
60
+ if (fs.existsSync(candidate)) return candidate;
61
+ const parent = path.dirname(current);
62
+ if (parent === current) return null;
63
+ current = parent;
64
+ }
65
+ }
66
+
67
+ function stateFiles(workflowRoot) {
68
+ try {
69
+ return fs.readdirSync(workflowRoot, { withFileTypes: true })
70
+ .filter(entry => entry.isDirectory())
71
+ .map(entry => path.join(workflowRoot, entry.name, 'state.json'))
72
+ .filter(file => fs.existsSync(file));
73
+ } catch {
74
+ return [];
75
+ }
76
+ }
77
+
78
+ function chooseWorkflow(workflowRoot) {
79
+ const current = readJson(path.join(workflowRoot, 'current.json'));
80
+ if (current?.active_slug || current?.artifact_dir) {
81
+ const slug = current.active_slug || current.artifact_dir;
82
+ const dir = path.join(workflowRoot, slug);
83
+ const state = readJson(path.join(dir, 'state.json'));
84
+ if (state) return { dir, state };
85
+ }
86
+
87
+ const unresolved = new Set([
88
+ 'new',
89
+ 'planning',
90
+ 'planned',
91
+ 'in_progress',
92
+ 'blocked',
93
+ 'verifying',
94
+ 'needs_decision',
95
+ 'not_verified',
96
+ 'failed',
97
+ ]);
98
+
99
+ return stateFiles(workflowRoot)
100
+ .map(file => ({ file, state: readJson(file), mtime: fs.statSync(file).mtimeMs }))
101
+ .filter(item => item.state)
102
+ .sort((a, b) => {
103
+ const aOpen = unresolved.has(a.state.status) ? 1 : 0;
104
+ const bOpen = unresolved.has(b.state.status) ? 1 : 0;
105
+ return bOpen - aOpen || b.mtime - a.mtime;
106
+ })
107
+ .map(item => ({ dir: path.dirname(item.file), state: item.state }))[0] || null;
108
+ }
109
+
110
+ function acceptanceProgress(dir) {
111
+ const acceptance = readJson(path.join(dir, 'acceptance.json'));
112
+ const criteria = Array.isArray(acceptance?.criteria) ? acceptance.criteria : [];
113
+ if (criteria.length > 0) {
114
+ const done = criteria.filter(item => ['pass', 'accepted_gap'].includes(item.status)).length;
115
+ return `${done}/${criteria.length} AC`;
116
+ }
117
+
118
+ const evidence = readJson(path.join(dir, 'evidence.json'));
119
+ const checks = Array.isArray(evidence?.checks) ? evidence.checks : [];
120
+ if (checks.length > 0) {
121
+ const done = checks.filter(item => ['pass', 'skip'].includes(item.status)).length;
122
+ return `${done}/${checks.length} checks`;
123
+ }
124
+
125
+ return '';
126
+ }
127
+
128
+ function compact(text, maxLength = MAX_SUMMARY) {
129
+ const singleLine = String(text || '').replace(/\s+/g, ' ').trim();
130
+ if (singleLine.length <= maxLength) return singleLine;
131
+ return `${singleLine.slice(0, Math.max(0, maxLength - 3))}...`;
132
+ }
133
+
134
+ function render(workflow) {
135
+ if (!workflow) return 'Flow Agents: no active workflow';
136
+
137
+ const { dir, state } = workflow;
138
+ const slug = state.task_slug || path.basename(dir);
139
+ const phaseStatus = [state.phase, state.status].filter(Boolean).join('/');
140
+ const progress = acceptanceProgress(dir);
141
+ const next = compact(state.next_action?.summary || '');
142
+ const parts = [`Flow Agents: ${slug}`];
143
+ if (phaseStatus) parts.push(phaseStatus);
144
+ if (progress) parts.push(progress);
145
+ if (next) parts.push(`next: ${next}`);
146
+ return parts.join(' | ');
147
+ }
148
+
149
+ async function main() {
150
+ const input = parseJson(await readStdin());
151
+ const workflowRoot = findWorkflowRoot(runtimeCwd(input));
152
+ process.stdout.write(`${render(workflowRoot ? chooseWorkflow(workflowRoot) : null)}\n`);
153
+ }
154
+
155
+ main().catch(() => {
156
+ process.stdout.write('Flow Agents: status unavailable\n');
157
+ });
@@ -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
+ }
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env bash
2
+ # redact.sh — Field redaction for telemetry events
3
+
4
+ redact_event() {
5
+ local event="$1"
6
+ local redact_fields="$2"
7
+
8
+ [[ -z "$event" || "$redact_fields" == "none" ]] && echo "$event" && return
9
+
10
+ local result="$event"
11
+ IFS=',' read -ra fields <<< "$redact_fields"
12
+
13
+ for field in "${fields[@]}"; do
14
+ field=$(echo "$field" | tr -d ' ')
15
+ [[ -z "$field" ]] && continue
16
+
17
+ # Use jq to null out the field
18
+ result=$(echo "$result" | jq -c ".$field = null" 2>/dev/null || echo "$result")
19
+ done
20
+
21
+ echo "$result"
22
+ }