@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
|
@@ -12,7 +12,7 @@ This guide walks you from an empty directory to a validated, locally installed k
|
|
|
12
12
|
|
|
13
13
|
- **Kit** — a directory with a root `kit.json` manifest and the assets it declares. The manifest is the contract; Flow Agents validates it before anything is copied.
|
|
14
14
|
- **Flow Definition** — a `.flow.json` file that declares steps, gates, and expected evidence. Validation of the Flow Definition semantics belongs to [Kontour Flow](https://kontourai.github.io/flow/); the kit contract delegates to it.
|
|
15
|
-
- **Activation** — the step that reads the installed kit and writes runtime-local files into your workspace.
|
|
15
|
+
- **Activation** — the step that reads the installed kit and writes runtime-local files into your workspace. Both `codex-local` and `strands-local` adapters activate Flow Definitions, skills, and docs. See the Activate section for the full asset-class table.
|
|
16
16
|
|
|
17
17
|
## Directory layout
|
|
18
18
|
|
|
@@ -54,7 +54,7 @@ Required fields:
|
|
|
54
54
|
| `name` | Non-empty display name |
|
|
55
55
|
| `flows` | Non-empty list; each entry must have `id` and `path` |
|
|
56
56
|
|
|
57
|
-
Optional fields: `product_name`, `description`, `skills`, `docs`, `adapters`, `evals`, `assets`. Optional fields list relative asset paths or objects with `id`, `path`, and optional `description`.
|
|
57
|
+
Optional fields: `product_name`, `description`, `skills`, `docs`, `adapters`, `evals`, `assets`. Optional fields list relative asset paths or objects with `id`, `path`, and optional `description`. `skills` and `docs` assets are activated by both adapters alongside flows. `adapters`, `evals`, and `assets` appear in diagnostics as `skipped_assets` (see the Activate section for the full per-adapter table).
|
|
58
58
|
|
|
59
59
|
## Minimal flow file
|
|
60
60
|
|
|
@@ -112,7 +112,7 @@ npm run validate:source --
|
|
|
112
112
|
Once validation passes, install the kit into a target workspace:
|
|
113
113
|
|
|
114
114
|
```bash
|
|
115
|
-
npx @kontourai/flow-agents
|
|
115
|
+
npx @kontourai/flow-agents kit install path/to/my-kit --dest /path/to/workspace
|
|
116
116
|
```
|
|
117
117
|
|
|
118
118
|
`--dest` is the installed Flow Agents bundle root. When omitted the command uses the current directory. From a contributor checkout of this repository, the equivalent form is `npm run flow-kit -- <command>`.
|
|
@@ -120,8 +120,8 @@ npx @kontourai/flow-agents flow-kit install-local path/to/my-kit --dest /path/to
|
|
|
120
120
|
Confirm the install:
|
|
121
121
|
|
|
122
122
|
```bash
|
|
123
|
-
npx @kontourai/flow-agents
|
|
124
|
-
npx @kontourai/flow-agents
|
|
123
|
+
npx @kontourai/flow-agents kit list --dest /path/to/workspace
|
|
124
|
+
npx @kontourai/flow-agents kit status my-kit --dest /path/to/workspace
|
|
125
125
|
```
|
|
126
126
|
|
|
127
127
|
`list` prints one summary line per installed kit. `status` prints JSON provenance including the SHA256 content hash and `installed` or `missing` state.
|
|
@@ -129,7 +129,7 @@ npx @kontourai/flow-agents flow-kit status my-kit --dest /path/to/workspace
|
|
|
129
129
|
To replace an existing install after you update the kit source:
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
|
-
npx @kontourai/flow-agents
|
|
132
|
+
npx @kontourai/flow-agents kit install path/to/my-kit --dest /path/to/workspace --update
|
|
133
133
|
```
|
|
134
134
|
|
|
135
135
|
## Activate
|
|
@@ -137,10 +137,27 @@ npx @kontourai/flow-agents flow-kit install-local path/to/my-kit --dest /path/to
|
|
|
137
137
|
After installing, run activate to write runtime-local files into the workspace:
|
|
138
138
|
|
|
139
139
|
```bash
|
|
140
|
-
npx @kontourai/flow-agents
|
|
140
|
+
npx @kontourai/flow-agents kit activate --dest /path/to/workspace --format json
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
-
The `codex-local` adapter is selected automatically.
|
|
143
|
+
The `codex-local` adapter is selected automatically. To activate for Strands, pass `--adapter strands-local`.
|
|
144
|
+
|
|
145
|
+
### What each adapter activates
|
|
146
|
+
|
|
147
|
+
Each adapter copies declared assets into `.flow-agents/runtime/<adapter>/` and produces an `activation.json` manifest. The table below shows which asset classes are activated today:
|
|
148
|
+
|
|
149
|
+
| Asset class | `codex-local` | `strands-local` | Notes |
|
|
150
|
+
|---|---|---|---|
|
|
151
|
+
| `flows` | Activated — `.flow-agents/runtime/codex/flows/<kit-id>/<asset-id>.flow.json` | Activated — `.flow-agents/runtime/strands/flows/<kit-id>/<asset-id>.flow.json` | Gate definitions read by each adapter's flow-routing layer. |
|
|
152
|
+
| `skills` | Activated — `.flow-agents/runtime/codex/skills/<kit-id>/<filename>` | Activated — `.flow-agents/runtime/strands/skills/<kit-id>/<filename>` | Agent guidance markdown. For codex-local, reference these paths from AGENTS.md. For strands-local, the Strands steering layer can glob for `*.md` under `skills/` during system-prompt injection. |
|
|
153
|
+
| `docs` | Activated — `.flow-agents/runtime/codex/docs/<kit-id>/<filename>` | Activated — `.flow-agents/runtime/strands/docs/<kit-id>/<filename>` | Documentation assets. Co-located with skill files for easy reference. |
|
|
154
|
+
| `adapters` | `skipped_assets` | `skipped_assets` | Framework or runtime adapter code — not copied by the activation layer. |
|
|
155
|
+
| `evals` | `skipped_assets` | `skipped_assets` | Evaluation suites — not run or copied during activation. |
|
|
156
|
+
| `assets` | `skipped_assets` | `skipped_assets` | General supporting assets — not copied during activation. |
|
|
157
|
+
|
|
158
|
+
Assets in `skipped_assets` are recorded in `activation.json` for diagnostics but are not an error. They are not activated because no activation path is defined for those classes in the current adapters.
|
|
159
|
+
|
|
160
|
+
Flows with a missing `id` field in `kit.json` are also placed in `skipped_assets` with an explicit reason.
|
|
144
161
|
|
|
145
162
|
When installing through `npx @kontourai/flow-agents init` with the Codex runtime, pass `--activate-kits` to run activation as part of init:
|
|
146
163
|
|
|
@@ -177,7 +194,7 @@ The **container contract** is owned by [Kontour Flow](https://kontourai.github.i
|
|
|
177
194
|
- Path rules: all declared paths must be relative, must not contain `..`, and must resolve inside the kit directory.
|
|
178
195
|
- The **extension model**: unknown top-level fields are consumer extensions; core validation ignores-but-permits them.
|
|
179
196
|
|
|
180
|
-
Container validation is surfaced in Flow's CLI as `flow
|
|
197
|
+
Container validation is surfaced in Flow's CLI as `flow kit validate <kit-dir>`. Flow Agents delegates core container validation to `@kontourai/flow`'s `validateKitContainer` library function; the contract lives once, in Flow.
|
|
181
198
|
|
|
182
199
|
For the authoritative container spec and JSON Schema, see [kontourai/flow#67](https://github.com/kontourai/flow/pull/67) (the spec PR) and the published `schemas/flow-kit-container.schema.json` in the `@kontourai/flow` package.
|
|
183
200
|
|
|
@@ -267,7 +284,7 @@ Layering summary:
|
|
|
267
284
|
Use the `inspect` subcommand to derive a kit's conformance level and consumer targets:
|
|
268
285
|
|
|
269
286
|
```bash
|
|
270
|
-
npm run
|
|
287
|
+
npm run kit -- inspect path/to/my-kit
|
|
271
288
|
```
|
|
272
289
|
|
|
273
290
|
Output is stable JSON:
|
|
@@ -293,3 +310,22 @@ The `inspect` command is read-only and safe to run before install.
|
|
|
293
310
|
## Direction
|
|
294
311
|
|
|
295
312
|
Flow Kits are designed to be shareable workflow units — authored once, carried across teams and workspaces. The intended growth path is distribution from git remotes and a curated Kontour kit catalog of Kontour-authored kits covering work modes beyond software delivery. Today install is local-path only; remote fetch is explicitly a non-goal in this version.
|
|
313
|
+
|
|
314
|
+
## Migration: flow-kit → flow-agents kit
|
|
315
|
+
|
|
316
|
+
The standalone `flow-kit` binary was removed in this release. The `flow-agents kit` subcommand is the replacement.
|
|
317
|
+
|
|
318
|
+
| Old command | New command |
|
|
319
|
+
|---|---|
|
|
320
|
+
| `flow-kit install-local <path>` | `flow-agents kit install <path>` |
|
|
321
|
+
| `flow-kit install-git <url>` | `flow-agents kit install <url>` |
|
|
322
|
+
| `flow-kit activate` | `flow-agents kit activate` |
|
|
323
|
+
| `flow-kit inspect <dir>` | `flow-agents kit inspect <dir>` |
|
|
324
|
+
| `flow-kit list` | `flow-agents kit list` |
|
|
325
|
+
| `flow-kit status <id>` | `flow-agents kit status <id>` |
|
|
326
|
+
| `npx @kontourai/flow-agents flow-kit ...` | `npx @kontourai/flow-agents kit ...` |
|
|
327
|
+
| `npm run flow-kit -- ...` | `npm run kit -- ...` |
|
|
328
|
+
|
|
329
|
+
`install-local` and `install-git` are unified into a single `install` command. The source argument auto-detects whether it is a local path or a git URL (http://, https://, git+, ssh://, file://).
|
|
330
|
+
|
|
331
|
+
Running the old `flow-kit` command will produce a "command not found" error from your shell — there is no alias or shim. Update any scripts or CI configurations that call `flow-kit` to use `flow-agents kit`.
|
package/docs/knowledge-kit.md
CHANGED
|
@@ -4,7 +4,7 @@ title: Knowledge Kit
|
|
|
4
4
|
|
|
5
5
|
# Knowledge Kit
|
|
6
6
|
|
|
7
|
-
The Knowledge Kit is a Flow Kit for durable, gated knowledge storage. It packages a store contract, five pipeline flows, pluggable store adapters, and a parameterized contract test suite — all validated and installed through the
|
|
7
|
+
The Knowledge Kit is a Flow Kit for durable, gated knowledge storage. It packages a store contract, five pipeline flows, pluggable store adapters, and a parameterized contract test suite — all validated and installed through the `flow-agents kit` path.
|
|
8
8
|
|
|
9
9
|
## What it ships
|
|
10
10
|
|
|
@@ -44,7 +44,7 @@ The vector detector is fail-closed: infrastructure failures throw `EMBED_FAILURE
|
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
46
|
# Install the kit into a workspace
|
|
47
|
-
npx @kontourai/flow-agents
|
|
47
|
+
npx @kontourai/flow-agents kit install kits/knowledge --dest /path/to/workspace
|
|
48
48
|
|
|
49
49
|
# Run the contract suite against the default adapter
|
|
50
50
|
node --test kits/knowledge/evals/contract-suite/suite.test.js
|
|
@@ -490,7 +490,7 @@ Kit flow activation for Strands workspaces is implemented as a new runtime adapt
|
|
|
490
490
|
The CLI command is:
|
|
491
491
|
|
|
492
492
|
```bash
|
|
493
|
-
flow-kit activate --adapter strands-local [--dest DIR] [--source-root DIR]
|
|
493
|
+
flow-agents kit activate --adapter strands-local [--dest DIR] [--source-root DIR]
|
|
494
494
|
```
|
|
495
495
|
|
|
496
496
|
This writes activated flow files to `.flow-agents/runtime/strands/flows/<kit-id>/<asset-id>.flow.json` and produces a parity-diagnostic `activation.json` (same schema as codex-local: `schema_version`, `adapter`, `supported_asset_classes`, `generated_runtime_files`, `skipped_assets`, `warnings`, `errors`).
|
package/docs/vision.md
CHANGED
|
@@ -20,7 +20,7 @@ One official framework adapter spike exists: `integrations/strands/` is a Python
|
|
|
20
20
|
|
|
21
21
|
### What ships today
|
|
22
22
|
|
|
23
|
-
Kit authoring is shipped. The `kit.json` contract at schema version 1.0 is validated by the `flow-kit` CLI before any install. The [Kit Authoring Guide](kit-authoring-guide.html) walks from an empty directory to a validated, locally installed kit. Two reference kits ship in `kits/`:
|
|
23
|
+
Kit authoring is shipped. The `kit.json` contract at schema version 1.0 is validated by the `flow-agents kit` CLI before any install. The [Kit Authoring Guide](kit-authoring-guide.html) walks from an empty directory to a validated, locally installed kit. Two reference kits ship in `kits/`:
|
|
24
24
|
|
|
25
25
|
**Builder Kit** packages the full `idea → backlog → plan → build → review → verify → evidence → release → learning` pipeline as two flows (`builder.shape`, `builder.build`). It installs automatically.
|
|
26
26
|
|
|
@@ -43,7 +43,7 @@ Separate these into distinct ideas, use Probe/alignment questions if the outcome
|
|
|
43
43
|
|
|
44
44
|
Expected behavior:
|
|
45
45
|
|
|
46
|
-
- delegate shaping to `skills/idea-to-backlog/SKILL.md`
|
|
46
|
+
- delegate shaping to `kits/builder/skills/idea-to-backlog/SKILL.md`
|
|
47
47
|
- link the artifact to the Builder Kit Flow Definition at `kits/builder/flows/shape.flow.json`
|
|
48
48
|
- inventory each distinct idea separately
|
|
49
49
|
- classify each idea
|
package/evals/ci/run-baseline.sh
CHANGED
|
@@ -26,6 +26,24 @@ CHECKS=(
|
|
|
26
26
|
"Flow Kit repository integration|bash evals/integration/test_flow_kit_repository.sh"
|
|
27
27
|
"Runtime adapter activation integration|bash evals/integration/test_runtime_adapter_activation.sh"
|
|
28
28
|
"Bundle install integration|bash evals/integration/test_bundle_install.sh"
|
|
29
|
+
"Bundle lifecycle integration|bash evals/integration/test_bundle_lifecycle.sh"
|
|
30
|
+
"Activate npx context integration|bash evals/integration/test_activate_npx_context.sh"
|
|
31
|
+
"Kit conformance levels integration|bash evals/integration/test_kit_conformance_levels.sh"
|
|
32
|
+
"Local Flow Kit install integration|bash evals/integration/test_local_flow_kit_install.sh"
|
|
33
|
+
"Flow Kit install-git integration|bash evals/integration/test_flow_kit_install_git.sh"
|
|
34
|
+
"Console learning projection integration|bash evals/integration/test_console_learning_projection.sh"
|
|
35
|
+
"Context map integration|bash evals/integration/test_context_map.sh"
|
|
36
|
+
"Effective backlog settings integration|bash evals/integration/test_effective_backlog_settings.sh"
|
|
37
|
+
"Flow agents statusline integration|bash evals/integration/test_flow_agents_statusline.sh"
|
|
38
|
+
"Telemetry contract integration|bash evals/integration/test_telemetry.sh"
|
|
39
|
+
"Telemetry doctor integration|bash evals/integration/test_telemetry_doctor.sh"
|
|
40
|
+
"Utterance check integration|bash evals/integration/test_utterance_check.sh"
|
|
41
|
+
"Pull work provider integration|bash evals/integration/test_pull_work_provider.sh"
|
|
42
|
+
"Usage feedback import integration|bash evals/integration/test_usage_feedback_import.sh"
|
|
43
|
+
"Usage feedback outcomes integration|bash evals/integration/test_usage_feedback_outcomes.sh"
|
|
44
|
+
"Usage feedback report integration|bash evals/integration/test_usage_feedback_report.sh"
|
|
45
|
+
"Usage feedback dashboard integration|bash evals/integration/test_usage_feedback_dashboard.sh"
|
|
46
|
+
"Usage feedback global integration|bash evals/integration/test_usage_feedback_global.sh"
|
|
29
47
|
)
|
|
30
48
|
|
|
31
49
|
LANE_SOURCE_AND_STATIC=(
|
|
@@ -51,6 +69,27 @@ LANE_RUNTIME_AND_KIT=(
|
|
|
51
69
|
"Flow Kit repository integration"
|
|
52
70
|
"Runtime adapter activation integration"
|
|
53
71
|
"Bundle install integration"
|
|
72
|
+
"Bundle lifecycle integration"
|
|
73
|
+
"Activate npx context integration"
|
|
74
|
+
"Kit conformance levels integration"
|
|
75
|
+
"Local Flow Kit install integration"
|
|
76
|
+
"Flow Kit install-git integration"
|
|
77
|
+
# QUARANTINED (#74): passes on macOS, fails on Linux CI — not gating until triaged
|
|
78
|
+
"Context map integration"
|
|
79
|
+
"Effective backlog settings integration"
|
|
80
|
+
"Flow agents statusline integration"
|
|
81
|
+
"Telemetry contract integration"
|
|
82
|
+
"Telemetry doctor integration"
|
|
83
|
+
"Utterance check integration"
|
|
84
|
+
"Pull work provider integration"
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
LANE_USAGE_FEEDBACK=(
|
|
88
|
+
"Usage feedback import integration"
|
|
89
|
+
"Usage feedback outcomes integration"
|
|
90
|
+
"Usage feedback report integration"
|
|
91
|
+
"Usage feedback dashboard integration"
|
|
92
|
+
"Usage feedback global integration"
|
|
54
93
|
)
|
|
55
94
|
|
|
56
95
|
slugify() {
|
|
@@ -78,6 +117,9 @@ lane_labels() {
|
|
|
78
117
|
runtime-and-kit)
|
|
79
118
|
printf '%s\n' "${LANE_RUNTIME_AND_KIT[@]}"
|
|
80
119
|
;;
|
|
120
|
+
usage-feedback)
|
|
121
|
+
printf '%s\n' "${LANE_USAGE_FEEDBACK[@]}"
|
|
122
|
+
;;
|
|
81
123
|
*)
|
|
82
124
|
echo "Unknown CI baseline lane: $(active_lane)" >&2
|
|
83
125
|
return 1
|
|
@@ -120,14 +162,19 @@ find_check() {
|
|
|
120
162
|
}
|
|
121
163
|
|
|
122
164
|
find_active_check() {
|
|
165
|
+
# Look up the check by id-or-label without streaming active_checks through a
|
|
166
|
+
# process substitution. Streaming and returning early from the consumer loop
|
|
167
|
+
# causes a SIGPIPE on the producer printf when pipefail is set, printing a
|
|
168
|
+
# spurious "write error: Broken pipe" on Linux even though every check passed.
|
|
169
|
+
# Instead: resolve via the pure-bash find_check, then confirm the label is
|
|
170
|
+
# present in the active lane.
|
|
123
171
|
local requested="$1"
|
|
124
|
-
local row id label
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
done < <(active_checks)
|
|
172
|
+
local row id label line
|
|
173
|
+
row="$(find_check "$requested")" || return 1
|
|
174
|
+
IFS=$'\t' read -r id label _ <<<"$row"
|
|
175
|
+
while IFS= read -r line; do
|
|
176
|
+
[[ "$line" == "$label" ]] && { printf '%s\n' "$row"; return 0; }
|
|
177
|
+
done <<<"$(lane_labels)"
|
|
131
178
|
return 1
|
|
132
179
|
}
|
|
133
180
|
|
|
@@ -265,7 +312,7 @@ case "${1:-}" in
|
|
|
265
312
|
;;
|
|
266
313
|
--lane)
|
|
267
314
|
if [[ -z "${2:-}" ]]; then
|
|
268
|
-
echo "Usage: $0 --lane <source-and-static|workflow-contracts|runtime-and-kit>" >&2
|
|
315
|
+
echo "Usage: $0 --lane <source-and-static|workflow-contracts|runtime-and-kit|usage-feedback>" >&2
|
|
269
316
|
exit 2
|
|
270
317
|
fi
|
|
271
318
|
FLOW_AGENTS_CI_LANE="$2"
|
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
"planning_readiness": "ready",
|
|
50
50
|
"expected_modified_files": [
|
|
51
51
|
"context/contracts/builder-kit-workflow-state-contract.md",
|
|
52
|
-
"skills/design-probe/SKILL.md",
|
|
53
|
-
"skills/pickup-probe/SKILL.md"
|
|
52
|
+
"kits/builder/skills/design-probe/SKILL.md",
|
|
53
|
+
"kits/builder/skills/pickup-probe/SKILL.md"
|
|
54
54
|
],
|
|
55
55
|
"conflict_risks": [
|
|
56
56
|
"workflow guidance shared with downstream Builder Kit automation"
|
|
@@ -54,8 +54,8 @@
|
|
|
54
54
|
"planning_readiness": "completed",
|
|
55
55
|
"expected_modified_files": [
|
|
56
56
|
"context/contracts/builder-kit-workflow-state-contract.md",
|
|
57
|
-
"skills/design-probe/SKILL.md",
|
|
58
|
-
"skills/pickup-probe/SKILL.md",
|
|
57
|
+
"kits/builder/skills/design-probe/SKILL.md",
|
|
58
|
+
"kits/builder/skills/pickup-probe/SKILL.md",
|
|
59
59
|
"evals/fixtures/builder-kit-workflow-state/happy-path.json",
|
|
60
60
|
"evals/fixtures/builder-kit-workflow-state/mid-work-resume.json"
|
|
61
61
|
],
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"number": 97,
|
|
74
74
|
"title": "Emit source revision metadata and structured blockers",
|
|
75
75
|
"state": "OPEN",
|
|
76
|
-
"body": "## Problem\nDownstream pickup needs durable source revision and blocker metadata.\n\n## Scope\n- Emit provider-neutral work-item metadata.\n- Preserve human-readable blocker prose.\n\n## Acceptance criteria\n- Source revision fields normalize.\n- Structured blockers preserve provider refs and text blockers.\n\n## Dependencies / Blockers\nRequires kontourai/flow#2.\nBlocked by product decision on rollout scope.\n\n## Source artifact\n`.flow-agents/idea-to-backlog-source-revision-structured-blockers/idea-to-backlog-source-revision-structured-blockers--plan.md`\n\n<!-- flow-agents:work-item-metadata\n{\n \"schema_version\": \"1.0\",\n \"source_revisions\": [\n {\n \"repo\": \"kontourai/flow-agents\",\n \"planned_base_ref\": \"main\",\n \"planned_base_sha\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"planned_at\": \"2026-06-03T03:23:14Z\",\n \"planning_artifact_ref\": \".flow-agents/idea-to-backlog-source-revision-structured-blockers/idea-to-backlog-source-revision-structured-blockers--plan.md\",\n \"planning_scope_refs\": [\n \"skills/idea-to-backlog/SKILL.md\",\n \"context/contracts/work-item-contract.md\"\n ]\n },\n {\n \"repo\": \"kontourai/flow\",\n \"planned_base_ref\": \"main\",\n \"planned_base_sha\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"planned_at\": \"2026-06-03T03:23:14Z\",\n \"planning_artifact_ref\": \".flow-agents/idea-to-backlog-source-revision-structured-blockers/idea-to-backlog-source-revision-structured-blockers--plan.md\",\n \"planning_scope_refs\": [\"context/contracts/work-item-contract.md\"]\n }\n ],\n \"blockers\": [\n {\n \"type\": \"work_item\",\n \"ref\": \"kontourai/flow#2\",\n \"status\": \"blocked\",\n \"summary\": \"Requires Flow contract issue first.\"\n },\n {\n \"type\": \"text\",\n \"status\": \"blocked\",\n \"summary\": \"Product decision on rollout scope.\"\n }\n ]\n}\n-->",
|
|
76
|
+
"body": "## Problem\nDownstream pickup needs durable source revision and blocker metadata.\n\n## Scope\n- Emit provider-neutral work-item metadata.\n- Preserve human-readable blocker prose.\n\n## Acceptance criteria\n- Source revision fields normalize.\n- Structured blockers preserve provider refs and text blockers.\n\n## Dependencies / Blockers\nRequires kontourai/flow#2.\nBlocked by product decision on rollout scope.\n\n## Source artifact\n`.flow-agents/idea-to-backlog-source-revision-structured-blockers/idea-to-backlog-source-revision-structured-blockers--plan.md`\n\n<!-- flow-agents:work-item-metadata\n{\n \"schema_version\": \"1.0\",\n \"source_revisions\": [\n {\n \"repo\": \"kontourai/flow-agents\",\n \"planned_base_ref\": \"main\",\n \"planned_base_sha\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"planned_at\": \"2026-06-03T03:23:14Z\",\n \"planning_artifact_ref\": \".flow-agents/idea-to-backlog-source-revision-structured-blockers/idea-to-backlog-source-revision-structured-blockers--plan.md\",\n \"planning_scope_refs\": [\n \"kits/builder/skills/idea-to-backlog/SKILL.md\",\n \"context/contracts/work-item-contract.md\"\n ]\n },\n {\n \"repo\": \"kontourai/flow\",\n \"planned_base_ref\": \"main\",\n \"planned_base_sha\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"planned_at\": \"2026-06-03T03:23:14Z\",\n \"planning_artifact_ref\": \".flow-agents/idea-to-backlog-source-revision-structured-blockers/idea-to-backlog-source-revision-structured-blockers--plan.md\",\n \"planning_scope_refs\": [\"context/contracts/work-item-contract.md\"]\n }\n ],\n \"blockers\": [\n {\n \"type\": \"work_item\",\n \"ref\": \"kontourai/flow#2\",\n \"status\": \"blocked\",\n \"summary\": \"Requires Flow contract issue first.\"\n },\n {\n \"type\": \"text\",\n \"status\": \"blocked\",\n \"summary\": \"Product decision on rollout scope.\"\n }\n ]\n}\n-->",
|
|
77
77
|
"labels": [],
|
|
78
78
|
"assignees": [],
|
|
79
79
|
"milestone": null,
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"number": 110,
|
|
102
102
|
"title": "Fresh planned item",
|
|
103
103
|
"state": "OPEN",
|
|
104
|
-
"body": "## Scope\nUse fresh source revision metadata.\n\n## Acceptance criteria\nFreshness is verified.\n\n<!-- flow-agents:work-item-metadata\n{\n \"schema_version\": \"1.0\",\n \"planned_base_ref\": \"main\",\n \"planned_base_sha\": \"cccccccccccccccccccccccccccccccccccccccc\",\n \"planned_at\": \"2026-06-02T00:00:00Z\",\n \"planning_artifact_ref\": \".flow-agents/fresh/fresh--plan.md\",\n \"planning_scope_refs\": [\"skills/pull-work/SKILL.md\"]\n}\n-->",
|
|
104
|
+
"body": "## Scope\nUse fresh source revision metadata.\n\n## Acceptance criteria\nFreshness is verified.\n\n<!-- flow-agents:work-item-metadata\n{\n \"schema_version\": \"1.0\",\n \"planned_base_ref\": \"main\",\n \"planned_base_sha\": \"cccccccccccccccccccccccccccccccccccccccc\",\n \"planned_at\": \"2026-06-02T00:00:00Z\",\n \"planning_artifact_ref\": \".flow-agents/fresh/fresh--plan.md\",\n \"planning_scope_refs\": [\"kits/builder/skills/pull-work/SKILL.md\"]\n}\n-->",
|
|
105
105
|
"labels": [],
|
|
106
106
|
"assignees": [],
|
|
107
107
|
"milestone": null,
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"number": 111,
|
|
116
116
|
"title": "Drifted planned item",
|
|
117
117
|
"state": "OPEN",
|
|
118
|
-
"body": "## Scope\nUse drifted source revision metadata.\n\n## Acceptance criteria\nFreshness reports benign drift.\n\n<!-- flow-agents:work-item-metadata\n{\n \"schema_version\": \"1.0\",\n \"planned_base_ref\": \"main\",\n \"planned_base_sha\": \"dddddddddddddddddddddddddddddddddddddddd\",\n \"planned_at\": \"2026-06-01T00:00:00Z\",\n \"planning_artifact_ref\": \".flow-agents/drifted/drifted--plan.md\",\n \"planning_scope_refs\": [\"skills/pickup-probe/SKILL.md\"]\n}\n-->",
|
|
118
|
+
"body": "## Scope\nUse drifted source revision metadata.\n\n## Acceptance criteria\nFreshness reports benign drift.\n\n<!-- flow-agents:work-item-metadata\n{\n \"schema_version\": \"1.0\",\n \"planned_base_ref\": \"main\",\n \"planned_base_sha\": \"dddddddddddddddddddddddddddddddddddddddd\",\n \"planned_at\": \"2026-06-01T00:00:00Z\",\n \"planning_artifact_ref\": \".flow-agents/drifted/drifted--plan.md\",\n \"planning_scope_refs\": [\"kits/builder/skills/pickup-probe/SKILL.md\"]\n}\n-->",
|
|
119
119
|
"labels": [],
|
|
120
120
|
"assignees": [],
|
|
121
121
|
"milestone": null,
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
"number": 112,
|
|
130
130
|
"title": "Stale planned item",
|
|
131
131
|
"state": "OPEN",
|
|
132
|
-
"body": "## Scope\nUse stale source revision metadata.\n\n## Acceptance criteria\nFreshness routes stale work.\n\n<!-- flow-agents:work-item-metadata\n{\n \"schema_version\": \"1.0\",\n \"planned_base_ref\": \"main\",\n \"planned_base_sha\": \"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\n \"planned_at\": \"2026-04-01T00:00:00Z\",\n \"planning_artifact_ref\": \".flow-agents/stale/stale--plan.md\",\n \"planning_scope_refs\": [\"context/contracts/work-item-contract.md\", \"skills/pull-work/SKILL.md\"]\n}\n-->",
|
|
132
|
+
"body": "## Scope\nUse stale source revision metadata.\n\n## Acceptance criteria\nFreshness routes stale work.\n\n<!-- flow-agents:work-item-metadata\n{\n \"schema_version\": \"1.0\",\n \"planned_base_ref\": \"main\",\n \"planned_base_sha\": \"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\n \"planned_at\": \"2026-04-01T00:00:00Z\",\n \"planning_artifact_ref\": \".flow-agents/stale/stale--plan.md\",\n \"planning_scope_refs\": [\"context/contracts/work-item-contract.md\", \"kits/builder/skills/pull-work/SKILL.md\"]\n}\n-->",
|
|
133
133
|
"labels": [],
|
|
134
134
|
"assignees": [],
|
|
135
135
|
"milestone": null,
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
"number": 113,
|
|
144
144
|
"title": "Legacy item missing planned base",
|
|
145
145
|
"state": "OPEN",
|
|
146
|
-
"body": "## Scope\nPreserve legacy gap for missing planned_base_sha.\n\n## Acceptance criteria\nFreshness is not verified.\n\n<!-- flow-agents:work-item-metadata\n{\n \"schema_version\": \"1.0\",\n \"planned_base_ref\": \"main\",\n \"planned_at\": \"2026-06-01T00:00:00Z\",\n \"planning_artifact_ref\": \".flow-agents/legacy/legacy--plan.md\",\n \"planning_scope_refs\": [\"skills/pull-work/SKILL.md\"]\n}\n-->",
|
|
146
|
+
"body": "## Scope\nPreserve legacy gap for missing planned_base_sha.\n\n## Acceptance criteria\nFreshness is not verified.\n\n<!-- flow-agents:work-item-metadata\n{\n \"schema_version\": \"1.0\",\n \"planned_base_ref\": \"main\",\n \"planned_at\": \"2026-06-01T00:00:00Z\",\n \"planning_artifact_ref\": \".flow-agents/legacy/legacy--plan.md\",\n \"planning_scope_refs\": [\"kits/builder/skills/pull-work/SKILL.md\"]\n}\n-->",
|
|
147
147
|
"labels": [],
|
|
148
148
|
"assignees": [],
|
|
149
149
|
"milestone": null,
|
|
@@ -14,7 +14,7 @@ trap 'rm -rf "$TMP_DIR"' EXIT
|
|
|
14
14
|
pass() { echo " ✓ $1"; }
|
|
15
15
|
fail() { echo " ✗ $1"; errors=$((errors + 1)); }
|
|
16
16
|
|
|
17
|
-
CLI="$ROOT/scripts/
|
|
17
|
+
CLI="$ROOT/scripts/kit.js"
|
|
18
18
|
MIXED_SRC="$ROOT/evals/fixtures/flow-kit-repository/mixed-runtime-kit"
|
|
19
19
|
|
|
20
20
|
echo "=== activate npx-context Checks (Issue #57) ==="
|
|
@@ -27,7 +27,7 @@ mkdir -p "$DEST"
|
|
|
27
27
|
|
|
28
28
|
# Install a kit into the destination workspace first.
|
|
29
29
|
install_out="$TMP_DIR/install.out"
|
|
30
|
-
if flow_agents_node "$CLI" install
|
|
30
|
+
if flow_agents_node "$CLI" install "$MIXED_SRC" --dest "$DEST" >"$install_out" 2>&1; then
|
|
31
31
|
pass "mixed-runtime-kit installs into workspace"
|
|
32
32
|
else
|
|
33
33
|
fail "install failed (prerequisite step)"
|
|
@@ -310,20 +310,20 @@ NODE
|
|
|
310
310
|
done
|
|
311
311
|
|
|
312
312
|
for dir in "$KIRO_DEST" "$BASE_DEST" "$CLAUDE_DEST" "$CODEX_DEST"; do
|
|
313
|
-
if [[ -f "$dir/scripts/
|
|
314
|
-
&& node "$dir/scripts/
|
|
315
|
-
&& node "$dir/scripts/
|
|
316
|
-
&& rg -q 'No local Flow Kits installed' /tmp/
|
|
317
|
-
&& rg -q 'No local Flow Kits installed' /tmp/
|
|
313
|
+
if [[ -f "$dir/scripts/kit.js" ]] \
|
|
314
|
+
&& node "$dir/scripts/kit.js" list --dest "$dir" >/tmp/kit-list.out 2>&1 \
|
|
315
|
+
&& node "$dir/scripts/kit.js" status --dest "$dir" >/tmp/kit-status.out 2>&1 \
|
|
316
|
+
&& rg -q 'No local Flow Kits installed' /tmp/kit-list.out \
|
|
317
|
+
&& rg -q 'No local Flow Kits installed' /tmp/kit-status.out; then
|
|
318
318
|
_pass "$dir includes local Flow Kit CLI and empty list/status works"
|
|
319
319
|
else
|
|
320
320
|
_fail "$dir local Flow Kit CLI list/status smoke failed"
|
|
321
321
|
fi
|
|
322
322
|
done
|
|
323
323
|
|
|
324
|
-
if [[ -f "$CODEX_DEST/scripts/
|
|
324
|
+
if [[ -f "$CODEX_DEST/scripts/kit.js" ]] \
|
|
325
325
|
&& [[ -f "$CODEX_DEST/build/src/runtime-adapters.js" ]] \
|
|
326
|
-
&& node "$CODEX_DEST/scripts/
|
|
326
|
+
&& node "$CODEX_DEST/scripts/kit.js" activate --dest "$CODEX_DEST" --format json >/tmp/codex-runtime-activation.json 2>&1 \
|
|
327
327
|
&& node - "$CODEX_DEST" /tmp/codex-runtime-activation.json <<'NODE'
|
|
328
328
|
const fs = require("node:fs");
|
|
329
329
|
const path = require("node:path");
|
|
@@ -344,7 +344,6 @@ then
|
|
|
344
344
|
_pass "Codex installed bundle activates Builder Kit through codex-local"
|
|
345
345
|
else
|
|
346
346
|
_fail "Codex installed bundle runtime activation failed"
|
|
347
|
-
sed -n '1,180p' /tmp/codex-runtime-activation.json 2>/dev/null || true
|
|
348
347
|
fi
|
|
349
348
|
|
|
350
349
|
if node - "$KIRO_DEST" "$BASE_DEST" "$CLAUDE_DEST" "$CODEX_DEST" <<'NODE'
|
|
@@ -714,8 +713,11 @@ else
|
|
|
714
713
|
_fail "Codex core-pack agent filtering failed"
|
|
715
714
|
fi
|
|
716
715
|
|
|
717
|
-
|
|
718
|
-
|
|
716
|
+
# Kit-owned skills (plan-work, deliver) are always present regardless of pack filter.
|
|
717
|
+
# Pack filtering only prunes skills declared in packs.json (the tool-skills).
|
|
718
|
+
# The development-pack tool-skill agentic-engineering should be pruned in a core-only install.
|
|
719
|
+
if [[ -d "$CODEX_CORE_DEST/.codex/skills/plan-work" && -d "$CODEX_CORE_DEST/.codex/skills/deliver" && ! -d "$CODEX_CORE_DEST/.codex/skills/agentic-engineering" ]]; then
|
|
720
|
+
_pass "Codex core-pack install: kit-skills present, dev-only tool-skill pruned"
|
|
719
721
|
else
|
|
720
722
|
_fail "Codex core-pack skill filtering failed"
|
|
721
723
|
fi
|
|
@@ -746,8 +748,11 @@ else
|
|
|
746
748
|
_fail "opencode core-pack agent filtering failed (tool-planner.md missing)"
|
|
747
749
|
fi
|
|
748
750
|
|
|
749
|
-
|
|
750
|
-
|
|
751
|
+
# Kit-owned skills (plan-work, deliver) are always present regardless of pack filter.
|
|
752
|
+
# Pack filtering only prunes skills declared in packs.json (the tool-skills).
|
|
753
|
+
# The development-pack tool-skill agentic-engineering should be pruned in a core-only install.
|
|
754
|
+
if [[ -d "$OPENCODE_CORE_DEST/.opencode/skills/plan-work" && -d "$OPENCODE_CORE_DEST/.opencode/skills/deliver" && ! -d "$OPENCODE_CORE_DEST/.opencode/skills/agentic-engineering" ]]; then
|
|
755
|
+
_pass "opencode core-pack install: kit-skills present, dev-only tool-skill pruned"
|
|
751
756
|
else
|
|
752
757
|
_fail "opencode core-pack skill filtering failed"
|
|
753
758
|
fi
|
|
@@ -146,7 +146,7 @@ if jq -e '
|
|
|
146
146
|
$ext.routing.deferred == 1 and
|
|
147
147
|
($ext.routing.targets | sort) == ["eval", "skill"] and
|
|
148
148
|
($ext.routing.statuses | sort) == ["deferred", "open"] and
|
|
149
|
-
($ext.routing.refs | sort) == ["github:kontourai/flow-agents#96", "skills/learning-review/SKILL.md"] and
|
|
149
|
+
($ext.routing.refs | sort) == ["github:kontourai/flow-agents#96", "kits/builder/skills/learning-review/SKILL.md"] and
|
|
150
150
|
$ext.correction.needed == true and
|
|
151
151
|
$ext.correction.type == "workflow" and
|
|
152
152
|
$ext.correction.recurrence_key == "console-learning-projection.recurrence-metadata" and
|
|
@@ -14,7 +14,7 @@ trap 'rm -rf "$TMP_DIR"' EXIT
|
|
|
14
14
|
pass() { echo " ✓ $1"; }
|
|
15
15
|
fail() { echo " ✗ $1"; errors=$((errors + 1)); }
|
|
16
16
|
|
|
17
|
-
CLI="$ROOT/scripts/
|
|
17
|
+
CLI="$ROOT/scripts/kit.js"
|
|
18
18
|
VALID_SRC="$ROOT/evals/fixtures/flow-kit-repository/valid-local-kit"
|
|
19
19
|
DEST="$TMP_DIR/install-dest"
|
|
20
20
|
mkdir -p "$DEST"
|
|
@@ -33,7 +33,7 @@ echo " (fixture repo: $FILE_URL)"
|
|
|
33
33
|
|
|
34
34
|
# --- Test 1: basic install-git from file:// URL ---
|
|
35
35
|
install_out="$TMP_DIR/install-git.out"
|
|
36
|
-
if flow_agents_node "$CLI" install
|
|
36
|
+
if flow_agents_node "$CLI" install "$FILE_URL" --dest "$DEST" >"$install_out" 2>&1; then
|
|
37
37
|
pass "install-git from file:// URL succeeds"
|
|
38
38
|
else
|
|
39
39
|
fail "install-git from file:// URL failed"
|
|
@@ -72,7 +72,7 @@ fi
|
|
|
72
72
|
# --- Test 2: idempotent re-install from same URL ---
|
|
73
73
|
idempotent_out="$TMP_DIR/idempotent.out"
|
|
74
74
|
registry_hash_before="$(shasum -a 256 "$REGISTRY" | awk '{print $1}')"
|
|
75
|
-
if flow_agents_node "$CLI" install
|
|
75
|
+
if flow_agents_node "$CLI" install "$FILE_URL" --dest "$DEST" >"$idempotent_out" 2>&1 \
|
|
76
76
|
&& grep -q "already installed" "$idempotent_out" \
|
|
77
77
|
&& [[ "$registry_hash_before" == "$(shasum -a 256 "$REGISTRY" | awk '{print $1}')" ]]; then
|
|
78
78
|
pass "install-git same-URL reinstall is idempotent"
|
|
@@ -93,7 +93,7 @@ cp -R "$VALID_SRC" "$FIXTURE_WORKING2"
|
|
|
93
93
|
git clone -q --bare "$FIXTURE_WORKING2" "$FIXTURE_REPO2"
|
|
94
94
|
FILE_URL2="file://$FIXTURE_REPO2"
|
|
95
95
|
|
|
96
|
-
if flow_agents_node "$CLI" install
|
|
96
|
+
if flow_agents_node "$CLI" install "${FILE_URL2}#v1.0" --dest "$DEST2" >"$ref_out" 2>&1; then
|
|
97
97
|
pass "install-git with #ref fragment succeeds"
|
|
98
98
|
else
|
|
99
99
|
fail "install-git with #ref fragment failed"
|
|
@@ -119,7 +119,7 @@ fi
|
|
|
119
119
|
ref_flag_out="$TMP_DIR/ref-flag.out"
|
|
120
120
|
DEST3="$TMP_DIR/dest-with-ref-flag"
|
|
121
121
|
mkdir -p "$DEST3"
|
|
122
|
-
if flow_agents_node "$CLI" install
|
|
122
|
+
if flow_agents_node "$CLI" install "$FILE_URL2" --ref v1.0 --dest "$DEST3" >"$ref_flag_out" 2>&1; then
|
|
123
123
|
pass "install-git with --ref flag succeeds"
|
|
124
124
|
else
|
|
125
125
|
fail "install-git with --ref flag failed"
|
|
@@ -128,7 +128,7 @@ fi
|
|
|
128
128
|
|
|
129
129
|
# --- Test 5: missing git URL exits non-zero ---
|
|
130
130
|
missing_url_out="$TMP_DIR/missing-url.out"
|
|
131
|
-
if flow_agents_node "$CLI" install
|
|
131
|
+
if flow_agents_node "$CLI" install --dest "$DEST" >"$missing_url_out" 2>&1; then
|
|
132
132
|
fail "install-git with no URL should exit non-zero"
|
|
133
133
|
sed -n '1,40p' "$missing_url_out"
|
|
134
134
|
else
|
|
@@ -137,7 +137,7 @@ fi
|
|
|
137
137
|
|
|
138
138
|
# --- Test 6: invalid git URL exits non-zero ---
|
|
139
139
|
invalid_url_out="$TMP_DIR/invalid-url.out"
|
|
140
|
-
if flow_agents_node "$CLI" install
|
|
140
|
+
if flow_agents_node "$CLI" install "file:///nonexistent-repo-that-does-not-exist" --dest "$DEST" >"$invalid_url_out" 2>&1; then
|
|
141
141
|
fail "install-git with invalid URL should exit non-zero"
|
|
142
142
|
sed -n '1,40p' "$invalid_url_out"
|
|
143
143
|
else
|
|
@@ -55,15 +55,15 @@ echo "=== Flow Kit Repository Fixture Checks ==="
|
|
|
55
55
|
expect_pass "valid-local-kit"
|
|
56
56
|
expect_fail "invalid-schema-version" '\.schema_version must be "1\.0"'
|
|
57
57
|
expect_fail "invalid-missing-schema-version" '\.schema_version must be "1\.0"'
|
|
58
|
-
expect_fail "invalid-id" '\.id must be a
|
|
59
|
-
expect_fail "invalid-missing-id" '\.id must be a
|
|
58
|
+
expect_fail "invalid-id" '\.id must be a kebab-case string'
|
|
59
|
+
expect_fail "invalid-missing-id" '\.id must be a kebab-case string'
|
|
60
60
|
expect_fail "invalid-name" '\.name must be a non-empty string'
|
|
61
61
|
expect_fail "invalid-missing-flow" 'flows\[0\]\.path points at missing Flow Definition'
|
|
62
62
|
expect_fail "invalid-absolute-path" 'flows\[0\]\.path must be relative'
|
|
63
|
-
expect_fail "invalid-traversal" "flows\\[0\\]\\.path must
|
|
63
|
+
expect_fail "invalid-traversal" "flows\\[0\\]\\.path must not contain"
|
|
64
64
|
expect_fail "invalid-malformed-json" 'invalid JSON'
|
|
65
65
|
expect_fail "invalid-asset-section" '\.docs must be a list'
|
|
66
|
-
expect_fail "invalid-duplicate-flow" "flows\\[1\\]\\.
|
|
66
|
+
expect_fail "invalid-duplicate-flow" "flows\\[1\\]\\.path duplicates"
|
|
67
67
|
|
|
68
68
|
echo ""
|
|
69
69
|
echo "=== Builder Kit Shared Validation Check ==="
|
|
@@ -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
|
# ===================================================================
|
|
@@ -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" ;;
|