@sabaiway/agent-workflow-kit 7.6.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,31 @@ Semantically versioned ([semver](https://semver.org)), newest first. The `versio
|
|
|
4
4
|
is the current release. `upgrade` mode reads a project's `docs/ai/.workflow-version` and applies
|
|
5
5
|
every `migrations/<version>-<slug>.md` newer than it, in semver order.
|
|
6
6
|
|
|
7
|
+
## 8.0.0 — the bundled reader gets the scenario floor, and the refresh lane carries it out (AD-117)
|
|
8
|
+
|
|
9
|
+
Memory **5.0.0** gives the spec reader one new refusal — a `## Scenarios` section carrying no
|
|
10
|
+
scenario line — and this kit ships those bytes. Nothing in the kit's own logic changed shape; what
|
|
11
|
+
changed is what the deployed reader says about a document, and therefore what a project's spec gate
|
|
12
|
+
says about its store.
|
|
13
|
+
|
|
14
|
+
> ### ⚠ BREAKING — inherited from memory 5.0.0
|
|
15
|
+
>
|
|
16
|
+
> `spec-check` (both lanes) and the `spec-check` gate row relay the reader's verdict, so a spec that
|
|
17
|
+
> pins NOTHING now turns a deployment red with no edit of its own. The remedy is one line per
|
|
18
|
+
> scenario — `- S<N> <name> :: unbound` while no test pins it. The refusal is the migration signal:
|
|
19
|
+
> a contract that pins nothing is the one shape the layer exists to refuse.
|
|
20
|
+
|
|
21
|
+
- **`references/scripts/spec-schema{,.test}.mjs`** — refreshed to the 5.0.0 bodies; the four mirrored
|
|
22
|
+
copies stay byte-identical, `sync-mirrors --check` green.
|
|
23
|
+
- **`tools/script-priors.mjs`** — the catalog gains the two OUTGOING `4.7.0..4.7.0` reader rows
|
|
24
|
+
(`spec-schema.mjs`, `spec-schema.test.mjs`), read from the released bytes, so an unmodified 4.7.0
|
|
25
|
+
deployment is recognised as unmodified and converges on the next kit touch instead of stranding as
|
|
26
|
+
`custom`. The independent `FROZEN_PRIORS` pin in the test moves with it — 8 catalog rows, none
|
|
27
|
+
equal to the bundled body.
|
|
28
|
+
- **Obligation discharged: KIT-SUBTREE-CHANGED-WITHOUT-A-BUMP.** Slice 4 wrote 19 spec-binding
|
|
29
|
+
markers into this package's subtree and shipped no bump. This release carries them.
|
|
30
|
+
|
|
31
|
+
|
|
7
32
|
## 7.6.0 — `spec-check`: the spec store judged against what the session SAYS it changed (AD-115)
|
|
8
33
|
|
|
9
34
|
The feature-spec layer gets its structural checker. The change source is EXPLICIT and never git — a
|
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: agent-workflow-kit
|
|
|
3
3
|
description: Deploy or upgrade a portable AI-agent memory-and-workflow system in any project. Use when the user wants to bootstrap `docs/ai/` + an entry-point `AGENTS.md` (+ `CLAUDE.md` alias) + cap/archive/index enforcement in a new or existing repo, set up the Memory Map and session protocols, install the docs-rotation pre-commit hook, or run `/agent-workflow-kit` / `/agent-workflow-kit upgrade`. Triggers on phrases like "set up the memory system", "deploy the AI workflow here", "bootstrap docs/ai", "upgrade the workflow".
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
metadata:
|
|
6
|
-
version: '
|
|
6
|
+
version: '8.0.0'
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# agent-workflow-kit
|
package/capability.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sabaiway/agent-workflow-kit",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0",
|
|
4
4
|
"description": "Portable, cross-agent memory & workflow for AI coding agents — Claude Code, Codex, Cursor, Devin Desktop. One command deploys an AGENTS.md entry point + docs/ai context with cap/archive/index enforcement into any repo.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
|
@@ -38,7 +38,7 @@ export const SPEC_SCHEMA = Object.freeze({
|
|
|
38
38
|
'frontmatter', 'frontmatter-key', 'substrate-key', 'type', 'kind', 'maxlines', 'status', 'revision',
|
|
39
39
|
'root-owns', 'slug', 'kind-path', 'root-uplink', 'title', 'section-missing', 'section-order',
|
|
40
40
|
'section-forbidden', 'fence', 'children-link', 'children-duplicate', 'fan-out', 'scenario-line',
|
|
41
|
-
'scenario-number', 'scenario-marker', 'scenario-path', 'out-of-scope', 'module-line', 'module-empty',
|
|
41
|
+
'scenario-number', 'scenario-marker', 'scenario-path', 'scenarios-empty', 'out-of-scope', 'module-line', 'module-empty',
|
|
42
42
|
'module-traversal', 'module-absolute', 'module-backslash', 'module-glob', 'module-mix', 'parts',
|
|
43
43
|
]),
|
|
44
44
|
});
|
|
@@ -238,6 +238,10 @@ const checkScenarios = (parsed, slug, status, errors, warnings) => {
|
|
|
238
238
|
}
|
|
239
239
|
scenarios.push(scenario);
|
|
240
240
|
}
|
|
241
|
+
if (scenarios.length === 0) {
|
|
242
|
+
errors.push({ rule: 'scenarios-empty', message: `at least one scenario line (\`${SPEC_SCHEMA.unboundMarker}\` while no test pins it)` });
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
241
245
|
const gap = scenarios.findIndex((scenario, i) => scenario.n !== i + 1);
|
|
242
246
|
if (gap !== -1) errors.push({ rule: 'scenario-number', message: `scenario ${gap + 1} is numbered S${scenarios[gap].n} — N runs contiguously from 1` });
|
|
243
247
|
for (const scenario of scenarios) {
|
|
@@ -131,6 +131,14 @@ describe('readSpecDocument — refuse, exactly one rule per defect', () => {
|
|
|
131
131
|
refuses(specDoc({ scenarios: ['- S1 a :: /abs/login.test.mjs :: spec:login/S1'] }), 'login.md', 'scenario-path');
|
|
132
132
|
});
|
|
133
133
|
|
|
134
|
+
it('scenarios-empty / no empty-marker escape', () => {
|
|
135
|
+
refuses(specDoc({ scenarios: [] }), 'login.md', 'scenarios-empty');
|
|
136
|
+
refuses(specDoc({ scenarios: ['*(empty)*'] }), 'login.md', 'scenario-line');
|
|
137
|
+
for (const status of SPEC_SCHEMA.statuses) {
|
|
138
|
+
expect(readSpecDocument(specDoc({ scenarios: ['- S1 x :: unbound'], fields: { status } }), 'login.md').errors).toEqual([]);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
|
|
134
142
|
it('out-of-scope / module-empty / module-* path refusals / module-mix / parts', () => {
|
|
135
143
|
refuses(specDoc({ outOfScope: '' }), 'login.md', 'out-of-scope');
|
|
136
144
|
refuses(specDoc({ outOfScope: 'nothing excluded' }), 'login.md', 'out-of-scope');
|
package/tools/script-priors.mjs
CHANGED
|
@@ -31,6 +31,8 @@ export const SCRIPT_PRIORS = Object.freeze([
|
|
|
31
31
|
prior('check-docs-size.test.mjs', '4.0.0', '4.5.4', '88fbb3d7f097d74771b7c5d9ad99fcd58b274ae33f391e1ff01f4b138b9236cd'),
|
|
32
32
|
prior('spec-schema.mjs', '4.6.0', '4.6.1', 'f8ee23d81e90fd4225ca4ece288cba41982c4430290bc6d033f5ca18d2d283f4'),
|
|
33
33
|
prior('spec-schema.test.mjs', '4.6.0', '4.6.1', 'a12d6d3f5d32c6dabdee7e15af7d2ab15a0ced37515d1844fe0951f60cddbc99'),
|
|
34
|
+
prior('spec-schema.mjs', '4.7.0', '4.7.0', '40b5b038d5ec5ed53c327c6d269d22fe5fa2bed99ae711fbf84306ad047be452'),
|
|
35
|
+
prior('spec-schema.test.mjs', '4.7.0', '4.7.0', 'fde896419924223e54cfcabfdb1ef5807df5386fac700ed7c1463b6e7f81501b'),
|
|
34
36
|
]);
|
|
35
37
|
|
|
36
38
|
export const digestOf = (bytes) => createHash('sha256').update(bytes).digest('hex');
|