@agent-plan/core 0.2.19-next.4 → 0.2.19-next.5
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/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/plan-store.d.ts +32 -0
- package/dist/plan-store.d.ts.map +1 -1
- package/dist/plan-store.js +114 -33
- package/dist/refs.d.ts +23 -0
- package/dist/refs.d.ts.map +1 -1
- package/dist/refs.js +66 -0
- package/dist/schema.d.ts +34 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +7 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export * from "./naming.js";
|
|
|
2
2
|
export * from "./refs.js";
|
|
3
3
|
export * from "./schema.js";
|
|
4
4
|
export * from "./recap.js";
|
|
5
|
-
export { PlanStore, PlanStoreError, setWriteBusyHook, setWriteNotifyHook, migrateToUuids, withFeatureLock, type PhaseHandoffSummary } from "./plan-store.js";
|
|
5
|
+
export { PlanStore, PlanStoreError, setWriteBusyHook, setWriteNotifyHook, migrateToUuids, migrateToGlobalSequence, withFeatureLock, type PhaseHandoffSummary } from "./plan-store.js";
|
|
6
6
|
export { PlanRenderer } from "./renderer.js";
|
|
7
7
|
export { ExportService } from "./export-service.js";
|
|
8
8
|
export type { CodebaseProfile, ResumeFocus, ActivityEntry, ActivityLog, AmbientFacts } from "./schema.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,uBAAuB,EAAE,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtL,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,6 @@ export * from "./naming.js";
|
|
|
2
2
|
export * from "./refs.js";
|
|
3
3
|
export * from "./schema.js";
|
|
4
4
|
export * from "./recap.js";
|
|
5
|
-
export { PlanStore, PlanStoreError, setWriteBusyHook, setWriteNotifyHook, migrateToUuids, withFeatureLock } from "./plan-store.js";
|
|
5
|
+
export { PlanStore, PlanStoreError, setWriteBusyHook, setWriteNotifyHook, migrateToUuids, migrateToGlobalSequence, withFeatureLock } from "./plan-store.js";
|
|
6
6
|
export { PlanRenderer } from "./renderer.js";
|
|
7
7
|
export { ExportService } from "./export-service.js";
|
package/dist/plan-store.d.ts
CHANGED
|
@@ -17,6 +17,26 @@ export interface PhaseHandoffSummary {
|
|
|
17
17
|
firstLine: string;
|
|
18
18
|
}
|
|
19
19
|
export declare function migrateToUuids(store: PlanStore): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* One-time idempotent migration to GLOBAL F/P/T numbering.
|
|
22
|
+
*
|
|
23
|
+
* Legacy plans assign Phase.number per-feature and Task.number per-phase, so
|
|
24
|
+
* every feature has a P001 and every phase has a T001 (ambiguous in chat/handoffs).
|
|
25
|
+
* This renumbers ALL features/phases/tasks by `createdAt` asc (stable tiebreak by
|
|
26
|
+
* id) into a single project-wide 1..N sequence and sets the monotonic project
|
|
27
|
+
* counters (nextFeatureNumber/nextPhaseNumber/nextTaskNumber).
|
|
28
|
+
*
|
|
29
|
+
* Idempotent: if no duplicate phase/task/feature numbers exist across the
|
|
30
|
+
* project, the plan is already global → no renumber writes happen (only the
|
|
31
|
+
* counters are ensured, in case project.json predates them). MUST run before
|
|
32
|
+
* ensureStructureOrdering (which no longer renumbers — numbers are stable).
|
|
33
|
+
*/
|
|
34
|
+
export declare function migrateToGlobalSequence(store: PlanStore): Promise<{
|
|
35
|
+
migrated: boolean;
|
|
36
|
+
phases: number;
|
|
37
|
+
tasks: number;
|
|
38
|
+
features: number;
|
|
39
|
+
}>;
|
|
20
40
|
export declare class PlanStore {
|
|
21
41
|
readonly root: string;
|
|
22
42
|
private autoSync;
|
|
@@ -67,6 +87,18 @@ export declare class PlanStore {
|
|
|
67
87
|
exists(): Promise<boolean>;
|
|
68
88
|
loadManifest(): Promise<Manifest>;
|
|
69
89
|
loadProject(): Promise<Project>;
|
|
90
|
+
/**
|
|
91
|
+
* Allocate the next global sequence number for a feature/phase/task.
|
|
92
|
+
* Reads the monotonic counter from project.json, increments it, persists,
|
|
93
|
+
* and returns the allocated number. MUST be called within withFeatureLock
|
|
94
|
+
* (adapters create entities inside a lock) so the counter is race-free.
|
|
95
|
+
* The counter never reuses a number — deletions leave gaps (by design:
|
|
96
|
+
* stable references survive deletion).
|
|
97
|
+
*/
|
|
98
|
+
allocFeatureNumber(): Promise<number>;
|
|
99
|
+
allocPhaseNumber(): Promise<number>;
|
|
100
|
+
allocTaskNumber(): Promise<number>;
|
|
101
|
+
private allocSeqNumber;
|
|
70
102
|
loadPhase(phaseId: string): Promise<Phase>;
|
|
71
103
|
/** Read raw feature files WITHOUT the derived `status` field. Used
|
|
72
104
|
* internally so loadFeatures/loadAll can derive status from phases without
|
package/dist/plan-store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-store.d.ts","sourceRoot":"","sources":["../src/plan-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,gBAAgB,EAGrB,KAAK,QAAQ,EAEb,KAAK,KAAK,EAEV,KAAK,aAAa,EAElB,KAAK,OAAO,EAEZ,KAAK,oBAAoB,EAIzB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAOrB,qBAAa,cAAe,SAAQ,KAAK;aAGrB,KAAK,CAAC,EAAE,OAAO;gBAD/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAeD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAElF;AAKD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAEvE;AAaD,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAStF;AAmDD,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEpE;AA4BD,qBAAa,SAAS;IACpB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAO1B,OAAO,CAAC,eAAe,CAAS;gBAEpB,IAAI,EAAE,MAAM;IAIxB;;4EAEwE;IACxE,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAEpC;;;2BAGuB;YACT,UAAU;IAUxB,2EAA2E;IACrE,oBAAoB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI/D;;oFAEgF;IAC1E,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAIrC,aAAa;IAK3B,OAAO,CAAC,cAAc;
|
|
1
|
+
{"version":3,"file":"plan-store.d.ts","sourceRoot":"","sources":["../src/plan-store.ts"],"names":[],"mappings":"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"}
|
package/dist/plan-store.js
CHANGED
|
@@ -176,6 +176,91 @@ export async function migrateToUuids(store) {
|
|
|
176
176
|
await store.writeGenerated();
|
|
177
177
|
});
|
|
178
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* One-time idempotent migration to GLOBAL F/P/T numbering.
|
|
181
|
+
*
|
|
182
|
+
* Legacy plans assign Phase.number per-feature and Task.number per-phase, so
|
|
183
|
+
* every feature has a P001 and every phase has a T001 (ambiguous in chat/handoffs).
|
|
184
|
+
* This renumbers ALL features/phases/tasks by `createdAt` asc (stable tiebreak by
|
|
185
|
+
* id) into a single project-wide 1..N sequence and sets the monotonic project
|
|
186
|
+
* counters (nextFeatureNumber/nextPhaseNumber/nextTaskNumber).
|
|
187
|
+
*
|
|
188
|
+
* Idempotent: if no duplicate phase/task/feature numbers exist across the
|
|
189
|
+
* project, the plan is already global → no renumber writes happen (only the
|
|
190
|
+
* counters are ensured, in case project.json predates them). MUST run before
|
|
191
|
+
* ensureStructureOrdering (which no longer renumbers — numbers are stable).
|
|
192
|
+
*/
|
|
193
|
+
export async function migrateToGlobalSequence(store) {
|
|
194
|
+
return store.runBatchForMigration(async () => {
|
|
195
|
+
const ws = await store.loadAll();
|
|
196
|
+
const phases = ws.phases;
|
|
197
|
+
const features = ws.features.features;
|
|
198
|
+
const project = ws.project;
|
|
199
|
+
const allTasks = [];
|
|
200
|
+
for (const phase of phases)
|
|
201
|
+
for (const task of phase.tasks)
|
|
202
|
+
allTasks.push({ phase, task });
|
|
203
|
+
const hasDupes = (nums) => new Set(nums).size !== nums.length;
|
|
204
|
+
const phaseDupes = hasDupes(phases.map((p) => p.number));
|
|
205
|
+
const taskDupes = hasDupes(allTasks.map((x) => x.task.number));
|
|
206
|
+
const featureDupes = hasDupes(features.map((f) => f.number));
|
|
207
|
+
const maxP = phases.reduce((m, p) => Math.max(m, p.number), 0);
|
|
208
|
+
const maxT = allTasks.reduce((m, x) => Math.max(m, x.task.number), 0);
|
|
209
|
+
const maxF = features.reduce((m, f) => Math.max(m, f.number), 0);
|
|
210
|
+
if (!phaseDupes && !taskDupes && !featureDupes) {
|
|
211
|
+
// Already global. Ensure counters are set (project.json may predate them).
|
|
212
|
+
let changed = false;
|
|
213
|
+
if (project.nextPhaseNumber <= maxP) {
|
|
214
|
+
project.nextPhaseNumber = maxP + 1;
|
|
215
|
+
changed = true;
|
|
216
|
+
}
|
|
217
|
+
if (project.nextTaskNumber <= maxT) {
|
|
218
|
+
project.nextTaskNumber = maxT + 1;
|
|
219
|
+
changed = true;
|
|
220
|
+
}
|
|
221
|
+
if (project.nextFeatureNumber <= maxF) {
|
|
222
|
+
project.nextFeatureNumber = maxF + 1;
|
|
223
|
+
changed = true;
|
|
224
|
+
}
|
|
225
|
+
if (changed)
|
|
226
|
+
await store.saveProject(project);
|
|
227
|
+
return { migrated: false, phases: phases.length, tasks: allTasks.length, features: features.length };
|
|
228
|
+
}
|
|
229
|
+
const renumber = (arr) => arr
|
|
230
|
+
.slice()
|
|
231
|
+
.sort((a, b) => a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id))
|
|
232
|
+
.map((x, i) => ({ ...x, number: i + 1 }));
|
|
233
|
+
const newFeatures = renumber(features);
|
|
234
|
+
const newPhases = renumber(phases);
|
|
235
|
+
const numberedTasks = renumber(allTasks.map((x) => x.task));
|
|
236
|
+
// Reassemble renumbered tasks into their phases, preserving each phase's task order.
|
|
237
|
+
const tasksByPhase = new Map();
|
|
238
|
+
for (let i = 0; i < allTasks.length; i++) {
|
|
239
|
+
const pid = allTasks[i].phase.id;
|
|
240
|
+
const bucket = tasksByPhase.get(pid) ?? [];
|
|
241
|
+
bucket.push(numberedTasks[i]);
|
|
242
|
+
tasksByPhase.set(pid, bucket);
|
|
243
|
+
}
|
|
244
|
+
const finalPhases = newPhases.map((p) => {
|
|
245
|
+
const tasks = tasksByPhase.get(p.id) ?? [];
|
|
246
|
+
const order = new Map(tasks.map((t) => [t.id, t]));
|
|
247
|
+
const ordered = p.taskIds.map((id) => order.get(id)).filter((t) => Boolean(t));
|
|
248
|
+
for (const t of tasks.sort((a, b) => a.number - b.number))
|
|
249
|
+
if (!ordered.includes(t))
|
|
250
|
+
ordered.push(t);
|
|
251
|
+
return { ...p, tasks: ordered, taskIds: ordered.map((t) => t.id) };
|
|
252
|
+
});
|
|
253
|
+
await store.saveFeatures({ features: newFeatures });
|
|
254
|
+
for (const p of finalPhases)
|
|
255
|
+
await store.savePhase(p);
|
|
256
|
+
project.nextFeatureNumber = newFeatures.length + 1;
|
|
257
|
+
project.nextPhaseNumber = newPhases.length + 1;
|
|
258
|
+
project.nextTaskNumber = numberedTasks.length + 1;
|
|
259
|
+
await store.saveProject(project);
|
|
260
|
+
await store.writeGenerated();
|
|
261
|
+
return { migrated: true, phases: newPhases.length, tasks: numberedTasks.length, features: newFeatures.length };
|
|
262
|
+
});
|
|
263
|
+
}
|
|
179
264
|
async function readJson(path, schema) {
|
|
180
265
|
try {
|
|
181
266
|
const raw = await readFile(path, "utf-8");
|
|
@@ -240,24 +325,13 @@ export class PlanStore {
|
|
|
240
325
|
// save. Kept so existing save* call sites compile unchanged.
|
|
241
326
|
}
|
|
242
327
|
normalizeTasks(tasks) {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
if (task.number !== nextNumber)
|
|
247
|
-
changed = true;
|
|
248
|
-
return { ...task, number: nextNumber };
|
|
249
|
-
});
|
|
250
|
-
return { tasks: normalized, changed };
|
|
328
|
+
// Numbers are a STABLE global sequence (assigned once at create from project.nextTaskNumber).
|
|
329
|
+
// Do NOT renumber here — renumbering would break references after deletions.
|
|
330
|
+
return { tasks, changed: false };
|
|
251
331
|
}
|
|
252
332
|
normalizeFeaturesDocument(doc) {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
const nextNumber = index + 1;
|
|
256
|
-
if (feature.number !== nextNumber)
|
|
257
|
-
changed = true;
|
|
258
|
-
return { ...feature, number: nextNumber };
|
|
259
|
-
});
|
|
260
|
-
return { doc: { features: normalized }, changed };
|
|
333
|
+
// Numbers are a STABLE global sequence (assigned once at create from project.nextFeatureNumber).
|
|
334
|
+
return { doc, changed: false };
|
|
261
335
|
}
|
|
262
336
|
normalizePhaseDocument(phase) {
|
|
263
337
|
const { tasks, changed } = this.normalizeTasks(phase.tasks);
|
|
@@ -287,10 +361,7 @@ export class PlanStore {
|
|
|
287
361
|
orphanPhases.push(phase);
|
|
288
362
|
}
|
|
289
363
|
}
|
|
290
|
-
const normalizedFeatures = featuresDoc.features.map((feature
|
|
291
|
-
const nextFeatureNumber = featureIndex + 1;
|
|
292
|
-
if (feature.number !== nextFeatureNumber)
|
|
293
|
-
changed = true;
|
|
364
|
+
const normalizedFeatures = featuresDoc.features.map((feature) => {
|
|
294
365
|
const linked = feature.phaseIds.map((id) => phaseById.get(id)).filter((phase) => Boolean(phase));
|
|
295
366
|
const linkedIds = new Set(linked.map((phase) => phase.id));
|
|
296
367
|
const inferred = (phasesByFeature.get(feature.id) ?? []).filter((phase) => !linkedIds.has(phase.id));
|
|
@@ -299,12 +370,7 @@ export class PlanStore {
|
|
|
299
370
|
if (normalizedPhaseIds.length !== feature.phaseIds.length || normalizedPhaseIds.some((id, index) => id !== feature.phaseIds[index])) {
|
|
300
371
|
changed = true;
|
|
301
372
|
}
|
|
302
|
-
orderedPhases.forEach((phase
|
|
303
|
-
const nextPhaseNumber = index + 1;
|
|
304
|
-
if (phase.number !== nextPhaseNumber) {
|
|
305
|
-
phase.number = nextPhaseNumber;
|
|
306
|
-
changed = true;
|
|
307
|
-
}
|
|
373
|
+
orderedPhases.forEach((phase) => {
|
|
308
374
|
const normalizedPhase = this.normalizePhaseDocument(phase);
|
|
309
375
|
if (normalizedPhase.changed) {
|
|
310
376
|
phase.tasks = normalizedPhase.phase.tasks;
|
|
@@ -314,16 +380,10 @@ export class PlanStore {
|
|
|
314
380
|
});
|
|
315
381
|
return {
|
|
316
382
|
...feature,
|
|
317
|
-
number: nextFeatureNumber,
|
|
318
383
|
phaseIds: normalizedPhaseIds,
|
|
319
384
|
};
|
|
320
385
|
});
|
|
321
|
-
orphanPhases.forEach((phase
|
|
322
|
-
const nextPhaseNumber = index + 1;
|
|
323
|
-
if (phase.number !== nextPhaseNumber) {
|
|
324
|
-
phase.number = nextPhaseNumber;
|
|
325
|
-
changed = true;
|
|
326
|
-
}
|
|
386
|
+
orphanPhases.forEach((phase) => {
|
|
327
387
|
const normalizedPhase = this.normalizePhaseDocument(phase);
|
|
328
388
|
if (normalizedPhase.changed) {
|
|
329
389
|
phase.tasks = normalizedPhase.phase.tasks;
|
|
@@ -453,6 +513,9 @@ export class PlanStore {
|
|
|
453
513
|
beforeTaskStart: [],
|
|
454
514
|
afterPhaseComplete: [],
|
|
455
515
|
},
|
|
516
|
+
nextFeatureNumber: 1,
|
|
517
|
+
nextPhaseNumber: 1,
|
|
518
|
+
nextTaskNumber: 1,
|
|
456
519
|
});
|
|
457
520
|
await this.saveRequirements({ requirements: [] });
|
|
458
521
|
await this.saveFeatures({ features: [] });
|
|
@@ -517,6 +580,24 @@ export class PlanStore {
|
|
|
517
580
|
async loadProject() {
|
|
518
581
|
return readJson(this.projectPath(), ProjectSchema);
|
|
519
582
|
}
|
|
583
|
+
/**
|
|
584
|
+
* Allocate the next global sequence number for a feature/phase/task.
|
|
585
|
+
* Reads the monotonic counter from project.json, increments it, persists,
|
|
586
|
+
* and returns the allocated number. MUST be called within withFeatureLock
|
|
587
|
+
* (adapters create entities inside a lock) so the counter is race-free.
|
|
588
|
+
* The counter never reuses a number — deletions leave gaps (by design:
|
|
589
|
+
* stable references survive deletion).
|
|
590
|
+
*/
|
|
591
|
+
async allocFeatureNumber() { return this.allocSeqNumber("nextFeatureNumber"); }
|
|
592
|
+
async allocPhaseNumber() { return this.allocSeqNumber("nextPhaseNumber"); }
|
|
593
|
+
async allocTaskNumber() { return this.allocSeqNumber("nextTaskNumber"); }
|
|
594
|
+
async allocSeqNumber(key) {
|
|
595
|
+
const project = await this.loadProject();
|
|
596
|
+
const n = project[key];
|
|
597
|
+
project[key] = n + 1;
|
|
598
|
+
await this.saveProject(project);
|
|
599
|
+
return n;
|
|
600
|
+
}
|
|
520
601
|
async loadPhase(phaseId) {
|
|
521
602
|
const raw = await readJson(this.phasePath(phaseId), PhaseSchema);
|
|
522
603
|
const normalized = this.normalizePhaseDocument(raw).phase;
|
package/dist/refs.d.ts
CHANGED
|
@@ -21,4 +21,27 @@ import type { Phase, Feature } from "./schema.js";
|
|
|
21
21
|
* @param ref the human-facing ref (P00x / P00x(F00x) / UUID / title)
|
|
22
22
|
*/
|
|
23
23
|
export declare function findPhaseByRef(phases: Phase[], features: Feature[], ref: string): Phase | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Resolve a task reference to { phase, task }. Harness-agnostic, shared by all
|
|
26
|
+
* adapters so resolution semantics are identical everywhere.
|
|
27
|
+
*
|
|
28
|
+
* Supported task refs (case-insensitive):
|
|
29
|
+
* - UUID: "bd6ed366-..." -> task.id
|
|
30
|
+
* - Short: "T003" | "t3" -> task.number (GLOBALLY unique under the
|
|
31
|
+
* new global-sequence numbering; bare T00x
|
|
32
|
+
* is unambiguous across all phases)
|
|
33
|
+
* - Compos: "F001/P002/T003" -> feature/phase/task numbers with parent
|
|
34
|
+
* "P002(F001)/T003" validation (feature + phase must match)
|
|
35
|
+
* "P002/T003"
|
|
36
|
+
* - ShortId: "UUXD1" -> task.shortId (5-char, globally unique)
|
|
37
|
+
* - Title: exact match, then includes (backward-compat fallback)
|
|
38
|
+
*
|
|
39
|
+
* Returns `undefined` when not found, or when a composite parent (phase/feature)
|
|
40
|
+
* does not match the resolved task's parent.
|
|
41
|
+
*/
|
|
42
|
+
import type { Task } from "./schema.js";
|
|
43
|
+
export declare function findTaskByRef(phases: Phase[], features: Feature[], ref: string): {
|
|
44
|
+
phase: Phase;
|
|
45
|
+
task: Task;
|
|
46
|
+
} | undefined;
|
|
24
47
|
//# sourceMappingURL=refs.d.ts.map
|
package/dist/refs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAKlD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,OAAO,EAAE,EACnB,GAAG,EAAE,MAAM,GACV,KAAK,GAAG,SAAS,CAgCnB"}
|
|
1
|
+
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAKlD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,OAAO,EAAE,EACnB,GAAG,EAAE,MAAM,GACV,KAAK,GAAG,SAAS,CAgCnB;AACD;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAexC,wBAAgB,aAAa,CAC3B,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,OAAO,EAAE,EACnB,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG,SAAS,CAiD1C"}
|
package/dist/refs.js
CHANGED
|
@@ -40,3 +40,69 @@ export function findPhaseByRef(phases, features, ref) {
|
|
|
40
40
|
return (phases.find((p) => p.title.toLowerCase() === normalized) ??
|
|
41
41
|
phases.find((p) => p.title.toLowerCase().includes(normalized)));
|
|
42
42
|
}
|
|
43
|
+
// Extract optional feature/phase/task numbers from a composite ref.
|
|
44
|
+
// Accepts 1+ digits so "t3" == "t003". Numbers are GLOBAL (post-migration).
|
|
45
|
+
function parseTaskComposite(ref) {
|
|
46
|
+
const t = ref.match(/t0*(\d+)/);
|
|
47
|
+
const p = ref.match(/p0*(\d+)/);
|
|
48
|
+
const f = ref.match(/f0*(\d+)/);
|
|
49
|
+
return {
|
|
50
|
+
taskNum: t ? parseInt(t[1], 10) : undefined,
|
|
51
|
+
phaseNum: p ? parseInt(p[1], 10) : undefined,
|
|
52
|
+
featureNum: f ? parseInt(f[1], 10) : undefined,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function findTaskByRef(phases, features, ref) {
|
|
56
|
+
const normalized = ref.trim().toLowerCase();
|
|
57
|
+
if (!normalized)
|
|
58
|
+
return undefined;
|
|
59
|
+
// 1. UUID (exact)
|
|
60
|
+
for (const phase of phases) {
|
|
61
|
+
const task = phase.tasks.find((t) => t.id.toLowerCase() === normalized);
|
|
62
|
+
if (task)
|
|
63
|
+
return { phase, task };
|
|
64
|
+
}
|
|
65
|
+
// 2. Composite / short ref with a T segment
|
|
66
|
+
const { featureNum, phaseNum, taskNum } = parseTaskComposite(normalized);
|
|
67
|
+
if (taskNum !== undefined) {
|
|
68
|
+
if (phaseNum !== undefined) {
|
|
69
|
+
// Composite: validate phase (and feature if present), then resolve task by number.
|
|
70
|
+
const phase = phases.find((p) => p.number === phaseNum);
|
|
71
|
+
if (!phase)
|
|
72
|
+
return undefined;
|
|
73
|
+
if (featureNum !== undefined) {
|
|
74
|
+
const feat = features.find((f) => f.number === featureNum);
|
|
75
|
+
if (!feat || phase.featureId !== feat.id)
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
const task = phase.tasks.find((t) => t.number === taskNum);
|
|
79
|
+
if (task)
|
|
80
|
+
return { phase, task };
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
// Bare T00x — globally unique under the new numbering. Find the one task.
|
|
84
|
+
for (const phase of phases) {
|
|
85
|
+
const task = phase.tasks.find((t) => t.number === taskNum);
|
|
86
|
+
if (task)
|
|
87
|
+
return { phase, task };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// 3. ShortId (5-char)
|
|
91
|
+
for (const phase of phases) {
|
|
92
|
+
const task = phase.tasks.find((t) => t.shortId && t.shortId.toLowerCase() === normalized);
|
|
93
|
+
if (task)
|
|
94
|
+
return { phase, task };
|
|
95
|
+
}
|
|
96
|
+
// 4. Title fallback (backward compatibility)
|
|
97
|
+
for (const phase of phases) {
|
|
98
|
+
const exact = phase.tasks.find((t) => t.title.toLowerCase() === normalized);
|
|
99
|
+
if (exact)
|
|
100
|
+
return { phase, task: exact };
|
|
101
|
+
}
|
|
102
|
+
for (const phase of phases) {
|
|
103
|
+
const incl = phase.tasks.find((t) => t.title.toLowerCase().includes(normalized));
|
|
104
|
+
if (incl)
|
|
105
|
+
return { phase, task: incl };
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
package/dist/schema.d.ts
CHANGED
|
@@ -320,6 +320,10 @@ export declare const ProjectSchema: z.ZodObject<{
|
|
|
320
320
|
rationale?: string | undefined;
|
|
321
321
|
implementationNotes?: string | undefined;
|
|
322
322
|
}>, "many">>;
|
|
323
|
+
/** Monotonic global sequence counters — assigned at creation, never reused (gaps on delete). */
|
|
324
|
+
nextFeatureNumber: z.ZodDefault<z.ZodNumber>;
|
|
325
|
+
nextPhaseNumber: z.ZodDefault<z.ZodNumber>;
|
|
326
|
+
nextTaskNumber: z.ZodDefault<z.ZodNumber>;
|
|
323
327
|
}, "strip", z.ZodTypeAny, {
|
|
324
328
|
name: string;
|
|
325
329
|
goal: string;
|
|
@@ -346,6 +350,9 @@ export declare const ProjectSchema: z.ZodObject<{
|
|
|
346
350
|
implementationNotes: string;
|
|
347
351
|
acceptedAt: string;
|
|
348
352
|
}[];
|
|
353
|
+
nextFeatureNumber: number;
|
|
354
|
+
nextPhaseNumber: number;
|
|
355
|
+
nextTaskNumber: number;
|
|
349
356
|
}, {
|
|
350
357
|
name: string;
|
|
351
358
|
workflowRules: {
|
|
@@ -372,6 +379,9 @@ export declare const ProjectSchema: z.ZodObject<{
|
|
|
372
379
|
rationale?: string | undefined;
|
|
373
380
|
implementationNotes?: string | undefined;
|
|
374
381
|
}[] | undefined;
|
|
382
|
+
nextFeatureNumber?: number | undefined;
|
|
383
|
+
nextPhaseNumber?: number | undefined;
|
|
384
|
+
nextTaskNumber?: number | undefined;
|
|
375
385
|
}>;
|
|
376
386
|
export declare const SubtaskStatusSchema: z.ZodEnum<["planned", "in-progress", "done", "blocked", "canceled", "rejected", "deferred", "waiting"]>;
|
|
377
387
|
export declare const TaskStatusSchema: z.ZodEnum<["planned", "in-progress", "done", "blocked", "canceled", "rejected", "deferred", "waiting"]>;
|
|
@@ -447,6 +457,7 @@ export declare const StatusLogEntrySchema: z.ZodObject<{
|
|
|
447
457
|
export declare const TaskSchema: z.ZodEffects<z.ZodObject<{
|
|
448
458
|
id: z.ZodString;
|
|
449
459
|
phaseId: z.ZodString;
|
|
460
|
+
/** Global project-wide task sequence (assigned once at creation from project.nextTaskNumber; stable, gaps on delete). Bare T00x is unambiguous. */
|
|
450
461
|
number: z.ZodDefault<z.ZodNumber>;
|
|
451
462
|
shortId: z.ZodDefault<z.ZodString>;
|
|
452
463
|
priority: z.ZodDefault<z.ZodNumber>;
|
|
@@ -743,6 +754,7 @@ export declare const HandoffHistoryEntrySchema: z.ZodObject<{
|
|
|
743
754
|
export declare const PhaseSchema: z.ZodObject<{
|
|
744
755
|
id: z.ZodString;
|
|
745
756
|
featureId: z.ZodOptional<z.ZodString>;
|
|
757
|
+
/** Global project-wide phase sequence (assigned once at creation from project.nextPhaseNumber; stable, gaps on delete). Bare P00x is unambiguous. */
|
|
746
758
|
number: z.ZodNumber;
|
|
747
759
|
shortId: z.ZodDefault<z.ZodString>;
|
|
748
760
|
priority: z.ZodDefault<z.ZodNumber>;
|
|
@@ -788,6 +800,7 @@ export declare const PhaseSchema: z.ZodObject<{
|
|
|
788
800
|
tasks: z.ZodDefault<z.ZodArray<z.ZodEffects<z.ZodObject<{
|
|
789
801
|
id: z.ZodString;
|
|
790
802
|
phaseId: z.ZodString;
|
|
803
|
+
/** Global project-wide task sequence (assigned once at creation from project.nextTaskNumber; stable, gaps on delete). Bare T00x is unambiguous. */
|
|
791
804
|
number: z.ZodDefault<z.ZodNumber>;
|
|
792
805
|
shortId: z.ZodDefault<z.ZodString>;
|
|
793
806
|
priority: z.ZodDefault<z.ZodNumber>;
|
|
@@ -1273,6 +1286,7 @@ export declare const PhaseSchema: z.ZodObject<{
|
|
|
1273
1286
|
}>;
|
|
1274
1287
|
export declare const FeatureSchema: z.ZodObject<{
|
|
1275
1288
|
id: z.ZodString;
|
|
1289
|
+
/** Global project-wide feature sequence (assigned once at creation from project.nextFeatureNumber; stable, gaps on delete). */
|
|
1276
1290
|
number: z.ZodDefault<z.ZodNumber>;
|
|
1277
1291
|
shortId: z.ZodDefault<z.ZodString>;
|
|
1278
1292
|
priority: z.ZodDefault<z.ZodNumber>;
|
|
@@ -1367,6 +1381,7 @@ export declare const FeatureSchema: z.ZodObject<{
|
|
|
1367
1381
|
export declare const FeaturesDocumentSchema: z.ZodObject<{
|
|
1368
1382
|
features: z.ZodArray<z.ZodObject<{
|
|
1369
1383
|
id: z.ZodString;
|
|
1384
|
+
/** Global project-wide feature sequence (assigned once at creation from project.nextFeatureNumber; stable, gaps on delete). */
|
|
1370
1385
|
number: z.ZodDefault<z.ZodNumber>;
|
|
1371
1386
|
shortId: z.ZodDefault<z.ZodString>;
|
|
1372
1387
|
priority: z.ZodDefault<z.ZodNumber>;
|
|
@@ -1769,6 +1784,10 @@ export declare const PlanWorkspaceSchema: z.ZodObject<{
|
|
|
1769
1784
|
rationale?: string | undefined;
|
|
1770
1785
|
implementationNotes?: string | undefined;
|
|
1771
1786
|
}>, "many">>;
|
|
1787
|
+
/** Monotonic global sequence counters — assigned at creation, never reused (gaps on delete). */
|
|
1788
|
+
nextFeatureNumber: z.ZodDefault<z.ZodNumber>;
|
|
1789
|
+
nextPhaseNumber: z.ZodDefault<z.ZodNumber>;
|
|
1790
|
+
nextTaskNumber: z.ZodDefault<z.ZodNumber>;
|
|
1772
1791
|
}, "strip", z.ZodTypeAny, {
|
|
1773
1792
|
name: string;
|
|
1774
1793
|
goal: string;
|
|
@@ -1795,6 +1814,9 @@ export declare const PlanWorkspaceSchema: z.ZodObject<{
|
|
|
1795
1814
|
implementationNotes: string;
|
|
1796
1815
|
acceptedAt: string;
|
|
1797
1816
|
}[];
|
|
1817
|
+
nextFeatureNumber: number;
|
|
1818
|
+
nextPhaseNumber: number;
|
|
1819
|
+
nextTaskNumber: number;
|
|
1798
1820
|
}, {
|
|
1799
1821
|
name: string;
|
|
1800
1822
|
workflowRules: {
|
|
@@ -1821,10 +1843,14 @@ export declare const PlanWorkspaceSchema: z.ZodObject<{
|
|
|
1821
1843
|
rationale?: string | undefined;
|
|
1822
1844
|
implementationNotes?: string | undefined;
|
|
1823
1845
|
}[] | undefined;
|
|
1846
|
+
nextFeatureNumber?: number | undefined;
|
|
1847
|
+
nextPhaseNumber?: number | undefined;
|
|
1848
|
+
nextTaskNumber?: number | undefined;
|
|
1824
1849
|
}>;
|
|
1825
1850
|
features: z.ZodObject<{
|
|
1826
1851
|
features: z.ZodArray<z.ZodObject<{
|
|
1827
1852
|
id: z.ZodString;
|
|
1853
|
+
/** Global project-wide feature sequence (assigned once at creation from project.nextFeatureNumber; stable, gaps on delete). */
|
|
1828
1854
|
number: z.ZodDefault<z.ZodNumber>;
|
|
1829
1855
|
shortId: z.ZodDefault<z.ZodString>;
|
|
1830
1856
|
priority: z.ZodDefault<z.ZodNumber>;
|
|
@@ -2077,6 +2103,7 @@ export declare const PlanWorkspaceSchema: z.ZodObject<{
|
|
|
2077
2103
|
phases: z.ZodArray<z.ZodObject<{
|
|
2078
2104
|
id: z.ZodString;
|
|
2079
2105
|
featureId: z.ZodOptional<z.ZodString>;
|
|
2106
|
+
/** Global project-wide phase sequence (assigned once at creation from project.nextPhaseNumber; stable, gaps on delete). Bare P00x is unambiguous. */
|
|
2080
2107
|
number: z.ZodNumber;
|
|
2081
2108
|
shortId: z.ZodDefault<z.ZodString>;
|
|
2082
2109
|
priority: z.ZodDefault<z.ZodNumber>;
|
|
@@ -2122,6 +2149,7 @@ export declare const PlanWorkspaceSchema: z.ZodObject<{
|
|
|
2122
2149
|
tasks: z.ZodDefault<z.ZodArray<z.ZodEffects<z.ZodObject<{
|
|
2123
2150
|
id: z.ZodString;
|
|
2124
2151
|
phaseId: z.ZodString;
|
|
2152
|
+
/** Global project-wide task sequence (assigned once at creation from project.nextTaskNumber; stable, gaps on delete). Bare T00x is unambiguous. */
|
|
2125
2153
|
number: z.ZodDefault<z.ZodNumber>;
|
|
2126
2154
|
shortId: z.ZodDefault<z.ZodString>;
|
|
2127
2155
|
priority: z.ZodDefault<z.ZodNumber>;
|
|
@@ -2687,6 +2715,9 @@ export declare const PlanWorkspaceSchema: z.ZodObject<{
|
|
|
2687
2715
|
implementationNotes: string;
|
|
2688
2716
|
acceptedAt: string;
|
|
2689
2717
|
}[];
|
|
2718
|
+
nextFeatureNumber: number;
|
|
2719
|
+
nextPhaseNumber: number;
|
|
2720
|
+
nextTaskNumber: number;
|
|
2690
2721
|
};
|
|
2691
2722
|
phases: {
|
|
2692
2723
|
number: number;
|
|
@@ -2859,6 +2890,9 @@ export declare const PlanWorkspaceSchema: z.ZodObject<{
|
|
|
2859
2890
|
rationale?: string | undefined;
|
|
2860
2891
|
implementationNotes?: string | undefined;
|
|
2861
2892
|
}[] | undefined;
|
|
2893
|
+
nextFeatureNumber?: number | undefined;
|
|
2894
|
+
nextPhaseNumber?: number | undefined;
|
|
2895
|
+
nextTaskNumber?: number | undefined;
|
|
2862
2896
|
};
|
|
2863
2897
|
phases: {
|
|
2864
2898
|
number: number;
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,eAAe,aAAwB,CAAC;AACrD,eAAO,MAAM,UAAU,aAAiD,CAAC;AAEzE,eAAO,MAAM,kBAAkB;;;;;;;;;EAG7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;EAK7B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBhC,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;IAK5B;;mFAE+E;;;;;;;;;;;;;;;;;;;;;;;;;;EAM/E,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;EAM9B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE5B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;EAMzB,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAI9B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;EAOjC,CAAC;AAEH,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
CHANGED
|
@@ -91,6 +91,10 @@ export const ProjectSchema = z.object({
|
|
|
91
91
|
chatLanguage: z.string().default(""),
|
|
92
92
|
workflowRules: WorkflowRulesSchema,
|
|
93
93
|
acceptedDecisions: z.array(AcceptedDecisionSchema).default([]),
|
|
94
|
+
/** Monotonic global sequence counters — assigned at creation, never reused (gaps on delete). */
|
|
95
|
+
nextFeatureNumber: z.number().int().positive().default(1),
|
|
96
|
+
nextPhaseNumber: z.number().int().positive().default(1),
|
|
97
|
+
nextTaskNumber: z.number().int().positive().default(1),
|
|
94
98
|
});
|
|
95
99
|
export const SubtaskStatusSchema = z.enum(["planned", "in-progress", "done", "blocked", "canceled", "rejected", "deferred", "waiting"]);
|
|
96
100
|
export const TaskStatusSchema = z.enum(["planned", "in-progress", "done", "blocked", "canceled", "rejected", "deferred", "waiting"]);
|
|
@@ -141,6 +145,7 @@ export const StatusLogEntrySchema = z.object({
|
|
|
141
145
|
export const TaskSchema = z.object({
|
|
142
146
|
id: z.string(),
|
|
143
147
|
phaseId: z.string(),
|
|
148
|
+
/** Global project-wide task sequence (assigned once at creation from project.nextTaskNumber; stable, gaps on delete). Bare T00x is unambiguous. */
|
|
144
149
|
number: z.number().int().nonnegative().default(0),
|
|
145
150
|
shortId: z.string().regex(/^(|[A-Z2-9]{5})$/).default(""),
|
|
146
151
|
priority: z.number().int().nonnegative().default(0),
|
|
@@ -177,6 +182,7 @@ export const HandoffHistoryEntrySchema = z.object({
|
|
|
177
182
|
export const PhaseSchema = z.object({
|
|
178
183
|
id: z.string(),
|
|
179
184
|
featureId: z.string().optional(),
|
|
185
|
+
/** Global project-wide phase sequence (assigned once at creation from project.nextPhaseNumber; stable, gaps on delete). Bare P00x is unambiguous. */
|
|
180
186
|
number: z.number().int().positive(),
|
|
181
187
|
shortId: z.string().regex(/^(|[A-Z2-9]{5})$/).default(""),
|
|
182
188
|
priority: z.number().int().nonnegative().default(0),
|
|
@@ -219,6 +225,7 @@ export const PhaseSchema = z.object({
|
|
|
219
225
|
});
|
|
220
226
|
export const FeatureSchema = z.object({
|
|
221
227
|
id: z.string(),
|
|
228
|
+
/** Global project-wide feature sequence (assigned once at creation from project.nextFeatureNumber; stable, gaps on delete). */
|
|
222
229
|
number: z.number().int().nonnegative().default(0),
|
|
223
230
|
shortId: z.string().regex(/^(|[A-Z2-9]{5})$/).default(""),
|
|
224
231
|
priority: z.number().int().nonnegative().default(0),
|
package/package.json
CHANGED