@tacuchi/agent-workflow-cli 22.4.1 → 23.0.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 +2 -2
- package/dist/adapters/git-cli.js +59 -17
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/adapters/node-file-system.js +55 -1
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/artifacts-service.js +2 -2
- package/dist/application/artifacts-service.js.map +1 -1
- package/dist/application/capability/dispatcher.js +2 -2
- package/dist/application/capability/dispatcher.js.map +1 -1
- package/dist/application/capability/installed-inventory.js +2 -2
- package/dist/application/capability/installed-inventory.js.map +1 -1
- package/dist/application/capability/readiness.js +1 -1
- package/dist/application/capability/readiness.js.map +1 -1
- package/dist/application/check-branch-service.js +2 -2
- package/dist/application/check-branch-service.js.map +1 -1
- package/dist/application/checkpoint/files-touched.js +271 -0
- package/dist/application/checkpoint/files-touched.js.map +1 -0
- package/dist/application/checkpoint/markdown.js +61 -8
- package/dist/application/checkpoint/markdown.js.map +1 -1
- package/dist/application/checkpoint/state-reader.js +8 -2
- package/dist/application/checkpoint/state-reader.js.map +1 -1
- package/dist/application/checkpoint-write-service.js +16 -5
- package/dist/application/checkpoint-write-service.js.map +1 -1
- package/dist/application/claims-ledger.js +330 -0
- package/dist/application/claims-ledger.js.map +1 -0
- package/dist/application/claims-recovery.js +338 -0
- package/dist/application/claims-recovery.js.map +1 -0
- package/dist/application/dev-only-services.js +154 -44
- package/dist/application/dev-only-services.js.map +1 -1
- package/dist/application/elicitation-server.js +382 -0
- package/dist/application/elicitation-server.js.map +1 -0
- package/dist/application/elicitation-stdio.js +48 -0
- package/dist/application/elicitation-stdio.js.map +1 -0
- package/dist/application/flow/advance.js +86 -5
- package/dist/application/flow/advance.js.map +1 -1
- package/dist/application/flow/checkout-observation.js +152 -0
- package/dist/application/flow/checkout-observation.js.map +1 -0
- package/dist/application/flow/flow-service.js +72 -13
- package/dist/application/flow/flow-service.js.map +1 -1
- package/dist/application/flow/internal-actions.js +460 -1
- package/dist/application/flow/internal-actions.js.map +1 -1
- package/dist/application/flow/internal-drive.js +22 -9
- package/dist/application/flow/internal-drive.js.map +1 -1
- package/dist/application/flow/prove.js +205 -0
- package/dist/application/flow/prove.js.map +1 -0
- package/dist/application/flow/run-journey.js +15 -0
- package/dist/application/flow/run-journey.js.map +1 -0
- package/dist/application/flow/run-projection.js +15 -3
- package/dist/application/flow/run-projection.js.map +1 -1
- package/dist/application/flow/run-state-service.js +19 -4
- package/dist/application/flow/run-state-service.js.map +1 -1
- package/dist/application/flow/submit.js +250 -72
- package/dist/application/flow/submit.js.map +1 -1
- package/dist/application/generate-launch-service.js +4 -4
- package/dist/application/generate-launch-service.js.map +1 -1
- package/dist/application/git-flow-service.js +9 -0
- package/dist/application/git-flow-service.js.map +1 -1
- package/dist/application/local-proposal.js +9 -0
- package/dist/application/local-proposal.js.map +1 -1
- package/dist/application/lock-service.js +6 -3
- package/dist/application/lock-service.js.map +1 -1
- package/dist/application/mcp-doctor-service.js.map +1 -1
- package/dist/application/mcp-host-reader.js +30 -13
- package/dist/application/mcp-host-reader.js.map +1 -1
- package/dist/application/mcp-host-writer.js +136 -112
- package/dist/application/mcp-host-writer.js.map +1 -1
- package/dist/application/mcp-remove-service.js +7 -3
- package/dist/application/mcp-remove-service.js.map +1 -1
- package/dist/application/mcp-scope-common.js +1 -3
- package/dist/application/mcp-scope-common.js.map +1 -1
- package/dist/application/mcp-setup-service.js +7 -3
- package/dist/application/mcp-setup-service.js.map +1 -1
- package/dist/application/merge-state-service.js +10 -16
- package/dist/application/merge-state-service.js.map +1 -1
- package/dist/application/multiroot/claude.js +34 -15
- package/dist/application/multiroot/claude.js.map +1 -1
- package/dist/application/multiroot/codex.js +9 -5
- package/dist/application/multiroot/codex.js.map +1 -1
- package/dist/application/multiroot-service.js +20 -11
- package/dist/application/multiroot-service.js.map +1 -1
- package/dist/application/parsers/project-block.js +25 -2
- package/dist/application/parsers/project-block.js.map +1 -1
- package/dist/application/paths-service.js +30 -31
- package/dist/application/paths-service.js.map +1 -1
- package/dist/application/plan-exec-batch-service.js +549 -0
- package/dist/application/plan-exec-batch-service.js.map +1 -0
- package/dist/application/plan-exec-decision-service.js +273 -0
- package/dist/application/plan-exec-decision-service.js.map +1 -0
- package/dist/application/project-md-service.js +2 -2
- package/dist/application/project-md-service.js.map +1 -1
- package/dist/application/project-md-upsert-service.js +4 -4
- package/dist/application/project-md-upsert-service.js.map +1 -1
- package/dist/application/project-tab-data.js +12 -7
- package/dist/application/project-tab-data.js.map +1 -1
- package/dist/application/release-data-service.js +2 -2
- package/dist/application/release-data-service.js.map +1 -1
- package/dist/application/resume-service.js +32 -11
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/retirement/apply.js +84 -0
- package/dist/application/retirement/apply.js.map +1 -1
- package/dist/application/retirement/attribution.js +31 -1
- package/dist/application/retirement/attribution.js.map +1 -1
- package/dist/application/retirement/graph.js +19 -1
- package/dist/application/retirement/graph.js.map +1 -1
- package/dist/application/retirement/journal.js +11 -0
- package/dist/application/retirement/journal.js.map +1 -1
- package/dist/application/retirement/prepare.js +89 -3
- package/dist/application/retirement/prepare.js.map +1 -1
- package/dist/application/retirement/preview.js +16 -0
- package/dist/application/retirement/preview.js.map +1 -1
- package/dist/application/retirement/resolve.js +65 -0
- package/dist/application/retirement/resolve.js.map +1 -1
- package/dist/application/self/host-states.js +2 -0
- package/dist/application/self/host-states.js.map +1 -1
- package/dist/application/self/install-skill.js +53 -19
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/mcp-config.js +28 -30
- package/dist/application/self/mcp-config.js.map +1 -1
- package/dist/application/self/mcp-offer.js +96 -0
- package/dist/application/self/mcp-offer.js.map +1 -0
- package/dist/application/self/mcp-via-state.js +59 -0
- package/dist/application/self/mcp-via-state.js.map +1 -0
- package/dist/application/self/uninstall-skill.js +18 -3
- package/dist/application/self/uninstall-skill.js.map +1 -1
- package/dist/application/self/uninstall.js +37 -8
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/session-close-service.js +24 -1
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/session-create-service.js +7 -0
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/session-resume-service.js +2 -2
- package/dist/application/session-resume-service.js.map +1 -1
- package/dist/application/sessions-service.js +2 -4
- package/dist/application/sessions-service.js.map +1 -1
- package/dist/application/skills-resolver-service.js +4 -4
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/source-boundary-policy.js +18 -7
- package/dist/application/source-boundary-policy.js.map +1 -1
- package/dist/application/source-remove-service.js +12 -1
- package/dist/application/source-remove-service.js.map +1 -1
- package/dist/application/sources-service.js +2 -2
- package/dist/application/sources-service.js.map +1 -1
- package/dist/application/status-service.js +4 -0
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/visibility-doctor-service.js +1 -1
- package/dist/application/visibility-doctor-service.js.map +1 -1
- package/dist/application/workline-index-service.js +182 -27
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/workspace-init-service.js +85 -265
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/application/workspace-materialization-service.js +300 -0
- package/dist/application/workspace-materialization-service.js.map +1 -0
- package/dist/application/worktree-service.js +32 -3
- package/dist/application/worktree-service.js.map +1 -1
- package/dist/cli/commands/capability.js +4 -7
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/claims.js +72 -0
- package/dist/cli/commands/claims.js.map +1 -0
- package/dist/cli/commands/dev-only.js +73 -25
- package/dist/cli/commands/dev-only.js.map +1 -1
- package/dist/cli/commands/flow.js +145 -42
- package/dist/cli/commands/flow.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/mcp.js +124 -35
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/multiroot.js +40 -7
- package/dist/cli/commands/multiroot.js.map +1 -1
- package/dist/cli/commands/resume.js +9 -3
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/retirement.js +9 -0
- package/dist/cli/commands/retirement.js.map +1 -1
- package/dist/cli/commands/session-create.js +1 -1
- package/dist/cli/commands/session-create.js.map +1 -1
- package/dist/cli/commands/skills.js +1 -1
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/status.js +72 -24
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/workspace-init.js +5 -5
- package/dist/cli/commands/workspace-init.js.map +1 -1
- package/dist/cli/help-groups.js +5 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +112 -39
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/parser.js +3 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/app.js +3 -2
- package/dist/cli/tui/app.js.map +1 -1
- package/dist/cli/tui/components/host-admin-section.js +46 -2
- package/dist/cli/tui/components/host-admin-section.js.map +1 -1
- package/dist/cli/tui/components/workspace-init-form.js +7 -7
- package/dist/cli/tui/components/workspace-init-form.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +2 -2
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/config-tab.js +4 -3
- package/dist/cli/tui/tabs/config-tab.js.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab-helpers.js +1 -1
- package/dist/cli/tui/tabs/mcp-tab-helpers.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +18 -21
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/cli/tui/workspace-root.js +13 -0
- package/dist/cli/tui/workspace-root.js.map +1 -0
- package/dist/domain/capability/protocol.js +2 -2
- package/dist/domain/capability/protocol.js.map +1 -1
- package/dist/domain/degradation-notice.js +60 -0
- package/dist/domain/degradation-notice.js.map +1 -0
- package/dist/domain/elicitation.js +152 -0
- package/dist/domain/elicitation.js.map +1 -0
- package/dist/domain/flow/answer.js +173 -42
- package/dist/domain/flow/answer.js.map +1 -1
- package/dist/domain/flow/authority.js +180 -127
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/flow/directive.js +47 -1
- package/dist/domain/flow/directive.js.map +1 -1
- package/dist/domain/flow/rules.js +7 -4
- package/dist/domain/flow/rules.js.map +1 -1
- package/dist/domain/flow/run-state.js +636 -31
- package/dist/domain/flow/run-state.js.map +1 -1
- package/dist/domain/harnesses.js +17 -1
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/mcp-entry.js +36 -14
- package/dist/domain/mcp-entry.js.map +1 -1
- package/dist/domain/retirement/proposal.js +1 -0
- package/dist/domain/retirement/proposal.js.map +1 -1
- package/dist/domain/structured-choice-stamp.js +32 -4
- package/dist/domain/structured-choice-stamp.js.map +1 -1
- package/dist/domain/workline-mcp-entry.js +37 -0
- package/dist/domain/workline-mcp-entry.js.map +1 -0
- package/dist/runtime/namespace-resolver.js +104 -18
- package/dist/runtime/namespace-resolver.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/README.md +2 -2
- package/skills/w/SKILL.md +9 -10
- package/skills/w/artifacts/README.md +1 -1
- package/skills/w/commands/README.md +3 -3
- package/skills/w/commands/persist.md +3 -1
- package/skills/w/commands/resume.md +1 -1
- package/skills/w/commands/spec-new.md +2 -2
- package/skills/w/commands/status.md +1 -1
- package/skills/w/commands/workspace-init.md +9 -10
- package/skills/w/context/MANIFEST.json +1 -4
- package/skills/w/harness/HARNESS.md +1 -1
- package/skills/w/loops/quick-loop/LOOP.md +1 -1
- package/skills/w/modules/PROMPT-CONTINUITY.md +1 -1
- package/skills/w/modules/WORKSPACE-SCAFFOLD.md +17 -20
- package/skills/w/schemas/capability-descriptor.schema.json +1 -1
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The inventory of touched files a checkpoint reports, bounded on purpose.
|
|
3
|
+
*
|
|
4
|
+
* It used to be `git diff --numstat HEAD` run from wherever the process
|
|
5
|
+
* happened to start, which is not a boundary at all. In a workspace nested
|
|
6
|
+
* inside a bigger repository the effective scope became the parent repository,
|
|
7
|
+
* so a section meant to say "here is where you were" listed hundreds of files
|
|
8
|
+
* belonging to sibling projects while omitting the one file the session had just
|
|
9
|
+
* created. Three properties make it useful again, and each closes one way the
|
|
10
|
+
* old reading could lie:
|
|
11
|
+
*
|
|
12
|
+
* - **The boundary is declared, never inherited.** It is the workspace plus the
|
|
13
|
+
* source units the session recorded in its own custody — durable, typed
|
|
14
|
+
* evidence. Nothing is inferred from a path or a name, because guessing at
|
|
15
|
+
* ownership is precisely what produced the foreign entries.
|
|
16
|
+
* - **Untracked counts as touched.** A file the session just created has no
|
|
17
|
+
* entry in `HEAD`, so a diff against `HEAD` cannot see it — and that file is
|
|
18
|
+
* usually the most interesting thing a resume needs to know about.
|
|
19
|
+
* - **A unit that cannot be read says so.** An empty inventory and a failed
|
|
20
|
+
* collection used to print the same sentence, so "no uncommitted changes"
|
|
21
|
+
* could equally mean "git exited non-zero and nobody mentioned it".
|
|
22
|
+
*
|
|
23
|
+
* What it deliberately is NOT: a window over the session's lifetime. Attributing
|
|
24
|
+
* changes to the interval a session was open needs data the collection does not
|
|
25
|
+
* have, and would make the same tree answer differently on every read. This is
|
|
26
|
+
* the CURRENT state of the tree, which is the thing a resume can act on.
|
|
27
|
+
*/
|
|
28
|
+
import { readCustody } from "../session-custody-service.js";
|
|
29
|
+
/** The reserved alias of the workspace itself, the one unit always in scope. */
|
|
30
|
+
export const WORKSPACE_UNIT = "workspace";
|
|
31
|
+
/**
|
|
32
|
+
* Readable ceiling for the CONTEXTUAL half alone.
|
|
33
|
+
*
|
|
34
|
+
* The old cap applied to the whole list, so twenty unrelated edits were enough
|
|
35
|
+
* to push the session's own file out of sight — the section stayed short and
|
|
36
|
+
* became useless at the same time. Paths the session claims are never subject
|
|
37
|
+
* to it.
|
|
38
|
+
*/
|
|
39
|
+
export const CONTEXTUAL_LIMIT = 20;
|
|
40
|
+
/**
|
|
41
|
+
* Every entry inside the boundary, including the ones the cap did not print.
|
|
42
|
+
*
|
|
43
|
+
* The reported number is about the SCOPE, not about the section's length: a
|
|
44
|
+
* caller asking "how much did this session touch" is not asking how much fits
|
|
45
|
+
* on screen.
|
|
46
|
+
*/
|
|
47
|
+
export function totalInScope(touched) {
|
|
48
|
+
const cut = touched.omitted.reduce((sum, entry) => sum + entry.count, 0);
|
|
49
|
+
return touched.linked.length + touched.contextual.length + cut;
|
|
50
|
+
}
|
|
51
|
+
export async function collectFilesTouched(fs, git, workspaceRoot, sessionPath) {
|
|
52
|
+
const custody = await readCustody(fs, sessionPath);
|
|
53
|
+
const present = custody.status === "present" ? custody.custody : null;
|
|
54
|
+
const unobserved = [];
|
|
55
|
+
if (custody.status === "unreadable") {
|
|
56
|
+
// "Present and untrustworthy — never silently treated as absent" is the
|
|
57
|
+
// custody reader's own contract. Collapsing it into the legacy no-custody
|
|
58
|
+
// case would drop the session's declared units AND its claimed paths, so
|
|
59
|
+
// the file it just created would fall back into the capped contextual half:
|
|
60
|
+
// the incident's symptom, reached through a different door.
|
|
61
|
+
unobserved.push({ alias: "custodia", boundary: sessionPath, reason: custody.reason });
|
|
62
|
+
}
|
|
63
|
+
// Custody artifact paths are already workspace-relative, which is the same
|
|
64
|
+
// spelling this inventory uses for the workspace unit.
|
|
65
|
+
const claimed = new Set((present?.artifacts ?? []).map((artifact) => artifact.path));
|
|
66
|
+
const units = unitsInScope(present?.sources ?? [], workspaceRoot, unobserved);
|
|
67
|
+
const observed = [];
|
|
68
|
+
const linked = [];
|
|
69
|
+
const contextual = [];
|
|
70
|
+
for (const unit of units) {
|
|
71
|
+
let entries;
|
|
72
|
+
let reference;
|
|
73
|
+
try {
|
|
74
|
+
entries = await observeUnit(git, unit, claimed);
|
|
75
|
+
reference = await git.head(unit.boundary);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
// One unreadable unit never costs the others their inventory: a partial
|
|
79
|
+
// reading that names what is missing beats a blank that names nothing.
|
|
80
|
+
unobserved.push({ alias: unit.alias, boundary: unit.boundary, reason: reasonOf(err) });
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
observed.push({ alias: unit.alias, boundary: unit.boundary, reference });
|
|
84
|
+
for (const entry of entries) {
|
|
85
|
+
(entry.linked ? linked : contextual).push(entry);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
linked.sort(byUnitThenPath);
|
|
89
|
+
contextual.sort(byUnitThenPath);
|
|
90
|
+
const { shown, omitted } = shareTheCap(contextual);
|
|
91
|
+
// Counts are read only for what actually gets printed, so the cost tracks the
|
|
92
|
+
// section's length instead of however noisy the surrounding repository is.
|
|
93
|
+
await fillCounts(git, units, [...linked, ...shown]);
|
|
94
|
+
return { observed, unobserved, linked, contextual: shown, omitted };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Hands the readable cap out round-robin instead of first-come.
|
|
98
|
+
*
|
|
99
|
+
* Sorting puts the workspace first, so a plain `slice` gave the whole cap to
|
|
100
|
+
* whichever unit sorted first: twenty churning docs were enough to print ZERO
|
|
101
|
+
* files from the isolation unit where a plan-exec session does its actual work,
|
|
102
|
+
* while the scope line went on announcing that unit as observed. A reader
|
|
103
|
+
* cannot tell that from a clean unit, which is the confusion AC-06 forbids.
|
|
104
|
+
* The cap stays global — AC-05 says twenty contextual entries — but every unit
|
|
105
|
+
* gets a turn before any unit gets a second entry.
|
|
106
|
+
*/
|
|
107
|
+
function shareTheCap(contextual) {
|
|
108
|
+
const byUnit = new Map();
|
|
109
|
+
for (const entry of contextual) {
|
|
110
|
+
const bucket = byUnit.get(entry.unit);
|
|
111
|
+
if (bucket === undefined)
|
|
112
|
+
byUnit.set(entry.unit, [entry]);
|
|
113
|
+
else
|
|
114
|
+
bucket.push(entry);
|
|
115
|
+
}
|
|
116
|
+
const queues = [...byUnit.entries()];
|
|
117
|
+
const quotas = quotaPerUnit(queues.map(([, queue]) => queue.length));
|
|
118
|
+
const shown = [];
|
|
119
|
+
// Whatever exceeds a unit's quota is what the cap left out, named by its unit
|
|
120
|
+
// so the truncation says WHOSE entries are missing, not merely how many.
|
|
121
|
+
const omitted = [];
|
|
122
|
+
for (const [index, [unit, queue]] of queues.entries()) {
|
|
123
|
+
const quota = quotas[index] ?? 0;
|
|
124
|
+
shown.push(...queue.slice(0, quota));
|
|
125
|
+
if (queue.length > quota)
|
|
126
|
+
omitted.push({ unit, count: queue.length - quota });
|
|
127
|
+
}
|
|
128
|
+
shown.sort(byUnitThenPath);
|
|
129
|
+
return { shown, omitted };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Hands out {@link CONTEXTUAL_LIMIT} places round-robin over the given sizes.
|
|
133
|
+
*
|
|
134
|
+
* One place per unit per round, so a unit with three entries keeps all three
|
|
135
|
+
* while a unit with three hundred takes the slack — instead of whichever unit
|
|
136
|
+
* sorted first swallowing the entire cap.
|
|
137
|
+
*/
|
|
138
|
+
function quotaPerUnit(sizes) {
|
|
139
|
+
const quotas = sizes.map(() => 0);
|
|
140
|
+
let left = CONTEXTUAL_LIMIT;
|
|
141
|
+
let progressed = true;
|
|
142
|
+
while (left > 0 && progressed) {
|
|
143
|
+
progressed = false;
|
|
144
|
+
for (let i = 0; i < sizes.length && left > 0; i += 1) {
|
|
145
|
+
if ((quotas[i] ?? 0) >= (sizes[i] ?? 0))
|
|
146
|
+
continue;
|
|
147
|
+
quotas[i] = (quotas[i] ?? 0) + 1;
|
|
148
|
+
left -= 1;
|
|
149
|
+
progressed = true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return quotas;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The units this session may report on, refusing the ones it cannot name.
|
|
156
|
+
*
|
|
157
|
+
* `isCustodyShape` only checks that `sources` is an array, so every field of an
|
|
158
|
+
* entry reaches here unverified whatever the type claims — a hand-edited or
|
|
159
|
+
* truncated custody is enough. A missing path used to become `cwd: undefined`,
|
|
160
|
+
* which makes git run in the PROCESS's own directory and publish another
|
|
161
|
+
* repository's files as this unit's: the exact defect this module exists to
|
|
162
|
+
* close, with no signal at all. Refusing loudly is the whole point.
|
|
163
|
+
*/
|
|
164
|
+
function unitsInScope(sources, workspaceRoot, unobserved) {
|
|
165
|
+
const units = [{ alias: WORKSPACE_UNIT, boundary: workspaceRoot }];
|
|
166
|
+
for (const source of sources) {
|
|
167
|
+
// The isolation unit is where this session's own edits live; a session that
|
|
168
|
+
// took none could only have touched the source checkout itself.
|
|
169
|
+
const boundary = source.unit_path ?? source.path;
|
|
170
|
+
const named = typeof source.alias === "string" && source.alias !== "";
|
|
171
|
+
const alias = named ? source.alias : "(sin alias)";
|
|
172
|
+
if (typeof boundary !== "string" || boundary === "") {
|
|
173
|
+
unobserved.push({
|
|
174
|
+
alias,
|
|
175
|
+
boundary: "(sin ruta)",
|
|
176
|
+
reason: "la custodia no declara unit_path ni path",
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
else if (alias === WORKSPACE_UNIT) {
|
|
180
|
+
// Two units answering to one name would read each other's counts.
|
|
181
|
+
unobserved.push({
|
|
182
|
+
alias,
|
|
183
|
+
boundary,
|
|
184
|
+
reason: `una unidad fuente no puede llamarse ${WORKSPACE_UNIT}`,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
units.push({ alias, boundary });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return units;
|
|
192
|
+
}
|
|
193
|
+
async function observeUnit(git, unit, claimed) {
|
|
194
|
+
const prefix = await git.repoPrefix(unit.boundary);
|
|
195
|
+
if (prefix === null) {
|
|
196
|
+
throw new Error(`${unit.boundary} no está dentro de un repositorio Git`);
|
|
197
|
+
}
|
|
198
|
+
const entries = [];
|
|
199
|
+
for (const change of await git.localChanges(unit.boundary)) {
|
|
200
|
+
const path = withinBoundary(change.path, prefix);
|
|
201
|
+
if (path === null)
|
|
202
|
+
continue;
|
|
203
|
+
entries.push({
|
|
204
|
+
unit: unit.alias,
|
|
205
|
+
path,
|
|
206
|
+
added: null,
|
|
207
|
+
removed: null,
|
|
208
|
+
untracked: change.untracked,
|
|
209
|
+
// Only the workspace unit can match: custody spells its artifacts
|
|
210
|
+
// relative to the workspace and nothing else.
|
|
211
|
+
linked: unit.alias === WORKSPACE_UNIT && claimed.has(path),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return entries;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* The path relative to the boundary, or `null` when it falls outside it.
|
|
218
|
+
*
|
|
219
|
+
* `localChanges` answers for the whole repository, so in a nested workspace
|
|
220
|
+
* everything a sibling project changed arrives here too. This is the single line
|
|
221
|
+
* that keeps somebody else's work out of this session's checkpoint.
|
|
222
|
+
*/
|
|
223
|
+
function withinBoundary(repoRelative, prefix) {
|
|
224
|
+
if (prefix === "")
|
|
225
|
+
return repoRelative;
|
|
226
|
+
return repoRelative.startsWith(prefix) ? repoRelative.slice(prefix.length) : null;
|
|
227
|
+
}
|
|
228
|
+
async function fillCounts(git, units, entries) {
|
|
229
|
+
// Walked directly, never indexed by alias: a Map keyed on the alias made two
|
|
230
|
+
// units answering to one name read each other's repository for their counts.
|
|
231
|
+
for (const { alias, boundary } of units) {
|
|
232
|
+
const mine = entries.filter((entry) => entry.unit === alias);
|
|
233
|
+
if (mine.length === 0)
|
|
234
|
+
continue;
|
|
235
|
+
const tracked = mine.filter((entry) => !entry.untracked).map((entry) => entry.path);
|
|
236
|
+
const untracked = mine.filter((entry) => entry.untracked).map((entry) => entry.path);
|
|
237
|
+
let counts;
|
|
238
|
+
try {
|
|
239
|
+
counts = await git.numstatFor(boundary, tracked, untracked);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Counts are decoration on top of the path. Losing them is worth a line
|
|
243
|
+
// without numbers, never a section without the file.
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
for (const entry of mine) {
|
|
247
|
+
const found = counts[entry.path];
|
|
248
|
+
if (found === undefined)
|
|
249
|
+
continue;
|
|
250
|
+
entry.added = found.added;
|
|
251
|
+
entry.removed = found.removed;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/** A total order, so two readings of the same tree cannot disagree. */
|
|
256
|
+
function byUnitThenPath(a, b) {
|
|
257
|
+
if (a.unit !== b.unit) {
|
|
258
|
+
if (a.unit === WORKSPACE_UNIT)
|
|
259
|
+
return -1;
|
|
260
|
+
if (b.unit === WORKSPACE_UNIT)
|
|
261
|
+
return 1;
|
|
262
|
+
return a.unit < b.unit ? -1 : 1;
|
|
263
|
+
}
|
|
264
|
+
if (a.path === b.path)
|
|
265
|
+
return 0;
|
|
266
|
+
return a.path < b.path ? -1 : 1;
|
|
267
|
+
}
|
|
268
|
+
function reasonOf(err) {
|
|
269
|
+
return err instanceof Error ? err.message : String(err);
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=files-touched.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files-touched.js","sourceRoot":"","sources":["../../../src/application/checkpoint/files-touched.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { CONTEXTUAL_LIMIT, WORKSPACE_UNIT, } from "./files-touched.js";
|
|
2
3
|
/**
|
|
3
4
|
* The trailing seal: a digest of the very bytes this module emitted.
|
|
4
5
|
*
|
|
@@ -60,20 +61,72 @@ function appendDecisions(lines, state) {
|
|
|
60
61
|
lines.push("_No decisions recorded._");
|
|
61
62
|
}
|
|
62
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* The heading no longer says "post-last-commit".
|
|
66
|
+
*
|
|
67
|
+
* It promised a window this section never delivered — the inventory is the
|
|
68
|
+
* CURRENT state of the tree, and reading it as "what changed since the last
|
|
69
|
+
* commit of this session" is what made an operator distrust it. The reference
|
|
70
|
+
* each unit is actually compared against is now stated in the section itself,
|
|
71
|
+
* which is both honest and more useful than a label in the heading. The former
|
|
72
|
+
* headings stay readable: they are kept as aliases in the heading table.
|
|
73
|
+
*/
|
|
63
74
|
function appendFilesTouched(lines, state) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
75
|
+
const touched = state.files_touched;
|
|
76
|
+
lines.push("", "## Files touched", "");
|
|
77
|
+
lines.push(scopeLine(touched), "");
|
|
78
|
+
for (const unit of touched.unobserved) {
|
|
79
|
+
lines.push(`- **Not observed — ${unit.alias}** at \`${unit.boundary}\`: ${unit.reason}`);
|
|
80
|
+
}
|
|
81
|
+
if (touched.unobserved.length > 0)
|
|
82
|
+
lines.push("");
|
|
83
|
+
// Claimed paths first: the readable cap applies to the rest, so nothing the
|
|
84
|
+
// session actually produced can be pushed out of sight by unrelated noise.
|
|
85
|
+
const shown = [...touched.linked, ...touched.contextual];
|
|
86
|
+
if (shown.length === 0) {
|
|
87
|
+
// "Nothing changed" is only sayable when something was read. A collection
|
|
88
|
+
// that failed is declared above and must never be spelled as a clean tree.
|
|
89
|
+
lines.push(touched.observed.length === 0
|
|
90
|
+
? "_No unit in scope could be read — see the declaration above._"
|
|
91
|
+
: "_No uncommitted changes inside the scope above._");
|
|
68
92
|
return;
|
|
69
93
|
}
|
|
70
|
-
for (const
|
|
71
|
-
lines.push(`- ${
|
|
94
|
+
for (const file of shown) {
|
|
95
|
+
lines.push(`- ${labelOf(file)}${countsOf(file)} — _[AI: purpose in 1 line]_`);
|
|
72
96
|
}
|
|
73
|
-
if (
|
|
74
|
-
|
|
97
|
+
if (touched.omitted.length > 0) {
|
|
98
|
+
// Named by unit, not merely counted: "30 more" over two units reads as if
|
|
99
|
+
// both were shown, and a reader has no way to tell which one was cut.
|
|
100
|
+
const total = touched.omitted.reduce((sum, entry) => sum + entry.count, 0);
|
|
101
|
+
const noun = total === 1 ? "change" : "changes";
|
|
102
|
+
const perUnit = touched.omitted.map((entry) => `${entry.unit} ${entry.count}`).join(", ");
|
|
103
|
+
lines.push(`- _… and ${total} more contextual ${noun} not listed (cap ${CONTEXTUAL_LIMIT}): ${perUnit}_`);
|
|
75
104
|
}
|
|
76
105
|
}
|
|
106
|
+
/** States the boundary and the reference, so the inventory explains itself. */
|
|
107
|
+
function scopeLine(touched) {
|
|
108
|
+
if (touched.observed.length === 0) {
|
|
109
|
+
return "_Scope: no unit could be read. What this section reports is the current working-tree state, never a window over the session._";
|
|
110
|
+
}
|
|
111
|
+
const units = touched.observed.map((unit) => {
|
|
112
|
+
const reference = unit.reference === null ? "no commit yet" : `vs ${unit.reference.slice(0, 7)}`;
|
|
113
|
+
return `${unit.alias} at \`${unit.boundary}\` (${reference})`;
|
|
114
|
+
});
|
|
115
|
+
return `_Scope: ${units.join("; ")}. Current working-tree state, untracked files included — not a window over the session._`;
|
|
116
|
+
}
|
|
117
|
+
/** A path from another unit is spelled with its alias: two units can share one. */
|
|
118
|
+
function labelOf(file) {
|
|
119
|
+
return file.unit === WORKSPACE_UNIT ? file.path : `${file.unit}:${file.path}`;
|
|
120
|
+
}
|
|
121
|
+
function countsOf(file) {
|
|
122
|
+
if (file.added === null || file.removed === null)
|
|
123
|
+
return "";
|
|
124
|
+
// git spells a binary file's deltas as `-`, and `(+- --)` reads like a
|
|
125
|
+
// rendering bug rather than like "this file has no line count".
|
|
126
|
+
if (file.added === "-" || file.removed === "-")
|
|
127
|
+
return " (binary)";
|
|
128
|
+
return ` (+${file.added} -${file.removed})`;
|
|
129
|
+
}
|
|
77
130
|
function appendContext(lines) {
|
|
78
131
|
lines.push("", "## Critical context to resume", "");
|
|
79
132
|
lines.push("_[AI: 2-3 paragraphs with the minimum info needed to continue without re-exploring. What was discovered, what decisions are settled, what to keep in mind.]_");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/application/checkpoint/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/application/checkpoint/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { localMinuteIso } from "../dates.js";
|
|
3
3
|
import { findArtifact, listExistingArtifacts } from "../session-artifacts.js";
|
|
4
|
-
|
|
4
|
+
import { collectFilesTouched } from "./files-touched.js";
|
|
5
|
+
/**
|
|
6
|
+
* `workspaceRoot` and not the process's cwd on purpose: the cwd is wherever the
|
|
7
|
+
* operator happened to stand, and using it made the inventory's boundary an
|
|
8
|
+
* accident of invocation instead of a property of the session.
|
|
9
|
+
*/
|
|
10
|
+
export async function extractSessionState(fs, git, workspaceRoot, sessionPath) {
|
|
5
11
|
const folder = sessionPath.split(/[\\/]/).pop() ?? "";
|
|
6
12
|
const tasks = await countTasks(fs, sessionPath);
|
|
7
13
|
const progressPct = tasks.total > 0 ? Math.round((100 * tasks.closed) / tasks.total) : null;
|
|
8
14
|
const lastDecision = await readLastDecision(fs, sessionPath);
|
|
9
15
|
const artefacts = await listArtefacts(fs, sessionPath);
|
|
10
|
-
const filesTouched = await git
|
|
16
|
+
const filesTouched = await collectFilesTouched(fs, git, workspaceRoot, sessionPath);
|
|
11
17
|
const origen = await readOrigen(fs, sessionPath);
|
|
12
18
|
return {
|
|
13
19
|
folder,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-reader.js","sourceRoot":"","sources":["../../../src/application/checkpoint/state-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"state-reader.js","sourceRoot":"","sources":["../../../src/application/checkpoint/state-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { findActiveSessions } from "./checkpoint-service.js";
|
|
3
|
+
import { totalInScope } from "./checkpoint/files-touched.js";
|
|
3
4
|
import { formatCheckpointMd, isPristineCheckpoint } from "./checkpoint/markdown.js";
|
|
4
5
|
import { extractSessionState } from "./checkpoint/state-reader.js";
|
|
5
6
|
import { resolveLifecycleTarget, unresolvedDetail, } from "./lifecycle-target.js";
|
|
7
|
+
import { resolveWorkspaceRoot } from "./paths-service.js";
|
|
6
8
|
import { writeSessionNarrative } from "./session-narrative.js";
|
|
7
9
|
// This module deliberately owns NO placeholder marker of its own. `_[AI:` used
|
|
8
10
|
// to be declared here as well as in `checkpoint-service.ts`, with incompatible
|
|
@@ -37,7 +39,15 @@ export async function runCheckpointWrite(fs, env, git, paths, options = {}) {
|
|
|
37
39
|
reason: PRESERVED_REASON,
|
|
38
40
|
};
|
|
39
41
|
}
|
|
40
|
-
|
|
42
|
+
// The workspace root rather than the raw cwd. Today the two coincide by
|
|
43
|
+
// construction — session resolution already refuses to run from a
|
|
44
|
+
// subdirectory, so nothing reaches here with a deeper cwd — and what actually
|
|
45
|
+
// bounds the reading is `repoPrefix` inside the collection. This stays the
|
|
46
|
+
// resolved root anyway: it is the value the boundary is DEFINED as, so the
|
|
47
|
+
// day session resolution learns to walk up, the inventory does not silently
|
|
48
|
+
// widen to the parent repository along with it.
|
|
49
|
+
const workspaceRoot = await resolveWorkspaceRoot(fs, env, paths);
|
|
50
|
+
const state = await extractSessionState(fs, git, workspaceRoot, session.path);
|
|
41
51
|
const md = formatCheckpointMd(state);
|
|
42
52
|
await fs.mkdirp(session.path);
|
|
43
53
|
await fs.writeText(cpPath, md);
|
|
@@ -52,7 +62,7 @@ export async function runCheckpointWrite(fs, env, git, paths, options = {}) {
|
|
|
52
62
|
progress_pct: state.progress_pct,
|
|
53
63
|
tasks_open: state.tasks.open,
|
|
54
64
|
tasks_closed: state.tasks.closed,
|
|
55
|
-
files_touched_count: state.files_touched
|
|
65
|
+
files_touched_count: totalInScope(state.files_touched),
|
|
56
66
|
};
|
|
57
67
|
}
|
|
58
68
|
/**
|
|
@@ -78,10 +88,11 @@ export async function runAutoCompactOnClose(fs, env, git, paths, options = {}) {
|
|
|
78
88
|
action: detail.action,
|
|
79
89
|
};
|
|
80
90
|
}
|
|
81
|
-
const
|
|
91
|
+
const workspaceRoot = await resolveWorkspaceRoot(fs, env, paths);
|
|
92
|
+
const entry = await writeCheckpointForTarget(fs, git, workspaceRoot, target.session);
|
|
82
93
|
return { checkpoints_written: [entry] };
|
|
83
94
|
}
|
|
84
|
-
async function writeCheckpointForTarget(fs, git,
|
|
95
|
+
async function writeCheckpointForTarget(fs, git, workspaceRoot, session) {
|
|
85
96
|
const cpPath = join(session.path, "CHECKPOINT.md");
|
|
86
97
|
// No `force` here on purpose: SessionEnd is a hook, and a hook is never the
|
|
87
98
|
// declared intention that AC-02 asks for before overwriting content.
|
|
@@ -95,7 +106,7 @@ async function writeCheckpointForTarget(fs, git, cwd, session) {
|
|
|
95
106
|
};
|
|
96
107
|
}
|
|
97
108
|
try {
|
|
98
|
-
const state = await extractSessionState(fs, git,
|
|
109
|
+
const state = await extractSessionState(fs, git, workspaceRoot, session.path);
|
|
99
110
|
const md = formatCheckpointMd(state);
|
|
100
111
|
await fs.mkdirp(session.path);
|
|
101
112
|
await fs.writeText(cpPath, md);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint-write-service.js","sourceRoot":"","sources":["../../src/application/checkpoint-write-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAGL,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"checkpoint-write-service.js","sourceRoot":"","sources":["../../src/application/checkpoint-write-service.ts"],"names":[],"mappings":"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"}
|