@zhuk/spego 0.13.1 → 0.14.1
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 +25 -6
- package/README.md +9 -10
- package/dist/cli/commands/artifact.js +3 -3
- package/dist/cli/commands/artifact.js.map +1 -1
- package/dist/cli/commands/board.d.ts +2 -0
- package/dist/cli/commands/{mirror.js → board.js} +10 -127
- package/dist/cli/commands/board.js.map +1 -0
- package/dist/cli/commands/delivery.d.ts +3 -2
- package/dist/cli/commands/delivery.js +44 -38
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/index-rebuild.js +3 -4
- package/dist/cli/commands/index-rebuild.js.map +1 -1
- package/dist/cli/commands/meta.js +3 -3
- package/dist/cli/commands/meta.js.map +1 -1
- package/dist/cli/commands/sprints.d.ts +6 -0
- package/dist/cli/commands/sprints.js +35 -0
- package/dist/cli/commands/sprints.js.map +1 -0
- package/dist/cli/commands/view.d.ts +0 -3
- package/dist/cli/commands/view.js +3 -14
- package/dist/cli/commands/view.js.map +1 -1
- package/dist/cli/commands/workspace.js +52 -4
- package/dist/cli/commands/workspace.js.map +1 -1
- package/dist/cli/render.d.ts +6 -0
- package/dist/cli/render.js +9 -0
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/runtime.d.ts +0 -1
- package/dist/cli/runtime.js +1 -1
- package/dist/cli/runtime.js.map +1 -1
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/command-meta/registry.d.ts +1 -0
- package/dist/command-meta/registry.js +18 -8
- package/dist/command-meta/registry.js.map +1 -1
- package/dist/delivery/load.d.ts +13 -0
- package/dist/delivery/load.js +124 -0
- package/dist/delivery/load.js.map +1 -0
- package/dist/delivery/mirror.d.ts +11 -0
- package/dist/delivery/mirror.js +14 -0
- package/dist/delivery/mirror.js.map +1 -1
- package/dist/generator/claude.d.ts +1 -1
- package/dist/generator/claude.js +11 -4
- package/dist/generator/claude.js.map +1 -1
- package/dist/workflows/registry.js +5 -5
- package/dist/workflows/registry.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/mirror.d.ts +0 -2
- package/dist/cli/commands/mirror.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## [
|
|
3
|
+
## [Unreleased]
|
|
4
|
+
|
|
5
|
+
## [0.14.1] - 2026-07-23
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- Uniform human output: every command renders an emoji section header, one blank line, then content; empty states ("No epics.", "No artifacts.", …) keep their section header.
|
|
9
|
+
- Delivery board header emoji is now `📋` (the mirror emoji `🪞` renders poorly in common terminal fonts).
|
|
10
|
+
|
|
11
|
+
## [0.14.0] - 2026-07-22
|
|
4
12
|
|
|
5
13
|
### Added
|
|
6
|
-
- `
|
|
7
|
-
- `
|
|
8
|
-
- `spego mirror` command deriving the delivery mirror (sprint board, blockers, gaps, drift warnings, next-change suggestion) from OpenSpec changes and `epic`/`sprint-plan` artifacts, with `--graph`, `--gaps`, and deterministic `--json` output.
|
|
9
|
-
- `spego-groom` workflow skill for syncing delivery-mirror epics with active OpenSpec changes, analyzing deps/requires/gaps, and maintaining sprint plans.
|
|
14
|
+
- `spego sprints` lists sprint plans in board order (start date, undated last).
|
|
15
|
+
- `spego status` reports advisory delivery drift (ungroomed changes, orphan epics, closable sprints) with a pointer to the groom workflow.
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
### Changed
|
|
18
|
+
- **Breaking:** renamed `spego mirror` to `spego board` (`/spego:board`); the delivery board name matches what the command renders. The Mirror stays the internal derivation concept.
|
|
19
|
+
- **Breaking:** `spego epics` and `spego tasks` take positional arguments: `spego epics [name]`, `spego tasks <change> [task]`. The `--change` and `--task` flags are gone; mutation verbs in the name position still fail with `DELIVERY_READ_ONLY`.
|
|
20
|
+
|
|
21
|
+
### Removed
|
|
22
|
+
- **Breaking:** removed the deprecated `spego view --format` flag; use the global `--json` flag.
|
|
12
23
|
|
|
13
24
|
## [0.13.1] - 2026-07-21
|
|
14
25
|
|
|
@@ -18,6 +29,14 @@
|
|
|
18
29
|
### Removed
|
|
19
30
|
- Removed the per-change `openspec status` subprocess call and the "OpenSpec CLI status unavailable" fallback warning; mirror and epics no longer require the `openspec` binary on PATH.
|
|
20
31
|
|
|
32
|
+
## [0.13.0] - 2026-07-21
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
- `epic` artifact type for mirroring OpenSpec changes with deps, links, requires, and gaps metadata.
|
|
36
|
+
- `sprint-plan` metadata can list ordered OpenSpec changes, enforced to one non-closed sprint at a time.
|
|
37
|
+
- `spego mirror` command deriving the delivery mirror (sprint board, blockers, gaps, drift warnings, next-change suggestion) from OpenSpec changes and `epic`/`sprint-plan` artifacts, with `--graph`, `--gaps`, and deterministic `--json` output.
|
|
38
|
+
- `spego-groom` workflow skill for syncing delivery-mirror epics with active OpenSpec changes, analyzing deps/requires/gaps, and maintaining sprint plans.
|
|
39
|
+
|
|
21
40
|
## [0.12.0] - 2026-07-12
|
|
22
41
|
|
|
23
42
|
### Security
|
package/README.md
CHANGED
|
@@ -24,9 +24,10 @@ spego init --agents claude,opencode --demo false
|
|
|
24
24
|
| `spego commands` | List command metadata |
|
|
25
25
|
| `spego workflows` | List workflow skills metadata |
|
|
26
26
|
| `spego skills` | Regenerate agent skill files |
|
|
27
|
-
| `spego epics` | List delivery epics |
|
|
28
|
-
| `spego tasks
|
|
29
|
-
| `spego
|
|
27
|
+
| `spego epics [name]` | List delivery epics, or get one by change name |
|
|
28
|
+
| `spego tasks <change> [task]` | List tasks for a change, or get one task |
|
|
29
|
+
| `spego sprints` | List sprint plans in board order |
|
|
30
|
+
| `spego board` | Show the delivery board (sprints, blockers, gaps) |
|
|
30
31
|
| `spego index rebuild` | Rebuild SQLite index from files |
|
|
31
32
|
|
|
32
33
|
All commands accept `--cwd <dir>` to set the project root.
|
|
@@ -35,13 +36,11 @@ All commands accept `--cwd <dir>` to set the project root.
|
|
|
35
36
|
|
|
36
37
|
Every spego command speaks two output modes:
|
|
37
38
|
|
|
38
|
-
- **Human (default)** — pretty, scannable output for terminals.
|
|
39
|
+
- **Human (default)** — pretty, scannable output for terminals. Every command renders a section: a single emoji header (`📦 📄 🛠️ 🧭 📚 ✅ ✨ 🗑 📋 🏃 🕸️ 🧩`), one blank line, then the content. Summaries render as bordered boxes (`╭─ … ─╮`), lists render as aligned tables, and `view` separates artifacts with `────` dividers. Errors print as `⚠️ [CODE] message` to stderr.
|
|
39
40
|
- **JSON (opt-in)** — pass the global `--json` flag to get deterministic, decoration-free JSON on stdout. Errors come back as `{ "error": { "code", "message", "details" } }` on stderr; `details` is always an object.
|
|
40
41
|
|
|
41
42
|
Agents calling spego MUST pass `--json` so they get parseable output. Humans normally do not.
|
|
42
43
|
|
|
43
|
-
The legacy `spego view --format markdown|json` flag is **deprecated** and will be removed in the next minor release. Use the global `--json` flag instead. The old flag still works during the deprecation window and prints a single `deprecated:` warning line to stderr.
|
|
44
|
-
|
|
45
44
|
`spego read --json` and `spego update --json` both return artifact records with `frontmatter`, `body`, and `path`; `update` also keeps the compatibility fields `id` and `revision`.
|
|
46
45
|
|
|
47
46
|
`spego create` and `spego update` accept body content through `--body`, `--body-file <path>`, or stdin via `--body-file -`.
|
|
@@ -91,17 +90,17 @@ The adapter is read-only. It observes OpenSpec state but does not create, contin
|
|
|
91
90
|
| `openspec/changes/<name>/proposal.md` | Epic title |
|
|
92
91
|
| `openspec/changes/<name>/tasks.md` | Task status and counts |
|
|
93
92
|
|
|
94
|
-
The `openspec` binary is not required on PATH —
|
|
93
|
+
The `openspec` binary is not required on PATH — board and epics resolve status entirely from `tasks.md` on disk.
|
|
95
94
|
|
|
96
95
|
Archived changes under `openspec/changes/archive/` are excluded. A change with no `tasks.md` is reported as `planning-incomplete`.
|
|
97
96
|
|
|
98
97
|
## Delivery Mirror
|
|
99
98
|
|
|
100
|
-
`spego
|
|
99
|
+
`spego board` derives the delivery mirror on demand — it never writes artifacts or OpenSpec state. It combines active and archived OpenSpec changes with `epic` and `sprint-plan` artifacts into a sprint board: sprints in date order (undated last), changes in each sprint-plan's list order, per-change status, blockers, gaps, and missing artifacts (`requires` minus resolvable `links`). A change is blocked when a dependency is incomplete and not scheduled in the same or an earlier sprint.
|
|
101
100
|
|
|
102
101
|
The default output is the human board. `--graph` shows dependency edges; `--gaps` focuses on gap flags and missing artifacts. The global `--json` flag emits a deterministic `{ sprints, ungrouped, warnings, next }` document in all modes; `next` names the first pending, unblocked change or is `null` with a hint to groom.
|
|
103
102
|
|
|
104
|
-
Every rendering attaches drift warnings: `dangling-dep`, `dep-cycle`, `ungroomed-change`, `orphan-epic`, `archived-in-sprint`, and `closable-sprint`. Repair belongs to the groom workflow;
|
|
103
|
+
Every rendering attaches drift warnings: `dangling-dep`, `dep-cycle`, `ungroomed-change`, `orphan-epic`, `archived-in-sprint`, and `closable-sprint`. Repair belongs to the groom workflow; the board only reports.
|
|
105
104
|
|
|
106
105
|
## OpenCode Workflows
|
|
107
106
|
|
|
@@ -229,7 +228,7 @@ If a combined workflow discovers that OpenSpec artifacts need to change, use the
|
|
|
229
228
|
|
|
230
229
|
Delivery-mirror workflow that reconciles active OpenSpec changes with `epic` and `sprint-plan` artifacts. One Groomer persona runs five phases:
|
|
231
230
|
|
|
232
|
-
1. `orient` — read `spego
|
|
231
|
+
1. `orient` — read `spego board --json` and `spego epics --json`, then classify drift warnings.
|
|
233
232
|
2. `sync` — create missing epics for ungroomed active changes and propose orphan-epic disposition.
|
|
234
233
|
3. `analyze` — update deps, requires, supporting links, and gap notes on epics.
|
|
235
234
|
4. `plan` — propose releasable, testable sprint groupings and create or update `sprint-plan` artifacts after confirmation.
|
|
@@ -10,7 +10,7 @@ import { makeSlug } from '../../artifacts/slug.js';
|
|
|
10
10
|
import { resolveAdapter } from '../../delivery/index.js';
|
|
11
11
|
import { assertWorkspace } from '../../delivery/openspec-discover.js';
|
|
12
12
|
import { SpegoError } from '../../errors.js';
|
|
13
|
-
import { renderDivider, renderHeader, renderTable } from '../render.js';
|
|
13
|
+
import { renderDivider, renderHeader, renderSection, renderTable } from '../render.js';
|
|
14
14
|
import { runEngineCommand } from '../runtime.js';
|
|
15
15
|
import { resolveBody } from '../body-input.js';
|
|
16
16
|
import { assertEpicSlugActive } from '../epic-slug.js';
|
|
@@ -221,7 +221,7 @@ export function registerArtifact(program) {
|
|
|
221
221
|
const items = engine.list({ type: opts.type, includeDeleted: opts.includeDeleted });
|
|
222
222
|
const human = () => {
|
|
223
223
|
if (items.length === 0)
|
|
224
|
-
return 'No artifacts.';
|
|
224
|
+
return renderSection('📦', 'Artifacts', 'No artifacts.');
|
|
225
225
|
const rows = items.map((a) => [
|
|
226
226
|
`${a.type}/${a.slug}`,
|
|
227
227
|
String(a.revision),
|
|
@@ -230,7 +230,7 @@ export function registerArtifact(program) {
|
|
|
230
230
|
a.id,
|
|
231
231
|
]);
|
|
232
232
|
const table = renderTable(['type/slug', 'rev', 'status', 'title', 'id'], rows);
|
|
233
|
-
return
|
|
233
|
+
return renderSection('📦', 'Artifacts', table);
|
|
234
234
|
};
|
|
235
235
|
return { payload: items, human };
|
|
236
236
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../../src/cli/commands/artifact.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAwB,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../../src/cli/commands/artifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { assertWorkspace, discoverChanges } from '../../delivery/openspec-discover.js';
|
|
4
|
-
import { listEpicsFromDiscovered } from '../../delivery/openspec-adapter.js';
|
|
5
|
-
import { deriveMirror, filterMirrorGaps, } from '../../delivery/mirror.js';
|
|
6
|
-
import { SpegoError } from '../../errors.js';
|
|
7
|
-
import { readConfig } from '../../workspace/config.js';
|
|
8
|
-
import { resolveWorkspacePaths } from '../../workspace/paths.js';
|
|
1
|
+
import { loadBoardState } from '../../delivery/load.js';
|
|
2
|
+
import { filterMirrorGaps, } from '../../delivery/mirror.js';
|
|
9
3
|
import { renderHeader, renderTable } from '../render.js';
|
|
10
4
|
import { runEngineCommand } from '../runtime.js';
|
|
11
|
-
export function
|
|
5
|
+
export function registerBoard(program) {
|
|
12
6
|
program
|
|
13
|
-
.command('
|
|
14
|
-
.description('Show delivery
|
|
7
|
+
.command('board')
|
|
8
|
+
.description('Show the delivery board (sprints, blockers, gaps)')
|
|
15
9
|
.option('--graph', 'show dependency graph', false)
|
|
16
10
|
.option('--gaps', 'show gaps, missing artifacts, and blockers', false)
|
|
17
11
|
.option('--cwd <dir>', 'project root')
|
|
18
12
|
.action(async (opts) => {
|
|
19
13
|
await runEngineCommand({ program, cwd: opts.cwd }, async (engine) => {
|
|
20
|
-
const state = await
|
|
14
|
+
const state = await loadBoardState(engine, opts.cwd);
|
|
21
15
|
const payload = opts.gaps ? filterMirrorGaps(state.board) : state.board;
|
|
22
16
|
return {
|
|
23
17
|
payload,
|
|
@@ -32,119 +26,8 @@ export function registerMirror(program) {
|
|
|
32
26
|
});
|
|
33
27
|
});
|
|
34
28
|
}
|
|
35
|
-
async function loadMirrorState(engine, cwd) {
|
|
36
|
-
const projectRoot = path.resolve(cwd ?? process.cwd());
|
|
37
|
-
const wsPaths = resolveWorkspacePaths(projectRoot);
|
|
38
|
-
const config = await readConfig(wsPaths.configPath);
|
|
39
|
-
const adapter = resolveAdapter(projectRoot, config);
|
|
40
|
-
try {
|
|
41
|
-
const input = await collectMirrorInput(engine, projectRoot, adapter);
|
|
42
|
-
return { input, board: deriveMirror(input) };
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
45
|
-
if (err instanceof SpegoError && err.code === 'DELIVERY_ADAPTER_ERROR') {
|
|
46
|
-
const warning = {
|
|
47
|
-
code: 'adapter-unavailable',
|
|
48
|
-
message: 'OpenSpec workspace unavailable; mirror board is empty.',
|
|
49
|
-
details: err.details,
|
|
50
|
-
};
|
|
51
|
-
const input = {
|
|
52
|
-
changes: [],
|
|
53
|
-
epics: [],
|
|
54
|
-
sprints: [],
|
|
55
|
-
linkedArtifacts: [],
|
|
56
|
-
warnings: [warning],
|
|
57
|
-
};
|
|
58
|
-
return { input, board: deriveMirror(input) };
|
|
59
|
-
}
|
|
60
|
-
throw err;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
async function collectMirrorInput(engine, projectRoot, adapter) {
|
|
64
|
-
if (adapter.name === 'openspec')
|
|
65
|
-
await assertWorkspace(projectRoot);
|
|
66
|
-
const discovered = await discoverChanges(projectRoot);
|
|
67
|
-
const adapterEpics = adapter.name === 'openspec'
|
|
68
|
-
? await listEpicsFromDiscovered(projectRoot, discovered.filter((change) => !change.archived))
|
|
69
|
-
: await adapter.listEpics();
|
|
70
|
-
const adapterBySlug = new Map(adapterEpics.map((epic) => [epic.externalId, epic]));
|
|
71
|
-
const seen = new Set();
|
|
72
|
-
const changes = discovered
|
|
73
|
-
.map((item) => {
|
|
74
|
-
seen.add(item.name);
|
|
75
|
-
const adapterEpic = adapterBySlug.get(item.name);
|
|
76
|
-
return sourceChange(item.name, item.archived, adapterEpic);
|
|
77
|
-
})
|
|
78
|
-
.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
79
|
-
for (const epic of adapterEpics) {
|
|
80
|
-
if (seen.has(epic.externalId))
|
|
81
|
-
continue;
|
|
82
|
-
changes.push(sourceChange(epic.externalId, false, epic));
|
|
83
|
-
}
|
|
84
|
-
changes.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
85
|
-
const epics = engine.list({ type: 'epic' }).map(indexedArtifact);
|
|
86
|
-
const sprints = engine.list({ type: 'sprint-plan' }).map(indexedArtifact);
|
|
87
|
-
const linkedArtifacts = await resolveLinkedArtifacts(engine, epics);
|
|
88
|
-
return { changes, epics, sprints, linkedArtifacts, warnings: [] };
|
|
89
|
-
}
|
|
90
|
-
function sourceChange(slug, archived, epic) {
|
|
91
|
-
const status = archived ? 'completed' : (epic?.status ?? 'unknown');
|
|
92
|
-
return {
|
|
93
|
-
slug,
|
|
94
|
-
title: epic?.title ?? slug,
|
|
95
|
-
status,
|
|
96
|
-
archived,
|
|
97
|
-
warnings: epic?.warnings,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
function indexedArtifact(artifact) {
|
|
101
|
-
return {
|
|
102
|
-
id: artifact.id,
|
|
103
|
-
type: artifact.type,
|
|
104
|
-
slug: artifact.slug,
|
|
105
|
-
title: artifact.title,
|
|
106
|
-
meta: artifact.meta,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
async function resolveLinkedArtifacts(engine, epics) {
|
|
110
|
-
const ids = new Set();
|
|
111
|
-
for (const epic of epics) {
|
|
112
|
-
const links = epic.meta.links;
|
|
113
|
-
if (!Array.isArray(links))
|
|
114
|
-
continue;
|
|
115
|
-
for (const link of links) {
|
|
116
|
-
if (typeof link === 'string')
|
|
117
|
-
ids.add(link);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
const artifacts = [];
|
|
121
|
-
for (const id of [...ids].sort()) {
|
|
122
|
-
try {
|
|
123
|
-
const record = await engine.readById(id);
|
|
124
|
-
artifacts.push({
|
|
125
|
-
id: record.frontmatter.id,
|
|
126
|
-
type: record.frontmatter.type,
|
|
127
|
-
slug: record.frontmatter.slug,
|
|
128
|
-
title: record.frontmatter.title,
|
|
129
|
-
meta: record.frontmatter.meta,
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
catch (err) {
|
|
133
|
-
if (err instanceof SpegoError && err.code === 'ARTIFACT_NOT_FOUND')
|
|
134
|
-
continue;
|
|
135
|
-
throw err;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
artifacts.sort((a, b) => {
|
|
139
|
-
const bySlug = a.slug.localeCompare(b.slug);
|
|
140
|
-
if (bySlug !== 0)
|
|
141
|
-
return bySlug;
|
|
142
|
-
return a.id.localeCompare(b.id);
|
|
143
|
-
});
|
|
144
|
-
return artifacts;
|
|
145
|
-
}
|
|
146
29
|
function renderBoard(board) {
|
|
147
|
-
const lines = [renderHeader('
|
|
30
|
+
const lines = [renderHeader('📋', 'Delivery board'), ''];
|
|
148
31
|
if (board.sprints.length === 0 && board.ungrouped.length === 0) {
|
|
149
32
|
lines.push('No groomed delivery board.');
|
|
150
33
|
}
|
|
@@ -176,7 +59,7 @@ function renderGraph(board, input) {
|
|
|
176
59
|
rows.push([change.slug, visible.has(dep) ? dep : `${dep} (missing)`, change.blockers.join(', ') || '—', change.status]);
|
|
177
60
|
}
|
|
178
61
|
}
|
|
179
|
-
const lines = [renderHeader('🕸️', '
|
|
62
|
+
const lines = [renderHeader('🕸️', 'Dependency graph'), ''];
|
|
180
63
|
if (rows.length === 0)
|
|
181
64
|
lines.push('No dependency edges.');
|
|
182
65
|
else
|
|
@@ -196,7 +79,7 @@ function renderGaps(board) {
|
|
|
196
79
|
for (const change of board.ungrouped) {
|
|
197
80
|
rows.push([change.slug, '—', change.blockers.join(', ') || '—', formatGaps(change), change.missing.join(', ') || '—']);
|
|
198
81
|
}
|
|
199
|
-
const lines = [renderHeader('🧩', '
|
|
82
|
+
const lines = [renderHeader('🧩', 'Delivery gaps'), ''];
|
|
200
83
|
if (rows.length === 0)
|
|
201
84
|
lines.push('No gaps, missing artifacts, or blockers.');
|
|
202
85
|
else
|
|
@@ -255,4 +138,4 @@ function allChanges(board) {
|
|
|
255
138
|
changes.push(...board.ungrouped);
|
|
256
139
|
return changes;
|
|
257
140
|
}
|
|
258
|
-
//# sourceMappingURL=
|
|
141
|
+
//# sourceMappingURL=board.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Delivery commands: read-only `epics` and `tasks` views over the configured
|
|
3
|
-
* delivery adapter (default: OpenSpec).
|
|
4
|
-
* `DELIVERY_READ_ONLY` so
|
|
3
|
+
* delivery adapter (default: OpenSpec). Mutation verbs in the name position
|
|
4
|
+
* are rejected with `DELIVERY_READ_ONLY` so agents get a structured pointer
|
|
5
|
+
* to the right tool.
|
|
5
6
|
*/
|
|
6
7
|
import type { Command } from 'commander';
|
|
7
8
|
export declare function registerDelivery(program: Command): void;
|
|
@@ -1,20 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Delivery commands: read-only `epics` and `tasks` views over the configured
|
|
3
|
-
* delivery adapter (default: OpenSpec).
|
|
4
|
-
* `DELIVERY_READ_ONLY` so
|
|
3
|
+
* delivery adapter (default: OpenSpec). Mutation verbs in the name position
|
|
4
|
+
* are rejected with `DELIVERY_READ_ONLY` so agents get a structured pointer
|
|
5
|
+
* to the right tool.
|
|
5
6
|
*/
|
|
6
7
|
import path from 'node:path';
|
|
7
8
|
import { resolveWorkspacePaths } from '../../workspace/paths.js';
|
|
8
9
|
import { readConfig } from '../../workspace/config.js';
|
|
9
10
|
import { resolveAdapter } from '../../delivery/index.js';
|
|
10
11
|
import { SpegoError } from '../../errors.js';
|
|
11
|
-
import {
|
|
12
|
+
import { renderSection, renderTable } from '../render.js';
|
|
12
13
|
import { runCommand } from '../runtime.js';
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const MUTATING_ACTIONS = new Set([
|
|
15
|
+
'create', 'update', 'delete', 'add', 'remove', 'edit', 'set', 'complete', 'close', 'archive',
|
|
16
|
+
]);
|
|
17
|
+
function assertReadOnly(name, surface, usage) {
|
|
18
|
+
if (!name)
|
|
16
19
|
return;
|
|
17
|
-
|
|
20
|
+
if (MUTATING_ACTIONS.has(name)) {
|
|
21
|
+
throw new SpegoError('DELIVERY_READ_ONLY', `Cannot '${name}' delivery ${surface} through spego. Use the OpenSpec CLI for delivery mutations.`, { attemptedAction: name, suggestedTool: 'openspec' });
|
|
22
|
+
}
|
|
23
|
+
if (name === 'get') {
|
|
24
|
+
throw new SpegoError('VALIDATION_FAILED', `'get' is no longer an action; usage: ${usage}`, { usage });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function loadAdapter(cwd) {
|
|
28
|
+
const projectRoot = path.resolve(cwd ?? process.cwd());
|
|
29
|
+
const wsPaths = resolveWorkspacePaths(projectRoot);
|
|
30
|
+
const config = await readConfig(wsPaths.configPath);
|
|
31
|
+
return resolveAdapter(projectRoot, config);
|
|
18
32
|
}
|
|
19
33
|
function renderEpicRow(epic) {
|
|
20
34
|
const progress = epic.taskCount != null ? `${epic.tasksDone ?? 0}/${epic.taskCount}` : '—';
|
|
@@ -26,24 +40,20 @@ function renderTaskRow(task) {
|
|
|
26
40
|
export function registerDelivery(program) {
|
|
27
41
|
program
|
|
28
42
|
.command('epics')
|
|
29
|
-
.description('List epics or get a single epic')
|
|
30
|
-
.argument('[
|
|
31
|
-
.option('--change <name>', 'get a single epic by name')
|
|
43
|
+
.description('List epics or get a single epic by change name')
|
|
44
|
+
.argument('[name]', 'change name to get a single epic')
|
|
32
45
|
.option('--cwd <dir>', 'project root')
|
|
33
|
-
.action(async (
|
|
46
|
+
.action(async (name, opts) => {
|
|
34
47
|
await runCommand({ program }, async () => {
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const adapter = resolveAdapter(projectRoot, config);
|
|
40
|
-
if (opts.change) {
|
|
41
|
-
const epic = await adapter.getEpic(opts.change);
|
|
48
|
+
assertReadOnly(name, 'epics', 'spego epics <name>');
|
|
49
|
+
const adapter = await loadAdapter(opts.cwd);
|
|
50
|
+
if (name && name !== 'list') {
|
|
51
|
+
const epic = await adapter.getEpic(name);
|
|
42
52
|
return {
|
|
43
53
|
payload: epic,
|
|
44
54
|
human: () => {
|
|
45
55
|
const table = renderTable(['id', 'status', 'progress', 'title'], [renderEpicRow(epic)]);
|
|
46
|
-
return
|
|
56
|
+
return renderSection('📚', `Epic (${adapter.name})`, table);
|
|
47
57
|
},
|
|
48
58
|
};
|
|
49
59
|
}
|
|
@@ -52,9 +62,9 @@ export function registerDelivery(program) {
|
|
|
52
62
|
payload: epics,
|
|
53
63
|
human: () => {
|
|
54
64
|
if (epics.length === 0)
|
|
55
|
-
return 'No epics.';
|
|
65
|
+
return renderSection('📚', `Epics (${adapter.name})`, 'No epics.');
|
|
56
66
|
const table = renderTable(['id', 'status', 'progress', 'title'], epics.map(renderEpicRow));
|
|
57
|
-
return
|
|
67
|
+
return renderSection('📚', `Epics (${adapter.name})`, table);
|
|
58
68
|
},
|
|
59
69
|
};
|
|
60
70
|
});
|
|
@@ -62,35 +72,31 @@ export function registerDelivery(program) {
|
|
|
62
72
|
program
|
|
63
73
|
.command('tasks')
|
|
64
74
|
.description('List tasks for a change or get a single task')
|
|
65
|
-
.argument('
|
|
66
|
-
.
|
|
67
|
-
.option('--task <id>', 'get a single task by id')
|
|
75
|
+
.argument('<change>', 'change or epic name')
|
|
76
|
+
.argument('[task]', 'task id to get a single task')
|
|
68
77
|
.option('--cwd <dir>', 'project root')
|
|
69
|
-
.action(async (
|
|
78
|
+
.action(async (change, task, opts) => {
|
|
70
79
|
await runCommand({ program }, async () => {
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const adapter = resolveAdapter(projectRoot, config);
|
|
76
|
-
if (opts.task) {
|
|
77
|
-
const task = await adapter.getTask(opts.change, opts.task);
|
|
80
|
+
assertReadOnly(change, 'tasks', 'spego tasks <change> [task]');
|
|
81
|
+
const adapter = await loadAdapter(opts.cwd);
|
|
82
|
+
if (task) {
|
|
83
|
+
const found = await adapter.getTask(change, task);
|
|
78
84
|
return {
|
|
79
|
-
payload:
|
|
85
|
+
payload: found,
|
|
80
86
|
human: () => {
|
|
81
|
-
const table = renderTable(['done', 'title'], [renderTaskRow(
|
|
82
|
-
return
|
|
87
|
+
const table = renderTable(['done', 'title'], [renderTaskRow(found)]);
|
|
88
|
+
return renderSection('✅', `Task: ${change} (${adapter.name})`, table);
|
|
83
89
|
},
|
|
84
90
|
};
|
|
85
91
|
}
|
|
86
|
-
const tasks = await adapter.listTasks(
|
|
92
|
+
const tasks = await adapter.listTasks(change);
|
|
87
93
|
return {
|
|
88
94
|
payload: tasks,
|
|
89
95
|
human: () => {
|
|
90
96
|
if (tasks.length === 0)
|
|
91
|
-
return `No tasks for ${
|
|
97
|
+
return renderSection('✅', `Tasks: ${change} (${adapter.name})`, `No tasks for ${change}.`);
|
|
92
98
|
const table = renderTable(['done', 'title'], tasks.map(renderTaskRow));
|
|
93
|
-
return
|
|
99
|
+
return renderSection('✅', `Tasks: ${change} (${adapter.name})`, table);
|
|
94
100
|
},
|
|
95
101
|
};
|
|
96
102
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/cli/commands/delivery.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/cli/commands/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Index maintenance: `spego index rebuild`.
|
|
3
3
|
*/
|
|
4
|
-
import { renderBox,
|
|
4
|
+
import { renderBox, renderSection, renderTable } from '../render.js';
|
|
5
5
|
import { runEngineCommand } from '../runtime.js';
|
|
6
6
|
export function registerIndex(program) {
|
|
7
7
|
const indexCmd = program.command('index').description('Index maintenance');
|
|
@@ -18,11 +18,10 @@ export function registerIndex(program) {
|
|
|
18
18
|
['indexed', String(report.indexedArtifacts)],
|
|
19
19
|
['invalid', String(report.invalidFiles.length)],
|
|
20
20
|
]);
|
|
21
|
-
const header = renderHeader('📦', 'Index rebuild');
|
|
22
21
|
if (report.invalidFiles.length === 0)
|
|
23
|
-
return
|
|
22
|
+
return renderSection('📦', 'Index rebuild', summary);
|
|
24
23
|
const table = renderTable(['path', 'error'], report.invalidFiles.map((i) => [i.path, i.error]), { maxWidth: 80 });
|
|
25
|
-
return
|
|
24
|
+
return renderSection('📦', 'Index rebuild', summary, `Invalid files:\n${table}`);
|
|
26
25
|
};
|
|
27
26
|
return { payload: report, human };
|
|
28
27
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-rebuild.js","sourceRoot":"","sources":["../../../src/cli/commands/index-rebuild.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"index-rebuild.js","sourceRoot":"","sources":["../../../src/cli/commands/index-rebuild.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAE3E,QAAQ;SACL,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;SACrC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAClE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,GAAW,EAAE;gBACzB,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,EAAE;oBACzC,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBACxC,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;oBAC5C,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;iBAChD,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;gBAC3F,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,MAAM,EAAE,OAAO,CAAC,EACjB,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EACjD,EAAE,QAAQ,EAAE,EAAE,EAAE,CACjB,CAAC;gBACF,OAAO,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,mBAAmB,KAAK,EAAE,CAAC,CAAC;YACnF,CAAC,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { COMMAND_REGISTRY } from '../../command-meta/registry.js';
|
|
6
6
|
import { WORKFLOW_REGISTRY } from '../../workflows/registry.js';
|
|
7
|
-
import {
|
|
7
|
+
import { renderSection, renderTable } from '../render.js';
|
|
8
8
|
import { runCommand } from '../runtime.js';
|
|
9
9
|
function renderCommandsHuman() {
|
|
10
10
|
const order = ['workspace', 'artifact', 'view', 'planning'];
|
|
@@ -23,12 +23,12 @@ function renderCommandsHuman() {
|
|
|
23
23
|
return `${titles[cat]}\n${table}`;
|
|
24
24
|
})
|
|
25
25
|
.filter((s) => s.length > 0);
|
|
26
|
-
return
|
|
26
|
+
return renderSection('🛠️', 'Commands', ...sections);
|
|
27
27
|
}
|
|
28
28
|
function renderWorkflowsHuman() {
|
|
29
29
|
const rows = WORKFLOW_REGISTRY.map((w) => [w.name, String(w.phases.length), w.description]);
|
|
30
30
|
const table = renderTable(['name', 'phases', 'description'], rows, { maxWidth: 80 });
|
|
31
|
-
return
|
|
31
|
+
return renderSection('🧭', 'Workflows', table);
|
|
32
32
|
}
|
|
33
33
|
export function registerMeta(program) {
|
|
34
34
|
program
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/cli/commands/meta.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/cli/commands/meta.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,SAAS,mBAAmB;IAC3B,MAAM,KAAK,GAAmC,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5F,MAAM,MAAM,GAA4C;QACvD,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,WAAW;QACrB,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,UAAU;KACpB,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK;SACpB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC9F,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;IACnC,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9B,OAAO,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,oBAAoB;IAC5B,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACrF,OAAO,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC5C,OAAO;SACL,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YAC1C,OAAO,EAAE,gBAAgB;YACzB,KAAK,EAAE,mBAAmB;SAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7C,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;aAClB,CAAC,CAAC,CAAC;YACJ,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|