@kontourai/flow-agents 2.3.0 → 3.0.0

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 (301) hide show
  1. package/.github/CODEOWNERS +16 -0
  2. package/.github/workflows/ci.yml +44 -0
  3. package/.github/workflows/trust-reconcile.yml +62 -4
  4. package/AGENTS.md +4 -4
  5. package/CHANGELOG.md +62 -0
  6. package/CONTEXT.md +35 -0
  7. package/README.md +9 -3
  8. package/agents/dev.json +1 -1
  9. package/agents/tool-code-reviewer.json +1 -1
  10. package/agents/tool-planner.json +3 -3
  11. package/agents/tool-verifier.json +3 -3
  12. package/build/src/cli/assignment-provider.d.ts +1 -0
  13. package/build/src/cli/assignment-provider.js +748 -0
  14. package/build/src/cli/console-learning-projection.js +3 -2
  15. package/build/src/cli/effective-assignment-provider-settings.d.ts +1 -0
  16. package/build/src/cli/effective-assignment-provider-settings.js +125 -0
  17. package/build/src/cli/init.js +104 -21
  18. package/build/src/cli/kit.js +37 -6
  19. package/build/src/cli/pull-work-provider.js +1 -1
  20. package/build/src/cli/usage-feedback.js +3 -3
  21. package/build/src/cli/validate-hook-influence.js +1 -0
  22. package/build/src/cli/validate-workflow-artifacts.js +27 -7
  23. package/build/src/cli/workflow-artifact-cleanup-audit.js +36 -2
  24. package/build/src/cli/workflow-sidecar.d.ts +14 -7
  25. package/build/src/cli/workflow-sidecar.js +938 -168
  26. package/build/src/cli.js +6 -0
  27. package/build/src/flow-kit/validate.d.ts +23 -0
  28. package/build/src/flow-kit/validate.js +67 -1
  29. package/build/src/index.d.ts +1 -1
  30. package/build/src/index.js +1 -1
  31. package/build/src/lib/flow-resolver.d.ts +6 -4
  32. package/build/src/lib/flow-resolver.js +125 -58
  33. package/build/src/lib/local-artifact-root.d.ts +14 -2
  34. package/build/src/lib/local-artifact-root.js +22 -5
  35. package/build/src/lib/workflow-learning-projection.js +2 -2
  36. package/build/src/runtime-adapters.d.ts +12 -0
  37. package/build/src/runtime-adapters.js +56 -16
  38. package/build/src/tools/build-universal-bundles.js +49 -16
  39. package/build/src/tools/generate-context-map.js +10 -8
  40. package/build/src/tools/validate-source-tree.js +24 -1
  41. package/console.telemetry.json +22 -0
  42. package/context/contracts/artifact-contract.md +40 -7
  43. package/context/contracts/assignment-provider-contract.md +239 -0
  44. package/context/contracts/builder-kit-workflow-state-contract.md +5 -2
  45. package/context/contracts/decision-registry-contract.md +265 -0
  46. package/context/contracts/delivery-contract.md +3 -1
  47. package/context/contracts/execution-contract.md +25 -0
  48. package/context/contracts/governance-adapter-contract.md +2 -0
  49. package/context/contracts/knowledge-store-contract.md +197 -0
  50. package/context/contracts/planning-contract.md +4 -1
  51. package/context/contracts/review-contract.md +7 -3
  52. package/context/contracts/sandbox-policy.md +2 -0
  53. package/context/contracts/standing-directives.md +13 -0
  54. package/context/contracts/verification-contract.md +11 -1
  55. package/context/contracts/work-item-contract.md +3 -1
  56. package/context/deferred/parallelization.md +1 -1
  57. package/context/gate-awareness.md +4 -4
  58. package/context/scripts/git-status.sh +2 -2
  59. package/context/scripts/hooks/config-protection.js +502 -2
  60. package/context/scripts/hooks/lib/config-protection-remedies.js +69 -0
  61. package/context/scripts/hooks/run-hook.js +14 -1
  62. package/context/scripts/hooks/stop-goal-fit.js +1140 -99
  63. package/context/scripts/hooks/workflow-steering.js +212 -6
  64. package/context/settings/assignment-provider-settings.json +33 -0
  65. package/docs/adr/0007-flow-skill-kit-tool-boundary.md +2 -0
  66. package/docs/adr/0015-flow-flow-agents-boundary-reconciliation.md +35 -0
  67. package/docs/adr/0019-kit-dependency-ownership.md +62 -0
  68. package/docs/adr/0020-trust-reconcile-manifest-and-claim-classification.md +290 -0
  69. package/docs/adr/0021-assignment-leases-and-stale-claim-takeover.md +221 -0
  70. package/docs/adr/0022-fail-closed-delivery-reconciliation-with-governed-exemptions.md +463 -0
  71. package/docs/agent-system-guidebook.md +3 -3
  72. package/docs/agent-usage-feedback-loop.md +6 -6
  73. package/docs/context-map.md +10 -7
  74. package/docs/decisions/decision-records.md +57 -0
  75. package/docs/decisions/index.md +17 -0
  76. package/docs/decisions/knowledge-store-provider.md +51 -0
  77. package/docs/decisions/model-routing.md +63 -0
  78. package/docs/decisions/promotion-gate.md +52 -0
  79. package/docs/decisions/standing-directives.md +66 -0
  80. package/docs/developer-architecture.md +1 -1
  81. package/docs/fixture-ownership.md +4 -0
  82. package/docs/flow-kit-repository-contract.md +5 -5
  83. package/docs/getting-started.md +12 -2
  84. package/docs/integrations/harness-install.md +2 -1
  85. package/docs/kit-authoring-guide.md +64 -5
  86. package/docs/knowledge-kit.md +5 -1
  87. package/docs/learnings/2026-07-improvement-program.md +203 -0
  88. package/docs/migrations.md +6 -5
  89. package/docs/north-star.md +2 -2
  90. package/docs/operating-layers.md +4 -3
  91. package/docs/repository-structure.md +5 -5
  92. package/docs/skills-map.md +8 -8
  93. package/docs/spec/runtime-hook-surface.md +19 -15
  94. package/docs/spikes/graph-provider-2026-07.md +155 -0
  95. package/docs/standards-register.md +7 -7
  96. package/docs/trust-anchor-adoption.md +105 -4
  97. package/docs/work-item-adapters.md +1 -1
  98. package/docs/workflow-artifact-lifecycle.md +72 -9
  99. package/docs/workflow-eval-strategy.md +3 -3
  100. package/docs/workflow-shared-contracts.md +3 -2
  101. package/docs/workflow-usage-guide.md +260 -21
  102. package/evals/acceptance/DEMO-false-completion.md +20 -11
  103. package/evals/acceptance/prove-capture-teeth-declared.sh +15 -15
  104. package/evals/acceptance/prove-capture-teeth.sh +11 -11
  105. package/evals/acceptance/test_kiro_harness.sh +1 -1
  106. package/evals/ci/antigaming-suite.sh +5 -0
  107. package/evals/ci/run-baseline.sh +71 -1
  108. package/evals/fixtures/assignment-provider/actor-a.json +6 -0
  109. package/evals/fixtures/assignment-provider/actor-b.json +6 -0
  110. package/evals/fixtures/assignment-provider/github-issue-claimed.json +27 -0
  111. package/evals/fixtures/assignment-provider/github-issue-unassigned.json +7 -0
  112. package/evals/fixtures/assignment-provider/liveness-fresh.json +9 -0
  113. package/evals/fixtures/assignment-provider/liveness-stale.json +9 -0
  114. package/evals/fixtures/flow-kit-repository/invalid-bad-dependency/flows/review.flow.json +26 -0
  115. package/evals/fixtures/flow-kit-repository/invalid-bad-dependency/kit.json +13 -0
  116. package/evals/fixtures/flow-kit-repository/valid-with-dependency/flows/review.flow.json +26 -0
  117. package/evals/fixtures/flow-kit-repository/valid-with-dependency/kit.json +13 -0
  118. package/evals/fixtures/hook-influence/cases.json +32 -0
  119. package/evals/fixtures/pull-work-provider/github-issues.json +6 -6
  120. package/evals/fixtures/trust-reconcile-exploits/fabricated-attestation.json +59 -0
  121. package/evals/fixtures/trust-reconcile-exploits/no-label-bypass.json +36 -0
  122. package/evals/fixtures/trust-reconcile-exploits/skip-assumed-bypass.json +59 -0
  123. package/evals/fixtures/trust-reconcile-exploits/status-misassertion.json +48 -0
  124. package/evals/fixtures/trust-reconcile-exploits/waived-command-check.json +44 -0
  125. package/evals/fixtures/trust-reconcile-mixed-bundle/mixed-bundle.json +159 -0
  126. package/evals/fixtures/trust-reconcile-ws3/ws3-bundle.json +920 -0
  127. package/evals/integration/test_actor_identity.sh +254 -0
  128. package/evals/integration/test_assignment_provider_github.sh +318 -0
  129. package/evals/integration/test_assignment_provider_local_file.sh +222 -0
  130. package/evals/integration/test_builder_step_producers.sh +33 -23
  131. package/evals/integration/test_bundle_install.sh +22 -16
  132. package/evals/integration/test_bundle_lifecycle.sh +11 -11
  133. package/evals/integration/test_captured_fail_reconciliation.sh +50 -50
  134. package/evals/integration/test_checkpoint_signing.sh +43 -0
  135. package/evals/integration/test_claim_lookup.sh +4 -4
  136. package/evals/integration/test_codex_hook_resolution.sh +114 -0
  137. package/evals/integration/test_command_log_concurrency.sh +8 -8
  138. package/evals/integration/test_command_log_fork_classification.sh +3 -3
  139. package/evals/integration/test_command_log_integrity.sh +16 -16
  140. package/evals/integration/test_console_learning_projection.sh +1 -1
  141. package/evals/integration/test_critique_supersession_roundtrip.sh +182 -0
  142. package/evals/integration/test_dual_emit_flow_step.sh +145 -0
  143. package/evals/integration/test_enforcer_expects_driven.sh +12 -12
  144. package/evals/integration/test_evidence_capture_hook.sh +14 -13
  145. package/evals/integration/test_fixture_retirement_audit.sh +2 -2
  146. package/evals/integration/test_flow_agents_statusline.sh +2 -2
  147. package/evals/integration/test_flow_kit_install_git.sh +52 -0
  148. package/evals/integration/test_flow_kit_repository.sh +2 -0
  149. package/evals/integration/test_flowdef_session_activation.sh +6 -6
  150. package/evals/integration/test_flowdef_union_floor_regression.sh +429 -0
  151. package/evals/integration/test_gate_bypass_chain.sh +52 -40
  152. package/evals/integration/test_gate_lockdown.sh +97 -73
  153. package/evals/integration/test_gate_review_inquiry_records.sh +3 -3
  154. package/evals/integration/test_goal_fit_escape_hatch.sh +10 -10
  155. package/evals/integration/test_goal_fit_ghost_session.sh +104 -0
  156. package/evals/integration/test_goal_fit_hook.sh +32 -32
  157. package/evals/integration/test_goal_fit_rederive.sh +9 -9
  158. package/evals/integration/test_hook_category_behaviors.sh +103 -0
  159. package/evals/integration/test_hook_influence_cases.sh +1 -0
  160. package/evals/integration/test_install_merge.sh +262 -1
  161. package/evals/integration/test_kit_identity_trust.sh +6 -6
  162. package/evals/integration/test_liveness_conflict_injection.sh +587 -0
  163. package/evals/integration/test_liveness_heartbeat.sh +677 -0
  164. package/evals/integration/test_liveness_verdict.sh +394 -0
  165. package/evals/integration/test_local_flow_kit_install.sh +15 -0
  166. package/evals/integration/test_phase_map_and_gate_claim.sh +63 -11
  167. package/evals/integration/test_promote_gate.sh +178 -0
  168. package/evals/integration/test_publish_delivery.sh +23 -6
  169. package/evals/integration/test_pull_work_assignment_join.sh +132 -0
  170. package/evals/integration/test_pull_work_liveness_preflight.sh +394 -0
  171. package/evals/integration/test_pull_work_provider.sh +2 -2
  172. package/evals/integration/test_reconcile_soundness.sh +37 -13
  173. package/evals/integration/test_resolvefirststep_security.sh +22 -0
  174. package/evals/integration/test_runtime_adapter_activation.sh +87 -18
  175. package/evals/integration/test_session_resume_roundtrip.sh +147 -0
  176. package/evals/integration/test_sidecar_field_preservation.sh +249 -0
  177. package/evals/integration/test_trust_reconcile.sh +11 -10
  178. package/evals/integration/test_trust_reconcile_manifest.sh +79 -0
  179. package/evals/integration/test_trust_reconcile_mixed_bundle.sh +96 -0
  180. package/evals/integration/test_trust_reconcile_negatives.sh +759 -0
  181. package/evals/integration/test_usage_feedback_global.sh +5 -5
  182. package/evals/integration/test_validate_artifacts_portability.sh +60 -0
  183. package/evals/integration/test_verify_cli.sh +2 -2
  184. package/evals/integration/test_veritas_governance_kit.sh +117 -0
  185. package/evals/integration/test_workflow_artifact_cleanup_audit.sh +26 -1
  186. package/evals/integration/test_workflow_artifacts.sh +33 -0
  187. package/evals/integration/test_workflow_sidecar_writer.sh +802 -74
  188. package/evals/integration/test_workflow_steering_hook.sh +175 -5
  189. package/evals/lib/codex-provider.sh +1 -1
  190. package/evals/lib/node.sh +19 -1
  191. package/evals/run.sh +32 -0
  192. package/evals/static/test_decisions.sh +150 -0
  193. package/evals/static/test_flowdef_codeowners_coverage.sh +62 -0
  194. package/evals/static/test_knowledge_providers.sh +23 -0
  195. package/evals/static/test_package.sh +19 -10
  196. package/evals/static/test_universal_bundles.sh +48 -3
  197. package/evals/static/test_workflow_skills.sh +41 -8
  198. package/kits/builder/flows/build.flow.json +3 -74
  199. package/kits/builder/flows/publish-learn.flow.json +90 -0
  200. package/kits/builder/kit.json +11 -0
  201. package/kits/builder/skills/builder-shape/SKILL.md +1 -1
  202. package/kits/builder/skills/deliver/SKILL.md +32 -11
  203. package/kits/builder/skills/design-probe/SKILL.md +4 -4
  204. package/kits/builder/skills/evidence-gate/SKILL.md +26 -1
  205. package/kits/builder/skills/execute-plan/SKILL.md +2 -2
  206. package/kits/builder/skills/fix-bug/SKILL.md +2 -0
  207. package/kits/builder/skills/gate-review/SKILL.md +6 -6
  208. package/kits/builder/skills/idea-to-backlog/SKILL.md +1 -1
  209. package/kits/builder/skills/learning-review/SKILL.md +7 -7
  210. package/kits/builder/skills/pickup-probe/SKILL.md +5 -4
  211. package/kits/builder/skills/plan-work/SKILL.md +27 -5
  212. package/kits/builder/skills/pull-work/SKILL.md +148 -5
  213. package/kits/builder/skills/release-readiness/SKILL.md +4 -4
  214. package/kits/builder/skills/review-work/SKILL.md +24 -1
  215. package/kits/builder/skills/tdd-workflow/SKILL.md +2 -0
  216. package/kits/builder/skills/verify-work/SKILL.md +8 -1
  217. package/kits/catalog.json +6 -0
  218. package/kits/knowledge/kit.json +35 -0
  219. package/kits/knowledge/providers/conformance/fixtures/git-repo/CONTEXT.md +12 -0
  220. package/kits/knowledge/providers/conformance/fixtures/git-repo/docs/decisions/old-sprocket-shape.md +13 -0
  221. package/kits/knowledge/providers/conformance/fixtures/git-repo/docs/decisions/sprocket-shape.md +14 -0
  222. package/kits/knowledge/providers/conformance/fixtures/git-repo/docs/decisions/widget-format.md +14 -0
  223. package/kits/knowledge/providers/conformance/fixtures/git-repo/docs/learnings/fixture-learning.md +7 -0
  224. package/kits/knowledge/providers/conformance/fixtures/work-item/issues.json +30 -0
  225. package/kits/knowledge/providers/conformance/suite.test.js +125 -0
  226. package/kits/knowledge/providers/git-repo/index.js +236 -0
  227. package/kits/knowledge/providers/health/health-pass.test.js +99 -0
  228. package/kits/knowledge/providers/health/index.js +153 -0
  229. package/kits/knowledge/providers/index.js +24 -0
  230. package/kits/knowledge/providers/lib/model.js +91 -0
  231. package/kits/knowledge/providers/lib/schema-validate.js +119 -0
  232. package/kits/knowledge/providers/markdown-vault/index.js +169 -0
  233. package/kits/knowledge/providers/work-item/index.js +204 -0
  234. package/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +178 -0
  235. package/kits/veritas-governance/docs/README.md +75 -0
  236. package/kits/veritas-governance/fixtures/readiness/not-ready.readiness-report.json +4645 -0
  237. package/kits/veritas-governance/fixtures/readiness/ready.readiness-report.json +4403 -0
  238. package/kits/veritas-governance/flows/readiness-check.flow.json +35 -0
  239. package/kits/veritas-governance/kit.json +16 -0
  240. package/package.json +11 -5
  241. package/packaging/README.md +2 -2
  242. package/packaging/conformance/fixtures/config-protection--allow-read-state-json.json +20 -0
  243. package/packaging/conformance/fixtures/config-protection--block-write-state-json.json +20 -0
  244. package/packaging/conformance/fixtures/stop-goal-fit--block-bundle-disputed-claim.json +1 -1
  245. package/packaging/conformance/fixtures/stop-goal-fit--block-capture-contradicts-claimed-pass.json +1 -1
  246. package/packaging/manifest.json +9 -10
  247. package/schemas/assignment-provider-settings.schema.json +125 -0
  248. package/schemas/decision-record.schema.json +109 -0
  249. package/schemas/knowledge/edge.schema.json +54 -0
  250. package/schemas/knowledge/health-report.schema.json +45 -0
  251. package/schemas/knowledge/node.schema.json +49 -0
  252. package/schemas/knowledge/proposal.schema.json +53 -0
  253. package/schemas/workflow-evidence.schema.json +1 -1
  254. package/schemas/workflow-state.schema.json +5 -0
  255. package/scripts/README.md +8 -3
  256. package/scripts/check-content-boundary.cjs +1 -1
  257. package/scripts/check-decisions.cjs +356 -0
  258. package/scripts/ci/derive-claim-status.mjs +74 -0
  259. package/scripts/ci/trust-reconcile.js +957 -103
  260. package/scripts/git-status.sh +2 -2
  261. package/scripts/hooks/claude-telemetry-hook.js +37 -3
  262. package/scripts/hooks/codex-telemetry-hook.js +36 -2
  263. package/scripts/hooks/config-protection.js +102 -30
  264. package/scripts/hooks/evidence-capture.js +3 -3
  265. package/scripts/hooks/lib/actor-identity.js +368 -0
  266. package/scripts/hooks/lib/config-protection-remedies.js +69 -0
  267. package/scripts/hooks/lib/liveness-heartbeat.js +361 -0
  268. package/scripts/hooks/lib/liveness-policy.js +127 -0
  269. package/scripts/hooks/lib/liveness-read.js +105 -12
  270. package/scripts/hooks/lib/liveness-write.js +46 -0
  271. package/scripts/hooks/lib/local-artifact-paths.js +12 -6
  272. package/scripts/hooks/opencode-telemetry-hook.js +27 -1
  273. package/scripts/hooks/pi-telemetry-hook.js +27 -1
  274. package/scripts/hooks/stop-goal-fit.js +157 -26
  275. package/scripts/hooks/workflow-steering.js +77 -3
  276. package/scripts/install-codex-home.sh +138 -38
  277. package/scripts/statusline/flow-agents-statusline.js +2 -2
  278. package/src/cli/assignment-provider.ts +845 -0
  279. package/src/cli/console-learning-projection.ts +3 -2
  280. package/src/cli/effective-assignment-provider-settings.ts +112 -0
  281. package/src/cli/init.ts +101 -21
  282. package/src/cli/kit.ts +37 -6
  283. package/src/cli/public-api.test.mjs +58 -6
  284. package/src/cli/pull-work-provider.ts +1 -1
  285. package/src/cli/trust-bundle-policy-order.test.mjs +87 -0
  286. package/src/cli/usage-feedback.ts +3 -3
  287. package/src/cli/validate-hook-influence.ts +1 -0
  288. package/src/cli/validate-workflow-artifacts.ts +27 -7
  289. package/src/cli/veritas-readiness-adapter.test.mjs +267 -0
  290. package/src/cli/workflow-artifact-cleanup-audit.ts +35 -2
  291. package/src/cli/workflow-sidecar.ts +933 -168
  292. package/src/cli.ts +6 -0
  293. package/src/flow-kit/validate.ts +74 -1
  294. package/src/index.ts +6 -2
  295. package/src/lib/flow-resolver.ts +123 -55
  296. package/src/lib/local-artifact-root.ts +24 -5
  297. package/src/lib/workflow-learning-projection.ts +2 -2
  298. package/src/runtime-adapters.ts +61 -15
  299. package/src/tools/build-universal-bundles.ts +49 -16
  300. package/src/tools/generate-context-map.ts +10 -8
  301. package/src/tools/validate-source-tree.ts +24 -1
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # install-codex-home.sh - Install Flow Agents as an isolated Codex home.
2
+ # install-codex-home.sh - Install Flow Agents into a Codex home.
3
3
  set -euo pipefail
4
4
 
5
5
  ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
@@ -19,7 +19,7 @@ Options:
19
19
  EOF
20
20
  }
21
21
 
22
- DEST="$HOME/.flow-agents/codex"
22
+ DEST="${CODEX_HOME:-$HOME/.codex}"
23
23
  DEST_SET=0
24
24
  CONSOLE_CONFIG_ARGS=()
25
25
  while [[ $# -gt 0 ]]; do
@@ -59,47 +59,144 @@ else
59
59
  fi
60
60
 
61
61
  mkdir -p "$DEST"
62
+ DEST_REAL="$(cd "$DEST" && pwd -P)"
62
63
 
63
- # Stash the user's existing hooks.json (if any) BEFORE cleaning, so the merge
64
- # step below can preserve user hooks across re-installs.
64
+ assert_safe_dest_path() {
65
+ local rel="$1"
66
+ local current="$DEST"
67
+ local part
68
+ IFS='/' read -r -a parts <<< "$rel"
69
+ for part in "${parts[@]}"; do
70
+ [[ -n "$part" && "$part" != "." ]] || continue
71
+ [[ "$part" != ".." ]] || { echo "install-codex-home.sh: unsafe destination path: $rel" >&2; exit 1; }
72
+ current="$current/$part"
73
+ if [[ -L "$current" ]]; then
74
+ echo "install-codex-home.sh: refusing to write through symlink: $current" >&2
75
+ exit 1
76
+ fi
77
+ done
78
+ local parent
79
+ parent="$(dirname "$current")"
80
+ mkdir -p "$parent"
81
+ local parent_real
82
+ parent_real="$(cd "$parent" && pwd -P)"
83
+ case "$parent_real/" in
84
+ "$DEST_REAL"/*) ;;
85
+ *) echo "install-codex-home.sh: destination escapes Codex home: $current" >&2; exit 1 ;;
86
+ esac
87
+ }
88
+
89
+ # Stash the user's existing hooks.json (if any), so the merge step below can
90
+ # preserve user hooks across installs while replacing Flow Agents-managed groups.
65
91
  FA_USER_HOOKS_STASH=""
92
+ assert_safe_dest_path "hooks.json"
66
93
  if [[ -f "$DEST/hooks.json" ]]; then
67
94
  FA_USER_HOOKS_STASH="$(mktemp /tmp/fa-user-hooks.XXXXXX.json)"
68
95
  cp "$DEST/hooks.json" "$FA_USER_HOOKS_STASH"
69
96
  fi
70
97
 
71
- # This is an isolated generated Codex home. Clean generated bundle content before
72
- # overlaying so renamed/deleted source files do not survive across installs.
73
- rm -rf \
74
- "$DEST/.flow-agents" \
75
- "$DEST/.codex" \
76
- "$DEST/AGENTS.md" \
77
- "$DEST/README.md" \
78
- "$DEST/console.telemetry.json" \
79
- "$DEST/install.sh" \
80
- "$DEST/config.toml" \
81
- "$DEST/hooks.json" \
82
- "$DEST/agent-cards" \
83
- "$DEST/agents" \
84
- "$DEST/context" \
85
- "$DEST/docs" \
86
- "$DEST/evals" \
87
- "$DEST/integrations" \
88
- "$DEST/kits" \
89
- "$DEST/packaging" \
90
- "$DEST/powers" \
91
- "$DEST/prompts" \
92
- "$DEST/schemas" \
93
- "$DEST/scripts" \
94
- "$DEST/skills"
95
- find "$DEST" -maxdepth 1 -type f -name 'k*.config.toml' -delete
96
-
97
- rsync -a "$ROOT_DIR/dist/codex/." "$DEST/"
98
- rsync -a "$ROOT_DIR/dist/codex/.codex/." "$DEST/"
99
- rm -rf "$DEST/.codex" 2>/dev/null || true
98
+ # A real Codex home can contain user-owned config, profiles, auth, hooks, and
99
+ # locally installed kits. Update Flow Agents-owned bundle trees in place without
100
+ # deleting that state. `kits/local` is user/runtime state; everything else under
101
+ # the generated bundle paths is managed by this installer.
102
+ for managed_dir in \
103
+ .flow-agents \
104
+ agent-cards \
105
+ build \
106
+ context \
107
+ docs \
108
+ evals \
109
+ integrations \
110
+ packaging \
111
+ powers \
112
+ prompts \
113
+ schemas \
114
+ scripts
115
+ do
116
+ if [[ -d "$ROOT_DIR/dist/codex/$managed_dir" ]]; then
117
+ assert_safe_dest_path "$managed_dir"
118
+ mkdir -p "$DEST/$managed_dir"
119
+ rsync -a --delete "$ROOT_DIR/dist/codex/$managed_dir/" "$DEST/$managed_dir/"
120
+ fi
121
+ done
122
+
123
+ # Skills are user-extensible in a real Codex home. Merge both bundle skill
124
+ # layers into the flattened destination without deleting user-owned skills.
125
+ if [[ -d "$ROOT_DIR/dist/codex/skills" ]]; then
126
+ assert_safe_dest_path "skills"
127
+ mkdir -p "$DEST/skills"
128
+ rsync -a "$ROOT_DIR/dist/codex/skills/" "$DEST/skills/"
129
+ fi
130
+
131
+ if [[ -d "$ROOT_DIR/dist/codex/.codex/skills" ]]; then
132
+ assert_safe_dest_path "skills"
133
+ mkdir -p "$DEST/skills"
134
+ rsync -a "$ROOT_DIR/dist/codex/.codex/skills/" "$DEST/skills/"
135
+ fi
136
+
137
+ if [[ -d "$ROOT_DIR/dist/codex/kits" ]]; then
138
+ assert_safe_dest_path "kits"
139
+ mkdir -p "$DEST/kits"
140
+ rsync -a --delete --exclude 'local/' "$ROOT_DIR/dist/codex/kits/" "$DEST/kits/"
141
+ fi
142
+
143
+ # Agents are user-extensible in a real Codex home. Merge generated agents
144
+ # without deleting user-owned agents.
145
+ if [[ -d "$ROOT_DIR/dist/codex/.codex/agents" ]]; then
146
+ assert_safe_dest_path "agents"
147
+ mkdir -p "$DEST/agents"
148
+ rsync -a "$ROOT_DIR/dist/codex/.codex/agents/" "$DEST/agents/"
149
+ fi
150
+
151
+ for bundle_file in README.md console.telemetry.json install.sh; do
152
+ if [[ -f "$ROOT_DIR/dist/codex/$bundle_file" ]]; then
153
+ assert_safe_dest_path "$bundle_file"
154
+ cp "$ROOT_DIR/dist/codex/$bundle_file" "$DEST/$bundle_file"
155
+ fi
156
+ done
157
+
158
+ # Root Codex config/profiles and AGENTS.md may be user-owned in ~/.codex.
159
+ # Seed Flow Agents defaults only when absent.
160
+ for seed_file in AGENTS.md; do
161
+ if [[ -f "$ROOT_DIR/dist/codex/$seed_file" && ! -e "$DEST/$seed_file" ]]; then
162
+ assert_safe_dest_path "$seed_file"
163
+ cp "$ROOT_DIR/dist/codex/$seed_file" "$DEST/$seed_file"
164
+ fi
165
+ done
166
+ generated_profile_files=()
167
+ profile_names=()
168
+ for seed_source in "$ROOT_DIR/dist/codex/.codex/config.toml" "$ROOT_DIR"/dist/codex/.codex/*.config.toml; do
169
+ [[ -f "$seed_source" ]] || continue
170
+ seed_file="$(basename "$seed_source")"
171
+ if [[ "$seed_file" == *.config.toml ]]; then
172
+ generated_profile_files+=("$seed_file")
173
+ profile_names+=("${seed_file%.config.toml}")
174
+ fi
175
+ if [[ ! -e "$DEST/$seed_file" ]] || grep -q 'Generated from packaging/manifest.json' "$DEST/$seed_file"; then
176
+ assert_safe_dest_path "$seed_file"
177
+ cp "$seed_source" "$DEST/$seed_file"
178
+ fi
179
+ done
180
+ for profile_path in "$DEST"/*.config.toml; do
181
+ [[ -f "$profile_path" ]] || continue
182
+ profile_file="$(basename "$profile_path")"
183
+ keep_generated=0
184
+ for generated_file in "${generated_profile_files[@]}"; do
185
+ if [[ "$profile_file" == "$generated_file" ]]; then
186
+ keep_generated=1
187
+ break
188
+ fi
189
+ done
190
+ if [[ "$keep_generated" -eq 0 ]] && grep -q 'Generated from packaging/manifest.json' "$profile_path"; then
191
+ assert_safe_dest_path "$profile_file"
192
+ rm -f "$profile_path"
193
+ fi
194
+ done
195
+ rmdir "$DEST/.codex" 2>/dev/null || true
100
196
 
101
197
  for auth_file in auth.json version.json installation_id models_cache.json; do
102
- if [[ -f "$REAL_CODEX_HOME/$auth_file" ]]; then
198
+ if [[ "$REAL_CODEX_HOME" != "$DEST" && -f "$REAL_CODEX_HOME/$auth_file" ]]; then
199
+ assert_safe_dest_path "$auth_file"
103
200
  cp "$REAL_CODEX_HOME/$auth_file" "$DEST/$auth_file"
104
201
  fi
105
202
  done
@@ -122,7 +219,7 @@ if command -v node >/dev/null 2>&1 && [[ -f "$FA_MANAGED_HOOKS" ]]; then
122
219
  --managed-hooks "$FA_MANAGED_HOOKS" \
123
220
  --version "$FA_VERSION" \
124
221
  --install-record "$DEST/.flow-agents/install.json" \
125
- --runtime "codex" || true
222
+ --runtime "codex"
126
223
  # Move the merged result into the destination.
127
224
  cp "$FA_USER_HOOKS_STASH" "$DEST/hooks.json"
128
225
  rm -f "$FA_USER_HOOKS_STASH"
@@ -133,7 +230,7 @@ if command -v node >/dev/null 2>&1 && [[ -f "$FA_MANAGED_HOOKS" ]]; then
133
230
  --managed-hooks "$FA_MANAGED_HOOKS" \
134
231
  --version "$FA_VERSION" \
135
232
  --install-record "$DEST/.flow-agents/install.json" \
136
- --runtime "codex" || true
233
+ --runtime "codex"
137
234
  fi
138
235
  fi
139
236
 
@@ -141,5 +238,8 @@ if [[ ${#CONSOLE_CONFIG_ARGS[@]} -gt 0 || -n "${FLOW_AGENTS_TELEMETRY_SINK:-}" |
141
238
  bash "$DEST/scripts/telemetry/install-console-config.sh" "$DEST/scripts/telemetry/telemetry.conf" "${CONSOLE_CONFIG_ARGS[@]}"
142
239
  fi
143
240
 
144
- echo "Installed isolated Flow Agents Codex home at $DEST"
145
- echo "Use: CODEX_HOME=$DEST codex --profile kdev"
241
+ echo "Installed Flow Agents into Codex home at $DEST"
242
+ if [[ "${#profile_names[@]}" -gt 0 ]]; then
243
+ echo "Profiles: ${profile_names[*]}"
244
+ fi
245
+ echo "Use: codex --profile builder"
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Compact Flow Agents workflow status for runtimes with status bar support.
4
4
  *
5
- * Reads optional runtime JSON from stdin, discovers `.flow-agents`, and
5
+ * Reads optional runtime JSON from stdin, discovers `.kontourai/flow-agents`, and
6
6
  * prints one ASCII line suitable for Claude Code statusLine or Pi setStatus.
7
7
  */
8
8
 
@@ -56,7 +56,7 @@ function runtimeCwd(input) {
56
56
  function findWorkflowRoot(startDir) {
57
57
  let current = path.resolve(startDir || process.cwd());
58
58
  for (;;) {
59
- const candidate = path.join(current, '.flow-agents');
59
+ const candidate = path.join(current, '.kontourai', 'flow-agents');
60
60
  if (fs.existsSync(candidate)) return candidate;
61
61
  const parent = path.dirname(current);
62
62
  if (parent === current) return null;