@nova286/nova-workflow 0.2.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.
Files changed (79) hide show
  1. package/README.md +246 -0
  2. package/dist/cli/commands/archive.d.ts +1 -0
  3. package/dist/cli/commands/archive.js +120 -0
  4. package/dist/cli/commands/archive.js.map +1 -0
  5. package/dist/cli/commands/context.d.ts +1 -0
  6. package/dist/cli/commands/context.js +23 -0
  7. package/dist/cli/commands/context.js.map +1 -0
  8. package/dist/cli/commands/guard.d.ts +1 -0
  9. package/dist/cli/commands/guard.js +21 -0
  10. package/dist/cli/commands/guard.js.map +1 -0
  11. package/dist/cli/commands/init.d.ts +1 -0
  12. package/dist/cli/commands/init.js +22 -0
  13. package/dist/cli/commands/init.js.map +1 -0
  14. package/dist/cli/commands/status.d.ts +1 -0
  15. package/dist/cli/commands/status.js +72 -0
  16. package/dist/cli/commands/status.js.map +1 -0
  17. package/dist/cli/error-handler.d.ts +1 -0
  18. package/dist/cli/error-handler.js +18 -0
  19. package/dist/cli/error-handler.js.map +1 -0
  20. package/dist/cli/index.d.ts +2 -0
  21. package/dist/cli/index.js +35 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/cli/ui.d.ts +10 -0
  24. package/dist/cli/ui.js +21 -0
  25. package/dist/cli/ui.js.map +1 -0
  26. package/dist/cli-core/__tests__/context-generator.test.d.ts +1 -0
  27. package/dist/cli-core/__tests__/context-generator.test.js +97 -0
  28. package/dist/cli-core/__tests__/context-generator.test.js.map +1 -0
  29. package/dist/cli-core/__tests__/dispatcher.test.d.ts +1 -0
  30. package/dist/cli-core/__tests__/dispatcher.test.js +99 -0
  31. package/dist/cli-core/__tests__/dispatcher.test.js.map +1 -0
  32. package/dist/cli-core/__tests__/guard.test.d.ts +1 -0
  33. package/dist/cli-core/__tests__/guard.test.js +136 -0
  34. package/dist/cli-core/__tests__/guard.test.js.map +1 -0
  35. package/dist/cli-core/__tests__/init-manager.test.d.ts +1 -0
  36. package/dist/cli-core/__tests__/init-manager.test.js +150 -0
  37. package/dist/cli-core/__tests__/init-manager.test.js.map +1 -0
  38. package/dist/cli-core/__tests__/pipeline.test.d.ts +1 -0
  39. package/dist/cli-core/__tests__/pipeline.test.js +119 -0
  40. package/dist/cli-core/__tests__/pipeline.test.js.map +1 -0
  41. package/dist/cli-core/__tests__/project-detect.test.d.ts +1 -0
  42. package/dist/cli-core/__tests__/project-detect.test.js +92 -0
  43. package/dist/cli-core/__tests__/project-detect.test.js.map +1 -0
  44. package/dist/cli-core/__tests__/state-manager.test.d.ts +1 -0
  45. package/dist/cli-core/__tests__/state-manager.test.js +120 -0
  46. package/dist/cli-core/__tests__/state-manager.test.js.map +1 -0
  47. package/dist/cli-core/adapters/claude-code.d.ts +6 -0
  48. package/dist/cli-core/adapters/claude-code.js +311 -0
  49. package/dist/cli-core/adapters/claude-code.js.map +1 -0
  50. package/dist/cli-core/context-generator.d.ts +4 -0
  51. package/dist/cli-core/context-generator.js +81 -0
  52. package/dist/cli-core/context-generator.js.map +1 -0
  53. package/dist/cli-core/dispatcher.d.ts +11 -0
  54. package/dist/cli-core/dispatcher.js +169 -0
  55. package/dist/cli-core/dispatcher.js.map +1 -0
  56. package/dist/cli-core/guard.d.ts +1 -0
  57. package/dist/cli-core/guard.js +57 -0
  58. package/dist/cli-core/guard.js.map +1 -0
  59. package/dist/cli-core/init-manager.d.ts +25 -0
  60. package/dist/cli-core/init-manager.js +182 -0
  61. package/dist/cli-core/init-manager.js.map +1 -0
  62. package/dist/cli-core/pipeline.d.ts +7 -0
  63. package/dist/cli-core/pipeline.js +79 -0
  64. package/dist/cli-core/pipeline.js.map +1 -0
  65. package/dist/cli-core/platform-client.d.ts +19 -0
  66. package/dist/cli-core/platform-client.js +119 -0
  67. package/dist/cli-core/platform-client.js.map +1 -0
  68. package/dist/cli-core/project-detect.d.ts +1 -0
  69. package/dist/cli-core/project-detect.js +64 -0
  70. package/dist/cli-core/project-detect.js.map +1 -0
  71. package/dist/cli-core/state.d.ts +11 -0
  72. package/dist/cli-core/state.js +106 -0
  73. package/dist/cli-core/state.js.map +1 -0
  74. package/dist/cli-core/types.d.ts +141 -0
  75. package/dist/cli-core/types.js +13 -0
  76. package/dist/cli-core/types.js.map +1 -0
  77. package/package.json +33 -0
  78. package/templates/docs/design.md +41 -0
  79. package/templates/docs/proposal.md +25 -0
@@ -0,0 +1,25 @@
1
+ export declare class InitManager {
2
+ private cwd;
3
+ private options;
4
+ private backupDir?;
5
+ private steps;
6
+ constructor(cwd: string, opts: {
7
+ eccPath?: string;
8
+ force?: boolean;
9
+ });
10
+ run(): Promise<void>;
11
+ private isInitialized;
12
+ private backup;
13
+ private rollback;
14
+ private detectAIEnvironment;
15
+ private getAdapter;
16
+ private createDirs;
17
+ private removeDirs;
18
+ private generateConfig;
19
+ private detectProjectType;
20
+ private installEcc;
21
+ private generateTemplates;
22
+ private cleanEnvCommands;
23
+ private removeFile;
24
+ private removeDir;
25
+ }
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.InitManager = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const yaml = __importStar(require("yaml"));
40
+ const ui_1 = require("../cli/ui");
41
+ const project_detect_1 = require("./project-detect");
42
+ const claude_code_1 = require("./adapters/claude-code");
43
+ class InitManager {
44
+ constructor(cwd, opts) {
45
+ this.steps = [];
46
+ this.cwd = cwd;
47
+ this.options = opts;
48
+ }
49
+ async run() {
50
+ if (await this.isInitialized() && !this.options.force) {
51
+ throw new Error('Nova already initialized. Use --force to reinitialize.');
52
+ }
53
+ if (await this.isInitialized())
54
+ await this.backup();
55
+ const envs = await this.detectAIEnvironment();
56
+ const envAdapters = envs.map(e => this.getAdapter(e));
57
+ this.steps = [
58
+ { name: 'Create directory structure', run: () => this.createDirs(), rollback: () => this.removeDirs() },
59
+ { name: 'Generate .nova.yaml', run: () => this.generateConfig(envs), rollback: () => this.removeFile('.nova.yaml') },
60
+ { name: 'Install ECC skills', run: () => this.installEcc(), rollback: () => this.removeDir('.nova/ecc') },
61
+ { name: 'Generate environment commands', run: async () => {
62
+ for (const adapter of envAdapters)
63
+ await adapter.setup(this.cwd);
64
+ }, rollback: () => this.cleanEnvCommands(envs) },
65
+ { name: 'Generate templates', run: () => this.generateTemplates(), rollback: () => this.removeDir('docs') }
66
+ ];
67
+ for (const step of this.steps) {
68
+ const spinner = ui_1.ui.spinner(step.name);
69
+ try {
70
+ await step.run();
71
+ spinner.succeed(step.name);
72
+ }
73
+ catch (err) {
74
+ spinner.fail(step.name);
75
+ await this.rollback();
76
+ throw err;
77
+ }
78
+ }
79
+ if (this.backupDir)
80
+ await fs.rm(this.backupDir, { recursive: true, force: true });
81
+ }
82
+ async isInitialized() {
83
+ try {
84
+ await fs.access(path.join(this.cwd, '.nova.yaml'));
85
+ return true;
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ async backup() {
92
+ this.backupDir = path.join(this.cwd, '.nova-backup-' + Date.now());
93
+ await fs.mkdir(this.backupDir, { recursive: true });
94
+ const files = await fs.readdir(this.cwd);
95
+ for (const f of files) {
96
+ if (f.startsWith('.nova') || f === 'docs' || f === '.nova.yaml') {
97
+ try {
98
+ await fs.cp(path.join(this.cwd, f), path.join(this.backupDir, f), { recursive: true });
99
+ }
100
+ catch { }
101
+ }
102
+ }
103
+ }
104
+ async rollback() {
105
+ for (let i = this.steps.length - 1; i >= 0; i--) {
106
+ try {
107
+ await this.steps[i].rollback();
108
+ }
109
+ catch { }
110
+ }
111
+ if (this.backupDir) {
112
+ const files = await fs.readdir(this.backupDir);
113
+ for (const f of files)
114
+ await fs.cp(path.join(this.backupDir, f), path.join(this.cwd, f), { recursive: true, force: true });
115
+ await fs.rm(this.backupDir, { recursive: true, force: true });
116
+ }
117
+ }
118
+ async detectAIEnvironment() {
119
+ return ['claude-code'];
120
+ }
121
+ getAdapter(env) {
122
+ return new claude_code_1.ClaudeCodeAdapter();
123
+ }
124
+ async createDirs() {
125
+ const dirs = ['docs/designs', 'docs/proposals', 'docs/reports', '.nova/contexts'];
126
+ for (const d of dirs)
127
+ await fs.mkdir(path.join(this.cwd, d), { recursive: true });
128
+ }
129
+ async removeDirs() { }
130
+ async generateConfig(envs) {
131
+ const projectType = await this.detectProjectType();
132
+ const config = {
133
+ version: 1,
134
+ project: path.basename(this.cwd),
135
+ projectType,
136
+ environment: envs,
137
+ phases: {
138
+ open: { status: 'pending', proposal: '' },
139
+ design: { status: 'pending', designDoc: '', tasks: '' },
140
+ build: { status: 'pending', tasks: {} },
141
+ verify: { status: 'pending', pipelineResult: null },
142
+ archive: { status: 'pending' }
143
+ },
144
+ metadata: { stateVersion: 0, lastModified: new Date().toISOString(), history: [] }
145
+ };
146
+ await fs.writeFile(path.join(this.cwd, '.nova.yaml'), yaml.stringify(config), 'utf-8');
147
+ }
148
+ async detectProjectType() {
149
+ return (0, project_detect_1.detectProjectType)(this.cwd);
150
+ }
151
+ async installEcc() {
152
+ const dest = path.join(this.cwd, '.nova/ecc');
153
+ await fs.mkdir(dest, { recursive: true });
154
+ if (this.options.eccPath) {
155
+ await fs.cp(this.options.eccPath, dest, { recursive: true });
156
+ }
157
+ else {
158
+ ui_1.ui.info('No --with-ecc path provided. Skipping ECC skill installation.');
159
+ ui_1.ui.info('ECC skills are expected to be available in your AI environment.');
160
+ }
161
+ }
162
+ async generateTemplates() {
163
+ await fs.cp(path.join(__dirname, '../../templates/docs'), path.join(this.cwd, 'docs'), { recursive: true });
164
+ }
165
+ async cleanEnvCommands(envs) {
166
+ for (const env of envs) {
167
+ if (env === 'claude-code')
168
+ await fs.rm(path.join(this.cwd, '.claude'), { recursive: true, force: true });
169
+ // 其他环境类似
170
+ }
171
+ }
172
+ async removeFile(file) { try {
173
+ await fs.unlink(path.join(this.cwd, file));
174
+ }
175
+ catch { } }
176
+ async removeDir(dir) { try {
177
+ await fs.rm(path.join(this.cwd, dir), { recursive: true, force: true });
178
+ }
179
+ catch { } }
180
+ }
181
+ exports.InitManager = InitManager;
182
+ //# sourceMappingURL=init-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-manager.js","sourceRoot":"","sources":["../../src/cli-core/init-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Dispatcher } from './dispatcher';
2
+ import { Pipeline, PipelineResult } from './types';
3
+ export declare class PipelineOrchestrator {
4
+ private dispatcher;
5
+ constructor(dispatcher: Dispatcher);
6
+ execute(pipeline: Pipeline): Promise<PipelineResult>;
7
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PipelineOrchestrator = void 0;
4
+ class PipelineOrchestrator {
5
+ constructor(dispatcher) {
6
+ this.dispatcher = dispatcher;
7
+ }
8
+ async execute(pipeline) {
9
+ const stageResults = [];
10
+ let aborted = false;
11
+ for (const stage of pipeline.stages) {
12
+ if (aborted) {
13
+ stageResults.push({ stageId: stage.id, status: 'failed', taskResults: [] });
14
+ continue;
15
+ }
16
+ if (stage.dependsOn) {
17
+ const depsFailed = stage.dependsOn.some((depId) => {
18
+ const depResult = stageResults.find((r) => r.stageId === depId);
19
+ return !depResult || depResult.status === 'failed';
20
+ });
21
+ if (depsFailed) {
22
+ stageResults.push({
23
+ stageId: stage.id,
24
+ status: 'failed',
25
+ taskResults: [],
26
+ });
27
+ if (stage.onStageFailure !== 'continue') {
28
+ aborted = true;
29
+ }
30
+ continue;
31
+ }
32
+ }
33
+ const settled = await Promise.allSettled(stage.tasks.map((task) => this.dispatcher.execute({
34
+ agent: task.agent,
35
+ context: task.context,
36
+ timeout: task.timeout,
37
+ retry: task.retry,
38
+ })));
39
+ const taskResults = settled.map((r, i) => {
40
+ if (r.status === 'fulfilled')
41
+ return r.value;
42
+ const task = stage.tasks[i];
43
+ return {
44
+ traceId: '',
45
+ agent: task.agent,
46
+ status: 'failed',
47
+ metadata: {
48
+ startTime: new Date(),
49
+ endTime: new Date(),
50
+ attempts: 0,
51
+ },
52
+ errors: [
53
+ {
54
+ message: r.reason instanceof Error ? r.reason.message : String(r.reason),
55
+ },
56
+ ],
57
+ };
58
+ });
59
+ const failedCount = taskResults.filter((r) => r.status !== 'success').length;
60
+ const status = failedCount === 0
61
+ ? 'success'
62
+ : failedCount < taskResults.length
63
+ ? 'partial'
64
+ : 'failed';
65
+ stageResults.push({ stageId: stage.id, status, taskResults });
66
+ if (status === 'failed' && stage.onStageFailure !== 'continue') {
67
+ aborted = true;
68
+ }
69
+ }
70
+ const overallStatus = stageResults.every((s) => s.status === 'success')
71
+ ? 'success'
72
+ : stageResults.some((s) => s.status !== 'failed')
73
+ ? 'partial'
74
+ : 'failed';
75
+ return { status: overallStatus, stages: stageResults };
76
+ }
77
+ }
78
+ exports.PipelineOrchestrator = PipelineOrchestrator;
79
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/cli-core/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface PlatformResponse {
2
+ content: string;
3
+ tokenUsage?: {
4
+ prompt: number;
5
+ completion: number;
6
+ };
7
+ }
8
+ export interface SendPromptOptions {
9
+ timeout?: number;
10
+ model?: string;
11
+ effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max';
12
+ }
13
+ export declare abstract class PlatformClient {
14
+ abstract sendPrompt(prompt: string, options?: SendPromptOptions): Promise<PlatformResponse>;
15
+ }
16
+ export declare class ClaudeCodeClient extends PlatformClient {
17
+ sendPrompt(prompt: string, options?: SendPromptOptions): Promise<PlatformResponse>;
18
+ }
19
+ export declare function resolvePlatformClient(cwd?: string): Promise<PlatformClient>;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ClaudeCodeClient = exports.PlatformClient = void 0;
37
+ exports.resolvePlatformClient = resolvePlatformClient;
38
+ const child_process_1 = require("child_process");
39
+ const fs = __importStar(require("fs/promises"));
40
+ const path = __importStar(require("path"));
41
+ const yaml = __importStar(require("yaml"));
42
+ class PlatformClient {
43
+ }
44
+ exports.PlatformClient = PlatformClient;
45
+ // --- Concrete implementations ---
46
+ class ClaudeCodeClient extends PlatformClient {
47
+ async sendPrompt(prompt, options) {
48
+ const t0 = Date.now();
49
+ const model = options?.model || 'sonnet';
50
+ const effort = options?.effort || 'low';
51
+ console.error(`[nova] spawning claude --model ${model} --effort ${effort} (prompt: ${prompt.length} chars, via stdin)...`);
52
+ return new Promise((resolve, reject) => {
53
+ const child = (0, child_process_1.spawn)('claude', ['--model', model, '--print', '--effort', effort, '--no-session-persistence', '--allowedTools', 'Read'], {
54
+ stdio: ['pipe', 'pipe', 'pipe'],
55
+ });
56
+ console.error(`[nova] claude pid=${child.pid} spawned in ${Date.now() - t0}ms`);
57
+ // 通过 stdin 传入 prompt,写完后关闭
58
+ child.stdin.write(prompt);
59
+ child.stdin.end();
60
+ let stdout = '';
61
+ let stderr = '';
62
+ let firstDataAt = 0;
63
+ let lastDotAt = 0;
64
+ child.stdout.on('data', (data) => {
65
+ if (!firstDataAt) {
66
+ firstDataAt = Date.now();
67
+ console.error(`[nova] first token after ${firstDataAt - t0}ms`);
68
+ }
69
+ const chunk = data.toString();
70
+ stdout += chunk;
71
+ // 每 5 秒打一个点,让用户知道在动
72
+ const now = Date.now();
73
+ if (now - lastDotAt > 5000) {
74
+ lastDotAt = now;
75
+ process.stderr.write(`[nova] streaming... ${stdout.length} chars received\n`);
76
+ }
77
+ });
78
+ child.stderr.on('data', (data) => {
79
+ const s = data.toString();
80
+ if (s.trim())
81
+ console.error(`[nova] claude stderr: ${s.trim().slice(0, 200)}`);
82
+ stderr += s;
83
+ });
84
+ child.on('close', (code) => {
85
+ const elapsed = Date.now() - t0;
86
+ console.error(`[nova] claude exited code=${code}, stdout=${stdout.length} chars, ${elapsed}ms total, first data at ${firstDataAt ? firstDataAt - t0 : 'N/A'}ms`);
87
+ if (code === 0) {
88
+ resolve({ content: stdout.trim() });
89
+ }
90
+ else {
91
+ reject(new Error(`Claude CLI exit ${code}: ${stderr}`));
92
+ }
93
+ });
94
+ child.on('error', (err) => {
95
+ console.error(`[nova] claude spawn error: ${err.message}`);
96
+ reject(err);
97
+ });
98
+ });
99
+ }
100
+ }
101
+ exports.ClaudeCodeClient = ClaudeCodeClient;
102
+ // --- Factory ---
103
+ async function resolvePlatformClient(cwd) {
104
+ const dir = cwd ?? process.cwd();
105
+ try {
106
+ const raw = await fs.readFile(path.join(dir, '.nova.yaml'), 'utf-8');
107
+ const state = yaml.parse(raw);
108
+ const env = state.environment?.[0];
109
+ if (env === 'codex' || env === 'openclaw' || env === 'hermes-agent') {
110
+ throw new Error(`${env} is not yet supported. Nova currently supports Claude Code only.`);
111
+ }
112
+ }
113
+ catch (err) {
114
+ if (err.message?.includes('not yet supported'))
115
+ throw err;
116
+ }
117
+ return new ClaudeCodeClient();
118
+ }
119
+ //# sourceMappingURL=platform-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-client.js","sourceRoot":"","sources":["../../src/cli-core/platform-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function detectProjectType(cwd: string): Promise<string>;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.detectProjectType = detectProjectType;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const TYPE_SIGNALS = {
39
+ 'requirements.txt': 'python',
40
+ 'pyproject.toml': 'python',
41
+ 'setup.py': 'python',
42
+ 'go.mod': 'go',
43
+ 'pom.xml': 'java',
44
+ 'build.gradle': 'java',
45
+ 'build.gradle.kts': 'java',
46
+ 'Cargo.toml': 'rust',
47
+ 'Gemfile': 'ruby',
48
+ 'composer.json': 'php',
49
+ 'CMakeLists.txt': 'cpp',
50
+ };
51
+ async function detectProjectType(cwd) {
52
+ try {
53
+ const files = await fs.readdir(cwd);
54
+ if (files.includes('package.json'))
55
+ return 'node';
56
+ for (const f of files) {
57
+ if (TYPE_SIGNALS[f])
58
+ return TYPE_SIGNALS[f];
59
+ }
60
+ }
61
+ catch { }
62
+ return '';
63
+ }
64
+ //# sourceMappingURL=project-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detect.js","sourceRoot":"","sources":["../../src/cli-core/project-detect.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,8CASC;AA1BD,gDAAkC;AAGlC,MAAM,YAAY,GAA2B;IAC3C,kBAAkB,EAAE,QAAQ;IAC5B,gBAAgB,EAAE,QAAQ;IAC1B,UAAU,EAAE,QAAQ;IACpB,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,MAAM;IACjB,cAAc,EAAE,MAAM;IACtB,kBAAkB,EAAE,MAAM;IAC1B,YAAY,EAAE,MAAM;IACpB,SAAS,EAAE,MAAM;IACjB,eAAe,EAAE,KAAK;IACtB,gBAAgB,EAAE,KAAK;CACxB,CAAC;AAEK,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO,MAAM,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,YAAY,CAAC,CAAC,CAAC;gBAAE,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { NovaState } from './types';
2
+ export declare class StateManager {
3
+ private static filePath;
4
+ private static mutex;
5
+ static load(): Promise<NovaState>;
6
+ static update(updateFn: (current: NovaState) => NovaState): Promise<NovaState>;
7
+ private static loadInternal;
8
+ static getTask(taskId: string): Promise<any | undefined>;
9
+ static setPhaseField(phase: string, field: string, value: any): Promise<NovaState>;
10
+ static getPhaseDuration(data: any): string | null;
11
+ }
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.StateManager = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const yaml = __importStar(require("yaml"));
39
+ const async_mutex_1 = require("async-mutex");
40
+ class StateManager {
41
+ static async load() {
42
+ const raw = await fs.readFile(this.filePath, 'utf-8');
43
+ return yaml.parse(raw);
44
+ }
45
+ static async update(updateFn) {
46
+ return await this.mutex.runExclusive(async () => {
47
+ const current = await this.loadInternal();
48
+ const next = updateFn(current);
49
+ // 自动记录阶段时间戳
50
+ for (const phase of Object.keys(next.phases)) {
51
+ const before = current.phases[phase]?.status;
52
+ const after = next.phases[phase]?.status;
53
+ if (before !== after) {
54
+ if (after === 'in-progress') {
55
+ next.phases[phase].startedAt = new Date().toISOString();
56
+ next.phases[phase].completedAt = null;
57
+ }
58
+ else if (after === 'done') {
59
+ next.phases[phase].completedAt = new Date().toISOString();
60
+ }
61
+ }
62
+ }
63
+ next.metadata.stateVersion = (current.metadata.stateVersion || 0) + 1;
64
+ next.metadata.lastModified = new Date().toISOString();
65
+ const temp = `${this.filePath}.tmp`;
66
+ await fs.writeFile(temp, yaml.stringify(next), 'utf-8');
67
+ await fs.rename(temp, this.filePath);
68
+ return next;
69
+ });
70
+ }
71
+ static async loadInternal() {
72
+ const raw = await fs.readFile(this.filePath, 'utf-8');
73
+ return yaml.parse(raw);
74
+ }
75
+ static async getTask(taskId) {
76
+ const state = await this.load();
77
+ const tasks = state.phases.design?.tasks || [];
78
+ if (Array.isArray(tasks))
79
+ return tasks.find((t) => t.id === taskId);
80
+ return tasks[taskId];
81
+ }
82
+ static async setPhaseField(phase, field, value) {
83
+ return await this.update(state => {
84
+ state.phases[phase][field] = value;
85
+ return state;
86
+ });
87
+ }
88
+ static getPhaseDuration(data) {
89
+ if (!data?.startedAt)
90
+ return null;
91
+ const start = new Date(data.startedAt).getTime();
92
+ const end = data.completedAt
93
+ ? new Date(data.completedAt).getTime()
94
+ : Date.now();
95
+ const ms = end - start;
96
+ if (ms < 60000)
97
+ return `${Math.round(ms / 1000)}s`;
98
+ if (ms < 3600000)
99
+ return `${Math.round(ms / 60000)}m`;
100
+ return `${(ms / 3600000).toFixed(1)}h`;
101
+ }
102
+ }
103
+ exports.StateManager = StateManager;
104
+ StateManager.filePath = '.nova.yaml';
105
+ StateManager.mutex = new async_mutex_1.Mutex();
106
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/cli-core/state.ts"],"names":[],"mappings":"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"}