projscan 4.0.0 → 4.2.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 (39) hide show
  1. package/README.md +480 -24
  2. package/dist/cli/commands/route.js +1 -0
  3. package/dist/cli/commands/route.js.map +1 -1
  4. package/dist/cli/commands/semanticGraph.js +27 -0
  5. package/dist/cli/commands/semanticGraph.js.map +1 -1
  6. package/dist/cli/commands/start.js +1095 -2
  7. package/dist/cli/commands/start.js.map +1 -1
  8. package/dist/core/dependencyAnalyzer.js +172 -0
  9. package/dist/core/dependencyAnalyzer.js.map +1 -1
  10. package/dist/core/intentRouter.d.ts +8 -1
  11. package/dist/core/intentRouter.js +2186 -22
  12. package/dist/core/intentRouter.js.map +1 -1
  13. package/dist/core/issueEngine.js +6 -7
  14. package/dist/core/issueEngine.js.map +1 -1
  15. package/dist/core/onboarding.d.ts +2 -2
  16. package/dist/core/onboarding.js +29 -5
  17. package/dist/core/onboarding.js.map +1 -1
  18. package/dist/core/start.d.ts +1 -0
  19. package/dist/core/start.js +3047 -10
  20. package/dist/core/start.js.map +1 -1
  21. package/dist/mcp/server.d.ts +1 -1
  22. package/dist/mcp/server.js +14 -5
  23. package/dist/mcp/server.js.map +1 -1
  24. package/dist/mcp/tools/start.js +6 -1
  25. package/dist/mcp/tools/start.js.map +1 -1
  26. package/dist/projscan-sbom.cdx.json +6 -6
  27. package/dist/reporters/consoleReporter.js +19 -0
  28. package/dist/reporters/consoleReporter.js.map +1 -1
  29. package/dist/reporters/markdownReporter.js +19 -0
  30. package/dist/reporters/markdownReporter.js.map +1 -1
  31. package/dist/tool-manifest.json +6 -2
  32. package/dist/types.d.ts +275 -0
  33. package/docs/GUIDE.md +1567 -0
  34. package/docs/ROADMAP.md +219 -0
  35. package/docs/demos/projscan-4-1-demo.html +677 -0
  36. package/docs/projscan-mission-control.png +0 -0
  37. package/docs/projscan-proof-router.png +0 -0
  38. package/package.json +8 -1
  39. package/scripts/capture-readme-assets.mjs +60 -0
@@ -0,0 +1,677 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>projscan Mission Control README capture</title>
7
+ <style>
8
+ :root {
9
+ color-scheme: light;
10
+ --paper: #f4f1ea;
11
+ --panel: #fffdf8;
12
+ --ink: #17202a;
13
+ --muted: #5d6673;
14
+ --line: #d9d1c2;
15
+ --terminal: #111418;
16
+ --terminal-line: #2b3139;
17
+ --terminal-muted: #8d98a8;
18
+ --green: #247a52;
19
+ --green-soft: #e6f4ec;
20
+ --blue: #2f5f90;
21
+ --blue-soft: #e4eef8;
22
+ --amber: #9b5a00;
23
+ --amber-soft: #fff2d8;
24
+ --red: #a5403a;
25
+ --red-soft: #fae7e4;
26
+ }
27
+
28
+ * {
29
+ box-sizing: border-box;
30
+ }
31
+
32
+ body {
33
+ margin: 0;
34
+ background: var(--paper);
35
+ color: var(--ink);
36
+ font-family:
37
+ Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
38
+ "Segoe UI", sans-serif;
39
+ line-height: 1.45;
40
+ }
41
+
42
+ .page {
43
+ width: min(1280px, calc(100vw - 80px));
44
+ margin: 0 auto;
45
+ padding: 42px 0 72px;
46
+ }
47
+
48
+ .hero {
49
+ display: grid;
50
+ grid-template-columns: minmax(0, 0.92fr) minmax(620px, 1.08fr);
51
+ gap: 28px;
52
+ align-items: stretch;
53
+ }
54
+
55
+ .intro {
56
+ padding: 8px 4px 0;
57
+ display: flex;
58
+ flex-direction: column;
59
+ justify-content: space-between;
60
+ min-height: 620px;
61
+ }
62
+
63
+ .eyebrow {
64
+ margin: 0 0 18px;
65
+ color: var(--blue);
66
+ font-size: 14px;
67
+ font-weight: 800;
68
+ text-transform: uppercase;
69
+ }
70
+
71
+ h1,
72
+ h2,
73
+ h3,
74
+ p {
75
+ margin-top: 0;
76
+ }
77
+
78
+ h1 {
79
+ max-width: 540px;
80
+ margin-bottom: 22px;
81
+ font-size: 58px;
82
+ line-height: 1.02;
83
+ letter-spacing: 0;
84
+ }
85
+
86
+ .lead {
87
+ max-width: 560px;
88
+ margin-bottom: 28px;
89
+ color: var(--muted);
90
+ font-size: 21px;
91
+ }
92
+
93
+ .pills {
94
+ display: flex;
95
+ flex-wrap: wrap;
96
+ gap: 10px;
97
+ }
98
+
99
+ .pill {
100
+ min-height: 34px;
101
+ padding: 7px 12px;
102
+ border: 1px solid var(--line);
103
+ border-radius: 999px;
104
+ background: rgba(255, 253, 248, 0.72);
105
+ color: var(--ink);
106
+ font-size: 14px;
107
+ font-weight: 700;
108
+ }
109
+
110
+ .metric-row {
111
+ display: grid;
112
+ grid-template-columns: repeat(3, minmax(0, 1fr));
113
+ gap: 12px;
114
+ margin-top: 38px;
115
+ }
116
+
117
+ .metric {
118
+ min-height: 116px;
119
+ padding: 16px;
120
+ border: 1px solid var(--line);
121
+ border-radius: 8px;
122
+ background: var(--panel);
123
+ }
124
+
125
+ .metric strong {
126
+ display: block;
127
+ margin-bottom: 4px;
128
+ font-size: 27px;
129
+ line-height: 1;
130
+ }
131
+
132
+ .metric span {
133
+ color: var(--muted);
134
+ font-size: 13px;
135
+ font-weight: 700;
136
+ text-transform: uppercase;
137
+ }
138
+
139
+ .terminal {
140
+ overflow: hidden;
141
+ border: 1px solid #262d34;
142
+ border-radius: 8px;
143
+ background: var(--terminal);
144
+ color: #edf2f7;
145
+ box-shadow: 0 18px 45px rgba(23, 32, 42, 0.18);
146
+ }
147
+
148
+ .terminal-bar {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 9px;
152
+ height: 42px;
153
+ padding: 0 16px;
154
+ border-bottom: 1px solid var(--terminal-line);
155
+ color: var(--terminal-muted);
156
+ font-size: 13px;
157
+ }
158
+
159
+ .dot {
160
+ width: 10px;
161
+ height: 10px;
162
+ border-radius: 50%;
163
+ }
164
+
165
+ .dot.red {
166
+ background: #ef6a5b;
167
+ }
168
+
169
+ .dot.amber {
170
+ background: #f4bf4f;
171
+ }
172
+
173
+ .dot.green {
174
+ background: #63c554;
175
+ }
176
+
177
+ .terminal-title {
178
+ margin-left: 8px;
179
+ font-weight: 700;
180
+ }
181
+
182
+ .terminal-body {
183
+ padding: 26px;
184
+ font-family:
185
+ "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
186
+ font-size: 15px;
187
+ }
188
+
189
+ .prompt {
190
+ color: #9ad8b1;
191
+ }
192
+
193
+ .cmd {
194
+ color: #ffffff;
195
+ }
196
+
197
+ .dim {
198
+ color: var(--terminal-muted);
199
+ }
200
+
201
+ .term-section {
202
+ margin-top: 22px;
203
+ padding-top: 18px;
204
+ border-top: 1px solid var(--terminal-line);
205
+ }
206
+
207
+ .term-heading {
208
+ color: #ffd58a;
209
+ font-weight: 800;
210
+ }
211
+
212
+ .line {
213
+ display: block;
214
+ min-height: 22px;
215
+ }
216
+
217
+ .success {
218
+ color: #9ad8b1;
219
+ }
220
+
221
+ .notice {
222
+ color: #90c7ff;
223
+ }
224
+
225
+ .warn {
226
+ color: #ffd58a;
227
+ }
228
+
229
+ .grid {
230
+ display: grid;
231
+ grid-template-columns: repeat(3, minmax(0, 1fr));
232
+ gap: 18px;
233
+ margin-top: 30px;
234
+ }
235
+
236
+ .card {
237
+ min-height: 196px;
238
+ padding: 20px;
239
+ border: 1px solid var(--line);
240
+ border-radius: 8px;
241
+ background: var(--panel);
242
+ }
243
+
244
+ .label {
245
+ display: inline-flex;
246
+ align-items: center;
247
+ min-height: 28px;
248
+ margin-bottom: 16px;
249
+ padding: 4px 9px;
250
+ border-radius: 999px;
251
+ font-size: 12px;
252
+ font-weight: 800;
253
+ text-transform: uppercase;
254
+ }
255
+
256
+ .label.green {
257
+ background: var(--green-soft);
258
+ color: var(--green);
259
+ }
260
+
261
+ .label.blue {
262
+ background: var(--blue-soft);
263
+ color: var(--blue);
264
+ }
265
+
266
+ .label.amber {
267
+ background: var(--amber-soft);
268
+ color: var(--amber);
269
+ }
270
+
271
+ .card h2,
272
+ .card h3 {
273
+ margin-bottom: 10px;
274
+ font-size: 24px;
275
+ line-height: 1.16;
276
+ letter-spacing: 0;
277
+ }
278
+
279
+ .card p {
280
+ margin-bottom: 0;
281
+ color: var(--muted);
282
+ font-size: 15px;
283
+ }
284
+
285
+ .proof {
286
+ padding-top: 74px;
287
+ }
288
+
289
+ .proof-header {
290
+ display: grid;
291
+ grid-template-columns: minmax(0, 0.78fr) minmax(0, 1.22fr);
292
+ gap: 24px;
293
+ align-items: end;
294
+ margin-bottom: 24px;
295
+ }
296
+
297
+ .proof-header h2 {
298
+ margin-bottom: 10px;
299
+ font-size: 44px;
300
+ line-height: 1.06;
301
+ letter-spacing: 0;
302
+ }
303
+
304
+ .proof-header p {
305
+ margin-bottom: 0;
306
+ color: var(--muted);
307
+ font-size: 18px;
308
+ }
309
+
310
+ .workflow {
311
+ display: grid;
312
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
313
+ gap: 22px;
314
+ }
315
+
316
+ .compact-terminal .terminal-body {
317
+ min-height: 390px;
318
+ padding: 22px;
319
+ font-size: 14px;
320
+ }
321
+
322
+ .signal-list {
323
+ display: grid;
324
+ gap: 12px;
325
+ }
326
+
327
+ .signal {
328
+ display: grid;
329
+ grid-template-columns: 124px minmax(0, 1fr);
330
+ gap: 14px;
331
+ align-items: start;
332
+ padding: 16px;
333
+ border: 1px solid var(--line);
334
+ border-radius: 8px;
335
+ background: var(--panel);
336
+ }
337
+
338
+ .signal strong {
339
+ display: block;
340
+ color: var(--ink);
341
+ }
342
+
343
+ .signal span:not(.tag) {
344
+ color: var(--muted);
345
+ font-size: 14px;
346
+ }
347
+
348
+ .tag {
349
+ width: 124px;
350
+ min-height: 30px;
351
+ padding: 6px 8px;
352
+ border-radius: 6px;
353
+ color: #fff;
354
+ font-size: 12px;
355
+ font-weight: 800;
356
+ text-align: center;
357
+ text-transform: uppercase;
358
+ }
359
+
360
+ .tag.green {
361
+ background: var(--green);
362
+ }
363
+
364
+ .tag.blue {
365
+ background: var(--blue);
366
+ }
367
+
368
+ .tag.amber {
369
+ background: var(--amber);
370
+ }
371
+
372
+ .tag.red {
373
+ background: var(--red);
374
+ }
375
+
376
+ @media (max-width: 980px) {
377
+ .page {
378
+ width: min(100% - 32px, 760px);
379
+ padding-top: 28px;
380
+ }
381
+
382
+ .hero,
383
+ .proof-header,
384
+ .workflow,
385
+ .grid {
386
+ grid-template-columns: 1fr;
387
+ }
388
+
389
+ .intro {
390
+ min-height: auto;
391
+ }
392
+
393
+ h1 {
394
+ font-size: 42px;
395
+ }
396
+
397
+ .metric-row {
398
+ grid-template-columns: 1fr;
399
+ }
400
+
401
+ .terminal-body {
402
+ overflow-x: auto;
403
+ }
404
+ }
405
+
406
+ body.proof-only .hero,
407
+ body.proof-only .grid {
408
+ display: none;
409
+ }
410
+
411
+ body.proof-only .proof {
412
+ padding-top: 0;
413
+ }
414
+
415
+ body.proof-only .proof-header {
416
+ margin-top: 0;
417
+ }
418
+ </style>
419
+ </head>
420
+ <body>
421
+ <main class="page">
422
+ <section class="hero" aria-label="projscan Mission Control">
423
+ <div class="intro">
424
+ <div>
425
+ <p class="eyebrow">Developer-life upgrade</p>
426
+ <h1>Tell projscan what you are doing.</h1>
427
+ <p class="lead">
428
+ projscan routes a developer goal to the next safe command, the
429
+ MCP call an agent can run, and the proof that makes a handoff
430
+ reviewable.
431
+ </p>
432
+ <div class="pills" aria-label="Product capabilities">
433
+ <span class="pill">Mission Control</span>
434
+ <span class="pill">Local-first</span>
435
+ <span class="pill">MCP-ready</span>
436
+ <span class="pill">Copyable handoff</span>
437
+ <span class="pill">Review gate</span>
438
+ </div>
439
+ </div>
440
+
441
+ <div class="metric-row" aria-label="Release candidate signals">
442
+ <div class="metric">
443
+ <strong>1 call</strong>
444
+ <span>intent to workflow</span>
445
+ </div>
446
+ <div class="metric">
447
+ <strong>1 JSON</strong>
448
+ <span>next MCP call</span>
449
+ </div>
450
+ <div class="metric">
451
+ <strong>0</strong>
452
+ <span>source uploads</span>
453
+ </div>
454
+ </div>
455
+ </div>
456
+
457
+ <section class="terminal" aria-label="Mission Control terminal output">
458
+ <div class="terminal-bar">
459
+ <span class="dot red"></span>
460
+ <span class="dot amber"></span>
461
+ <span class="dot green"></span>
462
+ <span class="terminal-title">projscan start shortcuts</span>
463
+ </div>
464
+ <div class="terminal-body">
465
+ <span class="line"
466
+ ><span class="prompt">$</span>
467
+ <span class="cmd"
468
+ >projscan start --intent "what breaks if I rename the auth
469
+ token loader"</span
470
+ ></span
471
+ >
472
+ <span class="line dim">ProjScan Mission Control</span>
473
+ <span class="line">Intent: what breaks if I rename the auth token loader</span>
474
+ <span class="line">Status: <span class="warn">needs_attention</span></span>
475
+ <span class="line"
476
+ >Route:
477
+ <span class="notice">Impact analysis via projscan_search</span></span
478
+ >
479
+ <span class="line dim"
480
+ >confidence: high; matched: breaks, rename</span
481
+ >
482
+
483
+ <div class="term-section">
484
+ <span class="line term-heading">Run Cursor</span>
485
+ <span class="line"
486
+ >command: projscan search "auth token loader" --format
487
+ json</span
488
+ >
489
+ <span class="line"
490
+ >MCP call: projscan_search {"query":"auth token loader"}</span
491
+ >
492
+ <span class="line">unlocks: symbol input, file input</span>
493
+ </div>
494
+
495
+ <div class="term-section">
496
+ <span class="line term-heading">Copyable Shortcuts</span>
497
+ <span class="line success"
498
+ >projscan start --shortcuts --intent "..."</span
499
+ >
500
+ <span class="line success"
501
+ >projscan start --next-command --intent "..."</span
502
+ >
503
+ <span class="line success"
504
+ >projscan start --next-tool-call --intent "..."</span
505
+ >
506
+ <span class="line success"
507
+ >projscan start --task-card --intent "..."</span
508
+ >
509
+ <span class="line success"
510
+ >projscan start --mission-script --intent "..."</span
511
+ >
512
+ <span class="line success"
513
+ >projscan start --review-gate --intent "..."</span
514
+ >
515
+ <span class="line success"
516
+ >projscan start --save-mission .projscan/mission --intent
517
+ "..."</span
518
+ >
519
+ <span class="line dim">writes task card, review gate, mission.sh</span>
520
+ </div>
521
+
522
+ <div class="term-section">
523
+ <span class="line term-heading">Ready Proof</span>
524
+ <span class="line success"
525
+ >- projscan preflight --mode before_edit --format json</span
526
+ >
527
+ <span class="line success"
528
+ >- projscan understand --view verify --format json</span
529
+ >
530
+ </div>
531
+
532
+ <div class="term-section">
533
+ <span class="line term-heading">Done When</span>
534
+ <span class="line"
535
+ >- Search returns an exact symbol or file path</span
536
+ >
537
+ <span class="line"
538
+ >- Impact is reviewed before code edits</span
539
+ >
540
+ </div>
541
+
542
+ <div class="term-section">
543
+ <span class="line term-heading">Review Gate</span>
544
+ <span class="line">capture: git status --short</span>
545
+ <span class="line">capture: git diff --stat</span>
546
+ <span class="line success">reply: Approved, one bounded slice</span>
547
+ <span class="line warn">stop before another slice or release</span>
548
+ </div>
549
+ </div>
550
+ </section>
551
+ </section>
552
+
553
+ <section class="grid" aria-label="New developer workflows">
554
+ <article class="card">
555
+ <span class="label green">Goal routing</span>
556
+ <h2>Ask in human language.</h2>
557
+ <p>
558
+ Route privacy, merge readiness, refactor risk, local setup,
559
+ ownership, dependency, release, and handoff questions to the right
560
+ command with matched keywords and confidence.
561
+ </p>
562
+ </article>
563
+ <article class="card">
564
+ <span class="label blue">Repo context</span>
565
+ <h2>Start from cited evidence.</h2>
566
+ <p>
567
+ Repo maps now include read-first files, package contracts, runtime
568
+ flows, public exports, proof tiers, setup commands, and unknowns
569
+ that need human input.
570
+ </p>
571
+ </article>
572
+ <article class="card">
573
+ <span class="label amber">Review proof</span>
574
+ <h2>Make PRs easier to approve.</h2>
575
+ <p>
576
+ Mission Control carries the original intent into preflight,
577
+ verification, session memory, evidence packs, and reviewer-ready
578
+ next commands.
579
+ </p>
580
+ </article>
581
+ </section>
582
+
583
+ <section class="proof" id="proof" aria-label="Proof and dependency view">
584
+ <div class="proof-header">
585
+ <div>
586
+ <p class="eyebrow">Intent, graph, and handoff intelligence</p>
587
+ <h2>Copy the next move.</h2>
588
+ </div>
589
+ <p>
590
+ Developers and agents can list the shortcut menu, pull the next
591
+ shell command, fetch the MCP call, or copy the checklist and
592
+ Markdown runbook without reading the full report.
593
+ </p>
594
+ </div>
595
+
596
+ <div class="workflow">
597
+ <section class="terminal compact-terminal" aria-label="Intent router">
598
+ <div class="terminal-bar">
599
+ <span class="dot red"></span>
600
+ <span class="dot amber"></span>
601
+ <span class="dot green"></span>
602
+ <span class="terminal-title">projscan start --next-tool-call</span>
603
+ </div>
604
+ <div class="terminal-body">
605
+ <span class="line"
606
+ ><span class="prompt">$</span>
607
+ <span class="cmd"
608
+ >projscan start --next-tool-call --intent "what breaks if I
609
+ rename the auth token loader"</span
610
+ ></span
611
+ >
612
+ <span class="line dim">Current cursor as MCP JSON</span>
613
+ <span class="line">&nbsp;</span>
614
+ <span class="line term-heading">{"tool":"projscan_search",</span>
615
+ <span class="line success"
616
+ >&nbsp;"args":{"query":"auth token loader"}}</span
617
+ >
618
+ <span class="line">&nbsp;</span>
619
+ <span class="line term-heading">Checklist handoff</span>
620
+ <span class="line success"
621
+ >- [ready] run_current ready-1</span
622
+ >
623
+ <span class="line success"
624
+ >- [blocked] resolve_input input-1</span
625
+ >
626
+ <span class="line success">- [ready] run_proof proof-2</span>
627
+ <span class="line notice"
628
+ >Review gate: capture status, diff, then wait.</span
629
+ >
630
+ </div>
631
+ </section>
632
+
633
+ <div class="signal-list" aria-label="Developer proof signals">
634
+ <div class="signal">
635
+ <span class="tag green">Verify</span>
636
+ <span>
637
+ <strong>Proof commands</strong>
638
+ <code>--proof-commands</code> returns the remaining
639
+ verification commands, one per line.
640
+ </span>
641
+ </div>
642
+ <div class="signal">
643
+ <span class="tag blue">MCP</span>
644
+ <span>
645
+ <strong>MCP call shortcut</strong>
646
+ <code>--next-tool-call</code> returns the cursor tool and args
647
+ as compact JSON.
648
+ </span>
649
+ </div>
650
+ <div class="signal">
651
+ <span class="tag amber">List</span>
652
+ <span>
653
+ <strong>Checklist shortcut</strong>
654
+ <code>--checklist</code> returns current, blocked, follow-up,
655
+ proof, and done rows.
656
+ </span>
657
+ </div>
658
+ <div class="signal">
659
+ <span class="tag red">Gate</span>
660
+ <span>
661
+ <strong>Review gate</strong>
662
+ <code>--review-gate</code> returns the stop checklist before
663
+ another slice, release, publish, or deploy.
664
+ </span>
665
+ </div>
666
+ </div>
667
+ </div>
668
+ </section>
669
+ </main>
670
+ <script>
671
+ if (window.location.hash === "#proof") {
672
+ document.body.classList.add("proof-only");
673
+ }
674
+ document.documentElement.dataset.ready = "true";
675
+ </script>
676
+ </body>
677
+ </html>
Binary file