@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.
- package/README.md +246 -0
- package/dist/cli/commands/archive.d.ts +1 -0
- package/dist/cli/commands/archive.js +120 -0
- package/dist/cli/commands/archive.js.map +1 -0
- package/dist/cli/commands/context.d.ts +1 -0
- package/dist/cli/commands/context.js +23 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/guard.d.ts +1 -0
- package/dist/cli/commands/guard.js +21 -0
- package/dist/cli/commands/guard.js.map +1 -0
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.js +22 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +72 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/error-handler.d.ts +1 -0
- package/dist/cli/error-handler.js +18 -0
- package/dist/cli/error-handler.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui.d.ts +10 -0
- package/dist/cli/ui.js +21 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli-core/__tests__/context-generator.test.d.ts +1 -0
- package/dist/cli-core/__tests__/context-generator.test.js +97 -0
- package/dist/cli-core/__tests__/context-generator.test.js.map +1 -0
- package/dist/cli-core/__tests__/dispatcher.test.d.ts +1 -0
- package/dist/cli-core/__tests__/dispatcher.test.js +99 -0
- package/dist/cli-core/__tests__/dispatcher.test.js.map +1 -0
- package/dist/cli-core/__tests__/guard.test.d.ts +1 -0
- package/dist/cli-core/__tests__/guard.test.js +136 -0
- package/dist/cli-core/__tests__/guard.test.js.map +1 -0
- package/dist/cli-core/__tests__/init-manager.test.d.ts +1 -0
- package/dist/cli-core/__tests__/init-manager.test.js +150 -0
- package/dist/cli-core/__tests__/init-manager.test.js.map +1 -0
- package/dist/cli-core/__tests__/pipeline.test.d.ts +1 -0
- package/dist/cli-core/__tests__/pipeline.test.js +119 -0
- package/dist/cli-core/__tests__/pipeline.test.js.map +1 -0
- package/dist/cli-core/__tests__/project-detect.test.d.ts +1 -0
- package/dist/cli-core/__tests__/project-detect.test.js +92 -0
- package/dist/cli-core/__tests__/project-detect.test.js.map +1 -0
- package/dist/cli-core/__tests__/state-manager.test.d.ts +1 -0
- package/dist/cli-core/__tests__/state-manager.test.js +120 -0
- package/dist/cli-core/__tests__/state-manager.test.js.map +1 -0
- package/dist/cli-core/adapters/claude-code.d.ts +6 -0
- package/dist/cli-core/adapters/claude-code.js +311 -0
- package/dist/cli-core/adapters/claude-code.js.map +1 -0
- package/dist/cli-core/context-generator.d.ts +4 -0
- package/dist/cli-core/context-generator.js +81 -0
- package/dist/cli-core/context-generator.js.map +1 -0
- package/dist/cli-core/dispatcher.d.ts +11 -0
- package/dist/cli-core/dispatcher.js +169 -0
- package/dist/cli-core/dispatcher.js.map +1 -0
- package/dist/cli-core/guard.d.ts +1 -0
- package/dist/cli-core/guard.js +57 -0
- package/dist/cli-core/guard.js.map +1 -0
- package/dist/cli-core/init-manager.d.ts +25 -0
- package/dist/cli-core/init-manager.js +182 -0
- package/dist/cli-core/init-manager.js.map +1 -0
- package/dist/cli-core/pipeline.d.ts +7 -0
- package/dist/cli-core/pipeline.js +79 -0
- package/dist/cli-core/pipeline.js.map +1 -0
- package/dist/cli-core/platform-client.d.ts +19 -0
- package/dist/cli-core/platform-client.js +119 -0
- package/dist/cli-core/platform-client.js.map +1 -0
- package/dist/cli-core/project-detect.d.ts +1 -0
- package/dist/cli-core/project-detect.js +64 -0
- package/dist/cli-core/project-detect.js.map +1 -0
- package/dist/cli-core/state.d.ts +11 -0
- package/dist/cli-core/state.js +106 -0
- package/dist/cli-core/state.js.map +1 -0
- package/dist/cli-core/types.d.ts +141 -0
- package/dist/cli-core/types.js +13 -0
- package/dist/cli-core/types.js.map +1 -0
- package/package.json +33 -0
- package/templates/docs/design.md +41 -0
- 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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAC7B,uCAAyB;AACzB,2CAA6B;AAC7B,kDAA8C;AAE9C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,OAAe,CAAC;IACpB,IAAI,WAAmB,CAAC;IAExB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QACjE,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAEzC,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,4BAA4B,EAAE,OAAO,CAAC,CAAC;YAExE,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;YAEhB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;YAEhB,MAAM,IAAI,GAAG,CAAC,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;YAClF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,MAAM,CACV,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CACjC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;YAEhB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAE9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,EAAE,CAAC,SAAS,CAChB,cAAc,EACd,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,EACzE,OAAO,CACR,CAAC;YAEF,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;YAEhB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC9C,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;YAEhB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAE5C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAE1C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACtE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;YACpE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE1E,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1D,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;YAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE/B,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;YAEhB,MAAM,MAAM,CACV,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAC9C,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YAE3B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YACnE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;YAEhB,MAAM,MAAM,CACV,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CACrD,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC3B,MAAM,MAAM,CACV,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CACnD,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|