projscan 3.3.0 → 3.4.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 (50) hide show
  1. package/README.md +46 -26
  2. package/dist/cli/commands/plugin.js +10 -2
  3. package/dist/cli/commands/plugin.js.map +1 -1
  4. package/dist/cli/commands/understand.d.ts +1 -0
  5. package/dist/cli/commands/understand.js +112 -0
  6. package/dist/cli/commands/understand.js.map +1 -0
  7. package/dist/cli/commands/workplan.js +1 -1
  8. package/dist/cli/commands/workplan.js.map +1 -1
  9. package/dist/cli/commands/workspace.js +3 -2
  10. package/dist/cli/commands/workspace.js.map +1 -1
  11. package/dist/cli/index.js +2 -0
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/core/pluginDx.d.ts +1 -0
  14. package/dist/core/pluginDx.js +77 -18
  15. package/dist/core/pluginDx.js.map +1 -1
  16. package/dist/core/plugins.d.ts +1 -1
  17. package/dist/core/plugins.js.map +1 -1
  18. package/dist/core/preflight.js +4 -16
  19. package/dist/core/preflight.js.map +1 -1
  20. package/dist/core/privacy.js +6 -0
  21. package/dist/core/privacy.js.map +1 -1
  22. package/dist/core/roadmapCatalog.d.ts +1 -0
  23. package/dist/core/roadmapCatalog.js +14 -11
  24. package/dist/core/roadmapCatalog.js.map +1 -1
  25. package/dist/core/understand.d.ts +8 -0
  26. package/dist/core/understand.js +567 -0
  27. package/dist/core/understand.js.map +1 -0
  28. package/dist/core/workspace.d.ts +4 -2
  29. package/dist/core/workspace.js +63 -4
  30. package/dist/core/workspace.js.map +1 -1
  31. package/dist/mcp/tools/plugin.js +48 -4
  32. package/dist/mcp/tools/plugin.js.map +1 -1
  33. package/dist/mcp/tools/understand.d.ts +2 -0
  34. package/dist/mcp/tools/understand.js +43 -0
  35. package/dist/mcp/tools/understand.js.map +1 -0
  36. package/dist/mcp/tools/workplan.js +3 -2
  37. package/dist/mcp/tools/workplan.js.map +1 -1
  38. package/dist/mcp/tools/workspaceGraph.js +31 -0
  39. package/dist/mcp/tools/workspaceGraph.js.map +1 -1
  40. package/dist/mcp/tools.js +2 -0
  41. package/dist/mcp/tools.js.map +1 -1
  42. package/dist/projscan-sbom.cdx.json +87 -185
  43. package/dist/tool-manifest.json +37 -5
  44. package/dist/types.d.ts +159 -0
  45. package/dist/utils/formatSupport.d.ts +1 -0
  46. package/dist/utils/formatSupport.js +1 -0
  47. package/dist/utils/formatSupport.js.map +1 -1
  48. package/docs/PLUGIN-AUTHORING.md +6 -7
  49. package/docs/PLUGIN-GALLERY.md +2 -1
  50. package/package.json +3 -3
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.5",
4
- "serialNumber": "urn:uuid:e3d87bac-ad5b-4956-b8f3-d5277b890895",
4
+ "serialNumber": "urn:uuid:1a06c2ae-75e9-447d-a9d2-6ac19421312e",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2026-06-03T16:23:49.757Z",
7
+ "timestamp": "2026-06-04T06:12:24.527Z",
8
8
  "tools": [
9
9
  {
10
10
  "vendor": "projscan",
11
11
  "name": "projscan-sbom-generator",
12
- "version": "3.3.0"
12
+ "version": "3.4.1"
13
13
  }
14
14
  ],
15
15
  "component": {
16
16
  "type": "application",
17
- "bom-ref": "pkg:npm/projscan@3.3.0",
17
+ "bom-ref": "pkg:npm/projscan@3.4.1",
18
18
  "name": "projscan",
19
- "version": "3.3.0",
20
- "purl": "pkg:npm/projscan@3.3.0"
19
+ "version": "3.4.1",
20
+ "purl": "pkg:npm/projscan@3.4.1"
21
21
  }
22
22
  },
23
23
  "components": [
@@ -1183,6 +1183,20 @@
1183
1183
  }
1184
1184
  ]
1185
1185
  },
1186
+ {
1187
+ "type": "library",
1188
+ "bom-ref": "pkg:npm/%40standard-schema/spec@1.1.0",
1189
+ "name": "@standard-schema/spec",
1190
+ "version": "1.1.0",
1191
+ "purl": "pkg:npm/%40standard-schema/spec@1.1.0",
1192
+ "licenses": [
1193
+ {
1194
+ "license": {
1195
+ "id": "MIT"
1196
+ }
1197
+ }
1198
+ ]
1199
+ },
1186
1200
  {
1187
1201
  "type": "library",
1188
1202
  "bom-ref": "pkg:npm/%40types/chai@5.2.3",
@@ -1409,10 +1423,10 @@
1409
1423
  },
1410
1424
  {
1411
1425
  "type": "library",
1412
- "bom-ref": "pkg:npm/%40vitest/expect@3.2.4",
1426
+ "bom-ref": "pkg:npm/%40vitest/expect@4.1.8",
1413
1427
  "name": "@vitest/expect",
1414
- "version": "3.2.4",
1415
- "purl": "pkg:npm/%40vitest/expect@3.2.4",
1428
+ "version": "4.1.8",
1429
+ "purl": "pkg:npm/%40vitest/expect@4.1.8",
1416
1430
  "licenses": [
1417
1431
  {
1418
1432
  "license": {
@@ -1423,10 +1437,10 @@
1423
1437
  },
1424
1438
  {
1425
1439
  "type": "library",
1426
- "bom-ref": "pkg:npm/%40vitest/mocker@3.2.4",
1440
+ "bom-ref": "pkg:npm/%40vitest/mocker@4.1.8",
1427
1441
  "name": "@vitest/mocker",
1428
- "version": "3.2.4",
1429
- "purl": "pkg:npm/%40vitest/mocker@3.2.4",
1442
+ "version": "4.1.8",
1443
+ "purl": "pkg:npm/%40vitest/mocker@4.1.8",
1430
1444
  "licenses": [
1431
1445
  {
1432
1446
  "license": {
@@ -1437,10 +1451,10 @@
1437
1451
  },
1438
1452
  {
1439
1453
  "type": "library",
1440
- "bom-ref": "pkg:npm/%40vitest/pretty-format@3.2.4",
1454
+ "bom-ref": "pkg:npm/%40vitest/pretty-format@4.1.8",
1441
1455
  "name": "@vitest/pretty-format",
1442
- "version": "3.2.4",
1443
- "purl": "pkg:npm/%40vitest/pretty-format@3.2.4",
1456
+ "version": "4.1.8",
1457
+ "purl": "pkg:npm/%40vitest/pretty-format@4.1.8",
1444
1458
  "licenses": [
1445
1459
  {
1446
1460
  "license": {
@@ -1451,10 +1465,10 @@
1451
1465
  },
1452
1466
  {
1453
1467
  "type": "library",
1454
- "bom-ref": "pkg:npm/%40vitest/runner@3.2.4",
1468
+ "bom-ref": "pkg:npm/%40vitest/runner@4.1.8",
1455
1469
  "name": "@vitest/runner",
1456
- "version": "3.2.4",
1457
- "purl": "pkg:npm/%40vitest/runner@3.2.4",
1470
+ "version": "4.1.8",
1471
+ "purl": "pkg:npm/%40vitest/runner@4.1.8",
1458
1472
  "licenses": [
1459
1473
  {
1460
1474
  "license": {
@@ -1465,10 +1479,10 @@
1465
1479
  },
1466
1480
  {
1467
1481
  "type": "library",
1468
- "bom-ref": "pkg:npm/%40vitest/snapshot@3.2.4",
1482
+ "bom-ref": "pkg:npm/%40vitest/snapshot@4.1.8",
1469
1483
  "name": "@vitest/snapshot",
1470
- "version": "3.2.4",
1471
- "purl": "pkg:npm/%40vitest/snapshot@3.2.4",
1484
+ "version": "4.1.8",
1485
+ "purl": "pkg:npm/%40vitest/snapshot@4.1.8",
1472
1486
  "licenses": [
1473
1487
  {
1474
1488
  "license": {
@@ -1479,10 +1493,10 @@
1479
1493
  },
1480
1494
  {
1481
1495
  "type": "library",
1482
- "bom-ref": "pkg:npm/%40vitest/spy@3.2.4",
1496
+ "bom-ref": "pkg:npm/%40vitest/spy@4.1.8",
1483
1497
  "name": "@vitest/spy",
1484
- "version": "3.2.4",
1485
- "purl": "pkg:npm/%40vitest/spy@3.2.4",
1498
+ "version": "4.1.8",
1499
+ "purl": "pkg:npm/%40vitest/spy@4.1.8",
1486
1500
  "licenses": [
1487
1501
  {
1488
1502
  "license": {
@@ -1493,10 +1507,10 @@
1493
1507
  },
1494
1508
  {
1495
1509
  "type": "library",
1496
- "bom-ref": "pkg:npm/%40vitest/utils@3.2.4",
1510
+ "bom-ref": "pkg:npm/%40vitest/utils@4.1.8",
1497
1511
  "name": "@vitest/utils",
1498
- "version": "3.2.4",
1499
- "purl": "pkg:npm/%40vitest/utils@3.2.4",
1512
+ "version": "4.1.8",
1513
+ "purl": "pkg:npm/%40vitest/utils@4.1.8",
1500
1514
  "licenses": [
1501
1515
  {
1502
1516
  "license": {
@@ -1773,24 +1787,10 @@
1773
1787
  },
1774
1788
  {
1775
1789
  "type": "library",
1776
- "bom-ref": "pkg:npm/cac@6.7.14",
1777
- "name": "cac",
1778
- "version": "6.7.14",
1779
- "purl": "pkg:npm/cac@6.7.14",
1780
- "licenses": [
1781
- {
1782
- "license": {
1783
- "id": "MIT"
1784
- }
1785
- }
1786
- ]
1787
- },
1788
- {
1789
- "type": "library",
1790
- "bom-ref": "pkg:npm/chai@5.3.3",
1790
+ "bom-ref": "pkg:npm/chai@6.2.2",
1791
1791
  "name": "chai",
1792
- "version": "5.3.3",
1793
- "purl": "pkg:npm/chai@5.3.3",
1792
+ "version": "6.2.2",
1793
+ "purl": "pkg:npm/chai@6.2.2",
1794
1794
  "licenses": [
1795
1795
  {
1796
1796
  "license": {
@@ -1813,20 +1813,6 @@
1813
1813
  }
1814
1814
  ]
1815
1815
  },
1816
- {
1817
- "type": "library",
1818
- "bom-ref": "pkg:npm/check-error@2.1.3",
1819
- "name": "check-error",
1820
- "version": "2.1.3",
1821
- "purl": "pkg:npm/check-error@2.1.3",
1822
- "licenses": [
1823
- {
1824
- "license": {
1825
- "id": "MIT"
1826
- }
1827
- }
1828
- ]
1829
- },
1830
1816
  {
1831
1817
  "type": "library",
1832
1818
  "bom-ref": "pkg:npm/chownr@1.1.4",
@@ -1939,6 +1925,20 @@
1939
1925
  }
1940
1926
  ]
1941
1927
  },
1928
+ {
1929
+ "type": "library",
1930
+ "bom-ref": "pkg:npm/convert-source-map@2.0.0",
1931
+ "name": "convert-source-map",
1932
+ "version": "2.0.0",
1933
+ "purl": "pkg:npm/convert-source-map@2.0.0",
1934
+ "licenses": [
1935
+ {
1936
+ "license": {
1937
+ "id": "MIT"
1938
+ }
1939
+ }
1940
+ ]
1941
+ },
1942
1942
  {
1943
1943
  "type": "library",
1944
1944
  "bom-ref": "pkg:npm/cross-spawn@7.0.6",
@@ -1981,20 +1981,6 @@
1981
1981
  }
1982
1982
  ]
1983
1983
  },
1984
- {
1985
- "type": "library",
1986
- "bom-ref": "pkg:npm/deep-eql@5.0.2",
1987
- "name": "deep-eql",
1988
- "version": "5.0.2",
1989
- "purl": "pkg:npm/deep-eql@5.0.2",
1990
- "licenses": [
1991
- {
1992
- "license": {
1993
- "id": "MIT"
1994
- }
1995
- }
1996
- ]
1997
- },
1998
1984
  {
1999
1985
  "type": "library",
2000
1986
  "bom-ref": "pkg:npm/deep-extend@0.6.0",
@@ -2067,10 +2053,10 @@
2067
2053
  },
2068
2054
  {
2069
2055
  "type": "library",
2070
- "bom-ref": "pkg:npm/es-module-lexer@1.7.0",
2056
+ "bom-ref": "pkg:npm/es-module-lexer@2.1.0",
2071
2057
  "name": "es-module-lexer",
2072
- "version": "1.7.0",
2073
- "purl": "pkg:npm/es-module-lexer@1.7.0",
2058
+ "version": "2.1.0",
2059
+ "purl": "pkg:npm/es-module-lexer@2.1.0",
2074
2060
  "licenses": [
2075
2061
  {
2076
2062
  "license": {
@@ -2765,20 +2751,6 @@
2765
2751
  }
2766
2752
  ]
2767
2753
  },
2768
- {
2769
- "type": "library",
2770
- "bom-ref": "pkg:npm/js-tokens@9.0.1",
2771
- "name": "js-tokens",
2772
- "version": "9.0.1",
2773
- "purl": "pkg:npm/js-tokens@9.0.1",
2774
- "licenses": [
2775
- {
2776
- "license": {
2777
- "id": "MIT"
2778
- }
2779
- }
2780
- ]
2781
- },
2782
2754
  {
2783
2755
  "type": "library",
2784
2756
  "bom-ref": "pkg:npm/json-buffer@3.0.1",
@@ -2905,20 +2877,6 @@
2905
2877
  }
2906
2878
  ]
2907
2879
  },
2908
- {
2909
- "type": "library",
2910
- "bom-ref": "pkg:npm/loupe@3.2.1",
2911
- "name": "loupe",
2912
- "version": "3.2.1",
2913
- "purl": "pkg:npm/loupe@3.2.1",
2914
- "licenses": [
2915
- {
2916
- "license": {
2917
- "id": "MIT"
2918
- }
2919
- }
2920
- ]
2921
- },
2922
2880
  {
2923
2881
  "type": "library",
2924
2882
  "bom-ref": "pkg:npm/magic-string@0.30.21",
@@ -3283,6 +3241,20 @@
3283
3241
  }
3284
3242
  ]
3285
3243
  },
3244
+ {
3245
+ "type": "library",
3246
+ "bom-ref": "pkg:npm/obug@2.1.1",
3247
+ "name": "obug",
3248
+ "version": "2.1.1",
3249
+ "purl": "pkg:npm/obug@2.1.1",
3250
+ "licenses": [
3251
+ {
3252
+ "license": {
3253
+ "id": "MIT"
3254
+ }
3255
+ }
3256
+ ]
3257
+ },
3286
3258
  {
3287
3259
  "type": "library",
3288
3260
  "bom-ref": "pkg:npm/once@1.4.0",
@@ -3465,20 +3437,6 @@
3465
3437
  }
3466
3438
  ]
3467
3439
  },
3468
- {
3469
- "type": "library",
3470
- "bom-ref": "pkg:npm/pathval@2.0.1",
3471
- "name": "pathval",
3472
- "version": "2.0.1",
3473
- "purl": "pkg:npm/pathval@2.0.1",
3474
- "licenses": [
3475
- {
3476
- "license": {
3477
- "id": "MIT"
3478
- }
3479
- }
3480
- ]
3481
- },
3482
3440
  {
3483
3441
  "type": "library",
3484
3442
  "bom-ref": "pkg:npm/picocolors@1.1.1",
@@ -3873,10 +3831,10 @@
3873
3831
  },
3874
3832
  {
3875
3833
  "type": "library",
3876
- "bom-ref": "pkg:npm/std-env@3.10.0",
3834
+ "bom-ref": "pkg:npm/std-env@4.1.0",
3877
3835
  "name": "std-env",
3878
- "version": "3.10.0",
3879
- "purl": "pkg:npm/std-env@3.10.0",
3836
+ "version": "4.1.0",
3837
+ "purl": "pkg:npm/std-env@4.1.0",
3880
3838
  "licenses": [
3881
3839
  {
3882
3840
  "license": {
@@ -3969,20 +3927,6 @@
3969
3927
  }
3970
3928
  ]
3971
3929
  },
3972
- {
3973
- "type": "library",
3974
- "bom-ref": "pkg:npm/strip-literal@3.1.0",
3975
- "name": "strip-literal",
3976
- "version": "3.1.0",
3977
- "purl": "pkg:npm/strip-literal@3.1.0",
3978
- "licenses": [
3979
- {
3980
- "license": {
3981
- "id": "MIT"
3982
- }
3983
- }
3984
- ]
3985
- },
3986
3930
  {
3987
3931
  "type": "library",
3988
3932
  "bom-ref": "pkg:npm/tar-fs@2.1.4",
@@ -4083,10 +4027,10 @@
4083
4027
  },
4084
4028
  {
4085
4029
  "type": "library",
4086
- "bom-ref": "pkg:npm/tinyexec@0.3.2",
4030
+ "bom-ref": "pkg:npm/tinyexec@1.2.4",
4087
4031
  "name": "tinyexec",
4088
- "version": "0.3.2",
4089
- "purl": "pkg:npm/tinyexec@0.3.2",
4032
+ "version": "1.2.4",
4033
+ "purl": "pkg:npm/tinyexec@1.2.4",
4090
4034
  "licenses": [
4091
4035
  {
4092
4036
  "license": {
@@ -4111,38 +4055,10 @@
4111
4055
  },
4112
4056
  {
4113
4057
  "type": "library",
4114
- "bom-ref": "pkg:npm/tinypool@1.1.1",
4115
- "name": "tinypool",
4116
- "version": "1.1.1",
4117
- "purl": "pkg:npm/tinypool@1.1.1",
4118
- "licenses": [
4119
- {
4120
- "license": {
4121
- "id": "MIT"
4122
- }
4123
- }
4124
- ]
4125
- },
4126
- {
4127
- "type": "library",
4128
- "bom-ref": "pkg:npm/tinyrainbow@2.0.0",
4058
+ "bom-ref": "pkg:npm/tinyrainbow@3.1.0",
4129
4059
  "name": "tinyrainbow",
4130
- "version": "2.0.0",
4131
- "purl": "pkg:npm/tinyrainbow@2.0.0",
4132
- "licenses": [
4133
- {
4134
- "license": {
4135
- "id": "MIT"
4136
- }
4137
- }
4138
- ]
4139
- },
4140
- {
4141
- "type": "library",
4142
- "bom-ref": "pkg:npm/tinyspy@4.0.4",
4143
- "name": "tinyspy",
4144
- "version": "4.0.4",
4145
- "purl": "pkg:npm/tinyspy@4.0.4",
4060
+ "version": "3.1.0",
4061
+ "purl": "pkg:npm/tinyrainbow@3.1.0",
4146
4062
  "licenses": [
4147
4063
  {
4148
4064
  "license": {
@@ -4459,20 +4375,6 @@
4459
4375
  }
4460
4376
  ]
4461
4377
  },
4462
- {
4463
- "type": "library",
4464
- "bom-ref": "pkg:npm/vite-node@3.2.4",
4465
- "name": "vite-node",
4466
- "version": "3.2.4",
4467
- "purl": "pkg:npm/vite-node@3.2.4",
4468
- "licenses": [
4469
- {
4470
- "license": {
4471
- "id": "MIT"
4472
- }
4473
- }
4474
- ]
4475
- },
4476
4378
  {
4477
4379
  "type": "library",
4478
4380
  "bom-ref": "pkg:npm/vite@6.4.2",
@@ -4489,10 +4391,10 @@
4489
4391
  },
4490
4392
  {
4491
4393
  "type": "library",
4492
- "bom-ref": "pkg:npm/vitest@3.2.4",
4394
+ "bom-ref": "pkg:npm/vitest@4.1.8",
4493
4395
  "name": "vitest",
4494
- "version": "3.2.4",
4495
- "purl": "pkg:npm/vitest@3.2.4",
4396
+ "version": "4.1.8",
4397
+ "purl": "pkg:npm/vitest@4.1.8",
4496
4398
  "licenses": [
4497
4399
  {
4498
4400
  "license": {
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "projscan",
3
- "version": "3.3.0",
3
+ "version": "3.4.1",
4
4
  "mcpProtocolVersion": "2025-03-26",
5
- "generatedAt": "2026-06-03T16:23:55.468Z",
6
- "toolCount": 40,
5
+ "generatedAt": "2026-06-04T06:12:30.232Z",
6
+ "toolCount": 41,
7
7
  "tools": [
8
8
  {
9
9
  "name": "projscan_analyze",
@@ -792,7 +792,7 @@
792
792
  },
793
793
  "manifest_path": {
794
794
  "type": "string",
795
- "description": "\"validate\" only — repo-relative or absolute path to a *.projscan-plugin.json file."
795
+ "description": "\"validate\" only — repo-relative path under .projscan-plugins/ to a *.projscan-plugin.json file."
796
796
  }
797
797
  }
798
798
  }
@@ -864,7 +864,7 @@
864
864
  },
865
865
  "enable_plugins": {
866
866
  "type": "boolean",
867
- "description": "Enable local analyzer plugins for this run, equivalent to PROJSCAN_PLUGINS_PREVIEW=1."
867
+ "description": "Request local analyzer plugin evidence only when this MCP server process already has PROJSCAN_PLUGINS_PREVIEW=1. This argument never enables plugin execution by itself."
868
868
  },
869
869
  "max_tokens": {
870
870
  "type": "number",
@@ -1088,6 +1088,38 @@
1088
1088
  }
1089
1089
  }
1090
1090
  }
1091
+ },
1092
+ {
1093
+ "name": "projscan_understand",
1094
+ "description": "Explain repo map, runtime flows, public contracts, change readiness, and verification proof with cited file/symbol evidence.",
1095
+ "inputSchema": {
1096
+ "type": "object",
1097
+ "properties": {
1098
+ "view": {
1099
+ "type": "string",
1100
+ "enum": [
1101
+ "map",
1102
+ "flow",
1103
+ "contracts",
1104
+ "change",
1105
+ "verify"
1106
+ ],
1107
+ "description": "Understand view. Default: map."
1108
+ },
1109
+ "intent": {
1110
+ "type": "string",
1111
+ "description": "Planned change or question for change-readiness output."
1112
+ },
1113
+ "max_items": {
1114
+ "type": "number",
1115
+ "description": "Maximum items per section. Default: 8, max: 30."
1116
+ },
1117
+ "max_tokens": {
1118
+ "type": "number",
1119
+ "description": "Cap the response to roughly this many tokens."
1120
+ }
1121
+ }
1122
+ }
1091
1123
  }
1092
1124
  ]
1093
1125
  }
package/dist/types.d.ts CHANGED
@@ -966,6 +966,158 @@ export interface QualityScorecardReport {
966
966
  suggestedNextActions: PreflightSuggestedAction[];
967
967
  truncated?: boolean;
968
968
  }
969
+ export type UnderstandView = 'map' | 'flow' | 'contracts' | 'change' | 'verify';
970
+ export interface UnderstandCitation {
971
+ file: string;
972
+ symbol?: string;
973
+ line?: number;
974
+ reason: string;
975
+ }
976
+ export interface UnderstandClaim {
977
+ id: string;
978
+ title: string;
979
+ detail: string;
980
+ confidence: 'low' | 'medium' | 'high';
981
+ citations: UnderstandCitation[];
982
+ }
983
+ export interface UnderstandEntrypoint {
984
+ file: string;
985
+ kind: 'cli' | 'server' | 'route' | 'package-export' | 'test' | 'script' | 'module';
986
+ symbols: string[];
987
+ why: string;
988
+ citations: UnderstandCitation[];
989
+ }
990
+ export interface UnderstandBoundary {
991
+ name: string;
992
+ files: number;
993
+ publicExports: string[];
994
+ dependsOn: string[];
995
+ citations: UnderstandCitation[];
996
+ }
997
+ export interface UnderstandFlowSideEffect {
998
+ kind: 'database' | 'filesystem' | 'network' | 'process' | 'env' | 'unknown';
999
+ label: string;
1000
+ files: string[];
1001
+ citations: UnderstandCitation[];
1002
+ }
1003
+ export interface UnderstandFlow {
1004
+ id: string;
1005
+ label: string;
1006
+ entry: UnderstandEntrypoint;
1007
+ path: string[];
1008
+ sideEffects: UnderstandFlowSideEffect[];
1009
+ confidence: 'low' | 'medium' | 'high';
1010
+ citations: UnderstandCitation[];
1011
+ }
1012
+ export interface UnderstandPublicExport {
1013
+ name: string;
1014
+ file: string;
1015
+ kind: 'package' | 'symbol';
1016
+ citations: UnderstandCitation[];
1017
+ }
1018
+ export interface UnderstandConfigContract {
1019
+ name: string;
1020
+ file: string;
1021
+ kind: 'env' | 'package-script' | 'config-file';
1022
+ required: boolean;
1023
+ citations: UnderstandCitation[];
1024
+ }
1025
+ export interface UnderstandBreakingChangeRisk {
1026
+ id: string;
1027
+ title: string;
1028
+ files: string[];
1029
+ why: string;
1030
+ command: string;
1031
+ }
1032
+ export interface UnderstandContracts {
1033
+ publicExports: UnderstandPublicExport[];
1034
+ configContracts: UnderstandConfigContract[];
1035
+ breakingChangeRisks: UnderstandBreakingChangeRisk[];
1036
+ }
1037
+ export interface UnderstandChangeReadiness {
1038
+ intent: string;
1039
+ blastRadius: Array<{
1040
+ label: string;
1041
+ files: string[];
1042
+ why: string;
1043
+ command: string;
1044
+ }>;
1045
+ safeEdit: {
1046
+ title: string;
1047
+ files: string[];
1048
+ command: string;
1049
+ why: string;
1050
+ };
1051
+ owners: Array<{
1052
+ owner: string;
1053
+ files: string[];
1054
+ reason: string;
1055
+ }>;
1056
+ rollback: {
1057
+ command: string;
1058
+ why: string;
1059
+ };
1060
+ verificationCommands: string[];
1061
+ }
1062
+ export interface UnderstandVerificationTier {
1063
+ id: 'minimal' | 'focused' | 'full';
1064
+ label: string;
1065
+ commands: string[];
1066
+ when: string;
1067
+ }
1068
+ export interface UnderstandDirectTest {
1069
+ file: string;
1070
+ tests: string[];
1071
+ confidence: 'none' | 'low' | 'medium' | 'high';
1072
+ }
1073
+ export interface UnderstandVerification {
1074
+ tiers: UnderstandVerificationTier[];
1075
+ directTests: UnderstandDirectTest[];
1076
+ gaps: Array<{
1077
+ file: string;
1078
+ reason: string;
1079
+ command: string;
1080
+ }>;
1081
+ }
1082
+ export interface UnderstandReadFirst {
1083
+ file: string;
1084
+ why: string;
1085
+ command: string;
1086
+ citations: UnderstandCitation[];
1087
+ }
1088
+ export interface UnderstandRisk {
1089
+ id: string;
1090
+ priority: WorkplanPriority;
1091
+ title: string;
1092
+ files: string[];
1093
+ why: string;
1094
+ command: string;
1095
+ }
1096
+ export interface UnderstandUnknown {
1097
+ id: string;
1098
+ question: string;
1099
+ whyUnknown: string;
1100
+ command: string;
1101
+ }
1102
+ export interface UnderstandReport {
1103
+ schemaVersion: 1;
1104
+ view: UnderstandView;
1105
+ rootPath: string;
1106
+ intent?: string;
1107
+ summary: string;
1108
+ claims: UnderstandClaim[];
1109
+ entrypoints: UnderstandEntrypoint[];
1110
+ boundaries: UnderstandBoundary[];
1111
+ flows: UnderstandFlow[];
1112
+ contracts: UnderstandContracts;
1113
+ changeReadiness: UnderstandChangeReadiness;
1114
+ verification: UnderstandVerification;
1115
+ readFirst: UnderstandReadFirst[];
1116
+ risks: UnderstandRisk[];
1117
+ unknowns: UnderstandUnknown[];
1118
+ commands: string[];
1119
+ truncated?: boolean;
1120
+ }
969
1121
  export interface SessionCoordinationHint {
970
1122
  id: 'current-worktree-check' | 'remembered-session-context' | 'resolve-conflicts';
971
1123
  label: string;
@@ -1023,8 +1175,15 @@ export interface PluginTestResult {
1023
1175
  commands: {
1024
1176
  validate: string;
1025
1177
  test: string;
1178
+ execute: string;
1026
1179
  enable: string;
1027
1180
  };
1181
+ execution: {
1182
+ requested: boolean;
1183
+ executed: boolean;
1184
+ mode: 'static' | 'execute';
1185
+ note: string;
1186
+ };
1028
1187
  context: {
1029
1188
  requested: boolean;
1030
1189
  capabilities: Array<'semanticGraph' | 'dataflow'>;