@tacuchi/agent-workflow-cli 20.22.0 → 20.24.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/dist/adapters/git-cli.js +42 -0
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/application/artifacts-service.js +5 -5
- package/dist/application/artifacts-service.js.map +1 -1
- package/dist/application/checkpoint-service.js +60 -55
- package/dist/application/checkpoint-service.js.map +1 -1
- package/dist/application/checkpoint-write-service.js +61 -66
- package/dist/application/checkpoint-write-service.js.map +1 -1
- package/dist/application/context/budget-service.js +128 -0
- package/dist/application/context/budget-service.js.map +1 -0
- package/dist/application/context/bundle-root.js +41 -0
- package/dist/application/context/bundle-root.js.map +1 -0
- package/dist/application/context/manifest.js +150 -0
- package/dist/application/context/manifest.js.map +1 -0
- package/dist/application/context/measure.js +227 -0
- package/dist/application/context/measure.js.map +1 -0
- package/dist/application/context/plan-service.js +177 -0
- package/dist/application/context/plan-service.js.map +1 -0
- package/dist/application/decisiones-service.js +5 -5
- package/dist/application/decisiones-service.js.map +1 -1
- package/dist/application/export-service.js +250 -0
- package/dist/application/export-service.js.map +1 -0
- package/dist/application/fix-git-service.js +244 -0
- package/dist/application/fix-git-service.js.map +1 -0
- package/dist/application/history-update-service.js +35 -24
- package/dist/application/history-update-service.js.map +1 -1
- package/dist/application/lifecycle-target.js +39 -0
- package/dist/application/lifecycle-target.js.map +1 -0
- package/dist/application/parsers/spec-relation.js +80 -0
- package/dist/application/parsers/spec-relation.js.map +1 -0
- package/dist/application/paths-service.js +8 -0
- package/dist/application/paths-service.js.map +1 -1
- package/dist/application/persist-service.js +285 -0
- package/dist/application/persist-service.js.map +1 -0
- package/dist/application/release-data/artifacts.js +17 -21
- package/dist/application/release-data/artifacts.js.map +1 -1
- package/dist/application/resume-service.js +184 -0
- package/dist/application/resume-service.js.map +1 -0
- package/dist/application/semantic-operation/protocol.js +247 -0
- package/dist/application/semantic-operation/protocol.js.map +1 -0
- package/dist/application/semantic-operation/publish.js +80 -0
- package/dist/application/semantic-operation/publish.js.map +1 -0
- package/dist/application/session-binding-service.js +125 -0
- package/dist/application/session-binding-service.js.map +1 -0
- package/dist/application/session-close-service.js +60 -39
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/session-create-service.js +45 -19
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/session-resolver.js +180 -44
- package/dist/application/session-resolver.js.map +1 -1
- package/dist/application/session-resume-service.js +39 -9
- package/dist/application/session-resume-service.js.map +1 -1
- package/dist/application/sessions-service.js +0 -2
- package/dist/application/sessions-service.js.map +1 -1
- package/dist/application/status-service.js +24 -388
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/tasks-service.js +5 -5
- package/dist/application/tasks-service.js.map +1 -1
- package/dist/application/workline-index-service.js +510 -0
- package/dist/application/workline-index-service.js.map +1 -0
- package/dist/cli/commands/checkpoint-read.js +10 -6
- package/dist/cli/commands/checkpoint-read.js.map +1 -1
- package/dist/cli/commands/checkpoint-write.js +38 -11
- package/dist/cli/commands/checkpoint-write.js.map +1 -1
- package/dist/cli/commands/context-budget.js +79 -0
- package/dist/cli/commands/context-budget.js.map +1 -0
- package/dist/cli/commands/context-plan.js +75 -0
- package/dist/cli/commands/context-plan.js.map +1 -0
- package/dist/cli/commands/export.js +117 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/fix-git.js +109 -0
- package/dist/cli/commands/fix-git.js.map +1 -0
- package/dist/cli/commands/generate-launch.js +35 -3
- package/dist/cli/commands/generate-launch.js.map +1 -1
- package/dist/cli/commands/history-update.js +1 -1
- package/dist/cli/commands/history-update.js.map +1 -1
- package/dist/cli/commands/index.js +15 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/persist.js +67 -0
- package/dist/cli/commands/persist.js.map +1 -0
- package/dist/cli/commands/resume-summary.js +14 -3
- package/dist/cli/commands/resume-summary.js.map +1 -1
- package/dist/cli/commands/resume.js +73 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/session-artifacts.js +12 -11
- package/dist/cli/commands/session-artifacts.js.map +1 -1
- package/dist/cli/commands/session-close.js +8 -7
- package/dist/cli/commands/session-close.js.map +1 -1
- package/dist/cli/commands/session-create.js +5 -1
- package/dist/cli/commands/session-create.js.map +1 -1
- package/dist/cli/commands/session-resume.js +16 -10
- package/dist/cli/commands/session-resume.js.map +1 -1
- package/dist/cli/commands/status.js +66 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/workspace-init.js +21 -2
- package/dist/cli/commands/workspace-init.js.map +1 -1
- package/dist/cli/context-id.js +133 -0
- package/dist/cli/context-id.js.map +1 -0
- package/dist/cli/help-groups.js +20 -1
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +44 -16
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output-mode.js +41 -0
- package/dist/cli/output-mode.js.map +1 -0
- package/dist/cli/parser.js +10 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/render.js +53 -0
- package/dist/cli/render.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/SKILL.md +2 -2
- package/skills/w/commands/export-diagrams.md +13 -21
- package/skills/w/commands/export-manuals.md +15 -21
- package/skills/w/commands/export-reports.md +14 -21
- package/skills/w/commands/export-scripts.md +14 -21
- package/skills/w/commands/fix-git.md +24 -16
- package/skills/w/commands/generate-launch.md +13 -32
- package/skills/w/commands/persist.md +21 -77
- package/skills/w/commands/plan-exec.md +14 -30
- package/skills/w/commands/plan-new.md +11 -38
- package/skills/w/commands/plan-refine.md +13 -41
- package/skills/w/commands/quick.md +13 -20
- package/skills/w/commands/resume.md +19 -56
- package/skills/w/commands/spec-new.md +28 -69
- package/skills/w/commands/spec-refine.md +12 -37
- package/skills/w/commands/status.md +12 -55
- package/skills/w/commands/workspace-init.md +14 -21
- package/skills/w/context/MANIFEST.json +486 -0
- package/skills/w/harness/HARNESS.md +1 -1
- package/skills/w/hooks/README.md +21 -2
- package/skills/w/hooks/hooks.template.json +2 -2
- package/skills/w/loops/CHASSIS.md +53 -104
- package/skills/w/loops/CODE-POLICIES.md +4 -9
- package/skills/w/loops/plan-exec-loop/LOOP.md +5 -12
- package/skills/w/loops/plan-new-loop/LOOP.md +8 -32
- package/skills/w/loops/plan-refine-loop/LOOP.md +8 -36
- package/skills/w/loops/quick-loop/LOOP.md +4 -10
- package/skills/w/loops/spec-refine-loop/LOOP.md +7 -49
- package/skills/w/modules/ADOPTED-CONTEXT.md +10 -0
- package/skills/w/modules/COMPACTION.md +13 -0
- package/skills/w/modules/DB-RESEARCH-RULE.md +11 -0
- package/skills/w/modules/DB-SCRIPTS-ONLY.md +12 -0
- package/skills/w/modules/EXEC-DB-POLICY.md +7 -0
- package/skills/w/modules/EXEC-PROBE-TASKS.md +11 -0
- package/skills/w/modules/IDEATION-GATE.md +16 -0
- package/skills/w/modules/INCREMENTAL-STRATEGY.md +7 -0
- package/skills/w/modules/LAUNCH-DETECTION.md +26 -0
- package/skills/w/modules/PERSIST-ROUTING.md +16 -0
- package/skills/w/modules/PLAN-DESIGN-SPECS.md +12 -0
- package/skills/w/modules/PLAN-INPUT.md +26 -0
- package/skills/w/modules/PLAN-MODE.md +26 -0
- package/skills/w/modules/PLAN-PROBE-TASKS.md +10 -0
- package/skills/w/modules/PLAN-REFINE-DESIGN-SPECS.md +7 -0
- package/skills/w/modules/PLAN-REFINE-KEYS.md +9 -0
- package/skills/w/modules/PLAN-REFINE-SPLIT.md +12 -0
- package/skills/w/modules/PLAN-SPLIT-GATE.md +14 -0
- package/skills/w/modules/PROBE.md +12 -0
- package/skills/w/modules/PROMPT-CONTINUITY.md +13 -0
- package/skills/w/modules/RECONNAISSANCE.md +48 -0
- package/skills/w/modules/REPLANNING.md +12 -0
- package/skills/w/modules/SESSION-NUMBERING.md +19 -0
- package/skills/w/modules/SIMULATION-LIFECYCLE.md +11 -0
- package/skills/w/modules/SPEC-CHANGE-SHAPE.md +37 -0
- package/skills/w/modules/SPEC-REFINE-KEYS.md +14 -0
- package/skills/w/modules/SPLIT-GATE.md +42 -0
- package/skills/w/modules/WORKSPACE-SCAFFOLD.md +28 -0
- package/skills/w/roles/git/ROLE.md +7 -8
- package/skills/w/roles/ui-spec/ROLE.md +1 -1
|
@@ -1,403 +1,39 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { localDateIso } from "./dates.js";
|
|
3
|
-
import { humanizeRelativeEs } from "./humanize-es.js";
|
|
4
|
-
import { firstNonEmptyLine, parseMdSection } from "./markdown.js";
|
|
5
|
-
import { parsePhases } from "./parsers/phases.js";
|
|
6
|
-
import { parsePlanStatus } from "./parsers/plan-status.js";
|
|
7
|
-
import { parseProjectBlock } from "./parsers/project-block.js";
|
|
8
|
-
import { parseTasks } from "./parsers/tasks.js";
|
|
9
|
-
import { findArtifact } from "./session-artifacts.js";
|
|
10
|
-
import { SessionsService } from "./sessions-service.js";
|
|
11
|
-
const SPEC_STATUSES = ["draft", "refining", "ready-for-plan"];
|
|
1
|
+
import { buildWorklineIndex, } from "./workline-index-service.js";
|
|
12
2
|
/**
|
|
13
3
|
* Read-only whole-workspace status aggregator. Never throws on a reachable cwd:
|
|
14
4
|
* an uninitialized workspace returns `initialized:false` with empty collections;
|
|
15
5
|
* a single unreadable file is skipped rather than tanking the command.
|
|
16
6
|
*/
|
|
17
7
|
export async function runStatusCommand(fs, env, paths, input = {}) {
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
8
|
+
const index = await buildWorklineIndex(fs, env, paths, input);
|
|
9
|
+
const active = [];
|
|
10
|
+
const closed = [];
|
|
11
|
+
for (const session of index.sessions) {
|
|
12
|
+
(session.state === "closed" ? closed : active).push({
|
|
13
|
+
code: session.code,
|
|
14
|
+
folder: session.folder,
|
|
15
|
+
type: session.type,
|
|
16
|
+
summary: session.summary,
|
|
17
|
+
date: session.date,
|
|
18
|
+
relative: session.relative,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
25
21
|
return {
|
|
26
|
-
workspace,
|
|
27
|
-
specs,
|
|
28
|
-
plans,
|
|
22
|
+
workspace: index.workspace,
|
|
23
|
+
specs: index.specs,
|
|
24
|
+
plans: index.plans,
|
|
29
25
|
sessions: { active, closed },
|
|
30
|
-
discarded,
|
|
26
|
+
discarded: index.discarded,
|
|
27
|
+
pipeline: index.pipeline,
|
|
31
28
|
counts: {
|
|
32
|
-
specs: specs.length,
|
|
33
|
-
specs_refined: specs.filter((s) => s.refined).length,
|
|
34
|
-
plans: plans.length,
|
|
29
|
+
specs: index.specs.length,
|
|
30
|
+
specs_refined: index.specs.filter((s) => s.refined).length,
|
|
31
|
+
plans: index.plans.length,
|
|
35
32
|
sessions_active: active.length,
|
|
36
33
|
sessions_closed: closed.length,
|
|
37
|
-
discarded: discarded.length,
|
|
34
|
+
discarded: index.discarded.length,
|
|
35
|
+
pending: index.pipeline.length,
|
|
38
36
|
},
|
|
39
37
|
};
|
|
40
38
|
}
|
|
41
|
-
// ── workspace ──────────────────────────────────────────────────────────────
|
|
42
|
-
async function readWorkspace(fs, paths, cwd) {
|
|
43
|
-
let name = basename(cwd);
|
|
44
|
-
for (const file of [join(cwd, "CLAUDE.md"), join(cwd, "AGENTS.md")]) {
|
|
45
|
-
try {
|
|
46
|
-
if (!(await fs.exists(file)))
|
|
47
|
-
continue;
|
|
48
|
-
const block = parseProjectBlock(await fs.readText(file), paths.blockMarkers());
|
|
49
|
-
if (block?.proyecto) {
|
|
50
|
-
name = block.proyecto;
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
// ignore; fall back to basename
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
const initialized = await safeExists(fs, paths.cwdRoot());
|
|
59
|
-
return { name, path: cwd, initialized };
|
|
60
|
-
}
|
|
61
|
-
// ── specs ──────────────────────────────────────────────────────────────────
|
|
62
|
-
const SPEC_RE = /^(\d{3})-spec(?:-(.+))?\.md$/i;
|
|
63
|
-
async function readSpecs(fs, cwd, now) {
|
|
64
|
-
const dir = join(cwd, "docs", "specs");
|
|
65
|
-
const files = await listMarkdown(fs, dir, SPEC_RE);
|
|
66
|
-
const deduped = dedupeRefined(files);
|
|
67
|
-
const out = [];
|
|
68
|
-
for (const f of deduped) {
|
|
69
|
-
try {
|
|
70
|
-
const text = await fs.readText(f.path);
|
|
71
|
-
const status = resolveSpecStatus(text);
|
|
72
|
-
const ts = await resolveTimestamp(fs, f.path, undefined, now);
|
|
73
|
-
out.push({
|
|
74
|
-
file: relFromCwd(f.path, cwd),
|
|
75
|
-
number: f.number,
|
|
76
|
-
slug: f.slug,
|
|
77
|
-
status,
|
|
78
|
-
refined: status === "ready-for-plan",
|
|
79
|
-
open_questions: countOpenQuestions(text),
|
|
80
|
-
date: ts.date,
|
|
81
|
-
relative: ts.relative,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
// skip unreadable spec
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return sortByNumber(out);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* The only two trace sections that marked a spec as worked-through before the
|
|
92
|
-
* frontmatter `status` existed. `## Decisions` is NOT one of them: it belongs
|
|
93
|
-
* to the current spec schema and proves nothing about the refine gate.
|
|
94
|
-
*
|
|
95
|
-
* Exported so the doctrine guard can check this list against the marks the
|
|
96
|
-
* bundle documents — the two drifted apart once, and a spec nobody refined
|
|
97
|
-
* reached PLAN because of it.
|
|
98
|
-
*/
|
|
99
|
-
export const LEGACY_READY_MARKS = ["Refinement decisions", "Q&A traceability"];
|
|
100
|
-
/**
|
|
101
|
-
* Spec maturity. A declared frontmatter governs alone: an empty, unknown or
|
|
102
|
-
* unterminated declaration reads `draft` — never a legacy inference, which
|
|
103
|
-
* would send work to PLAN on a gate `spec-refine` never ran. Legacy
|
|
104
|
-
* compatibility runs only on a spec that carries no frontmatter at all.
|
|
105
|
-
*/
|
|
106
|
-
function resolveSpecStatus(text) {
|
|
107
|
-
const frontmatter = parseSpecFrontmatter(text);
|
|
108
|
-
if (frontmatter.kind === "malformed")
|
|
109
|
-
return "draft";
|
|
110
|
-
if (frontmatter.kind === "present") {
|
|
111
|
-
const declared = (frontmatter.status ?? "").toLowerCase();
|
|
112
|
-
return isSpecStatus(declared) ? declared : "draft";
|
|
113
|
-
}
|
|
114
|
-
return hasLegacyReadyMark(text) ? "ready-for-plan" : "draft";
|
|
115
|
-
}
|
|
116
|
-
function hasLegacyReadyMark(text) {
|
|
117
|
-
return LEGACY_READY_MARKS.some((h) => parseMdSectionLoose(text, h) !== undefined);
|
|
118
|
-
}
|
|
119
|
-
function isSpecStatus(value) {
|
|
120
|
-
return SPEC_STATUSES.includes(value);
|
|
121
|
-
}
|
|
122
|
-
const FRONTMATTER_FENCE = "---";
|
|
123
|
-
const FRONTMATTER_ENTRY = /^([A-Za-z0-9_-]+):\s*(.*)$/;
|
|
124
|
-
/**
|
|
125
|
-
* Classify the `---` block at the top of the file and read its `status` scalar.
|
|
126
|
-
* Specs only carry flat scalars there, so this stays a few lines instead of
|
|
127
|
-
* pulling a YAML dependency into the CLI.
|
|
128
|
-
*/
|
|
129
|
-
function parseSpecFrontmatter(text) {
|
|
130
|
-
const lines = text.split(/\r?\n/);
|
|
131
|
-
if ((lines[0] ?? "").trim() !== FRONTMATTER_FENCE)
|
|
132
|
-
return { kind: "absent" };
|
|
133
|
-
const end = lines.findIndex((l, i) => i > 0 && l.trim() === FRONTMATTER_FENCE);
|
|
134
|
-
if (end === -1)
|
|
135
|
-
return { kind: "malformed" };
|
|
136
|
-
return { kind: "present", status: readScalar(lines.slice(1, end), "status") };
|
|
137
|
-
}
|
|
138
|
-
function readScalar(lines, key) {
|
|
139
|
-
for (const line of lines) {
|
|
140
|
-
const m = FRONTMATTER_ENTRY.exec(line);
|
|
141
|
-
if (m?.[1] !== key)
|
|
142
|
-
continue;
|
|
143
|
-
const value = (m[2] ?? "").trim().replace(/^["']|["']$/g, "");
|
|
144
|
-
return value.length > 0 ? value : undefined;
|
|
145
|
-
}
|
|
146
|
-
return undefined;
|
|
147
|
-
}
|
|
148
|
-
// ── plans ────────────────────────────────────────────────────────────────────
|
|
149
|
-
const PLAN_RE = /^(\d{3})-plan(?:-(.+))?\.md$/i;
|
|
150
|
-
async function readPlans(fs, cwd, now) {
|
|
151
|
-
const dir = join(cwd, "docs", "plans");
|
|
152
|
-
const files = await listMarkdown(fs, dir, PLAN_RE);
|
|
153
|
-
const out = [];
|
|
154
|
-
for (const f of files) {
|
|
155
|
-
try {
|
|
156
|
-
const text = await fs.readText(f.path);
|
|
157
|
-
const t = parseTasks(text);
|
|
158
|
-
const p = parsePhases(text);
|
|
159
|
-
const declared = parsePlanStatus(text).declared;
|
|
160
|
-
const planState = derivePlanState(declared, t, p);
|
|
161
|
-
const ts = await resolveTimestamp(fs, f.path, undefined, now);
|
|
162
|
-
out.push({
|
|
163
|
-
file: relFromCwd(f.path, cwd),
|
|
164
|
-
number: f.number,
|
|
165
|
-
slug: f.slug,
|
|
166
|
-
tasks_total: t.total,
|
|
167
|
-
tasks_done: t.closed,
|
|
168
|
-
progress_pct: t.progress_pct,
|
|
169
|
-
phases_total: p.total,
|
|
170
|
-
phases_validated: p.validated,
|
|
171
|
-
plan_state: planState,
|
|
172
|
-
phases_blocked: p.blocked,
|
|
173
|
-
blocked_phases: p.items
|
|
174
|
-
.filter((phase) => phase.state === "bloqueada")
|
|
175
|
-
.map((phase) => ({ number: phase.n, name: phase.name, blocker: phase.blocker })),
|
|
176
|
-
final_validation_pending: planState === "open" && p.total > 0 && p.validated === p.total && t.closed === t.total,
|
|
177
|
-
date: ts.date,
|
|
178
|
-
relative: ts.relative,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
catch {
|
|
182
|
-
// skip unreadable plan
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
return sortByNumber(out);
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* The three axes reconciled into one closure state. The rules, in order:
|
|
189
|
-
*
|
|
190
|
-
* - a plan that declares nothing, or declares `open`, IS open — including the
|
|
191
|
-
* case where every box is ticked and every phase is validated: that plan is
|
|
192
|
-
* waiting on its final validation, not finished (`final_validation_pending`);
|
|
193
|
-
* - a plan that declares `done` is `done` only when the counters agree — every
|
|
194
|
-
* task closed and, under the phase contract, every phase validated;
|
|
195
|
-
* - any other combination is `inconsistent`: the document says one thing and
|
|
196
|
-
* shows another, and nothing but a human repairs that.
|
|
197
|
-
*
|
|
198
|
-
* A plan with no phase marks predates the contract (`phases_total: 0`) and is
|
|
199
|
-
* judged by its checkboxes alone — it never acquires fictitious phases, and
|
|
200
|
-
* `done` on such a plan stays legitimate when its boxes are all ticked.
|
|
201
|
-
*/
|
|
202
|
-
function derivePlanState(declared, tasks, phases) {
|
|
203
|
-
if (declared === "unknown")
|
|
204
|
-
return "inconsistent";
|
|
205
|
-
if (declared !== "done")
|
|
206
|
-
return "open";
|
|
207
|
-
if (tasks.closed !== tasks.total)
|
|
208
|
-
return "inconsistent";
|
|
209
|
-
// Legacy contract (`legacy-tasks`): no phase marks, so the checkboxes decide.
|
|
210
|
-
if (phases.total === 0)
|
|
211
|
-
return "done";
|
|
212
|
-
return phases.validated === phases.total ? "done" : "inconsistent";
|
|
213
|
-
}
|
|
214
|
-
async function readSessions(fs, env, paths, now) {
|
|
215
|
-
const active = [];
|
|
216
|
-
const closed = [];
|
|
217
|
-
const folders = [];
|
|
218
|
-
let list;
|
|
219
|
-
try {
|
|
220
|
-
list = await new SessionsService(fs, env, paths).list({ state: "all", verbose: true });
|
|
221
|
-
}
|
|
222
|
-
catch {
|
|
223
|
-
return { active, closed, folders };
|
|
224
|
-
}
|
|
225
|
-
for (const s of list.sessions) {
|
|
226
|
-
folders.push({ code: s.code, folder: s.folder, path: s.path });
|
|
227
|
-
const primary = (await findArtifact(s.path, "session", fs)) ?? s.path;
|
|
228
|
-
const ts = await resolveTimestamp(fs, primary, s.date, now);
|
|
229
|
-
const entry = {
|
|
230
|
-
code: s.code,
|
|
231
|
-
folder: s.folder,
|
|
232
|
-
type: s.type ?? null,
|
|
233
|
-
summary: s.summary ?? s.folder,
|
|
234
|
-
date: ts.date,
|
|
235
|
-
relative: ts.relative,
|
|
236
|
-
};
|
|
237
|
-
(s.state === "closed" ? closed : active).push(entry);
|
|
238
|
-
}
|
|
239
|
-
return { active, closed, folders };
|
|
240
|
-
}
|
|
241
|
-
// ── discarded ──────────────────────────────────────────────────────────────────
|
|
242
|
-
async function readDiscarded(fs, folders, cwd, now) {
|
|
243
|
-
const out = [];
|
|
244
|
-
for (const f of folders) {
|
|
245
|
-
await collectDiscarded(fs, f, "backlog", "Deferred", "deferred", cwd, now, out);
|
|
246
|
-
await collectDiscarded(fs, f, "checkpoint", "Excluded", "excluded", cwd, now, out);
|
|
247
|
-
}
|
|
248
|
-
return out;
|
|
249
|
-
}
|
|
250
|
-
async function collectDiscarded(fs, ref, artifact, heading, kind, cwd, now, out) {
|
|
251
|
-
try {
|
|
252
|
-
const path = await findArtifact(ref.path, artifact, fs);
|
|
253
|
-
if (!path)
|
|
254
|
-
return;
|
|
255
|
-
const items = listItems(parseMdSectionLoose(await fs.readText(path), heading));
|
|
256
|
-
if (items.length === 0)
|
|
257
|
-
return;
|
|
258
|
-
const ts = await resolveTimestamp(fs, path, undefined, now);
|
|
259
|
-
for (const text of items) {
|
|
260
|
-
out.push({
|
|
261
|
-
source: ref.code ?? ref.folder,
|
|
262
|
-
source_path: relFromCwd(ref.path, cwd),
|
|
263
|
-
kind,
|
|
264
|
-
text,
|
|
265
|
-
date: ts.date,
|
|
266
|
-
relative: ts.relative,
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
catch {
|
|
271
|
-
// skip unreadable artifact
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
async function listMarkdown(fs, dir, re) {
|
|
275
|
-
if (!(await safeExists(fs, dir)))
|
|
276
|
-
return [];
|
|
277
|
-
let entries;
|
|
278
|
-
try {
|
|
279
|
-
entries = await fs.list(dir);
|
|
280
|
-
}
|
|
281
|
-
catch {
|
|
282
|
-
return [];
|
|
283
|
-
}
|
|
284
|
-
const out = [];
|
|
285
|
-
for (const e of entries) {
|
|
286
|
-
if (e.type !== "file")
|
|
287
|
-
continue;
|
|
288
|
-
const m = re.exec(e.name);
|
|
289
|
-
if (!m?.[1])
|
|
290
|
-
continue;
|
|
291
|
-
out.push({ path: e.path, number: m[1], slug: m[2] ?? "" });
|
|
292
|
-
}
|
|
293
|
-
return out;
|
|
294
|
-
}
|
|
295
|
-
/** Drop legacy `NNN-spec-refined.md` when another file shares its number. */
|
|
296
|
-
function dedupeRefined(files) {
|
|
297
|
-
const byNumber = new Map();
|
|
298
|
-
for (const f of files) {
|
|
299
|
-
const group = byNumber.get(f.number) ?? [];
|
|
300
|
-
group.push(f);
|
|
301
|
-
byNumber.set(f.number, group);
|
|
302
|
-
}
|
|
303
|
-
const out = [];
|
|
304
|
-
for (const group of byNumber.values()) {
|
|
305
|
-
const isRefined = (f) => /(^|-)refined$/i.test(f.slug);
|
|
306
|
-
const nonRefined = group.filter((f) => !isRefined(f));
|
|
307
|
-
const chosen = nonRefined.length > 0 ? nonRefined : group;
|
|
308
|
-
chosen.sort((a, b) => a.path.localeCompare(b.path));
|
|
309
|
-
const first = chosen[0];
|
|
310
|
-
if (first)
|
|
311
|
-
out.push(first);
|
|
312
|
-
}
|
|
313
|
-
return out;
|
|
314
|
-
}
|
|
315
|
-
function sortByNumber(items) {
|
|
316
|
-
return items.sort((a, b) => a.number.localeCompare(b.number) || a.file.localeCompare(b.file));
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Best-available timestamp for `relative`/`date`: full-precision fs mtime if the
|
|
320
|
-
* path stats, else a date-only fallback projected to local noon, else `now`.
|
|
321
|
-
*/
|
|
322
|
-
async function resolveTimestamp(fs, path, fallbackDateOnly, now) {
|
|
323
|
-
let mtime = null;
|
|
324
|
-
try {
|
|
325
|
-
mtime = (await fs.stat(path)).mtime;
|
|
326
|
-
}
|
|
327
|
-
catch {
|
|
328
|
-
mtime = null;
|
|
329
|
-
}
|
|
330
|
-
const when = mtime ?? dateOnlyToNoon(fallbackDateOnly) ?? now;
|
|
331
|
-
return {
|
|
332
|
-
date: localDateIso(when),
|
|
333
|
-
relative: humanizeRelativeEs(when, now),
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
|
-
function dateOnlyToNoon(dateStr) {
|
|
337
|
-
if (!dateStr)
|
|
338
|
-
return null;
|
|
339
|
-
const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(dateStr);
|
|
340
|
-
if (!m)
|
|
341
|
-
return null;
|
|
342
|
-
return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]), 12, 0, 0);
|
|
343
|
-
}
|
|
344
|
-
async function safeExists(fs, path) {
|
|
345
|
-
try {
|
|
346
|
-
return await fs.exists(path);
|
|
347
|
-
}
|
|
348
|
-
catch {
|
|
349
|
-
return false;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
function relFromCwd(path, cwd) {
|
|
353
|
-
// path.relative handles the win32 case a raw string-prefix strip missed: join()
|
|
354
|
-
// yields backslash paths while the old prefix appended a forward slash, so the
|
|
355
|
-
// strip never matched and status showed absolute paths. Normalize to forward
|
|
356
|
-
// slashes so the displayed path reads the same on every OS.
|
|
357
|
-
return relative(cwd, path).split("\\").join("/");
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Like `parseMdSection` but tolerant of the template heading annotations
|
|
361
|
-
* (`## Excluded (list):`, `## Deferred (text):`) — ignores a trailing
|
|
362
|
-
* `(...)` / `:`; needed for legacy artifacts that still carry the suffix.
|
|
363
|
-
*/
|
|
364
|
-
const parseMdSectionLoose = (text, heading) => parseMdSection(text, heading, normalizeHeading);
|
|
365
|
-
function normalizeHeading(raw) {
|
|
366
|
-
return raw
|
|
367
|
-
.trim()
|
|
368
|
-
.toLowerCase()
|
|
369
|
-
.replace(/\s*\([^)]*\)\s*:?\s*$/, "")
|
|
370
|
-
.replace(/:\s*$/, "")
|
|
371
|
-
.trim();
|
|
372
|
-
}
|
|
373
|
-
/** List-item lines of a section, dropping the `List of …` template placeholder. */
|
|
374
|
-
function listItems(section) {
|
|
375
|
-
if (!section)
|
|
376
|
-
return [];
|
|
377
|
-
const out = [];
|
|
378
|
-
for (const raw of section.split("\n")) {
|
|
379
|
-
const m = /^\s*[-*]\s+(.+?)\s*$/.exec(raw);
|
|
380
|
-
if (!m?.[1])
|
|
381
|
-
continue;
|
|
382
|
-
const text = m[1].trim();
|
|
383
|
-
if (text.length === 0)
|
|
384
|
-
continue;
|
|
385
|
-
if (/^list of\b/i.test(text))
|
|
386
|
-
continue; // template placeholder
|
|
387
|
-
out.push(text);
|
|
388
|
-
}
|
|
389
|
-
return out;
|
|
390
|
-
}
|
|
391
|
-
function countOpenQuestions(text) {
|
|
392
|
-
const sec = parseMdSectionLoose(text, "Open questions");
|
|
393
|
-
if (!sec)
|
|
394
|
-
return 0;
|
|
395
|
-
const first = (firstNonEmptyLine(sec) ?? "").toLowerCase();
|
|
396
|
-
if (first.length === 0)
|
|
397
|
-
return 0;
|
|
398
|
-
if (/^[-*]?\s*(none|ninguna|ninguno|n\/a|—|-)\.?$/.test(first))
|
|
399
|
-
return 0;
|
|
400
|
-
const bullets = sec.split("\n").filter((l) => /^\s*[-*]\s+\S/.test(l)).length;
|
|
401
|
-
return bullets > 0 ? bullets : 1;
|
|
402
|
-
}
|
|
403
39
|
//# sourceMappingURL=status-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-service.js","sourceRoot":"","sources":["../../src/application/status-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"status-service.js","sourceRoot":"","sources":["../../src/application/status-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAgDrC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,QAAqB,EAAE;IAEvB,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,CAAC,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YAClD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE;YACN,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YACzB,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;YAC1D,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YACzB,eAAe,EAAE,MAAM,CAAC,MAAM;YAC9B,eAAe,EAAE,MAAM,CAAC,MAAM;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM;YACjC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;SAC/B;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { parseTasks } from "./parsers/tasks.js";
|
|
3
3
|
import { relpath } from "./paths.js";
|
|
4
|
-
import {
|
|
4
|
+
import { resolveSessionTarget, sessionReadRequest, } from "./session-resolver.js";
|
|
5
5
|
export async function runTasksCommand(fs, env, paths, input) {
|
|
6
|
-
const
|
|
7
|
-
if (
|
|
8
|
-
return {
|
|
9
|
-
|
|
6
|
+
const resolution = await resolveSessionTarget(fs, paths, sessionReadRequest(input));
|
|
7
|
+
if (resolution.outcome !== "resolved")
|
|
8
|
+
return { sessionError: resolution };
|
|
9
|
+
const session = resolution.session;
|
|
10
10
|
const tasksPath = join(session.path, "TASKS.md");
|
|
11
11
|
const cwd = env.cwd();
|
|
12
12
|
const verbose = input.verbose === true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-service.js","sourceRoot":"","sources":["../../src/application/tasks-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAmC,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"tasks-service.js","sourceRoot":"","sources":["../../src/application/tasks-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAmC,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAEL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAwB/B,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,KAAwB;IAExB,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,IAAI,UAAU,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3E,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAE9D,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAgB,UAAU,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,KAAK;QACL,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC"}
|