projscan 4.14.0 → 4.15.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.
Files changed (186) hide show
  1. package/README.md +71 -21
  2. package/dist/cli/commands/evidencePack.js +2 -0
  3. package/dist/cli/commands/evidencePack.js.map +1 -1
  4. package/dist/cli/commands/prove.js +172 -23
  5. package/dist/cli/commands/prove.js.map +1 -1
  6. package/dist/cli/commands/startConsole.d.ts +2 -2
  7. package/dist/cli/commands/startConsole.js +2 -260
  8. package/dist/cli/commands/startConsole.js.map +1 -1
  9. package/dist/cli/commands/startConsoleExecution.d.ts +5 -0
  10. package/dist/cli/commands/startConsoleExecution.js +108 -0
  11. package/dist/cli/commands/startConsoleExecution.js.map +1 -0
  12. package/dist/cli/commands/startConsoleMission.d.ts +6 -0
  13. package/dist/cli/commands/startConsoleMission.js +157 -0
  14. package/dist/cli/commands/startConsoleMission.js.map +1 -0
  15. package/dist/cli/commands/startMissionBundle.js +24 -27
  16. package/dist/cli/commands/startMissionBundle.js.map +1 -1
  17. package/dist/core/adoption.d.ts +8 -81
  18. package/dist/core/adoption.js +4 -549
  19. package/dist/core/adoption.js.map +1 -1
  20. package/dist/core/adoptionFirstRunDiagnostics.d.ts +20 -0
  21. package/dist/core/adoptionFirstRunDiagnostics.js +240 -0
  22. package/dist/core/adoptionFirstRunDiagnostics.js.map +1 -0
  23. package/dist/core/adoptionMcpConfig.d.ts +27 -0
  24. package/dist/core/adoptionMcpConfig.js +123 -0
  25. package/dist/core/adoptionMcpConfig.js.map +1 -0
  26. package/dist/core/adoptionMcpDoctor.d.ts +23 -0
  27. package/dist/core/adoptionMcpDoctor.js +87 -0
  28. package/dist/core/adoptionMcpDoctor.js.map +1 -0
  29. package/dist/core/adoptionWorkflowRecipes.d.ts +14 -0
  30. package/dist/core/adoptionWorkflowRecipes.js +110 -0
  31. package/dist/core/adoptionWorkflowRecipes.js.map +1 -0
  32. package/dist/core/bugHunt.js +26 -255
  33. package/dist/core/bugHunt.js.map +1 -1
  34. package/dist/core/bugHuntPreflightFindings.d.ts +2 -1
  35. package/dist/core/bugHuntPreflightFindings.js +20 -0
  36. package/dist/core/bugHuntPreflightFindings.js.map +1 -1
  37. package/dist/core/bugHuntReportAssembly.d.ts +20 -0
  38. package/dist/core/bugHuntReportAssembly.js +179 -0
  39. package/dist/core/bugHuntReportAssembly.js.map +1 -0
  40. package/dist/core/bugHuntSourceFindings.d.ts +3 -0
  41. package/dist/core/bugHuntSourceFindings.js +61 -0
  42. package/dist/core/bugHuntSourceFindings.js.map +1 -0
  43. package/dist/core/dogfood.js +4 -393
  44. package/dist/core/dogfood.js.map +1 -1
  45. package/dist/core/dogfoodMarketValidation.d.ts +5 -0
  46. package/dist/core/dogfoodMarketValidation.js +265 -0
  47. package/dist/core/dogfoodMarketValidation.js.map +1 -0
  48. package/dist/core/dogfoodRepoEvaluation.d.ts +4 -0
  49. package/dist/core/dogfoodRepoEvaluation.js +137 -0
  50. package/dist/core/dogfoodRepoEvaluation.js.map +1 -0
  51. package/dist/core/evidenceComment.js +50 -13
  52. package/dist/core/evidenceComment.js.map +1 -1
  53. package/dist/core/feedback.js +2 -252
  54. package/dist/core/feedback.js.map +1 -1
  55. package/dist/core/feedbackIntakeClassifier.d.ts +2 -0
  56. package/dist/core/feedbackIntakeClassifier.js +255 -0
  57. package/dist/core/feedbackIntakeClassifier.js.map +1 -0
  58. package/dist/core/intentRouterKeywordToolGuards.js +1 -55
  59. package/dist/core/intentRouterKeywordToolGuards.js.map +1 -1
  60. package/dist/core/intentRouterKeywordWeights.js +13 -28
  61. package/dist/core/intentRouterKeywordWeights.js.map +1 -1
  62. package/dist/core/intentRouterProductGuardSignals.d.ts +3 -0
  63. package/dist/core/intentRouterProductGuardSignals.js +59 -0
  64. package/dist/core/intentRouterProductGuardSignals.js.map +1 -0
  65. package/dist/core/markdownSafety.d.ts +3 -0
  66. package/dist/core/markdownSafety.js +14 -0
  67. package/dist/core/markdownSafety.js.map +1 -0
  68. package/dist/core/preflight.d.ts +2 -0
  69. package/dist/core/preflight.js.map +1 -1
  70. package/dist/core/preflightChangedFiles.d.ts +2 -0
  71. package/dist/core/preflightChangedFiles.js +1 -1
  72. package/dist/core/preflightChangedFiles.js.map +1 -1
  73. package/dist/core/preflightInputs.d.ts +2 -0
  74. package/dist/core/preflightInputs.js +5 -2
  75. package/dist/core/preflightInputs.js.map +1 -1
  76. package/dist/core/proofLedger.d.ts +5 -1
  77. package/dist/core/proofLedger.js +161 -12
  78. package/dist/core/proofLedger.js.map +1 -1
  79. package/dist/core/proofReplay.d.ts +9 -0
  80. package/dist/core/proofReplay.js +164 -0
  81. package/dist/core/proofReplay.js.map +1 -0
  82. package/dist/core/proofSufficiency.d.ts +19 -0
  83. package/dist/core/proofSufficiency.js +425 -0
  84. package/dist/core/proofSufficiency.js.map +1 -0
  85. package/dist/core/prove.d.ts +6 -0
  86. package/dist/core/prove.js +277 -87
  87. package/dist/core/prove.js.map +1 -1
  88. package/dist/core/qualityScorecard.js +8 -238
  89. package/dist/core/qualityScorecard.js.map +1 -1
  90. package/dist/core/qualityScorecardDimensions.d.ts +14 -0
  91. package/dist/core/qualityScorecardDimensions.js +99 -0
  92. package/dist/core/qualityScorecardDimensions.js.map +1 -0
  93. package/dist/core/qualityScorecardRisks.d.ts +8 -0
  94. package/dist/core/qualityScorecardRisks.js +107 -0
  95. package/dist/core/qualityScorecardRisks.js.map +1 -0
  96. package/dist/core/qualityScorecardSignals.d.ts +20 -0
  97. package/dist/core/qualityScorecardSignals.js +59 -0
  98. package/dist/core/qualityScorecardSignals.js.map +1 -0
  99. package/dist/core/releaseEvidence.d.ts +1 -0
  100. package/dist/core/releaseEvidence.js +15 -40
  101. package/dist/core/releaseEvidence.js.map +1 -1
  102. package/dist/core/releaseEvidenceBaseline.js +4 -1
  103. package/dist/core/releaseEvidenceBaseline.js.map +1 -1
  104. package/dist/core/releaseEvidenceProofReceipt.d.ts +6 -0
  105. package/dist/core/releaseEvidenceProofReceipt.js +140 -0
  106. package/dist/core/releaseEvidenceProofReceipt.js.map +1 -0
  107. package/dist/core/releaseEvidenceVerdict.d.ts +5 -2
  108. package/dist/core/releaseEvidenceVerdict.js +39 -1
  109. package/dist/core/releaseEvidenceVerdict.js.map +1 -1
  110. package/dist/core/repositoryScanner.d.ts +1 -0
  111. package/dist/core/repositoryScanner.js +5 -4
  112. package/dist/core/repositoryScanner.js.map +1 -1
  113. package/dist/core/sessionResources.d.ts +14 -2
  114. package/dist/core/sessionResources.js +3 -3
  115. package/dist/core/sessionResources.js.map +1 -1
  116. package/dist/core/startInputs.d.ts +1 -1
  117. package/dist/core/startIntentTargets.d.ts +1 -1
  118. package/dist/core/startIntentTargets.js +1 -16
  119. package/dist/core/startIntentTargets.js.map +1 -1
  120. package/dist/core/startMissionInputStatusPolicy.d.ts +7 -0
  121. package/dist/core/startMissionInputStatusPolicy.js +74 -0
  122. package/dist/core/startMissionInputStatusPolicy.js.map +1 -0
  123. package/dist/core/startMissionPolicy.d.ts +6 -15
  124. package/dist/core/startMissionPolicy.js +4 -305
  125. package/dist/core/startMissionPolicy.js.map +1 -1
  126. package/dist/core/startMissionProofPolicy.d.ts +6 -0
  127. package/dist/core/startMissionProofPolicy.js +84 -0
  128. package/dist/core/startMissionProofPolicy.js.map +1 -0
  129. package/dist/core/startMissionRiskPolicy.d.ts +4 -0
  130. package/dist/core/startMissionRiskPolicy.js +85 -0
  131. package/dist/core/startMissionRiskPolicy.js.map +1 -0
  132. package/dist/core/startMissionRoutingPolicy.d.ts +6 -0
  133. package/dist/core/startMissionRoutingPolicy.js +67 -0
  134. package/dist/core/startMissionRoutingPolicy.js.map +1 -0
  135. package/dist/core/startMode.d.ts +1 -2
  136. package/dist/core/startMode.js +4 -151
  137. package/dist/core/startMode.js.map +1 -1
  138. package/dist/core/startModeIntentPolicy.d.ts +12 -0
  139. package/dist/core/startModeIntentPolicy.js +41 -0
  140. package/dist/core/startModeIntentPolicy.js.map +1 -0
  141. package/dist/core/startModeRoutingPolicy.d.ts +4 -0
  142. package/dist/core/startModeRoutingPolicy.js +117 -0
  143. package/dist/core/startModeRoutingPolicy.js.map +1 -0
  144. package/dist/core/startSearchQueryTargets.d.ts +1 -0
  145. package/dist/core/startSearchQueryTargets.js +17 -0
  146. package/dist/core/startSearchQueryTargets.js.map +1 -0
  147. package/dist/core/workplan.d.ts +3 -2
  148. package/dist/core/workplan.js +11 -585
  149. package/dist/core/workplan.js.map +1 -1
  150. package/dist/core/workplanCoordinationTasks.d.ts +3 -0
  151. package/dist/core/workplanCoordinationTasks.js +82 -0
  152. package/dist/core/workplanCoordinationTasks.js.map +1 -0
  153. package/dist/core/workplanModeTasks.d.ts +2 -0
  154. package/dist/core/workplanModeTasks.js +192 -0
  155. package/dist/core/workplanModeTasks.js.map +1 -0
  156. package/dist/core/workplanPreflightTasks.d.ts +2 -0
  157. package/dist/core/workplanPreflightTasks.js +126 -0
  158. package/dist/core/workplanPreflightTasks.js.map +1 -0
  159. package/dist/core/workplanQualitySignals.d.ts +7 -0
  160. package/dist/core/workplanQualitySignals.js +63 -0
  161. package/dist/core/workplanQualitySignals.js.map +1 -0
  162. package/dist/core/workplanReport.d.ts +4 -0
  163. package/dist/core/workplanReport.js +79 -0
  164. package/dist/core/workplanReport.js.map +1 -0
  165. package/dist/core/workplanRiskOwnership.d.ts +5 -0
  166. package/dist/core/workplanRiskOwnership.js +97 -0
  167. package/dist/core/workplanRiskOwnership.js.map +1 -0
  168. package/dist/core/workplanSuggestedActions.d.ts +2 -0
  169. package/dist/core/workplanSuggestedActions.js +43 -0
  170. package/dist/core/workplanSuggestedActions.js.map +1 -0
  171. package/dist/mcp/tools/prove.js +23 -17
  172. package/dist/mcp/tools/prove.js.map +1 -1
  173. package/dist/projscan-sbom.cdx.json +6 -6
  174. package/dist/tool-manifest.json +2 -2
  175. package/dist/types/config.d.ts +15 -0
  176. package/dist/types/evidencePack.d.ts +21 -0
  177. package/dist/types/prove.d.ts +79 -0
  178. package/dist/utils/changedFiles.js +57 -16
  179. package/dist/utils/changedFiles.js.map +1 -1
  180. package/dist/utils/config.js +2 -0
  181. package/dist/utils/config.js.map +1 -1
  182. package/dist/utils/configProofRecipes.d.ts +2 -0
  183. package/dist/utils/configProofRecipes.js +91 -0
  184. package/dist/utils/configProofRecipes.js.map +1 -0
  185. package/docs/GUIDE.md +120 -19
  186. package/package.json +1 -1
@@ -0,0 +1,240 @@
1
+ import { execFile } from 'node:child_process';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import { INSTALL } from './adoptionMcpConfig.js';
6
+ import { buildFirstTenMinutes } from './onboarding.js';
7
+ import { PLUGIN_PREVIEW_FLAG, discoverPluginManifests } from './plugins.js';
8
+ const execFileAsync = promisify(execFile);
9
+ export async function computeFirstRunDiagnostics(rootPath) {
10
+ const diagnostics = [
11
+ checkNodeVersion(),
12
+ await checkPackageJson(rootPath),
13
+ await checkGit(rootPath),
14
+ await checkConfig(rootPath),
15
+ await checkTreeSitter(rootPath),
16
+ await checkPlugins(rootPath),
17
+ checkMcpStartup(),
18
+ ];
19
+ const overall = summarizeDiagnostics(diagnostics);
20
+ const firstTenMinutes = buildFirstTenMinutes();
21
+ return {
22
+ schemaVersion: 1,
23
+ rootPath,
24
+ overall,
25
+ diagnostics,
26
+ firstTenMinutes,
27
+ nextCommands: dedupeCommands([
28
+ ...firstTenMinutes.commands.map((step) => step.command),
29
+ 'projscan init mcp --client all',
30
+ 'projscan recipes',
31
+ 'projscan preflight --mode before_edit --format json',
32
+ 'projscan doctor',
33
+ ]),
34
+ };
35
+ }
36
+ export function checkNodeVersion() {
37
+ const major = Number.parseInt(process.versions.node.split('.')[0] ?? '0', 10);
38
+ if (Number.isFinite(major) && major >= 18) {
39
+ return {
40
+ id: 'node',
41
+ label: 'Node.js',
42
+ status: 'pass',
43
+ summary: `Node ${process.versions.node} satisfies projscan's >=18 requirement.`,
44
+ };
45
+ }
46
+ return {
47
+ id: 'node',
48
+ label: 'Node.js',
49
+ status: 'fail',
50
+ summary: `Node ${process.versions.node} is below projscan's >=18 requirement.`,
51
+ command: 'node --version',
52
+ };
53
+ }
54
+ async function checkPackageJson(rootPath) {
55
+ const file = path.join(rootPath, 'package.json');
56
+ try {
57
+ const raw = await fs.readFile(file, 'utf-8');
58
+ const parsed = JSON.parse(raw);
59
+ const name = typeof parsed.name === 'string' ? parsed.name : path.basename(rootPath);
60
+ const scripts = parsed.scripts && typeof parsed.scripts === 'object' ? Object.keys(parsed.scripts).length : 0;
61
+ return {
62
+ id: 'package-json',
63
+ label: 'Package metadata',
64
+ status: 'pass',
65
+ summary: `Found package.json for ${name}.`,
66
+ detail: scripts > 0
67
+ ? `${scripts} npm script(s) detected for release/test recipes.`
68
+ : 'No npm scripts detected.',
69
+ };
70
+ }
71
+ catch (err) {
72
+ return {
73
+ id: 'package-json',
74
+ label: 'Package metadata',
75
+ status: 'warn',
76
+ summary: 'No readable package.json found; Node dependency and script checks will be limited.',
77
+ detail: err instanceof Error ? err.message : String(err),
78
+ };
79
+ }
80
+ }
81
+ async function checkGit(rootPath) {
82
+ let inside;
83
+ try {
84
+ inside = await git(rootPath, ['rev-parse', '--is-inside-work-tree']);
85
+ }
86
+ catch (err) {
87
+ return {
88
+ id: 'git',
89
+ label: 'Git',
90
+ status: 'warn',
91
+ summary: 'Git metadata is unavailable.',
92
+ detail: err instanceof Error ? err.message : String(err),
93
+ command: 'git rev-parse --is-inside-work-tree',
94
+ };
95
+ }
96
+ if (inside.stdout.trim() !== 'true') {
97
+ return {
98
+ id: 'git',
99
+ label: 'Git',
100
+ status: 'warn',
101
+ summary: 'This directory is not inside a Git worktree.',
102
+ detail: 'Review, changed-file, and pre-merge recipes need Git history.',
103
+ };
104
+ }
105
+ let status;
106
+ try {
107
+ status = await git(rootPath, ['status', '--short']);
108
+ }
109
+ catch (err) {
110
+ return {
111
+ id: 'git',
112
+ label: 'Git',
113
+ status: 'warn',
114
+ summary: 'Git worktree detected, but status is unavailable.',
115
+ detail: formatGitError(err),
116
+ command: 'git status --short',
117
+ };
118
+ }
119
+ const remote = await git(rootPath, ['remote']).catch((err) => err);
120
+ const dirty = status.stdout.trim().length > 0;
121
+ return {
122
+ id: 'git',
123
+ label: 'Git',
124
+ status: dirty ? 'warn' : 'pass',
125
+ summary: dirty ? 'Git worktree has local changes.' : 'Git worktree detected and clean.',
126
+ detail: gitRemoteDetail(remote),
127
+ };
128
+ }
129
+ function gitRemoteDetail(remote) {
130
+ if (isGitResult(remote)) {
131
+ return remote.stdout.trim().length > 0
132
+ ? `Remotes: ${remote.stdout.trim().split(/\s+/).join(', ')}`
133
+ : 'No git remote configured.';
134
+ }
135
+ return `Remote metadata unavailable: ${formatGitError(remote)}`;
136
+ }
137
+ function isGitResult(value) {
138
+ return typeof value === 'object' && value !== null && 'stdout' in value && !('code' in value);
139
+ }
140
+ function formatGitError(err) {
141
+ return err instanceof Error ? err.message.trim() : String(err);
142
+ }
143
+ async function checkConfig(rootPath) {
144
+ try {
145
+ await fs.access(path.join(rootPath, '.projscanrc.json'));
146
+ return {
147
+ id: 'projscan-config',
148
+ label: 'projscan config',
149
+ status: 'pass',
150
+ summary: 'Found .projscanrc.json.',
151
+ };
152
+ }
153
+ catch {
154
+ return {
155
+ id: 'projscan-config',
156
+ label: 'projscan config',
157
+ status: 'info',
158
+ summary: 'No .projscanrc.json yet; defaults are fine for first use.',
159
+ command: 'projscan init',
160
+ };
161
+ }
162
+ }
163
+ async function checkTreeSitter(rootPath) {
164
+ const candidates = [
165
+ path.join(rootPath, 'node_modules', 'web-tree-sitter', 'tree-sitter.wasm'),
166
+ path.join(rootPath, 'dist', 'grammars', 'web-tree-sitter.wasm'),
167
+ ];
168
+ for (const candidate of candidates) {
169
+ try {
170
+ await fs.access(candidate);
171
+ return {
172
+ id: 'tree-sitter',
173
+ label: 'Tree-sitter runtime',
174
+ status: 'pass',
175
+ summary: 'Tree-sitter WASM runtime is present.',
176
+ };
177
+ }
178
+ catch {
179
+ // try next
180
+ }
181
+ }
182
+ return {
183
+ id: 'tree-sitter',
184
+ label: 'Tree-sitter runtime',
185
+ status: 'info',
186
+ summary: 'Tree-sitter runtime was not found in this project checkout.',
187
+ detail: 'This is normal when using npx; projscan ships its runtime with the package.',
188
+ };
189
+ }
190
+ async function checkPlugins(rootPath) {
191
+ const entries = await discoverPluginManifests(rootPath);
192
+ if (entries.length === 0) {
193
+ return {
194
+ id: 'plugins',
195
+ label: 'Local plugins',
196
+ status: 'info',
197
+ summary: 'No local plugin manifests found.',
198
+ detail: `Set ${PLUGIN_PREVIEW_FLAG}=1 only when you want projscan to execute trusted local plugins.`,
199
+ command: 'projscan plugin init --kind analyzer --name policy',
200
+ };
201
+ }
202
+ const broken = entries.filter((entry) => entry.manifest === null);
203
+ return {
204
+ id: 'plugins',
205
+ label: 'Local plugins',
206
+ status: broken.length > 0 ? 'warn' : 'pass',
207
+ summary: broken.length > 0
208
+ ? `${broken.length} of ${entries.length} plugin manifest(s) need attention.`
209
+ : `${entries.length} plugin manifest(s) validate.`,
210
+ command: 'projscan plugin list',
211
+ };
212
+ }
213
+ function checkMcpStartup() {
214
+ return {
215
+ id: 'mcp-startup',
216
+ label: 'MCP startup',
217
+ status: 'pass',
218
+ summary: 'Use stdio startup for every MCP client.',
219
+ detail: INSTALL.mcpServerCommand,
220
+ command: 'npx -y projscan mcp',
221
+ };
222
+ }
223
+ function summarizeDiagnostics(diagnostics) {
224
+ if (diagnostics.some((diagnostic) => diagnostic.status === 'fail'))
225
+ return 'fail';
226
+ if (diagnostics.some((diagnostic) => diagnostic.status === 'warn'))
227
+ return 'warn';
228
+ return 'pass';
229
+ }
230
+ function dedupeCommands(commands) {
231
+ return [...new Set(commands)];
232
+ }
233
+ async function git(rootPath, args) {
234
+ return execFileAsync('git', args, {
235
+ cwd: rootPath,
236
+ timeout: 5000,
237
+ maxBuffer: 1024 * 1024,
238
+ });
239
+ }
240
+ //# sourceMappingURL=adoptionFirstRunDiagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adoptionFirstRunDiagnostics.js","sourceRoot":"","sources":["../../src/core/adoptionFirstRunDiagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare const MCP_CLIENT_IDS: readonly ["all", "claude-desktop", "claude-code", "cursor", "codex", "continue", "windsurf", "cline", "zed", "gemini"];
2
+ export type McpClientId = (typeof MCP_CLIENT_IDS)[number];
3
+ export type SingleMcpClientId = Exclude<McpClientId, 'all'>;
4
+ export interface McpConfigInstall {
5
+ command: string;
6
+ runWithoutInstall: string;
7
+ mcpServerCommand: string;
8
+ }
9
+ export interface McpConfigGuide {
10
+ schemaVersion: 1;
11
+ client: SingleMcpClientId;
12
+ displayName: string;
13
+ whereToPaste: string;
14
+ install: McpConfigInstall;
15
+ config: Record<string, unknown>;
16
+ configText: string;
17
+ notes: string[];
18
+ }
19
+ export interface McpConfigCatalog {
20
+ schemaVersion: 1;
21
+ client: 'all';
22
+ install: McpConfigInstall;
23
+ configs: McpConfigGuide[];
24
+ }
25
+ export declare const INSTALL: McpConfigInstall;
26
+ export declare function isMcpClientId(value: unknown): value is McpClientId;
27
+ export declare function getMcpConfigGuide(client?: McpClientId): McpConfigCatalog | McpConfigGuide;
@@ -0,0 +1,123 @@
1
+ export const MCP_CLIENT_IDS = [
2
+ 'all',
3
+ 'claude-desktop',
4
+ 'claude-code',
5
+ 'cursor',
6
+ 'codex',
7
+ 'continue',
8
+ 'windsurf',
9
+ 'cline',
10
+ 'zed',
11
+ 'gemini',
12
+ ];
13
+ export const INSTALL = {
14
+ command: 'npm install -g projscan',
15
+ runWithoutInstall: 'npx projscan',
16
+ mcpServerCommand: 'npx -y projscan mcp',
17
+ };
18
+ const SERVER = {
19
+ command: 'npx',
20
+ args: ['-y', 'projscan', 'mcp'],
21
+ };
22
+ const CLIENTS = {
23
+ 'claude-desktop': {
24
+ client: 'claude-desktop',
25
+ displayName: 'Claude Desktop',
26
+ whereToPaste: 'Claude Desktop MCP settings JSON.',
27
+ config: { mcpServers: { projscan: SERVER } },
28
+ configText: JSON.stringify({ mcpServers: { projscan: SERVER } }, null, 2),
29
+ notes: ['Restart Claude Desktop after saving the config.'],
30
+ },
31
+ 'claude-code': {
32
+ client: 'claude-code',
33
+ displayName: 'Claude Code',
34
+ whereToPaste: 'Claude Code MCP server settings.',
35
+ config: { mcpServers: { projscan: SERVER } },
36
+ configText: JSON.stringify({ mcpServers: { projscan: SERVER } }, null, 2),
37
+ notes: ['Keep projscan as a stdio server so code never leaves the repo.'],
38
+ },
39
+ cursor: {
40
+ client: 'cursor',
41
+ displayName: 'Cursor',
42
+ whereToPaste: 'Cursor MCP settings, usually `.cursor/mcp.json` or Settings > MCP.',
43
+ config: { mcpServers: { projscan: SERVER } },
44
+ configText: JSON.stringify({ mcpServers: { projscan: SERVER } }, null, 2),
45
+ notes: ['Open a repo before invoking projscan tools so the server starts in the project root.'],
46
+ },
47
+ codex: {
48
+ client: 'codex',
49
+ displayName: 'Codex CLI',
50
+ whereToPaste: 'Codex MCP server configuration.',
51
+ config: { mcpServers: { projscan: SERVER } },
52
+ configText: [
53
+ '[mcp_servers.projscan]',
54
+ 'command = "npx"',
55
+ 'args = ["-y", "projscan", "mcp"]',
56
+ ].join('\n'),
57
+ notes: ['Use this as a local stdio MCP server config; no projscan API key is required.'],
58
+ },
59
+ continue: {
60
+ client: 'continue',
61
+ displayName: 'Continue',
62
+ whereToPaste: 'Continue MCP server config.',
63
+ config: { mcpServers: { projscan: SERVER } },
64
+ configText: JSON.stringify({ mcpServers: { projscan: SERVER } }, null, 2),
65
+ notes: ['Use alongside Continue context providers when agents need structured repo evidence.'],
66
+ },
67
+ windsurf: {
68
+ client: 'windsurf',
69
+ displayName: 'Windsurf',
70
+ whereToPaste: 'Windsurf MCP settings.',
71
+ config: { mcpServers: { projscan: SERVER } },
72
+ configText: JSON.stringify({ mcpServers: { projscan: SERVER } }, null, 2),
73
+ notes: ['Run `projscan first-run` in the target repo if tools fail to start.'],
74
+ },
75
+ cline: {
76
+ client: 'cline',
77
+ displayName: 'Cline',
78
+ whereToPaste: 'Cline MCP settings JSON.',
79
+ config: { mcpServers: { projscan: SERVER } },
80
+ configText: JSON.stringify({ mcpServers: { projscan: SERVER } }, null, 2),
81
+ notes: ['Keep the command as `npx` so Cline can launch the published server directly.'],
82
+ },
83
+ zed: {
84
+ client: 'zed',
85
+ displayName: 'Zed',
86
+ whereToPaste: 'Zed assistant MCP/context server settings.',
87
+ config: { context_servers: { projscan: SERVER } },
88
+ configText: JSON.stringify({ context_servers: { projscan: SERVER } }, null, 2),
89
+ notes: [
90
+ 'If your Zed build expects `mcpServers`, use the generic MCP JSON from `--client all`.',
91
+ ],
92
+ },
93
+ gemini: {
94
+ client: 'gemini',
95
+ displayName: 'Gemini CLI',
96
+ whereToPaste: 'Gemini CLI MCP settings.',
97
+ config: { mcpServers: { projscan: SERVER } },
98
+ configText: JSON.stringify({ mcpServers: { projscan: SERVER } }, null, 2),
99
+ notes: ['Use `npx -y projscan mcp` as the stdio server command.'],
100
+ },
101
+ };
102
+ export function isMcpClientId(value) {
103
+ return typeof value === 'string' && MCP_CLIENT_IDS.includes(value);
104
+ }
105
+ export function getMcpConfigGuide(client = 'all') {
106
+ if (client === 'all') {
107
+ return {
108
+ schemaVersion: 1,
109
+ client: 'all',
110
+ install: INSTALL,
111
+ configs: MCP_CLIENT_IDS.filter((id) => id !== 'all').map((id) => buildGuide(id)),
112
+ };
113
+ }
114
+ return buildGuide(client);
115
+ }
116
+ function buildGuide(client) {
117
+ return {
118
+ schemaVersion: 1,
119
+ install: INSTALL,
120
+ ...CLIENTS[client],
121
+ };
122
+ }
123
+ //# sourceMappingURL=adoptionMcpConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adoptionMcpConfig.js","sourceRoot":"","sources":["../../src/core/adoptionMcpConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { McpClientId } from './adoptionMcpConfig.js';
2
+ export interface McpSetupDoctorCheck {
3
+ id: string;
4
+ status: 'pass' | 'warn' | 'fail' | 'info';
5
+ summary: string;
6
+ detail?: string;
7
+ }
8
+ export interface McpSetupDoctorReport {
9
+ schemaVersion: 1;
10
+ client: McpClientId;
11
+ status: 'pass' | 'warn' | 'fail';
12
+ summary: string;
13
+ expected: {
14
+ command: string;
15
+ runWithoutInstall: string;
16
+ install: string;
17
+ };
18
+ whereToPaste: string;
19
+ configText: string;
20
+ checks: McpSetupDoctorCheck[];
21
+ nextCommands: string[];
22
+ }
23
+ export declare function computeMcpSetupDoctor(rootPath: string, client?: McpClientId): Promise<McpSetupDoctorReport>;
@@ -0,0 +1,87 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { checkNodeVersion } from './adoptionFirstRunDiagnostics.js';
4
+ import { getMcpConfigGuide, INSTALL } from './adoptionMcpConfig.js';
5
+ export async function computeMcpSetupDoctor(rootPath, client = 'all') {
6
+ const guide = getMcpConfigGuide(client);
7
+ const configText = guide.client === 'all'
8
+ ? guide.configs.map((entry) => `# ${entry.displayName}\n${entry.configText}`).join('\n\n')
9
+ : guide.configText;
10
+ const whereToPaste = guide.client === 'all' ? 'Use the matching client-specific config block.' : guide.whereToPaste;
11
+ const checks = [
12
+ checkNodeVersion(),
13
+ {
14
+ id: 'server-command',
15
+ status: 'pass',
16
+ summary: 'MCP server command uses local stdio startup.',
17
+ detail: INSTALL.mcpServerCommand,
18
+ },
19
+ {
20
+ id: 'config-shape',
21
+ status: configText.includes('projscan') && configText.includes('npx') ? 'pass' : 'fail',
22
+ summary: 'Config snippet includes the projscan stdio server.',
23
+ detail: whereToPaste,
24
+ },
25
+ await checkProjectMcpConfig(rootPath, client),
26
+ ];
27
+ const status = checks.some((check) => check.status === 'fail')
28
+ ? 'fail'
29
+ : checks.some((check) => check.status === 'warn')
30
+ ? 'warn'
31
+ : 'pass';
32
+ return {
33
+ schemaVersion: 1,
34
+ client,
35
+ status,
36
+ summary: `${status}: ${client} MCP setup uses ${INSTALL.mcpServerCommand}`,
37
+ expected: {
38
+ command: INSTALL.mcpServerCommand,
39
+ runWithoutInstall: INSTALL.runWithoutInstall,
40
+ install: INSTALL.command,
41
+ },
42
+ whereToPaste,
43
+ configText,
44
+ checks,
45
+ nextCommands: [
46
+ 'projscan init mcp --client all',
47
+ `projscan mcp doctor --client ${client} --format json`,
48
+ 'npx -y projscan mcp',
49
+ ],
50
+ };
51
+ }
52
+ async function checkProjectMcpConfig(rootPath, client) {
53
+ const candidates = clientConfigCandidates(client);
54
+ for (const candidate of candidates) {
55
+ try {
56
+ const raw = await fs.readFile(path.join(rootPath, candidate), 'utf-8');
57
+ return {
58
+ id: 'project-config',
59
+ status: raw.includes('projscan') ? 'pass' : 'warn',
60
+ summary: raw.includes('projscan')
61
+ ? `Found projscan in ${candidate}.`
62
+ : `Found ${candidate}, but it does not mention projscan.`,
63
+ detail: candidate,
64
+ };
65
+ }
66
+ catch {
67
+ // try next
68
+ }
69
+ }
70
+ return {
71
+ id: 'project-config',
72
+ status: 'info',
73
+ summary: 'No project-local MCP config found; paste the snippet into the client settings if needed.',
74
+ };
75
+ }
76
+ function clientConfigCandidates(client) {
77
+ if (client === 'cursor')
78
+ return ['.cursor/mcp.json'];
79
+ if (client === 'continue')
80
+ return ['.continue/config.json'];
81
+ if (client === 'codex')
82
+ return ['.codex/config.toml'];
83
+ if (client === 'all')
84
+ return ['.cursor/mcp.json', '.continue/config.json', '.codex/config.toml'];
85
+ return [];
86
+ }
87
+ //# sourceMappingURL=adoptionMcpDoctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adoptionMcpDoctor.js","sourceRoot":"","sources":["../../src/core/adoptionMcpDoctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface AgentWorkflowRecipe {
2
+ id: string;
3
+ name: string;
4
+ useWhen: string;
5
+ outcome: string;
6
+ commands: string[];
7
+ mcpTools: string[];
8
+ handoff: string;
9
+ }
10
+ export interface WorkflowRecipeCatalog {
11
+ schemaVersion: 1;
12
+ recipes: AgentWorkflowRecipe[];
13
+ }
14
+ export declare function getWorkflowRecipes(): WorkflowRecipeCatalog;
@@ -0,0 +1,110 @@
1
+ export function getWorkflowRecipes() {
2
+ return {
3
+ schemaVersion: 1,
4
+ recipes: [
5
+ {
6
+ id: 'before_edit',
7
+ name: 'Before Edit',
8
+ useWhen: 'Start here before an agent changes code.',
9
+ outcome: 'A proceed/caution/block gate plus the next tool calls that explain any risk.',
10
+ commands: [
11
+ 'projscan preflight --mode before_edit --format json',
12
+ 'projscan workplan --mode before_edit --format json',
13
+ ],
14
+ mcpTools: ['projscan_preflight', 'projscan_workplan'],
15
+ handoff: 'If preflight returns caution or block, follow suggestedNextActions before editing.',
16
+ },
17
+ {
18
+ id: 'team_bootstrap',
19
+ name: 'Team Bootstrap',
20
+ useWhen: 'Adopt projscan for a team or new repository.',
21
+ outcome: 'A team policy, PR workflow, ownership starter, baseline memory, MCP setup check, and first start report that make adoption repeatable.',
22
+ commands: [
23
+ 'projscan init team --team platform',
24
+ 'projscan start --mode before_edit --format json',
25
+ 'projscan mcp doctor --client codex --format json',
26
+ ],
27
+ mcpTools: ['projscan_adoption', 'projscan_start'],
28
+ handoff: 'Run init team once, commit the generated policy/workflow/ownership/baseline files, then tune thresholds after the first PR.',
29
+ },
30
+ {
31
+ id: 'pr_automation',
32
+ name: 'PR Automation',
33
+ useWhen: 'Put projscan evidence directly in pull request review.',
34
+ outcome: 'Pull requests receive an approval comment and fail CI only when preflight returns block.',
35
+ commands: [
36
+ 'projscan init github-action',
37
+ 'projscan preflight --mode before_merge --format json',
38
+ 'projscan evidence-pack --pr-comment',
39
+ ],
40
+ mcpTools: ['projscan_preflight', 'projscan_evidence_pack'],
41
+ handoff: 'Treat block as a hard CI failure; use PR comment next actions for caution-level follow-up.',
42
+ },
43
+ {
44
+ id: 'bug_hunt',
45
+ name: 'Bug Hunt',
46
+ useWhen: 'Run a focused polish or stabilization pass.',
47
+ outcome: 'A ranked action queue with evidence and verification commands.',
48
+ commands: [
49
+ 'projscan bug-hunt --format json',
50
+ 'projscan quality-scorecard --format json',
51
+ 'projscan regression-plan --level focused --format json',
52
+ ],
53
+ mcpTools: ['projscan_bug_hunt', 'projscan_quality_scorecard', 'projscan_regression_plan'],
54
+ handoff: 'Fix top-ranked targets first, then rerun the regression plan.',
55
+ },
56
+ {
57
+ id: 'before_handoff',
58
+ name: 'Before handoff or commit',
59
+ useWhen: 'Check a branch before committing or handing it to a reviewer.',
60
+ outcome: 'Concrete fix targets, manual review gates, and proof commands are separated.',
61
+ commands: [
62
+ 'projscan bug-hunt --format json',
63
+ 'projscan preflight --mode before_commit --format json',
64
+ 'projscan evidence-pack --pr-comment',
65
+ ],
66
+ mcpTools: ['projscan_bug_hunt', 'projscan_preflight', 'projscan_evidence_pack'],
67
+ handoff: 'Fix concrete blockers first, document manual review gates, then share the evidence pack.',
68
+ },
69
+ {
70
+ id: 'release_approval',
71
+ name: 'Release Approval',
72
+ useWhen: 'Prepare a maintainer or CI environment approval packet.',
73
+ outcome: 'Version readiness, risks, regression commands, and website update copy in one loop.',
74
+ commands: [
75
+ 'projscan release-train --format json',
76
+ 'projscan evidence-pack --website-prompt --format json',
77
+ 'projscan regression-plan --level full --format json',
78
+ ],
79
+ mcpTools: ['projscan_release_train', 'projscan_evidence_pack', 'projscan_regression_plan'],
80
+ handoff: 'Use the evidence pack as the approval artifact; do not skip the full release gate.',
81
+ },
82
+ {
83
+ id: 'handoff',
84
+ name: 'Agent Handoff',
85
+ useWhen: 'Compress repo context for the next agent or a resumed session.',
86
+ outcome: 'A compact brief with focus items, guardrails, and suggested next actions.',
87
+ commands: [
88
+ 'projscan agent-brief --intent handoff --format json',
89
+ 'projscan handoff --format json',
90
+ ],
91
+ mcpTools: ['projscan_agent_brief', 'projscan_workplan'],
92
+ handoff: 'Paste the brief into the next agent session before asking it to edit.',
93
+ },
94
+ {
95
+ id: 'pre_merge',
96
+ name: 'Pre-Merge',
97
+ useWhen: 'Check a branch before merge or release tagging.',
98
+ outcome: 'Changed-file health, review verdict, taint flow evidence, and required checks.',
99
+ commands: [
100
+ 'projscan preflight --mode before_merge --format json',
101
+ 'projscan review --format json',
102
+ 'projscan regression-plan --level smoke --format json',
103
+ ],
104
+ mcpTools: ['projscan_preflight', 'projscan_review', 'projscan_regression_plan'],
105
+ handoff: 'Treat block as a hard stop and caution as a request for explicit review.',
106
+ },
107
+ ],
108
+ };
109
+ }
110
+ //# sourceMappingURL=adoptionWorkflowRecipes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adoptionWorkflowRecipes.js","sourceRoot":"","sources":["../../src/core/adoptionWorkflowRecipes.ts"],"names":[],"mappings":"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"}