@kontourai/flow-agents 1.0.1 → 1.2.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 (111) hide show
  1. package/.github/workflows/ci.yml +110 -0
  2. package/.github/workflows/runtime-compat.yml +5 -2
  3. package/CHANGELOG.md +42 -0
  4. package/README.md +26 -5
  5. package/build/src/cli/console-learning-projection.js +19 -2
  6. package/build/src/cli/effective-backlog-settings.js +18 -2
  7. package/build/src/cli/fixture-retirement-audit.js +19 -2
  8. package/build/src/cli/init.js +19 -2
  9. package/build/src/cli/{flow-kit.js → kit.js} +122 -108
  10. package/build/src/cli/promote-workflow-artifact.js +19 -2
  11. package/build/src/cli/publish-change-helper.js +19 -2
  12. package/build/src/cli/pull-work-provider.js +19 -2
  13. package/build/src/cli/runtime-adapter.js +20 -2
  14. package/build/src/cli/usage-feedback.js +19 -2
  15. package/build/src/cli/utterance-check.js +19 -2
  16. package/build/src/cli/validate-hook-influence.js +19 -2
  17. package/build/src/cli/validate-source-tree.js +4 -4
  18. package/build/src/cli/veritas-governance.js +19 -2
  19. package/build/src/cli/workflow-artifact-cleanup-audit.js +19 -2
  20. package/build/src/cli.js +3 -3
  21. package/build/src/flow-kit/validate.js +58 -62
  22. package/build/src/runtime-adapters.js +55 -24
  23. package/build/src/tools/build-universal-bundles.js +83 -19
  24. package/build/src/tools/generate-context-map.js +68 -9
  25. package/build/src/tools/validate-package.js +19 -2
  26. package/build/src/tools/validate-source-tree.js +51 -3
  27. package/context/scripts/telemetry/console-presets.sh +1 -1
  28. package/docs/adr/0007-flow-skill-kit-tool-boundary.md +169 -0
  29. package/docs/adr/0007-skill-audit.md +112 -0
  30. package/docs/adr/0008-kit-operation-boundary.md +88 -0
  31. package/docs/context-map.md +18 -22
  32. package/docs/flow-kit-repository-contract.md +5 -5
  33. package/docs/getting-started.md +177 -0
  34. package/docs/index.md +19 -8
  35. package/docs/kit-authoring-guide.md +46 -10
  36. package/docs/knowledge-kit.md +2 -2
  37. package/docs/spec/runtime-hook-surface.md +1 -1
  38. package/docs/vision.md +1 -1
  39. package/docs/workflow-usage-guide.md +1 -1
  40. package/evals/ci/run-baseline.sh +55 -8
  41. package/evals/fixtures/builder-kit-workflow-state/happy-path.json +2 -2
  42. package/evals/fixtures/builder-kit-workflow-state/mid-work-resume.json +2 -2
  43. package/evals/fixtures/console-learning-projection/artifacts/console-learning-correction/learning.json +1 -1
  44. package/evals/fixtures/pull-work-provider/github-issues.json +5 -5
  45. package/evals/integration/test_activate_npx_context.sh +2 -2
  46. package/evals/integration/test_bundle_install.sh +17 -12
  47. package/evals/integration/test_console_learning_projection.sh +1 -1
  48. package/evals/integration/test_flow_kit_install_git.sh +7 -7
  49. package/evals/integration/test_flow_kit_repository.sh +4 -4
  50. package/evals/integration/test_kit_conformance_levels.sh +1 -1
  51. package/evals/integration/test_local_flow_kit_install.sh +7 -7
  52. package/evals/integration/test_publish_change_helper.sh +1 -1
  53. package/evals/integration/test_pull_work_provider.sh +1 -1
  54. package/evals/integration/test_runtime_adapter_activation.sh +140 -19
  55. package/evals/lib/node.sh +2 -2
  56. package/evals/run.sh +2 -0
  57. package/evals/static/test_console_presets.sh +49 -0
  58. package/evals/static/test_workflow_skills.sh +15 -15
  59. package/integrations/strands/flow_agents_strands/steering.py +1 -1
  60. package/integrations/strands-ts/src/hooks.ts +1 -1
  61. package/kits/builder/kit.json +17 -0
  62. package/{skills → kits/builder/skills}/builder-shape/SKILL.md +4 -4
  63. package/{skills → kits/builder/skills}/idea-to-backlog/SKILL.md +1 -1
  64. package/kits/knowledge/kit.json +16 -9
  65. package/package.json +8 -5
  66. package/packaging/packs.json +1 -21
  67. package/scripts/README.md +1 -1
  68. package/scripts/kit.js +2 -0
  69. package/scripts/telemetry/console-presets.sh +1 -1
  70. package/skills/README.md +23 -0
  71. package/src/cli/console-learning-projection.ts +7 -1
  72. package/src/cli/effective-backlog-settings.ts +6 -1
  73. package/src/cli/fixture-retirement-audit.ts +7 -1
  74. package/src/cli/init.ts +7 -1
  75. package/src/cli/{flow-kit.ts → kit.ts} +124 -109
  76. package/src/cli/promote-workflow-artifact.ts +7 -1
  77. package/src/cli/publish-change-helper.ts +7 -1
  78. package/src/cli/pull-work-provider.ts +7 -1
  79. package/src/cli/runtime-adapter.ts +8 -1
  80. package/src/cli/usage-feedback.ts +7 -1
  81. package/src/cli/utterance-check.ts +7 -1
  82. package/src/cli/validate-hook-influence.ts +7 -1
  83. package/src/cli/validate-source-tree.ts +4 -4
  84. package/src/cli/veritas-governance.ts +7 -1
  85. package/src/cli/workflow-artifact-cleanup-audit.ts +7 -1
  86. package/src/cli.ts +3 -3
  87. package/src/flow-kit/validate.ts +63 -57
  88. package/src/runtime-adapters.ts +54 -26
  89. package/src/tools/build-universal-bundles.ts +67 -14
  90. package/src/tools/generate-context-map.ts +43 -7
  91. package/src/tools/validate-package.ts +7 -1
  92. package/src/tools/validate-source-tree.ts +34 -2
  93. package/scripts/flow-kit.js +0 -2
  94. package/skills/context-budget/SKILL.md +0 -40
  95. package/skills/explore/SKILL.md +0 -137
  96. package/skills/feedback-loop/SKILL.md +0 -87
  97. package/skills/frontend-design/SKILL.md +0 -80
  98. /package/{skills → kits/builder/skills}/deliver/SKILL.md +0 -0
  99. /package/{skills → kits/builder/skills}/design-probe/SKILL.md +0 -0
  100. /package/{skills → kits/builder/skills}/evidence-gate/SKILL.md +0 -0
  101. /package/{skills → kits/builder/skills}/execute-plan/SKILL.md +0 -0
  102. /package/{skills → kits/builder/skills}/fix-bug/SKILL.md +0 -0
  103. /package/{skills → kits/builder/skills}/learning-review/SKILL.md +0 -0
  104. /package/{skills → kits/builder/skills}/pickup-probe/SKILL.md +0 -0
  105. /package/{skills → kits/builder/skills}/plan-work/SKILL.md +0 -0
  106. /package/{skills → kits/builder/skills}/pull-work/SKILL.md +0 -0
  107. /package/{skills → kits/builder/skills}/release-readiness/SKILL.md +0 -0
  108. /package/{skills → kits/builder/skills}/review-work/SKILL.md +0 -0
  109. /package/{skills → kits/builder/skills}/tdd-workflow/SKILL.md +0 -0
  110. /package/{skills → kits/builder/skills}/verify-work/SKILL.md +0 -0
  111. /package/{skills → kits/knowledge/skills}/knowledge-capture/SKILL.md +0 -0
@@ -52,7 +52,7 @@ status=$?
52
52
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.planned_base_sha")" == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ]] && pass "marker normalizes planned_base_sha" || fail "marker normalizes planned_base_sha"
53
53
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.planned_at")" == "2026-06-03T03:23:14Z" ]] && pass "marker normalizes planned_at" || fail "marker normalizes planned_at"
54
54
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.planning_artifact_ref")" == ".flow-agents/idea-to-backlog-source-revision-structured-blockers/idea-to-backlog-source-revision-structured-blockers--plan.md" ]] && pass "marker normalizes planning_artifact_ref" || fail "marker normalizes planning_artifact_ref"
55
- [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.planning_scope_refs.0")" == "skills/idea-to-backlog/SKILL.md" ]] && pass "marker normalizes planning_scope_refs" || fail "marker normalizes planning_scope_refs"
55
+ [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.planning_scope_refs.0")" == "kits/builder/skills/idea-to-backlog/SKILL.md" ]] && pass "marker normalizes planning_scope_refs" || fail "marker normalizes planning_scope_refs"
56
56
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.source_revisions.1.repo")" == "kontourai/flow" ]] && pass "marker preserves repo-scoped source_revisions" || fail "marker preserves repo-scoped source_revisions"
57
57
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.blockers.0.ref.owner")" == "kontourai" ]] && pass "structured blocker preserves provider owner" || fail "structured blocker preserves provider owner"
58
58
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.blockers.0.ref.repo")" == "flow" ]] && pass "structured blocker preserves provider repo" || fail "structured blocker preserves provider repo"
@@ -12,7 +12,7 @@ trap 'rm -rf "$TMP_DIR"' EXIT
12
12
  pass() { echo " ✓ $1"; }
13
13
  fail() { echo " ✗ $1"; errors=$((errors + 1)); }
14
14
 
15
- CLI="$ROOT/scripts/flow-kit.js"
15
+ CLI="$ROOT/scripts/kit.js"
16
16
  DEST="$TMP_DIR/runtime-dest"
17
17
  MIXED_SRC="$ROOT/evals/fixtures/flow-kit-repository/mixed-runtime-kit"
18
18
  OUT="$TMP_DIR/activation.json"
@@ -22,7 +22,7 @@ mkdir -p "$DEST"
22
22
 
23
23
  echo "=== Runtime Adapter Activation Checks ==="
24
24
 
25
- if flow_agents_node "$CLI" install-local "$MIXED_SRC" --dest "$DEST" >"$TMP_DIR/install.out" 2>&1; then
25
+ if flow_agents_node "$CLI" install "$MIXED_SRC" --dest "$DEST" >"$TMP_DIR/install.out" 2>&1; then
26
26
  pass "mixed local kit installs into temp destination"
27
27
  else
28
28
  fail "mixed local kit install failed"
@@ -43,31 +43,68 @@ const data = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
43
43
  const dest = process.argv[3];
44
44
  const catalog = process.argv[4];
45
45
  if (data.selected_adapter !== "codex-local") throw new Error(`unexpected selected_adapter: ${data.selected_adapter}`);
46
- if (JSON.stringify(data.supported_asset_classes) !== JSON.stringify(["flows"])) throw new Error(`unexpected supported_asset_classes: ${data.supported_asset_classes}`);
46
+
47
+ // supported_asset_classes now includes skills and docs (Issue #58)
48
+ const supported = data.supported_asset_classes;
49
+ for (const expected of ["flows", "skills", "docs"]) {
50
+ if (!supported.includes(expected)) throw new Error(`supported_asset_classes missing ${expected}: ${JSON.stringify(supported)}`);
51
+ }
52
+
53
+ // generated_runtime_files: flows activated (builder, mixed), skill activated (mixed.skill), activation manifest
47
54
  const ids = new Set(data.generated_runtime_files.map((item) => item.asset_id));
48
55
  for (const expected of ["builder.shape", "builder.build", "mixed.runtime", "codex-local.activation"]) {
49
56
  if (!ids.has(expected)) throw new Error(`missing generated asset: ${expected}`);
50
57
  }
58
+ // mixed kit skill should now be in generated_runtime_files, not skipped
59
+ if (!ids.has("mixed.skill")) throw new Error("missing generated asset: mixed.skill (skills should be activated now)");
60
+ // mixed kit doc should now be in generated_runtime_files, not skipped
61
+ if (!ids.has("mixed.docs")) throw new Error("missing generated asset: mixed.docs (docs should be activated now)");
62
+
63
+ // All generated files must exist on disk
51
64
  for (const item of data.generated_runtime_files) {
52
65
  const generatedPath = path.join(dest, item.path);
53
66
  if (!fs.existsSync(generatedPath)) throw new Error(`generated file missing: ${generatedPath}`);
54
67
  if (path.resolve(catalog) === path.resolve(generatedPath)) throw new Error("activation generated over kits/catalog.json");
55
68
  }
56
- const classes = new Set(data.skipped_assets.map((item) => item.asset_class));
57
- for (const expected of ["skills", "docs", "adapters", "evals", "assets"]) {
58
- if (!classes.has(expected)) throw new Error(`missing skipped asset class: ${expected}`);
69
+
70
+ // Skills must be written to .flow-agents/runtime/codex/skills/<kit-id>/
71
+ const skillFiles = data.generated_runtime_files.filter((item) => item.asset_class === "skills");
72
+ if (!skillFiles.length) throw new Error("no skills in generated_runtime_files");
73
+ for (const item of skillFiles) {
74
+ if (!item.path.includes(".flow-agents/runtime/codex/skills/")) {
75
+ throw new Error(`skill not under codex skills dir: ${item.path}`);
76
+ }
77
+ if (!fs.existsSync(path.join(dest, item.path))) throw new Error(`skill file missing on disk: ${item.path}`);
78
+ }
79
+
80
+ // Docs must be written to .flow-agents/runtime/codex/docs/<kit-id>/
81
+ const docFiles = data.generated_runtime_files.filter((item) => item.asset_class === "docs");
82
+ if (!docFiles.length) throw new Error("no docs in generated_runtime_files");
83
+ for (const item of docFiles) {
84
+ if (!item.path.includes(".flow-agents/runtime/codex/docs/")) {
85
+ throw new Error(`doc not under codex docs dir: ${item.path}`);
86
+ }
87
+ }
88
+
89
+ // skipped_assets should NOT contain skills or docs any more
90
+ const skippedClasses = new Set(data.skipped_assets.map((item) => item.asset_class));
91
+ if (skippedClasses.has("skills")) throw new Error("skills should not be in skipped_assets after activation fix");
92
+ if (skippedClasses.has("docs")) throw new Error("docs should not be in skipped_assets after activation fix");
93
+
94
+ // adapters, evals, assets still skipped (not activated by codex-local)
95
+ for (const expected of ["adapters", "evals", "assets"]) {
96
+ if (!skippedClasses.has(expected)) throw new Error(`missing skipped asset class: ${expected}`);
59
97
  }
60
98
  for (const item of data.skipped_assets) {
61
99
  for (const key of ["asset_class", "path", "kit_id", "asset_id", "reason"]) {
62
100
  if (!(key in item)) throw new Error(`skipped asset missing ${key}: ${JSON.stringify(item)}`);
63
101
  }
64
- if (!item.reason.includes("diagnostic-only")) throw new Error(`unexpected skip reason: ${item.reason}`);
65
102
  }
66
103
  if (!fs.existsSync(path.join(dest, ".flow-agents/runtime/codex/activation.json"))) throw new Error("runtime activation manifest missing");
67
104
  console.log("ok");
68
105
  NODE
69
106
  then
70
- pass "diagnostics report default adapter, generated files, and skipped unsupported assets"
107
+ pass "diagnostics report default adapter, generated files (flows+skills+docs), and correct skipped_assets (adapters, evals, assets only)"
71
108
  else
72
109
  fail "activation diagnostics are incomplete"
73
110
  sed -n '1,220p' "$OUT"
@@ -108,6 +145,14 @@ STRANDS_DEST="$TMP_DIR/strands-dest"
108
145
  STRANDS_OUT="$TMP_DIR/strands-activation.json"
109
146
  mkdir -p "$STRANDS_DEST"
110
147
 
148
+ # Install the mixed kit into strands dest so we can assert skills land there too
149
+ if flow_agents_node "$CLI" install "$MIXED_SRC" --dest "$STRANDS_DEST" >"$TMP_DIR/strands-install.out" 2>&1; then
150
+ pass "mixed local kit installs into strands temp destination"
151
+ else
152
+ fail "mixed local kit install failed (strands dest)"
153
+ sed -n '1,160p' "$TMP_DIR/strands-install.out"
154
+ fi
155
+
111
156
  # Use the builder kit (stable fixture) — activate for strands-local from the repo source root
112
157
  if flow_agents_node "$CLI" activate --dest "$STRANDS_DEST" --source-root "$ROOT" --adapter strands-local --format json >"$STRANDS_OUT" 2>&1; then
113
158
  pass "strands-local activation succeeds"
@@ -125,25 +170,58 @@ const catalog = process.argv[4];
125
170
 
126
171
  // Verify selected_adapter
127
172
  if (data.selected_adapter !== "strands-local") throw new Error(`expected strands-local, got: ${data.selected_adapter}`);
128
- if (JSON.stringify(data.supported_asset_classes) !== JSON.stringify(["flows"])) throw new Error(`unexpected supported_asset_classes: ${JSON.stringify(data.supported_asset_classes)}`);
173
+
174
+ // supported_asset_classes now includes skills and docs (Issue #58)
175
+ const supported = data.supported_asset_classes;
176
+ for (const expected of ["flows", "skills", "docs"]) {
177
+ if (!supported.includes(expected)) throw new Error(`supported_asset_classes missing ${expected}: ${JSON.stringify(supported)}`);
178
+ }
129
179
 
130
180
  // Verify builder kit flows are generated (builder kit is in catalog.json)
131
181
  const ids = new Set(data.generated_runtime_files.map((item) => item.asset_id));
132
182
  for (const expected of ["builder.shape", "builder.build", "strands-local.activation"]) {
133
183
  if (!ids.has(expected)) throw new Error(`missing generated asset: ${expected}`);
134
184
  }
185
+ // mixed kit skill should be in generated_runtime_files
186
+ if (!ids.has("mixed.skill")) throw new Error("missing generated asset: mixed.skill (skills should be activated by strands-local)");
187
+ // mixed kit doc should be in generated_runtime_files
188
+ if (!ids.has("mixed.docs")) throw new Error("missing generated asset: mixed.docs (docs should be activated by strands-local)");
135
189
 
136
190
  // Verify generated runtime files actually exist on disk
137
191
  for (const item of data.generated_runtime_files) {
138
192
  if (item.asset_class === "activation-manifest") continue;
139
193
  const generatedPath = path.join(dest, item.path);
140
194
  if (!fs.existsSync(generatedPath)) throw new Error(`generated file missing: ${generatedPath}`);
141
- // Verify runtime files are under .flow-agents/runtime/strands/flows/
142
- if (!item.path.includes(".flow-agents/runtime/strands/flows/")) {
143
- throw new Error(`generated path not under strands runtime dir: ${item.path}`);
195
+ // Verify flow files are under .flow-agents/runtime/strands/flows/
196
+ if (item.asset_class === "flows" && !item.path.includes(".flow-agents/runtime/strands/flows/")) {
197
+ throw new Error(`generated flow path not under strands runtime dir: ${item.path}`);
198
+ }
199
+ }
200
+
201
+ // Skills must be written to .flow-agents/runtime/strands/skills/<kit-id>/
202
+ const skillFiles = data.generated_runtime_files.filter((item) => item.asset_class === "skills");
203
+ if (!skillFiles.length) throw new Error("no skills in generated_runtime_files for strands-local");
204
+ for (const item of skillFiles) {
205
+ if (!item.path.includes(".flow-agents/runtime/strands/skills/")) {
206
+ throw new Error(`skill not under strands skills dir: ${item.path}`);
207
+ }
208
+ if (!fs.existsSync(path.join(dest, item.path))) throw new Error(`skill file missing on disk: ${item.path}`);
209
+ }
210
+
211
+ // Docs must be written to .flow-agents/runtime/strands/docs/<kit-id>/
212
+ const docFiles = data.generated_runtime_files.filter((item) => item.asset_class === "docs");
213
+ if (!docFiles.length) throw new Error("no docs in generated_runtime_files for strands-local");
214
+ for (const item of docFiles) {
215
+ if (!item.path.includes(".flow-agents/runtime/strands/docs/")) {
216
+ throw new Error(`doc not under strands docs dir: ${item.path}`);
144
217
  }
145
218
  }
146
219
 
220
+ // skipped_assets should NOT contain skills or docs
221
+ const skippedClasses = new Set(data.skipped_assets.map((item) => item.asset_class));
222
+ if (skippedClasses.has("skills")) throw new Error("skills should not be in skipped_assets for strands-local");
223
+ if (skippedClasses.has("docs")) throw new Error("docs should not be in skipped_assets for strands-local");
224
+
147
225
  // Verify activation.json written at strands runtime dir
148
226
  const manifestPath = path.join(dest, ".flow-agents/runtime/strands/activation.json");
149
227
  if (!fs.existsSync(manifestPath)) throw new Error("strands runtime activation.json missing");
@@ -156,14 +234,8 @@ for (const item of manifest.skipped_assets) {
156
234
  for (const key of ["asset_class", "path", "kit_id", "asset_id", "reason"]) {
157
235
  if (!(key in item)) throw new Error(`skipped asset missing ${key}: ${JSON.stringify(item)}`);
158
236
  }
159
- if (!item.reason.includes("diagnostic-only")) throw new Error(`unexpected skip reason: ${item.reason}`);
160
237
  }
161
238
 
162
- // Non-flow asset classes should appear in skipped_assets
163
- const skippedClasses = new Set(manifest.skipped_assets.map((item) => item.asset_class));
164
- // builder kit has flows only; skipped_assets check requires a kit with non-flow assets,
165
- // which the codex-local path already validates via mixed-runtime-kit above.
166
- // Here we just confirm the field structure is present.
167
239
  if (!Array.isArray(data.skipped_assets)) throw new Error("result skipped_assets is not an array");
168
240
 
169
241
  // Catalog not mutated
@@ -174,7 +246,7 @@ if (path.resolve(catalog) === path.resolve(path.join(dest, ".flow-agents/runtime
174
246
  console.log("ok");
175
247
  NODE
176
248
  then
177
- pass "strands-local: runtime flow files, activation.json, and skipped_assets present with correct structure"
249
+ pass "strands-local: runtime flow+skill+doc files, activation.json, and skipped_assets present with correct structure"
178
250
  else
179
251
  fail "strands-local: activation diagnostics incomplete or incorrect"
180
252
  sed -n '1,220p' "$STRANDS_OUT"
@@ -208,6 +280,55 @@ else
208
280
  sed -n '1,220p' "$TMP_DIR/codex-after-strands.json"
209
281
  fi
210
282
 
283
+ # -------------------------------------------------------------------------
284
+ # Skill activation with a kit that has NO skills (builder kit — flows only)
285
+ # -------------------------------------------------------------------------
286
+
287
+ echo ""
288
+ echo "=== Skills: kit-with-no-skills activates cleanly ==="
289
+
290
+ NO_SKILLS_DEST="$TMP_DIR/no-skills-dest"
291
+ NO_SKILLS_OUT="$TMP_DIR/no-skills-activation.json"
292
+ mkdir -p "$NO_SKILLS_DEST"
293
+
294
+ if flow_agents_node "$CLI" activate --dest "$NO_SKILLS_DEST" --source-root "$ROOT" --format json >"$NO_SKILLS_OUT" 2>&1; then
295
+ pass "activation succeeds for source-root with no skills (builder kit only)"
296
+ else
297
+ fail "activation failed for kit with no skills"
298
+ sed -n '1,220p' "$NO_SKILLS_OUT"
299
+ fi
300
+
301
+ if node - "$NO_SKILLS_OUT" "$NO_SKILLS_DEST" <<'NODE'
302
+ const fs = require("node:fs");
303
+ const path = require("node:path");
304
+ // Use builder-only source root (no installed local kits, built-in kits only)
305
+ const data = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
306
+ const dest = process.argv[3];
307
+ if (data.selected_adapter !== "codex-local") throw new Error(`expected codex-local, got: ${data.selected_adapter}`);
308
+ // builder kit has no skills or docs — skills dir should not exist (or be empty)
309
+ const skillsDir = path.join(dest, ".flow-agents/runtime/codex/skills");
310
+ // It's fine if the dir doesn't exist; builder kit has no skills
311
+ const docsDir = path.join(dest, ".flow-agents/runtime/codex/docs");
312
+ // builder kit has no docs either
313
+ // No skills or docs in skipped_assets (none declared)
314
+ const skippedClasses = new Set(data.skipped_assets.map((item) => item.asset_class));
315
+ // builder kit only has flows — no skills or docs — so neither should appear in skipped
316
+ if (skippedClasses.has("skills")) throw new Error("builder kit (no skills) should not have skills in skipped_assets");
317
+ if (skippedClasses.has("docs")) throw new Error("builder kit (no docs) should not have docs in skipped_assets");
318
+ // Flows must still be activated
319
+ const ids = new Set(data.generated_runtime_files.map((item) => item.asset_id));
320
+ if (!ids.has("builder.shape")) throw new Error("missing builder.shape flow");
321
+ if (!ids.has("builder.build")) throw new Error("missing builder.build flow");
322
+ if (!fs.existsSync(path.join(dest, ".flow-agents/runtime/codex/activation.json"))) throw new Error("activation.json missing");
323
+ console.log("ok");
324
+ NODE
325
+ then
326
+ pass "kit with no skills activates cleanly — flows activated, no skills or docs in skipped_assets"
327
+ else
328
+ fail "kit with no skills activation check failed"
329
+ sed -n '1,220p' "$NO_SKILLS_OUT"
330
+ fi
331
+
211
332
  echo ""
212
333
  if [[ "$errors" -eq 0 ]]; then
213
334
  echo "Runtime adapter activation checks passed."
package/evals/lib/node.sh CHANGED
@@ -45,10 +45,10 @@ flow_agents_node() {
45
45
  node "$FLOW_AGENTS_EVAL_ROOT/build/src/cli/validate-source-tree.js" "$@"
46
46
  return
47
47
  ;;
48
- */scripts/flow-kit.js|scripts/flow-kit.js)
48
+ */scripts/kit.js|scripts/kit.js)
49
49
  shift
50
50
  flow_agents_build_ts || return
51
- node "$FLOW_AGENTS_EVAL_ROOT/build/src/cli/flow-kit.js" "$@"
51
+ node "$FLOW_AGENTS_EVAL_ROOT/build/src/cli/kit.js" "$@"
52
52
  return
53
53
  ;;
54
54
  */scripts/effective-backlog-settings.js|scripts/effective-backlog-settings.js)
package/evals/run.sh CHANGED
@@ -135,6 +135,8 @@ run_static() {
135
135
  echo ""
136
136
  bash "$EVAL_DIR/static/test_evidence_refs.sh" || result=1
137
137
  echo ""
138
+ bash "$EVAL_DIR/static/test_console_presets.sh" || result=1
139
+ echo ""
138
140
  bash "$EVAL_DIR/static/test_repo_hooks.sh" || result=1
139
141
  return $result
140
142
  }
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
+
6
+ pass() {
7
+ echo "PASS: $1"
8
+ }
9
+
10
+ fail() {
11
+ echo "FAIL: $1" >&2
12
+ exit 1
13
+ }
14
+
15
+ assert_hosted_preset() {
16
+ local preset_file="$1"
17
+ local label="$2"
18
+ local default_url override_url
19
+
20
+ default_url="$(
21
+ unset FLOW_AGENTS_KONTOUR_CLOUD_CONSOLE_URL
22
+ # shellcheck source=/dev/null
23
+ source "$preset_file"
24
+ flow_agents_kontour_hosted_console_url
25
+ )"
26
+ [[ "$default_url" == "https://console.kontourai.io" ]] || fail "$label default hosted URL is $default_url"
27
+ pass "$label default hosted URL uses console.kontourai.io"
28
+
29
+ override_url="$(
30
+ export FLOW_AGENTS_KONTOUR_CLOUD_CONSOLE_URL="https://console.override.test"
31
+ # shellcheck source=/dev/null
32
+ source "$preset_file"
33
+ flow_agents_kontour_hosted_console_url
34
+ )"
35
+ [[ "$override_url" == "https://console.override.test" ]] || fail "$label hosted URL override is $override_url"
36
+ pass "$label hosted URL override is preserved"
37
+ }
38
+
39
+ echo "=== Console Preset Contract Checks ==="
40
+
41
+ assert_hosted_preset "$ROOT_DIR/scripts/telemetry/console-presets.sh" "source preset"
42
+ assert_hosted_preset "$ROOT_DIR/context/scripts/telemetry/console-presets.sh" "context preset"
43
+
44
+ if rg -F -q "https://console.kontourai.com" \
45
+ "$ROOT_DIR/scripts/telemetry/console-presets.sh" \
46
+ "$ROOT_DIR/context/scripts/telemetry/console-presets.sh"; then
47
+ fail "preset scripts still reference console.kontourai.com"
48
+ fi
49
+ pass "preset scripts do not reference console.kontourai.com"
@@ -52,19 +52,19 @@ require_status() {
52
52
 
53
53
  echo "=== Workflow Skill Contract Checks ==="
54
54
 
55
- IDEA="$ROOT/skills/idea-to-backlog/SKILL.md"
56
- BUILDER_SHAPE="$ROOT/skills/builder-shape/SKILL.md"
57
- PULL="$ROOT/skills/pull-work/SKILL.md"
58
- DESIGN_PROBE="$ROOT/skills/design-probe/SKILL.md"
59
- PICKUP_PROBE="$ROOT/skills/pickup-probe/SKILL.md"
60
- EVIDENCE="$ROOT/skills/evidence-gate/SKILL.md"
61
- RELEASE="$ROOT/skills/release-readiness/SKILL.md"
62
- LEARNING="$ROOT/skills/learning-review/SKILL.md"
63
- DELIVER="$ROOT/skills/deliver/SKILL.md"
64
- PLAN_WORK="$ROOT/skills/plan-work/SKILL.md"
65
- EXECUTE_PLAN="$ROOT/skills/execute-plan/SKILL.md"
66
- REVIEW_WORK="$ROOT/skills/review-work/SKILL.md"
67
- VERIFY_WORK="$ROOT/skills/verify-work/SKILL.md"
55
+ IDEA="$ROOT/kits/builder/skills/idea-to-backlog/SKILL.md"
56
+ BUILDER_SHAPE="$ROOT/kits/builder/skills/builder-shape/SKILL.md"
57
+ PULL="$ROOT/kits/builder/skills/pull-work/SKILL.md"
58
+ DESIGN_PROBE="$ROOT/kits/builder/skills/design-probe/SKILL.md"
59
+ PICKUP_PROBE="$ROOT/kits/builder/skills/pickup-probe/SKILL.md"
60
+ EVIDENCE="$ROOT/kits/builder/skills/evidence-gate/SKILL.md"
61
+ RELEASE="$ROOT/kits/builder/skills/release-readiness/SKILL.md"
62
+ LEARNING="$ROOT/kits/builder/skills/learning-review/SKILL.md"
63
+ DELIVER="$ROOT/kits/builder/skills/deliver/SKILL.md"
64
+ PLAN_WORK="$ROOT/kits/builder/skills/plan-work/SKILL.md"
65
+ EXECUTE_PLAN="$ROOT/kits/builder/skills/execute-plan/SKILL.md"
66
+ REVIEW_WORK="$ROOT/kits/builder/skills/review-work/SKILL.md"
67
+ VERIFY_WORK="$ROOT/kits/builder/skills/verify-work/SKILL.md"
68
68
  MAP="$ROOT/docs/skills-map.md"
69
69
  ROOT_CONTEXT="$ROOT/CONTEXT.md"
70
70
  CONTEXT_MAP="$ROOT/docs/context-map.md"
@@ -146,6 +146,7 @@ while IFS= read -r guidance_surface; do
146
146
  done < <(
147
147
  {
148
148
  find "$ROOT/skills" -type f -name '*.md'
149
+ find "$ROOT/kits" -path "*/skills/*/SKILL.md" -type f
149
150
  find "$ROOT/context/contracts" -maxdepth 1 -type f -name '*.md'
150
151
  find "$ROOT/agents" -maxdepth 1 -type f -name '*.json'
151
152
  printf '%s\n' "$ROOT/packaging/manifest.json"
@@ -553,7 +554,7 @@ echo ""
553
554
  echo "--- builder-shape ---"
554
555
  require_text "$BUILDER_SHAPE" '^name: "builder-shape"$' "frontmatter name"
555
556
  require_text "$BUILDER_SHAPE" 'Builder Kit `shape` flow' "defines Builder Kit shape product surface"
556
- require_text "$BUILDER_SHAPE" 'skills/idea-to-backlog/SKILL.md' "delegates to idea-to-backlog"
557
+ require_text "$BUILDER_SHAPE" 'kits/builder/skills/idea-to-backlog/SKILL.md' "delegates to idea-to-backlog"
557
558
  require_text "$BUILDER_SHAPE" 'kits/builder/flows/shape.flow.json' "links Builder Kit Flow Definition"
558
559
  require_text "$BUILDER_SHAPE" 'raw idea.*current conversation context|current conversation context.*raw idea' "accepts raw idea or conversation context"
559
560
  require_text "$BUILDER_SHAPE" 'Probe/alignment' "uses Probe alignment language"
@@ -1102,7 +1103,6 @@ require_text "$PACKS_MANIFEST" '"name": "core"' "pack manifest defines core pack
1102
1103
  require_text "$PACKS_MANIFEST" '"default": true' "pack manifest defines default pack"
1103
1104
  require_text "$PACKS_MANIFEST" '"name": "development"' "pack manifest defines development pack"
1104
1105
  require_text "$PACKS_MANIFEST" '"eval-rebuild"' "pack manifest includes eval-rebuild"
1105
- require_text "$PACKS_MANIFEST" '"explore"' "pack manifest includes explore"
1106
1106
  require_text "$ROOT/scripts/build-universal-bundles.js" 'FLOW_AGENTS_PACKS' "bundle installer supports pack filtering"
1107
1107
  require_text "$ROOT/evals/integration/test_bundle_install.sh" 'core-pack install keeps core agents' "bundle install test covers pack filtering"
1108
1108
  require_text "$CONTEXT_MAP" 'Context Loading Rules' "context map includes loading rules"
@@ -211,7 +211,7 @@ class SteeringContext:
211
211
  """
212
212
  Surface activated kit flows from the strands-local runtime path.
213
213
 
214
- Reads .flow-agents/runtime/strands/flows/ (written by `flow-kit activate
214
+ Reads .flow-agents/runtime/strands/flows/ (written by `flow-agents kit activate
215
215
  --adapter strands-local`) and emits a brief hint listing active kit flows
216
216
  by id and description so the agent is aware of available workflow guidance.
217
217
  """
@@ -189,7 +189,7 @@ export class FlowAgentsHooks {
189
189
  *
190
190
  * Includes activated kit flows discovered from the strands-local runtime
191
191
  * path (.flow-agents/runtime/strands/flows/) written by
192
- * `flow-kit activate --adapter strands-local`.
192
+ * `flow-agents kit activate --adapter strands-local`.
193
193
  *
194
194
  * Callers should prepend this to the Agent's system prompt:
195
195
  *
@@ -15,5 +15,22 @@
15
15
  "path": "flows/build.flow.json",
16
16
  "description": "Pull ready work through design probing, planning, implementation, verification, pull request readiness, merge readiness, and learning."
17
17
  }
18
+ ],
19
+ "skills": [
20
+ { "id": "builder.builder-shape", "path": "skills/builder-shape/SKILL.md", "description": "Invoke Builder Kit shape from a raw idea or the current conversation context." },
21
+ { "id": "builder.deliver", "path": "skills/deliver/SKILL.md", "description": "Delivery workflow — selected work to delivered code." },
22
+ { "id": "builder.design-probe", "path": "skills/design-probe/SKILL.md", "description": "One-question-at-a-time design probing interview." },
23
+ { "id": "builder.evidence-gate", "path": "skills/evidence-gate/SKILL.md", "description": "Evaluate whether completed work is trustworthy enough for human review, merge, or release." },
24
+ { "id": "builder.execute-plan", "path": "skills/execute-plan/SKILL.md", "description": "Parallel execution primitive — plan artifact path to implemented code." },
25
+ { "id": "builder.fix-bug", "path": "skills/fix-bug/SKILL.md", "description": "Bug fix orchestrator — diagnose, plan, execute, review, verify, loop." },
26
+ { "id": "builder.idea-to-backlog", "path": "skills/idea-to-backlog/SKILL.md", "description": "Turn raw ideas into shaped, prioritized, executable GitHub issue backlog." },
27
+ { "id": "builder.learning-review", "path": "skills/learning-review/SKILL.md", "description": "Capture post-merge learnings and feed them back into backlog, skills, tests, or knowledge." },
28
+ { "id": "builder.pickup-probe", "path": "skills/pickup-probe/SKILL.md", "description": "Builder Kit work-item/docs/provider-grounded Probe specialization before plan-work." },
29
+ { "id": "builder.plan-work", "path": "skills/plan-work/SKILL.md", "description": "Code planning primitive — goal + directory to structured execution plan." },
30
+ { "id": "builder.pull-work", "path": "skills/pull-work/SKILL.md", "description": "Select ready GitHub issues from the executable backlog for implementation." },
31
+ { "id": "builder.release-readiness", "path": "skills/release-readiness/SKILL.md", "description": "Decide whether evidence-backed work is ready to merge, release, deploy, or hold." },
32
+ { "id": "builder.review-work", "path": "skills/review-work/SKILL.md", "description": "Review primitive — code, security, dependency, architecture critique before verification." },
33
+ { "id": "builder.tdd-workflow", "path": "skills/tdd-workflow/SKILL.md", "description": "Test-driven development — RED, GREEN, REFACTOR with git checkpoints." },
34
+ { "id": "builder.verify-work", "path": "skills/verify-work/SKILL.md", "description": "Verification primitive — session file path to structured evidence verdict." }
18
35
  ]
19
36
  }
@@ -11,7 +11,7 @@ Invoke the Builder Kit `shape` flow for raw product ideas, vague build goals, cu
11
11
 
12
12
  - Product surface: let the user ask for "Builder Kit shape", "builder shape", or "shape this with Builder Kit" without naming `idea-to-backlog`.
13
13
  - Proactive suggestion: when a user starts planning a feature, product, PRD, roadmap item, or vague build idea without naming a workflow, briefly suggest Builder Kit shape as the structured path before implementation. Phrase it as an option, not a forced gate, unless the request is too ambiguous to plan responsibly.
14
- - Delegation: use `skills/idea-to-backlog/SKILL.md` as the shaping primitive. Do not duplicate or replace its workflow, artifact contract, issue shape, or gate rules.
14
+ - Delegation: use `kits/builder/skills/idea-to-backlog/SKILL.md` as the shaping primitive. Do not duplicate or replace its workflow, artifact contract, issue shape, or gate rules.
15
15
  - Product-level auto-guidance: when the user invokes Builder Kit shape, guide them through `design-probe` alignment and then the `idea-to-backlog` workflow directly; do not require them to type `design-probe` or `idea-to-backlog` as additional skill names.
16
16
  - do not require them to type `idea-to-backlog`; Builder Kit shape owns the user-facing route into that primitive.
17
17
  - Flow reference: link every Builder Kit shape artifact to the Builder Kit Flow Definition at `kits/builder/flows/shape.flow.json`.
@@ -19,7 +19,7 @@ Invoke the Builder Kit `shape` flow for raw product ideas, vague build goals, cu
19
19
  - Probe/alignment: when the idea, user outcome, constraints, non-goals, success signal, risk, or bundle relationship is unclear, run `design-probe` style alignment before continuing.
20
20
  - Default stop: stop at the backlog gate by default. Do not create GitHub issues, sync to a project, or hand off to `pull-work` unless the user explicitly asks for that next step.
21
21
  - Boundary: do not run Builder Kit build execution, remote kit install, package extraction, downstream delivery workflows, `plan-work`, `execute-plan`, `review-work`, `verify-work`, `evidence-gate`, or release workflows from this invocation.
22
- - Compatibility: Direct `idea-to-backlog` usage remains valid and should behave exactly as described in `skills/idea-to-backlog/SKILL.md`.
22
+ - Compatibility: Direct `idea-to-backlog` usage remains valid and should behave exactly as described in `kits/builder/skills/idea-to-backlog/SKILL.md`.
23
23
  - Primitive recovery: if a user invokes `idea-to-backlog` or another primitive with missing shaping context and appears to want the product flow, explain that Builder Kit shape is the entry point and offer to route there.
24
24
 
25
25
  ## Invocation
@@ -33,7 +33,7 @@ Use this skill when the user says things like:
33
33
 
34
34
  When activated:
35
35
 
36
- 1. Read `skills/idea-to-backlog/SKILL.md`.
36
+ 1. Read `kits/builder/skills/idea-to-backlog/SKILL.md`.
37
37
  2. State that Builder Kit shape delegates to `idea-to-backlog` and uses `kits/builder/flows/shape.flow.json`.
38
38
  3. Gather the raw idea or current conversation context.
39
39
  4. If needed, use `design-probe`: ask one Probe/alignment question at a time before shaping. Prefer questions that clarify user outcome, constraints, non-goals, success criteria, risk, or whether bundled ideas truly belong together.
@@ -72,5 +72,5 @@ For Builder Kit shape invocations, also include:
72
72
  Issue sync is explicit-only.
73
73
 
74
74
  - If the user did not ask to create or sync issues, set `backlog_links` to `not_requested` or an empty recorded status and stop at the backlog gate.
75
- - If the user asks to create or sync issues, follow the GitHub issue rules in `skills/idea-to-backlog/SKILL.md`.
75
+ - If the user asks to create or sync issues, follow the GitHub issue rules in `kits/builder/skills/idea-to-backlog/SKILL.md`.
76
76
  - If provider details are missing, ask for them instead of assuming a GitHub repository, project, labels, milestone, or assignee.
@@ -217,7 +217,7 @@ Provider-neutral marker example:
217
217
  "planned_at": "2026-06-03T03:23:14Z",
218
218
  "planning_artifact_ref": ".flow-agents/example/example--idea-to-backlog.md",
219
219
  "planning_scope_refs": [
220
- "skills/idea-to-backlog/SKILL.md",
220
+ "kits/builder/skills/idea-to-backlog/SKILL.md",
221
221
  "context/contracts/work-item-contract.md"
222
222
  ]
223
223
  }
@@ -3,7 +3,7 @@
3
3
  "id": "knowledge",
4
4
  "name": "Knowledge Kit",
5
5
  "product_name": "Knowledge Kit",
6
- "description": "A Flow Kit for durable, gated knowledge storage. Provides a store contract with defined record types, mutation operations, and provenance rules \u2014 plus a default adapter backed by markdown files, YAML frontmatter, wikilinks, and a graph index.",
6
+ "description": "A Flow Kit for durable, gated knowledge storage. Provides a store contract with defined record types, mutation operations, and provenance rules plus a default adapter backed by markdown files, YAML frontmatter, wikilinks, and a graph index.",
7
7
  "flows": [
8
8
  {
9
9
  "id": "knowledge.store-contract",
@@ -13,17 +13,17 @@
13
13
  {
14
14
  "id": "knowledge.ingest",
15
15
  "path": "flows/ingest.flow.json",
16
- "description": "Ingest raw captures: capture \u2192 classify \u2192 route. Gate on classify requires category + type='raw' classification evidence per the store contract create op."
16
+ "description": "Ingest raw captures: capture classify route. Gate on classify requires category + type='raw' classification evidence per the store contract create op."
17
17
  },
18
18
  {
19
19
  "id": "knowledge.compile",
20
20
  "path": "flows/compile.flow.json",
21
- "description": "Compile classified raws into durable notes: select-raws \u2192 compile \u2192 link. Gate on compile requires provenance refs to every consumed raw record."
21
+ "description": "Compile classified raws into durable notes: select-raws compile link. Gate on compile requires provenance refs to every consumed raw record."
22
22
  },
23
23
  {
24
24
  "id": "knowledge.synthesize",
25
25
  "path": "flows/synthesize.flow.json",
26
- "description": "Synthesize compiled sources into concept summaries: detect-cluster \u2192 propose \u2192 evidence-gate \u2192 apply-or-reject. Mutation-gate policy: no summary mutates without an approved proposal carrying source refs; rejection leaves store untouched."
26
+ "description": "Synthesize compiled sources into concept summaries: detect-cluster propose evidence-gate apply-or-reject. Mutation-gate policy: no summary mutates without an approved proposal carrying source refs; rejection leaves store untouched."
27
27
  },
28
28
  {
29
29
  "id": "knowledge.consolidate",
@@ -33,7 +33,7 @@
33
33
  {
34
34
  "id": "knowledge.retire",
35
35
  "path": "flows/retire.flow.json",
36
- "description": "Retire implemented or obsolete records from the working set via gated lifecycle: identify \u2192 propose-retirement \u2192 evidence-gate \u2192 apply-or-reject. Evidence required: retirement rationale + implementedByRef (when targeting 'implemented' status) or supersededByRef (optional, for 'retired'). Rejection leaves record status byte-identical. Retired records remain fully queryable with provenance via includeRetired flag."
36
+ "description": "Retire implemented or obsolete records from the working set via gated lifecycle: identify propose-retirement evidence-gate apply-or-reject. Evidence required: retirement rationale + implementedByRef (when targeting 'implemented' status) or supersededByRef (optional, for 'retired'). Rejection leaves record status byte-identical. Retired records remain fully queryable with provenance via includeRetired flag."
37
37
  }
38
38
  ],
39
39
  "docs": [
@@ -55,7 +55,7 @@
55
55
  {
56
56
  "id": "knowledge.flow-runner",
57
57
  "path": "adapters/flow-runner/index.js",
58
- "description": "Executable flow logic: capture(rawText, meta) \u2192 classified raw record; compile(rawIds[]) \u2192 compiled record with provenance links; synthesize(conceptId | topicSelector, options) \u2192 concept summary proposal with mutation gate; consolidate(snapshotId | topicSelector, options) \u2192 decision snapshot consolidation with supersede-not-delete; retire(recordId, options) \u2192 gated status lifecycle transition (active\u2192implemented\u2192retired) with working-set exclusion. Emits canonical telemetry events at gate points."
58
+ "description": "Executable flow logic: capture(rawText, meta) classified raw record; compile(rawIds[]) compiled record with provenance links; synthesize(conceptId | topicSelector, options) concept summary proposal with mutation gate; consolidate(snapshotId | topicSelector, options) decision snapshot consolidation with supersede-not-delete; retire(recordId, options) gated status lifecycle transition (active→implemented→retired) with working-set exclusion. Emits canonical telemetry events at gate points."
59
59
  },
60
60
  {
61
61
  "id": "knowledge.similarity-vector",
@@ -82,7 +82,7 @@
82
82
  {
83
83
  "id": "knowledge.synthesis-suite",
84
84
  "path": "evals/synthesis/suite.test.js",
85
- "description": "Eval cases for synthesize: AC1 (similar source \u2192 proposal not mutation), AC2 (rejection leaves concept byte-identical), AC3 (apply updates with provenance to all contributing sources), pluggable-similarity interface test, gate telemetry."
85
+ "description": "Eval cases for synthesize: AC1 (similar source proposal not mutation), AC2 (rejection leaves concept byte-identical), AC3 (apply updates with provenance to all contributing sources), pluggable-similarity interface test, gate telemetry."
86
86
  },
87
87
  {
88
88
  "id": "knowledge.consolidation-suite",
@@ -92,7 +92,7 @@
92
92
  {
93
93
  "id": "knowledge.similarity-vector-suite",
94
94
  "path": "evals/similarity-vector/suite.test.js",
95
- "description": "Eval cases for the vector similarity adapter: unit tests (cosineSimilarity math, injectable embed, threshold, fail-closed), drop-in proof (runner.synthesize with injected embed produces valid proposals), and live-gated tests (real ollama nomic-embed-text round-trip \u2014 skipped when ollama unavailable)."
95
+ "description": "Eval cases for the vector similarity adapter: unit tests (cosineSimilarity math, injectable embed, threshold, fail-closed), drop-in proof (runner.synthesize with injected embed produces valid proposals), and live-gated tests (real ollama nomic-embed-text round-trip skipped when ollama unavailable)."
96
96
  },
97
97
  {
98
98
  "id": "knowledge.retirement-suite",
@@ -102,7 +102,14 @@
102
102
  {
103
103
  "id": "knowledge.entity-cards-suite",
104
104
  "path": "evals/entities/suite.test.js",
105
- "description": "Eval cases for person/entity cards (issue #48): AC1-AC4 \u2014 entity extraction from Attendees lines, exact-match resolution, possible-duplicate detection, merge via propose/apply/reject (union aliases+backlinks, supersede duplicate), Obsidian people/ folder rendering, and extended contract suite (person type validity) on both adapters."
105
+ "description": "Eval cases for person/entity cards (issue #48): AC1-AC4 entity extraction from Attendees lines, exact-match resolution, possible-duplicate detection, merge via propose/apply/reject (union aliases+backlinks, supersede duplicate), Obsidian people/ folder rendering, and extended contract suite (person type validity) on both adapters."
106
+ }
107
+ ],
108
+ "skills": [
109
+ {
110
+ "id": "knowledge.knowledge-capture",
111
+ "path": "skills/knowledge-capture/SKILL.md",
112
+ "description": "Save durable knowledge, lightweight pointers, user corrections, decisions, lessons, and source references into the knowledge base."
106
113
  }
107
114
  ]
108
115
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kontourai/flow-agents",
3
- "version": "1.0.1",
3
+ "version": "1.2.0",
4
4
  "description": "Flow Agents — a Kontour product that applies Flow and Veritas discipline as a portable process layer inside the agent tools you already use: Claude Code, Codex, Kiro, opencode, pi, and GitHub Actions — with framework adapters (AWS Strands preview) on the same policy-engine contract.",
5
5
  "keywords": [
6
6
  "agents",
@@ -36,7 +36,6 @@
36
36
  "flow-agents-context-map": "build/src/cli.js",
37
37
  "flow-agents-effective-backlog-settings": "build/src/cli.js",
38
38
  "flow-agents-filter-installed-packs": "build/src/cli.js",
39
- "flow-agents-flow-kit": "build/src/cli.js",
40
39
  "flow-agents-fixture-retirement-audit": "build/src/cli.js",
41
40
  "flow-agents-promote-workflow-artifact": "build/src/cli.js",
42
41
  "flow-agents-publish-change": "build/src/cli.js",
@@ -49,7 +48,8 @@
49
48
  "flow-agents-validate-hook-influence": "build/src/cli.js",
50
49
  "flow-agents-validate-source": "build/src/cli.js",
51
50
  "flow-agents-workflow-artifact-cleanup-audit": "build/src/cli.js",
52
- "flow-agents-workflow-sidecar": "build/src/cli/workflow-sidecar.js"
51
+ "flow-agents-workflow-sidecar": "build/src/cli/workflow-sidecar.js",
52
+ "flow-agents-kit": "build/src/cli.js"
53
53
  },
54
54
  "files": [
55
55
  ".github/",
@@ -100,7 +100,6 @@
100
100
  "validate:package": "npm run build --silent && node build/src/cli.js validate-package",
101
101
  "workflow:sidecar": "npm run build --silent && node build/src/cli/workflow-sidecar.js",
102
102
  "workflow:validate-artifacts": "npm run build --silent && node build/src/cli/validate-workflow-artifacts.js",
103
- "flow-kit": "npm run build --silent && node build/src/cli.js flow-kit",
104
103
  "effective-backlog-settings": "npm run build --silent && node build/src/cli.js effective-backlog-settings",
105
104
  "pull-work-provider": "npm run build --silent && node build/src/cli.js pull-work-provider",
106
105
  "publish-change": "npm run build --silent && node build/src/cli.js publish-change",
@@ -125,11 +124,15 @@
125
124
  "promptfoo": "PROMPTFOO_CONFIG_DIR=.promptfoo PROMPTFOO_DISABLE_WAL_MODE=true PROMPTFOO_DISABLE_TELEMETRY=true promptfoo",
126
125
  "promptfoo:view": "PROMPTFOO_CONFIG_DIR=.promptfoo PROMPTFOO_DISABLE_WAL_MODE=true PROMPTFOO_DISABLE_TELEMETRY=true promptfoo view",
127
126
  "check:content-boundary": "node scripts/check-content-boundary.cjs",
128
- "prepack": "npm run build --silent && npm run validate:source --"
127
+ "prepack": "npm run build --silent && npm run validate:source --",
128
+ "kit": "npm run build --silent && node build/src/cli.js kit"
129
129
  },
130
130
  "devDependencies": {
131
131
  "@types/node": "^22.19.19",
132
132
  "promptfoo": "^0.121.15",
133
133
  "typescript": "^6.0.3"
134
+ },
135
+ "dependencies": {
136
+ "@kontourai/flow": "^1.2.0"
134
137
  }
135
138
  }