projscan 4.1.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.
- package/README.md +173 -25
- package/dist/cli/commands/start.js +1022 -2
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/core/start.js +1045 -8
- package/dist/core/start.js.map +1 -1
- package/dist/projscan-sbom.cdx.json +6 -6
- package/dist/tool-manifest.json +2 -2
- package/dist/types.d.ts +192 -0
- package/docs/GUIDE.md +3 -1
- package/docs/demos/projscan-4-1-demo.html +94 -65
- package/docs/projscan-mission-control.png +0 -0
- package/docs/projscan-proof-router.png +0 -0
- package/package.json +1 -1
- package/scripts/capture-readme-assets.mjs +1 -1
package/dist/types.d.ts
CHANGED
|
@@ -720,7 +720,88 @@ export interface StartUnresolvedInput {
|
|
|
720
720
|
sourceAction: string;
|
|
721
721
|
instruction: string;
|
|
722
722
|
}
|
|
723
|
+
export interface StartMissionResumeReference {
|
|
724
|
+
id: string;
|
|
725
|
+
phaseId: StartExecutionPhaseId;
|
|
726
|
+
kind: StartExecutionStepKind;
|
|
727
|
+
status: StartExecutionStatus;
|
|
728
|
+
label: string;
|
|
729
|
+
instruction?: string;
|
|
730
|
+
command?: string;
|
|
731
|
+
placeholder?: string;
|
|
732
|
+
}
|
|
733
|
+
export interface StartMissionToolCall {
|
|
734
|
+
tool: string;
|
|
735
|
+
args?: Record<string, unknown>;
|
|
736
|
+
}
|
|
737
|
+
export interface StartMissionProofToolCall extends StartMissionToolCall {
|
|
738
|
+
stepId: string;
|
|
739
|
+
command: string;
|
|
740
|
+
}
|
|
741
|
+
export interface StartMissionProofItem {
|
|
742
|
+
stepId: string;
|
|
743
|
+
status: StartExecutionStatus;
|
|
744
|
+
label: string;
|
|
745
|
+
command: string;
|
|
746
|
+
toolCall?: StartMissionToolCall;
|
|
747
|
+
}
|
|
748
|
+
export interface StartMissionInputBinding {
|
|
749
|
+
inputId: string;
|
|
750
|
+
label: string;
|
|
751
|
+
placeholder: string;
|
|
752
|
+
instruction: string;
|
|
753
|
+
followUpIds: string[];
|
|
754
|
+
}
|
|
755
|
+
export type StartMissionResumeChecklistItemKind = 'run_current' | 'resolve_input' | 'run_follow_up' | 'run_proof' | 'confirm_done';
|
|
756
|
+
export interface StartMissionResumeChecklistItem {
|
|
757
|
+
id: string;
|
|
758
|
+
kind: StartMissionResumeChecklistItemKind;
|
|
759
|
+
phaseId: StartExecutionPhaseId;
|
|
760
|
+
stepId: string;
|
|
761
|
+
status: StartExecutionStatus;
|
|
762
|
+
label: string;
|
|
763
|
+
command?: string;
|
|
764
|
+
tool?: string;
|
|
765
|
+
args?: Record<string, unknown>;
|
|
766
|
+
placeholder?: string;
|
|
767
|
+
instruction?: string;
|
|
768
|
+
blockedBy?: string[];
|
|
769
|
+
dependsOn?: string[];
|
|
770
|
+
unlocks?: string[];
|
|
771
|
+
followUpIds?: string[];
|
|
772
|
+
}
|
|
773
|
+
export interface StartMissionResumeFollowUp {
|
|
774
|
+
id: string;
|
|
775
|
+
phaseId: StartExecutionPhaseId;
|
|
776
|
+
kind: StartExecutionStepKind;
|
|
777
|
+
status: StartExecutionStatus;
|
|
778
|
+
label: string;
|
|
779
|
+
command?: string;
|
|
780
|
+
tool?: string;
|
|
781
|
+
args?: Record<string, unknown>;
|
|
782
|
+
blockedBy?: string[];
|
|
783
|
+
dependsOn?: string[];
|
|
784
|
+
}
|
|
785
|
+
export interface StartMissionResume {
|
|
786
|
+
currentStep: StartExecutionCursor;
|
|
787
|
+
status: StartExecutionStatus;
|
|
788
|
+
instruction: string;
|
|
789
|
+
prompt: string;
|
|
790
|
+
commandBlock?: string;
|
|
791
|
+
toolCall?: StartMissionToolCall;
|
|
792
|
+
followUps?: StartMissionResumeFollowUp[];
|
|
793
|
+
inputBindings?: StartMissionInputBinding[];
|
|
794
|
+
checklist?: StartMissionResumeChecklistItem[];
|
|
795
|
+
remainingProofItems?: StartMissionProofItem[];
|
|
796
|
+
remainingProofCommands?: string[];
|
|
797
|
+
remainingProofToolCalls?: StartMissionProofToolCall[];
|
|
798
|
+
unlocks?: StartMissionResumeReference[];
|
|
799
|
+
blockedBy?: StartMissionResumeReference[];
|
|
800
|
+
}
|
|
723
801
|
export interface StartMissionHandoff {
|
|
802
|
+
currentStep: StartExecutionCursor;
|
|
803
|
+
resume: StartMissionResume;
|
|
804
|
+
reviewGate: StartMissionReviewGate;
|
|
724
805
|
nextAction: PreflightSuggestedAction;
|
|
725
806
|
readyActions: PreflightSuggestedAction[];
|
|
726
807
|
needsInput: StartUnresolvedInput[];
|
|
@@ -728,8 +809,114 @@ export interface StartMissionHandoff {
|
|
|
728
809
|
readyProof: {
|
|
729
810
|
summary: string;
|
|
730
811
|
commands: string[];
|
|
812
|
+
toolCalls?: StartMissionProofToolCall[];
|
|
813
|
+
items?: StartMissionProofItem[];
|
|
731
814
|
};
|
|
732
815
|
}
|
|
816
|
+
export type StartExecutionPhaseId = 'next_action' | 'ready_now' | 'resolve_inputs' | 'follow_up' | 'proof' | 'done_when';
|
|
817
|
+
export type StartExecutionStatus = 'ready' | 'blocked' | 'pending';
|
|
818
|
+
export type StartExecutionStepKind = 'tool' | 'input' | 'proof' | 'criterion' | 'handoff';
|
|
819
|
+
export interface StartExecutionStep {
|
|
820
|
+
id: string;
|
|
821
|
+
kind: StartExecutionStepKind;
|
|
822
|
+
status: StartExecutionStatus;
|
|
823
|
+
label: string;
|
|
824
|
+
command?: string;
|
|
825
|
+
tool?: string;
|
|
826
|
+
args?: Record<string, unknown>;
|
|
827
|
+
instruction?: string;
|
|
828
|
+
placeholder?: string;
|
|
829
|
+
dependsOn?: string[];
|
|
830
|
+
blockedBy?: string[];
|
|
831
|
+
unlocks?: string[];
|
|
832
|
+
}
|
|
833
|
+
export interface StartExecutionPhase {
|
|
834
|
+
id: StartExecutionPhaseId;
|
|
835
|
+
title: string;
|
|
836
|
+
status: StartExecutionStatus;
|
|
837
|
+
steps: StartExecutionStep[];
|
|
838
|
+
}
|
|
839
|
+
export interface StartExecutionCursor {
|
|
840
|
+
phaseId: StartExecutionPhaseId;
|
|
841
|
+
stepId: string;
|
|
842
|
+
status: StartExecutionStatus;
|
|
843
|
+
kind: StartExecutionStepKind;
|
|
844
|
+
label: string;
|
|
845
|
+
command?: string;
|
|
846
|
+
tool?: string;
|
|
847
|
+
args?: Record<string, unknown>;
|
|
848
|
+
instruction?: string;
|
|
849
|
+
placeholder?: string;
|
|
850
|
+
blockedBy?: string[];
|
|
851
|
+
unlocks?: string[];
|
|
852
|
+
reason: string;
|
|
853
|
+
}
|
|
854
|
+
export interface StartExecutionPlan {
|
|
855
|
+
summary: string;
|
|
856
|
+
currentPhase: StartExecutionPhaseId;
|
|
857
|
+
cursor: StartExecutionCursor;
|
|
858
|
+
phases: StartExecutionPhase[];
|
|
859
|
+
}
|
|
860
|
+
export interface StartMissionRunbook {
|
|
861
|
+
title: string;
|
|
862
|
+
status: StartMissionControlStatus;
|
|
863
|
+
currentPhase: StartExecutionPhaseId;
|
|
864
|
+
currentStep: StartExecutionCursor;
|
|
865
|
+
resume: StartMissionResume;
|
|
866
|
+
readyCommandBlock: string;
|
|
867
|
+
blockedInputSummary?: string;
|
|
868
|
+
markdown: string;
|
|
869
|
+
}
|
|
870
|
+
export interface StartMissionReviewWorktree {
|
|
871
|
+
available: boolean;
|
|
872
|
+
clean: boolean;
|
|
873
|
+
changedFileCount: number;
|
|
874
|
+
files: string[];
|
|
875
|
+
baseRef: string | null;
|
|
876
|
+
summary: string;
|
|
877
|
+
reason?: string;
|
|
878
|
+
}
|
|
879
|
+
export interface StartMissionReviewProof {
|
|
880
|
+
summary: string;
|
|
881
|
+
commands: string[];
|
|
882
|
+
toolCalls?: StartMissionProofToolCall[];
|
|
883
|
+
items?: StartMissionProofItem[];
|
|
884
|
+
}
|
|
885
|
+
export type StartMissionReviewBlockedAction = 'next_slice' | 'release' | 'publish' | 'deploy' | 'push' | 'merge' | 'version_bump';
|
|
886
|
+
export interface StartMissionReviewPolicy {
|
|
887
|
+
approvalRequired: true;
|
|
888
|
+
blockedActions: StartMissionReviewBlockedAction[];
|
|
889
|
+
summary: string;
|
|
890
|
+
}
|
|
891
|
+
export interface StartMissionReviewDecision {
|
|
892
|
+
id: 'approve_next_slice' | 'request_changes' | 'review_version_candidate';
|
|
893
|
+
label: string;
|
|
894
|
+
description: string;
|
|
895
|
+
consequence: string;
|
|
896
|
+
reply: string;
|
|
897
|
+
}
|
|
898
|
+
export interface StartMissionReviewGate {
|
|
899
|
+
title: string;
|
|
900
|
+
required: true;
|
|
901
|
+
status: StartMissionControlStatus;
|
|
902
|
+
stopCondition: string;
|
|
903
|
+
reviewPrompt: string;
|
|
904
|
+
checklist: string[];
|
|
905
|
+
doneWhen: string[];
|
|
906
|
+
policy: StartMissionReviewPolicy;
|
|
907
|
+
decisions: StartMissionReviewDecision[];
|
|
908
|
+
commands: string[];
|
|
909
|
+
worktree: StartMissionReviewWorktree;
|
|
910
|
+
proof: StartMissionReviewProof;
|
|
911
|
+
markdown: string;
|
|
912
|
+
}
|
|
913
|
+
export interface StartMissionTaskCard {
|
|
914
|
+
title: string;
|
|
915
|
+
status: StartMissionControlStatus;
|
|
916
|
+
currentPhase: StartExecutionPhaseId;
|
|
917
|
+
currentStep: StartExecutionCursor;
|
|
918
|
+
markdown: string;
|
|
919
|
+
}
|
|
733
920
|
export interface StartMissionControl {
|
|
734
921
|
intent?: string;
|
|
735
922
|
status: StartMissionControlStatus;
|
|
@@ -745,7 +932,12 @@ export interface StartMissionControl {
|
|
|
745
932
|
successCriteria: string[];
|
|
746
933
|
proofSummary: string;
|
|
747
934
|
proofCommands: string[];
|
|
935
|
+
resume: StartMissionResume;
|
|
748
936
|
handoff: StartMissionHandoff;
|
|
937
|
+
executionPlan: StartExecutionPlan;
|
|
938
|
+
runbook: StartMissionRunbook;
|
|
939
|
+
reviewGate: StartMissionReviewGate;
|
|
940
|
+
taskCard: StartMissionTaskCard;
|
|
749
941
|
handoffPrompt: string;
|
|
750
942
|
}
|
|
751
943
|
export interface StartReport {
|
package/docs/GUIDE.md
CHANGED
|
@@ -205,7 +205,9 @@ When the agent first opens a repo, or before starting a refactor, the question i
|
|
|
205
205
|
- **`projscan_coupling` / `projscan coupling`** — per-file fan-in / fan-out / instability plus circular-import cycles (Tarjan SCC). Use `direction: cycles_only` or `projscan coupling --cycles-only` to surface architectural debt directly.
|
|
206
206
|
- **`projscan_analyze` / `projscan analyze`** — the everything report; useful at session start but verbose.
|
|
207
207
|
|
|
208
|
-
**Typical agent flow:** start with `projscan privacy-check`, then `projscan_start` with an optional plain-language intent. If no explicit mode is supplied, start infers the workflow mode from the intent, such as `before_commit` for commit-safety checks; read `modeSource` and `modeReason` to see whether the mode was explicit, inferred, or defaulted. `modeReason` distinguishes workflow-mode defaulting from action routing, so an impact intent can still route through Mission Control while the workflow stays `before_edit`. The `firstTenMinutes` path and current-worktree coordination hint follow that resolved mode, so a commit-safety start does not send the developer back through a before-edit gate. Follow `missionControl.actionPlan`, call `missionControl.readyActions` immediately, use routed-intent weighted `confidence`, `score`, and `matchedKeywords` to judge weak or ambiguous matches, and read the same confidence line in console output when working manually. Fill any `missionControl.unresolvedInputs` before running placeholder follow-ups, inspect `missionControl.alternatives` when the intent mixes goals, stop only when `missionControl.successCriteria` is satisfied, and hand off with `missionControl.handoff` or the concise `missionControl.handoffPrompt`. Cite `missionControl.proofSummary` plus the runnable-only `missionControl.proofCommands` in the handoff. MCP agents should call
|
|
208
|
+
**Typical agent flow:** start with `projscan privacy-check`, then `projscan_start` with an optional plain-language intent. If no explicit mode is supplied, start infers the workflow mode from the intent, such as `before_commit` for commit-safety checks; read `modeSource` and `modeReason` to see whether the mode was explicit, inferred, or defaulted. `modeReason` distinguishes workflow-mode defaulting from action routing, so an impact intent can still route through Mission Control while the workflow stays `before_edit`. The `firstTenMinutes` path and current-worktree coordination hint follow that resolved mode, so a commit-safety start does not send the developer back through a before-edit gate. Follow `missionControl.actionPlan`, call `missionControl.readyActions` immediately, use `missionControl.executionPlan.currentPhase` as the cursor-aligned phase pointer, and use `missionControl.executionPlan.cursor.tool` / `args` when the cursor is directly MCP-callable. Use routed-intent weighted `confidence`, `score`, and `matchedKeywords` to judge weak or ambiguous matches, and read the same confidence line in console output when working manually. Fill any `missionControl.unresolvedInputs` before running placeholder follow-ups, inspect `missionControl.alternatives` when the intent mixes goals, stop only when `missionControl.successCriteria` is satisfied, and hand off with `missionControl.handoff`, `missionControl.runbook`, or the concise `missionControl.handoffPrompt`. Use `missionControl.reviewGate` as the autonomous-work stop boundary: finish the current checklist and proof, capture `git status --short` and `git diff --stat`, then wait for approval before another slice, release, publish, or deploy. Read `missionControl.reviewGate.worktree` for current worktree availability, changed-file count, base ref, and visible changed files. Use `missionControl.reviewGate.proof` when the reviewer needs the remaining proof queue without reading the full resume object. Read `missionControl.reviewGate.doneWhen` for the success criteria the reviewer must confirm before approving more work. Read `missionControl.reviewGate.policy` before continuing from a review handoff; it lists the actions blocked until explicit reviewer approval: another slice, release, publish, deploy, push, merge, and version bump. Use `projscan start --review-gate-json --intent "<goal>"` or saved `review-gate.json` when a script needs proof, worktree evidence, done criteria, decisions, and policy in one review object. Use `projscan start --review-policy --intent "<goal>"` or saved `review-policy.json` when a script only needs that approval boundary. Use `missionControl.reviewGate.decisions` as the approval menu in review gates, task cards, and runbooks; each decision includes copyable reviewer reply text so agents do not infer permission to continue, release, or publish. The default console review gate, saved mission bundle README, concise handoff prompt, `--review-replies`, and saved `review-replies.txt` show those replies for first-open review. `missionControl.handoff.reviewGate`, `--handoff-json`, and saved `handoff.json` carry that same gate for transfer-only flows. The handoff prompt starts with `missionControl.resume.prompt`, so it carries the current cursor, runnable command or blocked input instruction, labeled unlocks or blockers, done criteria, ready proof, review stop condition, and reviewer replies in one copyable sentence; the normal console prints that same value as `Handoff Prompt` without requiring JSON or `--include-handoff`, `projscan start --handoff-prompt --intent "<goal>"` prints only that prompt for piping or copy/paste, and the Markdown runbook renders it as `## Handoff Prompt` so copied runbooks carry the same next-agent prompt. When a human just needs the runnable shell step, `projscan start --next-command --intent "<goal>"` prints only the current cursor command; when an MCP agent needs the callable equivalent, `projscan start --next-tool-call --intent "<goal>"` prints the current cursor tool call as compact JSON. Cite `missionControl.proofSummary` plus the runnable-only `missionControl.proofCommands` in broad handoff notes, and use `missionControl.handoff.readyProof.items` when resuming because it is the complete ordered remaining-proof queue; each item carries its CLI command and an optional MCP `toolCall`. `missionControl.handoff.readyProof.commands` and `toolCalls` remain convenient command-only and MCP-callable views. MCP agents should use `missionControl.resume.toolCall` when present, use `missionControl.resume.inputBindings` to map unlocked placeholders to input steps, then call `missionControl.resume.followUps` as the next template calls; when they need one ordered sequence, follow `missionControl.resume.checklist`, whose `run_proof` rows include `tool` and `args` for MCP-callable proof steps. The normal console `Resume Checklist` and Markdown runbook checklist print callable rows inline as `(MCP: ...)` and mark unmapped proof rows as `(CLI only)`, so a copied runbook or default terminal run remains self-contained even outside the JSON payload. After the current action, prefer `missionControl.resume.remainingProofItems` for complete proof, using `remainingProofToolCalls` for the callable MCP subset without rerunning the current command. Humans can run the matching `command`; the normal console `Ready Proof` command list, normal console `Proof Queue`, and runbook `Proof queue` all use remaining proof so the current cursor command is not repeated, and each queued item shows either its MCP call or `CLI only`. Use `projscan_understand` and `projscan_preflight` when you need broader context or a safety gate. Use `projscan_workplan` when you need an ordered execution plan, `projscan_agent_brief` for a compact handoff, and `projscan_evidence_pack --pr-comment` when you need reviewer-facing proof. Deeper tools such as `doctor`, `hotspots`, `dataflow`, `review`, `bug-hunt`, `quality-scorecard`, `dogfood`, and `trial` are follow-up tools.
|
|
209
|
+
|
|
210
|
+
For shortcut discovery, `projscan start --shortcuts --intent "<goal>"` prints the copyable command menu for the current mission, and `projscan start --shortcuts-json --intent "<goal>"` prints the same menu as JSON for agents and scripts. For shell copy/paste, `projscan start --mission-script --intent "<goal>"` prints a POSIX script that runs the current cursor command, then the remaining proof queue, then prints the review evidence commands. For MCP queue copy/paste, `projscan start --ready-tool-calls --intent "<goal>"` prints the current cursor call followed by remaining MCP-callable proof as compact JSON. For structured resume handoff, `projscan start --resume-json --intent "<goal>"` prints only `missionControl.resume`. For the complete transfer object, `projscan start --handoff-json --intent "<goal>"` prints only `missionControl.handoff`. For a file bundle, `projscan start --save-mission .projscan/mission --intent "<goal>"` writes `README.md`, `next-command.txt`, `next-tool-call.json`, `handoff-prompt.txt`, `resume-prompt.txt`, `task-card.md`, `review-gate.md`, `review-gate.json`, `review-policy.json`, `review-replies.txt`, the runbook, handoff JSON, resume JSON, `ready-tool-calls.json`, `shortcuts.json`, `mission.sh`, `status.sh`, `proof-logs/README.md`, `proof-logs/status.jsonl`, `proof-logs/run-report.md`, `proof-logs/summary.json`, proof commands, and manifest. Saved `mission.sh` writes current-command and proof-command output under `proof-logs/`, appends exit-code rows to `status.jsonl`, refreshes `run-report.md`, and writes `summary.json`, so reviewers and wrappers can scan pass/fail proof before opening raw logs. Bundle `status.sh` reads `summary.json` and uses exit codes `0`, `1`, and `2` for passed, failed, and not-ready states. For verification-only copy/paste, `projscan start --proof-commands --intent "<goal>"` prints the remaining ready proof commands one per line without the rest of the start report. For an ordered checklist without the full report, `projscan start --checklist --intent "<goal>"` prints only the resume checklist rows. For paste-ready PR, issue, or handoff notes, `projscan start --task-card --intent "<goal>"` prints the Markdown task card. MCP agents can read `missionControl.taskCard.markdown` when they need the same checklist without rendering it from `resume.checklist`. For stop-and-review notes, `projscan start --review-gate --intent "<goal>"` prints only `missionControl.reviewGate.markdown`, `projscan start --review-gate-json --intent "<goal>"` prints only the review gate JSON, `projscan start --review-policy --intent "<goal>"` prints only the review policy JSON, and `projscan start --review-replies --intent "<goal>"` prints only the copyable reviewer replies. For a full Markdown artifact, `projscan start --runbook --intent "<goal>"` prints the mission runbook.
|
|
209
211
|
|
|
210
212
|
### 2. Review — "is this PR safe to merge?"
|
|
211
213
|
|
|
@@ -422,18 +422,19 @@
|
|
|
422
422
|
<section class="hero" aria-label="projscan Mission Control">
|
|
423
423
|
<div class="intro">
|
|
424
424
|
<div>
|
|
425
|
-
<p class="eyebrow">
|
|
426
|
-
<h1>
|
|
425
|
+
<p class="eyebrow">Developer-life upgrade</p>
|
|
426
|
+
<h1>Tell projscan what you are doing.</h1>
|
|
427
427
|
<p class="lead">
|
|
428
|
-
projscan
|
|
429
|
-
|
|
430
|
-
|
|
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
431
|
</p>
|
|
432
432
|
<div class="pills" aria-label="Product capabilities">
|
|
433
433
|
<span class="pill">Mission Control</span>
|
|
434
434
|
<span class="pill">Local-first</span>
|
|
435
435
|
<span class="pill">MCP-ready</span>
|
|
436
|
-
<span class="pill">
|
|
436
|
+
<span class="pill">Copyable handoff</span>
|
|
437
|
+
<span class="pill">Review gate</span>
|
|
437
438
|
</div>
|
|
438
439
|
</div>
|
|
439
440
|
|
|
@@ -443,12 +444,12 @@
|
|
|
443
444
|
<span>intent to workflow</span>
|
|
444
445
|
</div>
|
|
445
446
|
<div class="metric">
|
|
446
|
-
<strong>
|
|
447
|
-
<span>MCP
|
|
447
|
+
<strong>1 JSON</strong>
|
|
448
|
+
<span>next MCP call</span>
|
|
448
449
|
</div>
|
|
449
450
|
<div class="metric">
|
|
450
|
-
<strong>
|
|
451
|
-
<span>
|
|
451
|
+
<strong>0</strong>
|
|
452
|
+
<span>source uploads</span>
|
|
452
453
|
</div>
|
|
453
454
|
</div>
|
|
454
455
|
</div>
|
|
@@ -458,63 +459,93 @@
|
|
|
458
459
|
<span class="dot red"></span>
|
|
459
460
|
<span class="dot amber"></span>
|
|
460
461
|
<span class="dot green"></span>
|
|
461
|
-
<span class="terminal-title">projscan start
|
|
462
|
+
<span class="terminal-title">projscan start shortcuts</span>
|
|
462
463
|
</div>
|
|
463
464
|
<div class="terminal-body">
|
|
464
465
|
<span class="line"
|
|
465
466
|
><span class="prompt">$</span>
|
|
466
467
|
<span class="cmd"
|
|
467
|
-
>projscan start --intent "
|
|
468
|
-
|
|
468
|
+
>projscan start --intent "what breaks if I rename the auth
|
|
469
|
+
token loader"</span
|
|
469
470
|
></span
|
|
470
471
|
>
|
|
471
472
|
<span class="line dim">ProjScan Mission Control</span>
|
|
472
|
-
<span class="line">Intent:
|
|
473
|
+
<span class="line">Intent: what breaks if I rename the auth token loader</span>
|
|
473
474
|
<span class="line">Status: <span class="warn">needs_attention</span></span>
|
|
474
475
|
<span class="line"
|
|
475
476
|
>Route:
|
|
476
|
-
<span class="notice">
|
|
477
|
+
<span class="notice">Impact analysis via projscan_search</span></span
|
|
477
478
|
>
|
|
478
479
|
<span class="line dim"
|
|
479
|
-
>confidence: high; matched:
|
|
480
|
+
>confidence: high; matched: breaks, rename</span
|
|
480
481
|
>
|
|
481
482
|
|
|
482
483
|
<div class="term-section">
|
|
483
|
-
<span class="line term-heading">
|
|
484
|
+
<span class="line term-heading">Run Cursor</span>
|
|
484
485
|
<span class="line"
|
|
485
|
-
|
|
486
|
-
|
|
486
|
+
>command: projscan search "auth token loader" --format
|
|
487
|
+
json</span
|
|
487
488
|
>
|
|
488
489
|
<span class="line"
|
|
489
|
-
|
|
490
|
+
>MCP call: projscan_search {"query":"auth token loader"}</span
|
|
490
491
|
>
|
|
491
|
-
<span class="line"
|
|
492
|
-
|
|
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
|
|
493
518
|
>
|
|
519
|
+
<span class="line dim">writes task card, review gate, mission.sh</span>
|
|
494
520
|
</div>
|
|
495
521
|
|
|
496
522
|
<div class="term-section">
|
|
497
523
|
<span class="line term-heading">Ready Proof</span>
|
|
498
524
|
<span class="line success"
|
|
499
|
-
>- projscan preflight --mode
|
|
525
|
+
>- projscan preflight --mode before_edit --format json</span
|
|
500
526
|
>
|
|
501
527
|
<span class="line success"
|
|
502
528
|
>- projscan understand --view verify --format json</span
|
|
503
529
|
>
|
|
504
|
-
<span class="line success"
|
|
505
|
-
>- projscan session touched --format json</span
|
|
506
|
-
>
|
|
507
530
|
</div>
|
|
508
531
|
|
|
509
532
|
<div class="term-section">
|
|
510
533
|
<span class="line term-heading">Done When</span>
|
|
511
534
|
<span class="line"
|
|
512
|
-
>-
|
|
535
|
+
>- Search returns an exact symbol or file path</span
|
|
513
536
|
>
|
|
514
537
|
<span class="line"
|
|
515
|
-
>-
|
|
538
|
+
>- Impact is reviewed before code edits</span
|
|
516
539
|
>
|
|
517
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>
|
|
518
549
|
</div>
|
|
519
550
|
</section>
|
|
520
551
|
</section>
|
|
@@ -552,12 +583,13 @@
|
|
|
552
583
|
<section class="proof" id="proof" aria-label="Proof and dependency view">
|
|
553
584
|
<div class="proof-header">
|
|
554
585
|
<div>
|
|
555
|
-
<p class="eyebrow">Intent, graph, and
|
|
556
|
-
<h2>
|
|
586
|
+
<p class="eyebrow">Intent, graph, and handoff intelligence</p>
|
|
587
|
+
<h2>Copy the next move.</h2>
|
|
557
588
|
</div>
|
|
558
589
|
<p>
|
|
559
|
-
|
|
560
|
-
|
|
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.
|
|
561
593
|
</p>
|
|
562
594
|
</div>
|
|
563
595
|
|
|
@@ -567,34 +599,33 @@
|
|
|
567
599
|
<span class="dot red"></span>
|
|
568
600
|
<span class="dot amber"></span>
|
|
569
601
|
<span class="dot green"></span>
|
|
570
|
-
<span class="terminal-title">projscan
|
|
602
|
+
<span class="terminal-title">projscan start --next-tool-call</span>
|
|
571
603
|
</div>
|
|
572
604
|
<div class="terminal-body">
|
|
573
605
|
<span class="line"
|
|
574
606
|
><span class="prompt">$</span>
|
|
575
607
|
<span class="cmd"
|
|
576
|
-
>projscan
|
|
577
|
-
loader"</span
|
|
608
|
+
>projscan start --next-tool-call --intent "what breaks if I
|
|
609
|
+
rename the auth token loader"</span
|
|
578
610
|
></span
|
|
579
611
|
>
|
|
580
|
-
<span class="line dim">
|
|
612
|
+
<span class="line dim">Current cursor as MCP JSON</span>
|
|
581
613
|
<span class="line"> </span>
|
|
582
|
-
<span class="line term-heading">
|
|
583
|
-
<span class="line">confidence: high</span>
|
|
584
|
-
<span class="line">matched: breaks, rename</span>
|
|
585
|
-
<span class="line notice"
|
|
586
|
-
>Before renaming or deleting, see every caller that
|
|
587
|
-
breaks.</span
|
|
588
|
-
>
|
|
614
|
+
<span class="line term-heading">{"tool":"projscan_search",</span>
|
|
589
615
|
<span class="line success"
|
|
590
|
-
|
|
616
|
+
> "args":{"query":"auth token loader"}}</span
|
|
591
617
|
>
|
|
592
618
|
<span class="line"> </span>
|
|
593
|
-
<span class="line term-heading">
|
|
594
|
-
<span class="line"
|
|
595
|
-
|
|
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>
|
|
596
627
|
<span class="line notice"
|
|
597
|
-
>
|
|
628
|
+
>Review gate: capture status, diff, then wait.</span
|
|
598
629
|
>
|
|
599
630
|
</div>
|
|
600
631
|
</section>
|
|
@@ -603,35 +634,33 @@
|
|
|
603
634
|
<div class="signal">
|
|
604
635
|
<span class="tag green">Verify</span>
|
|
605
636
|
<span>
|
|
606
|
-
<strong>Proof
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
regression planning.
|
|
637
|
+
<strong>Proof commands</strong>
|
|
638
|
+
<code>--proof-commands</code> returns the remaining
|
|
639
|
+
verification commands, one per line.
|
|
610
640
|
</span>
|
|
611
641
|
</div>
|
|
612
642
|
<div class="signal">
|
|
613
|
-
<span class="tag blue">
|
|
643
|
+
<span class="tag blue">MCP</span>
|
|
614
644
|
<span>
|
|
615
|
-
<strong>
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
out where agents need them.
|
|
645
|
+
<strong>MCP call shortcut</strong>
|
|
646
|
+
<code>--next-tool-call</code> returns the cursor tool and args
|
|
647
|
+
as compact JSON.
|
|
619
648
|
</span>
|
|
620
649
|
</div>
|
|
621
650
|
<div class="signal">
|
|
622
|
-
<span class="tag amber">
|
|
651
|
+
<span class="tag amber">List</span>
|
|
623
652
|
<span>
|
|
624
|
-
<strong>
|
|
625
|
-
|
|
626
|
-
|
|
653
|
+
<strong>Checklist shortcut</strong>
|
|
654
|
+
<code>--checklist</code> returns current, blocked, follow-up,
|
|
655
|
+
proof, and done rows.
|
|
627
656
|
</span>
|
|
628
657
|
</div>
|
|
629
658
|
<div class="signal">
|
|
630
|
-
<span class="tag red">
|
|
659
|
+
<span class="tag red">Gate</span>
|
|
631
660
|
<span>
|
|
632
|
-
<strong>
|
|
633
|
-
|
|
634
|
-
|
|
661
|
+
<strong>Review gate</strong>
|
|
662
|
+
<code>--review-gate</code> returns the stop checklist before
|
|
663
|
+
another slice, release, publish, or deploy.
|
|
635
664
|
</span>
|
|
636
665
|
</div>
|
|
637
666
|
</div>
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "projscan",
|
|
3
3
|
"mcpName": "io.github.abhiyoheswaran1/projscan",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.2.0",
|
|
5
5
|
"description": "Agent-first code intelligence. MCP server (2025-03-26) with AST parsing for JavaScript, TypeScript, Python, Go, Java, Ruby, Rust, PHP, C#, Kotlin, Swift, and C++; repo understanding maps (projscan_understand), stable v3 semantic graph (projscan_semantic_graph), dataflow risk engine with bridge-helper detection (projscan_dataflow), code graph, file + per-function AST cyclomatic complexity, per-function fan-in + fan-out, coupling + cycle detection, structural PR diff with HTML reporter, coverage report with HTML reporter, intent-grounded one-call PR review (projscan_review with optional `intent` arg, new taint flows, contract changes, and newDataflowRisks) and long-running PR-watch mode with structured per-bucket deltas (projscan_review_watch), first-60-seconds workflow orientation (projscan_start), agent workplans (projscan_workplan), bug-hunt queues (projscan_bug_hunt), product-line planning (projscan_release_train), evidence packs (projscan_evidence_pack), regression planning (projscan_regression_plan), agent briefs (projscan_agent_brief), quality scorecards (projscan_quality_scorecard), and preflight with supply-chain IOC evidence, rule-driven fix suggestions + mechanical apply layer with rollback (projscan_apply_fix, projscan_fix_suggest, projscan_explain_issue), source-to-sink taint analysis (projscan_taint) with truncation reporting, transitive blast-radius analysis with cross-repo mode (projscan_impact for files and symbols), cross-repo workspace registration + intelligence (projscan_workspace_graph), per-function semantic search chunks (sub-file embeddings), per-rule confidence + severity drift + cost-summary analytics with live streaming (projscan_cost_summary), stable local analyzer + reporter plugin API (projscan_plugin, CLI --reporter, opt-in via PROJSCAN_PLUGINS_PREVIEW=1), monorepo workspace awareness with cross-package import policy + per-package dependencies / outdated / audit, BM25 + optional semantic search, cursor pagination, progress notifications, context-budgeted output, and a stable-surface CI guard. CLI on the side.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
@@ -16,7 +16,7 @@ const captures = [
|
|
|
16
16
|
name: 'Mission Control hero',
|
|
17
17
|
url: pathToFileURL(demoPath).href,
|
|
18
18
|
output: path.join(repoRoot, 'docs', 'projscan-mission-control.png'),
|
|
19
|
-
viewport: '1440,
|
|
19
|
+
viewport: '1440,1120',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
name: 'Intent and proof workflow',
|