@codyswann/lisa 2.279.2 → 2.281.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/doctor-readiness-audit-allowlist.d.ts +7 -0
- package/dist/cli/doctor-readiness-audit-allowlist.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-audit-allowlist.js +177 -0
- package/dist/cli/doctor-readiness-audit-allowlist.js.map +1 -0
- package/dist/cli/doctor-readiness-capabilities.d.ts +33 -0
- package/dist/cli/doctor-readiness-capabilities.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-capabilities.js +26 -0
- package/dist/cli/doctor-readiness-capabilities.js.map +1 -0
- package/dist/cli/doctor-readiness-context-claims.d.ts +14 -0
- package/dist/cli/doctor-readiness-context-claims.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-context-claims.js +117 -0
- package/dist/cli/doctor-readiness-context-claims.js.map +1 -0
- package/dist/cli/doctor-readiness-context-mechanisms.d.ts +46 -0
- package/dist/cli/doctor-readiness-context-mechanisms.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-context-mechanisms.js +116 -0
- package/dist/cli/doctor-readiness-context-mechanisms.js.map +1 -0
- package/dist/cli/doctor-readiness-context.d.ts +16 -0
- package/dist/cli/doctor-readiness-context.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-context.js +244 -0
- package/dist/cli/doctor-readiness-context.js.map +1 -0
- package/dist/cli/doctor-readiness-delivery.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-delivery.js +1 -10
- package/dist/cli/doctor-readiness-delivery.js.map +1 -1
- package/dist/cli/doctor-readiness-domain.d.ts +17 -0
- package/dist/cli/doctor-readiness-domain.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-domain.js +197 -0
- package/dist/cli/doctor-readiness-domain.js.map +1 -0
- package/dist/cli/doctor-readiness-guardrails.d.ts +15 -0
- package/dist/cli/doctor-readiness-guardrails.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-guardrails.js +219 -0
- package/dist/cli/doctor-readiness-guardrails.js.map +1 -0
- package/dist/cli/doctor-readiness-operations.d.ts +103 -0
- package/dist/cli/doctor-readiness-operations.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-operations.js +207 -0
- package/dist/cli/doctor-readiness-operations.js.map +1 -0
- package/dist/cli/doctor-readiness-shared.d.ts +47 -0
- package/dist/cli/doctor-readiness-shared.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-shared.js +88 -0
- package/dist/cli/doctor-readiness-shared.js.map +1 -0
- package/dist/cli/doctor-readiness-supply-chain-scan.d.ts +67 -0
- package/dist/cli/doctor-readiness-supply-chain-scan.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-supply-chain-scan.js +316 -0
- package/dist/cli/doctor-readiness-supply-chain-scan.js.map +1 -0
- package/dist/cli/doctor-readiness-supply-chain.d.ts +14 -0
- package/dist/cli/doctor-readiness-supply-chain.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-supply-chain.js +231 -0
- package/dist/cli/doctor-readiness-supply-chain.js.map +1 -0
- package/dist/cli/doctor-readiness-workflows.d.ts +20 -0
- package/dist/cli/doctor-readiness-workflows.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-workflows.js +29 -7
- package/dist/cli/doctor-readiness-workflows.js.map +1 -1
- package/dist/cli/doctor-readiness-workspaces.d.ts +22 -0
- package/dist/cli/doctor-readiness-workspaces.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-workspaces.js +98 -0
- package/dist/cli/doctor-readiness-workspaces.js.map +1 -0
- package/dist/cli/doctor-readiness.d.ts.map +1 -1
- package/dist/cli/doctor-readiness.js +23 -13
- package/dist/cli/doctor-readiness.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +23 -0
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The dependencies/supply-chain readiness producer — ship blocker B5
|
|
3
|
+
* (PRD #1739, #1896).
|
|
4
|
+
*
|
|
5
|
+
* Dimension 6 of the `readiness-rubric` asks whether belief that the owned
|
|
6
|
+
* surface still works rests on more than hope. Four things, read offline from
|
|
7
|
+
* the repository's own files, decide that: the dependency tree resolves to the
|
|
8
|
+
* same versions twice (a lockfile), the manifest names versions rather than
|
|
9
|
+
* "whatever is newest" (no floating specs), something somewhere actually audits
|
|
10
|
+
* the tree (a CI scan, a git hook, or an update bot), and every audit exception
|
|
11
|
+
* carries the decision that made it acceptable.
|
|
12
|
+
*
|
|
13
|
+
* Two disciplines are load-bearing rather than stylistic:
|
|
14
|
+
*
|
|
15
|
+
* 1. **A finding names a `blocker` id ONLY on an actual violation.** The blocker
|
|
16
|
+
* engine stands a blocker up on any finding that names an id and carries
|
|
17
|
+
* evidence, regardless of the finding's status — so a clean repository's PASS
|
|
18
|
+
* finding must carry no `blocker` key, or a healthy repository reports
|
|
19
|
+
* NOT_READY.
|
|
20
|
+
* The scanning half — reading the manifest, the lockfile, the audit gates, and
|
|
21
|
+
* the audit allowlists — lives in `doctor-readiness-supply-chain-scan`; this
|
|
22
|
+
* module turns what it found into the rubric-shaped dimension record.
|
|
23
|
+
*
|
|
24
|
+
* 2. **Never manufacture RED or GREEN from absence.** A repository with no
|
|
25
|
+
* manifest, an unparseable manifest, or no declared dependencies owns no
|
|
26
|
+
* dependency surface this producer can speak to, so it renders a
|
|
27
|
+
* stated-reason SKIP — never a violation, and never a false-green PASS.
|
|
28
|
+
* @module cli/doctor-readiness-supply-chain
|
|
29
|
+
*/
|
|
30
|
+
import { informationalFindings } from "./doctor-readiness-shared.js";
|
|
31
|
+
import { auditExceptionViolations } from "./doctor-readiness-audit-allowlist.js";
|
|
32
|
+
import { collectSpecs, findAuditGate, findLockfile, isFloatingSpec, LOCKFILES, readManifest, } from "./doctor-readiness-supply-chain-scan.js";
|
|
33
|
+
import { resolveWorkspaceMembers, } from "./doctor-readiness-workspaces.js";
|
|
34
|
+
/** The dependencies/supply-chain readiness dimension id (readiness-rubric). */
|
|
35
|
+
export const DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID = "dependencies-supply-chain";
|
|
36
|
+
/** The ship blocker for an owned surface with no confidence model. */
|
|
37
|
+
const SUPPLY_CHAIN_BLOCKER_ID = "B5";
|
|
38
|
+
/** Most evidence lines carried into a single finding, to keep it readable. */
|
|
39
|
+
const MAX_EVIDENCE_LINES = 12;
|
|
40
|
+
/**
|
|
41
|
+
* Build the evidence line for a manifest with no committed lockfile.
|
|
42
|
+
* @param specCount - How many specs the manifest declares
|
|
43
|
+
* @returns One evidence line
|
|
44
|
+
*/
|
|
45
|
+
function lockfileEvidence(specCount) {
|
|
46
|
+
return (`\`package.json\` declares ${specCount} dependency spec(s) but no lockfile ` +
|
|
47
|
+
`is committed (looked for ${LOCKFILES.join(", ")}) — two installs can ` +
|
|
48
|
+
"resolve to different trees, so what was validated is not provably what " +
|
|
49
|
+
"gets installed");
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Whether a floating-looking spec is really a link to a package in this
|
|
53
|
+
* repository. `"@acme/utils": "*"` against a workspace member resolves to the
|
|
54
|
+
* local package, which is the workspace idiom rather than a floating install —
|
|
55
|
+
* so faulting it would fail every correctly configured monorepo.
|
|
56
|
+
*
|
|
57
|
+
* When workspaces are declared but no member name could be resolved (an
|
|
58
|
+
* unreadable child manifest, an unsupported glob), a bare `*` is exempted
|
|
59
|
+
* anyway: the repository has told us it links locally, and absence of proof is
|
|
60
|
+
* not proof of a violation.
|
|
61
|
+
* @param spec - The declared spec
|
|
62
|
+
* @param workspaces - What resolving the workspace members established
|
|
63
|
+
* @returns True when the spec links to a workspace member
|
|
64
|
+
*/
|
|
65
|
+
function linksWorkspaceMember(spec, workspaces) {
|
|
66
|
+
if (!workspaces.declared) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return (workspaces.names.has(spec.name) ||
|
|
70
|
+
(workspaces.names.size === 0 && spec.spec.trim() === "*"));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Assess a repository's dependency confidence model.
|
|
74
|
+
* @param root - Repository root
|
|
75
|
+
* @param specs - Declared dependency specs
|
|
76
|
+
* @param workspaces - What resolving the workspace members established
|
|
77
|
+
* @returns Evidence lines for violations, and non-blocking observations
|
|
78
|
+
*/
|
|
79
|
+
async function collectFindings(root, specs, workspaces) {
|
|
80
|
+
const lockfile = await findLockfile(root);
|
|
81
|
+
const auditGate = await findAuditGate(root);
|
|
82
|
+
const floating = specs.filter(spec => isFloatingSpec(spec.spec) && !linksWorkspaceMember(spec, workspaces));
|
|
83
|
+
return {
|
|
84
|
+
violations: [
|
|
85
|
+
...(lockfile === null ? [lockfileEvidence(specs.length)] : []),
|
|
86
|
+
...floating.map(spec => `\`package.json\` \`${spec.block}.${spec.name}\` is \`${spec.spec}\`, ` +
|
|
87
|
+
"which resolves to whatever is newest at install time rather than to " +
|
|
88
|
+
"a version anything was ever validated against"),
|
|
89
|
+
...(auditGate === null
|
|
90
|
+
? [
|
|
91
|
+
"no dependency-audit gate covering the JavaScript tree was found " +
|
|
92
|
+
"anywhere — no `npm`/`bun` audit step in `.github/workflows/*.yml`, " +
|
|
93
|
+
"none in a git hook, and no `dependabot.yml` npm entry or " +
|
|
94
|
+
"`renovate.json` — so a newly disclosed advisory in this tree " +
|
|
95
|
+
"would never be noticed by anything",
|
|
96
|
+
]
|
|
97
|
+
: []),
|
|
98
|
+
...(await auditExceptionViolations(root)),
|
|
99
|
+
],
|
|
100
|
+
observations: [
|
|
101
|
+
...(lockfile === null ? [] : [`Lockfile in use: \`${lockfile}\`.`]),
|
|
102
|
+
...(auditGate === null
|
|
103
|
+
? []
|
|
104
|
+
: [`Dependency-audit gate declared in \`${auditGate}\`.`]),
|
|
105
|
+
...(workspaces.declared ? [workspaceObservation(workspaces)] : []),
|
|
106
|
+
],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* State what the workspace exemption actually did.
|
|
111
|
+
*
|
|
112
|
+
* The two cases must not be described in the same words. When member manifests
|
|
113
|
+
* resolved, named packages were exempted because they provably link locally.
|
|
114
|
+
* When none resolved, a bare `*` was exempted on the strength of the
|
|
115
|
+
* `workspaces` declaration alone — a deliberate refusal to manufacture a
|
|
116
|
+
* violation from absence, but NOT a resolved link, and reporting it as
|
|
117
|
+
* "0 package name(s) were exempted" would describe the opposite of what
|
|
118
|
+
* happened.
|
|
119
|
+
* @param workspaces - What resolving the workspace members established
|
|
120
|
+
* @returns One operator-language observation
|
|
121
|
+
*/
|
|
122
|
+
function workspaceObservation(workspaces) {
|
|
123
|
+
return workspaces.names.size > 0
|
|
124
|
+
? `Workspaces are declared, so ${workspaces.names.size} locally linked ` +
|
|
125
|
+
"package name(s) were exempted from the floating-spec check."
|
|
126
|
+
: "Workspaces are declared but no member manifests resolved offline, so " +
|
|
127
|
+
"bare `*` specs were treated as workspace links rather than as " +
|
|
128
|
+
"floating installs. Whether they really link locally is not established.";
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Build the rubric-shaped B5 finding from its evidence lines.
|
|
132
|
+
* @param violations - Evidence lines
|
|
133
|
+
* @returns The B5 finding
|
|
134
|
+
*/
|
|
135
|
+
function supplyChainFinding(violations) {
|
|
136
|
+
const shown = violations.slice(0, MAX_EVIDENCE_LINES);
|
|
137
|
+
const overflow = violations.length - shown.length;
|
|
138
|
+
return {
|
|
139
|
+
blocker: SUPPLY_CHAIN_BLOCKER_ID,
|
|
140
|
+
invariant_violated: "belief that the owned surface still works rests on a repeatable install " +
|
|
141
|
+
"and a standing audit, not on hope",
|
|
142
|
+
evidence: shown.join(" | ") +
|
|
143
|
+
(overflow > 0
|
|
144
|
+
? ` | (+${overflow} further finding(s) of the same kind)`
|
|
145
|
+
: ""),
|
|
146
|
+
why_proof_missed: "the test suite proves things about the code in the tree it happened to " +
|
|
147
|
+
"install, so a tree that drifts — or one carrying a known advisory nobody " +
|
|
148
|
+
"checks for — still reports green",
|
|
149
|
+
root_correction: "commit a lockfile, name a version for every dependency spec, run a " +
|
|
150
|
+
"dependency audit on every push, and record the decision behind each " +
|
|
151
|
+
"audit exception next to the exception itself",
|
|
152
|
+
machinery_to_remove: [
|
|
153
|
+
"audit exceptions kept alive with no written decision, which cost review " +
|
|
154
|
+
"attention every cycle and prove nothing",
|
|
155
|
+
],
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Describe what the spec check established, without overstating the bare-`*`
|
|
160
|
+
* workspace fallback as a resolved link.
|
|
161
|
+
* @param workspaces - What resolving the workspace members established
|
|
162
|
+
* @returns One clause for the PASS evidence
|
|
163
|
+
*/
|
|
164
|
+
function describeSpecCleanliness(workspaces) {
|
|
165
|
+
return workspaces.declared && workspaces.names.size === 0
|
|
166
|
+
? "every one names a version, except bare `*` specs exempted because " +
|
|
167
|
+
"workspaces are declared but no member manifests resolved offline"
|
|
168
|
+
: "every one names a version or links a workspace member";
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Build the stated-reason SKIP for a repository with no assessable manifest.
|
|
172
|
+
* @param reason - Why the dimension was not assessed
|
|
173
|
+
* @returns The SKIP dimension record
|
|
174
|
+
*/
|
|
175
|
+
function skipRecord(reason) {
|
|
176
|
+
return {
|
|
177
|
+
id: DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID,
|
|
178
|
+
status: "SKIP",
|
|
179
|
+
findings: [{ reason, skip: true }],
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Assess the dependencies/supply-chain dimension: B5, "an owned compatibility or
|
|
184
|
+
* security surface has no confidence model". Offline by construction — it reads
|
|
185
|
+
* only the repository's manifest, lockfiles, CI declarations, git hooks, and
|
|
186
|
+
* audit allowlists, and degrades to a stated-reason SKIP wherever those files
|
|
187
|
+
* cannot settle the question.
|
|
188
|
+
* @param root - Project root to assess
|
|
189
|
+
* @returns The dependencies/supply-chain dimension record
|
|
190
|
+
*/
|
|
191
|
+
export async function assessDependenciesSupplyChainDimension(root) {
|
|
192
|
+
const outcome = await readManifest(root);
|
|
193
|
+
if (outcome.kind === "unassessable") {
|
|
194
|
+
return skipRecord(outcome.reason);
|
|
195
|
+
}
|
|
196
|
+
const specs = collectSpecs(outcome.manifest);
|
|
197
|
+
if (specs.length === 0) {
|
|
198
|
+
return skipRecord("`package.json` declares no dependencies, so this repository owns no " +
|
|
199
|
+
"third-party surface a confidence model could cover; supply-chain " +
|
|
200
|
+
"confidence is not established either way");
|
|
201
|
+
}
|
|
202
|
+
const workspaces = await resolveWorkspaceMembers(root, outcome.manifest);
|
|
203
|
+
const { violations, observations } = await collectFindings(root, specs, workspaces);
|
|
204
|
+
if (violations.length > 0) {
|
|
205
|
+
return {
|
|
206
|
+
id: DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID,
|
|
207
|
+
status: "FAIL",
|
|
208
|
+
findings: [
|
|
209
|
+
supplyChainFinding(violations),
|
|
210
|
+
...informationalFindings(observations),
|
|
211
|
+
],
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
id: DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID,
|
|
216
|
+
status: "PASS",
|
|
217
|
+
findings: [
|
|
218
|
+
{
|
|
219
|
+
evidence: `Inspected ${specs.length} dependency spec(s) in the root ` +
|
|
220
|
+
`\`package.json\`: ${describeSpecCleanliness(workspaces)}, a ` +
|
|
221
|
+
"lockfile is committed, a dependency-audit gate covering the " +
|
|
222
|
+
"JavaScript tree is declared, and every active audit exception " +
|
|
223
|
+
"carries a written decision. Workspace child manifests are not " +
|
|
224
|
+
"walked, so this speaks only to the root manifest.",
|
|
225
|
+
checked: [SUPPLY_CHAIN_BLOCKER_ID],
|
|
226
|
+
},
|
|
227
|
+
...informationalFindings(observations),
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=doctor-readiness-supply-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-readiness-supply-chain.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-supply-chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,12 @@ export interface ParsedWorkflowStep {
|
|
|
27
27
|
readonly uses: string;
|
|
28
28
|
/** Raw serialized `env` + `with` text, used for credential evidence. */
|
|
29
29
|
readonly inputs: string;
|
|
30
|
+
/**
|
|
31
|
+
* The step's `if:` condition, or `""` when it always runs. Load-bearing for
|
|
32
|
+
* the B1/B4 producers: a conditional step is a step somebody deliberately
|
|
33
|
+
* gated, which is exactly what those blockers ask about.
|
|
34
|
+
*/
|
|
35
|
+
readonly ifCondition: string;
|
|
30
36
|
}
|
|
31
37
|
/** One job inside a parsed workflow. */
|
|
32
38
|
export interface ParsedWorkflowJob {
|
|
@@ -43,6 +49,20 @@ export interface ParsedWorkflowJob {
|
|
|
43
49
|
readonly secrets: WorkflowBlock;
|
|
44
50
|
/** Declared deployment environments (a scalar or list, normalized). */
|
|
45
51
|
readonly environment: readonly string[];
|
|
52
|
+
/** The job's `if:` condition, or `""` when it always runs. */
|
|
53
|
+
readonly ifCondition: string;
|
|
54
|
+
/**
|
|
55
|
+
* The job-level `env:` block, flattened to `key: value` lines. The B1
|
|
56
|
+
* producer resolves a command's target through it: `psql "$DATABASE_URL"`
|
|
57
|
+
* says nothing on its own, while the `DATABASE_URL` it expands to may name
|
|
58
|
+
* `127.0.0.1` and settle the question.
|
|
59
|
+
*/
|
|
60
|
+
readonly env: string;
|
|
61
|
+
/**
|
|
62
|
+
* Ids of the `services:` containers the job starts. A job that boots its own
|
|
63
|
+
* database is operating on throwaway state by construction.
|
|
64
|
+
*/
|
|
65
|
+
readonly services: readonly string[];
|
|
46
66
|
}
|
|
47
67
|
/** One parsed `.github/workflows/*.yml` file. */
|
|
48
68
|
export interface ParsedWorkflow {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-workflows.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-workflows.ts"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-readiness-workflows.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-workflows.ts"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,EAAE,qBAAqB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC7C;AAkND;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAQpC"}
|
|
@@ -86,13 +86,31 @@ function parseTrigger(value) {
|
|
|
86
86
|
* @returns Flattened `key: value` text, one pair per line
|
|
87
87
|
*/
|
|
88
88
|
function serializeStepInputs(step) {
|
|
89
|
-
return ["env", "with"]
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
89
|
+
return ["env", "with"].flatMap(key => serializeBlock(step[key])).join("\n");
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Flatten one YAML mapping to `key: value` lines so it can be searched as text.
|
|
93
|
+
* @param value - Candidate YAML mapping
|
|
94
|
+
* @returns One line per entry (empty when the value is not a mapping)
|
|
95
|
+
*/
|
|
96
|
+
function serializeBlock(value) {
|
|
97
|
+
if (!isJsonObject(value)) {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
return Object.entries(value).map(([name, entry]) => `${name}: ${typeof entry === "string" ? entry : String(entry)}`);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Normalize an `if:` condition, which GitHub accepts as an expression string or
|
|
104
|
+
* a bare boolean. Any non-empty value means the thing is conditional; the text
|
|
105
|
+
* itself is carried only so evidence can quote it.
|
|
106
|
+
* @param value - Candidate YAML `if` value
|
|
107
|
+
* @returns The condition text, or `""` when the block is absent
|
|
108
|
+
*/
|
|
109
|
+
function asCondition(value) {
|
|
110
|
+
if (value === undefined || value === null) {
|
|
111
|
+
return "";
|
|
112
|
+
}
|
|
113
|
+
return typeof value === "string" ? value.trim() : String(value);
|
|
96
114
|
}
|
|
97
115
|
/**
|
|
98
116
|
* Parse one job's `steps` list.
|
|
@@ -108,6 +126,7 @@ function parseSteps(value) {
|
|
|
108
126
|
run: typeof step.run === "string" ? step.run.trim() : "",
|
|
109
127
|
uses: typeof step.uses === "string" ? step.uses.trim() : "",
|
|
110
128
|
inputs: serializeStepInputs(step),
|
|
129
|
+
ifCondition: asCondition(step.if),
|
|
111
130
|
}));
|
|
112
131
|
}
|
|
113
132
|
/**
|
|
@@ -136,6 +155,9 @@ function parseJobs(document, file) {
|
|
|
136
155
|
permissions: asBlock(job.permissions),
|
|
137
156
|
secrets: asBlock(job.secrets),
|
|
138
157
|
environment: asEnvironments(job.environment),
|
|
158
|
+
ifCondition: asCondition(job.if),
|
|
159
|
+
env: serializeBlock(job.env).join("\n"),
|
|
160
|
+
services: isJsonObject(job.services) ? Object.keys(job.services) : [],
|
|
139
161
|
},
|
|
140
162
|
];
|
|
141
163
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-workflows.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-workflows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,0EAA0E;AAC1E,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-readiness-workflows.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-workflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** What resolving the repository's workspace members established. */
|
|
2
|
+
export interface WorkspaceMembers {
|
|
3
|
+
/** Whether the repository declares workspaces at all. */
|
|
4
|
+
readonly declared: boolean;
|
|
5
|
+
/** Names of the local packages the workspaces resolve to. */
|
|
6
|
+
readonly names: ReadonlySet<string>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the local package names a repository's workspace globs expand to.
|
|
10
|
+
*
|
|
11
|
+
* This exists because `"@acme/utils": "*"` against a workspace member is the
|
|
12
|
+
* workspace-link idiom, not a floating install: it resolves to the package in
|
|
13
|
+
* this repository. Faulting it would fail every correctly configured monorepo.
|
|
14
|
+
* Glob support is deliberately shallow (a single trailing `*`), and an
|
|
15
|
+
* unresolvable glob simply contributes no names — absence never manufactures a
|
|
16
|
+
* violation.
|
|
17
|
+
* @param root - Repository root
|
|
18
|
+
* @param manifest - Parsed root `package.json`
|
|
19
|
+
* @returns Whether workspaces are declared, and the member names resolved
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveWorkspaceMembers(root: string, manifest: Record<string, unknown>): Promise<WorkspaceMembers>;
|
|
22
|
+
//# sourceMappingURL=doctor-readiness-workspaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-readiness-workspaces.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-workspaces.ts"],"names":[],"mappings":"AAwBA,qEAAqE;AACrE,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACrC;AA6BD;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC,CAwB3B"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace-member resolution for the dependencies/supply-chain readiness
|
|
3
|
+
* producer (B5, PRD #1739, #1896).
|
|
4
|
+
*
|
|
5
|
+
* This module exists for one false positive: `"@acme/utils": "*"` against a
|
|
6
|
+
* workspace member is the workspace-link idiom, not a floating install. The
|
|
7
|
+
* spec resolves to a package inside this repository, so nothing about it can
|
|
8
|
+
* drift at install time — and faulting it would fail every correctly configured
|
|
9
|
+
* npm/yarn/bun/pnpm monorepo. Resolving which names are local is therefore a
|
|
10
|
+
* precondition of B5's floating-spec check, not a nicety.
|
|
11
|
+
*
|
|
12
|
+
* Glob support is deliberately shallow (one trailing `*`) and every read is
|
|
13
|
+
* best-effort: an unresolvable glob contributes no names, because absence of
|
|
14
|
+
* proof must never become proof of a violation.
|
|
15
|
+
* @module cli/doctor-readiness-workspaces
|
|
16
|
+
*/
|
|
17
|
+
import { readdir } from "node:fs/promises";
|
|
18
|
+
import * as path from "node:path";
|
|
19
|
+
import { isRecord, readFileOrNull, trimSlashes, } from "./doctor-readiness-shared.js";
|
|
20
|
+
/**
|
|
21
|
+
* Read the workspace globs a repository declares, across the three spellings:
|
|
22
|
+
* npm/bun/yarn `workspaces` as an array, yarn-classic `workspaces.packages`, and
|
|
23
|
+
* pnpm's separate `pnpm-workspace.yaml`.
|
|
24
|
+
* @param root - Repository root
|
|
25
|
+
* @param manifest - Parsed root `package.json`
|
|
26
|
+
* @returns The declared workspace globs
|
|
27
|
+
*/
|
|
28
|
+
async function workspaceGlobs(root, manifest) {
|
|
29
|
+
const declared = manifest.workspaces;
|
|
30
|
+
const fromManifest = Array.isArray(declared)
|
|
31
|
+
? declared
|
|
32
|
+
: isRecord(declared) && Array.isArray(declared.packages)
|
|
33
|
+
? declared.packages
|
|
34
|
+
: [];
|
|
35
|
+
const pnpm = await readFileOrNull(root, "pnpm-workspace.yaml");
|
|
36
|
+
const fromPnpm = (pnpm ?? "")
|
|
37
|
+
.split("\n")
|
|
38
|
+
.flatMap(line => /^\s*-\s*["']?([^"'\s]+)/.exec(line)?.[1] ?? []);
|
|
39
|
+
return [...fromManifest, ...fromPnpm].filter((glob) => typeof glob === "string" && glob.trim() !== "");
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Resolve the local package names a repository's workspace globs expand to.
|
|
43
|
+
*
|
|
44
|
+
* This exists because `"@acme/utils": "*"` against a workspace member is the
|
|
45
|
+
* workspace-link idiom, not a floating install: it resolves to the package in
|
|
46
|
+
* this repository. Faulting it would fail every correctly configured monorepo.
|
|
47
|
+
* Glob support is deliberately shallow (a single trailing `*`), and an
|
|
48
|
+
* unresolvable glob simply contributes no names — absence never manufactures a
|
|
49
|
+
* violation.
|
|
50
|
+
* @param root - Repository root
|
|
51
|
+
* @param manifest - Parsed root `package.json`
|
|
52
|
+
* @returns Whether workspaces are declared, and the member names resolved
|
|
53
|
+
*/
|
|
54
|
+
export async function resolveWorkspaceMembers(root, manifest) {
|
|
55
|
+
const globs = await workspaceGlobs(root, manifest);
|
|
56
|
+
const directories = (await Promise.all(globs.map(async (glob) => await expandGlob(root, glob)))).flat();
|
|
57
|
+
const names = (await Promise.all(directories.map(async (directory) => {
|
|
58
|
+
const source = await readFileOrNull(root, `${directory}/package.json`);
|
|
59
|
+
if (source === null) {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(source);
|
|
64
|
+
return isRecord(parsed) && typeof parsed.name === "string"
|
|
65
|
+
? [parsed.name]
|
|
66
|
+
: [];
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
}))).flat();
|
|
72
|
+
return { declared: globs.length > 0, names: new Set(names) };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Expand one workspace glob into candidate member directories.
|
|
76
|
+
* @param root - Repository root
|
|
77
|
+
* @param glob - The declared glob, e.g. `packages/*`
|
|
78
|
+
* @returns Repo-relative directories the glob names
|
|
79
|
+
*/
|
|
80
|
+
async function expandGlob(root, glob) {
|
|
81
|
+
const normalized = trimSlashes(glob);
|
|
82
|
+
if (!normalized.includes("*")) {
|
|
83
|
+
return [normalized];
|
|
84
|
+
}
|
|
85
|
+
const parent = trimSlashes(normalized.slice(0, normalized.indexOf("*")));
|
|
86
|
+
try {
|
|
87
|
+
const entries = await readdir(path.join(root, ...parent.split("/")), {
|
|
88
|
+
withFileTypes: true,
|
|
89
|
+
});
|
|
90
|
+
return entries
|
|
91
|
+
.filter(entry => entry.isDirectory())
|
|
92
|
+
.map(entry => (parent === "" ? entry.name : `${parent}/${entry.name}`));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=doctor-readiness-workspaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-readiness-workspaces.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-workspaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAGL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACtB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-readiness.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAGL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACtB,MAAM,gCAAgC,CAAC;AA+BxC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAM5E,OAAO,EACL,iCAAiC,EACjC,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,uBAAuB,EACvB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,GACd,MAAM,gCAAgC,CAAC;AAQxC;;;GAGG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAkE1C,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EACA,CAAC;AAetD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CA0CtB;AAyBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,SAAS,uBAAuB,EAAE,GAC7C,MAAM,CAeR;AAsCD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,wBAAwB,CAAC,CAUnC;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,wBAAwB,CAAC,CAAC"}
|
|
@@ -4,6 +4,11 @@ import * as path from "node:path";
|
|
|
4
4
|
import process from "node:process";
|
|
5
5
|
import { assessReadiness, } from "./doctor-readiness-blockers.js";
|
|
6
6
|
import { DELIVERY_AUTHORITY_DIMENSION_ID, assessDeliveryAuthorityDimension, } from "./doctor-readiness-delivery.js";
|
|
7
|
+
import { CONTEXT_ROUTING_DIMENSION_ID, assessContextRoutingDimension, } from "./doctor-readiness-context.js";
|
|
8
|
+
import { DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID, assessDependenciesSupplyChainDimension, } from "./doctor-readiness-supply-chain.js";
|
|
9
|
+
import { CAPABILITIES_TOOLS_DIMENSION_ID, assessCapabilitiesToolsDimension, } from "./doctor-readiness-capabilities.js";
|
|
10
|
+
import { DOMAIN_OWNERSHIP_DIMENSION_ID, assessDomainOwnershipDimension, } from "./doctor-readiness-domain.js";
|
|
11
|
+
import { FEEDBACK_GUARDRAILS_DIMENSION_ID, assessFeedbackGuardrailsDimension, } from "./doctor-readiness-guardrails.js";
|
|
7
12
|
import { EXECUTION_PROOF_DIMENSION_ID, PROPORTIONALITY_DIMENSION_ID, assessExecutionProofDimension, assessProportionalityDimension, } from "./doctor-readiness-journey.js";
|
|
8
13
|
import { getPackageVersion } from "./version.js";
|
|
9
14
|
// Re-export the blocker-gate surface (RRR-5, #1857) so `.lisa/readiness.json`
|
|
@@ -22,26 +27,23 @@ export const READINESS_SCHEMA_VERSION = 1;
|
|
|
22
27
|
/**
|
|
23
28
|
* The eight ownership dimensions, in fixed render order, defined once by the
|
|
24
29
|
* `readiness-rubric` rule (RRR-1, #1853). This collector consumes that rubric —
|
|
25
|
-
* it does not redefine the vocabulary.
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
30
|
+
* it does not redefine the vocabulary. As of #1896 every one of the eight is
|
|
31
|
+
* wired to a producer in {@link DIMENSION_PRODUCERS}, so no dimension is ever
|
|
32
|
+
* blank: each renders either a producer's result or that producer's own stated
|
|
33
|
+
* reason for not assessing it, per the never-silently-omit contract (#1898).
|
|
29
34
|
*/
|
|
30
35
|
const READINESS_DIMENSIONS = [
|
|
31
36
|
{
|
|
32
37
|
id: "context-routing",
|
|
33
38
|
question: "Can an agent recover the real job from what is written down (integration-access-layer, wiki-knowledge-source, config-resolution)?",
|
|
34
|
-
skipReason: "Context/routing evidence is assessed by the agent-ready wiring (RRR-4, #1856); no readiness probe is wired in this Lisa version.",
|
|
35
39
|
},
|
|
36
40
|
{
|
|
37
41
|
id: "capabilities-tools",
|
|
38
42
|
question: "Is every tool the work needs provably reachable, not merely installed (tool-access-gate)?",
|
|
39
|
-
skipReason: "Capabilities/tools evidence is gathered by the journey-execution wiring (RRR-6, #1858); no readiness probe is wired in this Lisa version.",
|
|
40
43
|
},
|
|
41
44
|
{
|
|
42
45
|
id: "domain-ownership",
|
|
43
46
|
question: "Are the business rules, glossary, and danger zones owned and written down (agent-ready domain phase wiki pages)?",
|
|
44
|
-
skipReason: "Domain-ownership evidence sources from agent-ready's danger-zone wiki pages, read by RRR-4 (#1856); no readiness probe is wired in this Lisa version.",
|
|
45
47
|
},
|
|
46
48
|
{
|
|
47
49
|
id: "execution-proof",
|
|
@@ -50,12 +52,10 @@ const READINESS_DIMENSIONS = [
|
|
|
50
52
|
{
|
|
51
53
|
id: "feedback-guardrails",
|
|
52
54
|
question: "Does a failing loop produce a named outcome and a runbook (automation-runbook-contract, observability-audit)?",
|
|
53
|
-
skipReason: "Feedback/guardrails evidence is assessed by RRR-4 (#1856); no readiness probe is wired in this Lisa version.",
|
|
54
55
|
},
|
|
55
56
|
{
|
|
56
57
|
id: "dependencies-supply-chain",
|
|
57
58
|
question: "Is there a confidence model for what the repo depends on (security-audit-handling)?",
|
|
58
|
-
skipReason: "Dependencies/supply-chain evidence is assessed by RRR-4 (#1856); no readiness probe is wired in this Lisa version.",
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
id: "delivery-authority",
|
|
@@ -183,10 +183,15 @@ export function formatReadinessHeadline(verdict, dimensions) {
|
|
|
183
183
|
* Build the eight readiness dimensions in fixed render order by dispatching each
|
|
184
184
|
* to its producer. Execution/proof and proportionality are wired to #1742's
|
|
185
185
|
* shared journey runner (RRR-6, #1858); delivery/authority is wired to the
|
|
186
|
-
* offline workflow producers assessing ship blockers B2 and B3
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
186
|
+
* offline workflow producers assessing ship blockers B2 and B3, context/routing
|
|
187
|
+
* to the documentation cross-check assessing B6, dependencies/supply-chain to
|
|
188
|
+
* the manifest and audit-gate producer assessing B5, domain-ownership to the
|
|
189
|
+
* silent-data-loss producer assessing B1, feedback/guardrails to the
|
|
190
|
+
* gate-and-recovery producer assessing B4, and capabilities/tools to a producer
|
|
191
|
+
* whose only honest answer is a reasoned SKIP, because tool reachability needs a
|
|
192
|
+
* live probe (#1896). A dimension with no producer would fall through to a
|
|
193
|
+
* stated-reason SKIP rather than a blank one (#1898), so the report never
|
|
194
|
+
* presents "never looked" as "nothing to report".
|
|
190
195
|
* @param targetPath - Project path to assess
|
|
191
196
|
* @returns The eight per-dimension records, in fixed order
|
|
192
197
|
*/
|
|
@@ -225,9 +230,14 @@ export async function runDimensionProducer(id, targetPath, produce) {
|
|
|
225
230
|
* map falls through to {@link reasonedSkip} rather than to silence.
|
|
226
231
|
*/
|
|
227
232
|
const DIMENSION_PRODUCERS = {
|
|
233
|
+
[CONTEXT_ROUTING_DIMENSION_ID]: async (targetPath) => await assessContextRoutingDimension(targetPath),
|
|
234
|
+
[DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID]: async (targetPath) => await assessDependenciesSupplyChainDimension(targetPath),
|
|
228
235
|
[EXECUTION_PROOF_DIMENSION_ID]: async (targetPath) => await assessExecutionProofDimension(targetPath),
|
|
229
236
|
[PROPORTIONALITY_DIMENSION_ID]: async (targetPath) => await assessProportionalityDimension(targetPath),
|
|
230
237
|
[DELIVERY_AUTHORITY_DIMENSION_ID]: async (targetPath) => await assessDeliveryAuthorityDimension(targetPath),
|
|
238
|
+
[CAPABILITIES_TOOLS_DIMENSION_ID]: async (targetPath) => await assessCapabilitiesToolsDimension(targetPath),
|
|
239
|
+
[DOMAIN_OWNERSHIP_DIMENSION_ID]: async (targetPath) => await assessDomainOwnershipDimension(targetPath),
|
|
240
|
+
[FEEDBACK_GUARDRAILS_DIMENSION_ID]: async (targetPath) => await assessFeedbackGuardrailsDimension(targetPath),
|
|
231
241
|
};
|
|
232
242
|
/**
|
|
233
243
|
* Build the stated-reason SKIP a dimension without a wired producer renders
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EACL,eAAe,GAIhB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,8EAA8E;AAC9E,yEAAyE;AACzE,wCAAwC;AACxC,OAAO,EACL,iCAAiC,EACjC,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AAWxC,gEAAgE;AAChE,MAAM,+BAA+B,GAAG,sBAAsB,CAAC;AAE/D,qEAAqE;AACrE,MAAM,6BAA6B,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAE3E;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-readiness.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness.ts"],"names":[],"mappings":"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"}
|