workspai 0.43.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 (255) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +624 -0
  3. package/contracts/agent-customization-pack.v1.json +229 -0
  4. package/contracts/analyze-last-run.v1.json +106 -0
  5. package/contracts/artifact-remediation-plan.v1.json +163 -0
  6. package/contracts/backend-import-stack-parity.snapshot.json +37 -0
  7. package/contracts/cli-log-event.v1.json +51 -0
  8. package/contracts/create-planner-capabilities.v1.json +251 -0
  9. package/contracts/doctor-project-evidence.v1.json +304 -0
  10. package/contracts/doctor-remediation-plan.v1.json +496 -0
  11. package/contracts/doctor-workspace-evidence.v1.json +315 -0
  12. package/contracts/extension-cli-compatibility.v1.json +26 -0
  13. package/contracts/infra-stack.v1.json +305 -0
  14. package/contracts/module-layout.v1.json +34 -0
  15. package/contracts/module-support.v1.json +20 -0
  16. package/contracts/pipeline-last-run.v1.json +80 -0
  17. package/contracts/release-readiness.v1.json +60 -0
  18. package/contracts/runtime-command-surface.v1.json +364 -0
  19. package/contracts/workspace-intelligence/agent-action-outcome.v1.json +38 -0
  20. package/contracts/workspace-intelligence/blocker-resolution.v1.json +65 -0
  21. package/contracts/workspace-intelligence/doctor-fix-result.v1.json +44 -0
  22. package/contracts/workspace-intelligence/fact-freshness.v1.json +58 -0
  23. package/contracts/workspace-intelligence/studio-blocker-handoff.v1.json +115 -0
  24. package/contracts/workspace-intelligence/workspace-context.v1.json +142 -0
  25. package/contracts/workspace-intelligence/workspace-contract-verify.v1.json +51 -0
  26. package/contracts/workspace-intelligence/workspace-dependency-graph.v1.json +152 -0
  27. package/contracts/workspace-intelligence/workspace-explain.v1.json +31 -0
  28. package/contracts/workspace-intelligence/workspace-impact.v1.json +114 -0
  29. package/contracts/workspace-intelligence/workspace-intelligence-history.v1.json +40 -0
  30. package/contracts/workspace-intelligence/workspace-model-diff.v1.json +105 -0
  31. package/contracts/workspace-intelligence/workspace-model-snapshot.v1.json +36 -0
  32. package/contracts/workspace-intelligence/workspace-model.v1.json +135 -0
  33. package/contracts/workspace-intelligence/workspace-operational-skill.v1.json +37 -0
  34. package/contracts/workspace-intelligence/workspace-skills-index.v1.json +27 -0
  35. package/contracts/workspace-intelligence/workspace-verify.v1.json +213 -0
  36. package/contracts/workspace-registry.v1.json +83 -0
  37. package/contracts/workspace-run-last.v1.json +112 -0
  38. package/data/modules-embeddings.json +16953 -0
  39. package/dist/analyze-5BU4QIPK.js +1 -0
  40. package/dist/artifact-remediation-plan-5GJWPPRS.js +3 -0
  41. package/dist/autopilot-release-QYUOVB26.js +1 -0
  42. package/dist/chunk-22DT744Z.js +1 -0
  43. package/dist/chunk-2E6WGUN6.js +1 -0
  44. package/dist/chunk-2FIX2MDC.js +1 -0
  45. package/dist/chunk-3KXW53QI.js +1 -0
  46. package/dist/chunk-3ZK2GU7C.js +1 -0
  47. package/dist/chunk-4KUIFXHM.js +5 -0
  48. package/dist/chunk-54XJNLYC.js +13 -0
  49. package/dist/chunk-5SWNSJGW.js +1 -0
  50. package/dist/chunk-5XATWNME.js +1 -0
  51. package/dist/chunk-753LOKFZ.js +2 -0
  52. package/dist/chunk-7YHK5NM3.js +2 -0
  53. package/dist/chunk-A5FBGRJA.js +1 -0
  54. package/dist/chunk-AAKUNWPR.js +78 -0
  55. package/dist/chunk-AFSZHLQT.js +1 -0
  56. package/dist/chunk-AQ4XZZC6.js +1 -0
  57. package/dist/chunk-CVTCPPEF.js +1 -0
  58. package/dist/chunk-DNAY5ALC.js +1 -0
  59. package/dist/chunk-EWYYLJQY.js +2 -0
  60. package/dist/chunk-GSWPGELT.js +2 -0
  61. package/dist/chunk-GZTYAEWX.js +1 -0
  62. package/dist/chunk-HTYMXMQM.js +1 -0
  63. package/dist/chunk-IBJEQHJR.js +205 -0
  64. package/dist/chunk-ICGWHIMK.js +1 -0
  65. package/dist/chunk-JEI6BTZI.js +3 -0
  66. package/dist/chunk-JHC6SCJC.js +1 -0
  67. package/dist/chunk-LO4C4VXR.js +4 -0
  68. package/dist/chunk-LPZFK3Y6.js +920 -0
  69. package/dist/chunk-LUP4U6EE.js +1 -0
  70. package/dist/chunk-LYC6AIF2.js +2 -0
  71. package/dist/chunk-LZQNVH7D.js +1 -0
  72. package/dist/chunk-NAAQMSO3.js +1 -0
  73. package/dist/chunk-NFUXULIF.js +1 -0
  74. package/dist/chunk-OCGZNSOE.js +1 -0
  75. package/dist/chunk-OJEWQO3Z.js +33 -0
  76. package/dist/chunk-OL64GWQC.js +9 -0
  77. package/dist/chunk-PI5KUXDA.js +7 -0
  78. package/dist/chunk-PYCJWW4B.js +1 -0
  79. package/dist/chunk-RE773WOX.js +13 -0
  80. package/dist/chunk-RO73VVHW.js +2 -0
  81. package/dist/chunk-S5KTATOU.js +1 -0
  82. package/dist/chunk-SI3AQKIP.js +1 -0
  83. package/dist/chunk-T3GJ7YVG.js +1 -0
  84. package/dist/chunk-T6OR6YOI.js +2 -0
  85. package/dist/chunk-VRDF2J46.js +653 -0
  86. package/dist/chunk-VZKSNUEE.js +2 -0
  87. package/dist/chunk-WU4ZRRA5.js +4 -0
  88. package/dist/chunk-XEJD4KCV.js +33 -0
  89. package/dist/chunk-XZGVNGRB.js +1 -0
  90. package/dist/chunk-Y45WZR5N.js +5 -0
  91. package/dist/create-WRZO4HK2.js +1 -0
  92. package/dist/demo-kit-AJ5LIM5G.js +149 -0
  93. package/dist/doctor-MF3M3FS3.js +1 -0
  94. package/dist/dotnet-webapi-clean-IPY3MCGQ.js +425 -0
  95. package/dist/gofiber-standard-N5N3QGH3.js +1397 -0
  96. package/dist/gogin-standard-LAWQTBWL.js +1459 -0
  97. package/dist/imported-projects-registry-FOIE27WT.js +1 -0
  98. package/dist/index.d.ts +141 -0
  99. package/dist/index.js +454 -0
  100. package/dist/managed-agent-markers-AXUM75OE.js +8 -0
  101. package/dist/module-layout-NZ43RSC5.js +1 -0
  102. package/dist/pipeline-QCUHFWDY.js +5 -0
  103. package/dist/platform-capabilities-XAVU4HSM.js +1 -0
  104. package/dist/pythonRapidkitExec-3L3XJBSY.js +1 -0
  105. package/dist/springboot-standard-OZYF7ZM7.js +697 -0
  106. package/dist/workspace-PR6VZRBG.js +1 -0
  107. package/dist/workspace-agent-sync-KTYF3HQR.js +1 -0
  108. package/dist/workspace-archive-GCZNI44O.js +3 -0
  109. package/dist/workspace-context-QUTOP2XV.js +1 -0
  110. package/dist/workspace-contract-XUGMCUSQ.js +1 -0
  111. package/dist/workspace-explain-JEONEGZZ.js +1 -0
  112. package/dist/workspace-explain-contract-DNS2YEL7.js +1 -0
  113. package/dist/workspace-feedback-R6H4UFZB.js +1 -0
  114. package/dist/workspace-foundation-KGSV4E6D.js +1 -0
  115. package/dist/workspace-graph-2A5THUCI.js +1 -0
  116. package/dist/workspace-history-CGCK2DJI.js +1 -0
  117. package/dist/workspace-intelligence-QJGVL37U.js +1 -0
  118. package/dist/workspace-marker-SMBC3Z2Q.js +1 -0
  119. package/dist/workspace-mcp-serve-AK4MYEHQ.js +3 -0
  120. package/dist/workspace-model-PNXXOGPO.js +1 -0
  121. package/dist/workspace-python-engine-state-MTWIIZPY.js +2 -0
  122. package/dist/workspace-registry-summary-RUJE6RPH.js +1 -0
  123. package/dist/workspace-run-Y7YMUIHX.js +1 -0
  124. package/dist/workspace-verify-WSDUUTR5.js +1 -0
  125. package/dist/workspace-watch-AGPOJ74Q.js +1 -0
  126. package/docs/AI_DYNAMIC_INTEGRATION.md +440 -0
  127. package/docs/AI_EXAMPLES.md +419 -0
  128. package/docs/AI_FEATURES.md +460 -0
  129. package/docs/AI_QUICKSTART.md +245 -0
  130. package/docs/DEVELOPMENT.md +90 -0
  131. package/docs/From Code to Shared Understanding.png +0 -0
  132. package/docs/OPEN_SOURCE_USER_SCENARIOS.md +170 -0
  133. package/docs/OPTIMIZATION_GUIDE.md +504 -0
  134. package/docs/PACKAGE_MANAGER_POLICY.md +25 -0
  135. package/docs/README.md +125 -0
  136. package/docs/SECURITY.md +63 -0
  137. package/docs/SETUP.md +107 -0
  138. package/docs/UTILITIES.md +221 -0
  139. package/docs/WORKSPACE_MARKER_SPEC.md +276 -0
  140. package/docs/ci-workflows.md +59 -0
  141. package/docs/commands-reference.md +172 -0
  142. package/docs/config-file-guide.md +299 -0
  143. package/docs/contracts/ARTIFACT_CATALOG.md +333 -0
  144. package/docs/contracts/CLI_LOG_EVENT_STREAM.md +123 -0
  145. package/docs/contracts/COMMAND_OWNERSHIP_MATRIX.md +138 -0
  146. package/docs/contracts/NAMING_AND_COEXISTENCE.md +60 -0
  147. package/docs/contracts/README.md +86 -0
  148. package/docs/contracts/RUNTIME_ACCEPTANCE_MATRIX.md +98 -0
  149. package/docs/contracts/RUNTIME_SUPPORT_MATRIX.md +75 -0
  150. package/docs/contracts/rapidkit-cli-contracts.json +239 -0
  151. package/docs/create-planner-capabilities.md +81 -0
  152. package/docs/doctor-command.md +467 -0
  153. package/docs/examples/ci-agent-grounding.yml +65 -0
  154. package/docs/from-code-to-shared-understanding.md +45 -0
  155. package/docs/governance-policy.enterprise.example.json +40 -0
  156. package/docs/mirror-config.enterprise.example.json +60 -0
  157. package/docs/policies.workspace.example.yml +23 -0
  158. package/docs/workspace-operations.md +160 -0
  159. package/docs/workspace-run.md +104 -0
  160. package/package.json +179 -0
  161. package/rapidkit.config.example.cjs +62 -0
  162. package/scripts/check-agent-customization-drift.mjs +78 -0
  163. package/scripts/check-cli-resolution.cjs +72 -0
  164. package/scripts/enforce-package-manager.cjs +10 -0
  165. package/scripts/enterprise-package-smoke.mjs +463 -0
  166. package/scripts/prepack-enterprise.mjs +43 -0
  167. package/templates/generator.js +179 -0
  168. package/templates/kits/fastapi-ddd/README.md.j2 +117 -0
  169. package/templates/kits/fastapi-ddd/common/env.example.j2 +10 -0
  170. package/templates/kits/fastapi-ddd/env.example.j2 +1 -0
  171. package/templates/kits/fastapi-ddd/pyproject.toml.j2 +64 -0
  172. package/templates/kits/fastapi-ddd/src/__init__.py.j2 +3 -0
  173. package/templates/kits/fastapi-ddd/src/app/__init__.py.j2 +11 -0
  174. package/templates/kits/fastapi-ddd/src/app/application/__init__.py.j2 +5 -0
  175. package/templates/kits/fastapi-ddd/src/app/application/interfaces.py.j2 +43 -0
  176. package/templates/kits/fastapi-ddd/src/app/application/use_cases/__init__.py.j2 +6 -0
  177. package/templates/kits/fastapi-ddd/src/app/application/use_cases/health.py.j2 +14 -0
  178. package/templates/kits/fastapi-ddd/src/app/application/use_cases/notes.py.j2 +24 -0
  179. package/templates/kits/fastapi-ddd/src/app/config/__init__.py.j2 +16 -0
  180. package/templates/kits/fastapi-ddd/src/app/domain/__init__.py.j2 +3 -0
  181. package/templates/kits/fastapi-ddd/src/app/domain/models/__init__.py.j2 +6 -0
  182. package/templates/kits/fastapi-ddd/src/app/domain/models/health.py.j2 +16 -0
  183. package/templates/kits/fastapi-ddd/src/app/domain/models/note.py.j2 +27 -0
  184. package/templates/kits/fastapi-ddd/src/app/infrastructure/__init__.py.j2 +5 -0
  185. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/__init__.py.j2 +6 -0
  186. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/health.py.j2 +17 -0
  187. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/notes.py.j2 +28 -0
  188. package/templates/kits/fastapi-ddd/src/app/main.py.j2 +61 -0
  189. package/templates/kits/fastapi-ddd/src/app/presentation/__init__.py.j2 +3 -0
  190. package/templates/kits/fastapi-ddd/src/app/presentation/api/__init__.py.j2 +5 -0
  191. package/templates/kits/fastapi-ddd/src/app/presentation/api/dependencies/__init__.py.j2 +19 -0
  192. package/templates/kits/fastapi-ddd/src/app/presentation/api/router.py.j2 +10 -0
  193. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/__init__.py.j2 +5 -0
  194. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/health.py.j2 +27 -0
  195. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/notes.py.j2 +50 -0
  196. package/templates/kits/fastapi-ddd/src/app/shared/__init__.py.j2 +5 -0
  197. package/templates/kits/fastapi-ddd/src/app/shared/result.py.j2 +28 -0
  198. package/templates/kits/fastapi-ddd/src/cli.py.j2 +170 -0
  199. package/templates/kits/fastapi-ddd/src/main.py.j2 +35 -0
  200. package/templates/kits/fastapi-ddd/src/modules/__init__.py.j2 +3 -0
  201. package/templates/kits/fastapi-ddd/src/routing/__init__.py.j2 +13 -0
  202. package/templates/kits/fastapi-ddd/src/routing/health.py.j2 +7 -0
  203. package/templates/kits/fastapi-ddd/src/routing/notes.py.j2 +7 -0
  204. package/templates/kits/fastapi-ddd/tests/__init__.py.j2 +1 -0
  205. package/templates/kits/fastapi-ddd/tests/test_app_factory.py.j2 +22 -0
  206. package/templates/kits/fastapi-ddd/tests/test_health.py.j2 +17 -0
  207. package/templates/kits/fastapi-ddd/tests/test_notes.py.j2 +27 -0
  208. package/templates/kits/fastapi-standard/README.md.j2 +140 -0
  209. package/templates/kits/fastapi-standard/common/env.example.j2 +10 -0
  210. package/templates/kits/fastapi-standard/env.example.j2 +1 -0
  211. package/templates/kits/fastapi-standard/pyproject.toml.j2 +64 -0
  212. package/templates/kits/fastapi-standard/src/__init__.py.j2 +3 -0
  213. package/templates/kits/fastapi-standard/src/cli.py.j2 +171 -0
  214. package/templates/kits/fastapi-standard/src/main.py.j2 +66 -0
  215. package/templates/kits/fastapi-standard/src/modules/__init__.py.j2 +3 -0
  216. package/templates/kits/fastapi-standard/src/routing/__init__.py.j2 +16 -0
  217. package/templates/kits/fastapi-standard/src/routing/examples.py.j2 +71 -0
  218. package/templates/kits/fastapi-standard/src/routing/health.py.j2 +22 -0
  219. package/templates/kits/fastapi-standard/tests/__init__.py.j2 +1 -0
  220. package/templates/kits/fastapi-standard/tests/test_examples.py.j2 +29 -0
  221. package/templates/kits/fastapi-standard/tests/test_health.py.j2 +17 -0
  222. package/templates/kits/nestjs-standard/Dockerfile.j2 +41 -0
  223. package/templates/kits/nestjs-standard/README.md.j2 +134 -0
  224. package/templates/kits/nestjs-standard/docker-compose.yml.j2 +94 -0
  225. package/templates/kits/nestjs-standard/docs/README.md.j2 +15 -0
  226. package/templates/kits/nestjs-standard/env.example.j2 +18 -0
  227. package/templates/kits/nestjs-standard/eslint.config.cjs.j2 +9 -0
  228. package/templates/kits/nestjs-standard/jest.config.ts.j2 +28 -0
  229. package/templates/kits/nestjs-standard/nest-cli.json.j2 +10 -0
  230. package/templates/kits/nestjs-standard/package.json.j2 +101 -0
  231. package/templates/kits/nestjs-standard/src/app.controller.ts.j2 +14 -0
  232. package/templates/kits/nestjs-standard/src/app.module.ts.j2 +26 -0
  233. package/templates/kits/nestjs-standard/src/app.service.ts.j2 +16 -0
  234. package/templates/kits/nestjs-standard/src/auth/auth.controller.ts.j2 +20 -0
  235. package/templates/kits/nestjs-standard/src/auth/auth.module.ts.j2 +13 -0
  236. package/templates/kits/nestjs-standard/src/auth/auth.service.ts.j2 +6 -0
  237. package/templates/kits/nestjs-standard/src/auth/entities/token.entity.ts.j2 +3 -0
  238. package/templates/kits/nestjs-standard/src/auth/entities/user.entity.ts.j2 +3 -0
  239. package/templates/kits/nestjs-standard/src/auth/entities/webauthn.entity.ts.j2 +3 -0
  240. package/templates/kits/nestjs-standard/src/config/configuration.ts.j2 +85 -0
  241. package/templates/kits/nestjs-standard/src/config/index.ts.j2 +2 -0
  242. package/templates/kits/nestjs-standard/src/config/validation.ts.j2 +21 -0
  243. package/templates/kits/nestjs-standard/src/examples/dto/create-note.dto.ts.j2 +11 -0
  244. package/templates/kits/nestjs-standard/src/examples/examples.controller.ts.j2 +24 -0
  245. package/templates/kits/nestjs-standard/src/examples/examples.module.ts.j2 +10 -0
  246. package/templates/kits/nestjs-standard/src/examples/examples.service.ts.j2 +33 -0
  247. package/templates/kits/nestjs-standard/src/main.ts.j2 +53 -0
  248. package/templates/kits/nestjs-standard/src/modules/index.ts.j2 +25 -0
  249. package/templates/kits/nestjs-standard/test/app.controller.spec.ts.j2 +24 -0
  250. package/templates/kits/nestjs-standard/test/app.e2e-spec.ts.j2 +60 -0
  251. package/templates/kits/nestjs-standard/test/examples.controller.spec.ts.j2 +28 -0
  252. package/templates/kits/nestjs-standard/test/jest-e2e.json.j2 +15 -0
  253. package/templates/kits/nestjs-standard/tsconfig.build.json.j2 +12 -0
  254. package/templates/kits/nestjs-standard/tsconfig.json.j2 +26 -0
  255. package/workspai.config.example.cjs +62 -0
@@ -0,0 +1,467 @@
1
+ # Workspai Doctor Command
2
+
3
+ `doctor` checks health for the npm wrapper environment in system, workspace, or project scope.
4
+
5
+ **Related:** [workspace-operations.md](./workspace-operations.md) · [commands-reference.md](./commands-reference.md) · [Documentation index](./README.md)
6
+
7
+ ## Command Modes
8
+
9
+ ### 1) System Check
10
+
11
+ ```bash
12
+ npx workspai doctor
13
+ ```
14
+
15
+ Checks host prerequisites:
16
+
17
+ - Python
18
+ - Poetry (optional)
19
+ - pipx (optional)
20
+ - RapidKit Core availability
21
+ - Go (optional)
22
+
23
+ ### 2) Workspace Check (Canonical)
24
+
25
+ ```bash
26
+ cd my-workspace
27
+ npx workspai doctor workspace
28
+ ```
29
+
30
+ Checks:
31
+
32
+ - all system checks
33
+ - workspace marker resolution
34
+ - project discovery and per-project health
35
+ - dependency/env readiness by project type (Python/Node/Go)
36
+
37
+ > Compatibility note: `npx workspai doctor --workspace` still works, but `doctor workspace` is the canonical form.
38
+
39
+ ### 3) Project Check (Canonical)
40
+
41
+ ```bash
42
+ cd my-workspace/my-project
43
+ npx workspai doctor project
44
+ ```
45
+
46
+ Checks:
47
+
48
+ - all system checks
49
+ - nearest project resolution (current folder or parent with project markers)
50
+ - project-specific framework/runtime health
51
+ - dependency/env readiness for the selected project
52
+ - enterprise probes (config contract, migration surface, runtime health surface)
53
+ - score explainability breakdown for audit trails
54
+
55
+ > Compatibility note: `npx workspai doctor --project` also works.
56
+
57
+ ## Typical Usage
58
+
59
+ ```bash
60
+ # Pre-flight on a contributor machine
61
+ npx workspai doctor
62
+
63
+ # Full check inside a workspace
64
+ npx workspai doctor workspace
65
+
66
+ # Focus only on current project
67
+ npx workspai doctor project
68
+
69
+ # Machine-readable output
70
+ npx workspai doctor workspace --json
71
+
72
+ # Attempt safe fixes (interactive)
73
+ npx workspai doctor workspace --fix
74
+
75
+ # Attempt safe fixes for current project only
76
+ npx workspai doctor project --fix
77
+
78
+ # JSON output with audit-ready breakdown + probes
79
+ npx workspai doctor project --json
80
+
81
+ # Release-grade policy profile
82
+ npx workspai doctor workspace --profile enterprise-strict --json
83
+ ```
84
+
85
+ ## Enterprise Fix Pipeline
86
+
87
+ Doctor supports policy profiles so the same evidence can be interpreted correctly in local,
88
+ CI, release, and enterprise gates:
89
+
90
+ | Profile | Use when | Warning behavior |
91
+ | ------------------- | -------------------------------- | ---------------------------------------- |
92
+ | `local` | Developer diagnostics | Report warnings, do not block |
93
+ | `ci` | CI feedback loop | Exit `2` on warnings, `1` on errors |
94
+ | `release` | Release readiness gate | Exit `1` on warnings or errors |
95
+ | `enterprise-strict` | Enterprise/studio repair workflow | Exit `1`; every warning needs evidence or repair guidance |
96
+
97
+ `--strict` maps to the `release` profile and `--ci` maps to the `ci` profile for backward
98
+ compatibility. JSON evidence includes `policyProfile` so Workspai and CI can explain why a
99
+ card is advisory locally but blocking for release.
100
+
101
+ Doctor also attaches a **freshness contract** to evidence so tools do not treat live state as
102
+ durable structure:
103
+
104
+ | Freshness category | Meaning | Default TTL |
105
+ | ------------------ | -------------------------------------------- | ----------- |
106
+ | `structure` | Durable project/workspace shape and markers | 7 days |
107
+ | `verification` | Test, script, lint, quality, and probe checks | 24 hours |
108
+ | `state` | Live dependency/security state | 5 minutes |
109
+
110
+ Each probe can include `freshness`, and each JSON artifact includes `evidenceFreshness`.
111
+ Workspai and CI should refresh stale or `verifyBeforeUse` evidence before claiming a project is
112
+ ready, repaired, or release-safe.
113
+
114
+ Doctor probes also include an **issue taxonomy** and **repair intent** for Studio-driven repair:
115
+
116
+ | Field | Purpose |
117
+ | ------------------- | ----------------------------------------------------------------------- |
118
+ | `issueClass` | Stable category such as `security`, `test`, `container`, or `dependency` |
119
+ | `operationalImpact` | Product impact such as `ci-risk`, `release-risk`, or `security-risk` |
120
+ | `repairIntent.mode` | Studio action mode: `edit-file`, `run-command`, `review-required`, `verify-before-fix`, or `refresh-evidence` |
121
+
122
+ This lets Workspai distinguish "show guidance" from "apply an approved file edit", "run a command",
123
+ or "refresh stale/live evidence first".
124
+
125
+ When `--fix` is enabled, Doctor now runs a staged treatment pipeline:
126
+
127
+ 1. Fix policy engine assigns risk for each fix step (`safe`, `guarded`, `invasive`).
128
+ 2. Transaction snapshots are created for guarded/invasive steps and project-scoped file edits.
129
+ 3. Repair capabilities from probes can promote safe, typed fixes into the plan.
130
+ 4. Dependency orchestrator executes known dependency commands via structured adapters.
131
+ 5. Post-fix verification re-runs project diagnostics.
132
+ 6. Retry policy re-attempts transient network failures once before failing.
133
+
134
+ If a guarded/invasive step or file edit fails, Doctor attempts rollback from snapshot and records
135
+ the failure. Newly-created files are tracked and removed during rollback if the fix cannot finish.
136
+
137
+ `--plan --json`, `--fix --json`, and `--apply --json` include a remediation plan with
138
+ `schemaVersion: doctor-remediation-plan-v2`. This plan is the Studio handoff contract: every step
139
+ has a stable `id`, `phase`, `order`, `dependsOn`, `issueId`, `issueClass`, `operationalImpact`,
140
+ `repairIntent`, affected `files`, typed `operation` when Doctor can edit safely, a human-readable
141
+ `preview`, deterministic `diffPreview`, `verifyCommand`, `refreshCommands`, rollback strategy, and
142
+ `studioStatus`.
143
+
144
+ The same plan is persisted to:
145
+
146
+ ```text
147
+ .workspai/reports/doctor-remediation-plan-last-run.json
148
+ ```
149
+
150
+ After `--fix` or `--apply`, Doctor also persists the execution result:
151
+
152
+ ```text
153
+ .workspai/reports/doctor-fix-result-last-run.json
154
+ ```
155
+
156
+ and appends a `kind: doctor-fix` entry to
157
+ `.workspai/reports/workspace-intelligence-history.json`. This gives Workspai a closed repair loop:
158
+ plan -> approved command/edit -> execution result -> refreshed evidence -> history.
159
+
160
+ For `doctor project` inside a workspace, the canonical governance copy stays under the workspace
161
+ `.workspai/reports/` directory and Doctor mirrors the project evidence, remediation plan, and fix
162
+ result into the scoped project's `.workspai/reports/` directory. Project-local tools can inspect the
163
+ same repair evidence without guessing the workspace root.
164
+
165
+ The remediation plan is intentionally ordered for Studio execution:
166
+
167
+ | Phase | Purpose |
168
+ | --- | --- |
169
+ | `dependency-baseline` | Restore package/runtime dependency baselines before other fixes |
170
+ | `local-environment` | Seed local env files without overwriting operator-owned values |
171
+ | `source-hygiene` | Apply safe project-scoped hygiene files such as `.dockerignore` or `.gitignore` rules |
172
+ | `command-contract` | Add missing test, quality, audit, or runtime command contracts |
173
+ | `runtime-governance` | Run RapidKit/workspace initializers that may touch multiple project surfaces |
174
+ | `manual-review` | Surface guidance that requires a human decision |
175
+ | `generic-execution` | Last-resort shell remediation when no typed operation exists |
176
+
177
+ `dependsOn` lets Workspai avoid false loops: for example, a missing test script repair can depend on
178
+ the project dependency baseline step, so Studio can run or ask for approval in the same order Doctor
179
+ would use.
180
+
181
+ Workspai should use this contract to offer two clear actions for a blocked card:
182
+
183
+ 1. Run the exact diagnostic or remediation command when the safest path is command execution.
184
+ 2. Apply the approved file edit when Doctor exposes a typed, project-scoped operation.
185
+
186
+ After either path, Studio should run the step `verifyCommand` when present, then refresh the card
187
+ with `refreshCommands` before claiming the issue is resolved.
188
+
189
+ In `enterprise-strict`, guarded and invasive fixes are exposed as `review-required` even when they
190
+ are executable. That keeps Studio honest: it can preview and propose the change, but the operator
191
+ must approve before Doctor mutates project files or runs a dependency command.
192
+
193
+ The Doctor test suite includes a multi-stack remediation canary matrix for Node/Next.js,
194
+ Python/Poetry, Go, Rust, PHP/Composer, Ruby/Bundler, and .NET. The canary validates both
195
+ `doctor project --plan --json` and workspace-level dashboard aggregation so new runtime support
196
+ cannot silently regress the Studio handoff contract.
197
+
198
+ Repair-capable probes include a `repairCapability` object in JSON/evidence output. This is the
199
+ contract IDEs and Workspai use to distinguish an explanatory warning from an approved repair path:
200
+
201
+ ```json
202
+ {
203
+ "id": "frontend-script-test",
204
+ "status": "warn",
205
+ "repairCapability": {
206
+ "issueId": "frontend-script-test",
207
+ "fixKind": "package-json-script",
208
+ "canAutoFix": true,
209
+ "canEditFiles": true,
210
+ "requiresApproval": true,
211
+ "files": ["package.json"],
212
+ "operation": {
213
+ "type": "package-json-script",
214
+ "path": "package.json",
215
+ "scriptName": "test",
216
+ "scriptValue": "npm run lint"
217
+ },
218
+ "verifyCommand": "npx workspai doctor project --json"
219
+ }
220
+ }
221
+ ```
222
+
223
+ For example, a frontend project with `lint` or `build` but no `test` script can receive a guarded
224
+ `package.json` repair. `doctor workspace --fix --json` applies the package script update through
225
+ Doctor's structured executor instead of falling back to an opaque shell command. Structured
226
+ operations include file create/append/copy, package script creation, JSON pointer edits, env key
227
+ additions, and Makefile target additions.
228
+
229
+ File hygiene repairs use the same contract. A Dockerfile without `.dockerignore` can produce a
230
+ safe `file-create` operation, and a `.gitignore` missing env-file rules can produce a safe
231
+ `file-append` operation. Workspai can render those operations as reviewable file edits before the
232
+ operator approves the fix.
233
+
234
+ Local environment seeding is also typed. When `.env.example` exists and `.env` is missing, Doctor
235
+ emits a safe `file-copy` operation instead of an opaque shell copy command. The target is never
236
+ overwritten.
237
+
238
+ For Node projects without a security audit script, Doctor can emit a guarded
239
+ `package-json-script` operation for `scripts.audit="npm audit --audit-level=moderate"`, giving CI,
240
+ Studio, and humans the same deterministic security check.
241
+
242
+ For projects with dependency manifests but no deterministic baseline, Doctor emits guarded
243
+ `dependency-sync` repairs when the runtime has a safe native command:
244
+
245
+ - Node: `npm install`, `pnpm install`, `yarn install`, or `bun install`
246
+ - Go: `go mod tidy`
247
+ - Rust: `cargo fetch`
248
+ - PHP: `composer install`
249
+ - Ruby: `bundle install`
250
+ - .NET: `dotnet restore`
251
+ - Python: `poetry lock` or `uv lock` when the project metadata identifies the tool
252
+
253
+ When the runtime does not expose a safe deterministic repair path, Doctor keeps the issue as
254
+ review-required guidance instead of guessing.
255
+
256
+ Doctor can also create **runtime command contracts** for missing test, quality, and security
257
+ surfaces. For Node, safe contracts are written as `package.json` scripts when a deterministic
258
+ fallback exists. For backend runtimes such as Go, Python, Rust, PHP, Ruby, .NET, and Java, Doctor
259
+ uses guarded `Makefile` target repairs (`test`, `quality`, `security`) so Studio can preview and
260
+ apply the file edit without executing an unprovisioned toolchain immediately.
261
+
262
+ ## Enterprise Surface Probes
263
+
264
+ Doctor also emits language-agnostic product-readiness probes for every detected project. These
265
+ probes do not replace runtime-specific checks; they add a common enterprise baseline that Workspai,
266
+ CI, and agents can reason about consistently across frontend and backend stacks:
267
+
268
+ | Surface | Probe examples |
269
+ | ----------- | ---------------------------------------------------------------------------------- |
270
+ | Dependency | Runtime manifest plus deterministic lock/baseline (`package-lock`, `go.sum`, etc.) |
271
+ | Environment | `.env.example`, config schema, or environment documentation |
272
+ | Container | Dockerfile / compose presence and `.dockerignore` hygiene |
273
+ | Deployment | Kubernetes/Helm/Kustomize surface plus readiness probes and resource controls |
274
+ | Security | Vulnerability evidence, `.gitignore` hygiene, audit-script guidance |
275
+ | Tests | Runtime/framework test scripts, configs, directories, or test files |
276
+ | Formatting | Node formatter command surface for CI parity |
277
+
278
+ These probes are intentionally evidence-first. Missing optional surfaces are surfaced as warnings
279
+ or manual repair capabilities, while deterministic repairs are promoted into `--fix` only when the
280
+ change is safe enough for Doctor to apply with approval and post-fix verification.
281
+
282
+ Runtime-native probes add a second layer on top of the generic surface checks:
283
+
284
+ | Runtime family | Native signals sampled by Doctor |
285
+ | -------------- | --------------------------------------------------------------------- |
286
+ | Node/Bun/Deno | test runners, ESLint/Prettier/Biome markers, audit script/tooling |
287
+ | Python | pytest/tox/nox, Ruff/Black/Mypy, pip-audit/Safety/Bandit markers |
288
+ | Go | `*_test.go`, golangci-lint/Makefile quality, govulncheck/gosec hints |
289
+ | Java | Maven/Gradle tests, Checkstyle/Spotless/PMD, OWASP dependency checks |
290
+ | .NET | test projects, `.editorconfig`, NuGet audit and vulnerable checks |
291
+ | Rust | test/Cargo markers, rustfmt/clippy, cargo-audit hints |
292
+ | PHP/Ruby/etc. | PHPUnit/Pint/PHPStan, RSpec/RuboCop/Bundler-audit and ecosystem hints |
293
+
294
+ ## CI Example
295
+
296
+ ```yaml
297
+ name: Health Check
298
+ on: [push]
299
+
300
+ jobs:
301
+ doctor:
302
+ runs-on: ubuntu-latest
303
+ steps:
304
+ - uses: actions/checkout@v4
305
+ - uses: actions/setup-node@v4
306
+ with:
307
+ node-version: '20'
308
+ - run: npm ci
309
+ - run: npx workspai doctor
310
+ ```
311
+
312
+ ## Exit Codes
313
+
314
+ | Code | Meaning |
315
+ | ---- | ------------------------------ |
316
+ | `0` | checks passed or warnings only |
317
+ | `1` | blocking issues found |
318
+
319
+ ## Enterprise Probe Extensions
320
+
321
+ Doctor supports project-local custom probes via JSON contract files:
322
+
323
+ - `.workspai/doctor.probes.json`
324
+ - `doctor.probes.json`
325
+
326
+ Schema:
327
+
328
+ ```json
329
+ {
330
+ "probes": [
331
+ {
332
+ "id": "db-schema-contract",
333
+ "label": "Database schema contract",
334
+ "severity": "error",
335
+ "anyOfPaths": ["prisma/schema.prisma", "migrations"],
336
+ "allOfPaths": ["README.md"],
337
+ "recommendation": "Define deterministic schema + migration baseline."
338
+ }
339
+ ]
340
+ }
341
+ ```
342
+
343
+ Each probe is evaluated during `doctor project` and emitted in:
344
+
345
+ - human output (`Probe checks`)
346
+ - JSON output (`project.probes`)
347
+ - evidence (`doctor-project-last-run.json`)
348
+
349
+ ## Adapter Plugin Contract
350
+
351
+ Doctor also supports runtime adapter checks via JSON contracts:
352
+
353
+ - `.workspai/doctor.adapters.json`
354
+ - `doctor.adapters.json`
355
+
356
+ Schema:
357
+
358
+ ```json
359
+ {
360
+ "checks": [
361
+ {
362
+ "id": "boot-probe-contract",
363
+ "label": "Boot probe contract",
364
+ "severity": "error",
365
+ "runtimes": ["node", "python"],
366
+ "anyOfPaths": ["src/main.ts", "app/main.py"],
367
+ "allOfPaths": ["README.md"],
368
+ "recommendation": "Expose deterministic bootstrap path and document runtime startup.",
369
+ "passReason": "Bootstrap contract markers detected.",
370
+ "failReason": "Bootstrap contract markers are missing."
371
+ }
372
+ ]
373
+ }
374
+ ```
375
+
376
+ This enables enterprise teams to extend Doctor checks without patching core CLI logic.
377
+
378
+ ## Score Explainability
379
+
380
+ Both workspace/project JSON outputs include `scoreBreakdown` with:
381
+
382
+ - `id` and `label`
383
+ - normalized `status` (`ok`, `warn`, `error`)
384
+ - `scope` (`host-system`, `project-scoped`)
385
+ - `policyRuleId` (deterministic rule that selected status/severity)
386
+ - deterministic `reason`
387
+
388
+ Workspace scope additionally appends aggregate policy rules (`workspace-aggregate`), such as:
389
+
390
+ - discovery gate
391
+ - system error gate
392
+ - blocking issue gate
393
+ - advisory warning gate
394
+
395
+ This allows CI and governance pipelines to audit why a score was produced.
396
+
397
+ ## Contract Metadata (Enterprise)
398
+
399
+ Both JSON output and evidence files include a `contract` object:
400
+
401
+ - `version`: current doctor evidence contract version
402
+ - `scoringPolicyVersion`: current deterministic scoring policy version
403
+ - `generatedBy`: emitting surface (`workspai`)
404
+ - `deterministicScoreBreakdown`: explicit deterministic score policy flag
405
+ - `scopeModel`: how scope semantics are encoded
406
+
407
+ Use these fields for strict consumers in CI/CD and extension adapters to prevent schema drift.
408
+
409
+ ## Drift Delta and Scope Provenance
410
+
411
+ Workspace/project outputs now include:
412
+
413
+ - `summary.scopeProvenance`: scoped vs aggregated vs mixed coverage summary
414
+ - `driftDelta`: change report compared with previous evidence (new/resolved issues, score delta, system status changes)
415
+
416
+ These fields are designed for release gates and extension timeline cards that must show progression, not only snapshots.
417
+
418
+ ## Workspace scope CI exit codes
419
+
420
+ - `npx workspai doctor workspace --strict` exits `1` when health score reports errors **or** warnings.
421
+ - `npx workspai doctor workspace --ci` exits `1` on errors and `2` on warnings only (errors take precedence).
422
+ - Without `--strict` or `--ci`, doctor reports findings but exits `0` (backward compatible).
423
+
424
+ ## Workspace fix behavior
425
+
426
+ - Reuses cached project scans when valid; refreshes `.workspai/reports/doctor-last-run.json`.
427
+ - `--fix` runs interactive remediation; `--plan` prints remediation plan only; `--apply` applies non-interactively.
428
+ - `--plan` cannot be combined with `--fix` or `--apply`.
429
+ - JSON fix/apply output includes the same `doctor-remediation-plan-v2` contract used by Studio.
430
+ - Advisory warnings do not automatically become shell fix commands.
431
+ - Go `go mod tidy` fixes are skipped when the Go toolchain is unavailable.
432
+
433
+ ## Workspace JSON fields (AI/automation)
434
+
435
+ `npx workspai doctor workspace --json` includes per-project metadata: `framework`, `frameworkKey`, `importStack`, `runtimeFamily`, `projectKind`, `supportTier`, `frameworkConfidence`, `probes`, and `repairCapabilities`.
436
+
437
+ ## Project scope behavior
438
+
439
+ - Resolves current or nearest parent project from nested directories.
440
+ - Supports Workspai, legacy RapidKit, and non-Workspai projects when project metadata is missing.
441
+ - Evidence: `.workspai/reports/doctor-project-last-run.json`.
442
+ - `--fix`, `--plan`, and `--apply` apply only project-scoped fixes.
443
+
444
+ ## Project JSON fields (AI/automation)
445
+
446
+ `npx workspai doctor project --json` includes `scope`, `contract`, `project`, `summary.scopeProvenance`, `driftDelta`, and `scoreBreakdown`. The `project` payload includes probe-level `repairCapability` entries and a flattened `repairCapabilities` list when deterministic repairs are available.
447
+
448
+ ## Evidence schema compatibility
449
+
450
+ - Workspace evidence: `doctor-workspace-evidence-v1`
451
+ - Project evidence: `doctor-project-evidence-v1`
452
+ - Workspace scan cache: `doctor-workspace-cache-v2`
453
+
454
+ Legacy evidence without `schemaVersion` is still accepted. Unknown versions are treated as invalid evidence. `readiness` and `workspace share` share the same validation path.
455
+
456
+ ## Related Workspace Commands
457
+
458
+ ```bash
459
+ npx workspai bootstrap [--profile <profile>]
460
+ npx workspai setup <python|node|go> [--warm-deps]
461
+ npx workspai workspace list
462
+ npx workspai cache <status|clear|prune|repair>
463
+ npx workspai mirror <status|sync|verify|rotate>
464
+ ```
465
+
466
+ Use `doctor workspace` before and after major workspace operations to detect drift early.
467
+ Use `doctor project` before changing a single service to keep project-scope evidence deterministic.
@@ -0,0 +1,65 @@
1
+ # Example: Workspai agent grounding gate for consumer workspaces
2
+ #
3
+ # Copy to your repo as `.github/workflows/workspai-agent-grounding.yml`
4
+ # and adjust `working-directory` to your Workspai workspace root.
5
+ #
6
+ # Requires: Node.js 20+, `workspai` available via npx in CI.
7
+
8
+ name: Workspai Agent Grounding
9
+
10
+ on:
11
+ pull_request:
12
+ paths:
13
+ - '.rapidkit/**'
14
+ - 'AGENTS.md'
15
+ - 'CLAUDE.md'
16
+ - '.github/copilot-instructions.md'
17
+ - '.cursor/rules/**'
18
+ workflow_dispatch:
19
+
20
+ jobs:
21
+ agent-grounding:
22
+ runs-on: ubuntu-latest
23
+ defaults:
24
+ run:
25
+ working-directory: . # set to your workspace root if nested
26
+
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+
30
+ - uses: actions/setup-node@v4
31
+ with:
32
+ node-version: '20'
33
+
34
+ - name: Install Workspai CLI
35
+ run: npm install --no-save workspai
36
+
37
+ - name: Run governance pipeline
38
+ run: npx workspai pipeline --json --strict
39
+ continue-on-error: true
40
+ id: pipeline
41
+
42
+ - name: Sync and verify agent grounding
43
+ run: |
44
+ npx workspai workspace agent-sync --write --refresh-context --strict --json --preset enterprise
45
+ node ./node_modules/workspai/scripts/check-agent-customization-drift.mjs --workspace .
46
+ env:
47
+ RAPIDKIT_NO_AGENT_SYNC: '0'
48
+
49
+ - name: Upload agent grounding artifacts
50
+ if: always()
51
+ uses: actions/upload-artifact@v4
52
+ with:
53
+ name: workspai-agent-grounding
54
+ path: |
55
+ .workspai/reports/INDEX.json
56
+ .workspai/reports/workspace-context-agent.json
57
+ .workspai/reports/agent-customization-pack.json
58
+ .workspai/reports/workspai-mcp-design.json
59
+ .workspai/reports/pipeline-last-run.json
60
+ AGENTS.md
61
+ if-no-files-found: ignore
62
+
63
+ - name: Fail if pipeline blocked
64
+ if: steps.pipeline.outcome == 'failure'
65
+ run: exit 1
@@ -0,0 +1,45 @@
1
+ # From Code to Shared Understanding
2
+
3
+ How Workspai transforms projects and repositories into workspace intelligence for developers, CI, and AI agents.
4
+
5
+ This Mermaid diagram is kept in the internal documentation because GitHub renders it correctly. The main npm README uses a PNG version of the same diagram so it remains visible on npm package pages.
6
+
7
+ ```mermaid
8
+ flowchart TB
9
+
10
+ Code["Code & Repositories"]
11
+ Projects["Projects"]
12
+ Workspace["Workspace"]
13
+
14
+ Code --> Projects
15
+ Projects --> Workspace
16
+
17
+ subgraph Intelligence["Workspace Intelligence"]
18
+ Model["Workspace Model"]
19
+ Context["Agent Context"]
20
+ Impact["Impact Analysis"]
21
+ Verify["Verification"]
22
+ Evidence["Evidence & Gates"]
23
+ end
24
+
25
+ Workspace --> Model
26
+ Workspace --> Context
27
+ Workspace --> Impact
28
+ Workspace --> Verify
29
+ Workspace --> Evidence
30
+
31
+ Model --> Dev["Developers"]
32
+ Model --> CI["CI"]
33
+ Model --> Agents["AI Agents"]
34
+
35
+ Context --> Agents
36
+
37
+ Impact --> Dev
38
+ Impact --> CI
39
+
40
+ Verify --> CI
41
+ Verify --> Agents
42
+ Evidence --> Dev
43
+ Evidence --> CI
44
+ Evidence --> Agents
45
+ ```
@@ -0,0 +1,40 @@
1
+ {
2
+ "policies": {
3
+ "dev": {
4
+ "allowedIdentities": [
5
+ "release@your-org.example"
6
+ ],
7
+ "allowedIssuers": [
8
+ "https://token.actions.githubusercontent.com"
9
+ ],
10
+ "allowedRekorUrls": [
11
+ "https://rekor.sigstore.dev"
12
+ ],
13
+ "requireTransparencyLog": false
14
+ },
15
+ "stage": {
16
+ "allowedIdentities": [
17
+ "release@your-org.example"
18
+ ],
19
+ "allowedIssuers": [
20
+ "https://token.actions.githubusercontent.com"
21
+ ],
22
+ "allowedRekorUrls": [
23
+ "https://rekor.sigstore.dev"
24
+ ],
25
+ "requireTransparencyLog": true
26
+ },
27
+ "prod": {
28
+ "allowedIdentities": [
29
+ "release@your-org.example"
30
+ ],
31
+ "allowedIssuers": [
32
+ "https://token.actions.githubusercontent.com"
33
+ ],
34
+ "allowedRekorUrls": [
35
+ "https://rekor.sigstore.dev"
36
+ ],
37
+ "requireTransparencyLog": true
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "enabled": true,
3
+ "mode": "offline-first",
4
+ "prefetch": {
5
+ "retries": 2,
6
+ "backoffMs": 300,
7
+ "timeoutMs": 15000
8
+ },
9
+ "retention": {
10
+ "keepLast": 10
11
+ },
12
+ "security": {
13
+ "requireAttestation": true,
14
+ "requireSigstore": true,
15
+ "requireTransparencyLog": true,
16
+ "requireSignedGovernance": true,
17
+ "governanceBundle": {
18
+ "policyPath": ".workspai/governance-policy.json",
19
+ "signaturePath": ".workspai/governance-policy.sig",
20
+ "publicKeyPath": ".workspai/governance-public.pem",
21
+ "algorithm": "sha256"
22
+ },
23
+ "evidenceExport": {
24
+ "enabled": true,
25
+ "target": "http",
26
+ "endpoint": "https://siem.example.com/intake/rapidkit",
27
+ "authTokenEnv": "RAPIDKIT_EVIDENCE_TOKEN",
28
+ "timeoutMs": 10000,
29
+ "retries": 3,
30
+ "backoffMs": 500,
31
+ "deadLetterPath": ".workspai/reports/evidence-export-dead-letter.ndjson",
32
+ "signing": {
33
+ "enabled": true,
34
+ "hmacKeyEnv": "RAPIDKIT_EVIDENCE_HMAC_KEY",
35
+ "algorithm": "sha256",
36
+ "headerName": "x-rapidkit-evidence-signature"
37
+ },
38
+ "failOnError": true
39
+ }
40
+ },
41
+ "artifacts": [
42
+ {
43
+ "id": "backend-release",
44
+ "source": "mirror-source/release.bin",
45
+ "target": "releases/release.bin",
46
+ "sha256": "PUT_REAL_SHA256_HERE",
47
+ "required": true,
48
+ "attestation": {
49
+ "signature": "BASE64_DETACHED_SIGNATURE",
50
+ "publicKeyPath": ".workspai/mirror-public.pem",
51
+ "sigstore": {
52
+ "signaturePath": ".workspai/release.sig",
53
+ "identity": "release@your-org.example",
54
+ "issuer": "https://token.actions.githubusercontent.com",
55
+ "rekorUrl": "https://rekor.sigstore.dev"
56
+ }
57
+ }
58
+ }
59
+ ]
60
+ }