@entelligentsia/forgecli 1.0.21 → 1.0.25
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 +88 -0
- package/dist/CHANGELOG-forge-plugin.md +118 -0
- package/dist/extensions/forgecli/forge-tools.d.ts +1 -0
- package/dist/extensions/forgecli/forge-tools.js +73 -0
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/lib/forge-root.d.ts +5 -0
- package/dist/extensions/forgecli/lib/forge-root.js +14 -1
- package/dist/extensions/forgecli/lib/forge-root.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +1 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.js +26 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/run-sprint.js +49 -0
- package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
- package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
- package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
- package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
- package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/.schemas/event.schema.json +8 -3
- package/dist/forge-payload/.schemas/migrations.json +56 -0
- package/dist/forge-payload/integrity.json +3 -3
- package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
- package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
- package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
- package/dist/forge-payload/schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/schemas/event.schema.json +8 -3
- package/dist/forge-payload/schemas/structure-manifest.json +4 -2
- package/dist/forge-payload/tools/commit-task.cjs +218 -0
- package/dist/forge-payload/tools/store-cli.cjs +6 -1
- package/node_modules/@mariozechner/clipboard/package.json +2 -1
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
- package/package.json +2 -2
- package/dist/extensions/forgecli/add-pipeline.d.ts +0 -19
- package/dist/extensions/forgecli/add-pipeline.js +0 -143
- package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
- package/dist/extensions/forgecli/add-task.d.ts +0 -20
- package/dist/extensions/forgecli/add-task.js +0 -154
- package/dist/extensions/forgecli/add-task.js.map +0 -1
- package/dist/extensions/forgecli/approve.d.ts +0 -22
- package/dist/extensions/forgecli/approve.js +0 -152
- package/dist/extensions/forgecli/approve.js.map +0 -1
- package/dist/extensions/forgecli/banner.d.ts +0 -10
- package/dist/extensions/forgecli/banner.js +0 -36
- package/dist/extensions/forgecli/banner.js.map +0 -1
- package/dist/extensions/forgecli/calibrate.d.ts +0 -64
- package/dist/extensions/forgecli/calibrate.js +0 -481
- package/dist/extensions/forgecli/calibrate.js.map +0 -1
- package/dist/extensions/forgecli/collate.d.ts +0 -22
- package/dist/extensions/forgecli/collate.js +0 -134
- package/dist/extensions/forgecli/collate.js.map +0 -1
- package/dist/extensions/forgecli/commit.d.ts +0 -22
- package/dist/extensions/forgecli/commit.js +0 -152
- package/dist/extensions/forgecli/commit.js.map +0 -1
- package/dist/extensions/forgecli/config-command.d.ts +0 -8
- package/dist/extensions/forgecli/config-command.js +0 -67
- package/dist/extensions/forgecli/config-command.js.map +0 -1
- package/dist/extensions/forgecli/config-layer.d.ts +0 -53
- package/dist/extensions/forgecli/config-layer.js +0 -72
- package/dist/extensions/forgecli/config-layer.js.map +0 -1
- package/dist/extensions/forgecli/config-writer.d.ts +0 -16
- package/dist/extensions/forgecli/config-writer.js +0 -69
- package/dist/extensions/forgecli/config-writer.js.map +0 -1
- package/dist/extensions/forgecli/enhance.d.ts +0 -27
- package/dist/extensions/forgecli/enhance.js +0 -199
- package/dist/extensions/forgecli/enhance.js.map +0 -1
- package/dist/extensions/forgecli/fix-bug.d.ts +0 -85
- package/dist/extensions/forgecli/fix-bug.js +0 -1580
- package/dist/extensions/forgecli/fix-bug.js.map +0 -1
- package/dist/extensions/forgecli/forge-header.d.ts +0 -12
- package/dist/extensions/forgecli/forge-header.js +0 -114
- package/dist/extensions/forgecli/forge-header.js.map +0 -1
- package/dist/extensions/forgecli/forge-init.d.ts +0 -26
- package/dist/extensions/forgecli/forge-init.js +0 -514
- package/dist/extensions/forgecli/forge-init.js.map +0 -1
- package/dist/extensions/forgecli/forge-root.d.ts +0 -10
- package/dist/extensions/forgecli/forge-root.js +0 -62
- package/dist/extensions/forgecli/forge-root.js.map +0 -1
- package/dist/extensions/forgecli/forge-update-command.d.ts +0 -100
- package/dist/extensions/forgecli/forge-update-command.js +0 -435
- package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
- package/dist/extensions/forgecli/friction-emit.d.ts +0 -99
- package/dist/extensions/forgecli/friction-emit.js +0 -245
- package/dist/extensions/forgecli/friction-emit.js.map +0 -1
- package/dist/extensions/forgecli/implement.d.ts +0 -22
- package/dist/extensions/forgecli/implement.js +0 -170
- package/dist/extensions/forgecli/implement.js.map +0 -1
- package/dist/extensions/forgecli/init-context.d.ts +0 -99
- package/dist/extensions/forgecli/init-context.js +0 -178
- package/dist/extensions/forgecli/init-context.js.map +0 -1
- package/dist/extensions/forgecli/init-progress.d.ts +0 -39
- package/dist/extensions/forgecli/init-progress.js +0 -117
- package/dist/extensions/forgecli/init-progress.js.map +0 -1
- package/dist/extensions/forgecli/input-router.d.ts +0 -33
- package/dist/extensions/forgecli/input-router.js +0 -136
- package/dist/extensions/forgecli/input-router.js.map +0 -1
- package/dist/extensions/forgecli/lib/halt-advisor.d.ts +0 -59
- package/dist/extensions/forgecli/lib/halt-advisor.js +0 -113
- package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
- package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +0 -46
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js +0 -64
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
- package/dist/extensions/forgecli/materialize.d.ts +0 -16
- package/dist/extensions/forgecli/materialize.js +0 -195
- package/dist/extensions/forgecli/materialize.js.map +0 -1
- package/dist/extensions/forgecli/migrate.d.ts +0 -22
- package/dist/extensions/forgecli/migrate.js +0 -260
- package/dist/extensions/forgecli/migrate.js.map +0 -1
- package/dist/extensions/forgecli/migration-engine.d.ts +0 -117
- package/dist/extensions/forgecli/migration-engine.js +0 -563
- package/dist/extensions/forgecli/migration-engine.js.map +0 -1
- package/dist/extensions/forgecli/model-registry.d.ts +0 -61
- package/dist/extensions/forgecli/model-registry.js +0 -127
- package/dist/extensions/forgecli/model-registry.js.map +0 -1
- package/dist/extensions/forgecli/model-resolver.d.ts +0 -32
- package/dist/extensions/forgecli/model-resolver.js +0 -65
- package/dist/extensions/forgecli/model-resolver.js.map +0 -1
- package/dist/extensions/forgecli/model-validator.d.ts +0 -29
- package/dist/extensions/forgecli/model-validator.js +0 -107
- package/dist/extensions/forgecli/model-validator.js.map +0 -1
- package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +0 -26
- package/dist/extensions/forgecli/orchestrator-status-bar.js +0 -213
- package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
- package/dist/extensions/forgecli/plan.d.ts +0 -22
- package/dist/extensions/forgecli/plan.js +0 -167
- package/dist/extensions/forgecli/plan.js.map +0 -1
- package/dist/extensions/forgecli/quiz-agent.d.ts +0 -17
- package/dist/extensions/forgecli/quiz-agent.js +0 -98
- package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
- package/dist/extensions/forgecli/read-command.d.ts +0 -2
- package/dist/extensions/forgecli/read-command.js +0 -100
- package/dist/extensions/forgecli/read-command.js.map +0 -1
- package/dist/extensions/forgecli/regenerate.d.ts +0 -40
- package/dist/extensions/forgecli/regenerate.js +0 -438
- package/dist/extensions/forgecli/regenerate.js.map +0 -1
- package/dist/extensions/forgecli/remove-command.d.ts +0 -17
- package/dist/extensions/forgecli/remove-command.js +0 -124
- package/dist/extensions/forgecli/remove-command.js.map +0 -1
- package/dist/extensions/forgecli/report-bug.d.ts +0 -25
- package/dist/extensions/forgecli/report-bug.js +0 -159
- package/dist/extensions/forgecli/report-bug.js.map +0 -1
- package/dist/extensions/forgecli/retrospective.d.ts +0 -20
- package/dist/extensions/forgecli/retrospective.js +0 -126
- package/dist/extensions/forgecli/retrospective.js.map +0 -1
- package/dist/extensions/forgecli/review-code.d.ts +0 -35
- package/dist/extensions/forgecli/review-code.js +0 -196
- package/dist/extensions/forgecli/review-code.js.map +0 -1
- package/dist/extensions/forgecli/review-plan.d.ts +0 -35
- package/dist/extensions/forgecli/review-plan.js +0 -200
- package/dist/extensions/forgecli/review-plan.js.map +0 -1
- package/dist/extensions/forgecli/run-sprint.d.ts +0 -27
- package/dist/extensions/forgecli/run-sprint.js +0 -716
- package/dist/extensions/forgecli/run-sprint.js.map +0 -1
- package/dist/extensions/forgecli/run-task.d.ts +0 -204
- package/dist/extensions/forgecli/run-task.js +0 -1403
- package/dist/extensions/forgecli/run-task.js.map +0 -1
- package/dist/extensions/forgecli/skill-curation-flag.d.ts +0 -21
- package/dist/extensions/forgecli/skill-curation-flag.js +0 -71
- package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
- package/dist/extensions/forgecli/skill-curator-subagent.d.ts +0 -102
- package/dist/extensions/forgecli/skill-curator-subagent.js +0 -339
- package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
- package/dist/extensions/forgecli/skill-retriever.d.ts +0 -84
- package/dist/extensions/forgecli/skill-retriever.js +0 -246
- package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
- package/dist/extensions/forgecli/skill-usage-tracker.d.ts +0 -91
- package/dist/extensions/forgecli/skill-usage-tracker.js +0 -224
- package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
- package/dist/extensions/forgecli/sprint-intake.d.ts +0 -10
- package/dist/extensions/forgecli/sprint-intake.js +0 -91
- package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
- package/dist/extensions/forgecli/sprint-plan.d.ts +0 -14
- package/dist/extensions/forgecli/sprint-plan.js +0 -122
- package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
- package/dist/extensions/forgecli/status-command.d.ts +0 -19
- package/dist/extensions/forgecli/status-command.js +0 -140
- package/dist/extensions/forgecli/status-command.js.map +0 -1
- package/dist/extensions/forgecli/store-error-remediation.d.ts +0 -65
- package/dist/extensions/forgecli/store-error-remediation.js +0 -307
- package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
- package/dist/extensions/forgecli/store-query.d.ts +0 -22
- package/dist/extensions/forgecli/store-query.js +0 -107
- package/dist/extensions/forgecli/store-query.js.map +0 -1
- package/dist/extensions/forgecli/store-repair.d.ts +0 -17
- package/dist/extensions/forgecli/store-repair.js +0 -123
- package/dist/extensions/forgecli/store-repair.js.map +0 -1
- package/dist/extensions/forgecli/store-resolver.d.ts +0 -56
- package/dist/extensions/forgecli/store-resolver.js +0 -263
- package/dist/extensions/forgecli/store-resolver.js.map +0 -1
- package/dist/extensions/forgecli/store-validator.d.ts +0 -16
- package/dist/extensions/forgecli/store-validator.js +0 -32
- package/dist/extensions/forgecli/store-validator.js.map +0 -1
- package/dist/extensions/forgecli/test-orchestrate.d.ts +0 -2
- package/dist/extensions/forgecli/test-orchestrate.js +0 -182
- package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
- package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
- package/dist/extensions/forgecli/thread-switcher.js +0 -189
- package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
- package/dist/extensions/forgecli/transition-guard.d.ts +0 -20
- package/dist/extensions/forgecli/transition-guard.js +0 -89
- package/dist/extensions/forgecli/transition-guard.js.map +0 -1
- package/dist/extensions/forgecli/update-check.d.ts +0 -37
- package/dist/extensions/forgecli/update-check.js +0 -185
- package/dist/extensions/forgecli/update-check.js.map +0 -1
- package/dist/extensions/forgecli/update-tools.d.ts +0 -23
- package/dist/extensions/forgecli/update-tools.js +0 -135
- package/dist/extensions/forgecli/update-tools.js.map +0 -1
- package/dist/extensions/forgecli/validate.d.ts +0 -22
- package/dist/extensions/forgecli/validate.js +0 -152
- package/dist/extensions/forgecli/validate.js.map +0 -1
- package/dist/extensions/forgecli/viewport-events.d.ts +0 -78
- package/dist/extensions/forgecli/viewport-events.js +0 -243
- package/dist/extensions/forgecli/viewport-events.js.map +0 -1
- package/dist/extensions/forgecli/viewport-renderer.d.ts +0 -83
- package/dist/extensions/forgecli/viewport-renderer.js +0 -233
- package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
- package/dist/extensions/forgecli/viewport-theme.d.ts +0 -11
- package/dist/extensions/forgecli/viewport-theme.js +0 -128
- package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
- package/dist/extensions/forgecli/whats-new-widget.d.ts +0 -26
- package/dist/extensions/forgecli/whats-new-widget.js +0 -376
- package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
- package/dist/extensions/forgecli/whats-new.d.ts +0 -120
- package/dist/extensions/forgecli/whats-new.js +0 -470
- package/dist/extensions/forgecli/whats-new.js.map +0 -1
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { extractPersonaNames } from "./lib/frontmatter-parser.js";
|
|
3
|
-
export { extractPersonaNames };
|
|
4
|
-
import { checkMaterialization, type MaterializationCheck } from "./lib/manifest-checker.js";
|
|
5
|
-
export { checkMaterialization, type MaterializationCheck };
|
|
6
|
-
export type ArgMode = "empty" | "file" | "text";
|
|
7
|
-
export interface ParsedArgs {
|
|
8
|
-
mode: ArgMode;
|
|
9
|
-
taskRef: string;
|
|
10
|
-
sourceLabel: string;
|
|
11
|
-
}
|
|
12
|
-
export declare function parsePlanArgs(rawArgs: string, cwd: string): ParsedArgs;
|
|
13
|
-
export interface ComposeKickoffOpts {
|
|
14
|
-
workflowMd: string;
|
|
15
|
-
personaIdentity: string;
|
|
16
|
-
parsed: ParsedArgs;
|
|
17
|
-
}
|
|
18
|
-
export declare function composeKickoff(opts: ComposeKickoffOpts): string;
|
|
19
|
-
export interface RegisterPlanOptions {
|
|
20
|
-
cwd?: string;
|
|
21
|
-
}
|
|
22
|
-
export declare function registerPlan(pi: ExtensionAPI, options?: RegisterPlanOptions): void;
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
// forge:plan — native kickoff handler (FORGE-S20-T05).
|
|
2
|
-
//
|
|
3
|
-
// Replaces the auto-generated stub previously installed by
|
|
4
|
-
// registerAllForgeCommands (forge-commands.ts). Like S19 sprint-intake and
|
|
5
|
-
// FORGE-S20-T04 enhance, this is a Kickoff Shim (Pack-04 + Pack-06):
|
|
6
|
-
// 1. Reads `.forge/workflows/plan_task.md` (the materialized workflow).
|
|
7
|
-
// 2. Verifies four Pack-06 materialization markers — refuses to dispatch on
|
|
8
|
-
// regression and emits a per-marker `ctx.ui.notify` so a user sees the
|
|
9
|
-
// cause.
|
|
10
|
-
// 3. Loads the persona declared in the workflow's `deps.personas:`
|
|
11
|
-
// frontmatter via the FORGE-S20-T02 loader (no ad-hoc fs.readFile of
|
|
12
|
-
// `.forge/personas/`).
|
|
13
|
-
// 4. Composes ONE kickoff message: persona identity, dispatch instructions
|
|
14
|
-
// (read TASK_PROMPT.md, follow workflow, write PLAN.md/PLAN-SUMMARY.json,
|
|
15
|
-
// forge_store-driven status updates), the workflow body verbatim, and
|
|
16
|
-
// argv as @<path> file ref or free-form text.
|
|
17
|
-
// 5. Hands control to the LLM via `sendKickoff(pi, text)` —
|
|
18
|
-
// `deliverAs: "steer"`. Never raw `pi.sendUserMessage`.
|
|
19
|
-
//
|
|
20
|
-
// Per FORGE-S20 SPRINT_REQUIREMENTS Constraints and T05 AC#4: the
|
|
21
|
-
// prompt-injection fallback is DELETED — no FORGE_LEGACY_KICKOFF flag, no
|
|
22
|
-
// markdown-stub for this command.
|
|
23
|
-
//
|
|
24
|
-
// FORGE-S26-T11: pipeline step guard added. Checks task status via store-cli
|
|
25
|
-
// before dispatching. --force flag bypasses the guard.
|
|
26
|
-
//
|
|
27
|
-
// Iron Laws:
|
|
28
|
-
// IL1 — code only under forge-cli/src/extensions/forgecli/.
|
|
29
|
-
// IL4 — no JSON.stringify-into-subagent dispatch.
|
|
30
|
-
// IL6 — no shell-string interpolation; no spawn calls here.
|
|
31
|
-
// IL7 — every failure path emits ctx.ui.notify and returns; no silent
|
|
32
|
-
// continuation.
|
|
33
|
-
import * as fs from "node:fs";
|
|
34
|
-
import * as path from "node:path";
|
|
35
|
-
import { assertAudience } from "./audience-gate.js";
|
|
36
|
-
import { discoverForgeConfig } from "./forge-root.js";
|
|
37
|
-
import { sendKickoff } from "./kickoff.js";
|
|
38
|
-
// FORGE-S25-T16: extracted to lib modules. Re-exported here for backward compat
|
|
39
|
-
// (plan.test.ts, bundled-base-pack-markers.test.ts, run-task.ts, run-sprint.ts,
|
|
40
|
-
// fix-bug.ts all import checkMaterialization / extractPersonaNames from plan.js).
|
|
41
|
-
import { extractPersonaNames } from "./lib/frontmatter-parser.js";
|
|
42
|
-
import { parseGuardArgs, runPipelineGuard } from "./lib/pipeline-guard.js";
|
|
43
|
-
import { loadPersona, PersonaSkillLoaderError } from "./parsers/persona-skill-loader.js";
|
|
44
|
-
import { loadWorkflow, WorkflowLoaderError } from "./parsers/workflow-loader.js";
|
|
45
|
-
export { extractPersonaNames };
|
|
46
|
-
import { checkMaterialization } from "./lib/manifest-checker.js";
|
|
47
|
-
export { checkMaterialization };
|
|
48
|
-
export function parsePlanArgs(rawArgs, cwd) {
|
|
49
|
-
const trimmed = (rawArgs ?? "").trim();
|
|
50
|
-
if (trimmed === "") {
|
|
51
|
-
return { mode: "empty", taskRef: "", sourceLabel: "(no input — engineer infers task from store/context)" };
|
|
52
|
-
}
|
|
53
|
-
if (trimmed.startsWith("@")) {
|
|
54
|
-
const ref = trimmed.slice(1).trim();
|
|
55
|
-
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
56
|
-
const seed = fs.readFileSync(filePath, "utf8");
|
|
57
|
-
return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
|
|
58
|
-
}
|
|
59
|
-
return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
|
|
60
|
-
}
|
|
61
|
-
export function composeKickoff(opts) {
|
|
62
|
-
const { workflowMd, personaIdentity, parsed } = opts;
|
|
63
|
-
const sections = ["# /forge:plan", ""];
|
|
64
|
-
if (personaIdentity.trim().length > 0) {
|
|
65
|
-
sections.push(personaIdentity.trim(), "");
|
|
66
|
-
}
|
|
67
|
-
sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read the task prompt at `engineering/sprints/<SPRINT_ID>/<TASK_ID>/TASK_PROMPT.md` (the source of truth).", "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: load context, research, plan, knowledge writeback, finalize.", "4. Write `PLAN.md` and `PLAN-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 (canonical 2-positional write: `args:['<entity>','<json>']`, id INSIDE json); in-conversation clarifications use `forge_ask_user`.");
|
|
68
|
-
sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
|
|
69
|
-
if (parsed.mode === "empty") {
|
|
70
|
-
sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
|
|
74
|
-
}
|
|
75
|
-
return sections.join("\n");
|
|
76
|
-
}
|
|
77
|
-
// Registration -------------------------------------------------------------
|
|
78
|
-
const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "plan_task.md");
|
|
79
|
-
export function registerPlan(pi, options = {}) {
|
|
80
|
-
pi.registerCommand("forge:plan", {
|
|
81
|
-
description: "Run the plan-task workflow for a Forge task. " +
|
|
82
|
-
"Usage: /forge:plan [@<file> | <free-form text>]. " +
|
|
83
|
-
"Empty args → engineer infers the task from sprint/store context.",
|
|
84
|
-
async handler(args, ctx) {
|
|
85
|
-
const cwd = options.cwd ?? process.cwd();
|
|
86
|
-
const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
|
|
87
|
-
// Pipeline step guard (FORGE-S26-T11): check task state before dispatching.
|
|
88
|
-
const guardParsed = parseGuardArgs(args);
|
|
89
|
-
if (!guardParsed.force) {
|
|
90
|
-
const forgeConfig = discoverForgeConfig(cwd);
|
|
91
|
-
if (forgeConfig) {
|
|
92
|
-
const guard = runPipelineGuard("plan", guardParsed.taskIdHint, forgeConfig.forgeRoot, cwd);
|
|
93
|
-
if (guard.blocked) {
|
|
94
|
-
ctx.ui.notify(guard.message, "error");
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// Use cleanArgs (--force stripped) for workflow dispatch
|
|
100
|
-
const effectiveArgs = guardParsed.cleanArgs;
|
|
101
|
-
let workflowMd;
|
|
102
|
-
let workflowAudience;
|
|
103
|
-
try {
|
|
104
|
-
const loaded = loadWorkflow(workflowPath);
|
|
105
|
-
workflowMd = loaded.rawMarkdown;
|
|
106
|
-
workflowAudience = loaded.audience;
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
if (err instanceof WorkflowLoaderError) {
|
|
110
|
-
if (err.code === "missing_file") {
|
|
111
|
-
ctx.ui.notify(`× forge:plan — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
ctx.ui.notify(`× forge:plan — workflow load failed (${err.code}): ${err.message}`, "error");
|
|
115
|
-
}
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
const e = err;
|
|
119
|
-
ctx.ui.notify(`× forge:plan — failed to read workflow: ${e.message ?? "unknown"}`, "error");
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
let parsed;
|
|
123
|
-
try {
|
|
124
|
-
parsed = parsePlanArgs(effectiveArgs, cwd);
|
|
125
|
-
}
|
|
126
|
-
catch (err) {
|
|
127
|
-
const e = err;
|
|
128
|
-
ctx.ui.notify(`× forge:plan — failed to read seed: ${e.message ?? "unknown"}`, "error");
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
const check = checkMaterialization(workflowPath, workflowMd);
|
|
132
|
-
if (!check.ok) {
|
|
133
|
-
for (const marker of check.missing) {
|
|
134
|
-
ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
|
|
135
|
-
}
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
const personas = extractPersonaNames(workflowMd);
|
|
139
|
-
let personaIdentity = "";
|
|
140
|
-
if (personas.length > 0) {
|
|
141
|
-
try {
|
|
142
|
-
const persona = loadPersona(personas[0], { cwd });
|
|
143
|
-
personaIdentity = persona.identity;
|
|
144
|
-
}
|
|
145
|
-
catch (err) {
|
|
146
|
-
if (err instanceof PersonaSkillLoaderError) {
|
|
147
|
-
ctx.ui.notify(`× forge:plan — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
const e = err;
|
|
151
|
-
ctx.ui.notify(`× forge:plan — persona load error: ${e.message ?? "unknown"}`, "error");
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (!assertAudience({ workflowName: "plan_task", audience: workflowAudience }, ctx)) {
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
const kickoff = composeKickoff({
|
|
159
|
-
workflowMd,
|
|
160
|
-
personaIdentity,
|
|
161
|
-
parsed,
|
|
162
|
-
});
|
|
163
|
-
sendKickoff(pi, kickoff);
|
|
164
|
-
},
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=plan.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
export interface ParsedQuizAgentArgs {
|
|
3
|
-
mode: "empty" | "file" | "text";
|
|
4
|
-
topicSeed: string;
|
|
5
|
-
sourceLabel: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function parseQuizAgentArgs(rawArgs: string, cwd: string): ParsedQuizAgentArgs;
|
|
8
|
-
export interface ComposeQuizAgentKickoffOpts {
|
|
9
|
-
commandMd: string;
|
|
10
|
-
parsed: ParsedQuizAgentArgs;
|
|
11
|
-
}
|
|
12
|
-
export declare function composeQuizAgentKickoff(opts: ComposeQuizAgentKickoffOpts): string;
|
|
13
|
-
export interface RegisterQuizAgentOptions {
|
|
14
|
-
forgeRoot: string | null;
|
|
15
|
-
cwd?: string;
|
|
16
|
-
}
|
|
17
|
-
export declare function registerQuizAgent(pi: ExtensionAPI, options: RegisterQuizAgentOptions): void;
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
// forge:quiz-agent — native kickoff handler (FORGE-S23-T11).
|
|
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
|
-
// Ultra-thin shim: reads commands/quiz-agent.md and dispatches.
|
|
8
|
-
// Optional topic seed or @<file> narrows the quiz scope.
|
|
9
|
-
//
|
|
10
|
-
// Workflow source: <forgeRoot>/commands/quiz-agent.md (command file).
|
|
11
|
-
// Note: quiz_agent.md also exists in .forge/workflows/ but lacks 3 of
|
|
12
|
-
// 4 Pack-06 markers. Using the command file for consistency with the
|
|
13
|
-
// other 5 handlers in this batch. Follow-up task can upgrade to read
|
|
14
|
-
// from .forge/workflows/quiz_agent.md when it has all markers.
|
|
15
|
-
//
|
|
16
|
-
// File-existence check only — command files lack Pack-06 workflow markers.
|
|
17
|
-
//
|
|
18
|
-
// Iron Laws:
|
|
19
|
-
// IL1 — code only under forge-cli/src/extensions/forgecli/.
|
|
20
|
-
// IL4 — no JSON.stringify-into-subagent dispatch.
|
|
21
|
-
// IL6 — no shell-string interpolation; no spawn calls here.
|
|
22
|
-
// IL7 — every failure path emits ctx.ui.notify and returns; no silent
|
|
23
|
-
// continuation.
|
|
24
|
-
import * as fs from "node:fs";
|
|
25
|
-
import * as path from "node:path";
|
|
26
|
-
import { sendKickoff } from "./kickoff.js";
|
|
27
|
-
export function parseQuizAgentArgs(rawArgs, cwd) {
|
|
28
|
-
const trimmed = (rawArgs ?? "").trim();
|
|
29
|
-
if (!trimmed) {
|
|
30
|
-
return { mode: "empty", topicSeed: "", sourceLabel: "(no topic — full KB quiz)" };
|
|
31
|
-
}
|
|
32
|
-
if (trimmed.startsWith("@")) {
|
|
33
|
-
const ref = trimmed.slice(1).trim();
|
|
34
|
-
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
35
|
-
const topicSeed = fs.readFileSync(filePath, "utf8");
|
|
36
|
-
return { mode: "file", topicSeed, sourceLabel: `(topic from file: ${ref})` };
|
|
37
|
-
}
|
|
38
|
-
return { mode: "text", topicSeed: trimmed, sourceLabel: "(topic from inline text)" };
|
|
39
|
-
}
|
|
40
|
-
export function composeQuizAgentKickoff(opts) {
|
|
41
|
-
const { commandMd, parsed } = opts;
|
|
42
|
-
const sections = ["# /forge:check-agent", ""];
|
|
43
|
-
sections.push("## Dispatch", "");
|
|
44
|
-
sections.push("Run the quiz-agent workflow below to verify this agent has read and understood the project knowledge base. " +
|
|
45
|
-
"Ask factual questions about the project's architecture, entity model, and sprint conventions — do not accept vague answers. " +
|
|
46
|
-
"Report pass/fail with specific evidence.");
|
|
47
|
-
sections.push("", "---", "", "## Command", "", commandMd.trim(), "", "---");
|
|
48
|
-
if (parsed.mode === "empty") {
|
|
49
|
-
sections.push("", "## Topic", "", "(no topic specified — quiz the full KB scope)");
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
sections.push("", `## Topic — ${parsed.sourceLabel}`, "", parsed.topicSeed.trim());
|
|
53
|
-
}
|
|
54
|
-
return sections.join("\n");
|
|
55
|
-
}
|
|
56
|
-
// ── Registration ──────────────────────────────────────────────────────────
|
|
57
|
-
const COMMAND_NAME = "quiz-agent";
|
|
58
|
-
export function registerQuizAgent(pi, options) {
|
|
59
|
-
pi.registerCommand("forge:check-agent", {
|
|
60
|
-
description: "Verify an agent has loaded and understood the project knowledge base — run a short factual quiz. " +
|
|
61
|
-
"Usage: /forge:check-agent [@<file> | <topic>]. Empty args run a full KB quiz.",
|
|
62
|
-
async handler(args, ctx) {
|
|
63
|
-
const { forgeRoot } = options;
|
|
64
|
-
const cwd = options.cwd ?? process.cwd();
|
|
65
|
-
if (!forgeRoot) {
|
|
66
|
-
ctx.ui.notify("× forge:check-agent — no Forge project at cwd; run /forge:init to bootstrap", "warning");
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
const commandPath = path.join(forgeRoot, "commands", `${COMMAND_NAME}.md`);
|
|
70
|
-
let commandMd;
|
|
71
|
-
try {
|
|
72
|
-
commandMd = fs.readFileSync(commandPath, "utf8");
|
|
73
|
-
}
|
|
74
|
-
catch (err) {
|
|
75
|
-
const e = err;
|
|
76
|
-
if (e.code === "ENOENT") {
|
|
77
|
-
ctx.ui.notify(`× forge:check-agent — command file not found at commands/${COMMAND_NAME}.md; run /forge:init or /forge:rebuild first.`, "error");
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
ctx.ui.notify(`× forge:check-agent — failed to read command file: ${e.message ?? "unknown error"}`, "error");
|
|
81
|
-
}
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
let parsed;
|
|
85
|
-
try {
|
|
86
|
-
parsed = parseQuizAgentArgs(args, cwd);
|
|
87
|
-
}
|
|
88
|
-
catch (err) {
|
|
89
|
-
const e = err;
|
|
90
|
-
ctx.ui.notify(`× forge:check-agent — failed to parse args: ${e.message ?? "unknown"}`, "error");
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const kickoff = composeQuizAgentKickoff({ commandMd, parsed });
|
|
94
|
-
sendKickoff(pi, kickoff);
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=quiz-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quiz-agent.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/quiz-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs/promises";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { startReviewServer } from "./review-server.js";
|
|
4
|
-
import { resolveEntityRef, resolveToolDir } from "./store-resolver.js";
|
|
5
|
-
function isNonInteractive() {
|
|
6
|
-
return process.env.FORGE_YES === "1" || process.env.FORGE_NON_INTERACTIVE === "1";
|
|
7
|
-
}
|
|
8
|
-
export function registerReadCommand(pi, forgeRoot) {
|
|
9
|
-
pi.registerCommand("forge:read", {
|
|
10
|
-
description: "Review a Forge artifact in the browser and provide inline feedback",
|
|
11
|
-
async handler(args, ctx) {
|
|
12
|
-
if (!forgeRoot) {
|
|
13
|
-
ctx.ui.notify("forge:read — no Forge project at cwd; run /forge:init to bootstrap", "warning");
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
if (isNonInteractive()) {
|
|
17
|
-
ctx.ui.notify("forge:read requires interactive mode (browser review). Unset FORGE_YES/FORGE_NON_INTERACTIVE.", "error");
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const arg = args.trim();
|
|
21
|
-
if (!arg) {
|
|
22
|
-
ctx.ui.notify("Usage: /forge:read <task-id|sprint-id|@path|natural language>\n" +
|
|
23
|
-
"Examples: /forge:read S01-T01 | /forge:read S01 | " +
|
|
24
|
-
"/forge:read @engineering/sprints/HELLO-S01/HELLO-S01-T01 | " +
|
|
25
|
-
"/forge:read the i18n task", "error");
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const toolDir = resolveToolDir(forgeRoot);
|
|
29
|
-
const resolved = await resolveEntityRef(arg, toolDir, ctx.cwd, {
|
|
30
|
-
ctx,
|
|
31
|
-
statusLabel: "forge:read",
|
|
32
|
-
}).catch((err) => {
|
|
33
|
-
ctx.ui.setStatus("forge:read", undefined);
|
|
34
|
-
ctx.ui.notify(`Store query failed: ${err.message}`, "error");
|
|
35
|
-
return null;
|
|
36
|
-
});
|
|
37
|
-
if (!resolved)
|
|
38
|
-
return;
|
|
39
|
-
let taskDir;
|
|
40
|
-
let label;
|
|
41
|
-
if ("dir" in resolved) {
|
|
42
|
-
taskDir = resolved.dir;
|
|
43
|
-
label = path.basename(taskDir);
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
const item = resolved.item;
|
|
47
|
-
if (!item.fileRefs?.md) {
|
|
48
|
-
ctx.ui.notify(`No markdown index found for ${item.id}`, "error");
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
taskDir = path.dirname(path.join(ctx.cwd, item.fileRefs.md));
|
|
52
|
-
label = `${item.id} — ${item.title}`;
|
|
53
|
-
ctx.ui.notify(`Resolved to ${item.type}: ${item.id} (${item.title})`, "info");
|
|
54
|
-
}
|
|
55
|
-
let files;
|
|
56
|
-
try {
|
|
57
|
-
files = await fs.readdir(taskDir);
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
ctx.ui.notify(`No artifacts found at ${taskDir}`, "warning");
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const mdFiles = files.filter((f) => f.endsWith(".md"));
|
|
64
|
-
if (mdFiles.length === 0) {
|
|
65
|
-
ctx.ui.notify(`No markdown artifacts found at ${taskDir}`, "info");
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const selectedFile = await ctx.ui.select(`Select artifact to review for ${label}:`, mdFiles);
|
|
69
|
-
if (!selectedFile)
|
|
70
|
-
return;
|
|
71
|
-
const artifactPath = path.join(taskDir, selectedFile);
|
|
72
|
-
ctx.ui.notify(`Starting local review server for ${selectedFile}…`, "info");
|
|
73
|
-
ctx.ui.setStatus("forge:read", "Waiting for browser review…");
|
|
74
|
-
try {
|
|
75
|
-
const feedback = await startReviewServer(artifactPath, `${label} — ${selectedFile}`);
|
|
76
|
-
ctx.ui.setStatus("forge:read", undefined);
|
|
77
|
-
if (feedback && feedback.length > 0) {
|
|
78
|
-
ctx.ui.notify(`Received ${feedback.length} feedback item(s). Sending to Forge…`, "info");
|
|
79
|
-
const itemType = "item" in resolved ? resolved.item.type : "artifact";
|
|
80
|
-
const itemId = "item" in resolved ? resolved.item.id : label;
|
|
81
|
-
let promptText = `I have reviewed the artifact \`${selectedFile}\` for ${itemType} ${itemId}. Here is my inline feedback:\n\n`;
|
|
82
|
-
for (const fb of feedback) {
|
|
83
|
-
promptText += `> **Text:** "${fb.selectedText}"\n`;
|
|
84
|
-
promptText += `> **Feedback:** ${fb.comment}\n\n`;
|
|
85
|
-
}
|
|
86
|
-
promptText += `Please process this feedback and update the artifact accordingly.`;
|
|
87
|
-
pi.sendUserMessage(promptText, { deliverAs: "steer" });
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
ctx.ui.notify("Review completed with no feedback submitted.", "info");
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
ctx.ui.setStatus("forge:read", undefined);
|
|
95
|
-
ctx.ui.notify(`forge:read error: ${err.message}`, "error");
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=read-command.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read-command.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/read-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
export interface ModifiedFile {
|
|
3
|
-
category: string;
|
|
4
|
-
relativePath: string;
|
|
5
|
-
/** "modified" = manifest hash mismatch; "untracked" = no manifest entry (file exists but never recorded). */
|
|
6
|
-
state: "modified" | "untracked";
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Enumerate files in .forge/{personas,skills,workflows,templates}/ and return
|
|
10
|
-
* those whose state diverges from the manifest baseline. Two divergence states
|
|
11
|
-
* are surfaced (both warrant a prompt before overwrite):
|
|
12
|
-
*
|
|
13
|
-
* - "modified": file content differs from the recorded manifest hash. Typically
|
|
14
|
-
* caused by /forge:enhance Phase 2 applying edits in-place.
|
|
15
|
-
* - "untracked": file exists on disk but has NO manifest entry. Caused by a
|
|
16
|
-
* prior regenerate that ran `clear-namespace` without re-recording. A fresh
|
|
17
|
-
* /forge:init records hashes for every generated file, so "untracked" should
|
|
18
|
-
* never appear in a clean install — its presence signals user content that's
|
|
19
|
-
* been disconnected from the tracking system. See forge-cli#30.
|
|
20
|
-
*
|
|
21
|
-
* Pure function (no I/O beyond fs reads + manifest tool spawns).
|
|
22
|
-
*/
|
|
23
|
-
export declare function findModifiedStructuralFiles(cwd: string, toolsRoot: string): ModifiedFile[];
|
|
24
|
-
/**
|
|
25
|
-
* Copy bundled tools (*.cjs, *.js, lib/) from bundleToolsRoot into cwd/.forge/tools/.
|
|
26
|
-
*
|
|
27
|
-
* Atomic handler pattern: no LLM in the loop, errors surfaced via returned messages[],
|
|
28
|
-
* not throw. Accepts _testBundleToolsRoot for test isolation (defaults to getBundledToolsRoot()).
|
|
29
|
-
*
|
|
30
|
-
* When singleTool is provided (e.g. "store-cli"), only that file is copied (both .cjs
|
|
31
|
-
* variant checked first). Used by the `forge:rebuild tools <name>` sub-target.
|
|
32
|
-
*
|
|
33
|
-
* @param cwd Project root directory (must contain .forge/)
|
|
34
|
-
* @param _testBundleToolsRoot Override bundle tools root for tests; omit to use getBundledToolsRoot()
|
|
35
|
-
* @param singleTool Optional: copy only this one tool by stem name (without extension)
|
|
36
|
-
*/
|
|
37
|
-
export declare function runRebuildTools(cwd: string, _testBundleToolsRoot?: string, singleTool?: string): {
|
|
38
|
-
messages: string[];
|
|
39
|
-
};
|
|
40
|
-
export declare function registerRegenerate(pi: ExtensionAPI): void;
|