@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist.js","sourceRoot":"","sources":["../../../src/cli/commands/persist.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { runResumeSummary, } from "../../application/checkpoint-service.js";
|
|
2
|
+
import { readHookStdin, resolveContextId } from "../context-id.js";
|
|
2
3
|
import { fail } from "../render.js";
|
|
3
4
|
export const resumeSummaryCommand = {
|
|
4
5
|
name: "resume-summary",
|
|
5
|
-
describe: "Compact resume payload for PostCompact hook. " +
|
|
6
|
-
"Usage: aw resume-summary [--include-recent-closed] [--recent-days <n>].",
|
|
6
|
+
describe: "Compact resume payload for the PostCompact hook. " +
|
|
7
|
+
"Usage: aw resume-summary [--code <session>] [--include-recent-closed] [--recent-days <n>].",
|
|
7
8
|
async execute(args, ctx) {
|
|
8
9
|
const options = {};
|
|
9
10
|
if (args.flags.has("--include-recent-closed")) {
|
|
@@ -17,7 +18,17 @@ export const resumeSummaryCommand = {
|
|
|
17
18
|
}
|
|
18
19
|
options.recentDays = n;
|
|
19
20
|
}
|
|
20
|
-
const
|
|
21
|
+
const code = args.values.get("code");
|
|
22
|
+
if (code !== undefined)
|
|
23
|
+
options.code = code;
|
|
24
|
+
// PostCompact delivers the conversation id on stdin; the same command run by
|
|
25
|
+
// hand from a terminal simply has none.
|
|
26
|
+
const context = resolveContextId(ctx.env, await readHookStdin());
|
|
27
|
+
if (!context.ok)
|
|
28
|
+
return fail(context.code, context.message);
|
|
29
|
+
if (context.contextId !== undefined)
|
|
30
|
+
options.contextId = context.contextId;
|
|
31
|
+
const data = await runResumeSummary(ctx.fs, ctx.paths, options);
|
|
21
32
|
return { ok: true, data, exitCode: 0 };
|
|
22
33
|
},
|
|
23
34
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume-summary.js","sourceRoot":"","sources":["../../../src/cli/commands/resume-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"resume-summary.js","sourceRoot":"","sources":["../../../src/cli/commands/resume-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGnE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,MAAM,CAAC,MAAM,oBAAoB,GAAe;IAC9C,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EACN,mDAAmD;QACnD,4FAA4F;IAC9F,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,OAAO,GAAyB,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACrC,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,OAAO,IAAI,CACT,eAAe,EACf,gDAAgD,aAAa,IAAI,CAClE,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QAE5C,6EAA6E;QAC7E,wCAAwC;QACxC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,aAAa,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAE3E,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { runResume, } from "../../application/resume-service.js";
|
|
2
|
+
import { readContextId } from "../context-id.js";
|
|
3
|
+
export const resumeCommand = {
|
|
4
|
+
name: "resume",
|
|
5
|
+
describe: "Qué retomar y con qué comando exacto, derivado del pipeline documental. Read-only: propone la ruta, nunca la ejecuta. " +
|
|
6
|
+
"Usage: aw resume [<docs/specs|docs/plans path | número>] [--code <sesión>] [--format human|json] [--detail].",
|
|
7
|
+
async execute(args, ctx) {
|
|
8
|
+
const target = args.rest[0];
|
|
9
|
+
const code = args.values.get("code");
|
|
10
|
+
if (target !== undefined && code !== undefined) {
|
|
11
|
+
return {
|
|
12
|
+
ok: false,
|
|
13
|
+
error: {
|
|
14
|
+
code: "ARGS_INVALID",
|
|
15
|
+
message: "declará un solo target: un documento posicional o --code, no ambos",
|
|
16
|
+
},
|
|
17
|
+
exitCode: 1,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
// Env only — never stdin. `resume` is a user command; blocking on an idle
|
|
21
|
+
// fd 0 is what made the hook reader need a bounded window in the first place.
|
|
22
|
+
const contextId = readContextId(ctx.env);
|
|
23
|
+
const input = {
|
|
24
|
+
...(target !== undefined ? { target } : {}),
|
|
25
|
+
...(code !== undefined ? { code } : {}),
|
|
26
|
+
...(contextId !== undefined ? { contextId } : {}),
|
|
27
|
+
};
|
|
28
|
+
const outcome = await runResume(ctx.fs, ctx.env, ctx.paths, input);
|
|
29
|
+
if (outcome.status === "invalid_target") {
|
|
30
|
+
return {
|
|
31
|
+
ok: false,
|
|
32
|
+
error: { code: "RESUME_TARGET_INVALID", message: outcome.action },
|
|
33
|
+
data: outcome,
|
|
34
|
+
exitCode: 1,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return { ok: true, data: outcome, exitCode: 0 };
|
|
38
|
+
},
|
|
39
|
+
renderHuman(result, context) {
|
|
40
|
+
const outcome = result.data;
|
|
41
|
+
if (outcome === undefined)
|
|
42
|
+
return "";
|
|
43
|
+
switch (outcome.status) {
|
|
44
|
+
case "idle":
|
|
45
|
+
return `${outcome.action}\n`;
|
|
46
|
+
case "proposal":
|
|
47
|
+
return `${renderProposal(outcome.proposal, context.detail)}\n`;
|
|
48
|
+
case "candidates":
|
|
49
|
+
return renderCandidates(outcome.candidates, outcome.action, context.detail);
|
|
50
|
+
case "invalid_target":
|
|
51
|
+
return `${outcome.action}\n`;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
function renderProposal(proposal, detail) {
|
|
56
|
+
const lines = [
|
|
57
|
+
`▸ ${proposal.objective}`,
|
|
58
|
+
` Progreso ${proposal.progress}`,
|
|
59
|
+
` Siguiente ${proposal.next}`,
|
|
60
|
+
` Comando ${proposal.command}`,
|
|
61
|
+
];
|
|
62
|
+
if (detail)
|
|
63
|
+
lines.push(` Ruta ${proposal.file}`);
|
|
64
|
+
return lines.join("\n");
|
|
65
|
+
}
|
|
66
|
+
function renderCandidates(candidates, action, detail) {
|
|
67
|
+
const lines = [action, ""];
|
|
68
|
+
for (const candidate of candidates) {
|
|
69
|
+
lines.push(renderProposal(candidate, detail), "");
|
|
70
|
+
}
|
|
71
|
+
return `${lines.join("\n").trimEnd()}\n`;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/cli/commands/resume.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { runArtifactsCommand } from "../../application/artifacts-service.js";
|
|
2
2
|
import { readSessionArtifacts } from "../../application/release-data/artifacts.js";
|
|
3
|
-
import {
|
|
3
|
+
import { readContextId } from "../context-id.js";
|
|
4
|
+
import { fail, failSessionResolution } from "../render.js";
|
|
4
5
|
const DUMP_KINDS = new Set([
|
|
5
6
|
"objetivo",
|
|
6
7
|
"decisiones",
|
|
@@ -32,25 +33,25 @@ export const sessionArtifactsCommand = {
|
|
|
32
33
|
return fail("INVALID_INPUT", `--dump kinds inválidos: ${invalid.join(", ")}. Válidos: ${[...DUMP_KINDS].join(", ")}`);
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
|
-
const dump = await readSessionArtifacts(ctx.fs, ctx.
|
|
36
|
+
const dump = await readSessionArtifacts(ctx.fs, ctx.paths, code, kinds, ctx.runtime);
|
|
37
|
+
if (dump.sessionError !== undefined)
|
|
38
|
+
return failSessionResolution(dump.sessionError);
|
|
36
39
|
if (dump.error !== undefined) {
|
|
37
|
-
|
|
38
|
-
? "SESSION_NOT_FOUND"
|
|
39
|
-
: "LEGACY_FORMAT";
|
|
40
|
-
return fail(errCode, String(dump.hint ?? dump.error), dump);
|
|
40
|
+
return fail("LEGACY_FORMAT", String(dump.hint ?? dump.error), dump);
|
|
41
41
|
}
|
|
42
42
|
return { ok: true, data: dump, exitCode: 0 };
|
|
43
43
|
}
|
|
44
|
-
const verbose = args.flags.has("--verbose");
|
|
45
44
|
const input = {};
|
|
46
45
|
if (code !== undefined)
|
|
47
46
|
input.code = code;
|
|
48
|
-
if (verbose)
|
|
47
|
+
if (args.flags.has("--verbose"))
|
|
49
48
|
input.verbose = true;
|
|
49
|
+
const contextId = readContextId(ctx.env);
|
|
50
|
+
if (contextId !== undefined)
|
|
51
|
+
input.contextId = contextId;
|
|
50
52
|
const data = await runArtifactsCommand(ctx.fs, ctx.env, ctx.paths, input);
|
|
51
|
-
if ("
|
|
52
|
-
return
|
|
53
|
-
}
|
|
53
|
+
if ("sessionError" in data)
|
|
54
|
+
return failSessionResolution(data.sessionError);
|
|
54
55
|
return { ok: true, data, exitCode: 0 };
|
|
55
56
|
},
|
|
56
57
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-artifacts.js","sourceRoot":"","sources":["../../../src/cli/commands/session-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"session-artifacts.js","sourceRoot":"","sources":["../../../src/cli/commands/session-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG3D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,UAAU;IACV,YAAY;IACZ,cAAc;IACd,OAAO;IACP,YAAY;IACZ,SAAS;IACT,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAe;IACjD,IAAI,EAAE,mBAAmB;IACzB,QAAQ,EACN,gFAAgF;QAChF,uDAAuD;QACvD,iFAAiF;QACjF,uEAAuE;IACzE,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEpE,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC,eAAe,EAAE,8BAA8B,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,KAA2B,CAAC;YAChC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,IAAI,CACT,eAAe,EACf,2BAA2B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACrF,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;gBAAE,OAAO,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACrF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAC1C,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACtD,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,SAAS,KAAK,SAAS;YAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QAEzD,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,cAAc,IAAI,IAAI;YAAE,OAAO,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;CACF,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { runSessionClose, } from "../../application/session-close-service.js";
|
|
2
|
-
import { fail } from "../render.js";
|
|
2
|
+
import { fail, failSessionResolution } from "../render.js";
|
|
3
3
|
export const sessionCloseCommand = {
|
|
4
4
|
name: "session-close",
|
|
5
|
-
describe: "Close a session: write the .closed marker and upsert its HISTORY.md row. " +
|
|
6
|
-
"Usage: aw session-close
|
|
5
|
+
describe: "Close a session: write the .closed marker, release the conversation bindings pointing at it and upsert its HISTORY.md row. " +
|
|
6
|
+
"Usage: aw session-close --code <session> [--refs <csv>].",
|
|
7
7
|
async execute(args, ctx) {
|
|
8
8
|
const input = {};
|
|
9
9
|
const code = args.values.get("code");
|
|
@@ -12,10 +12,11 @@ export const sessionCloseCommand = {
|
|
|
12
12
|
const refs = args.values.get("refs");
|
|
13
13
|
if (refs !== undefined)
|
|
14
14
|
input.refs = refs;
|
|
15
|
-
const data = await runSessionClose(ctx.fs, ctx.
|
|
16
|
-
if ("
|
|
17
|
-
return
|
|
18
|
-
|
|
15
|
+
const data = await runSessionClose(ctx.fs, ctx.paths, input);
|
|
16
|
+
if ("sessionError" in data)
|
|
17
|
+
return failSessionResolution(data.sessionError);
|
|
18
|
+
if ("error" in data)
|
|
19
|
+
return fail(data.code ?? "INVALID_INPUT", data.error, data);
|
|
19
20
|
return { ok: true, data: data.sessionClose, exitCode: 0 };
|
|
20
21
|
},
|
|
21
22
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-close.js","sourceRoot":"","sources":["../../../src/cli/commands/session-close.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,GAChB,MAAM,4CAA4C,CAAC;AAIpD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"session-close.js","sourceRoot":"","sources":["../../../src/cli/commands/session-close.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,GAChB,MAAM,4CAA4C,CAAC;AAIpD,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG3D,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,IAAI,EAAE,eAAe;IACrB,QAAQ,EACN,6HAA6H;QAC7H,0DAA0D;IAC5D,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,KAAK,GAAsB,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAE1C,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7D,IAAI,cAAc,IAAI,IAAI;YAAE,OAAO,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5E,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;CACF,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { runSessionCreate, } from "../../application/session-create-service.js";
|
|
2
|
+
import { readContextId } from "../context-id.js";
|
|
2
3
|
import { fail } from "../render.js";
|
|
3
4
|
export const sessionCreateCommand = {
|
|
4
5
|
name: "session-create",
|
|
@@ -17,7 +18,10 @@ export const sessionCreateCommand = {
|
|
|
17
18
|
const from = args.values.get("from");
|
|
18
19
|
if (from !== undefined)
|
|
19
20
|
input.originRaw = from;
|
|
20
|
-
const
|
|
21
|
+
const contextId = readContextId(ctx.env);
|
|
22
|
+
if (contextId !== undefined)
|
|
23
|
+
input.contextId = contextId;
|
|
24
|
+
const data = await runSessionCreate(ctx.fs, ctx.paths, input);
|
|
21
25
|
if ("error" in data) {
|
|
22
26
|
return fail(data.code ?? "INVALID_INPUT", data.error, data);
|
|
23
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-create.js","sourceRoot":"","sources":["../../../src/cli/commands/session-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,GACjB,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"session-create.js","sourceRoot":"","sources":["../../../src/cli/commands/session-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,GACjB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,MAAM,CAAC,MAAM,oBAAoB,GAAe;IAC9C,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EACN,iJAAiJ;IACnJ,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,SAAS;YAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QAC/C,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,SAAS,KAAK,SAAS;YAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QAEzD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9D,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC7D,CAAC;CACF,CAAC"}
|
|
@@ -1,19 +1,25 @@
|
|
|
1
|
-
import { runSessionResume } from "../../application/session-resume-service.js";
|
|
2
|
-
import {
|
|
1
|
+
import { runSessionResume, } from "../../application/session-resume-service.js";
|
|
2
|
+
import { readContextId } from "../context-id.js";
|
|
3
|
+
import { fail, failSessionResolution } from "../render.js";
|
|
3
4
|
export const sessionResumeCommand = {
|
|
4
5
|
name: "session-resume",
|
|
5
6
|
describe: "Load resume payload for a session (objetivo + checkpoint). With --reopen, reactivate it if closed (inter-turn continuity). " +
|
|
6
7
|
"Usage: aw session-resume [--code <session>] [--reopen].",
|
|
7
8
|
async execute(args, ctx) {
|
|
9
|
+
const input = {};
|
|
8
10
|
const code = args.values.get("code");
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
if (code !== undefined)
|
|
12
|
+
input.code = code;
|
|
13
|
+
if (args.flags.has("--reopen"))
|
|
14
|
+
input.reopen = true;
|
|
15
|
+
const contextId = readContextId(ctx.env);
|
|
16
|
+
if (contextId !== undefined)
|
|
17
|
+
input.contextId = contextId;
|
|
18
|
+
const data = await runSessionResume(ctx.fs, ctx.env, ctx.paths, input);
|
|
19
|
+
if ("sessionError" in data)
|
|
20
|
+
return failSessionResolution(data.sessionError);
|
|
21
|
+
if ("error" in data)
|
|
22
|
+
return fail(data.code ?? "INVALID_INPUT", data.error, data);
|
|
17
23
|
return { ok: true, data, exitCode: 0 };
|
|
18
24
|
},
|
|
19
25
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-resume.js","sourceRoot":"","sources":["../../../src/cli/commands/session-resume.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"session-resume.js","sourceRoot":"","sources":["../../../src/cli/commands/session-resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,GACjB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG3D,MAAM,CAAC,MAAM,oBAAoB,GAAe;IAC9C,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EACN,6HAA6H;QAC7H,yDAAyD;IAC3D,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAC1C,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpD,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,SAAS,KAAK,SAAS;YAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QAEzD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvE,IAAI,cAAc,IAAI,IAAI;YAAE,OAAO,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5E,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;CACF,CAAC"}
|
|
@@ -1,10 +1,74 @@
|
|
|
1
|
-
import { runStatusCommand } from "../../application/status-service.js";
|
|
1
|
+
import { runStatusCommand, } from "../../application/status-service.js";
|
|
2
2
|
export const statusCommand = {
|
|
3
3
|
name: "status",
|
|
4
|
-
describe: "Read-only workspace dashboard: specs, plans, sessions y descartados con fechas relativas en español."
|
|
4
|
+
describe: "Read-only workspace dashboard: specs, plans, sessions y descartados con fechas relativas en español. " +
|
|
5
|
+
"Usage: aw status [--format human|json] [--detail].",
|
|
5
6
|
async execute(_args, ctx) {
|
|
6
7
|
const data = await runStatusCommand(ctx.fs, ctx.env, ctx.paths);
|
|
7
8
|
return { ok: true, data, exitCode: 0 };
|
|
8
9
|
},
|
|
10
|
+
/**
|
|
11
|
+
* The human view shows PENDING work only. Finished history, sessions and
|
|
12
|
+
* discarded items are real and stay in the JSON model — they just stop
|
|
13
|
+
* competing for attention with what is actually left to do. `--detail`
|
|
14
|
+
* brings them back; the filter never removes anything from the domain.
|
|
15
|
+
*/
|
|
16
|
+
renderHuman(result, context) {
|
|
17
|
+
const data = result.data;
|
|
18
|
+
if (data === undefined)
|
|
19
|
+
return "";
|
|
20
|
+
const lines = [`${data.workspace.name} · ${data.workspace.path}`, ""];
|
|
21
|
+
if (data.pipeline.length === 0) {
|
|
22
|
+
lines.push("Sin pipeline pendiente.");
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
lines.push(...renderPipeline(data.pipeline));
|
|
26
|
+
}
|
|
27
|
+
if (context.detail)
|
|
28
|
+
lines.push("", ...renderDetail(data));
|
|
29
|
+
return `${lines.join("\n").trimEnd()}\n`;
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
const GROUP_TITLES = {
|
|
33
|
+
"spec-unrefined": "Specs sin refinar",
|
|
34
|
+
"spec-unplanned": "Specs sin plan",
|
|
35
|
+
"plan-open": "Planes abiertos",
|
|
36
|
+
"checkpoint-orphan": "Checkpoints sueltos",
|
|
9
37
|
};
|
|
38
|
+
function renderPipeline(pipeline) {
|
|
39
|
+
const lines = [];
|
|
40
|
+
for (const kind of Object.keys(GROUP_TITLES)) {
|
|
41
|
+
const items = pipeline.filter((item) => item.kind === kind);
|
|
42
|
+
if (items.length === 0)
|
|
43
|
+
continue;
|
|
44
|
+
lines.push(`${GROUP_TITLES[kind]} (${items.length})`);
|
|
45
|
+
for (const item of items) {
|
|
46
|
+
lines.push(` ${item.summary}`);
|
|
47
|
+
lines.push(` ${item.command}`);
|
|
48
|
+
}
|
|
49
|
+
lines.push("");
|
|
50
|
+
}
|
|
51
|
+
return lines;
|
|
52
|
+
}
|
|
53
|
+
function renderDetail(data) {
|
|
54
|
+
const done = data.plans.filter((p) => p.plan_state === "done");
|
|
55
|
+
const lines = [
|
|
56
|
+
`Terminado: ${done.length} plan(es) done de ${data.plans.length}`,
|
|
57
|
+
`Sesiones: ${data.counts.sessions_active} activa(s), ${data.counts.sessions_closed} cerrada(s)`,
|
|
58
|
+
];
|
|
59
|
+
for (const session of data.sessions.active) {
|
|
60
|
+
lines.push(` · ${session.folder} — ${session.summary} (${session.relative})`);
|
|
61
|
+
}
|
|
62
|
+
if (data.discarded.length > 0) {
|
|
63
|
+
lines.push(`Descartados: ${data.discarded.length}`);
|
|
64
|
+
for (const item of data.discarded) {
|
|
65
|
+
lines.push(` · [${item.kind}] ${item.text} — ${item.source}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const unproven = data.plans.filter((p) => p.spec.status !== "resolved");
|
|
69
|
+
if (unproven.length > 0) {
|
|
70
|
+
lines.push(`Planes sin spec demostrada: ${unproven.map((p) => p.number).join(", ")}`);
|
|
71
|
+
}
|
|
72
|
+
return lines;
|
|
73
|
+
}
|
|
10
74
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { parseWorkingBranches } from "../parsers/working-branches.js";
|
|
|
4
4
|
import { fail } from "../render.js";
|
|
5
5
|
export const workspaceInitCommand = {
|
|
6
6
|
name: "workspace-init",
|
|
7
|
-
describe: "Initialize the current directory as an agent-workflow workspace (unifies the legacy hub-init + project-init; no project/hub distinction). Minimal scaffold: .workflow/sessions + skills.toml + WORKSPACE block + CLI-owned .gitignore; docs/ folders are born on demand (aw next-number). With external sources it also configures multi-root visibility. Idempotent; re-running reconciles and prunes the legacy upfront scaffold.
|
|
7
|
+
describe: "Initialize the current directory as an agent-workflow workspace (unifies the legacy hub-init + project-init; no project/hub distinction). Minimal scaffold: .workflow/sessions + skills.toml + WORKSPACE block + CLI-owned .gitignore; docs/ folders are born on demand (aw next-number). With external sources it also configures multi-root visibility. Idempotent; re-running reconciles and prunes the legacy upfront scaffold. Usage: aw workspace-init --source alias:path[:rama] (repeatable, 1+) [--working-branch alias:rama] [--qa-branch alias:rama] [--proyecto <name>] [--main-branch <branch>] [--workspace <dir>] [--dry-run] [--format human|json] [--detail].",
|
|
8
8
|
async execute(args, ctx) {
|
|
9
9
|
// Canonical flag is --source; --fuente kept as a back-compat alias.
|
|
10
10
|
const sourcesRaw = [
|
|
@@ -33,7 +33,7 @@ export const workspaceInitCommand = {
|
|
|
33
33
|
dryRun: args.flags.has("--dry-run"),
|
|
34
34
|
});
|
|
35
35
|
if ("error" in data) {
|
|
36
|
-
return fail("INVALID_INPUT", data.hint ?? data.error
|
|
36
|
+
return fail("INVALID_INPUT", data.hint ?? data.error);
|
|
37
37
|
}
|
|
38
38
|
return {
|
|
39
39
|
ok: data.ok,
|
|
@@ -49,6 +49,25 @@ export const workspaceInitCommand = {
|
|
|
49
49
|
exitCode: data.ok ? 0 : 1,
|
|
50
50
|
};
|
|
51
51
|
},
|
|
52
|
+
/**
|
|
53
|
+
* The deterministic result, read. `--dry-run` is what makes it a preview; the
|
|
54
|
+
* projection never decides anything the service did not already decide.
|
|
55
|
+
*/
|
|
56
|
+
renderHuman(result, context) {
|
|
57
|
+
const data = result.data;
|
|
58
|
+
if (data === undefined)
|
|
59
|
+
return "";
|
|
60
|
+
const lines = [
|
|
61
|
+
`workspace-init${data.dry_run ? " · dry-run (no escribe)" : ""} · ${data.workspace}`,
|
|
62
|
+
` Fuentes ${data.sources}`,
|
|
63
|
+
` skills.toml ${data.skills_toml}`,
|
|
64
|
+
];
|
|
65
|
+
if (context.detail) {
|
|
66
|
+
lines.push(` Scaffold ${JSON.stringify(data.scaffold)}`);
|
|
67
|
+
lines.push(` Multiroot ${JSON.stringify(data.attach_multiroot)}`);
|
|
68
|
+
}
|
|
69
|
+
return `${lines.join("\n")}\n`;
|
|
70
|
+
},
|
|
52
71
|
};
|
|
53
72
|
function toWorkspaceSource(spec) {
|
|
54
73
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-init.js","sourceRoot":"","sources":["../../../src/cli/commands/workspace-init.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"workspace-init.js","sourceRoot":"","sources":["../../../src/cli/commands/workspace-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { text } from "node:stream/consumers";
|
|
2
|
+
import { parseHookPayload } from "../application/hook-common.js";
|
|
3
|
+
/**
|
|
4
|
+
* Neutral conversation-identity boundary.
|
|
5
|
+
*
|
|
6
|
+
* The core never interprets the id's format — it only needs an opaque, stable
|
|
7
|
+
* value per host conversation. Two sources feed it: the agreed env var, and the
|
|
8
|
+
* `session_id` every host already puts on a lifecycle hook's JSON stdin. Which
|
|
9
|
+
* host injects what, and how, belongs to the multi-host surface work (spec 010).
|
|
10
|
+
*/
|
|
11
|
+
export const CONTEXT_ID_ENV = "AW_CONTEXT_ID";
|
|
12
|
+
/** The conversation id from the environment alone (non-hook invocations). */
|
|
13
|
+
export function readContextId(env) {
|
|
14
|
+
return nonEmpty(env.get(CONTEXT_ID_ENV));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The single conversation identity for a lifecycle surface, from the env var
|
|
18
|
+
* and/or the hook payload's `session_id`.
|
|
19
|
+
*
|
|
20
|
+
* Two signals that name DIFFERENT conversations is not something to arbitrate:
|
|
21
|
+
* picking either one could checkpoint or restore the wrong line, so it fails
|
|
22
|
+
* before any session is resolved.
|
|
23
|
+
*/
|
|
24
|
+
export function resolveContextId(env, stdin) {
|
|
25
|
+
const fromEnv = readContextId(env);
|
|
26
|
+
const fromStdin = stdin !== undefined ? sessionIdFromPayload(stdin) : undefined;
|
|
27
|
+
if (fromEnv !== undefined && fromStdin !== undefined && fromEnv !== fromStdin) {
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
code: "CONTEXT_ID_CONFLICT",
|
|
31
|
+
message: `${CONTEXT_ID_ENV} y el session_id de stdin identifican conversaciones distintas; resolvé cuál corresponde antes de reintentar`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const contextId = fromEnv ?? fromStdin;
|
|
35
|
+
return contextId !== undefined ? { ok: true, contextId } : { ok: true };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* How long to wait for a hook payload's first byte before concluding there is
|
|
39
|
+
* none. A host writes the JSON into the pipe as it spawns the hook, so a real
|
|
40
|
+
* payload is already there or arrives immediately; the window only elapses when
|
|
41
|
+
* stdin is an open handle nobody writes to.
|
|
42
|
+
*/
|
|
43
|
+
const HOOK_STDIN_WINDOW_MS = 150;
|
|
44
|
+
/**
|
|
45
|
+
* A lifecycle hook's JSON payload, or `undefined` when there is none.
|
|
46
|
+
*
|
|
47
|
+
* These commands are BOTH hook targets and hand/agent-invocable (`aw
|
|
48
|
+
* checkpoint-write --code`, `aw resume-summary`), so the read must be bounded.
|
|
49
|
+
* An interactive terminal is the easy case; the dangerous one is an inherited
|
|
50
|
+
* stdin that is neither a TTY nor ever written to — an agent shell tool spawns
|
|
51
|
+
* with a socket on fd 0, where `isTTY` is undefined and reading to EOF blocks
|
|
52
|
+
* until the tool times out. So: wait a short window for the first byte, and
|
|
53
|
+
* only then read to EOF (unbounded, so a large payload is never truncated).
|
|
54
|
+
*/
|
|
55
|
+
export async function readHookStdin(stdin = process.stdin, windowMs = HOOK_STDIN_WINDOW_MS) {
|
|
56
|
+
if (stdin.isTTY === true)
|
|
57
|
+
return undefined;
|
|
58
|
+
if (!(await waitForFirstByte(stdin, windowMs))) {
|
|
59
|
+
// Release the handle so an abandoned read never holds the process open.
|
|
60
|
+
stdin.pause();
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
return await text(stdin);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* stdin of a command that DECLARES it mandatory (the hybrid `prepare → validate
|
|
72
|
+
* → apply` handshake): read to EOF with no window at all.
|
|
73
|
+
*
|
|
74
|
+
* The bounded read above exists because a hook may legitimately receive
|
|
75
|
+
* nothing. Here the opposite holds: the payload is the whole point, and cutting
|
|
76
|
+
* it off after a fixed window would hand the validator a truncated proposal
|
|
77
|
+
* that its own digest would then seal as valid. A caller that pipes nothing
|
|
78
|
+
* gets an empty string and fails validation, which is the correct answer.
|
|
79
|
+
*/
|
|
80
|
+
export async function readRequiredStdin(stdin = process.stdin) {
|
|
81
|
+
if (stdin.isTTY === true)
|
|
82
|
+
return "";
|
|
83
|
+
try {
|
|
84
|
+
return await text(stdin);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return "";
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* `true` as soon as stdin delivers anything. An immediate EOF (`< /dev/null`)
|
|
92
|
+
* and an idle handle both answer `false` — they differ only in how fast.
|
|
93
|
+
*/
|
|
94
|
+
function waitForFirstByte(stdin, windowMs) {
|
|
95
|
+
if (stdin.readableLength > 0)
|
|
96
|
+
return Promise.resolve(true);
|
|
97
|
+
if (stdin.readableEnded)
|
|
98
|
+
return Promise.resolve(false);
|
|
99
|
+
return new Promise((resolve) => {
|
|
100
|
+
const settle = (hasData) => {
|
|
101
|
+
clearTimeout(timer);
|
|
102
|
+
stdin.off("readable", onReadable);
|
|
103
|
+
stdin.off("end", onDone);
|
|
104
|
+
stdin.off("error", onDone);
|
|
105
|
+
resolve(hasData);
|
|
106
|
+
};
|
|
107
|
+
const onReadable = () => {
|
|
108
|
+
if (stdin.readableLength > 0)
|
|
109
|
+
settle(true);
|
|
110
|
+
};
|
|
111
|
+
const onDone = () => settle(false);
|
|
112
|
+
// Deliberately NOT unref'd. This timer is the only thing guaranteeing the
|
|
113
|
+
// promise settles when stdin is an idle handle: unref'd, the event loop
|
|
114
|
+
// empties while nothing is pending and Node exits 0 before the command
|
|
115
|
+
// ever writes its output.
|
|
116
|
+
const timer = setTimeout(() => settle(false), windowMs);
|
|
117
|
+
stdin.on("readable", onReadable);
|
|
118
|
+
stdin.once("end", onDone);
|
|
119
|
+
stdin.once("error", onDone);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
function sessionIdFromPayload(stdin) {
|
|
123
|
+
const payload = parseHookPayload(stdin);
|
|
124
|
+
if (payload === null)
|
|
125
|
+
return undefined;
|
|
126
|
+
const raw = payload.session_id;
|
|
127
|
+
return typeof raw === "string" ? nonEmpty(raw) : undefined;
|
|
128
|
+
}
|
|
129
|
+
function nonEmpty(value) {
|
|
130
|
+
const trimmed = value?.trim();
|
|
131
|
+
return trimmed !== undefined && trimmed.length > 0 ? trimmed : undefined;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=context-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-id.js","sourceRoot":"","sources":["../../src/cli/context-id.ts"],"names":[],"mappings":"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"}
|