@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.
- package/.github/workflows/ci.yml +110 -0
- package/.github/workflows/runtime-compat.yml +5 -2
- package/CHANGELOG.md +42 -0
- package/README.md +26 -5
- package/build/src/cli/console-learning-projection.js +19 -2
- package/build/src/cli/effective-backlog-settings.js +18 -2
- package/build/src/cli/fixture-retirement-audit.js +19 -2
- package/build/src/cli/init.js +19 -2
- package/build/src/cli/{flow-kit.js → kit.js} +122 -108
- package/build/src/cli/promote-workflow-artifact.js +19 -2
- package/build/src/cli/publish-change-helper.js +19 -2
- package/build/src/cli/pull-work-provider.js +19 -2
- package/build/src/cli/runtime-adapter.js +20 -2
- package/build/src/cli/usage-feedback.js +19 -2
- package/build/src/cli/utterance-check.js +19 -2
- package/build/src/cli/validate-hook-influence.js +19 -2
- package/build/src/cli/validate-source-tree.js +4 -4
- package/build/src/cli/veritas-governance.js +19 -2
- package/build/src/cli/workflow-artifact-cleanup-audit.js +19 -2
- package/build/src/cli.js +3 -3
- package/build/src/flow-kit/validate.js +58 -62
- package/build/src/runtime-adapters.js +55 -24
- package/build/src/tools/build-universal-bundles.js +83 -19
- package/build/src/tools/generate-context-map.js +68 -9
- package/build/src/tools/validate-package.js +19 -2
- package/build/src/tools/validate-source-tree.js +51 -3
- package/context/scripts/telemetry/console-presets.sh +1 -1
- package/docs/adr/0007-flow-skill-kit-tool-boundary.md +169 -0
- package/docs/adr/0007-skill-audit.md +112 -0
- package/docs/adr/0008-kit-operation-boundary.md +88 -0
- package/docs/context-map.md +18 -22
- package/docs/flow-kit-repository-contract.md +5 -5
- package/docs/getting-started.md +177 -0
- package/docs/index.md +19 -8
- package/docs/kit-authoring-guide.md +46 -10
- package/docs/knowledge-kit.md +2 -2
- package/docs/spec/runtime-hook-surface.md +1 -1
- package/docs/vision.md +1 -1
- package/docs/workflow-usage-guide.md +1 -1
- package/evals/ci/run-baseline.sh +55 -8
- package/evals/fixtures/builder-kit-workflow-state/happy-path.json +2 -2
- package/evals/fixtures/builder-kit-workflow-state/mid-work-resume.json +2 -2
- package/evals/fixtures/console-learning-projection/artifacts/console-learning-correction/learning.json +1 -1
- package/evals/fixtures/pull-work-provider/github-issues.json +5 -5
- package/evals/integration/test_activate_npx_context.sh +2 -2
- package/evals/integration/test_bundle_install.sh +17 -12
- package/evals/integration/test_console_learning_projection.sh +1 -1
- package/evals/integration/test_flow_kit_install_git.sh +7 -7
- package/evals/integration/test_flow_kit_repository.sh +4 -4
- package/evals/integration/test_kit_conformance_levels.sh +1 -1
- package/evals/integration/test_local_flow_kit_install.sh +7 -7
- package/evals/integration/test_publish_change_helper.sh +1 -1
- package/evals/integration/test_pull_work_provider.sh +1 -1
- package/evals/integration/test_runtime_adapter_activation.sh +140 -19
- package/evals/lib/node.sh +2 -2
- package/evals/run.sh +2 -0
- package/evals/static/test_console_presets.sh +49 -0
- package/evals/static/test_workflow_skills.sh +15 -15
- package/integrations/strands/flow_agents_strands/steering.py +1 -1
- package/integrations/strands-ts/src/hooks.ts +1 -1
- package/kits/builder/kit.json +17 -0
- package/{skills → kits/builder/skills}/builder-shape/SKILL.md +4 -4
- package/{skills → kits/builder/skills}/idea-to-backlog/SKILL.md +1 -1
- package/kits/knowledge/kit.json +16 -9
- package/package.json +8 -5
- package/packaging/packs.json +1 -21
- package/scripts/README.md +1 -1
- package/scripts/kit.js +2 -0
- package/scripts/telemetry/console-presets.sh +1 -1
- package/skills/README.md +23 -0
- package/src/cli/console-learning-projection.ts +7 -1
- package/src/cli/effective-backlog-settings.ts +6 -1
- package/src/cli/fixture-retirement-audit.ts +7 -1
- package/src/cli/init.ts +7 -1
- package/src/cli/{flow-kit.ts → kit.ts} +124 -109
- package/src/cli/promote-workflow-artifact.ts +7 -1
- package/src/cli/publish-change-helper.ts +7 -1
- package/src/cli/pull-work-provider.ts +7 -1
- package/src/cli/runtime-adapter.ts +8 -1
- package/src/cli/usage-feedback.ts +7 -1
- package/src/cli/utterance-check.ts +7 -1
- package/src/cli/validate-hook-influence.ts +7 -1
- package/src/cli/validate-source-tree.ts +4 -4
- package/src/cli/veritas-governance.ts +7 -1
- package/src/cli/workflow-artifact-cleanup-audit.ts +7 -1
- package/src/cli.ts +3 -3
- package/src/flow-kit/validate.ts +63 -57
- package/src/runtime-adapters.ts +54 -26
- package/src/tools/build-universal-bundles.ts +67 -14
- package/src/tools/generate-context-map.ts +43 -7
- package/src/tools/validate-package.ts +7 -1
- package/src/tools/validate-source-tree.ts +34 -2
- package/scripts/flow-kit.js +0 -2
- package/skills/context-budget/SKILL.md +0 -40
- package/skills/explore/SKILL.md +0 -137
- package/skills/feedback-loop/SKILL.md +0 -87
- package/skills/frontend-design/SKILL.md +0 -80
- /package/{skills → kits/builder/skills}/deliver/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/design-probe/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/evidence-gate/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/execute-plan/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/fix-bug/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/learning-review/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/pickup-probe/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/plan-work/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/pull-work/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/release-readiness/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/review-work/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/tdd-workflow/SKILL.md +0 -0
- /package/{skills → kits/builder/skills}/verify-work/SKILL.md +0 -0
- /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/
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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/
|
|
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/
|
|
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
|
*
|
package/kits/builder/kit.json
CHANGED
|
@@ -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
|
}
|
package/kits/knowledge/kit.json
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
}
|