@tacuchi/agent-workflow-cli 25.2.0 → 25.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 +1 -0
- package/dist/application/decision-note-service.js +20 -3
- package/dist/application/decision-note-service.js.map +1 -1
- package/dist/application/flow/advance.js +91 -5
- package/dist/application/flow/advance.js.map +1 -1
- package/dist/application/flow/internal-actions.js +167 -7
- package/dist/application/flow/internal-actions.js.map +1 -1
- package/dist/application/flow/submit.js +187 -4
- package/dist/application/flow/submit.js.map +1 -1
- package/dist/application/plan-current-point.js +54 -0
- package/dist/application/plan-current-point.js.map +1 -0
- package/dist/application/plan-exec-decision-service.js +143 -4
- package/dist/application/plan-exec-decision-service.js.map +1 -1
- package/dist/application/plan-locator.js +78 -0
- package/dist/application/plan-locator.js.map +1 -0
- package/dist/application/plan-open-run.js +129 -0
- package/dist/application/plan-open-run.js.map +1 -0
- package/dist/application/reseal-service.js +14 -44
- package/dist/application/reseal-service.js.map +1 -1
- package/dist/application/resume-service.js +9 -3
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/settle-service.js +442 -0
- package/dist/application/settle-service.js.map +1 -0
- package/dist/application/workline-index-service.js +165 -62
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/settle.js +197 -0
- package/dist/cli/commands/settle.js.map +1 -0
- package/dist/cli/commands/status.js +2 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/help-groups.js +7 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/parser.js +6 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/domain/decision-note.js +166 -3
- package/dist/domain/decision-note.js.map +1 -1
- package/dist/domain/decision-preview.js.map +1 -1
- package/dist/domain/effective-contract.js +4 -3
- package/dist/domain/effective-contract.js.map +1 -1
- package/dist/domain/flow/answer.js +10 -0
- package/dist/domain/flow/answer.js.map +1 -1
- package/dist/domain/flow/authority.js +116 -0
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/flow/directive.js +8 -1
- package/dist/domain/flow/directive.js.map +1 -1
- package/dist/domain/flow/run-state.js +95 -9
- package/dist/domain/flow/run-state.js.map +1 -1
- package/dist/domain/obligation-correspondence.js +95 -0
- package/dist/domain/obligation-correspondence.js.map +1 -0
- package/dist/domain/reconciliation.js +142 -25
- package/dist/domain/reconciliation.js.map +1 -1
- package/dist/domain/settlement.js +129 -0
- package/dist/domain/settlement.js.map +1 -0
- package/package.json +1 -1
- package/skills/w/commands/resume.md +2 -2
- package/skills/w/loops/plan-exec-loop/LOOP.md +31 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { normalizeCorrelativeInput } from "../domain/correlative.js";
|
|
3
|
+
import { checkSafeRelativePath } from "../domain/safe-path.js";
|
|
4
|
+
const DEFAULT_WORDING = {
|
|
5
|
+
outside: "",
|
|
6
|
+
ambiguous: "pasá la ruta exacta del plan",
|
|
7
|
+
};
|
|
8
|
+
export async function locatePlanDocument(fs, root, planDir, target, wording = DEFAULT_WORDING) {
|
|
9
|
+
const raw = target.trim();
|
|
10
|
+
if (raw.includes("/") || raw.endsWith(".md")) {
|
|
11
|
+
const safe = checkSafeRelativePath(raw);
|
|
12
|
+
if (!safe.ok) {
|
|
13
|
+
return {
|
|
14
|
+
ok: false,
|
|
15
|
+
reason: "invalid",
|
|
16
|
+
message: `'${target}' no es una ruta del workspace: ${safe.why}`,
|
|
17
|
+
action: `pasá la ruta del plan relativa al workspace ('${planDir}/NNN-plan-<slug>.md') o su correlativo`,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const expected = planDir.split("/");
|
|
21
|
+
const inside = safe.segments.length > expected.length &&
|
|
22
|
+
expected.every((segment, index) => safe.segments[index] === segment);
|
|
23
|
+
if (!inside) {
|
|
24
|
+
return {
|
|
25
|
+
ok: false,
|
|
26
|
+
reason: "invalid",
|
|
27
|
+
message: `'${safe.path}' no está bajo '${planDir}/'${wording.outside.length === 0 ? "" : `: ${wording.outside}`}`,
|
|
28
|
+
action: `pasá la ruta de un plan bajo '${planDir}/' o su correlativo`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return { ok: true, path: safe.path };
|
|
32
|
+
}
|
|
33
|
+
const number = normalizeCorrelativeInput(raw);
|
|
34
|
+
if (number === null) {
|
|
35
|
+
return {
|
|
36
|
+
ok: false,
|
|
37
|
+
reason: "invalid",
|
|
38
|
+
message: `'${target}' no es ni una ruta ni un correlativo`,
|
|
39
|
+
action: `pasá la ruta del plan ('${planDir}/NNN-plan-<slug>.md') o su correlativo ('035')`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const matches = await plansNumbered(fs, join(root, planDir), number);
|
|
43
|
+
const [first] = matches;
|
|
44
|
+
if (first === undefined) {
|
|
45
|
+
return {
|
|
46
|
+
ok: false,
|
|
47
|
+
reason: "absent",
|
|
48
|
+
message: `no hay ningún plan '${number}' en '${planDir}/'`,
|
|
49
|
+
action: "verificá el correlativo con 'aw status' o pasá la ruta exacta del plan",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (matches.length > 1) {
|
|
53
|
+
return {
|
|
54
|
+
ok: false,
|
|
55
|
+
reason: "ambiguous",
|
|
56
|
+
message: `'${number}' nombra ${matches.length} documentos en '${planDir}/': ${matches.join(", ")}`,
|
|
57
|
+
action: wording.ambiguous,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return { ok: true, path: `${planDir}/${first}` };
|
|
61
|
+
}
|
|
62
|
+
/** File names of `planDir` that carry this correlative, in directory order. */
|
|
63
|
+
async function plansNumbered(fs, absoluteDir, number) {
|
|
64
|
+
let entries;
|
|
65
|
+
try {
|
|
66
|
+
entries = await fs.list(absoluteDir);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// A folder that is not there holds no plan: the caller reports the absence
|
|
70
|
+
// of the document, which is what a person can act on.
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const named = new RegExp(`^${number}-.*\\.md$`);
|
|
74
|
+
return entries
|
|
75
|
+
.filter((entry) => entry.type === "file" && named.test(entry.name))
|
|
76
|
+
.map((entry) => entry.name);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=plan-locator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-locator.js","sourceRoot":"","sources":["../../src/application/plan-locator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHO IS HOLDING A PLAN RIGHT NOW, read once for everybody who asks.
|
|
3
|
+
*
|
|
4
|
+
* Two very different commands need this same fact. `aw settle` needs it to
|
|
5
|
+
* refuse: settling underneath a live run would interleave two publications over
|
|
6
|
+
* one chain. The board needs it to name an exit: the way out of a pending
|
|
7
|
+
* obligation is that run's own next boundary when there is one, and `aw settle`
|
|
8
|
+
* when there is not — and a board that guessed would send somebody to the wrong
|
|
9
|
+
* half of that.
|
|
10
|
+
*
|
|
11
|
+
* Read from the same projection `aw status` and `aw resume` present, so "there
|
|
12
|
+
* is a run on this plan" is one answer and not two — and the command that comes
|
|
13
|
+
* back is the one that projection computed, because a run that still needs
|
|
14
|
+
* `--adopt` refuses a bare `advance`.
|
|
15
|
+
*/
|
|
16
|
+
import { findActiveSessions } from "./checkpoint-service.js";
|
|
17
|
+
import { projectRun } from "./flow/run-projection.js";
|
|
18
|
+
/**
|
|
19
|
+
* Every live `plan-exec` run, by the plan it holds.
|
|
20
|
+
*
|
|
21
|
+
* Four readings, in this order and for these reasons:
|
|
22
|
+
*
|
|
23
|
+
* - a run whose state cannot be READ holds an unknown plan, so it counts. The
|
|
24
|
+
* safe half is the same one an unreadable decision chain gets: fail closed and
|
|
25
|
+
* name it, because acting underneath a state nobody can read is the precise
|
|
26
|
+
* interleaving this reading exists to prevent;
|
|
27
|
+
* - a run of ANY OTHER FLOW holds no plan at all. A `quick` or a `spec-refine`
|
|
28
|
+
* never fixes one, and treating it as a holder is how this reading came to
|
|
29
|
+
* claim every plan in the workspace;
|
|
30
|
+
* - a run whose journey is EXHAUSTED (`final`) holds nothing any more, even
|
|
31
|
+
* though its session was never closed. Counting it would leave `aw settle`
|
|
32
|
+
* useless in exactly the workspace it was built for — a plan blocked today,
|
|
33
|
+
* whose run finished long ago;
|
|
34
|
+
* - a `plan-exec` run with no scope yet may still fix THIS plan, so it counts
|
|
35
|
+
* too — said as what it is rather than as an unreadable state.
|
|
36
|
+
*/
|
|
37
|
+
export async function readHoldingRuns(fs, paths) {
|
|
38
|
+
const byPlan = new Map();
|
|
39
|
+
let unreadable = null;
|
|
40
|
+
for (const session of await findActiveSessions(fs, paths)) {
|
|
41
|
+
const run = await projectRun(fs, paths, session.folder);
|
|
42
|
+
if (run === null)
|
|
43
|
+
continue;
|
|
44
|
+
if (run.flow === "?") {
|
|
45
|
+
unreadable ??= {
|
|
46
|
+
session: session.folder,
|
|
47
|
+
command: run.command,
|
|
48
|
+
why: "tiene un estado de corrida que no se puede leer, así que no se puede descartar que tenga este plan",
|
|
49
|
+
};
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
// El flujo se mira ANTES del scope, y el orden es el defecto que esto
|
|
53
|
+
// arregla: `scope` nace nulo y sólo lo fija la declaración de alcance de
|
|
54
|
+
// `plan-exec`, así que mirarlo primero convertía toda corrida de `quick`,
|
|
55
|
+
// `spec-refine` o `plan-new` en «una corrida ilegible» — y con eso en la
|
|
56
|
+
// dueña de TODO plan que nadie más nombrara. `aw settle` quedaba inservible
|
|
57
|
+
// en cualquier workspace con otra sesión abierta, que es el workspace normal
|
|
58
|
+
// y justo el que la orden existe para destrabar.
|
|
59
|
+
if (run.flow !== "plan-exec")
|
|
60
|
+
continue;
|
|
61
|
+
if (run.boundary === "final")
|
|
62
|
+
continue;
|
|
63
|
+
if (run.scope === null) {
|
|
64
|
+
// Una corrida de ejecución que todavía no fijó su plan puede fijar este,
|
|
65
|
+
// y ahí sí valdría la mitad segura — dicha por lo que es, no como una
|
|
66
|
+
// ilegibilidad que no existe.
|
|
67
|
+
unreadable ??= {
|
|
68
|
+
session: session.folder,
|
|
69
|
+
command: run.command,
|
|
70
|
+
why: "tiene una corrida de ejecución que todavía no fijó su plan, así que no se puede descartar que tome este",
|
|
71
|
+
};
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// First writer wins: two runs over one plan is a condition the claims ledger
|
|
75
|
+
// refuses upstream, and picking the later one here would name the newer of
|
|
76
|
+
// two sessions that should not both exist.
|
|
77
|
+
if (!byPlan.has(run.scope.plan)) {
|
|
78
|
+
byPlan.set(run.scope.plan, {
|
|
79
|
+
session: session.folder,
|
|
80
|
+
command: reachedBy(run, session.folder),
|
|
81
|
+
why: `tiene una corrida de ejecución abierta sobre '${run.scope.plan}': su cierre salda sus propias obligaciones`,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { byPlan, unreadable };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* The command that takes SOMEBODY ELSE to this run.
|
|
89
|
+
*
|
|
90
|
+
* The projection's own `command` is what continues the run from inside it, and
|
|
91
|
+
* at an execution boundary that is the sealed invocation itself — `npm test --
|
|
92
|
+
* …` — which advances nothing on its own: it has to be run and its real output
|
|
93
|
+
* submitted. Handed to a stranger as a plan's route it would be a command that
|
|
94
|
+
* does not do what the row says, so an execution boundary is named by the
|
|
95
|
+
* directive that re-renders it. Every other boundary keeps the projection's own
|
|
96
|
+
* command, because a legacy run refuses a bare `advance` and only the projection
|
|
97
|
+
* knows that.
|
|
98
|
+
*/
|
|
99
|
+
function reachedBy(run, folder) {
|
|
100
|
+
return run.boundary === "execution" ? `aw flow advance --code ${folder}` : run.command;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The run holding one plan, or `null`.
|
|
104
|
+
*
|
|
105
|
+
* A run that NAMES this plan is preferred over an unreadable one, because its
|
|
106
|
+
* refusal says which plan and which session — and the unreadable reading still
|
|
107
|
+
* applies to every plan no run named.
|
|
108
|
+
*
|
|
109
|
+
* The exact path is tried first, and a case-insensitive match is the fallback
|
|
110
|
+
* rather than the rule. On a case-insensitive filesystem — macOS by default —
|
|
111
|
+
* `docs/Plans/042.md` and `docs/plans/042.md` are ONE document that a run and a
|
|
112
|
+
* board can end up naming differently, and an exact comparison then reports "no
|
|
113
|
+
* run holds this plan" about a plan a run is holding: the precise interleaving
|
|
114
|
+
* the guard exists to prevent. On a filesystem where the two really are two
|
|
115
|
+
* files the fallback over-blocks instead, which is a refusal that names a real
|
|
116
|
+
* session — the safe half, and the same one an unreadable run gets.
|
|
117
|
+
*/
|
|
118
|
+
export function holdingRunOf(runs, plan) {
|
|
119
|
+
const exact = runs.byPlan.get(plan);
|
|
120
|
+
if (exact !== undefined)
|
|
121
|
+
return exact;
|
|
122
|
+
const folded = plan.toLowerCase();
|
|
123
|
+
for (const [held, run] of runs.byPlan) {
|
|
124
|
+
if (held.toLowerCase() === folded)
|
|
125
|
+
return run;
|
|
126
|
+
}
|
|
127
|
+
return runs.unreadable;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=plan-open-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-open-run.js","sourceRoot":"","sources":["../../src/application/plan-open-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,6 @@
|
|
|
30
30
|
* the approval no longer fits.
|
|
31
31
|
*/
|
|
32
32
|
import { join } from "node:path";
|
|
33
|
-
import { normalizeCorrelativeInput } from "../domain/correlative.js";
|
|
34
33
|
import { formatSpecBaseline, withSpecBaseline } from "../domain/lineage.js";
|
|
35
34
|
import { baseDigest, sealProposal } from "../domain/proposal.js";
|
|
36
35
|
import { checkSafeRelativePath } from "../domain/safe-path.js";
|
|
@@ -39,6 +38,7 @@ import { applyLocalProposal } from "./local-proposal.js";
|
|
|
39
38
|
import { functionalSpecDigest, unclosedSpecFence } from "./parsers/spec-functional.js";
|
|
40
39
|
import { parseDerivedFromPath, parsePlanBaselineSeal, parseSpecRelation, } from "./parsers/spec-relation.js";
|
|
41
40
|
import { resolveWorkspaceRoot } from "./paths-service.js";
|
|
41
|
+
import { locatePlanDocument } from "./plan-locator.js";
|
|
42
42
|
/** What the proposal calls itself: one operation, one vocabulary. */
|
|
43
43
|
const RESEAL_OPERATION = "reseal.baseline";
|
|
44
44
|
function fail(code, message, action) {
|
|
@@ -252,49 +252,19 @@ function undeclaredHeaderLineage(planPath, relation, specDir) {
|
|
|
252
252
|
* `docs/plans-viejos` never passes as `docs/plans`: a re-seal writes a plan's
|
|
253
253
|
* header, and nothing else in the tree is a plan.
|
|
254
254
|
*/
|
|
255
|
+
/** The plan this re-seal was pointed at, with the codes a re-seal owns. */
|
|
255
256
|
async function locatePlan(fs, root, planDir, target) {
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
return { path: safe.path };
|
|
269
|
-
}
|
|
270
|
-
const number = normalizeCorrelativeInput(raw);
|
|
271
|
-
if (number === null) {
|
|
272
|
-
return fail("RESEAL_TARGET_INVALID", `'${target}' no es ni una ruta ni un correlativo`, `pasá la ruta del plan ('${planDir}/NNN-plan-<slug>.md') o su correlativo ('035')`);
|
|
273
|
-
}
|
|
274
|
-
const matches = await plansNumbered(fs, join(root, planDir), number);
|
|
275
|
-
const [first] = matches;
|
|
276
|
-
if (first === undefined) {
|
|
277
|
-
return fail("RESEAL_PLAN_ABSENT", `no hay ningún plan '${number}' en '${planDir}/'`, `verificá el correlativo con 'aw status' o pasá la ruta exacta del plan`);
|
|
278
|
-
}
|
|
279
|
-
if (matches.length > 1) {
|
|
280
|
-
return fail("RESEAL_TARGET_AMBIGUOUS", `'${number}' nombra ${matches.length} documentos en '${planDir}/': ${matches.join(", ")}`, "pasá la ruta exacta del plan que querés re-sellar");
|
|
281
|
-
}
|
|
282
|
-
return { path: `${planDir}/${first}` };
|
|
283
|
-
}
|
|
284
|
-
/** File names of `planDir` that carry this correlative, in directory order. */
|
|
285
|
-
async function plansNumbered(fs, absoluteDir, number) {
|
|
286
|
-
let entries;
|
|
287
|
-
try {
|
|
288
|
-
entries = await fs.list(absoluteDir);
|
|
289
|
-
}
|
|
290
|
-
catch {
|
|
291
|
-
// A folder that is not there holds no plan: the caller reports the absence
|
|
292
|
-
// of the document, which is what a person can act on.
|
|
293
|
-
return [];
|
|
294
|
-
}
|
|
295
|
-
const named = new RegExp(`^${number}-.*\\.md$`);
|
|
296
|
-
return entries
|
|
297
|
-
.filter((entry) => entry.type === "file" && named.test(entry.name))
|
|
298
|
-
.map((entry) => entry.name);
|
|
257
|
+
const located = await locatePlanDocument(fs, root, planDir, target, {
|
|
258
|
+
outside: "el re-sello escribe la cabecera de un plan y nada más",
|
|
259
|
+
ambiguous: "pasá la ruta exacta del plan que querés re-sellar",
|
|
260
|
+
});
|
|
261
|
+
if (located.ok)
|
|
262
|
+
return { path: located.path };
|
|
263
|
+
const code = located.reason === "absent"
|
|
264
|
+
? "RESEAL_PLAN_ABSENT"
|
|
265
|
+
: located.reason === "ambiguous"
|
|
266
|
+
? "RESEAL_TARGET_AMBIGUOUS"
|
|
267
|
+
: "RESEAL_TARGET_INVALID";
|
|
268
|
+
return fail(code, located.message, located.action);
|
|
299
269
|
}
|
|
300
270
|
//# sourceMappingURL=reseal-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reseal-service.js","sourceRoot":"","sources":["../../src/application/reseal-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"reseal-service.js","sourceRoot":"","sources":["../../src/application/reseal-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAqB,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAsB,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAEL,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAqB,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qEAAqE;AACrE,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AA0E3C,SAAS,IAAI,CAAC,IAAgB,EAAE,OAAe,EAAE,MAAc;IAC7D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,IAAI,CACT,2BAA2B,EAC3B,+BAA+B,KAAK,CAAC,KAAK,EAAE,EAC5C,iFAAiF,CAClF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,IAAI,SAAS,IAAI,OAAO;QAAE,OAAO,OAAiB,CAAC;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAE9B,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CACT,oBAAoB,EACpB,IAAI,QAAQ,gEAAgE,EAC5E,mCAAmC,KAAK,CAAC,KAAK,CAAC,IAAI,mCAAmC,CACvF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpE,IAAI,SAAS,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;IAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CACT,oBAAoB,EACpB,IAAI,OAAO,yEAAyE,EACpF,wBAAwB,KAAK,CAAC,KAAK,CAAC,IAAI,6CAA6C,CACtF,CAAC;IACJ,CAAC;IACD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CACT,wBAAwB,EACxB,IAAI,OAAO,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACpF,mHAAmH,CACpH,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,sEAAsE;QACtE,0EAA0E;QAC1E,yEAAyE;QACzE,0EAA0E;QAC1E,OAAO,IAAI,CACT,4BAA4B,EAC5B,IAAI,OAAO,2CAA2C,KAAK,GAAG,CAAC,qHAAqH,EACpL,sCAAsC,KAAK,GAAG,CAAC,QAAQ,OAAO,kCAAkC,CACjG,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAiB;QAC7B,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC;KACvC,CAAC;IACF,MAAM,IAAI,GAAG,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAkB;QAC7B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;QACb,aAAa,EAAE,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QACrE,cAAc,EAAE,QAAQ,CAAC,MAAM;QAC/B,aAAa,EAAE,kBAAkB,CAAC,QAAQ,CAAC;KAC5C,CAAC;IAEF,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,4EAA4E;QAC5E,uEAAuE;QACvE,0EAA0E;QAC1E,mCAAmC;QACnC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YACzE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CACT,wBAAwB,EACxB,IAAI,QAAQ,oHAAoH,EAChI,kHAAkH,CACnH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,OAAO;QACP,QAAQ,EAAE,YAAY,CAAC;YACrB,SAAS,EAAE,gBAAgB;YAC3B,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC/D,yEAAyE;YACzE,sCAAsC;YACtC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,OAAO,EAAE,CAAC,kBAAkB,CAAC;YAC7B,gBAAgB,EAAE,CAAC,kBAAkB,CAAC;SACvC,CAAC;KACH,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,KAAuB;IAEvB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACnE,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;IAE3F,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvD,OAAO,IAAI,CACT,0BAA0B,EAC1B,4FAA4F,EAC5F,qCAAqC,QAAQ,CAAC,OAAO,CAAC,IAAI,oDAAoD,CAC/G,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,KAAK,EAAE;QAClD,IAAI;QACJ,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,4EAA4E;QAC5E,0EAA0E;QAC1E,kDAAkD;QAClD,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE;QAC7E,cAAc,EAAE,EAAE;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE;gBACP,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;gBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;gBAChC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;aAC/B;SACF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;QAChC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;QAC/B,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe;KAChD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,YAAY,CACnB,QAAgB,EAChB,QAAgB,EAChB,OAAe;IAEf,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,QAAQ,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACrC,OAAO,IAAI,CACT,wBAAwB,EACxB,IAAI,QAAQ,0JAA0J,EACtK,gMAAgM,CACjM,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,IAAI,QAAQ,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;QAC/F,OAAO,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,IAAI,CACT,0BAA0B,EAC1B,2BAA2B,QAAQ,eAAe,OAAO,wCAAwC,IAAI,CAAC,GAAG,EAAE,EAC3G,8BAA8B,OAAO,gOAAgO,CACtQ,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,uBAAuB,CAC9B,QAAgB,EAChB,QAA4B,EAC5B,OAAe;IAEf,MAAM,IAAI,GAAe,gCAAgC,CAAC;IAC1D,MAAM,OAAO,GAAG,gEAAgE,CAAC;IACjF,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,IAAI,QAAQ,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;QAC3E,OAAO,IAAI,CACT,IAAI,EACJ,IAAI,QAAQ,qBAAqB,QAAQ,CAAC,MAAM,wCAAwC,OAAO,yEAAyE,EACxK,0BAA0B,OAAO,IAAI,QAAQ,CAAC,MAAM,wEAAwE,CAC7H,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,IAAI,CACT,IAAI,EACJ,2BAA2B,QAAQ,yCAAyC,QAAQ,CAAC,MAAM,KAAK,OAAO,qCAAqC,EAC5I,2FAA2F,CAC5F,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,IAAI,CACT,IAAI,EACJ,IAAI,QAAQ,uCAAuC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,OAAO,wCAAwC,EACnI,wEAAwE,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CACT,IAAI,EACJ,IAAI,QAAQ,yHAAyH,EACrI,gEAAgE,OAAO,mIAAmI,CAC3M,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,2EAA2E;AAC3E,KAAK,UAAU,UAAU,CACvB,EAAkB,EAClB,IAAY,EACZ,OAAe,EACf,MAAc;IAEd,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;QAClE,OAAO,EAAE,uDAAuD;QAChE,SAAS,EAAE,mDAAmD;KAC/D,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,KAAK,QAAQ;QACzB,CAAC,CAAC,oBAAoB;QACtB,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,WAAW;YAC9B,CAAC,CAAC,yBAAyB;YAC3B,CAAC,CAAC,uBAAuB,CAAC;IAChC,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { coreDocumentLocations } from "../domain/docs-canon.js";
|
|
|
2
2
|
import { projectRun } from "./flow/run-projection.js";
|
|
3
3
|
import { buildSessionNarrative } from "./session-narrative.js";
|
|
4
4
|
import { resolveSessionTarget, sessionReadRequest } from "./session-resolver.js";
|
|
5
|
-
import { buildWorklineIndex, planPresentation, specDetail, unresolvedDesignRefs, } from "./workline-index-service.js";
|
|
5
|
+
import { buildWorklineIndex, planIsPending, planPresentation, specDetail, unresolvedDesignRefs, } from "./workline-index-service.js";
|
|
6
6
|
export async function runResume(fs, env, paths, input = {}) {
|
|
7
7
|
const index = await buildWorklineIndex(fs, env, paths, {
|
|
8
8
|
...(input.now !== undefined ? { now: input.now } : {}),
|
|
@@ -32,7 +32,10 @@ export async function runResume(fs, env, paths, input = {}) {
|
|
|
32
32
|
function resumeTarget(index, target) {
|
|
33
33
|
const specs = index.specs.filter((s) => s.file === target || s.number === target);
|
|
34
34
|
const allPlans = index.plans.filter((p) => p.file === target || p.number === target);
|
|
35
|
-
|
|
35
|
+
// La misma regla de pertenencia que usa el pipeline, y por eso importada: un
|
|
36
|
+
// plan cerrado con traspaso vigente es trabajo pendiente en las dos
|
|
37
|
+
// superficies o en ninguna, nunca en una sola.
|
|
38
|
+
const plans = allPlans.filter(planIsPending);
|
|
36
39
|
const matches = [
|
|
37
40
|
...specs.map((s) => specProposal(s, index)),
|
|
38
41
|
...plans.map((plan) => planProposal(plan, index)),
|
|
@@ -154,7 +157,10 @@ function specProposal(spec, index) {
|
|
|
154
157
|
function planProposal(plan, index) {
|
|
155
158
|
const presentation = planPresentation(plan, index.designs);
|
|
156
159
|
return {
|
|
157
|
-
|
|
160
|
+
// Del mismo lugar que sale el titular: un plan cerrado con traspaso vigente
|
|
161
|
+
// se nombra como lo que es en las dos superficies, o `resume <plan>` diría
|
|
162
|
+
// «plan abierto» sobre uno cerrado y el tablero diría otra cosa.
|
|
163
|
+
kind: presentation.kind,
|
|
158
164
|
file: plan.file,
|
|
159
165
|
number: plan.number,
|
|
160
166
|
...told(presentation.detail),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume-service.js","sourceRoot":"","sources":["../../src/application/resume-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAMhE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EASL,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AA+ErC,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,QAAqB,EAAE;IAEvB,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE;QACrD,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO;YACL,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE;YACxC,MAAM,EAAE,qCAAqC,KAAK,CAAC,gBAAgB,uCAAuC;SAC3G,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAClF,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,gFAAgF;AAEhF;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,KAAoB,EAAE,MAAc;IACxD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"resume-service.js","sourceRoot":"","sources":["../../src/application/resume-service.ts"],"names":[],"mappings":"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"}
|