@nexagent-cli/cli 0.7.2 → 0.8.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/dist/commands/sophie.d.ts +2 -0
- package/dist/commands/sophie.d.ts.map +1 -1
- package/dist/commands/sophie.js +3 -53
- package/dist/commands/sophie.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.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/runtime/workflow.d.ts +2 -0
- package/dist/runtime/workflow.d.ts.map +1 -1
- package/dist/runtime/workflow.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/persistence/index.d.ts +5 -0
- package/dist/workflows/persistence/index.d.ts.map +1 -0
- package/dist/workflows/persistence/index.js +8 -0
- package/dist/workflows/persistence/index.js.map +1 -0
- package/dist/workflows/persistence/phase-gates.d.ts +17 -0
- package/dist/workflows/persistence/phase-gates.d.ts.map +1 -0
- package/dist/workflows/persistence/phase-gates.js +55 -0
- package/dist/workflows/persistence/phase-gates.js.map +1 -0
- package/dist/workflows/persistence/status-memory.d.ts +15 -0
- package/dist/workflows/persistence/status-memory.d.ts.map +1 -0
- package/dist/workflows/persistence/status-memory.js +87 -0
- package/dist/workflows/persistence/status-memory.js.map +1 -0
- package/dist/workflows/persistence/workflow-snapshot.d.ts +20 -0
- package/dist/workflows/persistence/workflow-snapshot.d.ts.map +1 -0
- package/dist/workflows/persistence/workflow-snapshot.js +83 -0
- package/dist/workflows/persistence/workflow-snapshot.js.map +1 -0
- package/dist/workflows/persistence/workflow-store.d.ts +16 -0
- package/dist/workflows/persistence/workflow-store.d.ts.map +1 -0
- package/dist/workflows/persistence/workflow-store.js +108 -0
- package/dist/workflows/persistence/workflow-store.js.map +1 -0
- 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 +264 -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 +245 -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 +313 -0
- package/dist/workflows/sophie/status.js.map +1 -0
- package/package.json +1 -2
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Workflow Snapshot — create/load point-in-time snapshots
|
|
3
|
+
// ============================================================
|
|
4
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
const SNAPSHOT_VERSION = '1.0';
|
|
7
|
+
export function createSnapshot(run, projectPath, phaseGates = [], tags = []) {
|
|
8
|
+
const data = run.data;
|
|
9
|
+
const nextAction = run.recommendations[0] ?? 'No action recommended.';
|
|
10
|
+
return {
|
|
11
|
+
version: SNAPSHOT_VERSION,
|
|
12
|
+
timestamp: run.timestamp,
|
|
13
|
+
projectPath,
|
|
14
|
+
workflow: run.workflow,
|
|
15
|
+
profile: run.profile,
|
|
16
|
+
data,
|
|
17
|
+
phaseGates,
|
|
18
|
+
nextAction,
|
|
19
|
+
tags,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export async function saveSnapshot(snapshot, snapshotDir) {
|
|
23
|
+
await mkdir(snapshotDir, { recursive: true });
|
|
24
|
+
const filename = `snapshot_${snapshot.timestamp.slice(0, 19).replace(/[:T]/g, '-')}.json`;
|
|
25
|
+
const filepath = join(snapshotDir, filename);
|
|
26
|
+
await writeFile(filepath, JSON.stringify(snapshot, null, 2), 'utf-8');
|
|
27
|
+
return filepath;
|
|
28
|
+
}
|
|
29
|
+
export async function loadLatestSnapshot(snapshotDir) {
|
|
30
|
+
try {
|
|
31
|
+
const { readdir } = await import('node:fs/promises');
|
|
32
|
+
const files = await readdir(snapshotDir);
|
|
33
|
+
const snaps = files
|
|
34
|
+
.filter((f) => f.startsWith('snapshot_') && f.endsWith('.json'))
|
|
35
|
+
.sort()
|
|
36
|
+
.reverse();
|
|
37
|
+
if (snaps.length === 0)
|
|
38
|
+
return null;
|
|
39
|
+
const raw = await readFile(join(snapshotDir, snaps[0]), 'utf-8');
|
|
40
|
+
return JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function exportSnapshotToMarkdown(snapshot) {
|
|
47
|
+
const lines = [];
|
|
48
|
+
lines.push(`# Workflow Snapshot`);
|
|
49
|
+
lines.push('');
|
|
50
|
+
lines.push(`- **Workflow**: ${snapshot.workflow}`);
|
|
51
|
+
lines.push(`- **Profile**: ${snapshot.profile}`);
|
|
52
|
+
lines.push(`- **Project**: ${snapshot.projectPath}`);
|
|
53
|
+
lines.push(`- **Timestamp**: ${snapshot.timestamp}`);
|
|
54
|
+
lines.push(`- **Version**: ${snapshot.version}`);
|
|
55
|
+
lines.push('');
|
|
56
|
+
if (snapshot.phaseGates.length > 0) {
|
|
57
|
+
lines.push('## Phase Gates');
|
|
58
|
+
lines.push('');
|
|
59
|
+
snapshot.phaseGates.forEach((g) => {
|
|
60
|
+
const icon = g.status === 'passed' ? '✅' : g.status === 'pending' ? '⏳' : '❌';
|
|
61
|
+
lines.push(`- ${icon} ${g.name}`);
|
|
62
|
+
});
|
|
63
|
+
lines.push('');
|
|
64
|
+
}
|
|
65
|
+
lines.push('## Next Action');
|
|
66
|
+
lines.push('');
|
|
67
|
+
lines.push(snapshot.nextAction);
|
|
68
|
+
lines.push('');
|
|
69
|
+
if (snapshot.tags.length > 0) {
|
|
70
|
+
lines.push('## Tags');
|
|
71
|
+
lines.push('');
|
|
72
|
+
lines.push(snapshot.tags.map((t) => `\`${t}\``).join(', '));
|
|
73
|
+
lines.push('');
|
|
74
|
+
}
|
|
75
|
+
lines.push('## Data');
|
|
76
|
+
lines.push('');
|
|
77
|
+
lines.push('```json');
|
|
78
|
+
lines.push(JSON.stringify(snapshot.data, null, 2));
|
|
79
|
+
lines.push('```');
|
|
80
|
+
lines.push('');
|
|
81
|
+
return lines.join('\n');
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=workflow-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-snapshot.js","sourceRoot":"","sources":["../../../src/workflows/persistence/workflow-snapshot.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,0DAA0D;AAC1D,+DAA+D;AAE/D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAejC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,UAAU,cAAc,CAC5B,GAAsB,EACtB,WAAmB,EACnB,aAA6C,EAAE,EAC/C,OAAiB,EAAE;IAEnB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,wBAAwB,CAAC;IAEtE,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,WAAW;QACX,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI;QACJ,UAAU;QACV,UAAU;QACV,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA0B,EAC1B,WAAmB;IAEnB,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,YAAY,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IAC1F,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IAC1D,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,KAAK;aAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAC/D,IAAI,EAAE;aACN,OAAO,EAAE,CAAC;QACb,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAA0B;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9E,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface StoredWorkflowRun {
|
|
2
|
+
id: string;
|
|
3
|
+
workflow: string;
|
|
4
|
+
profile: string;
|
|
5
|
+
input: string;
|
|
6
|
+
timestamp: string;
|
|
7
|
+
success: boolean;
|
|
8
|
+
data: Record<string, unknown>;
|
|
9
|
+
recommendations: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function saveWorkflowRun(run: Omit<StoredWorkflowRun, 'id' | 'timestamp'>): Promise<StoredWorkflowRun>;
|
|
12
|
+
export declare function loadWorkflowRun(id: string): Promise<StoredWorkflowRun | null>;
|
|
13
|
+
export declare function listWorkflowRuns(workflow?: string, limit?: number): Promise<StoredWorkflowRun[]>;
|
|
14
|
+
export declare function deleteWorkflowRun(id: string): Promise<boolean>;
|
|
15
|
+
export declare function clearWorkflowRuns(workflow?: string): Promise<number>;
|
|
16
|
+
//# sourceMappingURL=workflow-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-store.d.ts","sourceRoot":"","sources":["../../../src/workflows/persistence/workflow-store.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAcD,wBAAsB,eAAe,CACnC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,WAAW,CAAC,GAC/C,OAAO,CAAC,iBAAiB,CAAC,CAe5B;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAWnF;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAqBlG;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWpE;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB1E"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Workflow Store — read/write workflow results to disk
|
|
3
|
+
// ============================================================
|
|
4
|
+
import { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { resolveDataDir } from '../../utils/env.js';
|
|
7
|
+
function getStoreDir() {
|
|
8
|
+
return join(resolveDataDir(), 'workflows');
|
|
9
|
+
}
|
|
10
|
+
function generateId() {
|
|
11
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
12
|
+
}
|
|
13
|
+
function sanitizeFilename(name) {
|
|
14
|
+
return name.replace(/[^a-z0-9_-]/gi, '_').slice(0, 64);
|
|
15
|
+
}
|
|
16
|
+
export async function saveWorkflowRun(run) {
|
|
17
|
+
const storeDir = getStoreDir();
|
|
18
|
+
await mkdir(storeDir, { recursive: true });
|
|
19
|
+
const stored = {
|
|
20
|
+
...run,
|
|
21
|
+
id: generateId(),
|
|
22
|
+
timestamp: new Date().toISOString(),
|
|
23
|
+
};
|
|
24
|
+
const filename = `${stored.timestamp.slice(0, 10)}_${sanitizeFilename(stored.workflow)}_${stored.id}.json`;
|
|
25
|
+
const filepath = join(storeDir, filename);
|
|
26
|
+
await writeFile(filepath, JSON.stringify(stored, null, 2), 'utf-8');
|
|
27
|
+
return stored;
|
|
28
|
+
}
|
|
29
|
+
export async function loadWorkflowRun(id) {
|
|
30
|
+
const storeDir = getStoreDir();
|
|
31
|
+
try {
|
|
32
|
+
const files = await readdir(storeDir);
|
|
33
|
+
const match = files.find((f) => f.includes(id));
|
|
34
|
+
if (!match)
|
|
35
|
+
return null;
|
|
36
|
+
const raw = await readFile(join(storeDir, match), 'utf-8');
|
|
37
|
+
return JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export async function listWorkflowRuns(workflow, limit = 20) {
|
|
44
|
+
const storeDir = getStoreDir();
|
|
45
|
+
try {
|
|
46
|
+
const files = await readdir(storeDir);
|
|
47
|
+
const runs = [];
|
|
48
|
+
for (const file of files.slice().reverse()) {
|
|
49
|
+
if (!file.endsWith('.json'))
|
|
50
|
+
continue;
|
|
51
|
+
if (workflow && !file.includes(sanitizeFilename(workflow)))
|
|
52
|
+
continue;
|
|
53
|
+
try {
|
|
54
|
+
const raw = await readFile(join(storeDir, file), 'utf-8');
|
|
55
|
+
const run = JSON.parse(raw);
|
|
56
|
+
runs.push(run);
|
|
57
|
+
if (runs.length >= limit)
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// skip corrupt files
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return runs;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export async function deleteWorkflowRun(id) {
|
|
71
|
+
const storeDir = getStoreDir();
|
|
72
|
+
try {
|
|
73
|
+
const files = await readdir(storeDir);
|
|
74
|
+
const match = files.find((f) => f.includes(id));
|
|
75
|
+
if (!match)
|
|
76
|
+
return false;
|
|
77
|
+
await unlink(join(storeDir, match));
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function clearWorkflowRuns(workflow) {
|
|
85
|
+
const storeDir = getStoreDir();
|
|
86
|
+
let count = 0;
|
|
87
|
+
try {
|
|
88
|
+
const files = await readdir(storeDir);
|
|
89
|
+
for (const file of files) {
|
|
90
|
+
if (!file.endsWith('.json'))
|
|
91
|
+
continue;
|
|
92
|
+
if (workflow && !file.includes(sanitizeFilename(workflow)))
|
|
93
|
+
continue;
|
|
94
|
+
try {
|
|
95
|
+
await unlink(join(storeDir, file));
|
|
96
|
+
count++;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// ignore
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return count;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return count;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=workflow-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-store.js","sourceRoot":"","sources":["../../../src/workflows/persistence/workflow-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAmBjF,wBAAsB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAwMnF"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { saveWorkflowRun, createSnapshot, saveMarkdownReport } from '../persistence/index.js';
|
|
4
|
+
export async function councilWorkflow(ctx) {
|
|
5
|
+
const topic = ctx.input.trim();
|
|
6
|
+
if (!topic) {
|
|
7
|
+
return {
|
|
8
|
+
success: false,
|
|
9
|
+
data: {},
|
|
10
|
+
messages: [
|
|
11
|
+
'Error: No topic provided.',
|
|
12
|
+
'',
|
|
13
|
+
'Usage: sophie council "<topic or question>"',
|
|
14
|
+
'',
|
|
15
|
+
'Example: sophie council "Should we migrate to pnpm?"',
|
|
16
|
+
],
|
|
17
|
+
recommendations: ['Provide a clear, decision-oriented question for the council.'],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
// Detect project context for richer recommendations
|
|
21
|
+
let pkg = null;
|
|
22
|
+
try {
|
|
23
|
+
const raw = await readFile(join(ctx.cwd, 'package.json'), 'utf-8');
|
|
24
|
+
pkg = JSON.parse(raw);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
pkg = null;
|
|
28
|
+
}
|
|
29
|
+
const version = pkg?.version || 'unknown';
|
|
30
|
+
const scripts = pkg && typeof pkg.scripts === 'object' && pkg.scripts !== null
|
|
31
|
+
? pkg.scripts : {};
|
|
32
|
+
const hasTests = 'test' in scripts;
|
|
33
|
+
const hasCi = 'ci' in scripts;
|
|
34
|
+
// Generate council perspectives based on topic keywords
|
|
35
|
+
const lowerTopic = topic.toLowerCase();
|
|
36
|
+
const isRelease = /release|version|publish|deploy|ship/.test(lowerTopic);
|
|
37
|
+
const isMigration = /migrat|switch|move|upgrade|update/.test(lowerTopic);
|
|
38
|
+
const isArchitecture = /architect|refactor|restruct|redesign/.test(lowerTopic);
|
|
39
|
+
const isSecurity = /security|vulnerability|auth|encrypt/.test(lowerTopic);
|
|
40
|
+
const members = [
|
|
41
|
+
{
|
|
42
|
+
role: 'Architect',
|
|
43
|
+
icon: '🏗',
|
|
44
|
+
perspective: generateArchitectView(topic, isArchitecture, isMigration),
|
|
45
|
+
recommendation: generateArchitectRec(topic, isArchitecture, isMigration),
|
|
46
|
+
confidence: isArchitecture ? 0.92 : 0.75,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
role: 'Security',
|
|
50
|
+
icon: '🔒',
|
|
51
|
+
perspective: generateSecurityView(topic, isSecurity, isRelease),
|
|
52
|
+
recommendation: generateSecurityRec(topic, isSecurity, isRelease),
|
|
53
|
+
confidence: isSecurity ? 0.95 : 0.70,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
role: 'Release',
|
|
57
|
+
icon: '🚀',
|
|
58
|
+
perspective: generateReleaseView(topic, isRelease, hasTests, hasCi),
|
|
59
|
+
recommendation: generateReleaseRec(topic, isRelease, hasTests, hasCi),
|
|
60
|
+
confidence: isRelease ? 0.90 : 0.72,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
role: 'Product',
|
|
64
|
+
icon: '📐',
|
|
65
|
+
perspective: generateProductView(topic, isRelease, version),
|
|
66
|
+
recommendation: generateProductRec(topic, isRelease, version),
|
|
67
|
+
confidence: 0.78,
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
// Compute consensus
|
|
71
|
+
const avgConfidence = members.reduce((s, m) => s + m.confidence, 0) / members.length;
|
|
72
|
+
const recs = members.map(m => m.recommendation.toLowerCase());
|
|
73
|
+
const goCount = recs.filter(r => r.includes('proceed') || r.includes('go') || r.includes('yes') || r.includes('ship')).length;
|
|
74
|
+
const cautionCount = recs.filter(r => r.includes('caution') || r.includes('wait') || r.includes('defer') || r.includes('hold')).length;
|
|
75
|
+
const noCount = recs.filter(r => r.includes('no') || r.includes('block') || r.includes('stop') || r.includes('wait')).length;
|
|
76
|
+
let consensusLevel;
|
|
77
|
+
if (goCount >= 3)
|
|
78
|
+
consensusLevel = 'strong';
|
|
79
|
+
else if (goCount >= 2 && cautionCount <= 1)
|
|
80
|
+
consensusLevel = 'moderate';
|
|
81
|
+
else if (goCount >= 2 || cautionCount >= 2)
|
|
82
|
+
consensusLevel = 'weak';
|
|
83
|
+
else
|
|
84
|
+
consensusLevel = 'split';
|
|
85
|
+
// Final recommendation
|
|
86
|
+
let finalRecommendation;
|
|
87
|
+
if (consensusLevel === 'strong') {
|
|
88
|
+
finalRecommendation = 'Proceed with confidence. The council is aligned. Document the decision and execute.';
|
|
89
|
+
}
|
|
90
|
+
else if (consensusLevel === 'moderate') {
|
|
91
|
+
finalRecommendation = 'Proceed with a phased approach. Address the caution flags before full commitment.';
|
|
92
|
+
}
|
|
93
|
+
else if (consensusLevel === 'weak') {
|
|
94
|
+
finalRecommendation = 'Defer or run a time-boxed spike. The council sees significant uncertainty.';
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
finalRecommendation = 'Do not proceed without further analysis. The council is split. Gather more data and reconvene.';
|
|
98
|
+
}
|
|
99
|
+
const actionItems = [];
|
|
100
|
+
if (!hasTests)
|
|
101
|
+
actionItems.push('Add test coverage before any release decision.');
|
|
102
|
+
if (!hasCi)
|
|
103
|
+
actionItems.push('Set up CI pipeline to validate changes automatically.');
|
|
104
|
+
if (isRelease)
|
|
105
|
+
actionItems.push('Run full regression test suite before shipping.');
|
|
106
|
+
if (isMigration)
|
|
107
|
+
actionItems.push('Create rollback plan and validate data compatibility.');
|
|
108
|
+
if (isSecurity)
|
|
109
|
+
actionItems.push('Schedule security audit and review threat model.');
|
|
110
|
+
if (actionItems.length === 0)
|
|
111
|
+
actionItems.push('Document the decision in ADR or team wiki.');
|
|
112
|
+
const council = {
|
|
113
|
+
topic,
|
|
114
|
+
members,
|
|
115
|
+
finalRecommendation,
|
|
116
|
+
consensusLevel,
|
|
117
|
+
actionItems,
|
|
118
|
+
};
|
|
119
|
+
// Handle save mode
|
|
120
|
+
if (ctx.flags.save) {
|
|
121
|
+
if (ctx.flags.dryRun) {
|
|
122
|
+
return {
|
|
123
|
+
success: true,
|
|
124
|
+
data: { ...council, wouldSave: true },
|
|
125
|
+
messages: ['(dry-run) Would save council decision to workflow store and generate report.'],
|
|
126
|
+
recommendations: actionItems,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const run = await saveWorkflowRun({
|
|
130
|
+
workflow: 'council',
|
|
131
|
+
profile: 'sophie',
|
|
132
|
+
input: topic,
|
|
133
|
+
success: true,
|
|
134
|
+
data: council,
|
|
135
|
+
recommendations: actionItems,
|
|
136
|
+
});
|
|
137
|
+
const snapshot = createSnapshot(run, ctx.cwd, [], ['council', 'decision']);
|
|
138
|
+
const reportPath = await saveMarkdownReport(ctx.cwd, snapshot);
|
|
139
|
+
if (ctx.flags.json) {
|
|
140
|
+
return {
|
|
141
|
+
success: true,
|
|
142
|
+
data: { ...council, saved: true, runId: run.id, reportPath },
|
|
143
|
+
messages: [],
|
|
144
|
+
recommendations: actionItems,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const messages = [];
|
|
148
|
+
messages.push(`🧠 Sophie Council — "${topic}"`);
|
|
149
|
+
messages.push(` Current version: ${version}`);
|
|
150
|
+
messages.push('');
|
|
151
|
+
messages.push(`💾 Saved council (run: ${run.id})`);
|
|
152
|
+
messages.push(`📝 Report: ${reportPath}`);
|
|
153
|
+
messages.push('');
|
|
154
|
+
messages.push(`Consensus: ${consensusLevel.toUpperCase()}`);
|
|
155
|
+
messages.push(`Final recommendation: ${finalRecommendation}`);
|
|
156
|
+
messages.push('');
|
|
157
|
+
messages.push('Action items:');
|
|
158
|
+
actionItems.forEach(a => messages.push(` → ${a}`));
|
|
159
|
+
return {
|
|
160
|
+
success: true,
|
|
161
|
+
data: council,
|
|
162
|
+
messages,
|
|
163
|
+
recommendations: actionItems,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (ctx.flags.json) {
|
|
167
|
+
return {
|
|
168
|
+
success: true,
|
|
169
|
+
data: council,
|
|
170
|
+
messages: [],
|
|
171
|
+
recommendations: actionItems,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const messages = [];
|
|
175
|
+
messages.push(`🧠 Sophie Council — "${topic}"`);
|
|
176
|
+
messages.push(` Current version: ${version}`);
|
|
177
|
+
messages.push('');
|
|
178
|
+
members.forEach(m => {
|
|
179
|
+
messages.push(`${m.icon} ${m.role} (confidence: ${Math.round(m.confidence * 100)}%)`);
|
|
180
|
+
messages.push(` Perspective: ${m.perspective}`);
|
|
181
|
+
messages.push(` Recommendation: ${m.recommendation}`);
|
|
182
|
+
messages.push('');
|
|
183
|
+
});
|
|
184
|
+
messages.push(`Consensus: ${consensusLevel.toUpperCase()}`);
|
|
185
|
+
messages.push(`Final recommendation: ${finalRecommendation}`);
|
|
186
|
+
messages.push('');
|
|
187
|
+
messages.push('Action items:');
|
|
188
|
+
actionItems.forEach(a => messages.push(` → ${a}`));
|
|
189
|
+
messages.push('');
|
|
190
|
+
messages.push('Tip: Run `sophie council "<topic>" --save` to persist this decision.');
|
|
191
|
+
return {
|
|
192
|
+
success: true,
|
|
193
|
+
data: council,
|
|
194
|
+
messages,
|
|
195
|
+
recommendations: actionItems,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// ── Perspective generators ───────────────────────────────────
|
|
199
|
+
function generateArchitectView(topic, isArch, isMigrate) {
|
|
200
|
+
if (isArch)
|
|
201
|
+
return `The structural change in "${topic}" affects core abstractions. Review coupling and cohesion before proceeding.`;
|
|
202
|
+
if (isMigrate)
|
|
203
|
+
return `Migration changes the foundation. Evaluate blast radius, deprecation path, and backward compatibility.`;
|
|
204
|
+
return `From an architecture standpoint, "${topic}" should be evaluated for side effects on existing modules and interfaces.`;
|
|
205
|
+
}
|
|
206
|
+
function generateArchitectRec(_topic, isArch, isMigrate) {
|
|
207
|
+
if (isArch)
|
|
208
|
+
return 'Proceed with a design doc and incremental refactoring plan.';
|
|
209
|
+
if (isMigrate)
|
|
210
|
+
return 'Run a proof-of-concept on a non-critical module first.';
|
|
211
|
+
return 'No structural blockers. Proceed with standard review.';
|
|
212
|
+
}
|
|
213
|
+
function generateSecurityView(topic, isSec, isRelease) {
|
|
214
|
+
if (isSec)
|
|
215
|
+
return `Security-sensitive topic "${topic}" requires threat modeling and dependency scanning.`;
|
|
216
|
+
if (isRelease)
|
|
217
|
+
return 'Release expands the attack surface. Verify secrets management and supply-chain integrity.';
|
|
218
|
+
return `Standard security posture applies to "${topic}". No immediate red flags.`;
|
|
219
|
+
}
|
|
220
|
+
function generateSecurityRec(_topic, isSec, isRelease) {
|
|
221
|
+
if (isSec)
|
|
222
|
+
return 'Hold until security audit is complete and findings are resolved.';
|
|
223
|
+
if (isRelease)
|
|
224
|
+
return 'Proceed only after automated security checks pass in CI.';
|
|
225
|
+
return 'Proceed with caution. Monitor for new CVEs post-deployment.';
|
|
226
|
+
}
|
|
227
|
+
function generateReleaseView(topic, isRelease, hasTests, hasCi) {
|
|
228
|
+
if (isRelease)
|
|
229
|
+
return `Release "${topic}" needs green CI, version bump, changelog, and rollback plan.`;
|
|
230
|
+
const readiness = [hasTests ? 'tests' : null, hasCi ? 'CI' : null].filter(Boolean);
|
|
231
|
+
if (readiness.length === 0)
|
|
232
|
+
return 'Project lacks automated validation. Any change is high-risk.';
|
|
233
|
+
if (readiness.length === 1)
|
|
234
|
+
return `Only ${readiness[0]} is in place. Build out the other gate before shipping.`;
|
|
235
|
+
return `Project has ${readiness.join(' and ')}. Release pipeline is moderately mature.`;
|
|
236
|
+
}
|
|
237
|
+
function generateReleaseRec(_topic, isRelease, hasTests, hasCi) {
|
|
238
|
+
if (isRelease) {
|
|
239
|
+
if (hasTests && hasCi)
|
|
240
|
+
return 'Ship it. All gates are green.';
|
|
241
|
+
if (hasTests)
|
|
242
|
+
return 'Proceed with manual CI verification before release.';
|
|
243
|
+
if (hasCi)
|
|
244
|
+
return 'Add tests before release; CI alone is insufficient.';
|
|
245
|
+
return 'Block release. No automated validation in place.';
|
|
246
|
+
}
|
|
247
|
+
return 'Proceed. Change is not release-critical.';
|
|
248
|
+
}
|
|
249
|
+
function generateProductView(topic, isRelease, version) {
|
|
250
|
+
if (isRelease)
|
|
251
|
+
return `Version ${version} release for "${topic}" must align with user communication and support readiness.`;
|
|
252
|
+
return `Product impact of "${topic}" depends on user-facing changes. Verify no breaking changes without deprecation.`;
|
|
253
|
+
}
|
|
254
|
+
function generateProductRec(_topic, isRelease, version) {
|
|
255
|
+
if (isRelease) {
|
|
256
|
+
if (version === 'unknown')
|
|
257
|
+
return 'Caution: unknown version. Define versioning strategy first.';
|
|
258
|
+
if (/^0\./.test(version))
|
|
259
|
+
return 'Proceed with pre-release label. v0.x implies instability is acceptable.';
|
|
260
|
+
return 'Proceed with full release checklist for stable version.';
|
|
261
|
+
}
|
|
262
|
+
return 'Proceed. Monitor user feedback after deployment.';
|
|
263
|
+
}
|
|
264
|
+
//# 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;AAEjC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAkB9F,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,mBAAmB;IACnB,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrC,QAAQ,EAAE,CAAC,8EAA8E,CAAC;gBAC1F,eAAe,EAAE,WAAW;aAC7B,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC;YAChC,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,OAA6C;YACnD,eAAe,EAAE,WAAW;SAC7B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAE/D,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE;gBAC5D,QAAQ,EAAE,EAAE;gBACZ,eAAe,EAAE,WAAW;aAC7B,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,wBAAwB,KAAK,GAAG,CAAC,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,cAAc,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC5D,QAAQ,CAAC,IAAI,CAAC,yBAAyB,mBAAmB,EAAE,CAAC,CAAC;QAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAEpD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,OAA6C;YACnD,QAAQ;YACR,eAAe,EAAE,WAAW;SAC7B,CAAC;IACJ,CAAC;IAED,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;IACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IAEtF,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;AAqBjF,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAgPlF"}
|