spectoflow 0.16.2 → 0.16.3
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/bin/spectoflow.js +50 -23
- package/package.json +1 -1
package/bin/spectoflow.js
CHANGED
|
@@ -20,11 +20,11 @@ const cmd = argv[0] || 'help';
|
|
|
20
20
|
// Tiny ANSI colouriser — no dependency; disabled when not a TTY or NO_COLOR is set.
|
|
21
21
|
const useColor = process.stdout.isTTY && !process.env.NO_COLOR;
|
|
22
22
|
const paint = (code) => (s) => (useColor ? `\x1b[${code}m${s}\x1b[0m` : String(s));
|
|
23
|
-
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
|
+
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'), white: paint('97') };
|
|
24
24
|
|
|
25
25
|
// ---- branding ---------------------------------------------------------------
|
|
26
|
-
// The spectoflow mark in ASCII:
|
|
27
|
-
//
|
|
26
|
+
// The spectoflow mark in ASCII: the brand hexagon around the flowing "S", drawn WHITE.
|
|
27
|
+
// The name is a compact figlet wordmark drawn AMBER, centered under the mark.
|
|
28
28
|
const LOGO = [
|
|
29
29
|
' ########',
|
|
30
30
|
' ###### #######',
|
|
@@ -32,16 +32,16 @@ const LOGO = [
|
|
|
32
32
|
' ###### ######',
|
|
33
33
|
' ###### #### ######',
|
|
34
34
|
' ##### ###### ####',
|
|
35
|
-
'
|
|
36
|
-
'
|
|
37
|
-
'
|
|
38
|
-
'
|
|
39
|
-
'
|
|
40
|
-
'
|
|
41
|
-
'
|
|
42
|
-
'
|
|
43
|
-
'
|
|
44
|
-
'
|
|
35
|
+
' #### ###### ####',
|
|
36
|
+
' #### ##### ####',
|
|
37
|
+
' #### #### ## ####',
|
|
38
|
+
' #### #### ######### ####',
|
|
39
|
+
' #### #### ####### ##### ####',
|
|
40
|
+
' #### ######## ### ####',
|
|
41
|
+
' #### ## ### ####',
|
|
42
|
+
' #### #### ####',
|
|
43
|
+
' #### ###### ####',
|
|
44
|
+
' #### ###### ####',
|
|
45
45
|
' #### ###### ####',
|
|
46
46
|
' ###### ### ######',
|
|
47
47
|
' ###### ######',
|
|
@@ -50,14 +50,36 @@ const LOGO = [
|
|
|
50
50
|
' ##########',
|
|
51
51
|
' ####',
|
|
52
52
|
];
|
|
53
|
-
const
|
|
54
|
-
|
|
53
|
+
const NAME = [
|
|
54
|
+
' _ __ _',
|
|
55
|
+
' ____ __ ___ __| |_ ___ / _| |_____ __ __',
|
|
56
|
+
" (_-< '_ \\/ -_) _| _/ _ \\ _| / _ \\ V V /",
|
|
57
|
+
' /__/ .__/\\___\\__|\\__\\___/_| |_\\___/\\_/\\_/',
|
|
58
|
+
' |_|',
|
|
59
|
+
];
|
|
60
|
+
const NAME_W = Math.max(...NAME.map((l) => l.length));
|
|
55
61
|
const TAGLINE = 'agent-agnostic spec-driven development · real-time control plane';
|
|
56
|
-
|
|
62
|
+
const INDENT = ' ';
|
|
63
|
+
|
|
64
|
+
// Amber wordmark, indented. `centerUnder` centres it below the hexagon's true midpoint.
|
|
65
|
+
function nameBlock(centerUnder) {
|
|
66
|
+
let pad = INDENT;
|
|
67
|
+
if (centerUnder) {
|
|
68
|
+
let lo = Infinity, hi = 0;
|
|
69
|
+
for (const l of LOGO) { const i = l.search(/#/); if (i >= 0) { lo = Math.min(lo, i); hi = Math.max(hi, l.length - 1); } }
|
|
70
|
+
const cx = INDENT.length + (lo + hi) / 2;
|
|
71
|
+
pad = ' '.repeat(Math.max(0, Math.round(cx - NAME_W / 2)));
|
|
72
|
+
}
|
|
73
|
+
return NAME.map((l) => pad + c.amber(l)).join('\n');
|
|
74
|
+
}
|
|
75
|
+
// Full logo — white hexagon + centered amber wordmark + version. For init and update.
|
|
57
76
|
function logo() {
|
|
58
|
-
const art = LOGO.map((l) =>
|
|
59
|
-
|
|
60
|
-
|
|
77
|
+
const art = LOGO.map((l) => INDENT + c.white(l)).join('\n');
|
|
78
|
+
return `\n${art}\n\n${nameBlock(true)}\n\n${INDENT}${c.dim('v' + VERSION + ' · ' + TAGLINE)}\n`;
|
|
79
|
+
}
|
|
80
|
+
// Just the amber wordmark + version. For help and the explore commands.
|
|
81
|
+
function wordmark() {
|
|
82
|
+
return `\n${nameBlock(false)}\n\n${INDENT}${c.dim('v' + VERSION + ' · ' + TAGLINE)}\n`;
|
|
61
83
|
}
|
|
62
84
|
// One-line brand — for the header of secondary command outputs.
|
|
63
85
|
const brandLine = () => `${c.amber('spectoflow')} ${c.dim('v' + VERSION)}`;
|
|
@@ -266,7 +288,7 @@ function update() {
|
|
|
266
288
|
const detail = note ? c.dim(note) : c.dim(list.slice(0, 6).join(', ') + (list.length > 6 ? ` +${list.length - 6} more` : ''));
|
|
267
289
|
console.log(` ${sym} ${painter(label.padEnd(9))} ${n} ${detail}`);
|
|
268
290
|
};
|
|
269
|
-
console.log(
|
|
291
|
+
console.log(logo());
|
|
270
292
|
console.log(` ${c.bold('spectoflow update')} ${c.dim(from)} ${c.amber('→')} ${c.bold(r.toVersion)}${dryRun ? c.dim(' (dry-run)') : ''}`);
|
|
271
293
|
console.log('');
|
|
272
294
|
row(c.g('✓'), 'refreshed', r.refreshed, c.g);
|
|
@@ -403,7 +425,7 @@ function printWorkflow(withBrand = true) {
|
|
|
403
425
|
}
|
|
404
426
|
function listAll() {
|
|
405
427
|
const { scope } = frameworkSource();
|
|
406
|
-
console.log(
|
|
428
|
+
console.log(wordmark());
|
|
407
429
|
console.log(`${c.bold('Agents')} ${c.dim('— stable team personas (' + scope + ')')}`);
|
|
408
430
|
printAgents(false);
|
|
409
431
|
console.log(`\n${c.bold('Skills')} ${c.dim('— evolving procedures')}`);
|
|
@@ -414,7 +436,7 @@ function listAll() {
|
|
|
414
436
|
}
|
|
415
437
|
|
|
416
438
|
// ---- help (global + per-command) --------------------------------------------
|
|
417
|
-
const help = () => console.log(`${
|
|
439
|
+
const help = () => console.log(`${wordmark()}
|
|
418
440
|
${c.dim('Usage:')} spectoflow ${c.g('<command>')} ${c.dim('[options]')} ${c.dim('· append -h to any command for its help')}
|
|
419
441
|
|
|
420
442
|
${c.bold('Project')}
|
|
@@ -473,7 +495,12 @@ const HELP = {
|
|
|
473
495
|
const showHelp = (name) => console.log('\n' + HELP[name].trim() + '\n');
|
|
474
496
|
|
|
475
497
|
// ---- dispatch ---------------------------------------------------------------
|
|
476
|
-
const fns = {
|
|
498
|
+
const fns = {
|
|
499
|
+
init, update, dashboard, stop: stopDashboard, status, list: listAll, help, version,
|
|
500
|
+
agents: () => { console.log(wordmark()); printAgents(false); },
|
|
501
|
+
skills: () => { console.log(wordmark()); printSkills(false); },
|
|
502
|
+
workflow: () => { console.log(wordmark()); printWorkflow(false); },
|
|
503
|
+
};
|
|
477
504
|
const wantsHelp = argv.slice(1).some((a) => a === '-h' || a === '--help');
|
|
478
505
|
|
|
479
506
|
if (['-v', '-V', '--version', 'version'].includes(cmd)) version();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spectoflow",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.3",
|
|
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",
|