projscan 4.10.0 → 4.11.1

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.
Files changed (51) hide show
  1. package/README.md +72 -41
  2. package/dist/cli/commands/assess.d.ts +3 -0
  3. package/dist/cli/commands/assess.js +143 -0
  4. package/dist/cli/commands/assess.js.map +1 -0
  5. package/dist/cli/commands/simulate.d.ts +3 -0
  6. package/dist/cli/commands/simulate.js +125 -0
  7. package/dist/cli/commands/simulate.js.map +1 -0
  8. package/dist/cli/registerCommands.js +4 -0
  9. package/dist/cli/registerCommands.js.map +1 -1
  10. package/dist/core/assess.d.ts +9 -0
  11. package/dist/core/assess.js +119 -0
  12. package/dist/core/assess.js.map +1 -0
  13. package/dist/core/proofCards.d.ts +10 -0
  14. package/dist/core/proofCards.js +222 -0
  15. package/dist/core/proofCards.js.map +1 -0
  16. package/dist/core/riskDelta.d.ts +19 -0
  17. package/dist/core/riskDelta.js +77 -0
  18. package/dist/core/riskDelta.js.map +1 -0
  19. package/dist/core/simulate.d.ts +6 -0
  20. package/dist/core/simulate.js +298 -0
  21. package/dist/core/simulate.js.map +1 -0
  22. package/dist/mcp/toolCatalog.js +4 -0
  23. package/dist/mcp/toolCatalog.js.map +1 -1
  24. package/dist/mcp/tools/assess.d.ts +2 -0
  25. package/dist/mcp/tools/assess.js +42 -0
  26. package/dist/mcp/tools/assess.js.map +1 -0
  27. package/dist/mcp/tools/simulate.d.ts +2 -0
  28. package/dist/mcp/tools/simulate.js +32 -0
  29. package/dist/mcp/tools/simulate.js.map +1 -0
  30. package/dist/projscan-sbom.cdx.json +6 -6
  31. package/dist/publicCore.d.ts +2 -0
  32. package/dist/publicCore.js +2 -0
  33. package/dist/publicCore.js.map +1 -1
  34. package/dist/tool-manifest.json +52 -3
  35. package/dist/types/assess.d.ts +91 -0
  36. package/dist/types/assess.js +2 -0
  37. package/dist/types/assess.js.map +1 -0
  38. package/dist/types/simulate.d.ts +41 -0
  39. package/dist/types/simulate.js +2 -0
  40. package/dist/types/simulate.js.map +1 -0
  41. package/dist/types/workplan.d.ts +1 -0
  42. package/dist/types.d.ts +2 -0
  43. package/dist/utils/formatSupport.d.ts +2 -0
  44. package/dist/utils/formatSupport.js +2 -0
  45. package/dist/utils/formatSupport.js.map +1 -1
  46. package/docs/GUIDE.md +19 -1
  47. package/docs/demos/projscan-4-1-demo.html +214 -2
  48. package/docs/projscan-mission-control.png +0 -0
  49. package/docs/projscan-proof-cards.png +0 -0
  50. package/package.json +2 -1
  51. package/scripts/capture-readme-assets.mjs +6 -0
package/README.md CHANGED
@@ -24,8 +24,9 @@ Use projscan when an agent asks one of these questions:
24
24
  - Which files should I read before changing this feature?
25
25
  - Which proof commands should I run before handoff?
26
26
  - Which risks need fixes, reviewer attention, or release sign-off?
27
+ - What is actually risky, and what should I fix first?
27
28
 
28
- projscan runs core scans on your machine. It respects `.gitignore`, keeps `.env` values out of scans unless you opt in, and exposes the same evidence through a CLI and a 45-tool MCP server. The language layer uses 11 AST adapters covering 12 named languages.
29
+ projscan runs core scans on your machine. It respects `.gitignore`, keeps `.env` values out of scans unless you opt in, and exposes the same evidence through a CLI and a 47-tool MCP server. The language layer uses 11 AST adapters covering 12 named languages.
29
30
 
30
31
  ## Install
31
32
 
@@ -89,6 +90,22 @@ You get read-only readiness evidence. projscan reports fixes and sign-off gates;
89
90
 
90
91
  Success criteria: release review separates concrete defects from human approval gates before anyone tags or publishes.
91
92
 
93
+ ### Weekly proof-first assessment
94
+
95
+ ```bash
96
+ projscan assess --goal "make this repo safer to ship this week"
97
+ projscan assess --mode fix-first --format markdown
98
+ projscan simulate --plan "split bugHunt.ts into ranking, evidence, and output modules"
99
+ ```
100
+
101
+ You get Proof Cards: each recommendation carries local evidence, impact, a safe change shape, verification commands, feedback or suppression guidance, and a risk delta. Add `--baseline previous-assess.json` to compare the current risk delta against a prior run. `assess` composes existing quality, bug-hunt, and preflight evidence; it does not release, tag, publish, or deploy.
102
+
103
+ Use the risk delta simulator before a refactor or extraction. It predicts likely touched files, affected tests, contract surfaces, rollout steps, proof commands, and before/after risk from local evidence. It is read-only: it does not edit files, run the plan, release, tag, publish, or deploy.
104
+
105
+ <img src="docs/projscan-proof-cards.png" alt="projscan assess showing a Proof Card with evidence, impact, safe change shape, verification commands, feedback path, and risk delta" width="760">
106
+
107
+ Success criteria: the team sees the one or two highest-value fixes, why they matter, how to prove them, and whether ship-readiness still needs caution or review.
108
+
92
109
  ## Mission Control
93
110
 
94
111
  `projscan start --intent "<goal>"` turns a plain-language goal into an execution plan:
@@ -128,13 +145,23 @@ npm run docs:screenshots
128
145
  npm run docs:demos
129
146
  ```
130
147
 
131
- ## 4.9.3 Notes
148
+ ## 4.11.1 Notes
149
+
150
+ 4.11.1 is a public README media refresh for the proof-first release:
151
+
152
+ - Added a dedicated Proof Cards screenshot for `projscan assess` and
153
+ `projscan simulate`.
154
+ - Regenerated README screenshots so public media shows the current 47-tool MCP
155
+ surface.
156
+ - Updated website handoff guidance to use immutable `v4.11.1` media URLs.
157
+
158
+ ## 4.11.0 Notes
132
159
 
133
- 4.9.3 is a documentation and proof-media patch for the 4.9 trust release:
160
+ 4.11.0 is the proof-first engineering command center release:
134
161
 
135
- - README now starts with install, three daily workflows, MCP setup, command map, and the trust model.
136
- - Mission Control screenshots and VHS demos were regenerated from current CLI output.
137
- - The release keeps the 4.9.2 runtime fixes for TypeScript aliases, local package aliases, Next.js App Router entrypoints, explicit before-edit proof, compact reviewer feedback, caution triage, and parallel preflight gathering.
162
+ - `projscan assess` turns quality, bug-hunt, and preflight evidence into Proof Cards with fix-first guidance and risk delta.
163
+ - `projscan simulate --plan "<change plan>"` predicts likely files, tests, contracts, rollout, proof commands, and before/after risk before editing.
164
+ - MCP now exposes 47 tools, including `projscan_assess` and `projscan_simulate`.
138
165
 
139
166
  ## MCP Setup
140
167
 
@@ -168,41 +195,45 @@ npx -y projscan mcp --watch
168
195
 
169
196
  ### Agent Questions
170
197
 
171
- | Agent question | CLI or MCP route |
172
- | -------------------------------------------- | -------------------------------------------------------------------------------- |
173
- | Which files implement auth? | `projscan search "auth" --format json` |
174
- | Who imports this file? | `projscan semantic-graph --query importers --file src/auth/jwt.ts --format json` |
175
- | What breaks if I rename this symbol? | `projscan impact --symbol buildCodeGraph --format json` |
176
- | What should I fix first? | `projscan bug-hunt --format json` |
177
- | Which files have high risk and low coverage? | `projscan coverage --format json` |
178
- | What should my agent do next? | `projscan workplan --format json` |
179
- | Which proof belongs in this PR? | `projscan evidence-pack --pr-comment` |
180
- | Is this branch ready to merge? | `projscan preflight --mode before_merge --format json` |
198
+ | Agent question | CLI or MCP route |
199
+ | -------------------------------------------- | ---------------------------------------------------------------------------------------- |
200
+ | Which files implement auth? | `projscan search "auth" --format json` |
201
+ | Who imports this file? | `projscan semantic-graph --query importers --file src/auth/jwt.ts --format json` |
202
+ | What breaks if I rename this symbol? | `projscan impact --symbol buildCodeGraph --format json` |
203
+ | What should I fix first? | `projscan bug-hunt --format json` |
204
+ | What is risky and worth fixing this week? | `projscan assess --goal "make this repo safer to ship this week"` |
205
+ | Is this refactor worth doing? | `projscan simulate --plan "split bugHunt.ts into ranking, evidence, and output modules"` |
206
+ | Which files have high risk and low coverage? | `projscan coverage --format json` |
207
+ | What should my agent do next? | `projscan workplan --format json` |
208
+ | Which proof belongs in this PR? | `projscan evidence-pack --pr-comment` |
209
+ | Is this branch ready to merge? | `projscan preflight --mode before_merge --format json` |
181
210
 
182
211
  ## Command Map
183
212
 
184
- | Command | Use it when you need |
185
- | ------------------------- | -------------------------------------------------------------------------- |
186
- | `projscan start` | first-60-seconds orientation, routing, and Mission Control |
187
- | `projscan understand` | cited repo map, runtime flows, public contracts, and change readiness |
188
- | `projscan preflight` | proceed, caution, or block gate for edit, commit, or merge |
189
- | `projscan evidence-pack` | PR-ready proof with risks, owners, and next commands |
190
- | `projscan bug-hunt` | ranked fix queue from health, hotspots, session, and preflight evidence |
191
- | `projscan workplan` | ordered agent tasks with proof and handoff text |
192
- | `projscan doctor` | project health, tooling gaps, dead code, and supply-chain signals |
193
- | `projscan review` | one-call PR review from structural diff, risk, cycles, functions, and deps |
194
- | `projscan impact` | blast radius for a file or symbol before rename, delete, or upgrade |
195
- | `projscan semantic-graph` | imports, exports, importers, symbol definitions, and package importers |
196
- | `projscan dataflow` | framework-aware source-to-sink risks |
197
- | `projscan hotspots` | churn, complexity, ownership, and coverage risk ranking |
198
- | `projscan coverage` | high-risk files with weak test coverage |
199
- | `projscan dependencies` | dependency inventory, license summary, and risk notes |
200
- | `projscan upgrade <pkg>` | offline upgrade impact from changelog and importer evidence |
201
- | `projscan audit` | normalized `npm audit` findings and SARIF |
202
- | `projscan coordinate` | collisions, claims, and merge-risk across worktrees |
203
- | `projscan plugin` | local analyzer and reporter plugin workflow |
204
- | `projscan privacy-check` | local scan boundary, telemetry, ignore rules, and network-capable paths |
205
- | `projscan mcp` | MCP server over stdio |
213
+ | Command | Use it when you need |
214
+ | ------------------------- | --------------------------------------------------------------------------- |
215
+ | `projscan start` | first-60-seconds orientation, routing, and Mission Control |
216
+ | `projscan understand` | cited repo map, runtime flows, public contracts, and change readiness |
217
+ | `projscan preflight` | proceed, caution, or block gate for edit, commit, or merge |
218
+ | `projscan assess` | proof-first assessment with Proof Cards, risk delta, and fix-first guidance |
219
+ | `projscan simulate` | risk delta simulator for a proposed change plan before editing |
220
+ | `projscan evidence-pack` | PR-ready proof with risks, owners, and next commands |
221
+ | `projscan bug-hunt` | ranked fix queue from health, hotspots, session, and preflight evidence |
222
+ | `projscan workplan` | ordered agent tasks with proof and handoff text |
223
+ | `projscan doctor` | project health, tooling gaps, dead code, and supply-chain signals |
224
+ | `projscan review` | one-call PR review from structural diff, risk, cycles, functions, and deps |
225
+ | `projscan impact` | blast radius for a file or symbol before rename, delete, or upgrade |
226
+ | `projscan semantic-graph` | imports, exports, importers, symbol definitions, and package importers |
227
+ | `projscan dataflow` | framework-aware source-to-sink risks |
228
+ | `projscan hotspots` | churn, complexity, ownership, and coverage risk ranking |
229
+ | `projscan coverage` | high-risk files with weak test coverage |
230
+ | `projscan dependencies` | dependency inventory, license summary, and risk notes |
231
+ | `projscan upgrade <pkg>` | offline upgrade impact from changelog and importer evidence |
232
+ | `projscan audit` | normalized `npm audit` findings and SARIF |
233
+ | `projscan coordinate` | collisions, claims, and merge-risk across worktrees |
234
+ | `projscan plugin` | local analyzer and reporter plugin workflow |
235
+ | `projscan privacy-check` | local scan boundary, telemetry, ignore rules, and network-capable paths |
236
+ | `projscan mcp` | MCP server over stdio |
206
237
 
207
238
  Run the generated command help when you need flags:
208
239
 
@@ -266,7 +297,7 @@ Use `suppress` for a known false positive in a specific path without disabling
266
297
  the rule everywhere. For one line, add an inline directive next to the value:
267
298
 
268
299
  ```ts
269
- const firebaseKey = "AIza..." // projscan-ignore-line hardcoded-secret -- Firebase web keys are public identifiers
300
+ const firebaseKey = 'AIza...'; // projscan-ignore-line hardcoded-secret -- Firebase web keys are public identifiers
270
301
  ```
271
302
 
272
303
  Config docs live in [docs/GUIDE.md](docs/GUIDE.md#configuration-projscanrc).
@@ -375,7 +406,7 @@ Supply-chain scanners may flag package strings or APIs used by `git`, `npm audit
375
406
 
376
407
  ## Install Notes
377
408
 
378
- `projscan@4.9.3` has seven direct runtime dependencies:
409
+ `projscan@4.11.1` has seven direct runtime dependencies:
379
410
 
380
411
  - `@babel/parser`
381
412
  - `@babel/types`
@@ -385,7 +416,7 @@ Supply-chain scanners may flag package strings or APIs used by `git`, `npm audit
385
416
  - `ora`
386
417
  - `web-tree-sitter`
387
418
 
388
- If npm prints `allow-scripts` warnings during a global install, check which package names it lists. projscan core does not need `node-gyp` grammar builds at runtime in 4.9.3. Open an issue with the warning text if npm reports install scripts from `projscan@latest`, or run `projscan feedback intake --text "<warning text>" --format json` to turn it into a focused setup-trust task.
419
+ If npm prints `allow-scripts` warnings during a global install, check which package names it lists. projscan core does not need `node-gyp` grammar builds at runtime in 4.11.1. Open an issue with the warning text if npm reports install scripts from `projscan@latest`, or run `projscan feedback intake --text "<warning text>" --format json` to turn it into a focused setup-trust task.
389
420
 
390
421
  The grammar packages are build-time sources, not global-install dependencies. Published grammar assets include `tree-sitter-python.wasm` and `tree-sitter-c_sharp.wasm`.
391
422
 
@@ -0,0 +1,3 @@
1
+ import type { AssessReport } from '../../types/assess.js';
2
+ export declare function registerAssess(): void;
3
+ export declare function renderAssessMarkdown(report: AssessReport): string;
@@ -0,0 +1,143 @@
1
+ import fs from 'node:fs/promises';
2
+ import chalk from 'chalk';
3
+ import { assertFormatSupported, getRootPath, maybeCompactBanner, program, setupLogLevel, } from '../_shared.js';
4
+ import { computeAssess } from '../../core/assess.js';
5
+ const ASSESS_MODES = ['standard', 'fix-first', 'ship-readiness'];
6
+ export function registerAssess() {
7
+ program
8
+ .command('assess')
9
+ .description('Run a proof-first codebase assessment with evidence-backed Proof Cards')
10
+ .option('--goal <text>', 'plain-language assessment goal')
11
+ .option('--mode <mode>', 'assessment mode: standard, fix-first, ship-readiness', parseMode)
12
+ .option('--max-cards <count>', 'maximum Proof Cards to return', parsePositiveInt)
13
+ .option('--baseline <path>', 'prior assess JSON file to compare risk delta against')
14
+ .action(async (cmdOpts) => {
15
+ setupLogLevel();
16
+ maybeCompactBanner();
17
+ const format = assertFormatSupported('assess');
18
+ try {
19
+ const report = await computeAssess(getRootPath(), {
20
+ goal: cmdOpts.goal,
21
+ mode: cmdOpts.mode,
22
+ maxCards: cmdOpts.maxCards,
23
+ ...(cmdOpts.baseline
24
+ ? {
25
+ baselineReport: await readAssessBaseline(cmdOpts.baseline),
26
+ baselinePath: cmdOpts.baseline,
27
+ }
28
+ : {}),
29
+ });
30
+ if (format === 'json') {
31
+ console.log(JSON.stringify(report, null, 2));
32
+ return;
33
+ }
34
+ if (format === 'markdown') {
35
+ console.log(renderAssessMarkdown(report));
36
+ return;
37
+ }
38
+ printAssessConsole(report);
39
+ }
40
+ catch (err) {
41
+ console.error(chalk.red(err instanceof Error ? err.message : String(err)));
42
+ process.exit(1);
43
+ }
44
+ });
45
+ }
46
+ function printAssessConsole(report) {
47
+ const color = report.verdict === 'blocked' ? chalk.red : report.verdict === 'watch' ? chalk.yellow : chalk.green;
48
+ console.log(color(`Projscan Assess: ${report.verdict}`));
49
+ console.log(report.summary);
50
+ console.log('');
51
+ console.log(chalk.bold('Fix First'));
52
+ console.log(report.fixFirst ? `- ${report.fixFirst.finding}` : '- Preserve the baseline');
53
+ console.log('');
54
+ console.log(chalk.bold('Verification'));
55
+ for (const command of report.answers.testsThatProveIt)
56
+ console.log(`- ${command}`);
57
+ }
58
+ export function renderAssessMarkdown(report) {
59
+ const lines = [];
60
+ lines.push('# Projscan Assess');
61
+ lines.push('');
62
+ lines.push(`- **Verdict:** ${report.verdict}`);
63
+ lines.push(`- **Mode:** ${report.mode}`);
64
+ lines.push(`- **Goal:** ${report.goal}`);
65
+ lines.push(`- **Summary:** ${report.summary}`);
66
+ if (report.baselineComparison)
67
+ lines.push(`- **Baseline:** ${report.baselineComparison.summary}`);
68
+ lines.push('');
69
+ lines.push('## Answers');
70
+ lines.push('');
71
+ lines.push(`- **Actually risky:** ${report.answers.actuallyRisky}`);
72
+ lines.push(`- **Why risky:** ${report.answers.whyRisky}`);
73
+ lines.push(`- **Fix first:** ${report.answers.fixFirst}`);
74
+ lines.push(`- **Safest change:** ${report.answers.safestChange}`);
75
+ lines.push(`- **Risk removed:** ${report.answers.riskRemoved}`);
76
+ lines.push(`- **Ship now:** ${report.answers.shipNow}`);
77
+ lines.push('');
78
+ lines.push('## Proof Cards');
79
+ lines.push('');
80
+ for (const card of report.proofCards)
81
+ renderProofCard(lines, card);
82
+ if (report.proofCards.length === 0)
83
+ lines.push('- No proof-backed actions outrank baseline verification.');
84
+ lines.push('');
85
+ lines.push('## Verification');
86
+ lines.push('');
87
+ for (const command of report.answers.testsThatProveIt)
88
+ lines.push(`- \`${command}\``);
89
+ lines.push('');
90
+ lines.push('## Next Commands');
91
+ lines.push('');
92
+ for (const command of report.commands)
93
+ lines.push(`- \`${command}\``);
94
+ return lines.join('\n');
95
+ }
96
+ function renderProofCard(lines, card) {
97
+ lines.push(`### ${card.finding}`);
98
+ lines.push('');
99
+ lines.push(`- **Priority:** ${card.priority}`);
100
+ lines.push(`- **Confidence:** ${card.confidence}`);
101
+ lines.push(`- **Why it matters:** ${card.whyItMatters}`);
102
+ if (card.files.length > 0)
103
+ lines.push(`- **Files:** ${card.files.join(', ')}`);
104
+ lines.push(`- **Recommended fix:** ${card.recommendedFix.summary}`);
105
+ lines.push(`- **Safe change:** ${card.recommendedFix.safeChangeShape}`);
106
+ lines.push(`- **Risk delta:** ${card.riskDelta.delta}`);
107
+ lines.push('- **Evidence:**');
108
+ for (const evidence of card.evidence) {
109
+ const file = evidence.file ? ` (${evidence.file})` : '';
110
+ lines.push(` - ${evidence.source}: ${evidence.detail}${file}`);
111
+ }
112
+ lines.push('- **Commands:**');
113
+ for (const command of card.verification.commands)
114
+ lines.push(` - \`${command}\``);
115
+ lines.push('');
116
+ }
117
+ function parseMode(value) {
118
+ if (ASSESS_MODES.includes(value))
119
+ return value;
120
+ throw new Error(`mode must be one of: ${ASSESS_MODES.join(', ')}`);
121
+ }
122
+ function parsePositiveInt(value) {
123
+ const parsed = Number.parseInt(value, 10);
124
+ if (!Number.isFinite(parsed) || parsed <= 0) {
125
+ throw new Error('value must be a positive integer');
126
+ }
127
+ return parsed;
128
+ }
129
+ async function readAssessBaseline(filePath) {
130
+ try {
131
+ const parsed = JSON.parse(await fs.readFile(filePath, 'utf-8'));
132
+ if (parsed.schemaVersion !== 1 ||
133
+ !parsed.riskDelta ||
134
+ typeof parsed.riskDelta.projectedScore !== 'number') {
135
+ throw new Error('invalid assess baseline shape');
136
+ }
137
+ return parsed;
138
+ }
139
+ catch (err) {
140
+ throw new Error(`Could not read assess baseline ${filePath}: ${err instanceof Error ? err.message : 'invalid JSON'}`, { cause: err });
141
+ }
142
+ }
143
+ //# sourceMappingURL=assess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assess.js","sourceRoot":"","sources":["../../../src/cli/commands/assess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SimulateReport } from '../../types/simulate.js';
2
+ export declare function registerSimulate(): void;
3
+ export declare function renderSimulateMarkdown(report: SimulateReport): string;
@@ -0,0 +1,125 @@
1
+ import chalk from 'chalk';
2
+ import { assertFormatSupported, getRootPath, maybeCompactBanner, program, setupLogLevel, } from '../_shared.js';
3
+ import { computeSimulation } from '../../core/simulate.js';
4
+ export function registerSimulate() {
5
+ program
6
+ .command('simulate')
7
+ .description('Simulate a proposed change plan with local evidence and projected risk delta')
8
+ .requiredOption('--plan <text>', 'plain-language change plan to simulate')
9
+ .option('--max-files <count>', 'maximum likely touched files to return', parsePositiveInt)
10
+ .action(async (cmdOpts) => {
11
+ setupLogLevel();
12
+ maybeCompactBanner();
13
+ const format = assertFormatSupported('simulate');
14
+ try {
15
+ const report = await computeSimulation(getRootPath(), {
16
+ plan: cmdOpts.plan,
17
+ maxFiles: cmdOpts.maxFiles,
18
+ });
19
+ if (format === 'json') {
20
+ console.log(JSON.stringify(report, null, 2));
21
+ return;
22
+ }
23
+ if (format === 'markdown') {
24
+ console.log(renderSimulateMarkdown(report));
25
+ return;
26
+ }
27
+ printSimulateConsole(report);
28
+ }
29
+ catch (err) {
30
+ console.error(chalk.red(err instanceof Error ? err.message : String(err)));
31
+ process.exit(1);
32
+ }
33
+ });
34
+ }
35
+ function printSimulateConsole(report) {
36
+ const color = report.verdict === 'worth-doing'
37
+ ? chalk.green
38
+ : report.verdict === 'needs-more-evidence'
39
+ ? chalk.yellow
40
+ : chalk.gray;
41
+ console.log(color(`Projscan Simulate: ${report.verdict}`));
42
+ console.log(report.summary);
43
+ console.log('');
44
+ console.log(chalk.bold('Files Likely Touched'));
45
+ if (report.filesLikelyTouched.length === 0)
46
+ console.log('- No concrete file matched the plan');
47
+ for (const file of report.filesLikelyTouched)
48
+ console.log(renderCandidateConsole(file));
49
+ console.log('');
50
+ console.log(chalk.bold('Proof Commands'));
51
+ for (const command of report.proofCommands.slice(0, 6))
52
+ console.log(`- ${command}`);
53
+ }
54
+ export function renderSimulateMarkdown(report) {
55
+ const lines = [];
56
+ lines.push('# Projscan Simulate');
57
+ lines.push('');
58
+ lines.push(`- **Verdict:** ${report.verdict}`);
59
+ lines.push(`- **Confidence:** ${report.confidence}`);
60
+ lines.push(`- **Plan:** ${report.plan}`);
61
+ lines.push(`- **Summary:** ${report.summary}`);
62
+ lines.push(`- **Risk delta:** +${report.riskDelta.delta}`);
63
+ lines.push('');
64
+ lines.push('## Files Likely Touched');
65
+ lines.push('');
66
+ if (report.filesLikelyTouched.length === 0) {
67
+ lines.push('- No concrete file matched the plan.');
68
+ }
69
+ else {
70
+ for (const file of report.filesLikelyTouched) {
71
+ lines.push(`- **${file.path}** (${file.score})`);
72
+ for (const reason of file.reasons)
73
+ lines.push(` - ${reason}`);
74
+ }
75
+ }
76
+ lines.push('');
77
+ lines.push('## Tests Likely Affected');
78
+ lines.push('');
79
+ if (report.testsLikelyAffected.length === 0)
80
+ lines.push('- Add or identify a regression test first.');
81
+ for (const test of report.testsLikelyAffected)
82
+ lines.push(`- \`${test}\``);
83
+ lines.push('');
84
+ lines.push('## Contracts Likely Affected');
85
+ lines.push('');
86
+ if (report.contractsLikelyAffected.length === 0)
87
+ lines.push('- No public contract inferred.');
88
+ for (const contract of report.contractsLikelyAffected)
89
+ lines.push(`- ${contract}`);
90
+ lines.push('');
91
+ lines.push('## Rollout Plan');
92
+ lines.push('');
93
+ for (const step of report.rolloutPlan) {
94
+ lines.push(`### ${step.title}`);
95
+ lines.push('');
96
+ lines.push(step.detail);
97
+ lines.push('');
98
+ for (const command of step.commands)
99
+ lines.push(`- \`${command}\``);
100
+ lines.push('');
101
+ }
102
+ lines.push('## Proof Commands');
103
+ lines.push('');
104
+ for (const command of report.proofCommands)
105
+ lines.push(`- \`${command}\``);
106
+ if (report.warnings.length > 0) {
107
+ lines.push('');
108
+ lines.push('## Warnings');
109
+ lines.push('');
110
+ for (const warning of report.warnings)
111
+ lines.push(`- ${warning}`);
112
+ }
113
+ return lines.join('\n');
114
+ }
115
+ function renderCandidateConsole(file) {
116
+ return `- ${file.path} (${file.score}): ${file.reasons[0] ?? 'local evidence'}`;
117
+ }
118
+ function parsePositiveInt(value) {
119
+ const parsed = Number.parseInt(value, 10);
120
+ if (!Number.isFinite(parsed) || parsed <= 0) {
121
+ throw new Error('value must be a positive integer');
122
+ }
123
+ return parsed;
124
+ }
125
+ //# sourceMappingURL=simulate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../../src/cli/commands/simulate.ts"],"names":[],"mappings":"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"}
@@ -48,6 +48,8 @@ import { registerFeedback } from './commands/feedback.js';
48
48
  import { registerRegressionPlan } from './commands/regressionPlan.js';
49
49
  import { registerAgentBrief } from './commands/agentBrief.js';
50
50
  import { registerQualityScorecard } from './commands/qualityScorecard.js';
51
+ import { registerAssess } from './commands/assess.js';
52
+ import { registerSimulate } from './commands/simulate.js';
51
53
  import { registerFirstRun, registerRecipes } from './commands/recipes.js';
52
54
  import { registerStart } from './commands/start.js';
53
55
  import { registerTrial } from './commands/trial.js';
@@ -107,6 +109,8 @@ export const CLI_COMMAND_REGISTRARS = [
107
109
  registerRegressionPlan,
108
110
  registerAgentBrief,
109
111
  registerQualityScorecard,
112
+ registerAssess,
113
+ registerSimulate,
110
114
  registerStart,
111
115
  registerTrial,
112
116
  registerTelemetry,
@@ -1 +1 @@
1
- {"version":3,"file":"registerCommands.js","sourceRoot":"","sources":["../../src/cli/registerCommands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registerCommands.js","sourceRoot":"","sources":["../../src/cli/registerCommands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AssessMode, AssessReport } from '../types/assess.js';
2
+ export interface ComputeAssessOptions {
3
+ goal?: string;
4
+ mode?: AssessMode;
5
+ maxCards?: number;
6
+ baselineReport?: AssessReport;
7
+ baselinePath?: string;
8
+ }
9
+ export declare function computeAssess(rootPath: string, options?: ComputeAssessOptions): Promise<AssessReport>;