@entelligentsia/forgecli 0.6.6 → 0.7.7
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/CHANGELOG.md +112 -0
- package/README.md +99 -190
- package/dist/bin/forge.js +20 -0
- package/dist/bin/forge.js.map +1 -1
- package/dist/extensions/forgecli/approve.d.ts +24 -0
- package/dist/extensions/forgecli/approve.js +202 -0
- package/dist/extensions/forgecli/approve.js.map +1 -0
- package/dist/extensions/forgecli/audience-gate.d.ts +4 -0
- package/dist/extensions/forgecli/audience-gate.js +8 -5
- package/dist/extensions/forgecli/audience-gate.js.map +1 -1
- package/dist/extensions/forgecli/collate.d.ts +24 -0
- package/dist/extensions/forgecli/collate.js +199 -0
- package/dist/extensions/forgecli/collate.js.map +1 -0
- package/dist/extensions/forgecli/commit.d.ts +24 -0
- package/dist/extensions/forgecli/commit.js +202 -0
- package/dist/extensions/forgecli/commit.js.map +1 -0
- package/dist/extensions/forgecli/fix-bug.d.ts +75 -0
- package/dist/extensions/forgecli/fix-bug.js +1133 -0
- package/dist/extensions/forgecli/fix-bug.js.map +1 -0
- package/dist/extensions/forgecli/forge-commands.js +7 -0
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-header.js +10 -4
- package/dist/extensions/forgecli/forge-header.js.map +1 -1
- package/dist/extensions/forgecli/forge-init.js +16 -8
- package/dist/extensions/forgecli/forge-init.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.d.ts +29 -0
- package/dist/extensions/forgecli/forge-subagent.js +14 -1
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/hook-dispatcher.d.ts +53 -1
- package/dist/extensions/forgecli/hook-dispatcher.js +47 -1
- package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
- package/dist/extensions/forgecli/hooks/post-init-hook.d.ts +15 -0
- package/dist/extensions/forgecli/hooks/post-init-hook.js +127 -0
- package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -0
- package/dist/extensions/forgecli/hooks/post-sprint-hook.d.ts +37 -0
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js +166 -0
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -0
- package/dist/extensions/forgecli/index.js +56 -5
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/review-code.d.ts +24 -0
- package/dist/extensions/forgecli/review-code.js +202 -0
- package/dist/extensions/forgecli/review-code.js.map +1 -0
- package/dist/extensions/forgecli/review-plan.d.ts +24 -0
- package/dist/extensions/forgecli/review-plan.js +203 -0
- package/dist/extensions/forgecli/review-plan.js.map +1 -0
- package/dist/extensions/forgecli/run-sprint.d.ts +18 -0
- package/dist/extensions/forgecli/run-sprint.js +33 -1
- package/dist/extensions/forgecli/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/run-task.d.ts +21 -2
- package/dist/extensions/forgecli/run-task.js +33 -9
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/session-registry.d.ts +10 -0
- package/dist/extensions/forgecli/session-registry.js +9 -0
- package/dist/extensions/forgecli/session-registry.js.map +1 -1
- package/dist/extensions/forgecli/validate.d.ts +24 -0
- package/dist/extensions/forgecli/validate.js +202 -0
- package/dist/extensions/forgecli/validate.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/engine.d.ts +23 -0
- package/dist/extensions/forgecli/wf-engine/engine.js +384 -0
- package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/event-parser.d.ts +6 -0
- package/dist/extensions/forgecli/wf-engine/event-parser.js +29 -0
- package/dist/extensions/forgecli/wf-engine/event-parser.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/id-gen.d.ts +6 -0
- package/dist/extensions/forgecli/wf-engine/id-gen.js +17 -0
- package/dist/extensions/forgecli/wf-engine/id-gen.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/loader.d.ts +2 -0
- package/dist/extensions/forgecli/wf-engine/loader.js +100 -0
- package/dist/extensions/forgecli/wf-engine/loader.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/predicate.d.ts +7 -0
- package/dist/extensions/forgecli/wf-engine/predicate.js +36 -0
- package/dist/extensions/forgecli/wf-engine/predicate.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/prompt-compiler.d.ts +15 -0
- package/dist/extensions/forgecli/wf-engine/prompt-compiler.js +23 -0
- package/dist/extensions/forgecli/wf-engine/prompt-compiler.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/register.d.ts +9 -0
- package/dist/extensions/forgecli/wf-engine/register.js +59 -0
- package/dist/extensions/forgecli/wf-engine/register.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/remit-check.d.ts +6 -0
- package/dist/extensions/forgecli/wf-engine/remit-check.js +42 -0
- package/dist/extensions/forgecli/wf-engine/remit-check.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/state-store.d.ts +13 -0
- package/dist/extensions/forgecli/wf-engine/state-store.js +43 -0
- package/dist/extensions/forgecli/wf-engine/state-store.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/types.d.ts +66 -0
- package/dist/extensions/forgecli/wf-engine/types.js +2 -0
- package/dist/extensions/forgecli/wf-engine/types.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/worker.d.ts +11 -0
- package/dist/extensions/forgecli/wf-engine/worker.js +50 -0
- package/dist/extensions/forgecli/wf-engine/worker.js.map +1 -0
- package/dist/forge-payload/.base-pack/workflows/_fragments/context-injection.md +10 -4
- package/dist/forge-payload/.base-pack/workflows/fix_bug.md +12 -0
- package/dist/forge-payload/.schemas/bug.schema.json +4 -2
- package/dist/forge-payload/.schemas/event.schema.json +22 -3
- package/dist/forge-payload/commands/add-pipeline.md +342 -0
- package/dist/forge-payload/commands/add-task.md +269 -0
- package/dist/forge-payload/commands/ask.md +43 -0
- package/dist/forge-payload/commands/calibrate.md +356 -0
- package/dist/forge-payload/commands/config.md +202 -0
- package/dist/forge-payload/commands/enhance.md +38 -0
- package/dist/forge-payload/commands/health.md +225 -0
- package/dist/forge-payload/commands/init.md +165 -0
- package/dist/forge-payload/commands/materialize.md +119 -0
- package/dist/forge-payload/commands/migrate.md +160 -0
- package/dist/forge-payload/commands/quiz-agent.md +38 -0
- package/dist/forge-payload/commands/regenerate.md +673 -0
- package/dist/forge-payload/commands/remove.md +174 -0
- package/dist/forge-payload/commands/report-bug.md +191 -0
- package/dist/forge-payload/commands/store-query.md +73 -0
- package/dist/forge-payload/commands/store-repair.md +187 -0
- package/dist/forge-payload/commands/update-tools.md +56 -0
- package/dist/forge-payload/commands/update.md +1376 -0
- package/dist/forge-payload/tools/preflight-gate.cjs +2 -1
- package/dist/forge-payload/tools/read-verdict.cjs +41 -8
- package/dist/forge-payload/tools/store-cli.cjs +4 -3
- package/node_modules/argparse/CHANGELOG.md +216 -0
- package/node_modules/argparse/LICENSE +254 -0
- package/node_modules/argparse/README.md +84 -0
- package/node_modules/argparse/argparse.js +3707 -0
- package/node_modules/argparse/lib/sub.js +67 -0
- package/node_modules/argparse/lib/textwrap.js +440 -0
- package/node_modules/argparse/package.json +31 -0
- package/node_modules/cliui/CHANGELOG.md +121 -0
- package/node_modules/color-convert/CHANGELOG.md +54 -0
- package/node_modules/esprima/ChangeLog +235 -0
- package/node_modules/js-yaml/LICENSE +21 -0
- package/node_modules/js-yaml/README.md +247 -0
- package/node_modules/js-yaml/bin/js-yaml.js +126 -0
- package/node_modules/js-yaml/dist/js-yaml.js +3880 -0
- package/node_modules/js-yaml/dist/js-yaml.min.js +2 -0
- package/node_modules/js-yaml/dist/js-yaml.mjs +3856 -0
- package/node_modules/js-yaml/index.js +47 -0
- package/node_modules/js-yaml/lib/common.js +59 -0
- package/node_modules/js-yaml/lib/dumper.js +965 -0
- package/node_modules/js-yaml/lib/exception.js +55 -0
- package/node_modules/js-yaml/lib/loader.js +1733 -0
- package/node_modules/js-yaml/lib/schema/core.js +11 -0
- package/node_modules/js-yaml/lib/schema/default.js +22 -0
- package/node_modules/js-yaml/lib/schema/failsafe.js +17 -0
- package/node_modules/js-yaml/lib/schema/json.js +19 -0
- package/node_modules/js-yaml/lib/schema.js +121 -0
- package/node_modules/js-yaml/lib/snippet.js +101 -0
- package/node_modules/js-yaml/lib/type/binary.js +125 -0
- package/node_modules/js-yaml/lib/type/bool.js +35 -0
- package/node_modules/js-yaml/lib/type/float.js +97 -0
- package/node_modules/js-yaml/lib/type/int.js +156 -0
- package/node_modules/js-yaml/lib/type/map.js +8 -0
- package/node_modules/js-yaml/lib/type/merge.js +12 -0
- package/node_modules/js-yaml/lib/type/null.js +35 -0
- package/node_modules/js-yaml/lib/type/omap.js +44 -0
- package/node_modules/js-yaml/lib/type/pairs.js +53 -0
- package/node_modules/js-yaml/lib/type/seq.js +8 -0
- package/node_modules/js-yaml/lib/type/set.js +29 -0
- package/node_modules/js-yaml/lib/type/str.js +8 -0
- package/node_modules/js-yaml/lib/type/timestamp.js +88 -0
- package/node_modules/js-yaml/lib/type.js +66 -0
- package/node_modules/js-yaml/package.json +66 -0
- package/node_modules/mz/HISTORY.md +66 -0
- package/node_modules/proper-lockfile/CHANGELOG.md +108 -0
- package/node_modules/source-map/CHANGELOG.md +301 -0
- package/node_modules/thenify/History.md +11 -0
- package/node_modules/thenify-all/History.md +11 -0
- package/node_modules/y18n/CHANGELOG.md +100 -0
- package/node_modules/yargs/CHANGELOG.md +88 -0
- package/node_modules/yargs-parser/CHANGELOG.md +263 -0
- package/package.json +6 -2
- package/themes/forge-matrix.json +89 -0
- package/themes/forge-mono.json +86 -0
- package/workflows/lead-qualifier/prompts/digest.md +44 -0
- package/workflows/lead-qualifier/prompts/draft-outreach.md +44 -0
- package/workflows/lead-qualifier/prompts/enrich.md +52 -0
- package/workflows/lead-qualifier/prompts/intake.md +48 -0
- package/workflows/lead-qualifier/prompts/mark-cold.md +38 -0
- package/workflows/lead-qualifier/prompts/score.md +45 -0
- package/workflows/lead-qualifier/workflow.yaml +95 -0
- package/workflows/research-brief/prompts/brief-synthesize.md +43 -0
- package/workflows/research-brief/prompts/intake.md +51 -0
- package/workflows/research-brief/prompts/source-critique.md +38 -0
- package/workflows/research-brief/prompts/source-score.md +38 -0
- package/workflows/research-brief/prompts/source-summarize.md +54 -0
- package/workflows/research-brief/workflow.yaml +66 -0
- package/dist/extensions/forgecli/session-monitor-widget.d.ts +0 -37
- package/dist/extensions/forgecli/session-monitor-widget.js +0 -320
- package/dist/extensions/forgecli/session-monitor-widget.js.map +0 -1
- package/dist/extensions/forgecli/session-monitor.d.ts +0 -2
- package/dist/extensions/forgecli/session-monitor.js +0 -135
- package/dist/extensions/forgecli/session-monitor.js.map +0 -1
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// forge:approve — native kickoff handler (FORGE-S21-T10).
|
|
2
|
+
//
|
|
3
|
+
// Replaces the auto-generated stub previously installed by
|
|
4
|
+
// registerAllForgeCommands (forge-commands.ts). Kickoff Shim archetype
|
|
5
|
+
// (Pack-04 + Pack-06): single LLM handoff in current context, no fork.
|
|
6
|
+
//
|
|
7
|
+
// Note: The materialized workflow (architect_approve.md) declares
|
|
8
|
+
// `audience: subagent` — advisory only. Users may invoke this command
|
|
9
|
+
// manually from the CLI; assertAudience never refuses subagent-audience
|
|
10
|
+
// workflows. Orchestrator chains still dispatch via runForgeSubagent
|
|
11
|
+
// directly and do NOT route through this handler.
|
|
12
|
+
//
|
|
13
|
+
// Iron Laws:
|
|
14
|
+
// IL1 — code only under forge-cli/src/extensions/forgecli/.
|
|
15
|
+
// IL4 — no JSON.stringify-into-subagent dispatch.
|
|
16
|
+
// IL6 — no shell-string interpolation; no spawn calls here.
|
|
17
|
+
// IL7 — every failure path emits ctx.ui.notify and returns; no silent
|
|
18
|
+
// continuation.
|
|
19
|
+
import * as fs from "node:fs";
|
|
20
|
+
import * as path from "node:path";
|
|
21
|
+
import { assertAudience } from "./audience-gate.js";
|
|
22
|
+
import { sendKickoff } from "./kickoff.js";
|
|
23
|
+
import { loadPersona, PersonaSkillLoaderError } from "./loaders/persona-skill-loader.js";
|
|
24
|
+
import { loadWorkflow, WorkflowLoaderError } from "./loaders/workflow-loader.js";
|
|
25
|
+
export function parseApproveArgs(rawArgs, cwd) {
|
|
26
|
+
const trimmed = (rawArgs ?? "").trim();
|
|
27
|
+
if (trimmed === "") {
|
|
28
|
+
return { mode: "empty", taskRef: "", sourceLabel: "(no input — architect infers task from store/context)" };
|
|
29
|
+
}
|
|
30
|
+
if (trimmed.startsWith("@")) {
|
|
31
|
+
const ref = trimmed.slice(1).trim();
|
|
32
|
+
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
33
|
+
const seed = fs.readFileSync(filePath, "utf8");
|
|
34
|
+
return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
|
|
35
|
+
}
|
|
36
|
+
return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
|
|
37
|
+
}
|
|
38
|
+
// Frontmatter persona extraction (permissive) ------------------------------
|
|
39
|
+
export function extractPersonaNames(workflowMd) {
|
|
40
|
+
const lines = workflowMd.split(/\r?\n/);
|
|
41
|
+
if (lines.length === 0 || lines[0] !== "---")
|
|
42
|
+
return [];
|
|
43
|
+
let inside = false;
|
|
44
|
+
let depsBlock = false;
|
|
45
|
+
for (let i = 0; i < lines.length; i++) {
|
|
46
|
+
const line = lines[i];
|
|
47
|
+
if (i === 0 && line === "---") {
|
|
48
|
+
inside = true;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (!inside)
|
|
52
|
+
break;
|
|
53
|
+
if (line === "---")
|
|
54
|
+
break;
|
|
55
|
+
if (/^deps\s*:\s*$/.test(line)) {
|
|
56
|
+
depsBlock = true;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const m = /^\s*personas\s*:\s*\[([^\]]*)\]\s*$/.exec(line);
|
|
60
|
+
if (m && (depsBlock || /^\s/.test(line))) {
|
|
61
|
+
return m[1]
|
|
62
|
+
.split(",")
|
|
63
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ""))
|
|
64
|
+
.filter((s) => s.length > 0);
|
|
65
|
+
}
|
|
66
|
+
if (depsBlock && /^[A-Za-z0-9_-]+\s*:/.test(line) && !/^\s/.test(line)) {
|
|
67
|
+
depsBlock = false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
export function checkMaterialization(workflowPath, workflowMd) {
|
|
73
|
+
const missing = [];
|
|
74
|
+
if (!workflowMd.includes("Store-Write Verification")) {
|
|
75
|
+
missing.push("Store-Write Verification");
|
|
76
|
+
}
|
|
77
|
+
if (!workflowMd.includes("Iron Laws")) {
|
|
78
|
+
missing.push("Iron Laws");
|
|
79
|
+
}
|
|
80
|
+
if (!workflowMd.includes("forge_store")) {
|
|
81
|
+
missing.push("forge_store");
|
|
82
|
+
}
|
|
83
|
+
const personas = extractPersonaNames(workflowMd);
|
|
84
|
+
if (personas.length === 0) {
|
|
85
|
+
missing.push("deps.personas: declaration");
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
const bodyStart = (() => {
|
|
89
|
+
if (!workflowMd.startsWith("---\n") && !workflowMd.startsWith("---\r\n"))
|
|
90
|
+
return 0;
|
|
91
|
+
const re = /\r?\n---\r?\n/;
|
|
92
|
+
const m = re.exec(workflowMd);
|
|
93
|
+
return m ? m.index + m[0].length : 0;
|
|
94
|
+
})();
|
|
95
|
+
const body = workflowMd.slice(bodyStart);
|
|
96
|
+
const anyHit = personas.some((name) => {
|
|
97
|
+
if (!name)
|
|
98
|
+
return false;
|
|
99
|
+
const tokenRegex = new RegExp(`\\b${name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`);
|
|
100
|
+
return body.includes(`${name}.md`) || tokenRegex.test(body);
|
|
101
|
+
});
|
|
102
|
+
if (!anyHit) {
|
|
103
|
+
missing.push(`persona file path (${personas.join(", ")})`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
void workflowPath;
|
|
107
|
+
return { ok: missing.length === 0, missing };
|
|
108
|
+
}
|
|
109
|
+
export function composeKickoff(opts) {
|
|
110
|
+
const { workflowMd, personaIdentity, parsed } = opts;
|
|
111
|
+
const sections = ["# /forge:approve", ""];
|
|
112
|
+
if (personaIdentity.trim().length > 0) {
|
|
113
|
+
sections.push(personaIdentity.trim(), "");
|
|
114
|
+
}
|
|
115
|
+
sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read all review artifacts for `engineering/sprints/<SPRINT_ID>/<TASK_ID>/` (PLAN_REVIEW.md, CODE_REVIEW.md).", "2. Query the store for the task and its sprint/feature context via `forge_store_query` — do NOT raw-read `.forge/store/`.", "3. Follow the workflow Algorithm verbatim: assess the full task lifecycle against architecture and acceptance criteria.", "4. Write `ARCHITECT_APPROVAL.md` and `APPROVAL-SUMMARY.json` to the task directory using the `write` tool.", "5. Update task status by calling the `forge_store` MCP tool: `{command:'update-status', args:['task','<TASK_ID>','status','<new-status>']}`. Never raw-write `.forge/store/`. Do NOT bash-shell `forge store ...`.", "6. Honour Pack-06 Read/Write/Ask/Store discipline: writes go via the `forge_store` MCP tool; in-conversation clarifications use `forge_ask_user`.");
|
|
116
|
+
sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
|
|
117
|
+
if (parsed.mode === "empty") {
|
|
118
|
+
sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
|
|
122
|
+
}
|
|
123
|
+
return sections.join("\n");
|
|
124
|
+
}
|
|
125
|
+
// Registration -------------------------------------------------------------
|
|
126
|
+
const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "architect_approve.md");
|
|
127
|
+
export function registerApprove(pi, options = {}) {
|
|
128
|
+
pi.registerCommand("forge:approve", {
|
|
129
|
+
description: "Run the architect-approve workflow for a Forge task. " +
|
|
130
|
+
"Usage: /forge:approve [@<file> | <free-form text>]. " +
|
|
131
|
+
"Note: this workflow is subagent-only; standalone invocations are refused. " +
|
|
132
|
+
"Orchestrator chains dispatch directly via runForgeSubagent.",
|
|
133
|
+
async handler(args, ctx) {
|
|
134
|
+
const cwd = options.cwd ?? process.cwd();
|
|
135
|
+
const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
|
|
136
|
+
let workflowMd;
|
|
137
|
+
let workflowAudience;
|
|
138
|
+
try {
|
|
139
|
+
const loaded = loadWorkflow(workflowPath);
|
|
140
|
+
workflowMd = loaded.rawMarkdown;
|
|
141
|
+
workflowAudience = loaded.audience;
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
if (err instanceof WorkflowLoaderError) {
|
|
145
|
+
if (err.code === "missing_file") {
|
|
146
|
+
ctx.ui.notify(`× forge:approve — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:regenerate first.`, "error");
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
ctx.ui.notify(`× forge:approve — workflow load failed (${err.code}): ${err.message}`, "error");
|
|
150
|
+
}
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const e = err;
|
|
154
|
+
ctx.ui.notify(`× forge:approve — failed to read workflow: ${e.message ?? "unknown"}`, "error");
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
let parsed;
|
|
158
|
+
try {
|
|
159
|
+
parsed = parseApproveArgs(args, cwd);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
const e = err;
|
|
163
|
+
ctx.ui.notify(`× forge:approve — failed to read seed: ${e.message ?? "unknown"}`, "error");
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const check = checkMaterialization(workflowPath, workflowMd);
|
|
167
|
+
if (!check.ok) {
|
|
168
|
+
for (const marker of check.missing) {
|
|
169
|
+
ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
|
|
170
|
+
}
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const personas = extractPersonaNames(workflowMd);
|
|
174
|
+
let personaIdentity = "";
|
|
175
|
+
if (personas.length > 0) {
|
|
176
|
+
try {
|
|
177
|
+
const persona = loadPersona(personas[0], { cwd });
|
|
178
|
+
personaIdentity = persona.identity;
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
if (err instanceof PersonaSkillLoaderError) {
|
|
182
|
+
ctx.ui.notify(`× forge:approve — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const e = err;
|
|
186
|
+
ctx.ui.notify(`× forge:approve — persona load error: ${e.message ?? "unknown"}`, "error");
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (!assertAudience({ workflowName: "architect_approve", audience: workflowAudience }, ctx)) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const kickoff = composeKickoff({
|
|
194
|
+
workflowMd,
|
|
195
|
+
personaIdentity,
|
|
196
|
+
parsed,
|
|
197
|
+
});
|
|
198
|
+
sendKickoff(pi, kickoff);
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=approve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/approve.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,5 +22,9 @@ export interface AudienceCheckInput {
|
|
|
22
22
|
*
|
|
23
23
|
* Refusal message for orchestrator-only violations (AC#3 verbatim):
|
|
24
24
|
* "× workflow <name> is orchestrator-only; cannot run from subagent context"
|
|
25
|
+
*
|
|
26
|
+
* Note: `subagent` audience is advisory only — users may invoke any
|
|
27
|
+
* `subagent`-audience workflow manually from the orchestrator (CLI) context.
|
|
28
|
+
* Only `orchestrator-only` produces refusals.
|
|
25
29
|
*/
|
|
26
30
|
export declare function assertAudience(input: AudienceCheckInput, ctx: ExtensionCommandContext): boolean;
|
|
@@ -24,6 +24,10 @@ export { CallerContextStore } from "./subagent/caller-context.js";
|
|
|
24
24
|
*
|
|
25
25
|
* Refusal message for orchestrator-only violations (AC#3 verbatim):
|
|
26
26
|
* "× workflow <name> is orchestrator-only; cannot run from subagent context"
|
|
27
|
+
*
|
|
28
|
+
* Note: `subagent` audience is advisory only — users may invoke any
|
|
29
|
+
* `subagent`-audience workflow manually from the orchestrator (CLI) context.
|
|
30
|
+
* Only `orchestrator-only` produces refusals.
|
|
27
31
|
*/
|
|
28
32
|
export function assertAudience(input, ctx) {
|
|
29
33
|
const { workflowName, audience } = input;
|
|
@@ -36,11 +40,10 @@ export function assertAudience(input, ctx) {
|
|
|
36
40
|
ctx.ui.notify(`× workflow ${workflowName} is orchestrator-only; cannot run from subagent context — forge-cli internal error if you did not run it as a subagent`, "error");
|
|
37
41
|
return false;
|
|
38
42
|
}
|
|
39
|
-
// "subagent" — allowed
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
43
|
+
// "subagent" — advisory hint, allowed from any caller.
|
|
44
|
+
// Users must be able to run every step manually (orchestrators are auto-mode);
|
|
45
|
+
// this audience is preserved in workflow front-matter for documentation but
|
|
46
|
+
// no longer enforced against orchestrator callers.
|
|
44
47
|
return true;
|
|
45
48
|
}
|
|
46
49
|
//# sourceMappingURL=audience-gate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audience-gate.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/audience-gate.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oEAAoE;AACpE,EAAE;AACF,iEAAiE;AACjE,+EAA+E;AAC/E,EAAE;AACF,aAAa;AACb,8DAA8D;AAC9D,wEAAwE;AACxE,4CAA4C;AAC5C,0EAA0E;AAI1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAIlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AASlE
|
|
1
|
+
{"version":3,"file":"audience-gate.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/audience-gate.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oEAAoE;AACpE,EAAE;AACF,iEAAiE;AACjE,+EAA+E;AAC/E,EAAE;AACF,aAAa;AACb,8DAA8D;AAC9D,wEAAwE;AACxE,4CAA4C;AAC5C,0EAA0E;AAI1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAIlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AASlE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc,CAAC,KAAyB,EAAE,GAA4B;IACrF,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACzC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,kBAAkB,CAAC,GAAG,EAAE,CAAC;IAEtE,gDAAgD;IAChD,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAEpC,gEAAgE;IAChE,IAAI,QAAQ,KAAK,mBAAmB,IAAI,aAAa,KAAK,UAAU,EAAE,CAAC;QACtE,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,cAAc,YAAY,wHAAwH,EAClJ,OAAO,CACP,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;IAED,uDAAuD;IACvD,+EAA+E;IAC/E,4EAA4E;IAC5E,mDAAmD;IACnD,OAAO,IAAI,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@entelligentsia/pi-coding-agent";
|
|
2
|
+
export type ArgMode = "empty" | "file" | "text";
|
|
3
|
+
export interface ParsedArgs {
|
|
4
|
+
mode: ArgMode;
|
|
5
|
+
taskRef: string;
|
|
6
|
+
sourceLabel: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseCollateArgs(rawArgs: string, cwd: string): ParsedArgs;
|
|
9
|
+
export declare function extractPersonaNames(workflowMd: string): string[];
|
|
10
|
+
export interface MaterializationCheck {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
missing: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare function checkMaterialization(workflowPath: string, workflowMd: string): MaterializationCheck;
|
|
15
|
+
export interface ComposeKickoffOpts {
|
|
16
|
+
workflowMd: string;
|
|
17
|
+
personaIdentity: string;
|
|
18
|
+
parsed: ParsedArgs;
|
|
19
|
+
}
|
|
20
|
+
export declare function composeKickoff(opts: ComposeKickoffOpts): string;
|
|
21
|
+
export interface RegisterCollateOptions {
|
|
22
|
+
cwd?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function registerCollate(pi: ExtensionAPI, options?: RegisterCollateOptions): void;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
// forge:collate — native kickoff handler (FORGE-S21-T10).
|
|
2
|
+
//
|
|
3
|
+
// Replaces the auto-generated stub previously installed by
|
|
4
|
+
// registerAllForgeCommands (forge-commands.ts). Kickoff Shim archetype
|
|
5
|
+
// (Pack-04 + Pack-06): single LLM handoff in current context, no fork.
|
|
6
|
+
//
|
|
7
|
+
// The collator_agent.md workflow has no audience restriction (defaults to
|
|
8
|
+
// "any"), so standalone human invocations are allowed — useful for retro
|
|
9
|
+
// runs and manual collation triggers.
|
|
10
|
+
//
|
|
11
|
+
// Iron Laws:
|
|
12
|
+
// IL1 — code only under forge-cli/src/extensions/forgecli/.
|
|
13
|
+
// IL4 — no JSON.stringify-into-subagent dispatch.
|
|
14
|
+
// IL6 — no shell-string interpolation; no spawn calls here.
|
|
15
|
+
// IL7 — every failure path emits ctx.ui.notify and returns; no silent
|
|
16
|
+
// continuation.
|
|
17
|
+
import * as fs from "node:fs";
|
|
18
|
+
import * as path from "node:path";
|
|
19
|
+
import { assertAudience } from "./audience-gate.js";
|
|
20
|
+
import { sendKickoff } from "./kickoff.js";
|
|
21
|
+
import { loadPersona, PersonaSkillLoaderError } from "./loaders/persona-skill-loader.js";
|
|
22
|
+
import { loadWorkflow, WorkflowLoaderError } from "./loaders/workflow-loader.js";
|
|
23
|
+
export function parseCollateArgs(rawArgs, cwd) {
|
|
24
|
+
const trimmed = (rawArgs ?? "").trim();
|
|
25
|
+
if (trimmed === "") {
|
|
26
|
+
return { mode: "empty", taskRef: "", sourceLabel: "(no input — collator infers sprint from store/context)" };
|
|
27
|
+
}
|
|
28
|
+
if (trimmed.startsWith("@")) {
|
|
29
|
+
const ref = trimmed.slice(1).trim();
|
|
30
|
+
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
31
|
+
const seed = fs.readFileSync(filePath, "utf8");
|
|
32
|
+
return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
|
|
33
|
+
}
|
|
34
|
+
return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
|
|
35
|
+
}
|
|
36
|
+
// Frontmatter persona extraction (permissive) ------------------------------
|
|
37
|
+
export function extractPersonaNames(workflowMd) {
|
|
38
|
+
const lines = workflowMd.split(/\r?\n/);
|
|
39
|
+
if (lines.length === 0 || lines[0] !== "---")
|
|
40
|
+
return [];
|
|
41
|
+
let inside = false;
|
|
42
|
+
let depsBlock = false;
|
|
43
|
+
for (let i = 0; i < lines.length; i++) {
|
|
44
|
+
const line = lines[i];
|
|
45
|
+
if (i === 0 && line === "---") {
|
|
46
|
+
inside = true;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (!inside)
|
|
50
|
+
break;
|
|
51
|
+
if (line === "---")
|
|
52
|
+
break;
|
|
53
|
+
if (/^deps\s*:\s*$/.test(line)) {
|
|
54
|
+
depsBlock = true;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const m = /^\s*personas\s*:\s*\[([^\]]*)\]\s*$/.exec(line);
|
|
58
|
+
if (m && (depsBlock || /^\s/.test(line))) {
|
|
59
|
+
return m[1]
|
|
60
|
+
.split(",")
|
|
61
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ""))
|
|
62
|
+
.filter((s) => s.length > 0);
|
|
63
|
+
}
|
|
64
|
+
if (depsBlock && /^[A-Za-z0-9_-]+\s*:/.test(line) && !/^\s/.test(line)) {
|
|
65
|
+
depsBlock = false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
export function checkMaterialization(workflowPath, workflowMd) {
|
|
71
|
+
const missing = [];
|
|
72
|
+
if (!workflowMd.includes("Store-Write Verification")) {
|
|
73
|
+
missing.push("Store-Write Verification");
|
|
74
|
+
}
|
|
75
|
+
if (!workflowMd.includes("Iron Laws")) {
|
|
76
|
+
missing.push("Iron Laws");
|
|
77
|
+
}
|
|
78
|
+
if (!workflowMd.includes("forge_store")) {
|
|
79
|
+
missing.push("forge_store");
|
|
80
|
+
}
|
|
81
|
+
const personas = extractPersonaNames(workflowMd);
|
|
82
|
+
if (personas.length === 0) {
|
|
83
|
+
missing.push("deps.personas: declaration");
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const bodyStart = (() => {
|
|
87
|
+
if (!workflowMd.startsWith("---\n") && !workflowMd.startsWith("---\r\n"))
|
|
88
|
+
return 0;
|
|
89
|
+
const re = /\r?\n---\r?\n/;
|
|
90
|
+
const m = re.exec(workflowMd);
|
|
91
|
+
return m ? m.index + m[0].length : 0;
|
|
92
|
+
})();
|
|
93
|
+
const body = workflowMd.slice(bodyStart);
|
|
94
|
+
const anyHit = personas.some((name) => {
|
|
95
|
+
if (!name)
|
|
96
|
+
return false;
|
|
97
|
+
const tokenRegex = new RegExp(`\\b${name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`);
|
|
98
|
+
return body.includes(`${name}.md`) || tokenRegex.test(body);
|
|
99
|
+
});
|
|
100
|
+
if (!anyHit) {
|
|
101
|
+
missing.push(`persona file path (${personas.join(", ")})`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
void workflowPath;
|
|
105
|
+
return { ok: missing.length === 0, missing };
|
|
106
|
+
}
|
|
107
|
+
export function composeKickoff(opts) {
|
|
108
|
+
const { workflowMd, personaIdentity, parsed } = opts;
|
|
109
|
+
const sections = ["# /forge:collate", ""];
|
|
110
|
+
if (personaIdentity.trim().length > 0) {
|
|
111
|
+
sections.push(personaIdentity.trim(), "");
|
|
112
|
+
}
|
|
113
|
+
sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Identify the active sprint via `forge_store_query` — do NOT raw-read `.forge/store/`.", "2. Follow the workflow Algorithm verbatim: collate store data into MASTER_INDEX.md, sprint INDEX.md, task INDEX.md files.", "3. Write all collated markdown files using the `write` tool.", "4. Honour Pack-06 Read/Write/Ask/Store discipline: store reads go via `forge_store_query`; in-conversation clarifications use `forge_ask_user`.");
|
|
114
|
+
sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
|
|
115
|
+
if (parsed.mode === "empty") {
|
|
116
|
+
sections.push("", "## Input", "", "(no seed — infer sprint from store context)");
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
|
|
120
|
+
}
|
|
121
|
+
return sections.join("\n");
|
|
122
|
+
}
|
|
123
|
+
// Registration -------------------------------------------------------------
|
|
124
|
+
const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "collator_agent.md");
|
|
125
|
+
export function registerCollate(pi, options = {}) {
|
|
126
|
+
pi.registerCommand("forge:collate", {
|
|
127
|
+
description: "Run the collator-agent workflow. " +
|
|
128
|
+
"Usage: /forge:collate [@<file> | <sprint-id> | <free-form text>]. " +
|
|
129
|
+
"Empty args → collator infers the active sprint from store context.",
|
|
130
|
+
async handler(args, ctx) {
|
|
131
|
+
const cwd = options.cwd ?? process.cwd();
|
|
132
|
+
const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
|
|
133
|
+
let workflowMd;
|
|
134
|
+
let workflowAudience;
|
|
135
|
+
try {
|
|
136
|
+
const loaded = loadWorkflow(workflowPath);
|
|
137
|
+
workflowMd = loaded.rawMarkdown;
|
|
138
|
+
workflowAudience = loaded.audience;
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
if (err instanceof WorkflowLoaderError) {
|
|
142
|
+
if (err.code === "missing_file") {
|
|
143
|
+
ctx.ui.notify(`× forge:collate — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:regenerate first.`, "error");
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
ctx.ui.notify(`× forge:collate — workflow load failed (${err.code}): ${err.message}`, "error");
|
|
147
|
+
}
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const e = err;
|
|
151
|
+
ctx.ui.notify(`× forge:collate — failed to read workflow: ${e.message ?? "unknown"}`, "error");
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
let parsed;
|
|
155
|
+
try {
|
|
156
|
+
parsed = parseCollateArgs(args, cwd);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
const e = err;
|
|
160
|
+
ctx.ui.notify(`× forge:collate — failed to read seed: ${e.message ?? "unknown"}`, "error");
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const check = checkMaterialization(workflowPath, workflowMd);
|
|
164
|
+
if (!check.ok) {
|
|
165
|
+
for (const marker of check.missing) {
|
|
166
|
+
ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const personas = extractPersonaNames(workflowMd);
|
|
171
|
+
let personaIdentity = "";
|
|
172
|
+
if (personas.length > 0) {
|
|
173
|
+
try {
|
|
174
|
+
const persona = loadPersona(personas[0], { cwd });
|
|
175
|
+
personaIdentity = persona.identity;
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
if (err instanceof PersonaSkillLoaderError) {
|
|
179
|
+
ctx.ui.notify(`× forge:collate — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const e = err;
|
|
183
|
+
ctx.ui.notify(`× forge:collate — persona load error: ${e.message ?? "unknown"}`, "error");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (!assertAudience({ workflowName: "collator_agent", audience: workflowAudience }, ctx)) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const kickoff = composeKickoff({
|
|
191
|
+
workflowMd,
|
|
192
|
+
personaIdentity,
|
|
193
|
+
parsed,
|
|
194
|
+
});
|
|
195
|
+
sendKickoff(pi, kickoff);
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=collate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collate.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/collate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@entelligentsia/pi-coding-agent";
|
|
2
|
+
export type ArgMode = "empty" | "file" | "text";
|
|
3
|
+
export interface ParsedArgs {
|
|
4
|
+
mode: ArgMode;
|
|
5
|
+
taskRef: string;
|
|
6
|
+
sourceLabel: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseCommitArgs(rawArgs: string, cwd: string): ParsedArgs;
|
|
9
|
+
export declare function extractPersonaNames(workflowMd: string): string[];
|
|
10
|
+
export interface MaterializationCheck {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
missing: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare function checkMaterialization(workflowPath: string, workflowMd: string): MaterializationCheck;
|
|
15
|
+
export interface ComposeKickoffOpts {
|
|
16
|
+
workflowMd: string;
|
|
17
|
+
personaIdentity: string;
|
|
18
|
+
parsed: ParsedArgs;
|
|
19
|
+
}
|
|
20
|
+
export declare function composeKickoff(opts: ComposeKickoffOpts): string;
|
|
21
|
+
export interface RegisterCommitOptions {
|
|
22
|
+
cwd?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function registerCommit(pi: ExtensionAPI, options?: RegisterCommitOptions): void;
|