@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,245 +0,0 @@
|
|
|
1
|
-
// Auto-emit friction events with 5 skill subkinds — FORGE-S24-T11.
|
|
2
|
-
//
|
|
3
|
-
// At task close, the orchestrator hands a snapshot of {retrieved skills,
|
|
4
|
-
// usage verdicts (T09), task outcome, observed tool errors, per-skill
|
|
5
|
-
// historical "unused" counts, pairwise retrieval overlaps} to this module.
|
|
6
|
-
// `computeFrictionSignals` is a pure classifier; `emitFrictionEvents` writes
|
|
7
|
-
// one `friction` event per signal via `node <storeCli> emit <sprintId> …`.
|
|
8
|
-
//
|
|
9
|
-
// Gating logic (acceptance criteria FORGE-S24-T11):
|
|
10
|
-
// - skill_unused : retrieved && !used && task.success
|
|
11
|
-
// - skill_failed : retrieved && used && !task.success
|
|
12
|
-
// - skill_missing : !retrieved && task.success && tool_errors ≥ 2
|
|
13
|
-
// - skill_stale : retrieved && !used across 3 consecutive sprints
|
|
14
|
-
// - skill_redundant : two skills' retrieval overlap > 0.8 in this task
|
|
15
|
-
//
|
|
16
|
-
// Each event carries `{type: "friction", workflow, persona, issue, subkind,
|
|
17
|
-
// skillId, evidence, …runtime attribution}`. The required-trio
|
|
18
|
-
// `{workflow, persona, issue}` is what the event schema (plugin v0.45.x)
|
|
19
|
-
// enforces for `type === "friction"`.
|
|
20
|
-
//
|
|
21
|
-
// Telemetry-actor split (IL10):
|
|
22
|
-
// - Orchestrator owns emission. Subagents never call this module directly.
|
|
23
|
-
// - Runtime attribution (model/provider/timestamps/durationMinutes) is
|
|
24
|
-
// SUPPLIED by the orchestrator — never fabricated here.
|
|
25
|
-
//
|
|
26
|
-
// Iron Laws (forge-cli-engineer):
|
|
27
|
-
// IL1 — code only under forge-cli/src/extensions/forgecli/
|
|
28
|
-
// IL2 — TypeScript + TypeBox. Runtime inputs validated via Value.Parse.
|
|
29
|
-
// IL6 — argv-array spawn. No shell-string interpolation.
|
|
30
|
-
// IL7 — failures surface in the returned counter and stderrs[]; nothing
|
|
31
|
-
// is silently swallowed.
|
|
32
|
-
// IL10 — orchestrator-side emission only; subagent never invokes.
|
|
33
|
-
//
|
|
34
|
-
// Scope boundary: this module classifies and emits. It does NOT crawl
|
|
35
|
-
// the trajectory, decide what counts as a "tool error", or compute
|
|
36
|
-
// retrieval overlaps. The caller (orchestrator handler in run-task.ts /
|
|
37
|
-
// fix-bug.ts, gated by FORGE-S24-T12 flag) does that and passes the
|
|
38
|
-
// shaped inputs in.
|
|
39
|
-
import { Type } from "typebox";
|
|
40
|
-
import { Value } from "typebox/value";
|
|
41
|
-
import { spawnStoreCliEmit } from "./lib/spawn-store-cli.js";
|
|
42
|
-
import { isSkillCurationEnabled } from "./skill-curation-flag.js";
|
|
43
|
-
// ── Public schemas ──────────────────────────────────────────────────────────
|
|
44
|
-
/**
|
|
45
|
-
* One retrieved-and-classified skill for the closed task. `retrieved`
|
|
46
|
-
* comes from T08 (skill-retriever); `used` from T09 (skill-usage-tracker).
|
|
47
|
-
* `retrievalScore` is the T08 score (informational — surfaces in evidence).
|
|
48
|
-
*/
|
|
49
|
-
export const RetrievedSkillSignalSchema = Type.Object({
|
|
50
|
-
skillId: Type.String({ minLength: 1 }),
|
|
51
|
-
retrieved: Type.Boolean(),
|
|
52
|
-
used: Type.Boolean(),
|
|
53
|
-
retrievalScore: Type.Number({ minimum: 0, maximum: 1 }),
|
|
54
|
-
});
|
|
55
|
-
/** Per-skill historical signal — supplied by caller from sprint history. */
|
|
56
|
-
export const SkillHistorySchema = Type.Object({
|
|
57
|
-
consecutiveUnusedSprints: Type.Integer({ minimum: 0 }),
|
|
58
|
-
});
|
|
59
|
-
/** One pairwise retrieval-overlap measurement for the closed task. */
|
|
60
|
-
export const PairwiseOverlapSchema = Type.Object({
|
|
61
|
-
skillA: Type.String({ minLength: 1 }),
|
|
62
|
-
skillB: Type.String({ minLength: 1 }),
|
|
63
|
-
overlap: Type.Number({ minimum: 0, maximum: 1 }),
|
|
64
|
-
});
|
|
65
|
-
export const FrictionInputsSchema = Type.Object({
|
|
66
|
-
retrievedSkills: Type.Array(RetrievedSkillSignalSchema),
|
|
67
|
-
taskSuccess: Type.Boolean(),
|
|
68
|
-
toolErrorCount: Type.Integer({ minimum: 0 }),
|
|
69
|
-
history: Type.Record(Type.String(), SkillHistorySchema),
|
|
70
|
-
pairwiseRetrievalOverlap: Type.Optional(Type.Array(PairwiseOverlapSchema)),
|
|
71
|
-
});
|
|
72
|
-
// FORGE-S25-T27: FRICTION_SUBKINDS and FrictionSubkind are now canonical in
|
|
73
|
-
// lib/catalog-types.ts (single source of truth). Re-exported here for backward
|
|
74
|
-
// compatibility — all existing imports of FRICTION_SUBKINDS from this module continue to work.
|
|
75
|
-
// Source of truth: event.schema.json subkind pattern (skill_unused|skill_failed|…).
|
|
76
|
-
import { FRICTION_SUBKINDS } from "./lib/catalog-types.js";
|
|
77
|
-
export { FRICTION_SUBKINDS };
|
|
78
|
-
/** Runtime attribution supplied by the orchestrator (IL10). */
|
|
79
|
-
export const FrictionEmitRuntimeSchema = Type.Object({
|
|
80
|
-
storeCli: Type.String({ minLength: 1 }),
|
|
81
|
-
cwd: Type.String({ minLength: 1 }),
|
|
82
|
-
sprintId: Type.String({ minLength: 1 }),
|
|
83
|
-
taskId: Type.String({ minLength: 1 }),
|
|
84
|
-
/** Orchestrator phase role. @see RoleKind from lib/catalog-types.ts */
|
|
85
|
-
role: Type.String({ minLength: 1 }),
|
|
86
|
-
/** Orchestrator phase action. @see ActionKind from lib/catalog-types.ts */
|
|
87
|
-
action: Type.String({ minLength: 1 }),
|
|
88
|
-
workflow: Type.String({ minLength: 1 }),
|
|
89
|
-
persona: Type.String({ minLength: 1 }),
|
|
90
|
-
phase: Type.Optional(Type.String()),
|
|
91
|
-
iteration: Type.Optional(Type.Integer({ minimum: 1 })),
|
|
92
|
-
startTimestamp: Type.String({ format: "date-time" }),
|
|
93
|
-
endTimestamp: Type.String({ format: "date-time" }),
|
|
94
|
-
durationMinutes: Type.Number({ minimum: 0 }),
|
|
95
|
-
model: Type.String({ minLength: 1 }),
|
|
96
|
-
provider: Type.String({ minLength: 1 }),
|
|
97
|
-
});
|
|
98
|
-
// ── Classification ──────────────────────────────────────────────────────────
|
|
99
|
-
const STALE_THRESHOLD_SPRINTS = 3;
|
|
100
|
-
const REDUNDANCY_OVERLAP_FLOOR = 0.8;
|
|
101
|
-
const MISSING_TOOL_ERROR_FLOOR = 2;
|
|
102
|
-
/**
|
|
103
|
-
* Apply the five gating rules and return one signal per matching emit.
|
|
104
|
-
* Pure: no IO, no subprocess. Caller decides whether/when to emit.
|
|
105
|
-
*
|
|
106
|
-
* The `skill_unused` and `skill_failed` gates are mutually exclusive by
|
|
107
|
-
* design — on a failed task we emit `skill_failed` (when used) rather
|
|
108
|
-
* than `skill_unused`, so the two signals never double-count the same
|
|
109
|
-
* outcome.
|
|
110
|
-
*/
|
|
111
|
-
export function computeFrictionSignals(inputs) {
|
|
112
|
-
Value.Parse(FrictionInputsSchema, inputs);
|
|
113
|
-
const signals = [];
|
|
114
|
-
for (const s of inputs.retrievedSkills) {
|
|
115
|
-
// skill_unused — retrieved, not used, task succeeded.
|
|
116
|
-
if (s.retrieved && !s.used && inputs.taskSuccess) {
|
|
117
|
-
signals.push({
|
|
118
|
-
subkind: "skill_unused",
|
|
119
|
-
skillId: s.skillId,
|
|
120
|
-
evidence: {
|
|
121
|
-
retrievalScore: s.retrievalScore,
|
|
122
|
-
taskSuccess: true,
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
// skill_failed — retrieved, used, task failed.
|
|
127
|
-
if (s.retrieved && s.used && !inputs.taskSuccess) {
|
|
128
|
-
signals.push({
|
|
129
|
-
subkind: "skill_failed",
|
|
130
|
-
skillId: s.skillId,
|
|
131
|
-
evidence: {
|
|
132
|
-
retrievalScore: s.retrievalScore,
|
|
133
|
-
toolErrorCount: inputs.toolErrorCount,
|
|
134
|
-
},
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
// skill_stale — retrieved, not used, and the same {retrieved && !used}
|
|
138
|
-
// pattern has held across STALE_THRESHOLD_SPRINTS consecutive sprints.
|
|
139
|
-
if (s.retrieved && !s.used) {
|
|
140
|
-
const hist = inputs.history[s.skillId];
|
|
141
|
-
if (hist && hist.consecutiveUnusedSprints >= STALE_THRESHOLD_SPRINTS) {
|
|
142
|
-
signals.push({
|
|
143
|
-
subkind: "skill_stale",
|
|
144
|
-
skillId: s.skillId,
|
|
145
|
-
evidence: {
|
|
146
|
-
consecutiveUnusedSprints: hist.consecutiveUnusedSprints,
|
|
147
|
-
},
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
// skill_missing — no skill retrieved AND task succeeded AND ≥2 tool errors.
|
|
153
|
-
// Emitted once per task (no skillId — there's nothing to attribute).
|
|
154
|
-
if (inputs.retrievedSkills.length === 0 && inputs.taskSuccess && inputs.toolErrorCount >= MISSING_TOOL_ERROR_FLOOR) {
|
|
155
|
-
signals.push({
|
|
156
|
-
subkind: "skill_missing",
|
|
157
|
-
skillId: undefined,
|
|
158
|
-
evidence: {
|
|
159
|
-
toolErrorCount: inputs.toolErrorCount,
|
|
160
|
-
},
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
// skill_redundant — pairwise retrieval overlap strictly > 0.8. Emit one
|
|
164
|
-
// signal per pair, attributed to the FIRST skill in the pair (skillA).
|
|
165
|
-
for (const p of inputs.pairwiseRetrievalOverlap ?? []) {
|
|
166
|
-
if (p.overlap > REDUNDANCY_OVERLAP_FLOOR) {
|
|
167
|
-
signals.push({
|
|
168
|
-
subkind: "skill_redundant",
|
|
169
|
-
skillId: p.skillA,
|
|
170
|
-
evidence: {
|
|
171
|
-
pairedWith: p.skillB,
|
|
172
|
-
overlap: p.overlap,
|
|
173
|
-
},
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return signals;
|
|
178
|
-
}
|
|
179
|
-
// ── Emission ────────────────────────────────────────────────────────────────
|
|
180
|
-
/** ISO-compact timestamp segment for eventId composition. */
|
|
181
|
-
function isoCompact(iso) {
|
|
182
|
-
return iso.replace(/[-:.]/g, "").replace(/Z$/, "Z");
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Emit one `friction` event per signal via
|
|
186
|
-
* `node <storeCli> emit <sprintId> <json>`. Runtime attribution
|
|
187
|
-
* (model/provider/timestamps/eventId) is supplied by the caller — never
|
|
188
|
-
* fabricated. Failures surface in the result counter; nothing is thrown
|
|
189
|
-
* for subprocess failure.
|
|
190
|
-
*/
|
|
191
|
-
export function emitFrictionEvents(signals, runtime) {
|
|
192
|
-
// FORGE-S24-T12 — gated rollout. Default off ⇒ no friction events
|
|
193
|
-
// for the five SKILL-CURATION subkinds (skill_unused, skill_failed,
|
|
194
|
-
// skill_missing, skill_stale, skill_redundant). Note: this gate
|
|
195
|
-
// applies to the auto-emit module landed in FORGE-S24-T11. The
|
|
196
|
-
// existing orchestrator friction channel (non-skill subkinds) goes
|
|
197
|
-
// through `forge/tools/friction-emit.cjs` and is not gated here.
|
|
198
|
-
if (!isSkillCurationEnabled(runtime.cwd)) {
|
|
199
|
-
return { emitted: 0, failed: 0, stderrs: [] };
|
|
200
|
-
}
|
|
201
|
-
Value.Parse(FrictionEmitRuntimeSchema, runtime);
|
|
202
|
-
let emitted = 0;
|
|
203
|
-
let failed = 0;
|
|
204
|
-
const stderrs = [];
|
|
205
|
-
for (let i = 0; i < signals.length; i++) {
|
|
206
|
-
const sig = signals[i];
|
|
207
|
-
const idTail = sig.skillId ?? "none";
|
|
208
|
-
const eventId = `${isoCompact(runtime.startTimestamp)}_${runtime.taskId}_friction_${sig.subkind}_${i}_${idTail}`;
|
|
209
|
-
const event = {
|
|
210
|
-
eventId,
|
|
211
|
-
sprintId: runtime.sprintId,
|
|
212
|
-
taskId: runtime.taskId,
|
|
213
|
-
role: runtime.role,
|
|
214
|
-
action: runtime.action,
|
|
215
|
-
startTimestamp: runtime.startTimestamp,
|
|
216
|
-
endTimestamp: runtime.endTimestamp,
|
|
217
|
-
durationMinutes: runtime.durationMinutes,
|
|
218
|
-
model: runtime.model,
|
|
219
|
-
provider: runtime.provider,
|
|
220
|
-
type: "friction",
|
|
221
|
-
workflow: runtime.workflow,
|
|
222
|
-
persona: runtime.persona,
|
|
223
|
-
issue: sig.subkind,
|
|
224
|
-
subkind: sig.subkind,
|
|
225
|
-
evidence: sig.evidence,
|
|
226
|
-
};
|
|
227
|
-
if (sig.skillId !== undefined)
|
|
228
|
-
event.skillId = sig.skillId;
|
|
229
|
-
if (runtime.phase !== undefined)
|
|
230
|
-
event.phase = runtime.phase;
|
|
231
|
-
if (runtime.iteration !== undefined)
|
|
232
|
-
event.iteration = runtime.iteration;
|
|
233
|
-
// FORGE-S25-T17: adopt spawnStoreCliEmit; adds missing 10 s timeout (N-C-A).
|
|
234
|
-
const emitResult = spawnStoreCliEmit(runtime.storeCli, runtime.sprintId, event, runtime.cwd);
|
|
235
|
-
if (emitResult.ok) {
|
|
236
|
-
emitted++;
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
failed++;
|
|
240
|
-
stderrs.push(emitResult.stderr);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
return { emitted, failed, stderrs };
|
|
244
|
-
}
|
|
245
|
-
//# sourceMappingURL=friction-emit.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"friction-emit.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/friction-emit.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 parseImplementArgs(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 RegisterImplementOptions {
|
|
20
|
-
cwd?: string;
|
|
21
|
-
}
|
|
22
|
-
export declare function registerImplement(pi: ExtensionAPI, options?: RegisterImplementOptions): void;
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
// forge:implement — native kickoff handler (FORGE-S20-T06).
|
|
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 / FORGE-S20-T05 plan, this is a Kickoff Shim
|
|
6
|
-
// (Pack-04 + Pack-06):
|
|
7
|
-
// 1. Reads `.forge/workflows/implement_plan.md` (the materialized workflow).
|
|
8
|
-
// 2. Verifies four Pack-06 materialization markers — refuses to dispatch on
|
|
9
|
-
// regression and emits a per-marker `ctx.ui.notify` so the user sees the
|
|
10
|
-
// cause.
|
|
11
|
-
// 3. Loads the persona declared in the workflow's `deps.personas:`
|
|
12
|
-
// frontmatter via the FORGE-S20-T02 loader (no ad-hoc fs.readFile of
|
|
13
|
-
// `.forge/personas/`).
|
|
14
|
-
// 4. Composes ONE kickoff message: persona identity, dispatch instructions
|
|
15
|
-
// (read approved PLAN.md, follow workflow, write PROGRESS.md /
|
|
16
|
-
// IMPLEMENTATION-SUMMARY.json, forge_store-driven status updates), the
|
|
17
|
-
// workflow body verbatim, and argv as @<path> file ref or free-form text.
|
|
18
|
-
// 5. Hands control to the LLM via `sendKickoff(pi, text)` —
|
|
19
|
-
// `deliverAs: "steer"`. Never raw `pi.sendUserMessage`.
|
|
20
|
-
//
|
|
21
|
-
// Per FORGE-S20 SPRINT_REQUIREMENTS Constraints and T06 AC#4: the
|
|
22
|
-
// prompt-injection fallback is DELETED — no FORGE_LEGACY_KICKOFF flag, no
|
|
23
|
-
// markdown-stub for this command.
|
|
24
|
-
//
|
|
25
|
-
// Per task notes: kept as a deliberate clone of plan.ts. Abstraction across
|
|
26
|
-
// plan/implement is deferred until both ports are committed and a follow-up
|
|
27
|
-
// task evaluates the shared shape.
|
|
28
|
-
//
|
|
29
|
-
// FORGE-S26-T11: pipeline step guard added. Checks task status via store-cli
|
|
30
|
-
// before dispatching. --force flag bypasses the guard.
|
|
31
|
-
//
|
|
32
|
-
// Iron Laws:
|
|
33
|
-
// IL1 — code only under forge-cli/src/extensions/forgecli/.
|
|
34
|
-
// IL4 — no JSON.stringify-into-subagent dispatch.
|
|
35
|
-
// IL6 — no shell-string interpolation; no spawn calls here.
|
|
36
|
-
// IL7 — every failure path emits ctx.ui.notify and returns; no silent
|
|
37
|
-
// continuation.
|
|
38
|
-
import * as fs from "node:fs";
|
|
39
|
-
import * as path from "node:path";
|
|
40
|
-
import { assertAudience } from "./audience-gate.js";
|
|
41
|
-
import { discoverForgeConfig } from "./forge-root.js";
|
|
42
|
-
import { sendKickoff } from "./kickoff.js";
|
|
43
|
-
// FORGE-S25-T16: extracted to lib modules (H-1, H-2). Re-exported here for
|
|
44
|
-
// backward compatibility with existing test and consumer imports.
|
|
45
|
-
import { extractPersonaNames } from "./lib/frontmatter-parser.js";
|
|
46
|
-
import { parseGuardArgs, runPipelineGuard } from "./lib/pipeline-guard.js";
|
|
47
|
-
import { loadPersona, PersonaSkillLoaderError } from "./parsers/persona-skill-loader.js";
|
|
48
|
-
import { loadWorkflow, WorkflowLoaderError } from "./parsers/workflow-loader.js";
|
|
49
|
-
export { extractPersonaNames };
|
|
50
|
-
import { checkMaterialization } from "./lib/manifest-checker.js";
|
|
51
|
-
export { checkMaterialization };
|
|
52
|
-
export function parseImplementArgs(rawArgs, cwd) {
|
|
53
|
-
const trimmed = (rawArgs ?? "").trim();
|
|
54
|
-
if (trimmed === "") {
|
|
55
|
-
return { mode: "empty", taskRef: "", sourceLabel: "(no input — engineer infers task from store/context)" };
|
|
56
|
-
}
|
|
57
|
-
if (trimmed.startsWith("@")) {
|
|
58
|
-
const ref = trimmed.slice(1).trim();
|
|
59
|
-
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
60
|
-
const seed = fs.readFileSync(filePath, "utf8");
|
|
61
|
-
return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
|
|
62
|
-
}
|
|
63
|
-
return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
|
|
64
|
-
}
|
|
65
|
-
export function composeKickoff(opts) {
|
|
66
|
-
const { workflowMd, personaIdentity, parsed } = opts;
|
|
67
|
-
const sections = ["# /forge:implement", ""];
|
|
68
|
-
if (personaIdentity.trim().length > 0) {
|
|
69
|
-
sections.push(personaIdentity.trim(), "");
|
|
70
|
-
}
|
|
71
|
-
sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read the approved plan at `engineering/sprints/<SPRINT_ID>/<TASK_ID>/PLAN.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, execute plan steps incrementally, run syntax/test/build verification, write PROGRESS.md, knowledge writeback, finalize.", "4. Write `PROGRESS.md` and `IMPLEMENTATION-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`.");
|
|
72
|
-
sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
|
|
73
|
-
if (parsed.mode === "empty") {
|
|
74
|
-
sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
|
|
78
|
-
}
|
|
79
|
-
return sections.join("\n");
|
|
80
|
-
}
|
|
81
|
-
// Registration -------------------------------------------------------------
|
|
82
|
-
const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "implement_plan.md");
|
|
83
|
-
export function registerImplement(pi, options = {}) {
|
|
84
|
-
pi.registerCommand("forge:implement", {
|
|
85
|
-
description: "Run the implement-plan workflow for a Forge task. " +
|
|
86
|
-
"Usage: /forge:implement [@<file> | <free-form text>]. " +
|
|
87
|
-
"Empty args → engineer infers the task from sprint/store context.",
|
|
88
|
-
async handler(args, ctx) {
|
|
89
|
-
const cwd = options.cwd ?? process.cwd();
|
|
90
|
-
const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
|
|
91
|
-
// Pipeline step guard (FORGE-S26-T11): check task state before dispatching.
|
|
92
|
-
const guardParsed = parseGuardArgs(args);
|
|
93
|
-
if (!guardParsed.force) {
|
|
94
|
-
const forgeConfig = discoverForgeConfig(cwd);
|
|
95
|
-
if (forgeConfig) {
|
|
96
|
-
const guard = runPipelineGuard("implement", guardParsed.taskIdHint, forgeConfig.forgeRoot, cwd);
|
|
97
|
-
if (guard.blocked) {
|
|
98
|
-
ctx.ui.notify(guard.message, "error");
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
const effectiveArgs = guardParsed.cleanArgs;
|
|
104
|
-
let workflowMd;
|
|
105
|
-
let workflowAudience;
|
|
106
|
-
try {
|
|
107
|
-
const loaded = loadWorkflow(workflowPath);
|
|
108
|
-
workflowMd = loaded.rawMarkdown;
|
|
109
|
-
workflowAudience = loaded.audience;
|
|
110
|
-
}
|
|
111
|
-
catch (err) {
|
|
112
|
-
if (err instanceof WorkflowLoaderError) {
|
|
113
|
-
if (err.code === "missing_file") {
|
|
114
|
-
ctx.ui.notify(`× forge:implement — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
ctx.ui.notify(`× forge:implement — workflow load failed (${err.code}): ${err.message}`, "error");
|
|
118
|
-
}
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
const e = err;
|
|
122
|
-
ctx.ui.notify(`× forge:implement — failed to read workflow: ${e.message ?? "unknown"}`, "error");
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
let parsed;
|
|
126
|
-
try {
|
|
127
|
-
parsed = parseImplementArgs(effectiveArgs, cwd);
|
|
128
|
-
}
|
|
129
|
-
catch (err) {
|
|
130
|
-
const e = err;
|
|
131
|
-
ctx.ui.notify(`× forge:implement — failed to read seed: ${e.message ?? "unknown"}`, "error");
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
const check = checkMaterialization(workflowPath, workflowMd);
|
|
135
|
-
if (!check.ok) {
|
|
136
|
-
for (const marker of check.missing) {
|
|
137
|
-
ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
|
|
138
|
-
}
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
const personas = extractPersonaNames(workflowMd);
|
|
142
|
-
let personaIdentity = "";
|
|
143
|
-
if (personas.length > 0) {
|
|
144
|
-
try {
|
|
145
|
-
const persona = loadPersona(personas[0], { cwd });
|
|
146
|
-
personaIdentity = persona.identity;
|
|
147
|
-
}
|
|
148
|
-
catch (err) {
|
|
149
|
-
if (err instanceof PersonaSkillLoaderError) {
|
|
150
|
-
ctx.ui.notify(`× forge:implement — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
const e = err;
|
|
154
|
-
ctx.ui.notify(`× forge:implement — persona load error: ${e.message ?? "unknown"}`, "error");
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
if (!assertAudience({ workflowName: "implement_plan", audience: workflowAudience }, ctx)) {
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
const kickoff = composeKickoff({
|
|
162
|
-
workflowMd,
|
|
163
|
-
personaIdentity,
|
|
164
|
-
parsed,
|
|
165
|
-
});
|
|
166
|
-
sendKickoff(pi, kickoff);
|
|
167
|
-
},
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
//# sourceMappingURL=implement.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"implement.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/implement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Discover project name from package.json:name, falling back to cwd basename.
|
|
3
|
-
*
|
|
4
|
-
* Tries to read <cwd>/package.json and parse the `name` field. If the file is
|
|
5
|
-
* absent, malformed, or missing the name field, returns `path.basename(cwd)`.
|
|
6
|
-
*/
|
|
7
|
-
export declare function discoverProjectName(cwd: string): string;
|
|
8
|
-
export interface ProjectContextProject {
|
|
9
|
-
name: string;
|
|
10
|
-
prefix: string;
|
|
11
|
-
description?: string;
|
|
12
|
-
stack?: string[];
|
|
13
|
-
commands?: {
|
|
14
|
-
test?: string;
|
|
15
|
-
build?: string;
|
|
16
|
-
deploy?: string;
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
export interface ProjectContextArchitecture {
|
|
20
|
-
frameworks?: {
|
|
21
|
-
backend?: string;
|
|
22
|
-
frontend?: string;
|
|
23
|
-
database?: string;
|
|
24
|
-
};
|
|
25
|
-
dataAccess?: string;
|
|
26
|
-
deployment?: string;
|
|
27
|
-
entrypoints?: string[];
|
|
28
|
-
}
|
|
29
|
-
export interface ProjectContextWorkflow {
|
|
30
|
-
testCommand?: string;
|
|
31
|
-
lintCommand?: string;
|
|
32
|
-
buildCommand?: string;
|
|
33
|
-
}
|
|
34
|
-
export interface ProjectContextKnowledgeBase {
|
|
35
|
-
path?: string;
|
|
36
|
-
indexFile?: string;
|
|
37
|
-
}
|
|
38
|
-
export interface ProjectContext {
|
|
39
|
-
project: ProjectContextProject;
|
|
40
|
-
architecture?: ProjectContextArchitecture;
|
|
41
|
-
workflow?: ProjectContextWorkflow;
|
|
42
|
-
knowledgeBase?: ProjectContextKnowledgeBase;
|
|
43
|
-
}
|
|
44
|
-
/** Minimal discovery results passed from Phase 2 */
|
|
45
|
-
export interface DiscoveryResults {
|
|
46
|
-
projectName?: string;
|
|
47
|
-
prefix?: string;
|
|
48
|
-
description?: string;
|
|
49
|
-
stack?: string[];
|
|
50
|
-
testCommand?: string;
|
|
51
|
-
lintCommand?: string;
|
|
52
|
-
buildCommand?: string;
|
|
53
|
-
backendFramework?: string;
|
|
54
|
-
frontendFramework?: string;
|
|
55
|
-
database?: string;
|
|
56
|
-
deployment?: string;
|
|
57
|
-
dataAccess?: string;
|
|
58
|
-
kbPath?: string;
|
|
59
|
-
}
|
|
60
|
-
export interface ForgeConfig {
|
|
61
|
-
project?: {
|
|
62
|
-
name?: string;
|
|
63
|
-
prefix?: string;
|
|
64
|
-
};
|
|
65
|
-
paths?: {
|
|
66
|
-
engineering?: string;
|
|
67
|
-
forgeRoot?: string;
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Build a ProjectContext from discovery results and forge config.
|
|
72
|
-
*
|
|
73
|
-
* Merges discoveryResults with config data. Config project.name/prefix take
|
|
74
|
-
* precedence over discovery if both are present (config was set interactively).
|
|
75
|
-
*/
|
|
76
|
-
export declare function buildProjectContext(discoveryResults: DiscoveryResults, config: ForgeConfig): ProjectContext;
|
|
77
|
-
/**
|
|
78
|
-
* Validate a ProjectContext object structurally. Throws with a descriptive
|
|
79
|
-
* error if required fields are missing.
|
|
80
|
-
*/
|
|
81
|
-
export declare function validateProjectContext(ctx: unknown): asserts ctx is ProjectContext;
|
|
82
|
-
/**
|
|
83
|
-
* Write project-context.json to <cwd>/.forge/project-context.json
|
|
84
|
-
*/
|
|
85
|
-
export declare function writeProjectContext(cwd: string, ctx: ProjectContext): void;
|
|
86
|
-
export interface CalibrationBaseline {
|
|
87
|
-
lastCalibrated: string;
|
|
88
|
-
version: string;
|
|
89
|
-
masterIndexHash: string | null;
|
|
90
|
-
sprintsCovered: string[];
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Compute a calibration baseline snapshot for /forge:init Phase 2.
|
|
94
|
-
*
|
|
95
|
-
* @param cwd - project working directory
|
|
96
|
-
* @param kbPath - relative path to the knowledge base directory (e.g. "engineering")
|
|
97
|
-
* @param bundledPluginVersion - version string from package.json forge.bundledVersion
|
|
98
|
-
*/
|
|
99
|
-
export declare function computeCalibrationBaseline(cwd: string, kbPath: string, bundledPluginVersion: string): CalibrationBaseline;
|