@hongmaple0820/scale-engine 0.1.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 (78) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +64 -0
  3. package/dist/adapters/ClaudeCodeAdapter.d.ts +48 -0
  4. package/dist/adapters/ClaudeCodeAdapter.js +188 -0
  5. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -0
  6. package/dist/adapters/CodexAdapter.d.ts +14 -0
  7. package/dist/adapters/CodexAdapter.js +153 -0
  8. package/dist/adapters/CodexAdapter.js.map +1 -0
  9. package/dist/api/cli.d.ts +2 -0
  10. package/dist/api/cli.js +396 -0
  11. package/dist/api/cli.js.map +1 -0
  12. package/dist/api/doctor.d.ts +28 -0
  13. package/dist/api/doctor.js +182 -0
  14. package/dist/api/doctor.js.map +1 -0
  15. package/dist/api/mcp.d.ts +32 -0
  16. package/dist/api/mcp.js +227 -0
  17. package/dist/api/mcp.js.map +1 -0
  18. package/dist/artifact/fsm.d.ts +36 -0
  19. package/dist/artifact/fsm.js +199 -0
  20. package/dist/artifact/fsm.js.map +1 -0
  21. package/dist/artifact/fsmDefinitions.d.ts +18 -0
  22. package/dist/artifact/fsmDefinitions.js +243 -0
  23. package/dist/artifact/fsmDefinitions.js.map +1 -0
  24. package/dist/artifact/sqliteStore.d.ts +61 -0
  25. package/dist/artifact/sqliteStore.js +394 -0
  26. package/dist/artifact/sqliteStore.js.map +1 -0
  27. package/dist/artifact/store.d.ts +49 -0
  28. package/dist/artifact/store.js +118 -0
  29. package/dist/artifact/store.js.map +1 -0
  30. package/dist/artifact/types.d.ts +333 -0
  31. package/dist/artifact/types.js +50 -0
  32. package/dist/artifact/types.js.map +1 -0
  33. package/dist/context/ContextBuilder.d.ts +36 -0
  34. package/dist/context/ContextBuilder.js +53 -0
  35. package/dist/context/ContextBuilder.js.map +1 -0
  36. package/dist/core/container.d.ts +14 -0
  37. package/dist/core/container.js +33 -0
  38. package/dist/core/container.js.map +1 -0
  39. package/dist/core/eventBus.d.ts +60 -0
  40. package/dist/core/eventBus.js +158 -0
  41. package/dist/core/eventBus.js.map +1 -0
  42. package/dist/core/logger.d.ts +3 -0
  43. package/dist/core/logger.js +12 -0
  44. package/dist/core/logger.js.map +1 -0
  45. package/dist/evolution/BehaviorTracker.d.ts +38 -0
  46. package/dist/evolution/BehaviorTracker.js +52 -0
  47. package/dist/evolution/BehaviorTracker.js.map +1 -0
  48. package/dist/evolution/EvolutionEngine.d.ts +99 -0
  49. package/dist/evolution/EvolutionEngine.js +321 -0
  50. package/dist/evolution/EvolutionEngine.js.map +1 -0
  51. package/dist/guardrails/Gateway.d.ts +26 -0
  52. package/dist/guardrails/Gateway.js +57 -0
  53. package/dist/guardrails/Gateway.js.map +1 -0
  54. package/dist/guardrails/advancedDetectors.d.ts +26 -0
  55. package/dist/guardrails/advancedDetectors.js +138 -0
  56. package/dist/guardrails/advancedDetectors.js.map +1 -0
  57. package/dist/guardrails/detectors.d.ts +25 -0
  58. package/dist/guardrails/detectors.js +170 -0
  59. package/dist/guardrails/detectors.js.map +1 -0
  60. package/dist/guardrails/roles.d.ts +4 -0
  61. package/dist/guardrails/roles.js +54 -0
  62. package/dist/guardrails/roles.js.map +1 -0
  63. package/dist/index.d.ts +22 -0
  64. package/dist/index.js +22 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/knowledge/KnowledgeBase.d.ts +25 -0
  67. package/dist/knowledge/KnowledgeBase.js +81 -0
  68. package/dist/knowledge/KnowledgeBase.js.map +1 -0
  69. package/dist/orchestration/EffectsWiring.d.ts +8 -0
  70. package/dist/orchestration/EffectsWiring.js +87 -0
  71. package/dist/orchestration/EffectsWiring.js.map +1 -0
  72. package/dist/routing/ModelRouter.d.ts +30 -0
  73. package/dist/routing/ModelRouter.js +69 -0
  74. package/dist/routing/ModelRouter.js.map +1 -0
  75. package/dist/tasks/TaskEngine.d.ts +97 -0
  76. package/dist/tasks/TaskEngine.js +269 -0
  77. package/dist/tasks/TaskEngine.js.map +1 -0
  78. package/package.json +48 -0
@@ -0,0 +1,32 @@
1
+ export interface MCPTool {
2
+ name: string;
3
+ description: string;
4
+ inputSchema: Record<string, unknown>;
5
+ }
6
+ export interface MCPRequest {
7
+ jsonrpc: '2.0';
8
+ id: number | string;
9
+ method: string;
10
+ params?: Record<string, unknown>;
11
+ }
12
+ export interface MCPResponse {
13
+ jsonrpc: '2.0';
14
+ id: number | string;
15
+ result?: unknown;
16
+ error?: {
17
+ code: number;
18
+ message: string;
19
+ data?: unknown;
20
+ };
21
+ }
22
+ export declare class ScaleMCPServer {
23
+ private bus;
24
+ private store;
25
+ private fsm;
26
+ private kb;
27
+ private ctx;
28
+ constructor(scaleDir?: string);
29
+ getTools(): MCPTool[];
30
+ handleToolCall(name: string, args: Record<string, unknown>): Promise<unknown>;
31
+ handleRequest(request: MCPRequest): Promise<MCPResponse>;
32
+ }
@@ -0,0 +1,227 @@
1
+ // SCALE Engine — MCP Server (W11)
2
+ // Model Context Protocol server over stdio
3
+ // Exposes SCALE artifacts, transitions, and context as MCP tools
4
+ import { EventBus } from '../core/eventBus.js';
5
+ import { InMemoryArtifactStore } from '../artifact/store.js';
6
+ import { FSM } from '../artifact/fsm.js';
7
+ import { registerAllFSMs, INITIAL_STATES } from '../artifact/fsmDefinitions.js';
8
+ import { KnowledgeBase } from '../knowledge/KnowledgeBase.js';
9
+ import { ContextBuilder } from '../context/ContextBuilder.js';
10
+ import { wireEffects } from '../orchestration/EffectsWiring.js';
11
+ import { existsSync, mkdirSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ // ============================================================================
14
+ // SCALE MCP Server
15
+ // ============================================================================
16
+ export class ScaleMCPServer {
17
+ bus;
18
+ store;
19
+ fsm;
20
+ kb;
21
+ ctx;
22
+ constructor(scaleDir = '.scale') {
23
+ const eventsDir = join(scaleDir, 'events');
24
+ const artifactsDir = join(scaleDir, 'artifacts');
25
+ for (const d of [eventsDir, artifactsDir]) {
26
+ if (!existsSync(d))
27
+ mkdirSync(d, { recursive: true });
28
+ }
29
+ this.bus = new EventBus({ eventsDir });
30
+ this.store = new InMemoryArtifactStore(this.bus, { artifactsDir });
31
+ this.fsm = new FSM(this.store, this.bus);
32
+ registerAllFSMs(this.fsm);
33
+ wireEffects(this.fsm, this.store, this.bus);
34
+ this.kb = new KnowledgeBase(this.bus);
35
+ this.ctx = new ContextBuilder(this.store, this.kb, this.bus);
36
+ }
37
+ getTools() {
38
+ return [
39
+ {
40
+ name: 'scale_create',
41
+ description: 'Create a new SCALE artifact (Spec, Plan, Task, Defect, etc.)',
42
+ inputSchema: {
43
+ type: 'object',
44
+ properties: {
45
+ type: { type: 'string', enum: Object.keys(INITIAL_STATES), description: 'Artifact type' },
46
+ title: { type: 'string', description: 'Artifact title' },
47
+ payload: { type: 'object', description: 'Type-specific payload' },
48
+ },
49
+ required: ['type', 'title'],
50
+ },
51
+ },
52
+ {
53
+ name: 'scale_transition',
54
+ description: 'Transition an artifact to a new state via FSM action',
55
+ inputSchema: {
56
+ type: 'object',
57
+ properties: {
58
+ artifactId: { type: 'string', description: 'Artifact ID' },
59
+ action: { type: 'string', description: 'FSM action name' },
60
+ reason: { type: 'string', description: 'Reason for transition' },
61
+ },
62
+ required: ['artifactId', 'action'],
63
+ },
64
+ },
65
+ {
66
+ name: 'scale_list',
67
+ description: 'List artifacts with optional filters',
68
+ inputSchema: {
69
+ type: 'object',
70
+ properties: {
71
+ type: { type: 'string', description: 'Filter by type' },
72
+ status: { type: 'string', description: 'Filter by status' },
73
+ limit: { type: 'number', description: 'Max results', default: 20 },
74
+ },
75
+ },
76
+ },
77
+ {
78
+ name: 'scale_show',
79
+ description: 'Show artifact details',
80
+ inputSchema: {
81
+ type: 'object',
82
+ properties: {
83
+ artifactId: { type: 'string', description: 'Artifact ID' },
84
+ },
85
+ required: ['artifactId'],
86
+ },
87
+ },
88
+ {
89
+ name: 'scale_available_actions',
90
+ description: 'Get available FSM actions for an artifact',
91
+ inputSchema: {
92
+ type: 'object',
93
+ properties: {
94
+ artifactId: { type: 'string', description: 'Artifact ID' },
95
+ },
96
+ required: ['artifactId'],
97
+ },
98
+ },
99
+ {
100
+ name: 'scale_context',
101
+ description: 'Build context for current session',
102
+ inputSchema: {
103
+ type: 'object',
104
+ properties: {
105
+ sessionId: { type: 'string', description: 'Session ID' },
106
+ artifactId: { type: 'string', description: 'Current artifact ID' },
107
+ roleId: { type: 'string', description: 'Current role' },
108
+ },
109
+ required: ['sessionId'],
110
+ },
111
+ },
112
+ {
113
+ name: 'scale_stats',
114
+ description: 'Get engine statistics',
115
+ inputSchema: { type: 'object', properties: {} },
116
+ },
117
+ ];
118
+ }
119
+ async handleToolCall(name, args) {
120
+ const actor = { kind: 'system', component: 'mcp-client' };
121
+ switch (name) {
122
+ case 'scale_create': {
123
+ const type = args.type;
124
+ const title = args.title;
125
+ const payload = args.payload ?? {};
126
+ const artifact = await this.store.create({
127
+ type: type,
128
+ title,
129
+ payload,
130
+ initialStatus: INITIAL_STATES[type],
131
+ createdBy: actor,
132
+ });
133
+ return { id: artifact.id, type: artifact.type, title: artifact.title, status: artifact.status };
134
+ }
135
+ case 'scale_transition': {
136
+ const id = args.artifactId;
137
+ const action = args.action;
138
+ const reason = args.reason;
139
+ const result = await this.fsm.transition(id, action, { actor, reason });
140
+ return {
141
+ success: result.success,
142
+ status: result.artifact?.status,
143
+ blockedBy: result.blockedBy,
144
+ effectsExecuted: result.effectsExecuted,
145
+ };
146
+ }
147
+ case 'scale_list': {
148
+ const artifacts = await this.store.query({
149
+ type: args.type,
150
+ status: args.status,
151
+ limit: args.limit ?? 20,
152
+ });
153
+ return artifacts.map((a) => ({
154
+ id: a.id, type: a.type, title: a.title, status: a.status,
155
+ }));
156
+ }
157
+ case 'scale_show': {
158
+ const artifact = await this.store.get(args.artifactId);
159
+ if (!artifact)
160
+ return { error: 'Artifact not found' };
161
+ return artifact;
162
+ }
163
+ case 'scale_available_actions': {
164
+ const actions = await this.fsm.availableActions(args.artifactId);
165
+ return { artifactId: args.artifactId, actions };
166
+ }
167
+ case 'scale_context': {
168
+ const ctx = await this.ctx.build({
169
+ sessionId: args.sessionId,
170
+ currentArtifactId: args.artifactId,
171
+ roleId: args.roleId,
172
+ });
173
+ return ctx;
174
+ }
175
+ case 'scale_stats': {
176
+ const all = await this.store.query({ limit: 10000 });
177
+ const byType = {};
178
+ for (const a of all)
179
+ byType[a.type] = (byType[a.type] ?? 0) + 1;
180
+ const events = await this.bus.query({ limit: 1000 });
181
+ return { artifactCount: all.length, byType, eventCount: events.length };
182
+ }
183
+ default:
184
+ throw new Error(`Unknown tool: ${name}`);
185
+ }
186
+ }
187
+ async handleRequest(request) {
188
+ try {
189
+ switch (request.method) {
190
+ case 'initialize':
191
+ return {
192
+ jsonrpc: '2.0', id: request.id,
193
+ result: {
194
+ protocolVersion: '2024-11-05',
195
+ capabilities: { tools: {} },
196
+ serverInfo: { name: 'scale-engine', version: '0.1.0' },
197
+ },
198
+ };
199
+ case 'tools/list':
200
+ return {
201
+ jsonrpc: '2.0', id: request.id,
202
+ result: { tools: this.getTools() },
203
+ };
204
+ case 'tools/call': {
205
+ const params = request.params;
206
+ const result = await this.handleToolCall(params.name, params.arguments ?? {});
207
+ return {
208
+ jsonrpc: '2.0', id: request.id,
209
+ result: { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] },
210
+ };
211
+ }
212
+ default:
213
+ return {
214
+ jsonrpc: '2.0', id: request.id,
215
+ error: { code: -32601, message: `Method not found: ${request.method}` },
216
+ };
217
+ }
218
+ }
219
+ catch (e) {
220
+ return {
221
+ jsonrpc: '2.0', id: request.id,
222
+ error: { code: -32000, message: e.message },
223
+ };
224
+ }
225
+ }
226
+ }
227
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/api/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * SCALE Engine — FSM (Finite State Machine) Engine
3
+ *
4
+ * 系统的"宪法执行者"。
5
+ * 所有 Artifact 状态变化必须通过 fsm.transition(),禁止任何代码绕过。
6
+ *
7
+ * 设计参考:docs/02-DATA-MODEL.md §三、docs/03-CORE-MODULES.md §3.2
8
+ */
9
+ import type { ArtifactType, FSMDefinition, TransitionContext, TransitionResult, GuardFailure } from './types.js';
10
+ import type { IArtifactStore } from './store.js';
11
+ import type { IEventBus } from '../core/eventBus.js';
12
+ export interface IFSM {
13
+ register(definition: FSMDefinition): void;
14
+ canTransition(artifactId: string, action: string): Promise<{
15
+ allowed: boolean;
16
+ blockedBy?: GuardFailure[];
17
+ }>;
18
+ transition(artifactId: string, action: string, context: TransitionContext): Promise<TransitionResult>;
19
+ availableActions(artifactId: string): Promise<string[]>;
20
+ getDefinition(type: ArtifactType): FSMDefinition | undefined;
21
+ }
22
+ export declare class FSM implements IFSM {
23
+ private store;
24
+ private eventBus;
25
+ private registry;
26
+ constructor(store: IArtifactStore, eventBus: IEventBus);
27
+ register(definition: FSMDefinition): void;
28
+ getDefinition(type: ArtifactType): FSMDefinition | undefined;
29
+ canTransition(artifactId: string, action: string): Promise<{
30
+ allowed: boolean;
31
+ blockedBy?: GuardFailure[];
32
+ }>;
33
+ transition(artifactId: string, action: string, context: TransitionContext): Promise<TransitionResult>;
34
+ availableActions(artifactId: string): Promise<string[]>;
35
+ }
36
+ export declare const SpecFSM: FSMDefinition;
@@ -0,0 +1,199 @@
1
+ /**
2
+ * SCALE Engine — FSM (Finite State Machine) Engine
3
+ *
4
+ * 系统的"宪法执行者"。
5
+ * 所有 Artifact 状态变化必须通过 fsm.transition(),禁止任何代码绕过。
6
+ *
7
+ * 设计参考:docs/02-DATA-MODEL.md §三、docs/03-CORE-MODULES.md §3.2
8
+ */
9
+ import { InvalidTransitionError, ArtifactNotFoundError, } from './types.js';
10
+ import { logger } from '../core/logger.js';
11
+ export class FSM {
12
+ store;
13
+ eventBus;
14
+ registry = new Map();
15
+ constructor(store, eventBus) {
16
+ this.store = store;
17
+ this.eventBus = eventBus;
18
+ }
19
+ register(definition) {
20
+ if (this.registry.has(definition.type)) {
21
+ throw new Error(`FSM already registered for type: ${definition.type}`);
22
+ }
23
+ this.registry.set(definition.type, definition);
24
+ logger.debug({ type: definition.type, states: definition.states }, 'FSM registered');
25
+ }
26
+ getDefinition(type) {
27
+ return this.registry.get(type);
28
+ }
29
+ async canTransition(artifactId, action) {
30
+ const artifact = await this.store.get(artifactId);
31
+ if (!artifact)
32
+ throw new ArtifactNotFoundError(artifactId);
33
+ const def = this.registry.get(artifact.type);
34
+ if (!def)
35
+ throw new Error(`No FSM registered for type: ${artifact.type}`);
36
+ const tx = def.transitions.find((t) => t.from === artifact.status && t.action === action);
37
+ if (!tx)
38
+ return { allowed: false, blockedBy: [{ guard: 'transition', message: `No transition from '${artifact.status}' via '${action}'` }] };
39
+ const failures = [];
40
+ for (const guard of tx.guards ?? []) {
41
+ try {
42
+ const passed = await guard.check(artifact, {
43
+ actor: { kind: 'system', component: 'FSM.canTransition' },
44
+ });
45
+ if (!passed)
46
+ failures.push({ guard: guard.name, message: guard.errorMessage });
47
+ }
48
+ catch (e) {
49
+ failures.push({ guard: guard.name, message: `Guard threw: ${e.message}` });
50
+ }
51
+ }
52
+ return { allowed: failures.length === 0, blockedBy: failures.length > 0 ? failures : undefined };
53
+ }
54
+ async transition(artifactId, action, context) {
55
+ const artifact = await this.store.get(artifactId);
56
+ if (!artifact)
57
+ throw new ArtifactNotFoundError(artifactId);
58
+ const def = this.registry.get(artifact.type);
59
+ if (!def)
60
+ throw new Error(`No FSM registered for type: ${artifact.type}`);
61
+ const tx = def.transitions.find((t) => t.from === artifact.status && t.action === action);
62
+ if (!tx)
63
+ throw new InvalidTransitionError(artifact.status, action);
64
+ // Phase 1: 检查所有 guards
65
+ const failures = [];
66
+ for (const guard of tx.guards ?? []) {
67
+ try {
68
+ const passed = await guard.check(artifact, context);
69
+ if (!passed) {
70
+ failures.push({ guard: guard.name, message: guard.errorMessage });
71
+ }
72
+ }
73
+ catch (e) {
74
+ failures.push({
75
+ guard: guard.name,
76
+ message: `Guard threw: ${e.message}`,
77
+ });
78
+ }
79
+ }
80
+ if (failures.length > 0) {
81
+ logger.info({ artifactId, action, failures }, 'Transition blocked by guards');
82
+ return { success: false, blockedBy: failures, effectsExecuted: [] };
83
+ }
84
+ // Phase 2: 写状态历史 + 更新状态(事件先发,后落 DB)
85
+ const event = this.eventBus.emit('artifact.transitioned', {
86
+ artifactId,
87
+ from: artifact.status,
88
+ to: tx.to,
89
+ reason: context.reason,
90
+ }, {
91
+ sessionId: 'system',
92
+ actor: context.actor,
93
+ artifactId,
94
+ });
95
+ const updated = await this.store.update(artifactId, {
96
+ status: tx.to,
97
+ statusHistory: [
98
+ ...artifact.statusHistory,
99
+ {
100
+ from: artifact.status,
101
+ to: tx.to,
102
+ at: Date.now(),
103
+ by: context.actor,
104
+ reason: context.reason,
105
+ eventId: event.id,
106
+ },
107
+ ],
108
+ updatedAt: Date.now(),
109
+ ...(def.terminal.includes(tx.to) ? { closedAt: Date.now() } : {}),
110
+ });
111
+ logger.info({ artifactId, from: artifact.status, to: tx.to, by: context.actor }, 'Transition completed');
112
+ // Phase 3: 异步执行 effects(不阻塞返回,但记录失败)
113
+ const effectsExecuted = [];
114
+ for (const effect of tx.effects ?? []) {
115
+ try {
116
+ await effect.run(updated, context);
117
+ effectsExecuted.push(effect.name);
118
+ }
119
+ catch (e) {
120
+ logger.error({ artifactId, effect: effect.name, error: e.message }, 'Effect execution failed');
121
+ // Effect 失败不回滚状态迁移(事件已发出,下游可补偿)
122
+ }
123
+ }
124
+ return { success: true, artifact: updated, effectsExecuted };
125
+ }
126
+ async availableActions(artifactId) {
127
+ const artifact = await this.store.get(artifactId);
128
+ if (!artifact)
129
+ throw new ArtifactNotFoundError(artifactId);
130
+ const def = this.registry.get(artifact.type);
131
+ if (!def)
132
+ return [];
133
+ return def.transitions
134
+ .filter((t) => t.from === artifact.status)
135
+ .map((t) => t.action);
136
+ }
137
+ }
138
+ // ============================================================================
139
+ // 内置 FSM 定义(11 种 Artifact)
140
+ // 这些定义在 src/artifact/fsmDefinitions/ 下完整实现
141
+ // 此处只列 Spec 作为示例
142
+ // ============================================================================
143
+ export const SpecFSM = {
144
+ type: 'Spec',
145
+ states: ['DRAFT', 'REVIEWING', 'FROZEN', 'REVISING', 'OBSOLETED'],
146
+ initial: 'DRAFT',
147
+ terminal: ['OBSOLETED'],
148
+ transitions: [
149
+ {
150
+ from: 'DRAFT',
151
+ action: 'refine',
152
+ to: 'REVIEWING',
153
+ },
154
+ {
155
+ from: 'REVIEWING',
156
+ action: 'reject',
157
+ to: 'DRAFT',
158
+ },
159
+ {
160
+ from: 'REVIEWING',
161
+ action: 'approve',
162
+ to: 'FROZEN',
163
+ guards: [
164
+ {
165
+ name: 'ambiguity_below_threshold',
166
+ check: (a) => {
167
+ const payload = a.payload;
168
+ return (payload.ambiguityScore ?? 1) <= 0.2;
169
+ },
170
+ errorMessage: 'Spec 模糊度必须 ≤ 0.2 才能 FROZEN',
171
+ },
172
+ ],
173
+ },
174
+ {
175
+ from: 'FROZEN',
176
+ action: 'challenge',
177
+ to: 'REVISING',
178
+ // effects 在运行时由 Engine 注入(避免循环依赖)
179
+ },
180
+ {
181
+ from: 'REVISING',
182
+ action: 'finalize',
183
+ to: 'FROZEN',
184
+ },
185
+ {
186
+ from: 'FROZEN',
187
+ action: 'supersede',
188
+ to: 'OBSOLETED',
189
+ },
190
+ ],
191
+ };
192
+ // 其他 FSM 定义占位(W2 完整实现)
193
+ // export const NeedFSM: FSMDefinition = { ... }
194
+ // export const PlanFSM: FSMDefinition = { ... }
195
+ // export const TaskFSM: FSMDefinition = { ... }
196
+ // export const ChangeFSM: FSMDefinition = { ... }
197
+ // export const DefectFSM: FSMDefinition = { ... }
198
+ // ...
199
+ //# sourceMappingURL=fsm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsm.js","sourceRoot":"","sources":["../../src/artifact/fsm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAiB1C,MAAM,OAAO,GAAG;IAIJ;IACA;IAJF,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAA;IAEzD,YACU,KAAqB,EACrB,QAAmB;QADnB,UAAK,GAAL,KAAK,CAAgB;QACrB,aAAQ,GAAR,QAAQ,CAAW;IAC1B,CAAC;IAEJ,QAAQ,CAAC,UAAyB;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAC9C,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAA;IACtF,CAAC;IAED,aAAa,CAAC,IAAkB;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,UAAkB,EAClB,MAAc;QAEd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAA;QAE1D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC5C,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;QAEzE,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CACzD,CAAA;QACD,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,uBAAuB,QAAQ,CAAC,MAAM,UAAU,MAAM,GAAG,EAAE,CAAC,EAAE,CAAA;QAE5I,MAAM,QAAQ,GAAmB,EAAE,CAAA;QACnC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE;oBACzC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,mBAAmB,EAAE;iBAC1D,CAAC,CAAA;gBACF,IAAI,CAAC,MAAM;oBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAA;YAChF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAiB,CAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YACvF,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IAClG,CAAC;IAED,KAAK,CAAC,UAAU,CACd,UAAkB,EAClB,MAAc,EACd,OAA0B;QAE1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAA;QAE1D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC5C,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;QAEzE,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CACzD,CAAA;QACD,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,sBAAsB,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAElE,uBAAuB;QACvB,MAAM,QAAQ,GAAmB,EAAE,CAAA;QACnC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;gBACnD,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAA;gBACnE,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,OAAO,EAAE,gBAAiB,CAAW,CAAC,OAAO,EAAE;iBAChD,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,8BAA8B,CAAC,CAAA;YAC7E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE,CAAA;QACrE,CAAC;QAED,oCAAoC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACxD,UAAU;YACV,IAAI,EAAE,QAAQ,CAAC,MAAM;YACrB,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,EAAE;YACD,SAAS,EAAE,QAAQ;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU;SACX,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE;YAClD,MAAM,EAAE,EAAE,CAAC,EAAE;YACb,aAAa,EAAE;gBACb,GAAG,QAAQ,CAAC,aAAa;gBACzB;oBACE,IAAI,EAAE,QAAQ,CAAC,MAAM;oBACrB,EAAE,EAAE,EAAE,CAAC,EAAE;oBACT,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;oBACd,EAAE,EAAE,OAAO,CAAC,KAAK;oBACjB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,OAAO,EAAE,KAAK,CAAC,EAAE;iBAClB;aACF;YACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CACT,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,EACnE,sBAAsB,CACvB,CAAA;QAED,qCAAqC;QACrC,MAAM,eAAe,GAAa,EAAE,CAAA;QACpC,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAClC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACnC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CACV,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,EAChE,yBAAyB,CAC1B,CAAA;gBACD,gCAAgC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,CAAA;IAC9D,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,UAAkB;QACvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAA;QAE1D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC5C,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAA;QAEnB,OAAO,GAAG,CAAC,WAAW;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,CAAC;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;CACF;AAED,+EAA+E;AAC/E,2BAA2B;AAC3B,2CAA2C;AAC3C,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,OAAO,GAAkB;IACpC,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAU;IAC1E,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,CAAC,WAAW,CAAU;IAChC,WAAW,EAAE;QACX;YACE,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,QAAQ;YAChB,EAAE,EAAE,WAAW;SAChB;QACD;YACE,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,QAAQ;YAChB,EAAE,EAAE,OAAO;SACZ;QACD;YACE,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,SAAS;YACjB,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,2BAA2B;oBACjC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;wBACX,MAAM,OAAO,GAAG,CAAC,CAAC,OAAsC,CAAA;wBACxD,OAAO,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,IAAI,GAAG,CAAA;oBAC7C,CAAC;oBACD,YAAY,EAAE,4BAA4B;iBAC3C;aACF;SACF;QACD;YACE,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,WAAW;YACnB,EAAE,EAAE,UAAU;YACd,kCAAkC;SACnC;QACD;YACE,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,UAAU;YAClB,EAAE,EAAE,QAAQ;SACb;QACD;YACE,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,WAAW;YACnB,EAAE,EAAE,WAAW;SAChB;KACF;CACO,CAAA;AAEV,uBAAuB;AACvB,gDAAgD;AAChD,gDAAgD;AAChD,gDAAgD;AAChD,kDAAkD;AAClD,kDAAkD;AAClD,MAAM"}
@@ -0,0 +1,18 @@
1
+ import type { FSMDefinition } from './types.js';
2
+ export declare const NeedFSM: FSMDefinition;
3
+ export declare const InsightFSM: FSMDefinition;
4
+ export declare const SpecFSM: FSMDefinition;
5
+ export declare const PlanFSM: FSMDefinition;
6
+ export declare const TestPlanFSM: FSMDefinition;
7
+ export declare const TaskFSM: FSMDefinition;
8
+ export declare const ChangeFSM: FSMDefinition;
9
+ export declare const EvidenceFSM: FSMDefinition;
10
+ export declare const DefectFSM: FSMDefinition;
11
+ export declare const LessonFSM: FSMDefinition;
12
+ export declare const ReleaseFSM: FSMDefinition;
13
+ export declare const ALL_FSMS: readonly [FSMDefinition<string, string>, FSMDefinition<string, string>, FSMDefinition<string, string>, FSMDefinition<string, string>, FSMDefinition<string, string>, FSMDefinition<string, string>, FSMDefinition<string, string>, FSMDefinition<string, string>, FSMDefinition<string, string>, FSMDefinition<string, string>, FSMDefinition<string, string>];
14
+ import type { IFSM } from './fsm.js';
15
+ import type { ArtifactType } from './types.js';
16
+ export declare function registerAllFSMs(fsm: IFSM): void;
17
+ /** 各 Artifact 类型的初始状态查询表 */
18
+ export declare const INITIAL_STATES: Record<ArtifactType, string>;