@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 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/cli/ui.ts"],"names":[],"mappings":";;;;;;AAAA,8CAA+B;AAC/B,kDAA0B;AAEb,QAAA,EAAE,GAAG;IAChB,OAAO,EAAE,CAAC,IAAY,EAAO,EAAE,CAAC,IAAA,aAAG,EAAC,IAAI,CAAC,CAAC,KAAK,EAAE;IACjD,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChE,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC5D,WAAW,EAAE,CAAC,MAAe,EAAE,GAAW,EAAE,EAAE;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;CACF,CAAC"}
@@ -0,0 +1,97 @@
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
+ const context_generator_1 = require("../context-generator");
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const yaml = __importStar(require("yaml"));
41
+ describe("ContextGenerator", () => {
42
+ let testDir;
43
+ let originalCwd;
44
+ beforeEach(async () => {
45
+ testDir = await fs.mkdtemp(path.join(os.tmpdir(), "nova-ctx-test-"));
46
+ originalCwd = process.cwd();
47
+ process.chdir(testDir);
48
+ // 创建一个包含 projectType 的 state 文件
49
+ const state = {
50
+ version: 1,
51
+ project: "test",
52
+ projectType: "node",
53
+ environment: ["generic"],
54
+ phases: {
55
+ design: {
56
+ status: "done",
57
+ designDoc: "docs/design.md",
58
+ tasks: [],
59
+ },
60
+ },
61
+ };
62
+ await fs.writeFile(".nova.yaml", yaml.stringify(state), "utf-8");
63
+ });
64
+ afterEach(async () => {
65
+ process.chdir(originalCwd);
66
+ await fs.rm(testDir, { recursive: true, force: true });
67
+ });
68
+ test("generateFromTask builds complete TaskContext", async () => {
69
+ const task = {
70
+ id: "build-login",
71
+ title: "Implement login",
72
+ description: "Create login endpoint",
73
+ type: "implementation",
74
+ files: [{ path: "src/login.ts", action: "create" }],
75
+ expectedArtifacts: [
76
+ { type: "code", description: "Login module", pathHint: "src/login.ts" },
77
+ ],
78
+ acceptance: ["Returns JWT on success"],
79
+ blocking: true,
80
+ priority: "high",
81
+ estimatedComplexity: 7,
82
+ };
83
+ const context = await context_generator_1.ContextGenerator.generateFromTask(task);
84
+ expect(context.taskId).toBe("build-login");
85
+ expect(context.taskType).toBe("implementation");
86
+ expect(context.input.files).toHaveLength(1);
87
+ expect(context.input.files[0].path).toBe("src/login.ts");
88
+ expect(context.acceptanceCriteria).toContain("Returns JWT on success");
89
+ expect(context.guardConditions.blocking).toBe(true);
90
+ expect(context.metadata.priority).toBe("high");
91
+ expect(context.metadata.estimatedComplexity).toBe(7);
92
+ // 环境信息应被检测
93
+ expect(context.input.environment.language).toBe("TypeScript");
94
+ expect(context.input.environment.framework).toBe("Express.js");
95
+ });
96
+ });
97
+ //# sourceMappingURL=context-generator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-generator.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/context-generator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const dispatcher_1 = require("../dispatcher");
4
+ const platform_client_1 = require("../platform-client");
5
+ const types_1 = require("../types");
6
+ // 创建一个 Mock PlatformClient
7
+ class MockPlatformClient extends platform_client_1.PlatformClient {
8
+ constructor(response, shouldFail = false) {
9
+ super();
10
+ this.failCount = 0;
11
+ this.response = response;
12
+ this.shouldFail = shouldFail;
13
+ }
14
+ async sendPrompt() {
15
+ if (this.shouldFail) {
16
+ this.failCount++;
17
+ throw new Error("Mock failure");
18
+ }
19
+ return this.response;
20
+ }
21
+ }
22
+ const baseContext = {
23
+ taskId: "test-1",
24
+ title: "Test",
25
+ description: "A test task",
26
+ taskType: "implementation",
27
+ designContext: { designDocRef: "", relevantSpecs: [], architectureNotes: "" },
28
+ input: {
29
+ files: [],
30
+ dependencies: [],
31
+ environment: {
32
+ language: "ts",
33
+ framework: "",
34
+ buildTool: "",
35
+ testFramework: "",
36
+ },
37
+ },
38
+ output: { expectedArtifacts: [], constraints: { mustPassTests: true } },
39
+ acceptanceCriteria: [],
40
+ guardConditions: { requireReview: true, requireTests: true, blocking: false },
41
+ metadata: {
42
+ createdBy: "test",
43
+ createdAt: new Date().toISOString(),
44
+ priority: "medium",
45
+ estimatedComplexity: 1,
46
+ },
47
+ };
48
+ describe("Dispatcher", () => {
49
+ test("returns success on valid response", async () => {
50
+ const mockClient = new MockPlatformClient({
51
+ content: JSON.stringify({ done: true }),
52
+ });
53
+ const dispatcher = new dispatcher_1.Dispatcher(mockClient);
54
+ const request = {
55
+ agent: types_1.AgentType.CODER,
56
+ context: baseContext,
57
+ };
58
+ const result = await dispatcher.execute(request);
59
+ expect(result.status).toBe("success");
60
+ expect(result.output).toEqual({ done: true });
61
+ });
62
+ test("retries on failure and eventually succeeds", async () => {
63
+ // 模拟前两次失败,第三次成功
64
+ const mockClient = new MockPlatformClient({ content: "ok" }, true);
65
+ // 重写 sendPrompt 来控制失败次数
66
+ let callCount = 0;
67
+ mockClient.sendPrompt = async () => {
68
+ callCount++;
69
+ if (callCount < 3)
70
+ throw new Error("fail");
71
+ return { content: "success" };
72
+ };
73
+ const dispatcher = new dispatcher_1.Dispatcher(mockClient);
74
+ const request = {
75
+ agent: types_1.AgentType.CODER,
76
+ context: baseContext,
77
+ retry: { maxAttempts: 3, backoff: "fixed" },
78
+ };
79
+ const result = await dispatcher.execute(request);
80
+ expect(result.status).toBe("success");
81
+ expect(callCount).toBe(3);
82
+ });
83
+ test("fails after max retries", async () => {
84
+ const mockClient = new MockPlatformClient({ content: "" }, true);
85
+ mockClient.sendPrompt = async () => {
86
+ throw new Error("persistent error");
87
+ };
88
+ const dispatcher = new dispatcher_1.Dispatcher(mockClient);
89
+ const request = {
90
+ agent: types_1.AgentType.CODER,
91
+ context: baseContext,
92
+ retry: { maxAttempts: 2, backoff: "fixed" },
93
+ };
94
+ const result = await dispatcher.execute(request);
95
+ expect(result.status).toBe("failed");
96
+ expect(result.errors?.[0]?.message).toContain("persistent error");
97
+ });
98
+ });
99
+ //# sourceMappingURL=dispatcher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/dispatcher.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,136 @@
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
+ const fs = __importStar(require("fs/promises"));
37
+ const path = __importStar(require("path"));
38
+ const os = __importStar(require("os"));
39
+ const yaml = __importStar(require("yaml"));
40
+ const guard_1 = require("../guard");
41
+ describe('guardPhaseTransition', () => {
42
+ let testDir;
43
+ let originalCwd;
44
+ const baseState = {
45
+ version: 1,
46
+ project: 'test',
47
+ environment: [],
48
+ phases: {
49
+ open: { status: 'pending', proposal: '' },
50
+ design: { status: 'pending', designDoc: '', tasks: [] },
51
+ build: { status: 'pending', tasks: {} },
52
+ verify: { status: 'pending', pipelineResult: null },
53
+ archive: { status: 'pending' },
54
+ },
55
+ metadata: { stateVersion: 0, lastModified: '' },
56
+ };
57
+ beforeEach(async () => {
58
+ testDir = await fs.mkdtemp(path.join(os.tmpdir(), 'nova-guard-'));
59
+ originalCwd = process.cwd();
60
+ process.chdir(testDir);
61
+ });
62
+ afterEach(async () => {
63
+ process.chdir(originalCwd);
64
+ await fs.rm(testDir, { recursive: true, force: true });
65
+ });
66
+ async function writeState(state) {
67
+ await fs.writeFile('.nova.yaml', yaml.stringify(state), 'utf-8');
68
+ }
69
+ test('open-to-design passes when open is done with proposal', async () => {
70
+ await writeState({
71
+ ...baseState,
72
+ phases: { ...baseState.phases, open: { status: 'done', proposal: 'docs/prop.md' } },
73
+ });
74
+ expect(await (0, guard_1.guardPhaseTransition)('open', 'design')).toBe(true);
75
+ });
76
+ test('open-to-design fails when open is pending', async () => {
77
+ await writeState(baseState);
78
+ expect(await (0, guard_1.guardPhaseTransition)('open', 'design')).toBe(false);
79
+ });
80
+ test('design-to-build passes when design is done with tasks', async () => {
81
+ await writeState({
82
+ ...baseState,
83
+ phases: {
84
+ ...baseState.phases,
85
+ design: { status: 'done', designDoc: 'docs/design.md', tasks: [{ id: '1' }] },
86
+ },
87
+ });
88
+ expect(await (0, guard_1.guardPhaseTransition)('design', 'build')).toBe(true);
89
+ });
90
+ test('design-to-build fails when tasks are empty', async () => {
91
+ await writeState({
92
+ ...baseState,
93
+ phases: {
94
+ ...baseState.phases,
95
+ design: { status: 'done', designDoc: 'docs/design.md', tasks: [] },
96
+ },
97
+ });
98
+ expect(await (0, guard_1.guardPhaseTransition)('design', 'build')).toBe(false);
99
+ });
100
+ test('build-to-verify passes when build is done with completed tasks', async () => {
101
+ await writeState({
102
+ ...baseState,
103
+ phases: {
104
+ ...baseState.phases,
105
+ build: { status: 'done', tasks: { 'task-1': { status: 'done' } } },
106
+ },
107
+ });
108
+ expect(await (0, guard_1.guardPhaseTransition)('build', 'verify')).toBe(true);
109
+ });
110
+ test('build-to-verify passes when eccReviewPassed is true', async () => {
111
+ await writeState({
112
+ ...baseState,
113
+ phases: {
114
+ ...baseState.phases,
115
+ build: {
116
+ status: 'done',
117
+ tasks: { 'task-1': { status: 'failed' } },
118
+ eccReviewPassed: true,
119
+ },
120
+ },
121
+ });
122
+ expect(await (0, guard_1.guardPhaseTransition)('build', 'verify')).toBe(true);
123
+ });
124
+ test('verify-to-archive passes when verify is done', async () => {
125
+ await writeState({
126
+ ...baseState,
127
+ phases: { ...baseState.phases, verify: { status: 'done', pipelineResult: {} } },
128
+ });
129
+ expect(await (0, guard_1.guardPhaseTransition)('verify', 'archive')).toBe(true);
130
+ });
131
+ test('unknown transition returns true', async () => {
132
+ await writeState(baseState);
133
+ expect(await (0, guard_1.guardPhaseTransition)('unknown', 'transition')).toBe(true);
134
+ });
135
+ });
136
+ //# sourceMappingURL=guard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/guard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,150 @@
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
+ const fs = __importStar(require("fs/promises"));
37
+ const path = __importStar(require("path"));
38
+ const os = __importStar(require("os"));
39
+ const yaml = __importStar(require("yaml"));
40
+ const init_manager_1 = require("../init-manager");
41
+ describe('InitManager', () => {
42
+ let testDir;
43
+ let originalCwd;
44
+ beforeEach(async () => {
45
+ testDir = await fs.mkdtemp(path.join(os.tmpdir(), 'nova-init-'));
46
+ originalCwd = process.cwd();
47
+ process.chdir(testDir);
48
+ });
49
+ afterEach(async () => {
50
+ process.chdir(originalCwd);
51
+ await fs.rm(testDir, { recursive: true, force: true });
52
+ });
53
+ describe('re-init detection', () => {
54
+ test('throws when .nova.yaml already exists without --force', async () => {
55
+ await fs.writeFile('.nova.yaml', 'version: 1\n', 'utf-8');
56
+ const mgr = new init_manager_1.InitManager(testDir, {});
57
+ await expect(mgr.run()).rejects.toThrow('Nova already initialized');
58
+ });
59
+ test('force re-init proceeds and creates new state', async () => {
60
+ await fs.writeFile('.nova.yaml', 'version: 1\nproject: old\n', 'utf-8');
61
+ const mgr = new init_manager_1.InitManager(testDir, { force: true });
62
+ await mgr.run();
63
+ const raw = await fs.readFile('.nova.yaml', 'utf-8');
64
+ const state = yaml.parse(raw);
65
+ expect(state.project).not.toBe('old');
66
+ });
67
+ });
68
+ describe('directory creation', () => {
69
+ test('creates all required directories', async () => {
70
+ const mgr = new init_manager_1.InitManager(testDir, { force: false });
71
+ await mgr.run();
72
+ const dirs = ['docs/designs', 'docs/proposals', 'docs/reports', '.nova/contexts'];
73
+ for (const d of dirs) {
74
+ await expect(fs.access(path.join(testDir, d))).resolves.toBeUndefined();
75
+ }
76
+ });
77
+ });
78
+ describe('.nova.yaml generation', () => {
79
+ test('generates valid .nova.yaml with correct structure', async () => {
80
+ const mgr = new init_manager_1.InitManager(testDir, { force: false });
81
+ await mgr.run();
82
+ const raw = await fs.readFile('.nova.yaml', 'utf-8');
83
+ const state = yaml.parse(raw);
84
+ expect(state.version).toBe(1);
85
+ expect(state.project).toBeTruthy();
86
+ expect(state.environment).toEqual(['claude-code']);
87
+ expect(state.phases.open.status).toBe('pending');
88
+ expect(state.phases.design.status).toBe('pending');
89
+ expect(state.phases.build.status).toBe('pending');
90
+ expect(state.phases.verify.status).toBe('pending');
91
+ expect(state.phases.archive.status).toBe('pending');
92
+ expect(state.metadata.stateVersion).toBe(0);
93
+ expect(state.metadata.lastModified).toBeTruthy();
94
+ });
95
+ test('detects project type when package.json exists', async () => {
96
+ await fs.writeFile('package.json', JSON.stringify({ name: 'test-pkg', dependencies: { express: '^4.0.0' } }), 'utf-8');
97
+ const mgr = new init_manager_1.InitManager(testDir, { force: false });
98
+ await mgr.run();
99
+ const raw = await fs.readFile('.nova.yaml', 'utf-8');
100
+ const state = yaml.parse(raw);
101
+ expect(state.projectType).toBeTruthy();
102
+ });
103
+ });
104
+ describe('environment command generation', () => {
105
+ test('generates all 6 Claude Code command files', async () => {
106
+ const mgr = new init_manager_1.InitManager(testDir, { force: false });
107
+ await mgr.run();
108
+ const commandsDir = path.join(testDir, '.claude', 'commands');
109
+ const files = await fs.readdir(commandsDir);
110
+ expect(files).toContain('nova-propose.md');
111
+ expect(files).toContain('nova-design.md');
112
+ expect(files).toContain('nova-implement.md');
113
+ expect(files).toContain('nova-verify.md');
114
+ expect(files).toContain('nova-iterate.md');
115
+ expect(files).toContain('nova-status.md');
116
+ for (const f of files) {
117
+ const content = await fs.readFile(path.join(commandsDir, f), 'utf-8');
118
+ expect(content).toContain('description:');
119
+ }
120
+ });
121
+ });
122
+ describe('ECC installation', () => {
123
+ test('copies ECC skills when --with-ecc provided', async () => {
124
+ const eccDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ecc-src-'));
125
+ await fs.writeFile(path.join(eccDir, 'test-skill.md'), '# Test', 'utf-8');
126
+ const mgr = new init_manager_1.InitManager(testDir, { eccPath: eccDir });
127
+ await mgr.run();
128
+ const destFile = path.join(testDir, '.nova', 'ecc', 'test-skill.md');
129
+ const content = await fs.readFile(destFile, 'utf-8');
130
+ expect(content).toBe('# Test');
131
+ await fs.rm(eccDir, { recursive: true, force: true });
132
+ });
133
+ test('creates empty .nova/ecc without --with-ecc', async () => {
134
+ const mgr = new init_manager_1.InitManager(testDir, { force: false });
135
+ await mgr.run();
136
+ await expect(fs.access(path.join(testDir, '.nova', 'ecc'))).resolves.toBeUndefined();
137
+ const files = await fs.readdir(path.join(testDir, '.nova', 'ecc'));
138
+ expect(files.length).toBe(0);
139
+ });
140
+ });
141
+ describe('document templates', () => {
142
+ test('copies proposal and design templates to docs/', async () => {
143
+ const mgr = new init_manager_1.InitManager(testDir, { force: false });
144
+ await mgr.run();
145
+ await expect(fs.access(path.join(testDir, 'docs', 'proposal.md'))).resolves.toBeUndefined();
146
+ await expect(fs.access(path.join(testDir, 'docs', 'design.md'))).resolves.toBeUndefined();
147
+ });
148
+ });
149
+ });
150
+ //# sourceMappingURL=init-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-manager.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/init-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};