@dzhechkov/harness-core 0.3.110 → 0.3.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/architecture.d.ts +135 -0
- package/dist/architecture.d.ts.map +1 -0
- package/dist/architecture.js +0 -0
- package/dist/architecture.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/project-skills.d.ts +111 -0
- package/dist/project-skills.d.ts.map +1 -0
- package/dist/project-skills.js +259 -0
- package/dist/project-skills.js.map +1 -0
- package/package.json +5 -5
- package/src/architecture.ts +0 -0
- package/src/index.ts +2 -0
- package/src/project-skills.ts +281 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Product architecture lens (feature product-architecture-lens, ADR-001).
|
|
3
|
+
*
|
|
4
|
+
* A deterministic, LLM-free extractor that renders the product as its INTENT layer — the curated
|
|
5
|
+
* subsystems from `architecture/subsystems.manifest.json` (grounded in the harness-cli README's 5 jobs) —
|
|
6
|
+
* merged with the code-derived workspace graph. It is pure (no I/O, no clock, no randomness) so the same
|
|
7
|
+
* tree always yields byte-identical output (ADR-001 Decision 1) and it is cheap enough to rebuild at the
|
|
8
|
+
* end of every feature-adr run (FR-3). The map/render/drift functions are pure; the load and scan
|
|
9
|
+
* helpers at the bottom do the disk I/O for the CLI and the feature-adr end-of-run auto-update.
|
|
10
|
+
*/
|
|
11
|
+
/** One curated subsystem — the top-layer intent node. */
|
|
12
|
+
export interface Subsystem {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly label: string;
|
|
15
|
+
/** The README "job" number (1–5), or null for foundation/arsenal/ops. */
|
|
16
|
+
readonly job: number | null;
|
|
17
|
+
readonly desc: string;
|
|
18
|
+
/** Exact package names (without the `@dzhechkov/` scope) that belong here. */
|
|
19
|
+
readonly packages: readonly string[];
|
|
20
|
+
/** Prefix globs like `adapter-*`, `skills-*`. */
|
|
21
|
+
readonly packagePatterns: readonly string[];
|
|
22
|
+
/** dz command names that belong to this subsystem. */
|
|
23
|
+
readonly commands: readonly string[];
|
|
24
|
+
}
|
|
25
|
+
export interface SubsystemManifest {
|
|
26
|
+
readonly version: number;
|
|
27
|
+
readonly subsystems: readonly Subsystem[];
|
|
28
|
+
}
|
|
29
|
+
/** A workspace package as scanned from disk (name minus scope + its internal `@dzhechkov/*` deps, unscoped). */
|
|
30
|
+
export interface ScannedPackage {
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly internalDeps: readonly string[];
|
|
33
|
+
}
|
|
34
|
+
/** A subsystem populated with the packages/commands assigned to it. */
|
|
35
|
+
export interface MapSubsystem {
|
|
36
|
+
readonly id: string;
|
|
37
|
+
readonly label: string;
|
|
38
|
+
readonly job: number | null;
|
|
39
|
+
readonly desc: string;
|
|
40
|
+
readonly packages: readonly string[];
|
|
41
|
+
readonly commands: readonly string[];
|
|
42
|
+
}
|
|
43
|
+
/** A directed edge between two subsystems (aggregated from package-level deps; self-edges dropped). */
|
|
44
|
+
export interface SubsystemEdge {
|
|
45
|
+
readonly from: string;
|
|
46
|
+
readonly to: string;
|
|
47
|
+
}
|
|
48
|
+
export interface ArchitectureMap {
|
|
49
|
+
readonly subsystems: readonly MapSubsystem[];
|
|
50
|
+
readonly edges: readonly SubsystemEdge[];
|
|
51
|
+
/** Packages present on disk that matched NO subsystem — the "product grew, map doesn't know it" signal. */
|
|
52
|
+
readonly unassigned: readonly string[];
|
|
53
|
+
}
|
|
54
|
+
/** Which subsystem owns a package? First match in manifest order wins (deterministic). null ⇒ unassigned. */
|
|
55
|
+
export declare function subsystemOf(manifest: SubsystemManifest, pkg: string): string | null;
|
|
56
|
+
/**
|
|
57
|
+
* Build the product map from the curated manifest + the scanned workspace. PURE + deterministic:
|
|
58
|
+
* every list is sorted, no clock/random, so two runs on the same inputs are byte-identical (ADR-001 §1).
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildArchitectureMap(manifest: SubsystemManifest, packages: readonly ScannedPackage[]): ArchitectureMap;
|
|
61
|
+
/** A drift finding: the product on disk diverged from the curated map (FR-1/FR-6). */
|
|
62
|
+
export interface DriftReport {
|
|
63
|
+
/** Git-tracked packages present on disk that matched NO subsystem (the "product grew" signal). */
|
|
64
|
+
readonly unassigned: readonly string[];
|
|
65
|
+
/** A dz command claimed by more than one subsystem in the manifest (an intent contradiction). */
|
|
66
|
+
readonly duplicateCommands: readonly {
|
|
67
|
+
readonly command: string;
|
|
68
|
+
readonly subsystems: readonly string[];
|
|
69
|
+
}[];
|
|
70
|
+
/** True ⇔ no drift of either kind. */
|
|
71
|
+
readonly clean: boolean;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Compare a built map against reality and report drift. PURE (ADR-001 §1). Two signals:
|
|
75
|
+
* 1. Unassigned packages — but ONLY those that are git-TRACKED (`trackedPackages`), so a scratch or
|
|
76
|
+
* gitignored package dir never manufactures false drift (FR-6, the git-aware requirement).
|
|
77
|
+
* 2. A command owned by ≥2 subsystems — a manifest contradiction (one command can't be two jobs).
|
|
78
|
+
* Everything is sorted, so the report is deterministic.
|
|
79
|
+
*/
|
|
80
|
+
export declare function findArchitectureDrift(map: ArchitectureMap, trackedPackages: ReadonlySet<string>): DriftReport;
|
|
81
|
+
/** Human render of a DriftReport for `dz architecture --revise`. Deterministic. */
|
|
82
|
+
export declare function renderDriftReport(report: DriftReport): string;
|
|
83
|
+
/**
|
|
84
|
+
* Scan `packages/@dzhechkov/*` into `ScannedPackage[]` (unscoped name + unscoped internal deps). Impure
|
|
85
|
+
* I/O helper (lazy `require`, never throws) shared by the CLI and the feature-adr end-of-run auto-update
|
|
86
|
+
* (FR-3), so both build the map from the identical scan. Deterministic: output is sorted.
|
|
87
|
+
*/
|
|
88
|
+
export declare function scanWorkspacePackages(repoRoot: string): ScannedPackage[];
|
|
89
|
+
/** A proposed feature, as known at feature-adr Step 0 (before it exists). */
|
|
90
|
+
export interface FeatureDescriptor {
|
|
91
|
+
readonly slug: string;
|
|
92
|
+
readonly description: string;
|
|
93
|
+
/** Command names this feature proposes to ADD (the strong drift signal is an exact collision). */
|
|
94
|
+
readonly proposedCommands?: readonly string[];
|
|
95
|
+
/** The subsystem this feature targets, if the router knows it (sharpens the duplicate check). */
|
|
96
|
+
readonly targetSubsystem?: string;
|
|
97
|
+
}
|
|
98
|
+
export type ArchSignal = 'ok' | 'soft-warn' | 'block';
|
|
99
|
+
export interface ArchCheckResult {
|
|
100
|
+
readonly signal: ArchSignal;
|
|
101
|
+
/** 0..1 — the strongest single tension found. */
|
|
102
|
+
readonly confidence: number;
|
|
103
|
+
readonly reason: string;
|
|
104
|
+
/** Every tension line, for the panel. */
|
|
105
|
+
readonly details: readonly string[];
|
|
106
|
+
}
|
|
107
|
+
/** Confidence knobs. Exposed so the mutation test can lower the bar and prove false-positives appear (FR-8). */
|
|
108
|
+
export interface ArchCheckThresholds {
|
|
109
|
+
/** ≥ this ⇒ `block` (hard-stop). Default 0.85 — only exact command duplication clears it. */
|
|
110
|
+
readonly hardStop: number;
|
|
111
|
+
/** ≥ this (and < hardStop) ⇒ `soft-warn`. Default 0.5. */
|
|
112
|
+
readonly softWarn: number;
|
|
113
|
+
}
|
|
114
|
+
export declare const DEFAULT_ARCH_THRESHOLDS: ArchCheckThresholds;
|
|
115
|
+
/**
|
|
116
|
+
* Сверка: compare a proposed feature against the product map + vision. PURE + deterministic. Returns
|
|
117
|
+
* `{signal, confidence, reason, details}`. CATEGORY-gated (Decision 3, hardened after cross-model QE):
|
|
118
|
+
* a `block` fires ONLY from a block-eligible signal — an EXACT command duplication — whose confidence
|
|
119
|
+
* clears `hardStop`. Boundary tension and stem overlap are structurally advisory: they can never block
|
|
120
|
+
* at ANY threshold (confidence alone is not policy-safe — a low custom `hardStop` must not promote soft
|
|
121
|
+
* evidence to a hard-stop). FR-8: on the current product's real features this yields ZERO blocks.
|
|
122
|
+
*/
|
|
123
|
+
export declare function checkFeatureAgainstArchitecture(feature: FeatureDescriptor, map: ArchitectureMap, vision: string | null, thresholds?: ArchCheckThresholds): ArchCheckResult;
|
|
124
|
+
/** Human render of a сверка result for the feature-adr Step-0 panel. Deterministic. */
|
|
125
|
+
export declare function renderArchCheck(result: ArchCheckResult): string;
|
|
126
|
+
/** Load the curated subsystem manifest (`architecture/subsystems.manifest.json`). Impure; null when absent/invalid. */
|
|
127
|
+
export declare function loadSubsystemManifest(repoRoot: string): SubsystemManifest | null;
|
|
128
|
+
/**
|
|
129
|
+
* Load the curated product vision (`architecture/vision.md`) — the human-readable compass feature-adr
|
|
130
|
+
* folds into Step 0 (FR-4/FR-5). Thin I/O helper: never throws; returns the text, or null when absent.
|
|
131
|
+
*/
|
|
132
|
+
export declare function loadProductVision(repoRoot: string): string | null;
|
|
133
|
+
/** Compact human view — the "picture back in your head in 30 seconds" render (FR-2). Deterministic. */
|
|
134
|
+
export declare function renderMapHuman(map: ArchitectureMap): string;
|
|
135
|
+
//# sourceMappingURL=architecture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../src/architecture.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architecture.js","sourceRoot":"","sources":["../src/architecture.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -82,4 +82,6 @@ export type { StageOpts, RoutingEnv, UsageSignal, UsageAction } from './feature-
|
|
|
82
82
|
export { CLAUDE_USAGE_MODELS, computeUsage, deriveUsageCalibration, fixedBlockWindowFor, normalizeClaudeUsageModel, normalizeClaudeUsageModelKey, parseWeeklyResetAnchor, readUsageLimits, weeklyWindowFor, } from './usage.js';
|
|
83
83
|
export type { ClaudeUsageModel, UsageCalibrationChange, UsageCalibrationInput, UsageCalibrationPlan, UsageEstimate, UsageLimits, UsageModelEstimate, UsageWindow, WeeklyResetAnchor, } from './usage.js';
|
|
84
84
|
export * from './safla-delta.js';
|
|
85
|
+
export * from './architecture.js';
|
|
86
|
+
export * from './project-skills.js';
|
|
85
87
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,EAAE,MACiD,CAAC;AAErF,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7E,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAClH,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACvE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC1H,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,aAAa,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACthB,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,oBAAoB,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAClW,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACtK,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC9K,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC3H,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACjH,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChO,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvN,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/E,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACxG,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAClG,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,yBAAyB,EACzB,gCAAgC,EAChC,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrG,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,iCAAiC,EACjC,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACxN,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,UAAU,EACV,cAAc,EACd,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACzH,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACzE,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,YAAY,EACZ,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,UAAU,EACV,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,kCAAkC,GACnC,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -48,4 +48,6 @@ export { reconcileCapabilities, RECONCILE_BANNER } from './reconcile.js';
|
|
|
48
48
|
export { specToOpts, resolveStageModel, resolveCoderSpec, coderIsCodex, resolveQeSpec, routingRequested, mergeOpts, DEFAULT_MODELS, KNOWN_CODEX, CLAUDE_NAMES, VALID_REASONING, topCodexId, decideUsageAction, OVERRIDE_REASONING, needsLandedBarrier, codexEffortHint, modelLabel, stageLabel, needsCodeLandedBarrier, codeLandedBarrierPlan, codeLandedBarrierHasLanded, CODE_LANDED_BARRIER_SLEEPS_SECONDS, } from './feature-adr-routing.js';
|
|
49
49
|
export { CLAUDE_USAGE_MODELS, computeUsage, deriveUsageCalibration, fixedBlockWindowFor, normalizeClaudeUsageModel, normalizeClaudeUsageModelKey, parseWeeklyResetAnchor, readUsageLimits, weeklyWindowFor, } from './usage.js';
|
|
50
50
|
export * from './safla-delta.js';
|
|
51
|
+
export * from './architecture.js';
|
|
52
|
+
export * from './project-skills.js';
|
|
51
53
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polymorphic feature-adr (feature polymorphic-feature-adr, ADR-001).
|
|
3
|
+
*
|
|
4
|
+
* A COMMITTED per-project manifest (`architecture/project-skills.json`) declares the project-specific
|
|
5
|
+
* skills feature-adr should fold into its pipeline — so a generic pipeline becomes project-aware WITHOUT
|
|
6
|
+
* editing pipeline code (the Copilot `Orchestrates:` anti-pattern) and WITHOUT the skill self-declaring
|
|
7
|
+
* where it attaches (orchestration is the parent's job). Hybrid model: a CLOSED core-role enum with a
|
|
8
|
+
* fixed role→stage map, plus an open `extra` list. Guidance injection only in this release; `extra-phase`
|
|
9
|
+
* is accepted but skipped (fail-open, forward-compatible).
|
|
10
|
+
*
|
|
11
|
+
* The build/plan/render functions are PURE + deterministic (sorted, no clock/random) so the same manifest
|
|
12
|
+
* yields byte-identical plans; the load/resolve helpers do the disk I/O with TOP-LEVEL node:fs imports
|
|
13
|
+
* (harness-core is ESM — a lazy require() is undefined at runtime; the R1 footgun).
|
|
14
|
+
*
|
|
15
|
+
* SAFETY PROPERTY (ADR-001 Decision 3, load-bearing): with NO manifest the plan is empty and
|
|
16
|
+
* `guidanceForStage` returns '' — so `prompt + guidanceForStage(...)` is byte-identical to today. Every
|
|
17
|
+
* injection that DOES happen is named in the report (no silent injection).
|
|
18
|
+
*/
|
|
19
|
+
/** The injectable pipeline stages a project skill can target. */
|
|
20
|
+
export type Stage = 'design' | 'code' | 'qe';
|
|
21
|
+
/** The CLOSED core-role enum (each has a fixed stage mapping). */
|
|
22
|
+
export type CoreRole = 'product-vision' | 'critic' | 'brand' | 'impl-bar';
|
|
23
|
+
export declare const CORE_ROLES: readonly CoreRole[];
|
|
24
|
+
/** Fixed role→stage map (FR-3). product-vision informs design + QE; impl-bar the code; critic the QE; brand the code. */
|
|
25
|
+
export declare const ROLE_STAGES: Readonly<Record<CoreRole, readonly Stage[]>>;
|
|
26
|
+
/** Default doc for the product-vision role when the manifest omits it (the R1 seam). */
|
|
27
|
+
export declare const PRODUCT_VISION_DEFAULT = "architecture/vision.md";
|
|
28
|
+
export interface ExtraSkill {
|
|
29
|
+
readonly skill: string;
|
|
30
|
+
readonly phase: Stage;
|
|
31
|
+
readonly as: 'guidance' | 'extra-phase';
|
|
32
|
+
readonly position?: 'before' | 'after';
|
|
33
|
+
}
|
|
34
|
+
export interface ProjectSkillManifest {
|
|
35
|
+
readonly version: number;
|
|
36
|
+
readonly roles?: Partial<Record<CoreRole, string>>;
|
|
37
|
+
readonly extra?: readonly ExtraSkill[];
|
|
38
|
+
}
|
|
39
|
+
/** A validated manifest + the entries that were dropped (fail-open, NFR-2). */
|
|
40
|
+
export interface ValidatedManifest {
|
|
41
|
+
readonly manifest: ProjectSkillManifest | null;
|
|
42
|
+
readonly errors: readonly string[];
|
|
43
|
+
}
|
|
44
|
+
/** A source path resolved to its on-disk content, tagged with what it fills. */
|
|
45
|
+
export interface ResolvedItem {
|
|
46
|
+
readonly source: string;
|
|
47
|
+
readonly role: CoreRole | 'extra';
|
|
48
|
+
readonly stages: readonly Stage[];
|
|
49
|
+
readonly content: string;
|
|
50
|
+
}
|
|
51
|
+
/** One concrete guidance injection for one stage. */
|
|
52
|
+
export interface Injection {
|
|
53
|
+
readonly stage: Stage;
|
|
54
|
+
readonly source: string;
|
|
55
|
+
readonly role: CoreRole | 'extra';
|
|
56
|
+
readonly content: string;
|
|
57
|
+
}
|
|
58
|
+
export interface InjectionPlan {
|
|
59
|
+
readonly injections: readonly Injection[];
|
|
60
|
+
readonly skipped: readonly {
|
|
61
|
+
readonly entry: string;
|
|
62
|
+
readonly reason: string;
|
|
63
|
+
}[];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate a parsed manifest object. FAIL-OPEN (NFR-2): a bad top-level shape → null + errors; a bad
|
|
67
|
+
* entry (unknown role key, missing fields, bad stage) is DROPPED with a reason, the rest survive. A
|
|
68
|
+
* config typo must never brick a run.
|
|
69
|
+
*/
|
|
70
|
+
export declare function validateManifest(raw: unknown): ValidatedManifest;
|
|
71
|
+
/**
|
|
72
|
+
* Resolve each manifest entry to its on-disk content. Impure I/O (top-level fs; never throws). A missing
|
|
73
|
+
* file is DROPPED with a reason (fail-open). product-vision defaults to `architecture/vision.md` (FR-4)
|
|
74
|
+
* when the role is unset and the default exists.
|
|
75
|
+
*/
|
|
76
|
+
export declare function resolveInjections(repoRoot: string, manifest: ProjectSkillManifest): {
|
|
77
|
+
resolved: ResolvedItem[];
|
|
78
|
+
skipped: {
|
|
79
|
+
entry: string;
|
|
80
|
+
reason: string;
|
|
81
|
+
}[];
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Build the injection plan. PURE + deterministic: one Injection per (item, stage), sorted by
|
|
85
|
+
* (stage, source). The same resolved set always yields a byte-identical plan (ADR-001 §1).
|
|
86
|
+
*/
|
|
87
|
+
export declare function buildInjectionPlan(resolved: readonly ResolvedItem[], skipped?: readonly {
|
|
88
|
+
entry: string;
|
|
89
|
+
reason: string;
|
|
90
|
+
}[]): InjectionPlan;
|
|
91
|
+
/**
|
|
92
|
+
* The guidance suffix for one stage — a concat of every injection targeting it, each with a provenance
|
|
93
|
+
* header. Returns '' when nothing targets the stage, so `prompt + guidanceForStage(...)` is byte-identical
|
|
94
|
+
* to the bare prompt on a no-manifest run (FR-7, load-bearing).
|
|
95
|
+
*/
|
|
96
|
+
export declare function guidanceForStage(plan: InjectionPlan, stage: Stage): string;
|
|
97
|
+
/** Human "who injected what" report (FR-6 — no silent injection). Deterministic. */
|
|
98
|
+
export declare function renderInjectionReport(plan: InjectionPlan): string;
|
|
99
|
+
/**
|
|
100
|
+
* Load + validate the project manifest (`architecture/project-skills.json`). Impure; returns null when
|
|
101
|
+
* absent OR unparseable OR top-level-invalid (fail-open) — a null means "generic run" (FR-7). Entry-level
|
|
102
|
+
* problems are kept on the returned manifest's implicit skip path (via validateManifest at resolve time).
|
|
103
|
+
*/
|
|
104
|
+
export declare function loadProjectSkills(repoRoot: string): ProjectSkillManifest | null;
|
|
105
|
+
/**
|
|
106
|
+
* One-shot convenience for the pipeline: load → validate → resolve → plan. Returns an EMPTY plan when
|
|
107
|
+
* there is no manifest file (FR-7 byte-identical). Validation problems (unknown role / bad entry) AND
|
|
108
|
+
* missing-file skips both surface in `plan.skipped` so the report hides nothing (FR-6). Impure.
|
|
109
|
+
*/
|
|
110
|
+
export declare function planProjectSkills(repoRoot: string): InjectionPlan;
|
|
111
|
+
//# sourceMappingURL=project-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-skills.d.ts","sourceRoot":"","sources":["../src/project-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polymorphic feature-adr (feature polymorphic-feature-adr, ADR-001).
|
|
3
|
+
*
|
|
4
|
+
* A COMMITTED per-project manifest (`architecture/project-skills.json`) declares the project-specific
|
|
5
|
+
* skills feature-adr should fold into its pipeline — so a generic pipeline becomes project-aware WITHOUT
|
|
6
|
+
* editing pipeline code (the Copilot `Orchestrates:` anti-pattern) and WITHOUT the skill self-declaring
|
|
7
|
+
* where it attaches (orchestration is the parent's job). Hybrid model: a CLOSED core-role enum with a
|
|
8
|
+
* fixed role→stage map, plus an open `extra` list. Guidance injection only in this release; `extra-phase`
|
|
9
|
+
* is accepted but skipped (fail-open, forward-compatible).
|
|
10
|
+
*
|
|
11
|
+
* The build/plan/render functions are PURE + deterministic (sorted, no clock/random) so the same manifest
|
|
12
|
+
* yields byte-identical plans; the load/resolve helpers do the disk I/O with TOP-LEVEL node:fs imports
|
|
13
|
+
* (harness-core is ESM — a lazy require() is undefined at runtime; the R1 footgun).
|
|
14
|
+
*
|
|
15
|
+
* SAFETY PROPERTY (ADR-001 Decision 3, load-bearing): with NO manifest the plan is empty and
|
|
16
|
+
* `guidanceForStage` returns '' — so `prompt + guidanceForStage(...)` is byte-identical to today. Every
|
|
17
|
+
* injection that DOES happen is named in the report (no silent injection).
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
20
|
+
import { join, resolve, isAbsolute, sep } from 'node:path';
|
|
21
|
+
export const CORE_ROLES = ['product-vision', 'critic', 'brand', 'impl-bar'];
|
|
22
|
+
/** Fixed role→stage map (FR-3). product-vision informs design + QE; impl-bar the code; critic the QE; brand the code. */
|
|
23
|
+
export const ROLE_STAGES = {
|
|
24
|
+
'product-vision': ['design', 'qe'],
|
|
25
|
+
'impl-bar': ['code'],
|
|
26
|
+
'critic': ['qe'],
|
|
27
|
+
'brand': ['code'],
|
|
28
|
+
};
|
|
29
|
+
/** Default doc for the product-vision role when the manifest omits it (the R1 seam). */
|
|
30
|
+
export const PRODUCT_VISION_DEFAULT = 'architecture/vision.md';
|
|
31
|
+
const byStr = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
32
|
+
const isStage = (s) => s === 'design' || s === 'code' || s === 'qe';
|
|
33
|
+
const realOrNull = (p) => { try {
|
|
34
|
+
return realpathSync(p);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
} };
|
|
39
|
+
const isContained = (root, abs) => abs === root || abs.startsWith(root + sep);
|
|
40
|
+
/**
|
|
41
|
+
* Resolve a manifest-declared path to a SAFE absolute path inside repoRoot, or null if it escapes
|
|
42
|
+
* (absolute path, `../` traversal, or a symlink pointing outside). The manifest is committed, but a
|
|
43
|
+
* hostile/careless entry must never make the pipeline read `/etc/passwd` (cross-model QE High finding).
|
|
44
|
+
*/
|
|
45
|
+
function safeResolve(repoRoot, relPath) {
|
|
46
|
+
if (isAbsolute(relPath))
|
|
47
|
+
return null;
|
|
48
|
+
const abs = resolve(repoRoot, relPath);
|
|
49
|
+
if (!isContained(repoRoot, abs))
|
|
50
|
+
return null; // lexical `../` escape
|
|
51
|
+
if (existsSync(abs)) { // symlink-aware escape (only checkable when it exists)
|
|
52
|
+
const real = realOrNull(abs);
|
|
53
|
+
const rootReal = realOrNull(repoRoot) ?? repoRoot;
|
|
54
|
+
if (real !== null && !isContained(rootReal, real))
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return abs;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Validate a parsed manifest object. FAIL-OPEN (NFR-2): a bad top-level shape → null + errors; a bad
|
|
61
|
+
* entry (unknown role key, missing fields, bad stage) is DROPPED with a reason, the rest survive. A
|
|
62
|
+
* config typo must never brick a run.
|
|
63
|
+
*/
|
|
64
|
+
export function validateManifest(raw) {
|
|
65
|
+
const errors = [];
|
|
66
|
+
// An ARRAY is `typeof 'object'` but is NOT a valid manifest — reject it, else `[]` would sanitize to an
|
|
67
|
+
// empty manifest and silently activate the product-vision default (cross-model QE High finding).
|
|
68
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
69
|
+
return { manifest: null, errors: ['manifest must be a JSON object'] };
|
|
70
|
+
}
|
|
71
|
+
const obj = raw;
|
|
72
|
+
const roles = {};
|
|
73
|
+
if (obj.roles !== undefined) {
|
|
74
|
+
if (obj.roles === null || typeof obj.roles !== 'object') {
|
|
75
|
+
errors.push('roles: not an object — ignored');
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
for (const [key, val] of Object.entries(obj.roles)) {
|
|
79
|
+
if (!CORE_ROLES.includes(key)) {
|
|
80
|
+
errors.push(`roles.${key}: unknown role — skipped`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (typeof val !== 'string' || val.trim() === '') {
|
|
84
|
+
errors.push(`roles.${key}: path must be a non-empty string — skipped`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
roles[key] = val;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const extra = [];
|
|
92
|
+
if (obj.extra !== undefined) {
|
|
93
|
+
if (!Array.isArray(obj.extra)) {
|
|
94
|
+
errors.push('extra: not an array — ignored');
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
obj.extra.forEach((e, i) => {
|
|
98
|
+
if (e === null || typeof e !== 'object') {
|
|
99
|
+
errors.push(`extra[${i}]: not an object — skipped`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const ent = e;
|
|
103
|
+
if (typeof ent.skill !== 'string' || ent.skill.trim() === '') {
|
|
104
|
+
errors.push(`extra[${i}].skill: missing path — skipped`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (!isStage(ent.phase)) {
|
|
108
|
+
errors.push(`extra[${i}].phase: must be design|code|qe — skipped`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (ent.as !== 'guidance' && ent.as !== 'extra-phase') {
|
|
112
|
+
errors.push(`extra[${i}].as: must be guidance|extra-phase — skipped`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (ent.as === 'extra-phase') {
|
|
116
|
+
errors.push(`extra[${i}] (${String(ent.skill)}): extra-phase is not supported yet (guidance-only release) — skipped`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const item = { skill: ent.skill, phase: ent.phase, as: 'guidance' };
|
|
120
|
+
extra.push(item);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return { manifest: { version: typeof obj.version === 'number' ? obj.version : 1, roles, extra }, errors };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Resolve each manifest entry to its on-disk content. Impure I/O (top-level fs; never throws). A missing
|
|
128
|
+
* file is DROPPED with a reason (fail-open). product-vision defaults to `architecture/vision.md` (FR-4)
|
|
129
|
+
* when the role is unset and the default exists.
|
|
130
|
+
*/
|
|
131
|
+
export function resolveInjections(repoRoot, manifest) {
|
|
132
|
+
const resolved = [];
|
|
133
|
+
const skipped = [];
|
|
134
|
+
// Read a manifest path SAFELY (contained in repoRoot). Returns {content} or a skip reason.
|
|
135
|
+
const read = (relPath) => {
|
|
136
|
+
const abs = safeResolve(repoRoot, relPath);
|
|
137
|
+
if (abs === null)
|
|
138
|
+
return { reason: 'path escapes the repo — rejected' };
|
|
139
|
+
try {
|
|
140
|
+
return existsSync(abs) ? { content: readFileSync(abs, 'utf8') } : { reason: 'file not found' };
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return { reason: 'unreadable' };
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
// Core roles (incl. the product-vision default).
|
|
147
|
+
for (const role of CORE_ROLES) {
|
|
148
|
+
const explicit = manifest.roles?.[role];
|
|
149
|
+
const path = explicit ?? (role === 'product-vision' ? PRODUCT_VISION_DEFAULT : undefined);
|
|
150
|
+
if (path === undefined)
|
|
151
|
+
continue; // role not configured, no default
|
|
152
|
+
const r = read(path);
|
|
153
|
+
if (!('content' in r)) {
|
|
154
|
+
skipped.push({ entry: `${role} → ${path}`, reason: r.reason });
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
resolved.push({ source: path, role, stages: ROLE_STAGES[role], content: r.content });
|
|
158
|
+
}
|
|
159
|
+
// Extra guidance entries.
|
|
160
|
+
for (const e of manifest.extra ?? []) {
|
|
161
|
+
const r = read(e.skill);
|
|
162
|
+
if (!('content' in r)) {
|
|
163
|
+
skipped.push({ entry: `extra → ${e.skill}`, reason: r.reason });
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
resolved.push({ source: e.skill, role: 'extra', stages: [e.phase], content: r.content });
|
|
167
|
+
}
|
|
168
|
+
return { resolved, skipped };
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Build the injection plan. PURE + deterministic: one Injection per (item, stage), sorted by
|
|
172
|
+
* (stage, source). The same resolved set always yields a byte-identical plan (ADR-001 §1).
|
|
173
|
+
*/
|
|
174
|
+
export function buildInjectionPlan(resolved, skipped = []) {
|
|
175
|
+
const injections = [];
|
|
176
|
+
for (const item of resolved) {
|
|
177
|
+
for (const stage of item.stages) {
|
|
178
|
+
injections.push({ stage, source: item.source, role: item.role, content: item.content });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
injections.sort((a, b) => byStr(a.stage, b.stage) || byStr(a.source, b.source) || byStr(String(a.role), String(b.role)));
|
|
182
|
+
const skippedSorted = [...skipped].sort((a, b) => byStr(a.entry, b.entry));
|
|
183
|
+
return { injections, skipped: skippedSorted };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* The guidance suffix for one stage — a concat of every injection targeting it, each with a provenance
|
|
187
|
+
* header. Returns '' when nothing targets the stage, so `prompt + guidanceForStage(...)` is byte-identical
|
|
188
|
+
* to the bare prompt on a no-manifest run (FR-7, load-bearing).
|
|
189
|
+
*/
|
|
190
|
+
export function guidanceForStage(plan, stage) {
|
|
191
|
+
const items = plan.injections.filter((i) => i.stage === stage);
|
|
192
|
+
if (items.length === 0)
|
|
193
|
+
return '';
|
|
194
|
+
const blocks = items.map((i) => {
|
|
195
|
+
const tag = i.role === 'extra' ? `project skill ${i.source}` : `project ${i.role} (${i.source})`;
|
|
196
|
+
return `\n\n### Project-specific guidance — ${tag} (apply to this ${stage} step; injected via architecture/project-skills.json):\n${i.content.trim()}`;
|
|
197
|
+
});
|
|
198
|
+
return blocks.join('');
|
|
199
|
+
}
|
|
200
|
+
/** Human "who injected what" report (FR-6 — no silent injection). Deterministic. */
|
|
201
|
+
export function renderInjectionReport(plan) {
|
|
202
|
+
if (plan.injections.length === 0 && plan.skipped.length === 0) {
|
|
203
|
+
return 'project-skills: no manifest / nothing injected (generic run).';
|
|
204
|
+
}
|
|
205
|
+
const lines = ['project-skills injections:'];
|
|
206
|
+
if (plan.injections.length === 0)
|
|
207
|
+
lines.push(' (none applied)');
|
|
208
|
+
for (const i of plan.injections) {
|
|
209
|
+
const who = i.role === 'extra' ? `extra ${i.source}` : `${i.role} (${i.source})`;
|
|
210
|
+
lines.push(` • ${i.stage} ← ${who}`);
|
|
211
|
+
}
|
|
212
|
+
if (plan.skipped.length > 0) {
|
|
213
|
+
lines.push(' skipped:');
|
|
214
|
+
for (const s of plan.skipped)
|
|
215
|
+
lines.push(` ⚠ ${s.entry} — ${s.reason}`);
|
|
216
|
+
}
|
|
217
|
+
return lines.join('\n');
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Load + validate the project manifest (`architecture/project-skills.json`). Impure; returns null when
|
|
221
|
+
* absent OR unparseable OR top-level-invalid (fail-open) — a null means "generic run" (FR-7). Entry-level
|
|
222
|
+
* problems are kept on the returned manifest's implicit skip path (via validateManifest at resolve time).
|
|
223
|
+
*/
|
|
224
|
+
export function loadProjectSkills(repoRoot) {
|
|
225
|
+
try {
|
|
226
|
+
const p = join(repoRoot, 'architecture', 'project-skills.json');
|
|
227
|
+
if (!existsSync(p))
|
|
228
|
+
return null;
|
|
229
|
+
const parsed = JSON.parse(readFileSync(p, 'utf8'));
|
|
230
|
+
return validateManifest(parsed).manifest;
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* One-shot convenience for the pipeline: load → validate → resolve → plan. Returns an EMPTY plan when
|
|
238
|
+
* there is no manifest file (FR-7 byte-identical). Validation problems (unknown role / bad entry) AND
|
|
239
|
+
* missing-file skips both surface in `plan.skipped` so the report hides nothing (FR-6). Impure.
|
|
240
|
+
*/
|
|
241
|
+
export function planProjectSkills(repoRoot) {
|
|
242
|
+
let parsed;
|
|
243
|
+
try {
|
|
244
|
+
const p = join(repoRoot, 'architecture', 'project-skills.json');
|
|
245
|
+
if (!existsSync(p))
|
|
246
|
+
return { injections: [], skipped: [] }; // no manifest file → generic run
|
|
247
|
+
parsed = JSON.parse(readFileSync(p, 'utf8'));
|
|
248
|
+
}
|
|
249
|
+
catch (e) {
|
|
250
|
+
return { injections: [], skipped: [{ entry: 'architecture/project-skills.json', reason: 'unreadable/invalid JSON' }] };
|
|
251
|
+
}
|
|
252
|
+
const { manifest, errors } = validateManifest(parsed);
|
|
253
|
+
const validationSkips = errors.map((reason) => ({ entry: 'manifest', reason }));
|
|
254
|
+
if (manifest === null)
|
|
255
|
+
return { injections: [], skipped: validationSkips };
|
|
256
|
+
const { resolved, skipped } = resolveInjections(repoRoot, manifest);
|
|
257
|
+
return buildInjectionPlan(resolved, [...skipped, ...validationSkips]);
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=project-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-skills.js","sourceRoot":"","sources":["../src/project-skills.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/harness-core",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.112",
|
|
4
4
|
"description": "Shared harness logic - skill loading, additive apply, and the init/sync/verify/doctor operations.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
"@dzhechkov/adapter-openclaude": "^0.1.0",
|
|
31
31
|
"@dzhechkov/adapter-opencode": "^0.2.0",
|
|
32
32
|
"yaml": "^2.0.0",
|
|
33
|
+
"@dzhechkov/adapter-gemini": "0.1.1",
|
|
34
|
+
"@dzhechkov/adapter-cursor": "0.1.1",
|
|
33
35
|
"@dzhechkov/adapter-agents-md": "0.1.1",
|
|
34
36
|
"@dzhechkov/adapter-copilot": "0.1.1",
|
|
35
37
|
"@dzhechkov/core": "0.2.14",
|
|
36
|
-
"@dzhechkov/
|
|
37
|
-
"@dzhechkov/adapter-windsurf": "0.1.1"
|
|
38
|
-
"@dzhechkov/adapter-cursor": "0.1.1",
|
|
39
|
-
"@dzhechkov/memory": "0.2.9"
|
|
38
|
+
"@dzhechkov/memory": "0.2.9",
|
|
39
|
+
"@dzhechkov/adapter-windsurf": "0.1.1"
|
|
40
40
|
},
|
|
41
41
|
"peerDependenciesMeta": {
|
|
42
42
|
"@ruvector/rvf": {
|
|
Binary file
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polymorphic feature-adr (feature polymorphic-feature-adr, ADR-001).
|
|
3
|
+
*
|
|
4
|
+
* A COMMITTED per-project manifest (`architecture/project-skills.json`) declares the project-specific
|
|
5
|
+
* skills feature-adr should fold into its pipeline — so a generic pipeline becomes project-aware WITHOUT
|
|
6
|
+
* editing pipeline code (the Copilot `Orchestrates:` anti-pattern) and WITHOUT the skill self-declaring
|
|
7
|
+
* where it attaches (orchestration is the parent's job). Hybrid model: a CLOSED core-role enum with a
|
|
8
|
+
* fixed role→stage map, plus an open `extra` list. Guidance injection only in this release; `extra-phase`
|
|
9
|
+
* is accepted but skipped (fail-open, forward-compatible).
|
|
10
|
+
*
|
|
11
|
+
* The build/plan/render functions are PURE + deterministic (sorted, no clock/random) so the same manifest
|
|
12
|
+
* yields byte-identical plans; the load/resolve helpers do the disk I/O with TOP-LEVEL node:fs imports
|
|
13
|
+
* (harness-core is ESM — a lazy require() is undefined at runtime; the R1 footgun).
|
|
14
|
+
*
|
|
15
|
+
* SAFETY PROPERTY (ADR-001 Decision 3, load-bearing): with NO manifest the plan is empty and
|
|
16
|
+
* `guidanceForStage` returns '' — so `prompt + guidanceForStage(...)` is byte-identical to today. Every
|
|
17
|
+
* injection that DOES happen is named in the report (no silent injection).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
21
|
+
import { join, resolve, isAbsolute, sep } from 'node:path';
|
|
22
|
+
|
|
23
|
+
/** The injectable pipeline stages a project skill can target. */
|
|
24
|
+
export type Stage = 'design' | 'code' | 'qe';
|
|
25
|
+
|
|
26
|
+
/** The CLOSED core-role enum (each has a fixed stage mapping). */
|
|
27
|
+
export type CoreRole = 'product-vision' | 'critic' | 'brand' | 'impl-bar';
|
|
28
|
+
|
|
29
|
+
export const CORE_ROLES: readonly CoreRole[] = ['product-vision', 'critic', 'brand', 'impl-bar'];
|
|
30
|
+
|
|
31
|
+
/** Fixed role→stage map (FR-3). product-vision informs design + QE; impl-bar the code; critic the QE; brand the code. */
|
|
32
|
+
export const ROLE_STAGES: Readonly<Record<CoreRole, readonly Stage[]>> = {
|
|
33
|
+
'product-vision': ['design', 'qe'],
|
|
34
|
+
'impl-bar': ['code'],
|
|
35
|
+
'critic': ['qe'],
|
|
36
|
+
'brand': ['code'],
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Default doc for the product-vision role when the manifest omits it (the R1 seam). */
|
|
40
|
+
export const PRODUCT_VISION_DEFAULT = 'architecture/vision.md';
|
|
41
|
+
|
|
42
|
+
export interface ExtraSkill {
|
|
43
|
+
readonly skill: string; // repo-relative path to a doc / SKILL.md
|
|
44
|
+
readonly phase: Stage;
|
|
45
|
+
readonly as: 'guidance' | 'extra-phase';
|
|
46
|
+
readonly position?: 'before' | 'after'; // extra-phase only (deferred)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface ProjectSkillManifest {
|
|
50
|
+
readonly version: number;
|
|
51
|
+
readonly roles?: Partial<Record<CoreRole, string>>;
|
|
52
|
+
readonly extra?: readonly ExtraSkill[];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** A validated manifest + the entries that were dropped (fail-open, NFR-2). */
|
|
56
|
+
export interface ValidatedManifest {
|
|
57
|
+
readonly manifest: ProjectSkillManifest | null;
|
|
58
|
+
readonly errors: readonly string[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** A source path resolved to its on-disk content, tagged with what it fills. */
|
|
62
|
+
export interface ResolvedItem {
|
|
63
|
+
readonly source: string; // repo-relative path
|
|
64
|
+
readonly role: CoreRole | 'extra';
|
|
65
|
+
readonly stages: readonly Stage[]; // stages this item feeds
|
|
66
|
+
readonly content: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** One concrete guidance injection for one stage. */
|
|
70
|
+
export interface Injection {
|
|
71
|
+
readonly stage: Stage;
|
|
72
|
+
readonly source: string;
|
|
73
|
+
readonly role: CoreRole | 'extra';
|
|
74
|
+
readonly content: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface InjectionPlan {
|
|
78
|
+
readonly injections: readonly Injection[];
|
|
79
|
+
readonly skipped: readonly { readonly entry: string; readonly reason: string }[];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const byStr = (a: string, b: string): number => (a < b ? -1 : a > b ? 1 : 0);
|
|
83
|
+
const isStage = (s: unknown): s is Stage => s === 'design' || s === 'code' || s === 'qe';
|
|
84
|
+
|
|
85
|
+
const realOrNull = (p: string): string | null => { try { return realpathSync(p); } catch { return null; } };
|
|
86
|
+
const isContained = (root: string, abs: string): boolean => abs === root || abs.startsWith(root + sep);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Resolve a manifest-declared path to a SAFE absolute path inside repoRoot, or null if it escapes
|
|
90
|
+
* (absolute path, `../` traversal, or a symlink pointing outside). The manifest is committed, but a
|
|
91
|
+
* hostile/careless entry must never make the pipeline read `/etc/passwd` (cross-model QE High finding).
|
|
92
|
+
*/
|
|
93
|
+
function safeResolve(repoRoot: string, relPath: string): string | null {
|
|
94
|
+
if (isAbsolute(relPath)) return null;
|
|
95
|
+
const abs = resolve(repoRoot, relPath);
|
|
96
|
+
if (!isContained(repoRoot, abs)) return null; // lexical `../` escape
|
|
97
|
+
if (existsSync(abs)) { // symlink-aware escape (only checkable when it exists)
|
|
98
|
+
const real = realOrNull(abs);
|
|
99
|
+
const rootReal = realOrNull(repoRoot) ?? repoRoot;
|
|
100
|
+
if (real !== null && !isContained(rootReal, real)) return null;
|
|
101
|
+
}
|
|
102
|
+
return abs;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Validate a parsed manifest object. FAIL-OPEN (NFR-2): a bad top-level shape → null + errors; a bad
|
|
107
|
+
* entry (unknown role key, missing fields, bad stage) is DROPPED with a reason, the rest survive. A
|
|
108
|
+
* config typo must never brick a run.
|
|
109
|
+
*/
|
|
110
|
+
export function validateManifest(raw: unknown): ValidatedManifest {
|
|
111
|
+
const errors: string[] = [];
|
|
112
|
+
// An ARRAY is `typeof 'object'` but is NOT a valid manifest — reject it, else `[]` would sanitize to an
|
|
113
|
+
// empty manifest and silently activate the product-vision default (cross-model QE High finding).
|
|
114
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
115
|
+
return { manifest: null, errors: ['manifest must be a JSON object'] };
|
|
116
|
+
}
|
|
117
|
+
const obj = raw as Record<string, unknown>;
|
|
118
|
+
|
|
119
|
+
const roles: Partial<Record<CoreRole, string>> = {};
|
|
120
|
+
if (obj.roles !== undefined) {
|
|
121
|
+
if (obj.roles === null || typeof obj.roles !== 'object') {
|
|
122
|
+
errors.push('roles: not an object — ignored');
|
|
123
|
+
} else {
|
|
124
|
+
for (const [key, val] of Object.entries(obj.roles as Record<string, unknown>)) {
|
|
125
|
+
if (!CORE_ROLES.includes(key as CoreRole)) { errors.push(`roles.${key}: unknown role — skipped`); continue; }
|
|
126
|
+
if (typeof val !== 'string' || val.trim() === '') { errors.push(`roles.${key}: path must be a non-empty string — skipped`); continue; }
|
|
127
|
+
roles[key as CoreRole] = val;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const extra: ExtraSkill[] = [];
|
|
133
|
+
if (obj.extra !== undefined) {
|
|
134
|
+
if (!Array.isArray(obj.extra)) {
|
|
135
|
+
errors.push('extra: not an array — ignored');
|
|
136
|
+
} else {
|
|
137
|
+
obj.extra.forEach((e, i) => {
|
|
138
|
+
if (e === null || typeof e !== 'object') { errors.push(`extra[${i}]: not an object — skipped`); return; }
|
|
139
|
+
const ent = e as Record<string, unknown>;
|
|
140
|
+
if (typeof ent.skill !== 'string' || ent.skill.trim() === '') { errors.push(`extra[${i}].skill: missing path — skipped`); return; }
|
|
141
|
+
if (!isStage(ent.phase)) { errors.push(`extra[${i}].phase: must be design|code|qe — skipped`); return; }
|
|
142
|
+
if (ent.as !== 'guidance' && ent.as !== 'extra-phase') { errors.push(`extra[${i}].as: must be guidance|extra-phase — skipped`); return; }
|
|
143
|
+
if (ent.as === 'extra-phase') { errors.push(`extra[${i}] (${String(ent.skill)}): extra-phase is not supported yet (guidance-only release) — skipped`); return; }
|
|
144
|
+
const item: ExtraSkill = { skill: ent.skill, phase: ent.phase, as: 'guidance' };
|
|
145
|
+
extra.push(item);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return { manifest: { version: typeof obj.version === 'number' ? obj.version : 1, roles, extra }, errors };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Resolve each manifest entry to its on-disk content. Impure I/O (top-level fs; never throws). A missing
|
|
155
|
+
* file is DROPPED with a reason (fail-open). product-vision defaults to `architecture/vision.md` (FR-4)
|
|
156
|
+
* when the role is unset and the default exists.
|
|
157
|
+
*/
|
|
158
|
+
export function resolveInjections(
|
|
159
|
+
repoRoot: string,
|
|
160
|
+
manifest: ProjectSkillManifest,
|
|
161
|
+
): { resolved: ResolvedItem[]; skipped: { entry: string; reason: string }[] } {
|
|
162
|
+
const resolved: ResolvedItem[] = [];
|
|
163
|
+
const skipped: { entry: string; reason: string }[] = [];
|
|
164
|
+
|
|
165
|
+
// Read a manifest path SAFELY (contained in repoRoot). Returns {content} or a skip reason.
|
|
166
|
+
const read = (relPath: string): { content: string } | { reason: string } => {
|
|
167
|
+
const abs = safeResolve(repoRoot, relPath);
|
|
168
|
+
if (abs === null) return { reason: 'path escapes the repo — rejected' };
|
|
169
|
+
try {
|
|
170
|
+
return existsSync(abs) ? { content: readFileSync(abs, 'utf8') } : { reason: 'file not found' };
|
|
171
|
+
} catch { return { reason: 'unreadable' }; }
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// Core roles (incl. the product-vision default).
|
|
175
|
+
for (const role of CORE_ROLES) {
|
|
176
|
+
const explicit = manifest.roles?.[role];
|
|
177
|
+
const path = explicit ?? (role === 'product-vision' ? PRODUCT_VISION_DEFAULT : undefined);
|
|
178
|
+
if (path === undefined) continue; // role not configured, no default
|
|
179
|
+
const r = read(path);
|
|
180
|
+
if (!('content' in r)) { skipped.push({ entry: `${role} → ${path}`, reason: r.reason }); continue; }
|
|
181
|
+
resolved.push({ source: path, role, stages: ROLE_STAGES[role], content: r.content });
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Extra guidance entries.
|
|
185
|
+
for (const e of manifest.extra ?? []) {
|
|
186
|
+
const r = read(e.skill);
|
|
187
|
+
if (!('content' in r)) { skipped.push({ entry: `extra → ${e.skill}`, reason: r.reason }); continue; }
|
|
188
|
+
resolved.push({ source: e.skill, role: 'extra', stages: [e.phase], content: r.content });
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return { resolved, skipped };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Build the injection plan. PURE + deterministic: one Injection per (item, stage), sorted by
|
|
196
|
+
* (stage, source). The same resolved set always yields a byte-identical plan (ADR-001 §1).
|
|
197
|
+
*/
|
|
198
|
+
export function buildInjectionPlan(
|
|
199
|
+
resolved: readonly ResolvedItem[],
|
|
200
|
+
skipped: readonly { entry: string; reason: string }[] = [],
|
|
201
|
+
): InjectionPlan {
|
|
202
|
+
const injections: Injection[] = [];
|
|
203
|
+
for (const item of resolved) {
|
|
204
|
+
for (const stage of item.stages) {
|
|
205
|
+
injections.push({ stage, source: item.source, role: item.role, content: item.content });
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
injections.sort((a, b) => byStr(a.stage, b.stage) || byStr(a.source, b.source) || byStr(String(a.role), String(b.role)));
|
|
209
|
+
const skippedSorted = [...skipped].sort((a, b) => byStr(a.entry, b.entry));
|
|
210
|
+
return { injections, skipped: skippedSorted };
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* The guidance suffix for one stage — a concat of every injection targeting it, each with a provenance
|
|
215
|
+
* header. Returns '' when nothing targets the stage, so `prompt + guidanceForStage(...)` is byte-identical
|
|
216
|
+
* to the bare prompt on a no-manifest run (FR-7, load-bearing).
|
|
217
|
+
*/
|
|
218
|
+
export function guidanceForStage(plan: InjectionPlan, stage: Stage): string {
|
|
219
|
+
const items = plan.injections.filter((i) => i.stage === stage);
|
|
220
|
+
if (items.length === 0) return '';
|
|
221
|
+
const blocks = items.map((i) => {
|
|
222
|
+
const tag = i.role === 'extra' ? `project skill ${i.source}` : `project ${i.role} (${i.source})`;
|
|
223
|
+
return `\n\n### Project-specific guidance — ${tag} (apply to this ${stage} step; injected via architecture/project-skills.json):\n${i.content.trim()}`;
|
|
224
|
+
});
|
|
225
|
+
return blocks.join('');
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/** Human "who injected what" report (FR-6 — no silent injection). Deterministic. */
|
|
229
|
+
export function renderInjectionReport(plan: InjectionPlan): string {
|
|
230
|
+
if (plan.injections.length === 0 && plan.skipped.length === 0) {
|
|
231
|
+
return 'project-skills: no manifest / nothing injected (generic run).';
|
|
232
|
+
}
|
|
233
|
+
const lines: string[] = ['project-skills injections:'];
|
|
234
|
+
if (plan.injections.length === 0) lines.push(' (none applied)');
|
|
235
|
+
for (const i of plan.injections) {
|
|
236
|
+
const who = i.role === 'extra' ? `extra ${i.source}` : `${i.role} (${i.source})`;
|
|
237
|
+
lines.push(` • ${i.stage} ← ${who}`);
|
|
238
|
+
}
|
|
239
|
+
if (plan.skipped.length > 0) {
|
|
240
|
+
lines.push(' skipped:');
|
|
241
|
+
for (const s of plan.skipped) lines.push(` ⚠ ${s.entry} — ${s.reason}`);
|
|
242
|
+
}
|
|
243
|
+
return lines.join('\n');
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Load + validate the project manifest (`architecture/project-skills.json`). Impure; returns null when
|
|
248
|
+
* absent OR unparseable OR top-level-invalid (fail-open) — a null means "generic run" (FR-7). Entry-level
|
|
249
|
+
* problems are kept on the returned manifest's implicit skip path (via validateManifest at resolve time).
|
|
250
|
+
*/
|
|
251
|
+
export function loadProjectSkills(repoRoot: string): ProjectSkillManifest | null {
|
|
252
|
+
try {
|
|
253
|
+
const p = join(repoRoot, 'architecture', 'project-skills.json');
|
|
254
|
+
if (!existsSync(p)) return null;
|
|
255
|
+
const parsed = JSON.parse(readFileSync(p, 'utf8')) as unknown;
|
|
256
|
+
return validateManifest(parsed).manifest;
|
|
257
|
+
} catch {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* One-shot convenience for the pipeline: load → validate → resolve → plan. Returns an EMPTY plan when
|
|
264
|
+
* there is no manifest file (FR-7 byte-identical). Validation problems (unknown role / bad entry) AND
|
|
265
|
+
* missing-file skips both surface in `plan.skipped` so the report hides nothing (FR-6). Impure.
|
|
266
|
+
*/
|
|
267
|
+
export function planProjectSkills(repoRoot: string): InjectionPlan {
|
|
268
|
+
let parsed: unknown;
|
|
269
|
+
try {
|
|
270
|
+
const p = join(repoRoot, 'architecture', 'project-skills.json');
|
|
271
|
+
if (!existsSync(p)) return { injections: [], skipped: [] }; // no manifest file → generic run
|
|
272
|
+
parsed = JSON.parse(readFileSync(p, 'utf8'));
|
|
273
|
+
} catch (e) {
|
|
274
|
+
return { injections: [], skipped: [{ entry: 'architecture/project-skills.json', reason: 'unreadable/invalid JSON' }] };
|
|
275
|
+
}
|
|
276
|
+
const { manifest, errors } = validateManifest(parsed);
|
|
277
|
+
const validationSkips = errors.map((reason) => ({ entry: 'manifest', reason }));
|
|
278
|
+
if (manifest === null) return { injections: [], skipped: validationSkips };
|
|
279
|
+
const { resolved, skipped } = resolveInjections(repoRoot, manifest);
|
|
280
|
+
return buildInjectionPlan(resolved, [...skipped, ...validationSkips]);
|
|
281
|
+
}
|