@kontourai/flow-agents 1.1.0 → 1.3.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 +6 -1
- package/.github/workflows/kit-gates-demo.yml +6 -2
- package/.github/workflows/runtime-compat.yml +5 -2
- package/CHANGELOG.md +51 -0
- package/CONTRIBUTING.md +30 -0
- package/README.md +26 -5
- package/agents/dev.json +1 -1
- package/agents/tool-planner.json +1 -1
- package/build/src/cli/{flow-kit.js → kit.js} +122 -108
- package/build/src/cli/validate-source-tree.js +4 -4
- package/build/src/cli/workflow-sidecar.js +70 -5
- package/build/src/cli.js +3 -3
- package/build/src/flow-kit/validate.js +89 -62
- package/build/src/tools/build-universal-bundles.js +78 -17
- package/build/src/tools/generate-context-map.js +49 -7
- package/build/src/tools/validate-source-tree.js +32 -1
- package/console.telemetry.json +1 -1
- package/docs/adr/0004-gates-expect-surface-claims.md +7 -7
- 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 +125 -13
- package/docs/knowledge-kit.md +2 -2
- package/docs/operating-layers.md +2 -2
- package/docs/spec/runtime-hook-surface.md +1 -1
- package/docs/veritas-integration.md +4 -4
- package/docs/vision.md +1 -1
- package/docs/workflow-eval-strategy.md +2 -2
- package/docs/workflow-usage-guide.md +2 -2
- package/evals/acceptance/test_opencode_harness.sh +18 -10
- package/evals/acceptance/test_pi_harness.sh +10 -6
- package/evals/ci/run-baseline.sh +1 -1
- 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/flow-kit-repository/mixed-runtime-kit/flows/runtime.flow.json +4 -4
- package/evals/fixtures/flow-kit-repository/valid-local-kit/flows/review.flow.json +4 -4
- package/evals/fixtures/kit-conformance-levels/k0-flows-only/flows/review.flow.json +4 -4
- package/evals/fixtures/kit-conformance-levels/k1-agent-extension/flows/build.flow.json +4 -4
- package/evals/fixtures/kit-conformance-levels/k2-with-evals/flows/synthesize.flow.json +4 -4
- package/evals/fixtures/kit-conformance-levels/third-party-extension/flows/review.flow.json +4 -4
- package/evals/fixtures/pull-work-provider/github-issues.json +5 -5
- package/evals/fixtures/surface-trust/accepted-claim-trust-report.json +2 -2
- package/evals/fixtures/surface-trust/artifact-absent.json +2 -2
- package/evals/fixtures/surface-trust/integrity-mismatch-trust-report.json +2 -2
- package/evals/fixtures/surface-trust/missing-authority-trust-report.json +2 -2
- package/evals/fixtures/surface-trust/provider-absent.json +2 -2
- package/evals/fixtures/surface-trust/rejected-claim-trust-report.json +2 -2
- package/evals/fixtures/surface-trust/stale-claim-trust-snapshot.json +2 -2
- 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 +2 -2
- 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_goal_fit_hook.sh +144 -0
- package/evals/integration/test_kit_conformance_levels.sh +56 -2
- 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 +3 -3
- package/evals/integration/test_workflow_sidecar_writer.sh +9 -9
- package/evals/lib/node.sh +2 -2
- package/evals/static/test_package.sh +3 -3
- package/evals/static/test_workflow_skills.sh +19 -19
- package/integrations/strands/flow_agents_strands/steering.py +1 -1
- package/integrations/strands-ts/src/hooks.ts +1 -1
- package/kits/builder/flows/build.flow.json +48 -48
- package/kits/builder/flows/shape.flow.json +36 -36
- 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/adapters/obsidian-store/index.js +137 -26
- package/kits/knowledge/evals/contract-suite/suite.test.js +90 -0
- package/kits/knowledge/flows/compile.flow.json +12 -12
- package/kits/knowledge/flows/consolidate.flow.json +16 -16
- package/kits/knowledge/flows/ingest.flow.json +12 -12
- package/kits/knowledge/flows/retire.flow.json +16 -16
- package/kits/knowledge/flows/store-contract.flow.json +12 -12
- package/kits/knowledge/flows/synthesize.flow.json +16 -16
- package/kits/knowledge/kit.json +16 -9
- package/kits/release-evidence/flows/release-evidence.flow.json +3 -3
- package/package.json +11 -5
- package/packaging/packs.json +1 -21
- package/schemas/workflow-evidence.schema.json +2 -1
- package/scripts/README.md +1 -1
- package/scripts/hooks/stop-goal-fit.js +66 -18
- package/scripts/kit.js +2 -0
- package/skills/README.md +23 -0
- package/src/cli/{flow-kit.ts → kit.ts} +124 -109
- package/src/cli/validate-source-tree.ts +4 -4
- package/src/cli/workflow-sidecar.ts +62 -4
- package/src/cli.ts +3 -3
- package/src/flow-kit/validate.ts +118 -58
- package/src/tools/build-universal-bundles.ts +74 -13
- package/src/tools/generate-context-map.ts +36 -6
- package/src/tools/validate-source-tree.ts +27 -1
- 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
|
@@ -473,6 +473,150 @@ else
|
|
|
473
473
|
_fail "promoted doc is missing source or acceptance sections"
|
|
474
474
|
fi
|
|
475
475
|
|
|
476
|
+
# --- npm-install regression: validator-environment errors must not block goal-fit ---
|
|
477
|
+
# Simulate the npm-installed condition: build/ is present (always shipped in package files)
|
|
478
|
+
# but tsc is absent from PATH, so `npm run workflow:validate-artifacts` (which rebuilds)
|
|
479
|
+
# would fail. The fix directly invokes node build/.../validate-workflow-artifacts.js instead.
|
|
480
|
+
|
|
481
|
+
NPM_INSTALL_REPO="$TMPDIR_EVAL/npm-install-repo"
|
|
482
|
+
mkdir -p "$NPM_INSTALL_REPO/.flow-agents/npm-install-task"
|
|
483
|
+
printf '# Test Repo\n' > "$NPM_INSTALL_REPO/AGENTS.md"
|
|
484
|
+
|
|
485
|
+
cat > "$NPM_INSTALL_REPO/.flow-agents/npm-install-task/npm-install-task--deliver.md" <<'MARKDOWN'
|
|
486
|
+
# npm install test task
|
|
487
|
+
|
|
488
|
+
branch: main
|
|
489
|
+
worktree: main
|
|
490
|
+
created: 2026-06-01
|
|
491
|
+
status: delivered
|
|
492
|
+
type: deliver
|
|
493
|
+
|
|
494
|
+
## Definition Of Done
|
|
495
|
+
- **User outcome:** Something works.
|
|
496
|
+
- **Acceptance criteria:**
|
|
497
|
+
- [x] Thing works - Evidence: tested
|
|
498
|
+
|
|
499
|
+
## Goal Fit Gate
|
|
500
|
+
- [x] Original user goal restated
|
|
501
|
+
- [x] Every acceptance criterion has evidence
|
|
502
|
+
|
|
503
|
+
## Verification Report
|
|
504
|
+
|
|
505
|
+
### Verdict: PASS
|
|
506
|
+
|
|
507
|
+
## Final Acceptance
|
|
508
|
+
|
|
509
|
+
- [ ] CI passed
|
|
510
|
+
MARKDOWN
|
|
511
|
+
|
|
512
|
+
cat > "$NPM_INSTALL_REPO/.flow-agents/npm-install-task/state.json" <<'JSON'
|
|
513
|
+
{
|
|
514
|
+
"schema_version": "1.0",
|
|
515
|
+
"task_slug": "npm-install-task",
|
|
516
|
+
"status": "delivered",
|
|
517
|
+
"phase": "done",
|
|
518
|
+
"updated_at": "2026-06-01T00:00:00Z",
|
|
519
|
+
"next_action": { "status": "done", "summary": "Local delivery complete." }
|
|
520
|
+
}
|
|
521
|
+
JSON
|
|
522
|
+
|
|
523
|
+
cat > "$NPM_INSTALL_REPO/.flow-agents/npm-install-task/acceptance.json" <<'JSON'
|
|
524
|
+
{
|
|
525
|
+
"schema_version": "1.0",
|
|
526
|
+
"task_slug": "npm-install-task",
|
|
527
|
+
"criteria": [
|
|
528
|
+
{
|
|
529
|
+
"id": "thing-works",
|
|
530
|
+
"description": "Thing works.",
|
|
531
|
+
"status": "pass",
|
|
532
|
+
"evidence_refs": [
|
|
533
|
+
{ "kind": "artifact", "file": "npm-install-task--deliver.md", "summary": "Delivery artifact." }
|
|
534
|
+
]
|
|
535
|
+
}
|
|
536
|
+
],
|
|
537
|
+
"goal_fit": { "status": "pass", "summary": "User outcome achieved." }
|
|
538
|
+
}
|
|
539
|
+
JSON
|
|
540
|
+
|
|
541
|
+
cat > "$NPM_INSTALL_REPO/.flow-agents/npm-install-task/evidence.json" <<'JSON'
|
|
542
|
+
{
|
|
543
|
+
"schema_version": "1.0",
|
|
544
|
+
"task_slug": "npm-install-task",
|
|
545
|
+
"verdict": "pass",
|
|
546
|
+
"checks": [
|
|
547
|
+
{ "id": "build", "kind": "test", "status": "pass", "summary": "Build passed." }
|
|
548
|
+
],
|
|
549
|
+
"not_verified_gaps": []
|
|
550
|
+
}
|
|
551
|
+
JSON
|
|
552
|
+
|
|
553
|
+
cat > "$NPM_INSTALL_REPO/.flow-agents/npm-install-task/handoff.json" <<'JSON'
|
|
554
|
+
{
|
|
555
|
+
"schema_version": "1.0",
|
|
556
|
+
"task_slug": "npm-install-task",
|
|
557
|
+
"summary": "Local delivery complete.",
|
|
558
|
+
"current_state_ref": "state.json",
|
|
559
|
+
"next_steps": [],
|
|
560
|
+
"blockers": [],
|
|
561
|
+
"warnings": []
|
|
562
|
+
}
|
|
563
|
+
JSON
|
|
564
|
+
|
|
565
|
+
# Part 1 of fix: invoke the already-built validator directly (no tsc).
|
|
566
|
+
# Poison tsc so that any call to it fails; confirm the hook does not call it
|
|
567
|
+
# and validates clean sidecars successfully.
|
|
568
|
+
FAKE_TSC_DIR="$TMPDIR_EVAL/fake-tsc"
|
|
569
|
+
mkdir -p "$FAKE_TSC_DIR"
|
|
570
|
+
printf '#!/usr/bin/env bash\necho "error TS5023: tsc should not be called" >&2\nexit 1\n' > "$FAKE_TSC_DIR/tsc"
|
|
571
|
+
chmod +x "$FAKE_TSC_DIR/tsc"
|
|
572
|
+
|
|
573
|
+
if PATH="$FAKE_TSC_DIR:$PATH" FLOW_AGENTS_GOAL_FIT_STRICT=true FLOW_AGENTS_REQUIRE_SIDECARS=true \
|
|
574
|
+
node "$ROOT/scripts/hooks/stop-goal-fit.js" \
|
|
575
|
+
>"$TMPDIR_EVAL/npm-install-valid.out" 2>"$TMPDIR_EVAL/npm-install-valid.err" <<JSON
|
|
576
|
+
{"hook_event_name":"Stop","cwd":"$NPM_INSTALL_REPO"}
|
|
577
|
+
JSON
|
|
578
|
+
then
|
|
579
|
+
_pass "strict hook with poisoned tsc uses built validator and does not block valid sidecars"
|
|
580
|
+
else
|
|
581
|
+
_fail "strict hook should not block valid sidecars even with tsc absent: $(cat "$TMPDIR_EVAL/npm-install-valid.err")"
|
|
582
|
+
fi
|
|
583
|
+
|
|
584
|
+
if ! rg -q 'tsc: command not found\|TS5023\|tsc should not be called' "$TMPDIR_EVAL/npm-install-valid.err"; then
|
|
585
|
+
_pass "hook does not emit tsc error noise when using built validator"
|
|
586
|
+
else
|
|
587
|
+
_fail "hook leaked tsc error into goal-fit output"
|
|
588
|
+
fi
|
|
589
|
+
|
|
590
|
+
# Part 2 of fix: when the validator cannot run at all (build/ absent and npm fails),
|
|
591
|
+
# the hook must skip cleanly — never block in strict mode due to an env error.
|
|
592
|
+
mv "$ROOT/build" "$ROOT/build-absent"
|
|
593
|
+
|
|
594
|
+
SPAWN_FAIL_DIR="$TMPDIR_EVAL/spawn-fail"
|
|
595
|
+
mkdir -p "$SPAWN_FAIL_DIR"
|
|
596
|
+
printf '#!/usr/bin/env bash\necho "npm ERR! tsc: command not found" >&2\nexit 127\n' > "$SPAWN_FAIL_DIR/npm"
|
|
597
|
+
chmod +x "$SPAWN_FAIL_DIR/npm"
|
|
598
|
+
|
|
599
|
+
if PATH="$SPAWN_FAIL_DIR:$PATH" FLOW_AGENTS_GOAL_FIT_STRICT=true FLOW_AGENTS_REQUIRE_SIDECARS=true \
|
|
600
|
+
node "$ROOT/scripts/hooks/stop-goal-fit.js" \
|
|
601
|
+
>"$TMPDIR_EVAL/npm-install-env-err.out" 2>"$TMPDIR_EVAL/npm-install-env-err.err" <<JSON
|
|
602
|
+
{"hook_event_name":"Stop","cwd":"$NPM_INSTALL_REPO"}
|
|
603
|
+
JSON
|
|
604
|
+
then
|
|
605
|
+
_pass "strict hook does not block when validator environment fails (build/ absent, tsc missing)"
|
|
606
|
+
else
|
|
607
|
+
_fail "strict hook must not block when validator env fails: $(cat "$TMPDIR_EVAL/npm-install-env-err.err")"
|
|
608
|
+
fi
|
|
609
|
+
|
|
610
|
+
if rg -q 'sidecar validation skipped' "$TMPDIR_EVAL/npm-install-env-err.err"; then
|
|
611
|
+
_pass "hook emits sidecar validation skipped warning for environment errors"
|
|
612
|
+
else
|
|
613
|
+
_fail "hook did not emit 'sidecar validation skipped' for environment errors"
|
|
614
|
+
fi
|
|
615
|
+
|
|
616
|
+
# Restore build/ so subsequent evals are unaffected.
|
|
617
|
+
mv "$ROOT/build-absent" "$ROOT/build"
|
|
618
|
+
|
|
619
|
+
|
|
476
620
|
if [[ "$errors" -eq 0 ]]; then
|
|
477
621
|
echo "Goal Fit hook integration passed."
|
|
478
622
|
exit 0
|
|
@@ -23,7 +23,7 @@ run_inspect() {
|
|
|
23
23
|
local output="$2"
|
|
24
24
|
# Route through the main CLI to avoid import.meta.url path-resolution issues.
|
|
25
25
|
flow_agents_build_ts 2>/dev/null
|
|
26
|
-
node "$FLOW_AGENTS_EVAL_ROOT/build/src/cli.js"
|
|
26
|
+
node "$FLOW_AGENTS_EVAL_ROOT/build/src/cli.js" kit inspect "$kit_dir" >"$output" 2>&1
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
# ===================================================================
|
|
@@ -164,7 +164,7 @@ run_inspect "$ROOT/kits/builder" "$out" || true
|
|
|
164
164
|
if node -e "
|
|
165
165
|
const d = require('fs').readFileSync('$out', 'utf8');
|
|
166
166
|
const r = JSON.parse(d);
|
|
167
|
-
const required = ['kit_id','kit_name','conformance','targets','third_party_extensions'];
|
|
167
|
+
const required = ['kit_id','kit_name','conformance','targets','third_party_extensions','trust'];
|
|
168
168
|
for (const k of required) {
|
|
169
169
|
if (!(k in r)) throw new Error('missing key: ' + k);
|
|
170
170
|
}
|
|
@@ -199,6 +199,60 @@ else
|
|
|
199
199
|
cat "$out"
|
|
200
200
|
fi
|
|
201
201
|
|
|
202
|
+
# ===================================================================
|
|
203
|
+
echo ""
|
|
204
|
+
echo "=== 8. Trust axis: first-party allowlist (builder and knowledge) ==="
|
|
205
|
+
# ===================================================================
|
|
206
|
+
|
|
207
|
+
for kit_name in builder knowledge; do
|
|
208
|
+
out="$TMP_DIR/trust-${kit_name}.out"
|
|
209
|
+
run_inspect "$ROOT/kits/$kit_name" "$out" || true
|
|
210
|
+
trust=$(node -e "const d=require('fs').readFileSync('$out','utf8'); console.log(JSON.parse(d).trust)" 2>/dev/null)
|
|
211
|
+
if [[ "$trust" == "first-party" ]]; then
|
|
212
|
+
pass "$kit_name kit trust: first-party (in Kontour allowlist)"
|
|
213
|
+
else
|
|
214
|
+
fail "$kit_name kit trust: expected first-party, got '$trust'"
|
|
215
|
+
cat "$out"
|
|
216
|
+
fi
|
|
217
|
+
done
|
|
218
|
+
|
|
219
|
+
# ===================================================================
|
|
220
|
+
echo ""
|
|
221
|
+
echo "=== 9. Trust axis: unverified for third-party and fixture kits ==="
|
|
222
|
+
# ===================================================================
|
|
223
|
+
|
|
224
|
+
for fixture in k0-flows-only k1-agent-extension k2-with-evals third-party-extension; do
|
|
225
|
+
out="$TMP_DIR/trust-${fixture}.out"
|
|
226
|
+
run_inspect "$ROOT/evals/fixtures/kit-conformance-levels/$fixture" "$out" || true
|
|
227
|
+
trust=$(node -e "const d=require('fs').readFileSync('$out','utf8'); console.log(JSON.parse(d).trust)" 2>/dev/null)
|
|
228
|
+
if [[ "$trust" == "unverified" ]]; then
|
|
229
|
+
pass "$fixture fixture trust: unverified (not in first-party allowlist)"
|
|
230
|
+
else
|
|
231
|
+
fail "$fixture fixture trust: expected unverified, got '$trust'"
|
|
232
|
+
cat "$out"
|
|
233
|
+
fi
|
|
234
|
+
done
|
|
235
|
+
|
|
236
|
+
# ===================================================================
|
|
237
|
+
echo ""
|
|
238
|
+
echo "=== 10. Trust field present in inspect JSON schema ==="
|
|
239
|
+
# ===================================================================
|
|
240
|
+
|
|
241
|
+
out="$TMP_DIR/trust-schema.out"
|
|
242
|
+
run_inspect "$ROOT/kits/builder" "$out" || true
|
|
243
|
+
if node -e "
|
|
244
|
+
const d = require('fs').readFileSync('$out', 'utf8');
|
|
245
|
+
const r = JSON.parse(d);
|
|
246
|
+
if (!('trust' in r)) throw new Error('missing key: trust');
|
|
247
|
+
const valid = ['first-party', 'verified', 'unverified'];
|
|
248
|
+
if (!valid.includes(r.trust)) throw new Error('trust must be one of: ' + valid.join(', ') + '; got: ' + r.trust);
|
|
249
|
+
" 2>/dev/null; then
|
|
250
|
+
pass "inspect JSON output includes trust field with valid value"
|
|
251
|
+
else
|
|
252
|
+
fail "inspect JSON output is missing trust field or has invalid value"
|
|
253
|
+
cat "$out"
|
|
254
|
+
fi
|
|
255
|
+
|
|
202
256
|
# ===================================================================
|
|
203
257
|
echo ""
|
|
204
258
|
if [[ "$errors" -eq 0 ]]; then
|
|
@@ -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
|
VALID_SRC="$ROOT/evals/fixtures/flow-kit-repository/valid-local-kit"
|
|
17
17
|
INVALID_SRC="$ROOT/evals/fixtures/flow-kit-repository/invalid-missing-flow"
|
|
18
18
|
DEST="$TMP_DIR/install-dest"
|
|
@@ -23,7 +23,7 @@ mkdir -p "$DEST"
|
|
|
23
23
|
echo "=== Local Flow Kit Install Checks ==="
|
|
24
24
|
|
|
25
25
|
install_output="$TMP_DIR/install.out"
|
|
26
|
-
if flow_agents_node "$CLI" install
|
|
26
|
+
if flow_agents_node "$CLI" install "$VALID_SRC" --dest "$DEST" >"$install_output" 2>&1; then
|
|
27
27
|
pass "valid local kit installs into temp destination"
|
|
28
28
|
else
|
|
29
29
|
fail "valid local kit install failed"
|
|
@@ -52,7 +52,7 @@ fi
|
|
|
52
52
|
|
|
53
53
|
registry_hash_before_invalid="$(shasum -a 256 "$REGISTRY" | awk '{print $1}')"
|
|
54
54
|
invalid_output="$TMP_DIR/invalid.out"
|
|
55
|
-
if flow_agents_node "$CLI" install
|
|
55
|
+
if flow_agents_node "$CLI" install "$INVALID_SRC" --dest "$DEST" >"$invalid_output" 2>&1; then
|
|
56
56
|
fail "invalid local kit install should fail"
|
|
57
57
|
sed -n '1,160p' "$invalid_output"
|
|
58
58
|
elif rg -q 'Flow Kit repository validation failed' "$invalid_output" \
|
|
@@ -65,7 +65,7 @@ fi
|
|
|
65
65
|
|
|
66
66
|
registry_hash_before_idempotent="$(shasum -a 256 "$REGISTRY" | awk '{print $1}')"
|
|
67
67
|
idempotent_output="$TMP_DIR/idempotent.out"
|
|
68
|
-
if flow_agents_node "$CLI" install
|
|
68
|
+
if flow_agents_node "$CLI" install "$VALID_SRC" --dest "$DEST" >"$idempotent_output" 2>&1 \
|
|
69
69
|
&& rg -q "already installed" "$idempotent_output" \
|
|
70
70
|
&& [[ "$registry_hash_before_idempotent" == "$(shasum -a 256 "$REGISTRY" | awk '{print $1}')" ]]; then
|
|
71
71
|
pass "same-source reinstall is idempotent"
|
|
@@ -79,7 +79,7 @@ cp -R "$VALID_SRC" "$CONFLICT_SRC"
|
|
|
79
79
|
printf '\nconflict copy\n' >> "$CONFLICT_SRC/docs/README.md"
|
|
80
80
|
conflict_output="$TMP_DIR/conflict.out"
|
|
81
81
|
registry_hash_before_conflict="$(shasum -a 256 "$REGISTRY" | awk '{print $1}')"
|
|
82
|
-
if flow_agents_node "$CLI" install
|
|
82
|
+
if flow_agents_node "$CLI" install "$CONFLICT_SRC" --dest "$DEST" >"$conflict_output" 2>&1; then
|
|
83
83
|
fail "different source with existing kit id should conflict"
|
|
84
84
|
sed -n '1,160p' "$conflict_output"
|
|
85
85
|
elif rg -q 'conflict: kit' "$conflict_output" \
|
|
@@ -91,7 +91,7 @@ else
|
|
|
91
91
|
fi
|
|
92
92
|
|
|
93
93
|
force_conflict_output="$TMP_DIR/force-conflict.out"
|
|
94
|
-
if flow_agents_node "$CLI" install
|
|
94
|
+
if flow_agents_node "$CLI" install "$CONFLICT_SRC" --dest "$DEST" --force >"$force_conflict_output" 2>&1; then
|
|
95
95
|
fail "--force should not replace a different-source duplicate id"
|
|
96
96
|
sed -n '1,160p' "$force_conflict_output"
|
|
97
97
|
elif rg -q 'conflict: kit' "$force_conflict_output" \
|
|
@@ -103,7 +103,7 @@ else
|
|
|
103
103
|
fi
|
|
104
104
|
|
|
105
105
|
update_output="$TMP_DIR/update.out"
|
|
106
|
-
if flow_agents_node "$CLI" install
|
|
106
|
+
if flow_agents_node "$CLI" install "$CONFLICT_SRC" --dest "$DEST" --update >"$update_output" 2>&1 \
|
|
107
107
|
&& rg -q "updated local kit" "$update_output" \
|
|
108
108
|
&& rg -q "$CONFLICT_SRC" "$REGISTRY"; then
|
|
109
109
|
pass "explicit update replaces duplicate id source"
|
|
@@ -112,7 +112,7 @@ status=$?
|
|
|
112
112
|
|
|
113
113
|
for risk in runtime schema package hook security; do
|
|
114
114
|
case "$risk" in
|
|
115
|
-
runtime) path="scripts/
|
|
115
|
+
runtime) path="scripts/kit.js" ;;
|
|
116
116
|
schema) path="schemas/workflow-evidence.schema.json" ;;
|
|
117
117
|
package) path="package.json" ;;
|
|
118
118
|
hook) path="scripts/hooks/quality-gate.js" ;;
|
|
@@ -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"
|
|
@@ -146,7 +146,7 @@ STRANDS_OUT="$TMP_DIR/strands-activation.json"
|
|
|
146
146
|
mkdir -p "$STRANDS_DEST"
|
|
147
147
|
|
|
148
148
|
# Install the mixed kit into strands dest so we can assert skills land there too
|
|
149
|
-
if flow_agents_node "$CLI" install
|
|
149
|
+
if flow_agents_node "$CLI" install "$MIXED_SRC" --dest "$STRANDS_DEST" >"$TMP_DIR/strands-install.out" 2>&1; then
|
|
150
150
|
pass "mixed local kit installs into strands temp destination"
|
|
151
151
|
else
|
|
152
152
|
fail "mixed local kit install failed (strands dest)"
|
|
@@ -544,22 +544,22 @@ else
|
|
|
544
544
|
_fail "existing invalid acceptance ref rejection was not fail-closed: $(cat "$TMPDIR_EVAL/invalid-acceptance-ref.out" "$TMPDIR_EVAL/invalid-acceptance-ref.err")"
|
|
545
545
|
fi
|
|
546
546
|
|
|
547
|
-
SURFACE_CHECK='{"id":"surface-trust-fixture","kind":"policy","status":"pass","summary":"
|
|
547
|
+
SURFACE_CHECK='{"id":"surface-trust-fixture","kind":"policy","status":"pass","summary":"Hachure trust.bundle evidence passed.","surface_trust_refs":[{"artifact_kind":"trust.bundle","artifact_ref":"trust/report.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Issued during this workflow."},"authority":{"producer":"surface-local","summary":"Local Surface trust producer."},"integrity":{"status":"matched","summary":"Artifact digest matched expected subject and gate.","digest":"sha256:abc123"},"status":"pass","summary":"Accepted trust.bundle claim."}]}'
|
|
548
548
|
if flow_agents_node "$WRITER" record-evidence "$ARTIFACT_DIR" \
|
|
549
549
|
--verdict pass \
|
|
550
550
|
--check-json "$SURFACE_CHECK" \
|
|
551
551
|
--timestamp "2026-05-09T00:01:05Z" >"$TMPDIR_EVAL/surface-evidence.out" 2>"$TMPDIR_EVAL/surface-evidence.err" \
|
|
552
552
|
&& rg -q '"surface_trust_refs"' "$ARTIFACT_DIR/evidence.json" \
|
|
553
|
-
&& rg -q '"artifact_kind": "
|
|
553
|
+
&& rg -q '"artifact_kind": "trust.bundle"' "$ARTIFACT_DIR/evidence.json" \
|
|
554
554
|
&& ! rg -q 'veritas' "$ARTIFACT_DIR/evidence.json"; then
|
|
555
|
-
_pass "sidecar writer records
|
|
555
|
+
_pass "sidecar writer records Hachure-aligned trust.bundle refs"
|
|
556
556
|
else
|
|
557
|
-
_fail "sidecar writer did not record
|
|
557
|
+
_fail "sidecar writer did not record Hachure-aligned trust.bundle refs: $(cat "$TMPDIR_EVAL/surface-evidence.out" "$TMPDIR_EVAL/surface-evidence.err")"
|
|
558
558
|
fi
|
|
559
559
|
|
|
560
560
|
if flow_agents_node "$WRITER" record-evidence "$ARTIFACT_DIR" \
|
|
561
561
|
--verdict pass \
|
|
562
|
-
--check-json '{"id":"surface-trust-native-field","kind":"policy","status":"pass","summary":"Should fail.","surface_trust_refs":[{"artifact_kind":"
|
|
562
|
+
--check-json '{"id":"surface-trust-native-field","kind":"policy","status":"pass","summary":"Should fail.","surface_trust_refs":[{"artifact_kind":"trust.bundle","artifact_ref":"trust/snapshot.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"surface-local","summary":"Producer exists.","veritas_policy":"native-field"},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}]}' >"$TMPDIR_EVAL/surface-invalid.out" 2>&1; then
|
|
563
563
|
_fail "sidecar writer should reject provider-specific Surface trust fields"
|
|
564
564
|
elif rg -q 'unsupported field' "$TMPDIR_EVAL/surface-invalid.out"; then
|
|
565
565
|
_pass "sidecar writer rejects provider-specific Surface trust fields"
|
|
@@ -581,10 +581,10 @@ check_contradictory_surface_ref() {
|
|
|
581
581
|
fi
|
|
582
582
|
}
|
|
583
583
|
|
|
584
|
-
check_contradictory_surface_ref "rejected-pass" '{"artifact_kind":"
|
|
585
|
-
check_contradictory_surface_ref "stale-pass" '{"artifact_kind":"
|
|
586
|
-
check_contradictory_surface_ref "missing-authority-pass" '{"artifact_kind":"
|
|
587
|
-
check_contradictory_surface_ref "integrity-mismatch-pass" '{"artifact_kind":"
|
|
584
|
+
check_contradictory_surface_ref "rejected-pass" '{"artifact_kind":"trust.bundle","artifact_ref":"trust/report.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"rejected","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"surface-local","summary":"Producer exists."},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}'
|
|
585
|
+
check_contradictory_surface_ref "stale-pass" '{"artifact_kind":"trust.bundle","artifact_ref":"trust/report.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"stale","summary":"Stale."},"authority":{"producer":"surface-local","summary":"Producer exists."},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}'
|
|
586
|
+
check_contradictory_surface_ref "missing-authority-pass" '{"artifact_kind":"trust.bundle","artifact_ref":"trust/report.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"unknown","summary":"Producer missing."},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}'
|
|
587
|
+
check_contradictory_surface_ref "integrity-mismatch-pass" '{"artifact_kind":"trust.bundle","artifact_ref":"trust/report.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"surface-local","summary":"Producer exists."},"integrity":{"status":"mismatch","summary":"Mismatch."},"status":"pass"}'
|
|
588
588
|
|
|
589
589
|
SURFACE_FIXTURE_DIR="$ROOT/evals/fixtures/surface-trust"
|
|
590
590
|
check_surface_fixture() {
|
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)
|
|
@@ -211,8 +211,8 @@ for (const gateId of ["verify-gate", "merge-ready-gate"]) {
|
|
|
211
211
|
const expectations = Object.values(flow.gates || {}).flatMap((gate) => gate.expects || []);
|
|
212
212
|
if (!expectations.length) throw new Error("Builder build flow should declare gate expectations");
|
|
213
213
|
for (const expectation of expectations) {
|
|
214
|
-
if (expectation.kind !== "
|
|
215
|
-
if (!expectation.
|
|
214
|
+
if (expectation.kind !== "trust.bundle") throw new Error(`${expectation.id || "<unknown>"} should remain a trust.bundle expectation`);
|
|
215
|
+
if (!expectation.bundle_claim?.claimType || !expectation.bundle_claim?.accepted_statuses) throw new Error(`${expectation.id || "<unknown>"} should declare bundle_claim claimType and accepted statuses`);
|
|
216
216
|
}
|
|
217
217
|
const flowText = JSON.stringify(flow).toLowerCase();
|
|
218
218
|
for (const term of ["veritas", "trust_provider", "trust-provider", "provider_name", "provider_ref", "veritas_policy", "veritas_readiness"]) {
|
|
@@ -221,7 +221,7 @@ for (const term of ["veritas", "trust_provider", "trust-provider", "provider_nam
|
|
|
221
221
|
console.log("ok");
|
|
222
222
|
NODE
|
|
223
223
|
then
|
|
224
|
-
_pass "installed Builder Kit build flow keeps provider-neutral
|
|
224
|
+
_pass "installed Builder Kit build flow keeps provider-neutral trust.bundle gates"
|
|
225
225
|
else
|
|
226
226
|
_fail "installed Builder Kit build flow route-back or provider-neutral gate policy missing or wrong"
|
|
227
227
|
fi
|
|
@@ -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"
|
|
@@ -1074,17 +1075,17 @@ const flow = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
|
|
|
1074
1075
|
const expectations = Object.values(flow.gates || {}).flatMap((gate) => gate.expects || []);
|
|
1075
1076
|
if (!expectations.length) throw new Error("no Builder Kit gate expectations found");
|
|
1076
1077
|
for (const expectation of expectations) {
|
|
1077
|
-
if (expectation.kind !== "
|
|
1078
|
-
if (!expectation.
|
|
1078
|
+
if (expectation.kind !== "trust.bundle") throw new Error(`${expectation.id || "<unknown>"} is not a trust.bundle expectation`);
|
|
1079
|
+
if (!expectation.bundle_claim?.claimType || !expectation.bundle_claim?.accepted_statuses) throw new Error(`${expectation.id || "<unknown>"} is missing bundle_claim claimType or accepted statuses`);
|
|
1079
1080
|
}
|
|
1080
1081
|
const flowText = JSON.stringify(flow).toLowerCase();
|
|
1081
1082
|
for (const term of ["veritas", "trust_provider", "trust-provider", "provider_name", "provider_ref", "veritas_policy", "veritas_readiness"]) {
|
|
1082
1083
|
if (flowText.includes(term)) throw new Error(`provider-specific trust field leaked into Builder Kit build flow: ${term}`);
|
|
1083
1084
|
}
|
|
1084
1085
|
NODE
|
|
1085
|
-
pass "Builder build flow keeps provider-neutral
|
|
1086
|
+
pass "Builder build flow keeps provider-neutral trust.bundle expectations"
|
|
1086
1087
|
else
|
|
1087
|
-
fail "Builder build flow keeps provider-neutral
|
|
1088
|
+
fail "Builder build flow keeps provider-neutral trust.bundle expectations"
|
|
1088
1089
|
fi
|
|
1089
1090
|
require_text "$MAP" 'pull-work' "map includes pull-work"
|
|
1090
1091
|
require_text "$MAP" 'pickup Probe before planning' "map documents pickup Probe before planning"
|
|
@@ -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
|
*
|