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 CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 G. MOMO
3
+ Copyright (c) 2026 Georges MOMO
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -23,8 +23,27 @@ ceremonial command to start.
23
23
  ## Install
24
24
 
25
25
  ```bash
26
- npm install -g spectoflow # (once published)
27
- spectoflow init /path/to/project # or: node bin/spectoflow.js init .
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
- node .spectoflow/dashboard/server.js # → http://localhost:4319
112
+ spectoflow dashboard # → http://localhost:4319 (or --port=NNNN)
113
+ # manual (no global install): node .spectoflow/dashboard/server.js
94
114
  ```
95
115
 
96
- Zero dependencies, updates live via SSE + file watching. Seven tabs behind a dense icon-tab header
97
- (brand · subtitle · a slim global-progress meter · a sync dot · a **Run** quick-action): **Board**
98
- (the control-room Overview KPI cards, a status donut, a **scope-vs-delivered area curve**, a
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`), **Backlog** (a flat sortable/filterable
101
- table of every task across every plan), **Workflow** (the pipeline as a diagram click a step to
102
- enable/disable it, which edits `workflow.md`), **Agents & Skills** (enriched cards capability,
103
- standards, uses/inputs/outputsthat open a full-body markdown drawer), **Chat** (a full-height
104
- group-chat panel), and **Info** (a project-at-a-glance summary). Charts are zero-dep, hand-rolled SVG
105
- in `dashboard/public/charts.js` (donut/area/bars/ring, animated, `prefers-reduced-motion`-aware), and
106
- every aggregate is computed client-side.
123
+ **Requests** (tasks awaiting you — `to_validate`/`to_analyze`), **Attention** (points the agent raised
124
+ via a `::spectoflow attention msg=…` sentinel or that you notededit/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. MIT.
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
- console.log(`spectoflow update ${from} ${r.toVersion}${dryRun ? ' (dry-run)' : ''}`);
160
- const line = (label, list) => list.length && console.log(` ${label.padEnd(10)} ${String(list.length).padStart(2)} ${list.join(', ')}`);
161
- line('refreshed', r.refreshed);
162
- line('created', r.created);
163
- line('adopted', r.adopted);
164
- line('.new', r.newSidecar);
165
- if (r.unchanged.length) console.log(` ${'unchanged'.padEnd(10)} ${String(r.unchanged.length).padStart(2)}`);
166
- console.log(` ${'preserved'.padEnd(10)} config.json, workflow.md, specs/, plans/, your custom agents & skills`);
167
- if (r.newSidecar.length) {
168
- console.log(`\n${r.newSidecar.length} file(s) you edited have a new version alongside as *.new — compare and merge by hand.`);
169
- }
170
- if (dryRun) console.log('\n(dry-run nothing was written)');
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
- const help = () => console.log(`spectoflow commands:
208
- init [dir] [--agent=claude,codex] install into a project
209
- update [--dry-run] refresh framework files to this kit version
210
- dashboard [--port=NNNN] run the local control plane (default 4319, or $SPECTOFLOW_PORT)
211
- status print progress`);
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
- fns[cmd] ? fns[cmd]() : help();
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.0",
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",