@gobing-ai/spur 0.3.32 → 0.3.34
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/config/config.example.yaml +1 -1
- package/config/workflows/feature-lifecycle.yaml +10 -0
- package/config/workflows/task-pipeline.yaml +15 -3
- package/package.json +10 -10
- package/schemas/spur-config.schema.json +37 -23
- package/spur.js +524 -271
- package/web/index.html +1 -1
|
@@ -74,7 +74,7 @@ agent:
|
|
|
74
74
|
# agent: pi
|
|
75
75
|
# tier: capable-1
|
|
76
76
|
|
|
77
|
-
# `default-by-phase` is a
|
|
77
|
+
# `default-by-phase` is a REMOVED (0452). Prefer
|
|
78
78
|
# executor `tier` + stage-registry model_policy. When present, a matching
|
|
79
79
|
# phase mapping is still authoritative (fail-fast; no fall back to default)
|
|
80
80
|
# and shadows stage routing for that phase.
|
|
@@ -74,6 +74,16 @@ transitions:
|
|
|
74
74
|
guard:
|
|
75
75
|
kind: always
|
|
76
76
|
|
|
77
|
+
# Reopen: done → active (design §7.5 — done is re-enterable; cancelled is not)
|
|
78
|
+
- from: done
|
|
79
|
+
to: active
|
|
80
|
+
description: >
|
|
81
|
+
Reopen completed feature for follow-up work (mandatory History entry).
|
|
82
|
+
Mirrors task-lifecycle done→wip. Prefer spur feature sync --force when
|
|
83
|
+
non-terminal tasks are already linked.
|
|
84
|
+
guard:
|
|
85
|
+
kind: always
|
|
86
|
+
|
|
77
87
|
# Blocked ↔ active — bidirectional
|
|
78
88
|
- from: active
|
|
79
89
|
to: blocked
|
|
@@ -113,6 +113,21 @@ states:
|
|
|
113
113
|
# hook at run start — see the 0062 follow-up note; there is no link-writing
|
|
114
114
|
# CLI verb to call from a shell step, so it cannot live in pure YAML.
|
|
115
115
|
message: "Pipeline start for task ${vars.wbs}."
|
|
116
|
+
# R1 (0453): auto-profile precheck reopens a done feature before task check.
|
|
117
|
+
# Under profile=auto, resolve feature_id, sync (preferred) or update to active.
|
|
118
|
+
# Under non-auto, leave R4 message to guide the operator.
|
|
119
|
+
- kind: shell
|
|
120
|
+
options:
|
|
121
|
+
command: >-
|
|
122
|
+
if [ "$profile" = auto ]; then
|
|
123
|
+
FID=$($spurBin task show $wbs --json 2>/dev/null |
|
|
124
|
+
jq -r '.feature_id // .frontmatter.feature_id // empty' 2>/dev/null);
|
|
125
|
+
if [ -n "$FID" ]; then
|
|
126
|
+
$spurBin feature sync "$FID" --force --json 2>/dev/null ||
|
|
127
|
+
$spurBin feature update "$FID" active 2>/dev/null || true;
|
|
128
|
+
fi;
|
|
129
|
+
fi;
|
|
130
|
+
exit 0
|
|
116
131
|
|
|
117
132
|
- id: implement
|
|
118
133
|
description: >
|
|
@@ -181,8 +196,6 @@ states:
|
|
|
181
196
|
ATTEMPT_FILE=".spur/run/$wbs-test-fix-attempt" &&
|
|
182
197
|
echo 0 > "$ATTEMPT_FILE" &&
|
|
183
198
|
set +e &&
|
|
184
|
-
# sh -c re-parses multi-command gates (&&, ;); do NOT use bare `$qualityGateCmd`
|
|
185
|
-
# word-split (breaks on &&). qualityGateCmd is pipeline-owned trusted config only.
|
|
186
199
|
( sh -c "$qualityGateCmd" ); gate_rc=$?; set -e &&
|
|
187
200
|
if [ "$gate_rc" -eq 0 ]; then
|
|
188
201
|
printf 'PASS\n' > "$STATUS_FILE";
|
|
@@ -223,7 +236,6 @@ states:
|
|
|
223
236
|
mkdir -p .spur/run &&
|
|
224
237
|
STATUS_FILE=".spur/run/$wbs-test-gate.status" &&
|
|
225
238
|
set +e &&
|
|
226
|
-
# See test probe: sh -c for multi-command; qualityGateCmd is trusted config only.
|
|
227
239
|
( sh -c "$qualityGateCmd" ); gate_rc=$?; set -e &&
|
|
228
240
|
if [ "$gate_rc" -eq 0 ]; then
|
|
229
241
|
printf 'PASS\n' > "$STATUS_FILE";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/spur",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Spur CLI
|
|
3
|
+
"version": "0.3.34",
|
|
4
|
+
"description": "Spur CLI \u2014 local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"spur",
|
|
7
7
|
"cli",
|
|
@@ -50,14 +50,14 @@
|
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@commander-js/extra-typings": "^14.0.0",
|
|
53
|
-
"@gobing-ai/ts-db": "^0.4.
|
|
54
|
-
"@gobing-ai/ts-ai-runner": "^0.4.
|
|
55
|
-
"@gobing-ai/ts-dual-workflow-engine": "^0.4.
|
|
56
|
-
"@gobing-ai/ts-infra": "^0.4.
|
|
57
|
-
"@gobing-ai/ts-llm-jsonl-importer": "^0.4.
|
|
58
|
-
"@gobing-ai/ts-rule-engine": "^0.4.
|
|
59
|
-
"@gobing-ai/ts-runtime": "^0.4.
|
|
60
|
-
"@gobing-ai/ts-utils": "^0.4.
|
|
53
|
+
"@gobing-ai/ts-db": "^0.4.19",
|
|
54
|
+
"@gobing-ai/ts-ai-runner": "^0.4.19",
|
|
55
|
+
"@gobing-ai/ts-dual-workflow-engine": "^0.4.19",
|
|
56
|
+
"@gobing-ai/ts-infra": "^0.4.19",
|
|
57
|
+
"@gobing-ai/ts-llm-jsonl-importer": "^0.4.19",
|
|
58
|
+
"@gobing-ai/ts-rule-engine": "^0.4.19",
|
|
59
|
+
"@gobing-ai/ts-runtime": "^0.4.19",
|
|
60
|
+
"@gobing-ai/ts-utils": "^0.4.19",
|
|
61
61
|
"@types/bun": "1.3.14",
|
|
62
62
|
"@types/figlet": "^1.7.0",
|
|
63
63
|
"@types/node-notifier": "8.0.5",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://github.com/gobing-ai/spur/schemas/spur-config.schema.json",
|
|
4
4
|
"title": "Spur Project Configuration",
|
|
5
|
-
"description": "Schema for .spur/config.yaml
|
|
5
|
+
"description": "Schema for .spur/config.yaml \u2014 the single project configuration surface consumed by spur and (future) spur-server.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": ["version", "name"],
|
|
8
8
|
"properties": {
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
},
|
|
108
108
|
"executors": {
|
|
109
109
|
"type": "array",
|
|
110
|
-
"description": "Named executor profiles: each pairs a canonical agent with an optional model override. Referenced by name from `default` and
|
|
110
|
+
"description": "Named executor profiles: each pairs a canonical agent with an optional model override. Referenced by name from `agent.default` and stage model_policy (default-by-phase removed 0452).",
|
|
111
111
|
"items": {
|
|
112
112
|
"type": "object",
|
|
113
113
|
"required": ["name", "agent"],
|
|
@@ -130,18 +130,11 @@
|
|
|
130
130
|
"tier": {
|
|
131
131
|
"type": "string",
|
|
132
132
|
"enum": ["cheap", "standard", "capable-1", "capable-2", "capable-3"],
|
|
133
|
-
"description": "Capability tier for stage-registry adaptive model routing (ADR-033, 0343). Live values: cheap | standard | capable-1 | capable-2 | capable-3 (1=low output quality, 3=high within the capable band). A stage starts on the cheapest eligible executor meeting its model_policy min_tier. Bare legacy `capable` is accepted at runtime (zod preprocess
|
|
133
|
+
"description": "Capability tier for stage-registry adaptive model routing (ADR-033, 0343). Live values: cheap | standard | capable-1 | capable-2 | capable-3 (1=low output quality, 3=high within the capable band). A stage starts on the cheapest eligible executor meeting its model_policy min_tier. Bare legacy `capable` is accepted at runtime (zod preprocess \u2192 capable-1) during the deprecation window but is not part of this editor enum."
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
},
|
|
138
|
-
"default-by-phase": {
|
|
139
|
-
"type": "object",
|
|
140
|
-
"description": "DEPRECATED (ADR-033). Backward-compat map of dev phase (e.g. dev-run, dev-review) to executor selector. Prefer executor `tier` + stage-registry model_policy. When present, a matching phase mapping is still authoritative (fail-fast; no fall back to `default`) and shadows stage routing for that phase.",
|
|
141
|
-
"additionalProperties": {
|
|
142
|
-
"type": "string"
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
138
|
"team": {
|
|
146
139
|
"type": "object",
|
|
147
140
|
"description": "Declarative agent teams keyed by team id (the map key is the teamId). Each team materializes a roster of agent specs (feature M). Mirrors @gobing-ai/spur-config TeamConfigSchema (Zod is SSOT).",
|
|
@@ -169,7 +162,10 @@
|
|
|
169
162
|
"description": "Roster of member references (>= 1). A bare string is shorthand for { executor: <string> }; the composed agent id is <teamId>-<id ?? executor>.",
|
|
170
163
|
"items": {
|
|
171
164
|
"oneOf": [
|
|
172
|
-
{
|
|
165
|
+
{
|
|
166
|
+
"type": "string",
|
|
167
|
+
"minLength": 1
|
|
168
|
+
},
|
|
173
169
|
{
|
|
174
170
|
"type": "object",
|
|
175
171
|
"required": ["executor"],
|
|
@@ -177,27 +173,41 @@
|
|
|
177
173
|
"executor": {
|
|
178
174
|
"type": "string",
|
|
179
175
|
"minLength": 1,
|
|
180
|
-
"description": "Executor name
|
|
176
|
+
"description": "Executor name \u2014 resolved against agent.executors first, else a raw canonical agent type."
|
|
181
177
|
},
|
|
182
178
|
"id": {
|
|
183
179
|
"type": "string",
|
|
184
180
|
"minLength": 1,
|
|
185
181
|
"description": "Local member id; composed id is <teamId>-<id ?? executor> (must match ^[a-z][a-z0-9_-]{1,63}$)."
|
|
186
182
|
},
|
|
187
|
-
"purpose": {
|
|
183
|
+
"purpose": {
|
|
184
|
+
"type": "string"
|
|
185
|
+
},
|
|
188
186
|
"workspace": {
|
|
189
187
|
"type": "string",
|
|
190
188
|
"minLength": 1,
|
|
191
189
|
"description": "Per-member workspace override. A leading `~` is tilde-expanded at load."
|
|
192
190
|
},
|
|
193
|
-
"model": {
|
|
194
|
-
|
|
195
|
-
|
|
191
|
+
"model": {
|
|
192
|
+
"type": "string",
|
|
193
|
+
"minLength": 1
|
|
194
|
+
},
|
|
195
|
+
"autonomy": {
|
|
196
|
+
"type": "string"
|
|
197
|
+
},
|
|
198
|
+
"systemPrompt": {
|
|
199
|
+
"type": "string"
|
|
200
|
+
},
|
|
196
201
|
"command": {
|
|
197
202
|
"type": "array",
|
|
198
|
-
"items": {
|
|
203
|
+
"items": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"minLength": 1
|
|
206
|
+
}
|
|
199
207
|
},
|
|
200
|
-
"autostart": {
|
|
208
|
+
"autostart": {
|
|
209
|
+
"type": "boolean"
|
|
210
|
+
}
|
|
201
211
|
}
|
|
202
212
|
}
|
|
203
213
|
]
|
|
@@ -213,7 +223,9 @@
|
|
|
213
223
|
"properties": {
|
|
214
224
|
"paths": {
|
|
215
225
|
"type": "array",
|
|
216
|
-
"items": {
|
|
226
|
+
"items": {
|
|
227
|
+
"type": "string"
|
|
228
|
+
},
|
|
217
229
|
"description": "Glob paths to rule files."
|
|
218
230
|
}
|
|
219
231
|
}
|
|
@@ -223,7 +235,9 @@
|
|
|
223
235
|
"properties": {
|
|
224
236
|
"paths": {
|
|
225
237
|
"type": "array",
|
|
226
|
-
"items": {
|
|
238
|
+
"items": {
|
|
239
|
+
"type": "string"
|
|
240
|
+
},
|
|
227
241
|
"description": "Glob paths to workflow directories."
|
|
228
242
|
}
|
|
229
243
|
}
|
|
@@ -239,11 +253,11 @@
|
|
|
239
253
|
},
|
|
240
254
|
"tasks": {
|
|
241
255
|
"type": "object",
|
|
242
|
-
"description": "Task-folder registration (design
|
|
256
|
+
"description": "Task-folder registration (design \u00a79). Absorbs the legacy docs/.tasks/config.json folders + baseCounter concepts. Mirrors @gobing-ai/spur-config tasksConfigSchema (Zod is SSOT).",
|
|
243
257
|
"properties": {
|
|
244
258
|
"folders": {
|
|
245
259
|
"type": "object",
|
|
246
|
-
"description": "Map of task-folder path
|
|
260
|
+
"description": "Map of task-folder path \u2192 folder config.",
|
|
247
261
|
"additionalProperties": {
|
|
248
262
|
"type": "object",
|
|
249
263
|
"properties": {
|
|
@@ -275,7 +289,7 @@
|
|
|
275
289
|
},
|
|
276
290
|
"features": {
|
|
277
291
|
"type": "object",
|
|
278
|
-
"description": "Feature directory location (design
|
|
292
|
+
"description": "Feature directory location (design \u00a79). Mirrors @gobing-ai/spur-config featuresConfigSchema (Zod is SSOT).",
|
|
279
293
|
"properties": {
|
|
280
294
|
"dir": {
|
|
281
295
|
"type": "string",
|