spectoflow 0.13.0 → 0.13.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/LICENSE +1 -1
- package/README.md +45 -15
- package/bin/spectoflow.js +48 -19
- package/package.json +1 -1
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -23,8 +23,27 @@ ceremonial command to start.
|
|
|
23
23
|
## Install
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
npm
|
|
27
|
-
|
|
26
|
+
# npm (recommended)
|
|
27
|
+
npm install -g spectoflow
|
|
28
|
+
spectoflow init /path/to/project
|
|
29
|
+
|
|
30
|
+
# or use it straight from a clone, no global install
|
|
31
|
+
git clone https://github.com/georgesmomo/spectoflow
|
|
32
|
+
node spectoflow/bin/spectoflow.js init /path/to/project
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Every command works both ways — `spectoflow <cmd>` when installed globally, or `node
|
|
36
|
+
/path/to/spectoflow/bin/spectoflow.js <cmd>` from a clone.
|
|
37
|
+
|
|
38
|
+
### CLI
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
spectoflow init [dir] [--agent=claude,codex] scaffold a project (auto-detects installed agents)
|
|
42
|
+
spectoflow update [--dry-run] refresh framework files to this kit version
|
|
43
|
+
spectoflow dashboard [--port=NNNN] run the local control plane (default 4319)
|
|
44
|
+
spectoflow status progress + whether the dashboard is running
|
|
45
|
+
spectoflow --version (-v) print the version
|
|
46
|
+
spectoflow --help (-h) show help
|
|
28
47
|
```
|
|
29
48
|
|
|
30
49
|
`init` scaffolds:
|
|
@@ -90,20 +109,26 @@ agent never clobber each other.
|
|
|
90
109
|
## Dashboard (real-time)
|
|
91
110
|
|
|
92
111
|
```bash
|
|
93
|
-
|
|
112
|
+
spectoflow dashboard # → http://localhost:4319 (or --port=NNNN)
|
|
113
|
+
# manual (no global install): node .spectoflow/dashboard/server.js
|
|
94
114
|
```
|
|
95
115
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
116
|
+
`spectoflow dashboard` is the simple way — it prints the URL and won't double-start (it detects a
|
|
117
|
+
dashboard already running on the port). `spectoflow status` tells you whether one is up. Running the
|
|
118
|
+
`server.js` directly still works for a manual/embedded setup. Zero dependencies, updates live via SSE +
|
|
119
|
+
file watching. Eight tabs behind a dense icon-tab header (brand logo · subtitle · a slim
|
|
120
|
+
global-progress meter · a sync dot · a **Run** quick-action · a **settings** gear): **Board** (the
|
|
121
|
+
control-room Overview — KPI cards, a status donut, a **scope-vs-delivered area curve**, a
|
|
99
122
|
workflow-at-a-glance strip, per-phase progress bars, filter chips + search — plus the phase board),
|
|
100
|
-
**Requests** (tasks awaiting you — `to_validate`/`to_analyze`), **
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
123
|
+
**Requests** (tasks awaiting you — `to_validate`/`to_analyze`), **Attention** (points the agent raised
|
|
124
|
+
via a `::spectoflow attention msg=…` sentinel or that you noted — edit/resolve/delete, or **validate →
|
|
125
|
+
task**), **Backlog** (a flat sortable/filterable, paginated table of every task, defaulting to open
|
|
126
|
+
work), **Workflow** (the pipeline as step cards — click one to enable/disable it, which edits
|
|
127
|
+
`workflow.md`), **Agents & Skills** (enriched cards that open a full-body markdown drawer), **Chat** (a
|
|
128
|
+
full-height group-chat panel), and **Info** (a project-at-a-glance summary). URLs are real routes
|
|
129
|
+
(`/board`, `/backlog/T-012`, …). Charts are zero-dep, hand-rolled SVG in `dashboard/public/charts.js`
|
|
130
|
+
(donut/area/bars/ring, animated, `prefers-reduced-motion`-aware), and every aggregate is computed
|
|
131
|
+
client-side.
|
|
107
132
|
|
|
108
133
|
A floating **💬 chat widget** (bottom-right, redesigned) and the **Chat** tab render the same
|
|
109
134
|
`runtime.messages` log via a shared `renderChatLog()`, so they never drift. A running agent identifies
|
|
@@ -125,9 +150,14 @@ INVEST, Playwright E2E, Conventional Commits, and more — not generic one-liner
|
|
|
125
150
|
|
|
126
151
|
## Language
|
|
127
152
|
|
|
128
|
-
`.spectoflow/config.json` → `language` (default `en`, incl. code comments). Switchable
|
|
153
|
+
`.spectoflow/config.json` → `language` (default `en`, incl. code comments). Switchable from the CLI
|
|
154
|
+
(`config.json`) or the dashboard's **settings** gear (mode + language).
|
|
129
155
|
|
|
130
156
|
## Studied, not copied
|
|
131
157
|
|
|
132
158
|
Structure informed by spec-kit, OpenSpec (markdown + per-agent adapters), and BMAD (agent-personas).
|
|
133
|
-
spectoflow keeps the good ideas, removes the ceremony, and adds a real-time control plane.
|
|
159
|
+
spectoflow keeps the good ideas, removes the ceremony, and adds a real-time control plane.
|
|
160
|
+
|
|
161
|
+
## License & author
|
|
162
|
+
|
|
163
|
+
MIT © 2026 [Georges MOMO](https://github.com/georgesmomo).
|
package/bin/spectoflow.js
CHANGED
|
@@ -16,6 +16,11 @@ const VERSION = require('../package.json').version;
|
|
|
16
16
|
const argv = process.argv.slice(2);
|
|
17
17
|
const cmd = argv[0] || 'help';
|
|
18
18
|
|
|
19
|
+
// Tiny ANSI colouriser — no dependency; disabled when not a TTY or NO_COLOR is set.
|
|
20
|
+
const useColor = process.stdout.isTTY && !process.env.NO_COLOR;
|
|
21
|
+
const paint = (code) => (s) => (useColor ? `\x1b[${code}m${s}\x1b[0m` : String(s));
|
|
22
|
+
const c = { g: paint('32'), cy: paint('36'), b: paint('34'), y: paint('33'), dim: paint('2'), bold: paint('1'), amber: paint('38;5;179') };
|
|
23
|
+
|
|
19
24
|
// ---- dashboard port + running-state probe ------------------------------------
|
|
20
25
|
// Precedence: --port=NNNN > SPECTOFLOW_PORT env > 4319 (matches templates/dashboard/server.js).
|
|
21
26
|
function resolvePort(args) {
|
|
@@ -156,18 +161,27 @@ function update() {
|
|
|
156
161
|
const r = require('../lib/update').runUpdate({ projectRoot: root, templatesDir: TPL, version: VERSION, dryRun });
|
|
157
162
|
|
|
158
163
|
const from = r.fromVersion || 'unknown';
|
|
159
|
-
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
console.log(
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
164
|
+
const changed = r.refreshed.length + r.created.length + r.adopted.length + r.newSidecar.length;
|
|
165
|
+
const row = (sym, label, list, painter, note) => {
|
|
166
|
+
if (!list.length) return;
|
|
167
|
+
const n = c.dim(String(list.length).padStart(2));
|
|
168
|
+
const detail = note ? c.dim(note) : c.dim(list.slice(0, 6).join(', ') + (list.length > 6 ? ` +${list.length - 6} more` : ''));
|
|
169
|
+
console.log(` ${sym} ${painter(label.padEnd(9))} ${n} ${detail}`);
|
|
170
|
+
};
|
|
171
|
+
console.log('');
|
|
172
|
+
console.log(` ${c.bold('spectoflow update')} ${c.dim(from)} ${c.amber('→')} ${c.bold(r.toVersion)}${dryRun ? c.dim(' (dry-run)') : ''}`);
|
|
173
|
+
console.log('');
|
|
174
|
+
row(c.g('✓'), 'refreshed', r.refreshed, c.g);
|
|
175
|
+
row(c.cy('+'), 'created', r.created, c.cy);
|
|
176
|
+
row(c.b('~'), 'adopted', r.adopted, c.b);
|
|
177
|
+
row(c.y('!'), '.new', r.newSidecar, c.y, 'you edited these — new version saved as *.new, merge by hand');
|
|
178
|
+
if (r.unchanged.length) console.log(` ${c.dim('·')} ${c.dim('unchanged'.padEnd(9))} ${c.dim(String(r.unchanged.length).padStart(2))}`);
|
|
179
|
+
console.log(` ${c.dim('=')} ${c.dim('preserved'.padEnd(9))} ${c.dim('config.json · workflow.md · specs/ · plans/ · your custom agents & skills')}`);
|
|
180
|
+
console.log('');
|
|
181
|
+
if (dryRun) console.log(` ${c.dim('(dry-run — nothing was written)')}`);
|
|
182
|
+
else console.log(` ${changed ? c.g('✓ Done') : c.dim('Already up to date')}${changed ? c.dim(` · ${changed} file(s) changed`) : ''}`);
|
|
183
|
+
if (r.newSidecar.length && !dryRun) console.log(` ${c.y('→')} ${c.dim(`${r.newSidecar.length} *.new file(s) to review and merge`)}`);
|
|
184
|
+
console.log('');
|
|
171
185
|
}
|
|
172
186
|
|
|
173
187
|
// THE launch command — prints the URL clearly and won't crash on EADDRINUSE: it probes first
|
|
@@ -204,11 +218,26 @@ async function status() {
|
|
|
204
218
|
console.log(`dashboard: ${running ? `running → http://localhost:${port}` : 'not running'}`);
|
|
205
219
|
}
|
|
206
220
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
221
|
+
function version() { console.log(`spectoflow v${VERSION}`); }
|
|
222
|
+
|
|
223
|
+
const help = () => console.log(`${c.bold('spectoflow')} ${c.amber('v' + VERSION)} — agent-agnostic spec-driven development
|
|
224
|
+
|
|
225
|
+
${c.dim('Usage:')} spectoflow <command> [options]
|
|
226
|
+
|
|
227
|
+
${c.bold('Commands:')}
|
|
228
|
+
${c.g('init')} [dir] [--agent=claude,codex] scaffold a project (auto-detects installed agents)
|
|
229
|
+
${c.g('update')} [--dry-run] refresh framework files to this kit version
|
|
230
|
+
${c.g('dashboard')} [--port=NNNN] run the local control plane (default 4319, or $SPECTOFLOW_PORT)
|
|
231
|
+
${c.g('status')} print progress + whether the dashboard is running
|
|
232
|
+
|
|
233
|
+
${c.bold('Options:')}
|
|
234
|
+
-v, --version print the version
|
|
235
|
+
-h, --help show this help
|
|
236
|
+
|
|
237
|
+
${c.dim('Docs:')} https://github.com/georgesmomo/spectoflow`);
|
|
212
238
|
|
|
213
|
-
const fns = { init, update, dashboard, status, help };
|
|
214
|
-
|
|
239
|
+
const fns = { init, update, dashboard, status, help, version };
|
|
240
|
+
if (['-v', '-V', '--version', 'version'].includes(cmd)) version();
|
|
241
|
+
else if (['-h', '--help'].includes(cmd)) help();
|
|
242
|
+
else if (fns[cmd]) fns[cmd]();
|
|
243
|
+
else help();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spectoflow",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.1",
|
|
4
4
|
"description": "Agent-agnostic spec-driven development framework + real-time local control plane. Markdown artifacts, intent router, workflow-by-scope.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"spec-driven-development",
|