@s_s/harmonia 1.1.1 → 1.3.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 +413 -205
- package/build/core/dispatch.d.ts +16 -13
- package/build/core/dispatch.js +38 -33
- package/build/core/dispatch.js.map +1 -1
- package/build/core/docs.d.ts +15 -11
- package/build/core/docs.js +24 -19
- package/build/core/docs.js.map +1 -1
- package/build/core/issues.d.ts +37 -0
- package/build/core/issues.js +100 -0
- package/build/core/issues.js.map +1 -0
- package/build/core/registry.d.ts +63 -6
- package/build/core/registry.js +109 -8
- package/build/core/registry.js.map +1 -1
- package/build/core/reviews.d.ts +9 -8
- package/build/core/reviews.js +22 -20
- package/build/core/reviews.js.map +1 -1
- package/build/core/state.d.ts +18 -10
- package/build/core/state.js +50 -27
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +8 -7
- package/build/core/steps.js +21 -19
- package/build/core/steps.js.map +1 -1
- package/build/core/types.d.ts +32 -1
- package/build/index.js +34 -3
- package/build/index.js.map +1 -1
- package/build/setup/templates.js +79 -3
- package/build/setup/templates.js.map +1 -1
- package/build/tools/approve-doc.js +9 -2
- package/build/tools/approve-doc.js.map +1 -1
- package/build/tools/dispatch-role.js +8 -4
- package/build/tools/dispatch-role.js.map +1 -1
- package/build/tools/doc-tools.js +100 -21
- package/build/tools/doc-tools.js.map +1 -1
- package/build/tools/get-project-status.js +108 -17
- package/build/tools/get-project-status.js.map +1 -1
- package/build/tools/issue-tools.d.ts +10 -0
- package/build/tools/issue-tools.js +169 -0
- package/build/tools/issue-tools.js.map +1 -0
- package/build/tools/iteration-start.d.ts +13 -0
- package/build/tools/iteration-start.js +103 -0
- package/build/tools/iteration-start.js.map +1 -0
- package/build/tools/patch-start.d.ts +14 -0
- package/build/tools/patch-start.js +97 -0
- package/build/tools/patch-start.js.map +1 -0
- package/build/tools/project-init.d.ts +5 -1
- package/build/tools/project-init.js +28 -14
- package/build/tools/project-init.js.map +1 -1
- package/build/tools/report-dispatch.js +23 -19
- package/build/tools/report-dispatch.js.map +1 -1
- package/build/tools/set-scale.js +7 -4
- package/build/tools/set-scale.js.map +1 -1
- package/build/tools/update-phase.js +11 -7
- package/build/tools/update-phase.js.map +1 -1
- package/build/tools/utils.d.ts +34 -0
- package/build/tools/utils.js +61 -0
- package/build/tools/utils.js.map +1 -0
- package/package.json +1 -1
|
@@ -15,6 +15,7 @@ import { getDispatch, updateDispatch, createSession, updateSession, findSessionB
|
|
|
15
15
|
import { listDocs } from '../core/docs.js';
|
|
16
16
|
import { readState } from '../core/state.js';
|
|
17
17
|
import { loadWorkflow } from '../core/workflow.js';
|
|
18
|
+
import { resolveActive, isError } from './utils.js';
|
|
18
19
|
export function registerReportDispatch(server, builtinDir, customDir) {
|
|
19
20
|
server.tool('dispatch_report', 'Report dispatch status after launching or completing a team member agent. Call with agent_session_id after launching to register the session. Call with status="completed" or "failed" when the agent finishes.', {
|
|
20
21
|
project_name: z.string().describe('Project name'),
|
|
@@ -35,8 +36,11 @@ export function registerReportDispatch(server, builtinDir, customDir) {
|
|
|
35
36
|
note: z.string().optional().describe('Optional note (e.g. failure reason)'),
|
|
36
37
|
}, async ({ project_name, dispatch_id, status, agent_session_id, agent_type, label, note }) => {
|
|
37
38
|
try {
|
|
39
|
+
const ctx = await resolveActive(project_name);
|
|
40
|
+
if (isError(ctx))
|
|
41
|
+
return ctx;
|
|
38
42
|
// Load the dispatch record
|
|
39
|
-
const dispatch = await getDispatch(project_name, dispatch_id);
|
|
43
|
+
const dispatch = await getDispatch(project_name, ctx.number, dispatch_id, ctx.dir);
|
|
40
44
|
if (!dispatch) {
|
|
41
45
|
return {
|
|
42
46
|
content: [
|
|
@@ -68,7 +72,7 @@ export function registerReportDispatch(server, builtinDir, customDir) {
|
|
|
68
72
|
// Handle session registration (when agent_session_id is provided)
|
|
69
73
|
let session = null;
|
|
70
74
|
if (agent_session_id) {
|
|
71
|
-
session = await resolveOrCreateSession(project_name, dispatch, agent_session_id, agent_type, label);
|
|
75
|
+
session = await resolveOrCreateSession(project_name, ctx.number, dispatch, agent_session_id, agent_type, label, ctx.dir);
|
|
72
76
|
results.push(`Session: ${session.id} (agent: ${agent_session_id}, status: ${session.status})`);
|
|
73
77
|
}
|
|
74
78
|
// Handle status transitions
|
|
@@ -76,38 +80,38 @@ export function registerReportDispatch(server, builtinDir, customDir) {
|
|
|
76
80
|
effectiveStatus === 'failed' ||
|
|
77
81
|
effectiveStatus === 'cancelled') {
|
|
78
82
|
// Terminal states: update dispatch and transition session
|
|
79
|
-
await updateDispatch(project_name, dispatch_id, {
|
|
83
|
+
await updateDispatch(project_name, ctx.number, dispatch_id, {
|
|
80
84
|
status: effectiveStatus,
|
|
81
85
|
...(session ? { sessionId: session.id } : {}),
|
|
82
86
|
...(note ? { note } : {}),
|
|
83
|
-
});
|
|
87
|
+
}, ctx.dir);
|
|
84
88
|
// Transition session: completed → idle, failed → lost
|
|
85
89
|
const sessionId = session?.id ?? dispatch.sessionId;
|
|
86
90
|
if (sessionId) {
|
|
87
91
|
const newSessionStatus = effectiveStatus === 'completed' ? 'idle' : 'lost';
|
|
88
|
-
await updateSession(project_name, sessionId, { status: newSessionStatus });
|
|
92
|
+
await updateSession(project_name, ctx.number, sessionId, { status: newSessionStatus }, ctx.dir);
|
|
89
93
|
results.push(`Session ${sessionId} → ${newSessionStatus}`);
|
|
90
94
|
}
|
|
91
95
|
results.push(`Dispatch ${dispatch_id} → ${effectiveStatus}`);
|
|
92
96
|
}
|
|
93
97
|
else {
|
|
94
98
|
// Running: update dispatch status + associate session
|
|
95
|
-
await updateDispatch(project_name, dispatch_id, {
|
|
99
|
+
await updateDispatch(project_name, ctx.number, dispatch_id, {
|
|
96
100
|
status: 'running',
|
|
97
101
|
...(session ? { sessionId: session.id } : {}),
|
|
98
102
|
...(note ? { note } : {}),
|
|
99
|
-
});
|
|
103
|
+
}, ctx.dir);
|
|
100
104
|
// Mark session as active
|
|
101
105
|
const sessionId = session?.id ?? dispatch.sessionId;
|
|
102
106
|
if (sessionId) {
|
|
103
|
-
await updateSession(project_name, sessionId, { status: 'active' });
|
|
107
|
+
await updateSession(project_name, ctx.number, sessionId, { status: 'active' }, ctx.dir);
|
|
104
108
|
}
|
|
105
109
|
results.push(`Dispatch ${dispatch_id} → running`);
|
|
106
110
|
}
|
|
107
111
|
// Completion check: warn if expectedOutputs are missing
|
|
108
112
|
if (effectiveStatus === 'completed' && dispatch.expectedOutputs.length > 0) {
|
|
109
|
-
const existingDocs = await listDocs(project_name);
|
|
110
|
-
const state = await readState(project_name);
|
|
113
|
+
const existingDocs = await listDocs(project_name, ctx.number, ctx.dir);
|
|
114
|
+
const state = await readState(project_name, ctx.number, ctx.dir);
|
|
111
115
|
const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
|
|
112
116
|
const missingOutputs = dispatch.expectedOutputs.filter((docId) => {
|
|
113
117
|
const docDef = wf.definition.docs[docId];
|
|
@@ -149,31 +153,31 @@ export function registerReportDispatch(server, builtinDir, customDir) {
|
|
|
149
153
|
/**
|
|
150
154
|
* Resolve an existing session by agent session ID, or create a new one.
|
|
151
155
|
*/
|
|
152
|
-
async function resolveOrCreateSession(projectName, dispatch, agentSessionId, agentType, label) {
|
|
156
|
+
async function resolveOrCreateSession(projectName, iteration, dispatch, agentSessionId, agentType, label, contextDir) {
|
|
153
157
|
// If the dispatch already has a session, update it with the agent session ID
|
|
154
158
|
if (dispatch.sessionId) {
|
|
155
|
-
const sessions = await readSessions(projectName);
|
|
159
|
+
const sessions = await readSessions(projectName, iteration, contextDir);
|
|
156
160
|
const existing = sessions.find((s) => s.id === dispatch.sessionId);
|
|
157
161
|
if (existing) {
|
|
158
|
-
return await updateSession(projectName, existing.id, {
|
|
162
|
+
return await updateSession(projectName, iteration, existing.id, {
|
|
159
163
|
agentSessionId,
|
|
160
164
|
...(agentType ? { agentType } : {}),
|
|
161
165
|
...(label ? { label } : {}),
|
|
162
166
|
status: 'active',
|
|
163
|
-
});
|
|
167
|
+
}, contextDir);
|
|
164
168
|
}
|
|
165
169
|
}
|
|
166
170
|
// Check if a session with this agent session ID already exists for this role
|
|
167
|
-
const existingByAgent = await findSessionByAgentId(projectName, dispatch.role, agentSessionId);
|
|
171
|
+
const existingByAgent = await findSessionByAgentId(projectName, iteration, dispatch.role, agentSessionId, contextDir);
|
|
168
172
|
if (existingByAgent) {
|
|
169
|
-
return await updateSession(projectName, existingByAgent.id, {
|
|
173
|
+
return await updateSession(projectName, iteration, existingByAgent.id, {
|
|
170
174
|
status: 'active',
|
|
171
175
|
...(agentType ? { agentType } : {}),
|
|
172
176
|
...(label ? { label } : {}),
|
|
173
|
-
});
|
|
177
|
+
}, contextDir);
|
|
174
178
|
}
|
|
175
179
|
// Create a new session
|
|
176
|
-
const session = await createSession(projectName, dispatch.role, agentType, label);
|
|
177
|
-
return await updateSession(projectName, session.id, { agentSessionId });
|
|
180
|
+
const session = await createSession(projectName, iteration, dispatch.role, agentType, label, contextDir);
|
|
181
|
+
return await updateSession(projectName, iteration, session.id, { agentSessionId }, contextDir);
|
|
178
182
|
}
|
|
179
183
|
//# sourceMappingURL=report-dispatch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-dispatch.js","sourceRoot":"","sources":["../../src/tools/report-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACH,WAAW,EACX,cAAc,EACd,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"report-dispatch.js","sourceRoot":"","sources":["../../src/tools/report-dispatch.ts"],"names":[],"mappings":"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"}
|
package/build/tools/set-scale.js
CHANGED
|
@@ -6,14 +6,17 @@ import { z } from 'zod';
|
|
|
6
6
|
import { readState, setScale } from '../core/state.js';
|
|
7
7
|
import { loadWorkflow } from '../core/workflow.js';
|
|
8
8
|
import { readReviews } from '../core/reviews.js';
|
|
9
|
+
import { resolveActive, isError } from './utils.js';
|
|
9
10
|
export function registerSetScale(server, builtinDir, customDir) {
|
|
10
11
|
server.tool('project_set_scale', 'Set the project scale after PRD approval. Scale determines which documents are required (full/lite/skip) and enables sequential mode for medium/large projects. Scale is immutable once set — if requirements change significantly, redo the PRD.', {
|
|
11
12
|
project_name: z.string().describe('项目名称'),
|
|
12
13
|
scale: z.enum(['small', 'medium', 'large']).describe('项目规模 (small/medium/large)'),
|
|
13
14
|
}, async ({ project_name, scale }) => {
|
|
14
15
|
try {
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
const ctx = await resolveActive(project_name);
|
|
17
|
+
if (isError(ctx))
|
|
18
|
+
return ctx;
|
|
19
|
+
const state = await readState(project_name, ctx.number, ctx.dir);
|
|
17
20
|
// Guard: scale already set
|
|
18
21
|
if (state.scale !== null) {
|
|
19
22
|
return {
|
|
@@ -27,7 +30,7 @@ export function registerSetScale(server, builtinDir, customDir) {
|
|
|
27
30
|
};
|
|
28
31
|
}
|
|
29
32
|
// Guard: PRD must be approved
|
|
30
|
-
const reviews = await readReviews(project_name);
|
|
33
|
+
const reviews = await readReviews(project_name, ctx.number, ctx.dir);
|
|
31
34
|
const prdReview = reviews['prd'];
|
|
32
35
|
if (!prdReview || prdReview.status !== 'approved') {
|
|
33
36
|
const prdStatus = prdReview ? prdReview.status : '未提交';
|
|
@@ -42,7 +45,7 @@ export function registerSetScale(server, builtinDir, customDir) {
|
|
|
42
45
|
};
|
|
43
46
|
}
|
|
44
47
|
// Set scale
|
|
45
|
-
const updated = await setScale(project_name, scale);
|
|
48
|
+
const updated = await setScale(project_name, ctx.number, scale, ctx.dir);
|
|
46
49
|
// Build doc list based on scale
|
|
47
50
|
const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
|
|
48
51
|
const requiredDocs = Object.entries(wf.definition.docs)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-scale.js","sourceRoot":"","sources":["../../src/tools/set-scale.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"set-scale.js","sourceRoot":"","sources":["../../src/tools/set-scale.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import { listDocs } from '../core/docs.js';
|
|
|
15
15
|
import { readReviews } from '../core/reviews.js';
|
|
16
16
|
import { readDispatches } from '../core/dispatch.js';
|
|
17
17
|
import { getMergedOverrides, resolveDocReview } from '../core/overrides.js';
|
|
18
|
+
import { resolveActive, isError } from './utils.js';
|
|
18
19
|
export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
19
20
|
server.tool('phase_update', 'Update the status of a project phase. When a phase is completed, the next phase is automatically started. Completing a phase checks that all required doc outputs exist.', {
|
|
20
21
|
project_name: z.string().describe('Project name'),
|
|
@@ -24,11 +25,14 @@ export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
|
24
25
|
force: z.boolean().optional().describe('Force completion even if outputs are missing (default: false)'),
|
|
25
26
|
}, async ({ project_name, phase_id, status, blocked_reason, force }) => {
|
|
26
27
|
try {
|
|
28
|
+
const ctx = await resolveActive(project_name);
|
|
29
|
+
if (isError(ctx))
|
|
30
|
+
return ctx;
|
|
27
31
|
// ── Completion guards ──
|
|
28
32
|
if (status === 'completed' && !force) {
|
|
29
|
-
const currentState = await readState(project_name);
|
|
33
|
+
const currentState = await readState(project_name, ctx.number, ctx.dir);
|
|
30
34
|
const wf = await loadWorkflow(builtinDir, customDir, currentState.workflow);
|
|
31
|
-
const existingDocs = await listDocs(project_name);
|
|
35
|
+
const existingDocs = await listDocs(project_name, ctx.number, ctx.dir);
|
|
32
36
|
const phaseDef = wf.definition.phases.find((p) => p.id === phase_id);
|
|
33
37
|
const phaseIndex = wf.definition.phases.findIndex((p) => p.id === phase_id);
|
|
34
38
|
const guardErrors = [];
|
|
@@ -36,12 +40,12 @@ export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
|
36
40
|
if (currentState.scale === null) {
|
|
37
41
|
guardErrors.push('Scale 尚未设定。请先调用 project_set_scale 设定项目规模。');
|
|
38
42
|
}
|
|
39
|
-
// Guard 1: Prior phases must all be completed
|
|
43
|
+
// Guard 1: Prior phases must all be completed (skipped counts as completed)
|
|
40
44
|
if (phaseIndex > 0) {
|
|
41
45
|
const priorPhases = wf.definition.phases.slice(0, phaseIndex);
|
|
42
46
|
const incompletePriors = priorPhases.filter((pp) => {
|
|
43
47
|
const ps = currentState.phases.find((s) => s.id === pp.id);
|
|
44
|
-
return !ps || ps.status !== 'completed';
|
|
48
|
+
return !ps || (ps.status !== 'completed' && ps.status !== 'skipped');
|
|
45
49
|
});
|
|
46
50
|
if (incompletePriors.length > 0) {
|
|
47
51
|
guardErrors.push(`前序阶段未完成: ${incompletePriors.map((p) => p.id).join(', ')}`);
|
|
@@ -67,7 +71,7 @@ export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
|
67
71
|
}
|
|
68
72
|
// Guard 3: Docs requiring review must be approved
|
|
69
73
|
const overrides = await getMergedOverrides(project_name);
|
|
70
|
-
const reviews = await readReviews(project_name);
|
|
74
|
+
const reviews = await readReviews(project_name, ctx.number, ctx.dir);
|
|
71
75
|
const unapprovedDocs = phaseDef.outputs.filter((o) => {
|
|
72
76
|
const docDef = wf.definition.docs[o];
|
|
73
77
|
if (!docDef)
|
|
@@ -88,7 +92,7 @@ export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
|
88
92
|
}
|
|
89
93
|
}
|
|
90
94
|
// Guard 4: No active dispatches
|
|
91
|
-
const dispatches = await readDispatches(project_name);
|
|
95
|
+
const dispatches = await readDispatches(project_name, ctx.number, ctx.dir);
|
|
92
96
|
const activeDispatches = dispatches.filter((d) => d.status === 'dispatched' || d.status === 'running');
|
|
93
97
|
if (activeDispatches.length > 0) {
|
|
94
98
|
const activeList = activeDispatches.map((d) => `${d.id} (${d.role}, ${d.status})`).join(', ');
|
|
@@ -112,7 +116,7 @@ export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
|
112
116
|
};
|
|
113
117
|
}
|
|
114
118
|
}
|
|
115
|
-
const state = await updatePhaseStatus(project_name, phase_id, status, blocked_reason);
|
|
119
|
+
const state = await updatePhaseStatus(project_name, ctx.number, phase_id, status, blocked_reason, ctx.dir);
|
|
116
120
|
const phasesSummary = state.phases
|
|
117
121
|
.map((p) => {
|
|
118
122
|
const marker = p.id === state.currentPhase ? ' <-- current' : '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-phase.js","sourceRoot":"","sources":["../../src/tools/update-phase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"update-phase.js","sourceRoot":"","sources":["../../src/tools/update-phase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for tool handlers — resolves the active context (iteration or patch)
|
|
3
|
+
* for a project. All tools that operate on iteration/patch-level data should use this
|
|
4
|
+
* instead of directly reading entry.currentIteration.
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectEntry } from '../core/registry.js';
|
|
7
|
+
export interface ResolvedContext {
|
|
8
|
+
entry: ProjectEntry;
|
|
9
|
+
/** The iteration or patch number */
|
|
10
|
+
number: number;
|
|
11
|
+
/** "iteration" or "patch" */
|
|
12
|
+
type: 'iteration' | 'patch';
|
|
13
|
+
/** Absolute path to the context directory (iter-N/ or patch-N/) */
|
|
14
|
+
dir: string;
|
|
15
|
+
/** The raw activeContext string, e.g. "iter-1" or "patch-2" */
|
|
16
|
+
activeContext: string;
|
|
17
|
+
}
|
|
18
|
+
type ToolResult = {
|
|
19
|
+
content: {
|
|
20
|
+
type: 'text';
|
|
21
|
+
text: string;
|
|
22
|
+
}[];
|
|
23
|
+
isError?: boolean;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Resolve the active context for a project. Returns either a ResolvedContext
|
|
27
|
+
* or a ToolResult error (to be returned directly from the tool handler).
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveActive(projectName: string): Promise<ResolvedContext | ToolResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Type guard: check if the result is an error (ToolResult) or a resolved context.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isError(result: ResolvedContext | ToolResult): result is ToolResult;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for tool handlers — resolves the active context (iteration or patch)
|
|
3
|
+
* for a project. All tools that operate on iteration/patch-level data should use this
|
|
4
|
+
* instead of directly reading entry.currentIteration.
|
|
5
|
+
*/
|
|
6
|
+
import { getProject, resolveContextDir } from '../core/registry.js';
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the active context for a project. Returns either a ResolvedContext
|
|
9
|
+
* or a ToolResult error (to be returned directly from the tool handler).
|
|
10
|
+
*/
|
|
11
|
+
export async function resolveActive(projectName) {
|
|
12
|
+
const entry = await getProject(projectName);
|
|
13
|
+
if (!entry) {
|
|
14
|
+
return {
|
|
15
|
+
content: [
|
|
16
|
+
{
|
|
17
|
+
type: 'text',
|
|
18
|
+
text: `项目 "${projectName}" 未注册。请先调用 project_init 注册项目。`,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
isError: true,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (!entry.activeContext) {
|
|
25
|
+
return {
|
|
26
|
+
content: [
|
|
27
|
+
{
|
|
28
|
+
type: 'text',
|
|
29
|
+
text: `项目 "${projectName}" 尚未开始迭代或补丁。请先调用 iteration_start 或 patch_start。`,
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
isError: true,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const resolved = resolveContextDir(projectName, entry.activeContext);
|
|
36
|
+
if (!resolved) {
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: `项目 "${projectName}" 的 activeContext "${entry.activeContext}" 无法解析。数据可能已损坏。`,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
isError: true,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
entry,
|
|
49
|
+
number: resolved.number,
|
|
50
|
+
type: resolved.type,
|
|
51
|
+
dir: resolved.dir,
|
|
52
|
+
activeContext: entry.activeContext,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Type guard: check if the result is an error (ToolResult) or a resolved context.
|
|
57
|
+
*/
|
|
58
|
+
export function isError(result) {
|
|
59
|
+
return 'content' in result && !('entry' in result);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAoBpE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACnD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,OAAO,WAAW,+BAA+B;iBAC1D;aACJ;YACD,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,OAAO,WAAW,iDAAiD;iBAC5E;aACJ;YACD,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,OAAO,WAAW,sBAAsB,KAAK,CAAC,aAAa,iBAAiB;iBACrF;aACJ;YACD,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IAED,OAAO;QACH,KAAK;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,aAAa,EAAE,KAAK,CAAC,aAAa;KACrC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAoC;IACxD,OAAO,SAAS,IAAI,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;AACvD,CAAC"}
|