@nexagent-cli/cli 0.7.2 → 0.8.0
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/dist/commands/sophie.d.ts.map +1 -1
- package/dist/commands/sophie.js +1 -53
- package/dist/commands/sophie.js.map +1 -1
- package/dist/profiles/sophie.d.ts.map +1 -1
- package/dist/profiles/sophie.js +1 -0
- package/dist/profiles/sophie.js.map +1 -1
- package/dist/workflows/index.d.ts.map +1 -1
- package/dist/workflows/index.js +8 -0
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/sophie/council.d.ts +3 -0
- package/dist/workflows/sophie/council.d.ts.map +1 -0
- package/dist/workflows/sophie/council.js +214 -0
- package/dist/workflows/sophie/council.js.map +1 -0
- package/dist/workflows/sophie/review.d.ts +3 -0
- package/dist/workflows/sophie/review.d.ts.map +1 -0
- package/dist/workflows/sophie/review.js +199 -0
- package/dist/workflows/sophie/review.js.map +1 -0
- package/dist/workflows/sophie/skill.d.ts +3 -0
- package/dist/workflows/sophie/skill.d.ts.map +1 -0
- package/dist/workflows/sophie/skill.js +193 -0
- package/dist/workflows/sophie/skill.js.map +1 -0
- package/dist/workflows/sophie/status.d.ts +3 -0
- package/dist/workflows/sophie/status.d.ts.map +1 -0
- package/dist/workflows/sophie/status.js +184 -0
- package/dist/workflows/sophie/status.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sophie.d.ts","sourceRoot":"","sources":["../../src/commands/sophie.ts"],"names":[],"mappings":"AAaA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"sophie.d.ts","sourceRoot":"","sources":["../../src/commands/sophie.ts"],"names":[],"mappings":"AAaA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE/G"}
|
package/dist/commands/sophie.js
CHANGED
|
@@ -8,7 +8,7 @@ import { buildProfileHelp } from '../runtime/dispatch.js';
|
|
|
8
8
|
import { createWorkflowRegistry } from '../workflows/index.js';
|
|
9
9
|
import { runChat } from './chat.js';
|
|
10
10
|
import { runRun } from './run.js';
|
|
11
|
-
const WORKFLOW_COMMANDS = new Set(['plan', 'audit', 'inspect']);
|
|
11
|
+
const WORKFLOW_COMMANDS = new Set(['plan', 'audit', 'inspect', 'review', 'skill', 'council', 'status']);
|
|
12
12
|
export async function runSophie(subcommand, args, opts) {
|
|
13
13
|
const profile = SOPHIE_PROFILE;
|
|
14
14
|
if (!subcommand || subcommand === '--help' || subcommand === '-h') {
|
|
@@ -56,12 +56,6 @@ export async function runSophie(subcommand, args, opts) {
|
|
|
56
56
|
}
|
|
57
57
|
// Direct commands
|
|
58
58
|
switch (subcommand) {
|
|
59
|
-
case 'skill':
|
|
60
|
-
return runSkill(args[0], opts);
|
|
61
|
-
case 'council':
|
|
62
|
-
return runCouncil(args.join(' '), opts);
|
|
63
|
-
case 'review':
|
|
64
|
-
return runReview(args.join(' '), opts);
|
|
65
59
|
case 'chat':
|
|
66
60
|
case 'c':
|
|
67
61
|
return runChat({ ...opts, agent: 'sophie', memory: true, subagents: true, safety: 'standard', maxTurns: '100' });
|
|
@@ -78,50 +72,4 @@ export async function runSophie(subcommand, args, opts) {
|
|
|
78
72
|
process.exit(1);
|
|
79
73
|
}
|
|
80
74
|
}
|
|
81
|
-
// ── Subcommands ──────────────────────────────────────────────
|
|
82
|
-
async function runSkill(skillName, _opts) {
|
|
83
|
-
if (!skillName) {
|
|
84
|
-
console.log(chalk.hex('#ec4899')('◈ Sophie Skills'));
|
|
85
|
-
console.log('');
|
|
86
|
-
console.log('Available skills:');
|
|
87
|
-
console.log(' • code-reviewer Review code with best practices');
|
|
88
|
-
console.log(' • security-auditor Scan for common vulnerabilities');
|
|
89
|
-
console.log(' • test-generator Generate test cases from code');
|
|
90
|
-
console.log(' • doc-writer Write documentation from code');
|
|
91
|
-
console.log('');
|
|
92
|
-
console.log(chalk.dim('Create: sophie skill create "<name>"'));
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
console.log(chalk.hex('#ec4899')(`◈ Sophie Skill: ${skillName}`));
|
|
96
|
-
console.log(chalk.dim('(Skill generation agent coming in v0.8.0)'));
|
|
97
|
-
}
|
|
98
|
-
async function runCouncil(topic, _opts) {
|
|
99
|
-
if (!topic) {
|
|
100
|
-
console.log(chalk.yellow('Usage: sophie council "<topic>"'));
|
|
101
|
-
process.exit(1);
|
|
102
|
-
}
|
|
103
|
-
console.log(chalk.hex('#ec4899')('◈ Sophie Council'));
|
|
104
|
-
console.log(chalk.dim(`Topic: ${topic}`));
|
|
105
|
-
console.log('');
|
|
106
|
-
console.log(chalk.green('Council members:'));
|
|
107
|
-
console.log(' 🧠 Architect — System design & patterns');
|
|
108
|
-
console.log(' 🔒 Security — Threat modeling & hardening');
|
|
109
|
-
console.log(' ⚡ Performance — Optimization & scaling');
|
|
110
|
-
console.log(' 📐 QA Engineer — Testing & reliability');
|
|
111
|
-
console.log(' 🎨 UX Designer — User experience & flow');
|
|
112
|
-
console.log('');
|
|
113
|
-
console.log(chalk.dim('(MOAE council agent coming in v0.8.0)'));
|
|
114
|
-
}
|
|
115
|
-
async function runReview(_input, _opts) {
|
|
116
|
-
console.log(chalk.hex('#ec4899')('◈ Sophie Review'));
|
|
117
|
-
console.log('');
|
|
118
|
-
console.log(chalk.green('Review checklist:'));
|
|
119
|
-
console.log(' ✓ Correctness — Does it solve the problem?');
|
|
120
|
-
console.log(' ✓ Clarity — Is the code understandable?');
|
|
121
|
-
console.log(' ✓ Efficiency — Are there unnecessary operations?');
|
|
122
|
-
console.log(' ✓ Safety — Are edge cases handled?');
|
|
123
|
-
console.log(' ✓ Style — Does it follow conventions?');
|
|
124
|
-
console.log('');
|
|
125
|
-
console.log(chalk.dim('(Execution review agent coming in v0.8.0)'));
|
|
126
|
-
}
|
|
127
75
|
//# sourceMappingURL=sophie.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sophie.js","sourceRoot":"","sources":["../../src/commands/sophie.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,4DAA4D;AAC5D,+DAA+D;AAE/D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAYlC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"sophie.js","sourceRoot":"","sources":["../../src/commands/sophie.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sophie.d.ts","sourceRoot":"","sources":["../../src/profiles/sophie.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"sophie.d.ts","sourceRoot":"","sources":["../../src/profiles/sophie.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,cAAc,EAAE,OA2B5B,CAAC"}
|
package/dist/profiles/sophie.js
CHANGED
|
@@ -24,6 +24,7 @@ You maintain project memory and help teams coordinate.`,
|
|
|
24
24
|
{ name: 'council', description: 'Run MOAE-style expert review', args: '<topic>', riskLevel: 'medium' },
|
|
25
25
|
{ name: 'inspect', description: 'Deep inspect codebase or context', args: '<path>', riskLevel: 'low' },
|
|
26
26
|
{ name: 'review', description: 'Review execution output and suggest improvements', riskLevel: 'low' },
|
|
27
|
+
{ name: 'status', description: 'Show project status, phase gates, and next action', riskLevel: 'low' },
|
|
27
28
|
{ name: 'run', description: 'Execute with Sophie reasoning profile', args: '<prompt>', aliases: ['r'] },
|
|
28
29
|
{ name: 'chat', description: 'Interactive session with Sophie persona', aliases: ['c'] },
|
|
29
30
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sophie.js","sourceRoot":"","sources":["../../src/profiles/sophie.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,4DAA4D;AAC5D,+DAA+D;AAI/D,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,QAAQ;IACrB,WAAW,EAAE,wFAAwF;IACrG,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE;;;;uDAIuC;IACrD,YAAY,EAAE,mBAAmB;IACjC,eAAe,EAAE,WAAW;IAC5B,eAAe,EAAE,QAAQ;IACzB,UAAU,EAAE,SAAS;IACrB,IAAI,EAAE,GAAG;IACT,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,sCAAsC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE;QACvG,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,uCAAuC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE;QAC3G,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,oCAAoC,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;QACrF,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;QACtG,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kCAAkC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE;QACtG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kDAAkD,EAAE,SAAS,EAAE,KAAK,EAAE;QACrG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,uCAAuC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;QACvG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,yCAAyC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;KACzF;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"sophie.js","sourceRoot":"","sources":["../../src/profiles/sophie.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,4DAA4D;AAC5D,+DAA+D;AAI/D,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,QAAQ;IACrB,WAAW,EAAE,wFAAwF;IACrG,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE;;;;uDAIuC;IACrD,YAAY,EAAE,mBAAmB;IACjC,eAAe,EAAE,WAAW;IAC5B,eAAe,EAAE,QAAQ;IACzB,UAAU,EAAE,SAAS;IACrB,IAAI,EAAE,GAAG;IACT,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,sCAAsC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE;QACvG,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,uCAAuC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE;QAC3G,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,oCAAoC,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;QACrF,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;QACtG,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kCAAkC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE;QACtG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kDAAkD,EAAE,SAAS,EAAE,KAAK,EAAE;QACrG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE,SAAS,EAAE,KAAK,EAAE;QACtG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,uCAAuC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;QACvG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,yCAAyC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;KACzF;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAgBA,wBAAgB,sBAAsB,sDAkBrC;AAED,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/workflows/index.js
CHANGED
|
@@ -5,6 +5,10 @@ import { createDefaultWorkflows } from '../runtime/workflow.js';
|
|
|
5
5
|
import { planWorkflow } from './sophie/plan.js';
|
|
6
6
|
import { auditWorkflow } from './sophie/audit.js';
|
|
7
7
|
import { inspectWorkflow } from './sophie/inspect.js';
|
|
8
|
+
import { reviewWorkflow } from './sophie/review.js';
|
|
9
|
+
import { skillWorkflow } from './sophie/skill.js';
|
|
10
|
+
import { councilWorkflow } from './sophie/council.js';
|
|
11
|
+
import { statusWorkflow } from './sophie/status.js';
|
|
8
12
|
import { scaffoldWorkflow } from './amarax/scaffold.js';
|
|
9
13
|
import { packageWorkflow } from './amarax/package.js';
|
|
10
14
|
import { brandWorkflow } from './amarax/brand.js';
|
|
@@ -14,6 +18,10 @@ export function createWorkflowRegistry() {
|
|
|
14
18
|
registry.register('sophie:plan', planWorkflow);
|
|
15
19
|
registry.register('sophie:audit', auditWorkflow);
|
|
16
20
|
registry.register('sophie:inspect', inspectWorkflow);
|
|
21
|
+
registry.register('sophie:review', reviewWorkflow);
|
|
22
|
+
registry.register('sophie:skill', skillWorkflow);
|
|
23
|
+
registry.register('sophie:council', councilWorkflow);
|
|
24
|
+
registry.register('sophie:status', statusWorkflow);
|
|
17
25
|
// Amarax workflows
|
|
18
26
|
registry.register('amarax:scaffold', scaffoldWorkflow);
|
|
19
27
|
registry.register('amarax:package', packageWorkflow);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mDAAmD;AACnD,+DAA+D;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,UAAU,sBAAsB;IACpC,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAE1C,mBAAmB;IACnB,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mDAAmD;AACnD,+DAA+D;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,UAAU,sBAAsB;IACpC,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAE1C,mBAAmB;IACnB,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IACnD,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAEnD,mBAAmB;IACnB,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IACvD,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAEjD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"council.d.ts","sourceRoot":"","sources":["../../../src/workflows/sophie/council.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAkBjF,wBAAsB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAiJnF"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export async function councilWorkflow(ctx) {
|
|
4
|
+
const topic = ctx.input.trim();
|
|
5
|
+
if (!topic) {
|
|
6
|
+
return {
|
|
7
|
+
success: false,
|
|
8
|
+
data: {},
|
|
9
|
+
messages: [
|
|
10
|
+
'Error: No topic provided.',
|
|
11
|
+
'',
|
|
12
|
+
'Usage: sophie council "<topic or question>"',
|
|
13
|
+
'',
|
|
14
|
+
'Example: sophie council "Should we migrate to pnpm?"',
|
|
15
|
+
],
|
|
16
|
+
recommendations: ['Provide a clear, decision-oriented question for the council.'],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Detect project context for richer recommendations
|
|
20
|
+
let pkg = null;
|
|
21
|
+
try {
|
|
22
|
+
const raw = await readFile(join(ctx.cwd, 'package.json'), 'utf-8');
|
|
23
|
+
pkg = JSON.parse(raw);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
pkg = null;
|
|
27
|
+
}
|
|
28
|
+
const version = pkg?.version || 'unknown';
|
|
29
|
+
const scripts = pkg && typeof pkg.scripts === 'object' && pkg.scripts !== null
|
|
30
|
+
? pkg.scripts : {};
|
|
31
|
+
const hasTests = 'test' in scripts;
|
|
32
|
+
const hasCi = 'ci' in scripts;
|
|
33
|
+
// Generate council perspectives based on topic keywords
|
|
34
|
+
const lowerTopic = topic.toLowerCase();
|
|
35
|
+
const isRelease = /release|version|publish|deploy|ship/.test(lowerTopic);
|
|
36
|
+
const isMigration = /migrat|switch|move|upgrade|update/.test(lowerTopic);
|
|
37
|
+
const isArchitecture = /architect|refactor|restruct|redesign/.test(lowerTopic);
|
|
38
|
+
const isSecurity = /security|vulnerability|auth|encrypt/.test(lowerTopic);
|
|
39
|
+
const members = [
|
|
40
|
+
{
|
|
41
|
+
role: 'Architect',
|
|
42
|
+
icon: '🏗',
|
|
43
|
+
perspective: generateArchitectView(topic, isArchitecture, isMigration),
|
|
44
|
+
recommendation: generateArchitectRec(topic, isArchitecture, isMigration),
|
|
45
|
+
confidence: isArchitecture ? 0.92 : 0.75,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
role: 'Security',
|
|
49
|
+
icon: '🔒',
|
|
50
|
+
perspective: generateSecurityView(topic, isSecurity, isRelease),
|
|
51
|
+
recommendation: generateSecurityRec(topic, isSecurity, isRelease),
|
|
52
|
+
confidence: isSecurity ? 0.95 : 0.70,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
role: 'Release',
|
|
56
|
+
icon: '🚀',
|
|
57
|
+
perspective: generateReleaseView(topic, isRelease, hasTests, hasCi),
|
|
58
|
+
recommendation: generateReleaseRec(topic, isRelease, hasTests, hasCi),
|
|
59
|
+
confidence: isRelease ? 0.90 : 0.72,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
role: 'Product',
|
|
63
|
+
icon: '📐',
|
|
64
|
+
perspective: generateProductView(topic, isRelease, version),
|
|
65
|
+
recommendation: generateProductRec(topic, isRelease, version),
|
|
66
|
+
confidence: 0.78,
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
// Compute consensus
|
|
70
|
+
const avgConfidence = members.reduce((s, m) => s + m.confidence, 0) / members.length;
|
|
71
|
+
const recs = members.map(m => m.recommendation.toLowerCase());
|
|
72
|
+
const goCount = recs.filter(r => r.includes('proceed') || r.includes('go') || r.includes('yes') || r.includes('ship')).length;
|
|
73
|
+
const cautionCount = recs.filter(r => r.includes('caution') || r.includes('wait') || r.includes('defer') || r.includes('hold')).length;
|
|
74
|
+
const noCount = recs.filter(r => r.includes('no') || r.includes('block') || r.includes('stop') || r.includes('wait')).length;
|
|
75
|
+
let consensusLevel;
|
|
76
|
+
if (goCount >= 3)
|
|
77
|
+
consensusLevel = 'strong';
|
|
78
|
+
else if (goCount >= 2 && cautionCount <= 1)
|
|
79
|
+
consensusLevel = 'moderate';
|
|
80
|
+
else if (goCount >= 2 || cautionCount >= 2)
|
|
81
|
+
consensusLevel = 'weak';
|
|
82
|
+
else
|
|
83
|
+
consensusLevel = 'split';
|
|
84
|
+
// Final recommendation
|
|
85
|
+
let finalRecommendation;
|
|
86
|
+
if (consensusLevel === 'strong') {
|
|
87
|
+
finalRecommendation = 'Proceed with confidence. The council is aligned. Document the decision and execute.';
|
|
88
|
+
}
|
|
89
|
+
else if (consensusLevel === 'moderate') {
|
|
90
|
+
finalRecommendation = 'Proceed with a phased approach. Address the caution flags before full commitment.';
|
|
91
|
+
}
|
|
92
|
+
else if (consensusLevel === 'weak') {
|
|
93
|
+
finalRecommendation = 'Defer or run a time-boxed spike. The council sees significant uncertainty.';
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
finalRecommendation = 'Do not proceed without further analysis. The council is split. Gather more data and reconvene.';
|
|
97
|
+
}
|
|
98
|
+
const actionItems = [];
|
|
99
|
+
if (!hasTests)
|
|
100
|
+
actionItems.push('Add test coverage before any release decision.');
|
|
101
|
+
if (!hasCi)
|
|
102
|
+
actionItems.push('Set up CI pipeline to validate changes automatically.');
|
|
103
|
+
if (isRelease)
|
|
104
|
+
actionItems.push('Run full regression test suite before shipping.');
|
|
105
|
+
if (isMigration)
|
|
106
|
+
actionItems.push('Create rollback plan and validate data compatibility.');
|
|
107
|
+
if (isSecurity)
|
|
108
|
+
actionItems.push('Schedule security audit and review threat model.');
|
|
109
|
+
if (actionItems.length === 0)
|
|
110
|
+
actionItems.push('Document the decision in ADR or team wiki.');
|
|
111
|
+
const council = {
|
|
112
|
+
topic,
|
|
113
|
+
members,
|
|
114
|
+
finalRecommendation,
|
|
115
|
+
consensusLevel,
|
|
116
|
+
actionItems,
|
|
117
|
+
};
|
|
118
|
+
if (ctx.flags.json) {
|
|
119
|
+
return {
|
|
120
|
+
success: true,
|
|
121
|
+
data: council,
|
|
122
|
+
messages: [],
|
|
123
|
+
recommendations: actionItems,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const messages = [];
|
|
127
|
+
messages.push(`🧠 Sophie Council — "${topic}"`);
|
|
128
|
+
messages.push(` Current version: ${version}`);
|
|
129
|
+
messages.push('');
|
|
130
|
+
members.forEach(m => {
|
|
131
|
+
messages.push(`${m.icon} ${m.role} (confidence: ${Math.round(m.confidence * 100)}%)`);
|
|
132
|
+
messages.push(` Perspective: ${m.perspective}`);
|
|
133
|
+
messages.push(` Recommendation: ${m.recommendation}`);
|
|
134
|
+
messages.push('');
|
|
135
|
+
});
|
|
136
|
+
messages.push(`Consensus: ${consensusLevel.toUpperCase()}`);
|
|
137
|
+
messages.push(`Final recommendation: ${finalRecommendation}`);
|
|
138
|
+
messages.push('');
|
|
139
|
+
messages.push('Action items:');
|
|
140
|
+
actionItems.forEach(a => messages.push(` → ${a}`));
|
|
141
|
+
return {
|
|
142
|
+
success: true,
|
|
143
|
+
data: council,
|
|
144
|
+
messages,
|
|
145
|
+
recommendations: actionItems,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// ── Perspective generators ───────────────────────────────────
|
|
149
|
+
function generateArchitectView(topic, isArch, isMigrate) {
|
|
150
|
+
if (isArch)
|
|
151
|
+
return `The structural change in "${topic}" affects core abstractions. Review coupling and cohesion before proceeding.`;
|
|
152
|
+
if (isMigrate)
|
|
153
|
+
return `Migration changes the foundation. Evaluate blast radius, deprecation path, and backward compatibility.`;
|
|
154
|
+
return `From an architecture standpoint, "${topic}" should be evaluated for side effects on existing modules and interfaces.`;
|
|
155
|
+
}
|
|
156
|
+
function generateArchitectRec(_topic, isArch, isMigrate) {
|
|
157
|
+
if (isArch)
|
|
158
|
+
return 'Proceed with a design doc and incremental refactoring plan.';
|
|
159
|
+
if (isMigrate)
|
|
160
|
+
return 'Run a proof-of-concept on a non-critical module first.';
|
|
161
|
+
return 'No structural blockers. Proceed with standard review.';
|
|
162
|
+
}
|
|
163
|
+
function generateSecurityView(topic, isSec, isRelease) {
|
|
164
|
+
if (isSec)
|
|
165
|
+
return `Security-sensitive topic "${topic}" requires threat modeling and dependency scanning.`;
|
|
166
|
+
if (isRelease)
|
|
167
|
+
return 'Release expands the attack surface. Verify secrets management and supply-chain integrity.';
|
|
168
|
+
return `Standard security posture applies to "${topic}". No immediate red flags.`;
|
|
169
|
+
}
|
|
170
|
+
function generateSecurityRec(_topic, isSec, isRelease) {
|
|
171
|
+
if (isSec)
|
|
172
|
+
return 'Hold until security audit is complete and findings are resolved.';
|
|
173
|
+
if (isRelease)
|
|
174
|
+
return 'Proceed only after automated security checks pass in CI.';
|
|
175
|
+
return 'Proceed with caution. Monitor for new CVEs post-deployment.';
|
|
176
|
+
}
|
|
177
|
+
function generateReleaseView(topic, isRelease, hasTests, hasCi) {
|
|
178
|
+
if (isRelease)
|
|
179
|
+
return `Release "${topic}" needs green CI, version bump, changelog, and rollback plan.`;
|
|
180
|
+
const readiness = [hasTests ? 'tests' : null, hasCi ? 'CI' : null].filter(Boolean);
|
|
181
|
+
if (readiness.length === 0)
|
|
182
|
+
return 'Project lacks automated validation. Any change is high-risk.';
|
|
183
|
+
if (readiness.length === 1)
|
|
184
|
+
return `Only ${readiness[0]} is in place. Build out the other gate before shipping.`;
|
|
185
|
+
return `Project has ${readiness.join(' and ')}. Release pipeline is moderately mature.`;
|
|
186
|
+
}
|
|
187
|
+
function generateReleaseRec(_topic, isRelease, hasTests, hasCi) {
|
|
188
|
+
if (isRelease) {
|
|
189
|
+
if (hasTests && hasCi)
|
|
190
|
+
return 'Ship it. All gates are green.';
|
|
191
|
+
if (hasTests)
|
|
192
|
+
return 'Proceed with manual CI verification before release.';
|
|
193
|
+
if (hasCi)
|
|
194
|
+
return 'Add tests before release; CI alone is insufficient.';
|
|
195
|
+
return 'Block release. No automated validation in place.';
|
|
196
|
+
}
|
|
197
|
+
return 'Proceed. Change is not release-critical.';
|
|
198
|
+
}
|
|
199
|
+
function generateProductView(topic, isRelease, version) {
|
|
200
|
+
if (isRelease)
|
|
201
|
+
return `Version ${version} release for "${topic}" must align with user communication and support readiness.`;
|
|
202
|
+
return `Product impact of "${topic}" depends on user-facing changes. Verify no breaking changes without deprecation.`;
|
|
203
|
+
}
|
|
204
|
+
function generateProductRec(_topic, isRelease, version) {
|
|
205
|
+
if (isRelease) {
|
|
206
|
+
if (version === 'unknown')
|
|
207
|
+
return 'Caution: unknown version. Define versioning strategy first.';
|
|
208
|
+
if (/^0\./.test(version))
|
|
209
|
+
return 'Proceed with pre-release label. v0.x implies instability is acceptable.';
|
|
210
|
+
return 'Proceed with full release checklist for stable version.';
|
|
211
|
+
}
|
|
212
|
+
return 'Proceed. Monitor user feedback after deployment.';
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=council.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"council.js","sourceRoot":"","sources":["../../../src/workflows/sophie/council.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAmBjC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAoB;IACxD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE;gBACR,2BAA2B;gBAC3B,EAAE;gBACF,6CAA6C;gBAC7C,EAAE;gBACF,sDAAsD;aACvD;YACD,eAAe,EAAE,CAAC,8DAA8D,CAAC;SAClF,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,IAAI,GAAG,GAAmC,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QACnE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;IAED,MAAM,OAAO,GAAI,GAAG,EAAE,OAAkB,IAAI,SAAS,CAAC;IACtD,MAAM,OAAO,GAAG,GAAG,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI;QAC5E,CAAC,CAAE,GAAG,CAAC,OAAmC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,IAAI,OAAO,CAAC;IAE9B,wDAAwD;IACxD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,qCAAqC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,mCAAmC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,cAAc,GAAG,sCAAsC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,qCAAqC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE1E,MAAM,OAAO,GAAoB;QAC/B;YACE,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,CAAC;YACtE,cAAc,EAAE,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,CAAC;YACxE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;SACzC;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC;YAC/D,cAAc,EAAE,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC;YACjE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;SACrC;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;YACnE,cAAc,EAAE,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;YACrE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;SACpC;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC;YAC3D,cAAc,EAAE,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC;YAC7D,UAAU,EAAE,IAAI;SACjB;KACF,CAAC;IAEF,oBAAoB;IACpB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACrF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9H,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACvI,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAE7H,IAAI,cAA6C,CAAC;IAClD,IAAI,OAAO,IAAI,CAAC;QAAE,cAAc,GAAG,QAAQ,CAAC;SACvC,IAAI,OAAO,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC;QAAE,cAAc,GAAG,UAAU,CAAC;SACnE,IAAI,OAAO,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC;QAAE,cAAc,GAAG,MAAM,CAAC;;QAC/D,cAAc,GAAG,OAAO,CAAC;IAE9B,uBAAuB;IACvB,IAAI,mBAA2B,CAAC;IAChC,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;QAChC,mBAAmB,GAAG,qFAAqF,CAAC;IAC9G,CAAC;SAAM,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;QACzC,mBAAmB,GAAG,mFAAmF,CAAC;IAC5G,CAAC;SAAM,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QACrC,mBAAmB,GAAG,4EAA4E,CAAC;IACrG,CAAC;SAAM,CAAC;QACN,mBAAmB,GAAG,gGAAgG,CAAC;IACzH,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,CAAC,QAAQ;QAAE,WAAW,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAClF,IAAI,CAAC,KAAK;QAAE,WAAW,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACtF,IAAI,SAAS;QAAE,WAAW,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACnF,IAAI,WAAW;QAAE,WAAW,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IAC3F,IAAI,UAAU;QAAE,WAAW,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACrF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAE7F,MAAM,OAAO,GAAgB;QAC3B,KAAK;QACL,OAAO;QACP,mBAAmB;QACnB,cAAc;QACd,WAAW;KACZ,CAAC;IAEF,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,OAA6C;YACnD,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,WAAW;SAC7B,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,wBAAwB,KAAK,GAAG,CAAC,CAAC;IAChD,QAAQ,CAAC,IAAI,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAClB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,iBAAiB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACtF,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,IAAI,CAAC,cAAc,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5D,QAAQ,CAAC,IAAI,CAAC,yBAAyB,mBAAmB,EAAE,CAAC,CAAC;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,OAA6C;QACnD,QAAQ;QACR,eAAe,EAAE,WAAW;KAC7B,CAAC;AACJ,CAAC;AAED,gEAAgE;AAEhE,SAAS,qBAAqB,CAAC,KAAa,EAAE,MAAe,EAAE,SAAkB;IAC/E,IAAI,MAAM;QAAE,OAAO,6BAA6B,KAAK,8EAA8E,CAAC;IACpI,IAAI,SAAS;QAAE,OAAO,wGAAwG,CAAC;IAC/H,OAAO,qCAAqC,KAAK,4EAA4E,CAAC;AAChI,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc,EAAE,MAAe,EAAE,SAAkB;IAC/E,IAAI,MAAM;QAAE,OAAO,6DAA6D,CAAC;IACjF,IAAI,SAAS;QAAE,OAAO,wDAAwD,CAAC;IAC/E,OAAO,uDAAuD,CAAC;AACjE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,KAAc,EAAE,SAAkB;IAC7E,IAAI,KAAK;QAAE,OAAO,6BAA6B,KAAK,qDAAqD,CAAC;IAC1G,IAAI,SAAS;QAAE,OAAO,2FAA2F,CAAC;IAClH,OAAO,yCAAyC,KAAK,4BAA4B,CAAC;AACpF,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc,EAAE,KAAc,EAAE,SAAkB;IAC7E,IAAI,KAAK;QAAE,OAAO,kEAAkE,CAAC;IACrF,IAAI,SAAS;QAAE,OAAO,0DAA0D,CAAC;IACjF,OAAO,6DAA6D,CAAC;AACvE,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,SAAkB,EAAE,QAAiB,EAAE,KAAc;IAC/F,IAAI,SAAS;QAAE,OAAO,YAAY,KAAK,+DAA+D,CAAC;IACvG,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,8DAA8D,CAAC;IAClG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,SAAS,CAAC,CAAC,CAAC,yDAAyD,CAAC;IACjH,OAAO,eAAe,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,0CAA0C,CAAC;AAC1F,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc,EAAE,SAAkB,EAAE,QAAiB,EAAE,KAAc;IAC/F,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,QAAQ,IAAI,KAAK;YAAE,OAAO,+BAA+B,CAAC;QAC9D,IAAI,QAAQ;YAAE,OAAO,qDAAqD,CAAC;QAC3E,IAAI,KAAK;YAAE,OAAO,qDAAqD,CAAC;QACxE,OAAO,kDAAkD,CAAC;IAC5D,CAAC;IACD,OAAO,0CAA0C,CAAC;AACpD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,SAAkB,EAAE,OAAe;IAC7E,IAAI,SAAS;QAAE,OAAO,WAAW,OAAO,iBAAiB,KAAK,6DAA6D,CAAC;IAC5H,OAAO,sBAAsB,KAAK,mFAAmF,CAAC;AACxH,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc,EAAE,SAAkB,EAAE,OAAe;IAC7E,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,6DAA6D,CAAC;QAChG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,yEAAyE,CAAC;QAC3G,OAAO,yDAAyD,CAAC;IACnE,CAAC;IACD,OAAO,kDAAkD,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/workflows/sophie/review.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAoBjF,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA6LlF"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
export async function reviewWorkflow(ctx) {
|
|
4
|
+
const target = ctx.input.trim() || ctx.cwd;
|
|
5
|
+
const resolved = resolve(target);
|
|
6
|
+
let targetStat;
|
|
7
|
+
try {
|
|
8
|
+
targetStat = await stat(resolved);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return {
|
|
12
|
+
success: false,
|
|
13
|
+
data: {},
|
|
14
|
+
messages: [`Error: Target path does not exist: ${resolved}`],
|
|
15
|
+
recommendations: ['Provide a valid file path or run without a target to review the current directory.'],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const notes = [];
|
|
19
|
+
let filesReviewed = 0;
|
|
20
|
+
let totalLines = 0;
|
|
21
|
+
const sourceFiles = [];
|
|
22
|
+
// Walk source files (limit depth and count)
|
|
23
|
+
const walk = async (dir, depth) => {
|
|
24
|
+
if (depth > 3 || filesReviewed > 50)
|
|
25
|
+
return;
|
|
26
|
+
try {
|
|
27
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
28
|
+
for (const e of entries) {
|
|
29
|
+
if (e.isDirectory()) {
|
|
30
|
+
const lower = e.name.toLowerCase();
|
|
31
|
+
if (lower === 'node_modules' || lower === '.git' || lower === 'dist' || lower === 'build' || lower === 'coverage')
|
|
32
|
+
continue;
|
|
33
|
+
await walk(join(dir, e.name), depth + 1);
|
|
34
|
+
}
|
|
35
|
+
else if (/\.(ts|tsx|js|jsx|py|go|rs)$/.test(e.name)) {
|
|
36
|
+
const fp = join(dir, e.name);
|
|
37
|
+
sourceFiles.push(fp);
|
|
38
|
+
filesReviewed++;
|
|
39
|
+
try {
|
|
40
|
+
const content = await readFile(fp, 'utf-8');
|
|
41
|
+
totalLines += content.split('\n').length;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// ignore unreadable
|
|
45
|
+
}
|
|
46
|
+
if (filesReviewed > 50)
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// ignore unreadable
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
if (targetStat.isDirectory()) {
|
|
56
|
+
await walk(resolved, 0);
|
|
57
|
+
}
|
|
58
|
+
else if (/\.(ts|tsx|js|jsx|py|go|rs)$/.test(resolved)) {
|
|
59
|
+
sourceFiles.push(resolved);
|
|
60
|
+
filesReviewed = 1;
|
|
61
|
+
try {
|
|
62
|
+
const content = await readFile(resolved, 'utf-8');
|
|
63
|
+
totalLines = content.split('\n').length;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// ignore
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Analyze package.json if present
|
|
70
|
+
let pkg = null;
|
|
71
|
+
const pkgPath = targetStat.isDirectory() ? join(resolved, 'package.json') : join(resolve(resolved, '..'), 'package.json');
|
|
72
|
+
try {
|
|
73
|
+
const raw = await readFile(pkgPath, 'utf-8');
|
|
74
|
+
pkg = JSON.parse(raw);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
pkg = null;
|
|
78
|
+
}
|
|
79
|
+
const scripts = pkg && typeof pkg.scripts === 'object' && pkg.scripts !== null
|
|
80
|
+
? pkg.scripts : {};
|
|
81
|
+
// Architecture notes
|
|
82
|
+
const architectureNotes = [];
|
|
83
|
+
if (pkg) {
|
|
84
|
+
const deps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
|
|
85
|
+
if (deps.express || deps.fastify || deps.koa)
|
|
86
|
+
architectureNotes.push('Backend framework detected — verify route organization follows domain-driven structure.');
|
|
87
|
+
if (deps.react || deps.vue)
|
|
88
|
+
architectureNotes.push('Frontend framework detected — check component hierarchy and state management boundaries.');
|
|
89
|
+
if (deps.typescript)
|
|
90
|
+
architectureNotes.push('TypeScript project — ensure strict mode is enabled and types are exported from entry points.');
|
|
91
|
+
if (deps.zod || deps.joi || deps.yup)
|
|
92
|
+
architectureNotes.push('Schema validation library present — validate schemas are shared between API and client layers.');
|
|
93
|
+
if (deps.prisma || deps.mongoose || deps.typeorm)
|
|
94
|
+
architectureNotes.push('ORM/ODM detected — review migration strategy and connection pooling config.');
|
|
95
|
+
}
|
|
96
|
+
if (filesReviewed > 30)
|
|
97
|
+
architectureNotes.push('Large codebase (>30 files) — consider modularizing into packages or micro-frontends.');
|
|
98
|
+
if (filesReviewed > 0 && totalLines / filesReviewed > 300)
|
|
99
|
+
architectureNotes.push('High average file size — some modules may be doing too much; consider splitting.');
|
|
100
|
+
// Risk points
|
|
101
|
+
const riskPoints = [];
|
|
102
|
+
if (!scripts.test)
|
|
103
|
+
riskPoints.push('No test script — untested changes risk regressions.');
|
|
104
|
+
if (!scripts.build)
|
|
105
|
+
riskPoints.push('No build script — release artifacts may be inconsistent.');
|
|
106
|
+
if (!scripts.lint)
|
|
107
|
+
riskPoints.push('No lint script — style inconsistencies will accumulate.');
|
|
108
|
+
if (!pkg?.private && !pkg?.files)
|
|
109
|
+
riskPoints.push('Package may publish unintended files — define a "files" array.');
|
|
110
|
+
if (sourceFiles.some(f => f.includes('.env')) || sourceFiles.some(f => f.includes('secret'))) {
|
|
111
|
+
riskPoints.push('Potential secret leakage — review for hardcoded credentials or .env files in source.');
|
|
112
|
+
}
|
|
113
|
+
// Test coverage notes
|
|
114
|
+
const testCoverageNotes = [];
|
|
115
|
+
const hasTestDir = targetStat.isDirectory()
|
|
116
|
+
? (await readdir(resolved).catch(() => [])).some(n => /test|spec|__tests__/.test(n))
|
|
117
|
+
: false;
|
|
118
|
+
if (!scripts.test && !hasTestDir) {
|
|
119
|
+
testCoverageNotes.push('No test infrastructure detected — add a test runner and initial coverage.');
|
|
120
|
+
}
|
|
121
|
+
else if (scripts.test) {
|
|
122
|
+
testCoverageNotes.push(`Test script found: "${scripts.test}" — verify coverage thresholds are enforced in CI.`);
|
|
123
|
+
}
|
|
124
|
+
if (!scripts['test:ci'] && !scripts['test:coverage']) {
|
|
125
|
+
testCoverageNotes.push('No CI-specific test script — consider adding test:ci for headless runner execution.');
|
|
126
|
+
}
|
|
127
|
+
// Missing blockers
|
|
128
|
+
const missingBlockers = [];
|
|
129
|
+
if (!pkg)
|
|
130
|
+
missingBlockers.push('No package.json — project metadata and dependency management missing.');
|
|
131
|
+
else {
|
|
132
|
+
if (!pkg.engines)
|
|
133
|
+
missingBlockers.push('No "engines" field — runtime compatibility undefined.');
|
|
134
|
+
if (!pkg.license)
|
|
135
|
+
missingBlockers.push('No license field — legal risk for open-source distribution.');
|
|
136
|
+
}
|
|
137
|
+
const hasCiConfig = targetStat.isDirectory()
|
|
138
|
+
? (await readdir(resolved).catch(() => [])).some(n => n === '.github')
|
|
139
|
+
: false;
|
|
140
|
+
if (!hasCiConfig)
|
|
141
|
+
missingBlockers.push('No CI configuration — automated testing and deployment missing.');
|
|
142
|
+
// Recommended next patch
|
|
143
|
+
const recommendedNextPatch = missingBlockers.length > 0
|
|
144
|
+
? `Address blocker: ${missingBlockers[0]}`
|
|
145
|
+
: riskPoints.length > 0
|
|
146
|
+
? `Mitigate risk: ${riskPoints[0]}`
|
|
147
|
+
: 'Refactor: extract shared utilities into a dedicated module.';
|
|
148
|
+
const review = {
|
|
149
|
+
target: resolved,
|
|
150
|
+
filesReviewed,
|
|
151
|
+
totalLines,
|
|
152
|
+
notes,
|
|
153
|
+
architectureNotes,
|
|
154
|
+
riskPoints,
|
|
155
|
+
testCoverageNotes,
|
|
156
|
+
missingBlockers,
|
|
157
|
+
recommendedNextPatch,
|
|
158
|
+
};
|
|
159
|
+
if (ctx.flags.json) {
|
|
160
|
+
return {
|
|
161
|
+
success: true,
|
|
162
|
+
data: review,
|
|
163
|
+
messages: [],
|
|
164
|
+
recommendations: [recommendedNextPatch],
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const messages = [];
|
|
168
|
+
messages.push(`🔍 Review target: ${resolved}`);
|
|
169
|
+
messages.push(` Files reviewed: ${filesReviewed} | Total lines: ${totalLines}`);
|
|
170
|
+
messages.push('');
|
|
171
|
+
if (architectureNotes.length) {
|
|
172
|
+
messages.push('Architecture notes:');
|
|
173
|
+
architectureNotes.forEach(n => messages.push(` 🏗 ${n}`));
|
|
174
|
+
messages.push('');
|
|
175
|
+
}
|
|
176
|
+
if (riskPoints.length) {
|
|
177
|
+
messages.push('Risk points:');
|
|
178
|
+
riskPoints.forEach(r => messages.push(` ⚠️ ${r}`));
|
|
179
|
+
messages.push('');
|
|
180
|
+
}
|
|
181
|
+
if (testCoverageNotes.length) {
|
|
182
|
+
messages.push('Test coverage notes:');
|
|
183
|
+
testCoverageNotes.forEach(t => messages.push(` 🧪 ${t}`));
|
|
184
|
+
messages.push('');
|
|
185
|
+
}
|
|
186
|
+
if (missingBlockers.length) {
|
|
187
|
+
messages.push('Missing release blockers:');
|
|
188
|
+
missingBlockers.forEach(b => messages.push(` 🚫 ${b}`));
|
|
189
|
+
messages.push('');
|
|
190
|
+
}
|
|
191
|
+
messages.push(`Recommended next patch: ${recommendedNextPatch}`);
|
|
192
|
+
return {
|
|
193
|
+
success: true,
|
|
194
|
+
data: review,
|
|
195
|
+
messages,
|
|
196
|
+
recommendations: [recommendedNextPatch],
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/workflows/sophie/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/workflows/sophie/skill.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAoHjF,wBAAsB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA0GjF"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const SKILL_TEMPLATES = {
|
|
4
|
+
'code-reviewer': {
|
|
5
|
+
purpose: 'Review code changes for correctness, clarity, and adherence to best practices.',
|
|
6
|
+
inputs: ['file path or diff', 'language context', 'review focus (optional)'],
|
|
7
|
+
tools: [
|
|
8
|
+
{ name: 'file-read', purpose: 'Read source files for review' },
|
|
9
|
+
{ name: 'file-search', purpose: 'Find related files and patterns' },
|
|
10
|
+
],
|
|
11
|
+
executionSteps: [
|
|
12
|
+
'Read the target file(s) or diff',
|
|
13
|
+
'Identify logical errors, edge cases, and style violations',
|
|
14
|
+
'Check for security anti-patterns',
|
|
15
|
+
'Suggest specific improvements with line references',
|
|
16
|
+
'Rate severity: info / warn / critical',
|
|
17
|
+
],
|
|
18
|
+
safety: {
|
|
19
|
+
maxTokens: 8000,
|
|
20
|
+
allowedPaths: ['./src', './lib', './tests'],
|
|
21
|
+
forbiddenCommands: ['rm', 'rmdir', 'del'],
|
|
22
|
+
requireConfirmation: false,
|
|
23
|
+
},
|
|
24
|
+
outputSchema: 'JSON array of { line, severity, message, suggestion }',
|
|
25
|
+
},
|
|
26
|
+
'security-auditor': {
|
|
27
|
+
purpose: 'Scan code for common security vulnerabilities and misconfigurations.',
|
|
28
|
+
inputs: ['project directory', 'scan depth', 'focus areas (optional)'],
|
|
29
|
+
tools: [
|
|
30
|
+
{ name: 'file-read', purpose: 'Read config and source files' },
|
|
31
|
+
{ name: 'file-search', purpose: 'Find secrets, keys, and sensitive patterns' },
|
|
32
|
+
{ name: 'shell-exec', purpose: 'Run dependency audit (npm audit, etc.)' },
|
|
33
|
+
],
|
|
34
|
+
executionSteps: [
|
|
35
|
+
'Scan for hardcoded secrets, API keys, and credentials',
|
|
36
|
+
'Check dependency tree for known CVEs',
|
|
37
|
+
'Review authentication and authorization patterns',
|
|
38
|
+
'Validate input sanitization and output encoding',
|
|
39
|
+
'Produce a risk-ranked findings report',
|
|
40
|
+
],
|
|
41
|
+
safety: {
|
|
42
|
+
maxTokens: 12000,
|
|
43
|
+
allowedPaths: ['./'],
|
|
44
|
+
forbiddenCommands: ['rm', 'rmdir', 'del', 'format', 'mkfs'],
|
|
45
|
+
requireConfirmation: true,
|
|
46
|
+
},
|
|
47
|
+
outputSchema: 'JSON object with { findings: [], riskScore, recommendations: [] }',
|
|
48
|
+
},
|
|
49
|
+
'test-generator': {
|
|
50
|
+
purpose: 'Generate test cases from source code, requirements, or existing tests.',
|
|
51
|
+
inputs: ['source file path', 'test framework', 'coverage target'],
|
|
52
|
+
tools: [
|
|
53
|
+
{ name: 'file-read', purpose: 'Read source and existing tests' },
|
|
54
|
+
{ name: 'file-search', purpose: 'Find related modules and mocks' },
|
|
55
|
+
],
|
|
56
|
+
executionSteps: [
|
|
57
|
+
'Analyze source code for public API surface',
|
|
58
|
+
'Identify edge cases and boundary conditions',
|
|
59
|
+
'Generate unit tests for happy path and error paths',
|
|
60
|
+
'Suggest integration test scenarios',
|
|
61
|
+
'Output test files in the requested framework',
|
|
62
|
+
],
|
|
63
|
+
safety: {
|
|
64
|
+
maxTokens: 10000,
|
|
65
|
+
allowedPaths: ['./src', './tests'],
|
|
66
|
+
forbiddenCommands: ['rm', 'rmdir', 'del'],
|
|
67
|
+
requireConfirmation: false,
|
|
68
|
+
},
|
|
69
|
+
outputSchema: 'JSON array of { testName, description, input, expected, framework }',
|
|
70
|
+
},
|
|
71
|
+
'doc-writer': {
|
|
72
|
+
purpose: 'Write documentation from code comments, types, and structure.',
|
|
73
|
+
inputs: ['source directory', 'output format (markdown/jsdoc)', 'audience level'],
|
|
74
|
+
tools: [
|
|
75
|
+
{ name: 'file-read', purpose: 'Read source and README' },
|
|
76
|
+
{ name: 'file-list', purpose: 'Map project structure' },
|
|
77
|
+
],
|
|
78
|
+
executionSteps: [
|
|
79
|
+
'Map the project structure and entry points',
|
|
80
|
+
'Extract JSDoc/TSDoc comments and type signatures',
|
|
81
|
+
'Generate API reference with usage examples',
|
|
82
|
+
'Write getting-started and contribution guides',
|
|
83
|
+
'Output formatted documentation files',
|
|
84
|
+
],
|
|
85
|
+
safety: {
|
|
86
|
+
maxTokens: 12000,
|
|
87
|
+
allowedPaths: ['./src', './docs', './README.md'],
|
|
88
|
+
forbiddenCommands: ['rm', 'rmdir', 'del'],
|
|
89
|
+
requireConfirmation: false,
|
|
90
|
+
},
|
|
91
|
+
outputSchema: 'Markdown string with sections: Overview, API Reference, Examples, Contributing',
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
export async function skillWorkflow(ctx) {
|
|
95
|
+
const input = ctx.input.trim();
|
|
96
|
+
if (!input) {
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
data: { availableSkills: Object.keys(SKILL_TEMPLATES) },
|
|
100
|
+
messages: [
|
|
101
|
+
'Error: No skill name provided.',
|
|
102
|
+
'',
|
|
103
|
+
'Usage: sophie skill create "<name>"',
|
|
104
|
+
'',
|
|
105
|
+
'Available skill templates:',
|
|
106
|
+
...Object.keys(SKILL_TEMPLATES).map(k => ` • ${k}`),
|
|
107
|
+
],
|
|
108
|
+
recommendations: ['Pick a template name or describe a custom skill.'],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Parse input: could be "create code-reviewer" or just "code-reviewer"
|
|
112
|
+
const parts = input.split(/\s+/);
|
|
113
|
+
const skillName = parts[parts.length - 1].toLowerCase().replace(/[^a-z0-9-]/g, '-');
|
|
114
|
+
const template = SKILL_TEMPLATES[skillName];
|
|
115
|
+
if (!template) {
|
|
116
|
+
return {
|
|
117
|
+
success: false,
|
|
118
|
+
data: { requested: skillName, available: Object.keys(SKILL_TEMPLATES) },
|
|
119
|
+
messages: [
|
|
120
|
+
`Unknown skill template: "${skillName}"`,
|
|
121
|
+
'',
|
|
122
|
+
'Available templates:',
|
|
123
|
+
...Object.keys(SKILL_TEMPLATES).map(k => ` • ${k}`),
|
|
124
|
+
],
|
|
125
|
+
recommendations: ['Use one of the listed templates, or describe a custom skill.'],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// Try to detect project context
|
|
129
|
+
let projectName = 'unknown';
|
|
130
|
+
try {
|
|
131
|
+
const pkgRaw = await readFile(join(ctx.cwd, 'package.json'), 'utf-8');
|
|
132
|
+
const pkg = JSON.parse(pkgRaw);
|
|
133
|
+
projectName = pkg.name || 'unknown';
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// ignore
|
|
137
|
+
}
|
|
138
|
+
const skill = {
|
|
139
|
+
skillName,
|
|
140
|
+
purpose: template.purpose || 'Custom skill for project automation.',
|
|
141
|
+
inputs: template.inputs || ['input data'],
|
|
142
|
+
tools: template.tools || [{ name: 'file-read', purpose: 'Read files' }],
|
|
143
|
+
executionSteps: template.executionSteps || ['Analyze input', 'Execute tool chain', 'Produce output'],
|
|
144
|
+
safety: template.safety || {
|
|
145
|
+
maxTokens: 8000,
|
|
146
|
+
allowedPaths: ['./'],
|
|
147
|
+
forbiddenCommands: ['rm', 'rmdir', 'del'],
|
|
148
|
+
requireConfirmation: true,
|
|
149
|
+
},
|
|
150
|
+
outputSchema: template.outputSchema || 'JSON object',
|
|
151
|
+
};
|
|
152
|
+
if (ctx.flags.json) {
|
|
153
|
+
return {
|
|
154
|
+
success: true,
|
|
155
|
+
data: skill,
|
|
156
|
+
messages: [],
|
|
157
|
+
recommendations: [`Save this skill definition to .nexagent/skills/${skillName}.json`],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
const messages = [];
|
|
161
|
+
messages.push(`🛠 Skill: ${skill.skillName}`);
|
|
162
|
+
messages.push(` Project: ${projectName}`);
|
|
163
|
+
messages.push('');
|
|
164
|
+
messages.push(`Purpose:`);
|
|
165
|
+
messages.push(` ${skill.purpose}`);
|
|
166
|
+
messages.push('');
|
|
167
|
+
messages.push('Inputs:');
|
|
168
|
+
skill.inputs.forEach(i => messages.push(` → ${i}`));
|
|
169
|
+
messages.push('');
|
|
170
|
+
messages.push('Tools needed:');
|
|
171
|
+
skill.tools.forEach(t => messages.push(` • ${t.name} — ${t.purpose}`));
|
|
172
|
+
messages.push('');
|
|
173
|
+
messages.push('Execution steps:');
|
|
174
|
+
skill.executionSteps.forEach((s, i) => messages.push(` ${i + 1}. ${s}`));
|
|
175
|
+
messages.push('');
|
|
176
|
+
messages.push('Safety limits:');
|
|
177
|
+
messages.push(` Max tokens: ${skill.safety.maxTokens}`);
|
|
178
|
+
messages.push(` Allowed paths: ${skill.safety.allowedPaths.join(', ')}`);
|
|
179
|
+
messages.push(` Forbidden commands: ${skill.safety.forbiddenCommands.join(', ')}`);
|
|
180
|
+
messages.push(` Require confirmation: ${skill.safety.requireConfirmation ? 'yes' : 'no'}`);
|
|
181
|
+
messages.push('');
|
|
182
|
+
messages.push(`Output schema: ${skill.outputSchema}`);
|
|
183
|
+
return {
|
|
184
|
+
success: true,
|
|
185
|
+
data: skill,
|
|
186
|
+
messages,
|
|
187
|
+
recommendations: [
|
|
188
|
+
`Save to .nexagent/skills/${skillName}.json`,
|
|
189
|
+
`Activate with: sophie skill ${skillName}`,
|
|
190
|
+
],
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/workflows/sophie/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;AAyB1C,MAAM,eAAe,GAAuC;IAC1D,eAAe,EAAE;QACf,OAAO,EAAE,gFAAgF;QACzF,MAAM,EAAE,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,yBAAyB,CAAC;QAC5E,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,8BAA8B,EAAE;YAC9D,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,iCAAiC,EAAE;SACpE;QACD,cAAc,EAAE;YACd,iCAAiC;YACjC,2DAA2D;YAC3D,kCAAkC;YAClC,oDAAoD;YACpD,uCAAuC;SACxC;QACD,MAAM,EAAE;YACN,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC;YAC3C,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;YACzC,mBAAmB,EAAE,KAAK;SAC3B;QACD,YAAY,EAAE,uDAAuD;KACtE;IACD,kBAAkB,EAAE;QAClB,OAAO,EAAE,sEAAsE;QAC/E,MAAM,EAAE,CAAC,mBAAmB,EAAE,YAAY,EAAE,wBAAwB,CAAC;QACrE,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,8BAA8B,EAAE;YAC9D,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,4CAA4C,EAAE;YAC9E,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,wCAAwC,EAAE;SAC1E;QACD,cAAc,EAAE;YACd,uDAAuD;YACvD,sCAAsC;YACtC,kDAAkD;YAClD,iDAAiD;YACjD,uCAAuC;SACxC;QACD,MAAM,EAAE;YACN,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,CAAC,IAAI,CAAC;YACpB,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC;YAC3D,mBAAmB,EAAE,IAAI;SAC1B;QACD,YAAY,EAAE,mEAAmE;KAClF;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,wEAAwE;QACjF,MAAM,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;QACjE,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,gCAAgC,EAAE;YAChE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,gCAAgC,EAAE;SACnE;QACD,cAAc,EAAE;YACd,4CAA4C;YAC5C,6CAA6C;YAC7C,oDAAoD;YACpD,oCAAoC;YACpC,8CAA8C;SAC/C;QACD,MAAM,EAAE;YACN,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;YAClC,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;YACzC,mBAAmB,EAAE,KAAK;SAC3B;QACD,YAAY,EAAE,qEAAqE;KACpF;IACD,YAAY,EAAE;QACZ,OAAO,EAAE,+DAA+D;QACxE,MAAM,EAAE,CAAC,kBAAkB,EAAE,gCAAgC,EAAE,gBAAgB,CAAC;QAChF,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,wBAAwB,EAAE;YACxD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE;SACxD;QACD,cAAc,EAAE;YACd,4CAA4C;YAC5C,kDAAkD;YAClD,4CAA4C;YAC5C,+CAA+C;YAC/C,sCAAsC;SACvC;QACD,MAAM,EAAE;YACN,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC;YAChD,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;YACzC,mBAAmB,EAAE,KAAK;SAC3B;QACD,YAAY,EAAE,gFAAgF;KAC/F;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAoB;IACtD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;YACvD,QAAQ,EAAE;gBACR,gCAAgC;gBAChC,EAAE;gBACF,qCAAqC;gBACrC,EAAE;gBACF,4BAA4B;gBAC5B,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;aACrD;YACD,eAAe,EAAE,CAAC,kDAAkD,CAAC;SACtE,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAEpF,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAE5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;YACvE,QAAQ,EAAE;gBACR,4BAA4B,SAAS,GAAG;gBACxC,EAAE;gBACF,sBAAsB;gBACtB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;aACrD;YACD,eAAe,EAAE,CAAC,8DAA8D,CAAC;SAClF,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,IAAI,WAAW,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA4B,CAAC;QAC1D,WAAW,GAAI,GAAG,CAAC,IAAe,IAAI,SAAS,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,MAAM,KAAK,GAAc;QACvB,SAAS;QACT,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,sCAAsC;QACnE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC;QACzC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QACvE,cAAc,EAAE,QAAQ,CAAC,cAAc,IAAI,CAAC,eAAe,EAAE,oBAAoB,EAAE,gBAAgB,CAAC;QACpG,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI;YACzB,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,CAAC,IAAI,CAAC;YACpB,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;YACzC,mBAAmB,EAAE,IAAI;SAC1B;QACD,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,aAAa;KACrD,CAAC;IAEF,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,KAA2C;YACjD,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,CAAC,kDAAkD,SAAS,OAAO,CAAC;SACtF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/B,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAClC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACzD,QAAQ,CAAC,IAAI,CAAC,oBAAoB,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,QAAQ,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpF,QAAQ,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5F,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAEtD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,KAA2C;QACjD,QAAQ;QACR,eAAe,EAAE;YACf,4BAA4B,SAAS,OAAO;YAC5C,+BAA+B,SAAS,EAAE;SAC3C;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/workflows/sophie/status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAyCjF,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAgIlF"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { NEXAGENT_VERSION } from '@nexagent-cli/shared';
|
|
4
|
+
const PHASES = [
|
|
5
|
+
'Foundation (v0.1–0.3)',
|
|
6
|
+
'Distribution (v0.4–0.5)',
|
|
7
|
+
'Hardening (v0.6)',
|
|
8
|
+
'Branded Profiles (v0.7)',
|
|
9
|
+
'Sophie-X Runtime (v0.8)',
|
|
10
|
+
'Workflow Persistence (v0.8.1)',
|
|
11
|
+
'Amarax Product Layer (v0.9)',
|
|
12
|
+
'Stable Release (v1.0)',
|
|
13
|
+
];
|
|
14
|
+
export async function statusWorkflow(ctx) {
|
|
15
|
+
const cwd = ctx.cwd;
|
|
16
|
+
// Read package.json
|
|
17
|
+
let pkg = null;
|
|
18
|
+
try {
|
|
19
|
+
const raw = await readFile(join(cwd, 'package.json'), 'utf-8');
|
|
20
|
+
pkg = JSON.parse(raw);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
pkg = null;
|
|
24
|
+
}
|
|
25
|
+
const version = pkg?.version || NEXAGENT_VERSION || 'unknown';
|
|
26
|
+
const scripts = pkg && typeof pkg.scripts === 'object' && pkg.scripts !== null
|
|
27
|
+
? pkg.scripts : {};
|
|
28
|
+
// Detect project health
|
|
29
|
+
const health = {
|
|
30
|
+
hasPackageJson: pkg !== null,
|
|
31
|
+
hasReadme: await fileExists(join(cwd, 'README.md')),
|
|
32
|
+
hasLicense: await fileExists(join(cwd, 'LICENSE')) || await fileExists(join(cwd, 'LICENSE.md')),
|
|
33
|
+
hasChangelog: await fileExists(join(cwd, 'CHANGELOG.md')),
|
|
34
|
+
hasCi: await dirExists(join(cwd, '.github', 'workflows')),
|
|
35
|
+
hasTests: 'test' in scripts,
|
|
36
|
+
hasBuildScript: 'build' in scripts,
|
|
37
|
+
};
|
|
38
|
+
// Determine current phase from version
|
|
39
|
+
const currentPhase = determinePhase(version);
|
|
40
|
+
const completedPhases = PHASES.slice(0, PHASES.indexOf(currentPhase) + 1);
|
|
41
|
+
// Pending gates
|
|
42
|
+
const pendingGates = [
|
|
43
|
+
{ name: 'Package.json valid', status: health.hasPackageJson ? 'passed' : 'blocked' },
|
|
44
|
+
{ name: 'README present', status: health.hasReadme ? 'passed' : 'pending' },
|
|
45
|
+
{ name: 'LICENSE present', status: health.hasLicense ? 'passed' : 'pending' },
|
|
46
|
+
{ name: 'CHANGELOG maintained', status: health.hasChangelog ? 'passed' : 'pending' },
|
|
47
|
+
{ name: 'CI configured', status: health.hasCi ? 'passed' : 'pending' },
|
|
48
|
+
{ name: 'Tests configured', status: health.hasTests ? 'passed' : 'pending' },
|
|
49
|
+
{ name: 'Build script defined', status: health.hasBuildScript ? 'passed' : 'pending' },
|
|
50
|
+
];
|
|
51
|
+
// Count test files
|
|
52
|
+
let testFileCount = 0;
|
|
53
|
+
let testFramework = null;
|
|
54
|
+
try {
|
|
55
|
+
const entries = await readdir(join(cwd, 'tests'), { withFileTypes: true }).catch(() => []);
|
|
56
|
+
testFileCount = entries.filter(e => e.isFile() && /\.(test|spec)\.(ts|js)$/.test(e.name)).length;
|
|
57
|
+
if (scripts.vitest || scripts['test:unit']?.includes('vitest'))
|
|
58
|
+
testFramework = 'vitest';
|
|
59
|
+
else if (scripts.jest || scripts['test:unit']?.includes('jest'))
|
|
60
|
+
testFramework = 'jest';
|
|
61
|
+
else if (scripts.test?.includes('vitest'))
|
|
62
|
+
testFramework = 'vitest';
|
|
63
|
+
else if (scripts.test?.includes('jest'))
|
|
64
|
+
testFramework = 'jest';
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// ignore
|
|
68
|
+
}
|
|
69
|
+
// Latest publish state
|
|
70
|
+
let latestPublishState = 'unknown';
|
|
71
|
+
if (/^0\.8\./.test(version))
|
|
72
|
+
latestPublishState = 'published (latest)';
|
|
73
|
+
else if (/^0\.7\./.test(version))
|
|
74
|
+
latestPublishState = 'published (stable)';
|
|
75
|
+
else if (/^0\./.test(version))
|
|
76
|
+
latestPublishState = 'published (pre-release)';
|
|
77
|
+
// Next recommended action
|
|
78
|
+
const blocked = pendingGates.filter(g => g.status === 'blocked');
|
|
79
|
+
const pending = pendingGates.filter(g => g.status === 'pending');
|
|
80
|
+
let nextRecommendedAction;
|
|
81
|
+
if (blocked.length > 0) {
|
|
82
|
+
nextRecommendedAction = `Fix blocker: ${blocked[0].name}`;
|
|
83
|
+
}
|
|
84
|
+
else if (pending.length > 0) {
|
|
85
|
+
nextRecommendedAction = `Address pending gate: ${pending[0].name}`;
|
|
86
|
+
}
|
|
87
|
+
else if (!health.hasTests) {
|
|
88
|
+
nextRecommendedAction = 'Add test infrastructure (vitest or jest).';
|
|
89
|
+
}
|
|
90
|
+
else if (testFileCount < 5) {
|
|
91
|
+
nextRecommendedAction = `Expand test coverage (currently ${testFileCount} test files).`;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
nextRecommendedAction = 'All gates green. Proceed to next phase feature work.';
|
|
95
|
+
}
|
|
96
|
+
const status = {
|
|
97
|
+
currentVersion: version,
|
|
98
|
+
currentPhase,
|
|
99
|
+
completedPhases,
|
|
100
|
+
pendingGates,
|
|
101
|
+
latestTests: {
|
|
102
|
+
total: testFileCount,
|
|
103
|
+
passed: null, // Would need to run tests to know
|
|
104
|
+
framework: testFramework,
|
|
105
|
+
},
|
|
106
|
+
latestPublishState,
|
|
107
|
+
nextRecommendedAction,
|
|
108
|
+
projectHealth: health,
|
|
109
|
+
};
|
|
110
|
+
if (ctx.flags.json) {
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
data: status,
|
|
114
|
+
messages: [],
|
|
115
|
+
recommendations: [nextRecommendedAction],
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const messages = [];
|
|
119
|
+
messages.push(`📊 Project Status`);
|
|
120
|
+
messages.push(` Version: ${version} | Phase: ${currentPhase}`);
|
|
121
|
+
messages.push(` Publish state: ${latestPublishState}`);
|
|
122
|
+
messages.push('');
|
|
123
|
+
messages.push('Completed phases:');
|
|
124
|
+
completedPhases.forEach(p => messages.push(` ✅ ${p}`));
|
|
125
|
+
messages.push('');
|
|
126
|
+
messages.push('Phase gates:');
|
|
127
|
+
pendingGates.forEach(g => {
|
|
128
|
+
const icon = g.status === 'passed' ? '✅' : g.status === 'pending' ? '⏳' : '❌';
|
|
129
|
+
messages.push(` ${icon} ${g.name}`);
|
|
130
|
+
});
|
|
131
|
+
messages.push('');
|
|
132
|
+
messages.push('Tests:');
|
|
133
|
+
messages.push(` Framework: ${testFramework || 'none detected'}`);
|
|
134
|
+
messages.push(` Test files: ${testFileCount}`);
|
|
135
|
+
messages.push('');
|
|
136
|
+
messages.push(`Next recommended action: ${nextRecommendedAction}`);
|
|
137
|
+
return {
|
|
138
|
+
success: true,
|
|
139
|
+
data: status,
|
|
140
|
+
messages,
|
|
141
|
+
recommendations: [nextRecommendedAction],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// ── Helpers ──────────────────────────────────────────────────
|
|
145
|
+
async function fileExists(path) {
|
|
146
|
+
try {
|
|
147
|
+
const { stat } = await import('node:fs/promises');
|
|
148
|
+
const s = await stat(path);
|
|
149
|
+
return s.isFile();
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async function dirExists(path) {
|
|
156
|
+
try {
|
|
157
|
+
const { stat } = await import('node:fs/promises');
|
|
158
|
+
const s = await stat(path);
|
|
159
|
+
return s.isDirectory();
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function determinePhase(version) {
|
|
166
|
+
if (/^0\.[0-3]\./.test(version))
|
|
167
|
+
return PHASES[0];
|
|
168
|
+
if (/^0\.[4-5]\./.test(version))
|
|
169
|
+
return PHASES[1];
|
|
170
|
+
if (/^0\.6\./.test(version))
|
|
171
|
+
return PHASES[2];
|
|
172
|
+
if (/^0\.7\./.test(version))
|
|
173
|
+
return PHASES[3];
|
|
174
|
+
if (/^0\.8\.0/.test(version))
|
|
175
|
+
return PHASES[4];
|
|
176
|
+
if (/^0\.8\./.test(version))
|
|
177
|
+
return PHASES[5];
|
|
178
|
+
if (/^0\.9\./.test(version))
|
|
179
|
+
return PHASES[6];
|
|
180
|
+
if (/^1\./.test(version))
|
|
181
|
+
return PHASES[7];
|
|
182
|
+
return PHASES[4]; // default to current dev phase
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/workflows/sophie/status.ts"],"names":[],"mappings":"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"}
|