rapidkit 0.36.0 → 0.37.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 (97) hide show
  1. package/README.md +195 -24
  2. package/contracts/analyze-last-run.v1.json +106 -0
  3. package/contracts/cli-log-event.v1.json +51 -0
  4. package/contracts/doctor-project-evidence.v1.json +46 -0
  5. package/contracts/doctor-workspace-evidence.v1.json +57 -0
  6. package/contracts/release-readiness.v1.json +60 -0
  7. package/contracts/workspace-registry.v1.json +83 -0
  8. package/contracts/workspace-run-last.v1.json +112 -0
  9. package/dist/analyze-6RFG7C7Z.js +1 -0
  10. package/dist/autopilot-release-QNZ2IL7K.js +1 -0
  11. package/dist/chunk-3SWQKRXH.js +2 -0
  12. package/dist/chunk-6P5DCHBQ.js +4 -0
  13. package/dist/chunk-7RBZGQ7T.js +7 -0
  14. package/dist/chunk-B2KOIORF.js +1 -0
  15. package/dist/{chunk-VPNHGQIV.js → chunk-C7OVQQXT.js} +1 -1
  16. package/dist/chunk-C7WILE56.js +1 -0
  17. package/dist/chunk-FV5A3N3I.js +2 -0
  18. package/dist/chunk-GDGATWR5.js +2 -0
  19. package/dist/chunk-HEG6DIGW.js +2 -0
  20. package/dist/chunk-IOIWVHRO.js +883 -0
  21. package/dist/chunk-JBDQADHY.js +50 -0
  22. package/dist/{chunk-AC6KIKII.js → chunk-PPQYTYQG.js} +4 -4
  23. package/dist/chunk-RELR4O5E.js +2 -0
  24. package/dist/{chunk-DC44JPI3.js → chunk-RUUDLAKJ.js} +12 -12
  25. package/dist/chunk-T5LN7EO5.js +9 -0
  26. package/dist/chunk-TRXYRHD7.js +2 -0
  27. package/dist/chunk-U6QUN6V2.js +2 -0
  28. package/dist/chunk-UXKB4KGZ.js +13 -0
  29. package/dist/{create-7R4CGABE.js → create-HN5HOGQ4.js} +1 -1
  30. package/dist/{demo-kit-KTRITRWH.js → demo-kit-3VTLJBP7.js} +1 -1
  31. package/dist/{doctor-DG3TBPZN.js → doctor-QC662YLH.js} +1 -1
  32. package/dist/{dotnet-webapi-clean-TPQMNFSD.js → dotnet-webapi-clean-FX533F5U.js} +1 -1
  33. package/dist/{gofiber-standard-NDCBY6OM.js → gofiber-standard-35CJZ7S3.js} +1 -1
  34. package/dist/{gogin-standard-WUOMIHDR.js → gogin-standard-SAX6C4ZK.js} +1 -1
  35. package/dist/index.js +214 -213
  36. package/dist/managed-agent-markers-AXUM75OE.js +8 -0
  37. package/dist/pipeline-IMB3C3JY.js +5 -0
  38. package/dist/{springboot-standard-WQWB5E24.js → springboot-standard-SFMSLTX4.js} +1 -1
  39. package/dist/{workspace-ZDL5IQU4.js → workspace-2AL5C3QZ.js} +1 -1
  40. package/dist/workspace-agent-sync-4R7S3F6T.js +17 -0
  41. package/dist/workspace-context-CKACDTVE.js +1 -0
  42. package/dist/{workspace-contract-A6QP7FPA.js → workspace-contract-D5O4OZD5.js} +1 -1
  43. package/dist/workspace-foundation-L6ZBGMVE.js +1 -0
  44. package/dist/{workspace-intelligence-VLA2RILM.js → workspace-intelligence-3TWXJQ7Y.js} +1 -1
  45. package/dist/{workspace-model-OO4WOBJS.js → workspace-model-NQVZN5W4.js} +1 -1
  46. package/dist/workspace-registry-summary-MIPHVB56.js +1 -0
  47. package/dist/workspace-run-PNMZJNDC.js +1 -0
  48. package/dist/workspace-verify-EO435PS4.js +1 -0
  49. package/docs/AI_DYNAMIC_INTEGRATION.md +440 -0
  50. package/docs/AI_EXAMPLES.md +419 -0
  51. package/docs/AI_FEATURES.md +460 -0
  52. package/docs/AI_QUICKSTART.md +245 -0
  53. package/docs/DEVELOPMENT.md +88 -0
  54. package/docs/From Code to Shared Understanding.png +0 -0
  55. package/docs/OPEN_SOURCE_USER_SCENARIOS.md +170 -0
  56. package/docs/OPTIMIZATION_GUIDE.md +504 -0
  57. package/docs/PACKAGE_MANAGER_POLICY.md +25 -0
  58. package/docs/README.md +120 -0
  59. package/docs/SECURITY.md +63 -0
  60. package/docs/SETUP.md +107 -0
  61. package/docs/UTILITIES.md +221 -0
  62. package/docs/WORKSPACE_MARKER_SPEC.md +276 -0
  63. package/docs/ci-workflows.md +56 -0
  64. package/docs/commands-reference.md +136 -0
  65. package/docs/config-file-guide.md +295 -0
  66. package/docs/contracts/ARTIFACT_CATALOG.md +104 -0
  67. package/docs/contracts/COMMAND_OWNERSHIP_MATRIX.md +138 -0
  68. package/docs/contracts/README.md +70 -0
  69. package/docs/contracts/RUNTIME_ACCEPTANCE_MATRIX.md +98 -0
  70. package/docs/contracts/RUNTIME_SUPPORT_MATRIX.md +74 -0
  71. package/docs/contracts/rapidkit-cli-contracts.json +239 -0
  72. package/docs/doctor-command.md +263 -0
  73. package/docs/examples/ci-agent-grounding.yml +62 -0
  74. package/docs/from-code-to-shared-understanding.md +46 -0
  75. package/docs/governance-policy.enterprise.example.json +40 -0
  76. package/docs/mirror-config.enterprise.example.json +60 -0
  77. package/docs/policies.workspace.example.yml +23 -0
  78. package/docs/workspace-operations.md +160 -0
  79. package/docs/workspace-run.md +80 -0
  80. package/package.json +4 -2
  81. package/dist/analyze-HXO6R656.js +0 -1
  82. package/dist/autopilot-release-FMQ5KND5.js +0 -1
  83. package/dist/chunk-45KNNNAB.js +0 -2
  84. package/dist/chunk-7ZSURMR2.js +0 -4
  85. package/dist/chunk-HUQ5WRUF.js +0 -883
  86. package/dist/chunk-IATULVMR.js +0 -11
  87. package/dist/chunk-KIB4KHBF.js +0 -3
  88. package/dist/chunk-MCLLP6MW.js +0 -2
  89. package/dist/chunk-TC2PSHT6.js +0 -50
  90. package/dist/chunk-UY4LZEXK.js +0 -7
  91. package/dist/chunk-VM2TOHNX.js +0 -2
  92. package/dist/chunk-Y2ZPG7KN.js +0 -9
  93. package/dist/pipeline-23AEXNF2.js +0 -5
  94. package/dist/workspace-context-YFQQROOZ.js +0 -2
  95. package/dist/workspace-foundation-QVWALXMP.js +0 -1
  96. package/dist/workspace-run-NIKH2IKF.js +0 -1
  97. package/dist/workspace-verify-XEXRCET7.js +0 -1
@@ -0,0 +1,80 @@
1
+ # Workspace Run — Polyglot Fleet Orchestration
2
+
3
+ `workspace run` executes CI-safe stages (`init`, `test`, `build`, `start`) across discovered projects in a workspace. Command syntax is in [commands-reference.md](./commands-reference.md).
4
+
5
+ ## Quick start
6
+
7
+ ```bash
8
+ npx rapidkit workspace run test --parallel
9
+ npx rapidkit workspace run test --affected --since HEAD~1
10
+ npx rapidkit workspace run test --affected --blast-radius
11
+ npx rapidkit workspace run build --json --max-workers 8
12
+ ```
13
+
14
+ `--blast-radius` uses `.rapidkit/workspace.contract.json` (and legacy `.rapidkit/workspace-dependency-graph.json` as fallback) to expand direct `dependsOn` and publish/consume event relationships.
15
+
16
+ ## Supported runtimes
17
+
18
+ | Runtime | Frameworks | Status |
19
+ | --- | --- | --- |
20
+ | Node | NestJS, Express, Next.js, Nuxt | Built-in |
21
+ | Go | Fiber, Gin, Echo, Chi | Built-in |
22
+ | Java | Spring Boot, Quarkus, Gradle | Built-in |
23
+ | Python | FastAPI, Django, Flask, Poetry | Built-in |
24
+ | PHP | Laravel, Symfony, Slim | Observed |
25
+ | Rust | Actix, Axum, Rocket, Tokio | Observed |
26
+ | .NET | ASP.NET Core, Entity Framework | Built-in |
27
+ | Elixir | Phoenix, Umbrella | Observed |
28
+ | Ruby | Rails, Sinatra, RSpec | Observed |
29
+
30
+ Public scaffold/import/lifecycle contract: [contracts/RUNTIME_SUPPORT_MATRIX.md](./contracts/RUNTIME_SUPPORT_MATRIX.md).
31
+
32
+ ## Enterprise configuration
33
+
34
+ Override stage commands per project via `.rapidkit/context.json`:
35
+
36
+ ```json
37
+ {
38
+ "runtime": "php",
39
+ "framework": "Laravel",
40
+ "commands": {
41
+ "test": "php artisan test --parallel=4",
42
+ "build": "php artisan config:cache && php artisan route:cache",
43
+ "lint": "php bin/phpstan analyse --level=8"
44
+ },
45
+ "environment": "dev"
46
+ }
47
+ ```
48
+
49
+ Enterprise features include command overrides, multi-framework projects, error categorization (setup vs test vs runtime), preflight validation, health checks, custom stages, stage dependencies, environment variants, caching, and composite steps.
50
+
51
+ ## JSON reporting
52
+
53
+ ```bash
54
+ npx rapidkit workspace run test --json > test-results.json
55
+ cat test-results.json | jq '.projects[] | {path, status, errorCategory}'
56
+ ```
57
+
58
+ `errorCategory` values: `setup`, `test-failure`, `runtime`, `dependency`, `timeout`.
59
+
60
+ ## Command semantics
61
+
62
+ RapidKit has two workspace-level execution surfaces and three equivalent full-init aliases at workspace root:
63
+
64
+ | Command | Intent | Scope |
65
+ | --- | --- | --- |
66
+ | `init`, `workspace init`, `workspace run init` (at workspace root) | Mirrored full-init (workspace deps + project init) | Workspace + fleet |
67
+ | `workspace run <test\|build\|start>` | Fleet stage execution | Selected projects |
68
+ | `init`, `test`, `build`, `start`, `dev` (inside project dir) | Project primitive | Single project |
69
+
70
+ At workspace root, `npx rapidkit init`, `npx rapidkit workspace init`, and `npx rapidkit workspace run init` are equivalent aliases.
71
+
72
+ Inside a project directory, `npx rapidkit init` remains project-scoped.
73
+
74
+ `dev` is excluded from `workspace run` — it is a long-running local process, not a CI batch stage.
75
+
76
+ ## See also
77
+
78
+ - [Documentation index](./README.md)
79
+ - [commands-reference.md](./commands-reference.md)
80
+ - [contracts/RUNTIME_SUPPORT_MATRIX.md](./contracts/RUNTIME_SUPPORT_MATRIX.md)
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "rapidkit",
3
- "version": "0.36.0",
3
+ "version": "0.37.1",
4
4
  "type": "module",
5
- "description": "Official CLI for RapidKit workspace-first platform to create, adopt, govern, and operate polyglot projects (Python, Node, Go, Java, .NET, frontend) with shared evidence for CI, Workspai, and AI agents.",
5
+ "description": "Open-source workspace intelligence CLI for software systems: create, adopt, govern, verify, and align polyglot workspaces for humans, CI, IDEs, and AI agents.",
6
6
  "keywords": [
7
7
  "rapidkit",
8
8
  "workspai",
@@ -40,6 +40,7 @@
40
40
  "files": [
41
41
  "dist",
42
42
  "contracts",
43
+ "docs",
43
44
  "data/modules-embeddings.json",
44
45
  "scripts/enforce-package-manager.cjs",
45
46
  "scripts/check-cli-resolution.cjs"
@@ -111,6 +112,7 @@
111
112
  "release:major": "bash scripts/release.sh major"
112
113
  },
113
114
  "dependencies": {
115
+ "@clack/prompts": "^0.9.1",
114
116
  "chalk": "^5.3.0",
115
117
  "cli-progress": "^3.12.0",
116
118
  "commander": "^12.1.0",
@@ -1 +0,0 @@
1
- export{b as printAnalyzeReport,a as runAnalyze}from'./chunk-Y2ZPG7KN.js';
@@ -1 +0,0 @@
1
- export{b as AUTOPILOT_RELEASE_ALIAS_FILENAME,a as AUTOPILOT_RELEASE_LAST_RUN_FILENAME,c as runAutopilotRelease}from'./chunk-UY4LZEXK.js';
@@ -1,2 +0,0 @@
1
- import {d,b,a}from'./chunk-VPNHGQIV.js';import U from'crypto';import f from'path';import w from'fs-extra';import {spawnSync}from'child_process';function j(e,t){let r=spawnSync("git",t,{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]});return r.status!==0?{ok:false,stdout:""}:{ok:true,stdout:(r.stdout??"").trim()}}function J(e){let t=[],r=[],o=[];for(let c of e.split(`
2
- `)){if(!c.trim())continue;let n=c.slice(0,2),s=c.slice(3).trim();if(s){if(n==="??"){r.push(s);continue}n.includes("D")&&o.push(s),t.push(s);}}return {changedFiles:[...new Set(t)].sort(),untrackedFiles:[...new Set(r)].sort(),deletedFiles:[...new Set(o)].sort()}}function _(e,t){let r={available:false,dirty:false,changedFiles:[],untrackedFiles:[],deletedFiles:[]},o=j(e,["rev-parse","--is-inside-work-tree"]);if(!o.ok||o.stdout!=="true")return r;let c=j(e,["rev-parse","--abbrev-ref","HEAD"]),n=j(e,["rev-parse","HEAD"]),s=j(e,["status","--porcelain=v1","--untracked-files=all"]),i=J(s.stdout),p=i.changedFiles.length>0||i.untrackedFiles.length>0||i.deletedFiles.length>0;return {available:true,branch:c.ok?c.stdout:void 0,commit:n.ok?n.stdout:void 0,ref:t?.ref,dirty:p,changedFiles:i.changedFiles,untrackedFiles:i.untrackedFiles,deletedFiles:i.deletedFiles}}var V="workspace-model-snapshot.v1",G="workspace-model-diff.v1",E=".rapidkit/reports/workspace-model-snapshot.json",N=".rapidkit/reports/workspace-model-diff-last-run.json",Q="workspace-impact.v1",X=".rapidkit/reports/workspace-impact-last-run.json";function B(e){let t=e.trim().toLowerCase();return t==="git"||t.startsWith("git:")}function Y(e){let t=e.trim();return t.toLowerCase()==="git"?"HEAD":t.toLowerCase().startsWith("git:")&&t.slice(4).trim()||"HEAD"}function F(e){if(Array.isArray(e))return e.map(t=>F(t));if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=F(e[r]);return t}return e}function u(e){return JSON.stringify(F(e))}function S(e){let t={...e,generatedAt:"<ignored>",validation:e.validation?{...e.validation,issues:e.validation.issues.map(r=>({...r})).sort((r,o)=>{let c=`${r.severity}:${r.code}:${r.target}:${r.message}`,n=`${o.severity}:${o.code}:${o.target}:${o.message}`;return c.localeCompare(n)})}:void 0};return U.createHash("sha256").update(u(t)).digest("hex")}function L(e,t){return f.isAbsolute(t)?t:f.join(e,t)}async function Z(e){let t=await w.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace model input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion===V){let o=r;if(!o.model||o.model.schemaVersion!==a)throw new Error(`Invalid workspace model snapshot: ${e}`);return {model:o.model,hash:o.modelHash||S(o.model)}}if(r.schemaVersion===a){let o=r;return {model:o,hash:S(o)}}throw new Error(`Unsupported workspace model input schema: ${String(r.schemaVersion)}`)}async function ee(e){let t=await w.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace diff input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion!==G)return null;let o=r;if(!o.currentModel||o.currentModel.schemaVersion!==a||!o.summary||!Array.isArray(o.changes))throw new Error(`Invalid workspace model diff report: ${e}`);return o}async function Pe(e){let t=e.model??await d({workspacePath:e.workspacePath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now});return {schemaVersion:V,generatedAt:(e.now??new Date).toISOString(),modelHash:S(t),modelRef:b,model:t}}async function Me(e,t){let r=f.join(t,E);return await w.ensureDir(f.dirname(r)),await w.writeJson(r,e,{spaces:2}),r}function C(e){return {name:e.name,path:e.path,kind:e.kind,runtime:e.runtime,framework:e.framework,generator:e.generator,supportTier:e.supportTier,commands:e.commands,importantFiles:e.importantFiles}}function h(e,t){e.push(t);}function te(e,t){let r=[],o=["name","profile","type"],c=["workspaceType","surfaces","runtimeFamilies","businessCapabilities"];for(let n of o){let s=e.workspace[n],i=t.workspace[n];u(s)!==u(i)&&h(r,{type:"workspace.changed",severity:"info",target:`workspace.${n}`,message:`Workspace metadata field changed: ${String(n)}`,before:s,after:i});}for(let n of c){let s=e.identity[n],i=t.identity[n];u(s)!==u(i)&&h(r,{type:"workspace.changed",severity:"info",target:`identity.${n}`,message:`Workspace identity field changed: ${String(n)}`,before:s,after:i});}return u(e.policies)!==u(t.policies)&&h(r,{type:"workspace.changed",severity:"warning",target:"policies",message:"Workspace policy summary changed.",before:e.policies,after:t.policies}),u(e.evidence)!==u(t.evidence)&&h(r,{type:"workspace.changed",severity:"info",target:"evidence",message:"Workspace evidence summary changed.",before:e.evidence,after:t.evidence}),u(e.discovery)!==u(t.discovery)&&h(r,{type:"workspace.changed",severity:"info",target:"discovery",message:"Workspace discovery settings changed.",before:e.discovery,after:t.discovery}),e.contracts.exists!==t.contracts.exists&&h(r,{type:"workspace.changed",severity:t.contracts.exists?"info":"warning",target:t.contracts.workspaceContractPath,message:"Workspace contract presence changed.",before:e.contracts.exists,after:t.contracts.exists}),r}function re(e,t){let r=e.validation??null,o=t.validation??null;return u(r)===u(o)?[]:[{type:"validation.changed",severity:o?.status==="failed"?"critical":"warning",target:"validation",message:"Workspace model validation changed.",before:r,after:o}]}function oe(e,t){let r=[],o=new Map(e.projects.map(n=>[n.path,n])),c=new Map(t.projects.map(n=>[n.path,n]));for(let[n,s]of c.entries()){let i=o.get(n);if(!i){h(r,{type:"project.added",severity:"info",target:n,message:`Project added: ${s.name}`,after:C(s)});continue}let p=C(i),d=C(s);if(u(p)!==u(d)){let g=i.runtime!==s.runtime||i.framework!==s.framework;h(r,{type:"project.changed",severity:g?"warning":"info",target:n,message:`Project changed: ${s.name}`,before:p,after:d});}}for(let[n,s]of o.entries())c.has(n)||h(r,{type:"project.removed",severity:"warning",target:n,message:`Project removed: ${s.name}`,before:C(s)});return r.sort((n,s)=>`${n.type}:${n.target}`.localeCompare(`${s.type}:${s.target}`))}async function ne(e){let t=f.resolve(e.workspacePath),r=B(e.fromPath),o=r?Y(e.fromPath):void 0,c=e.fromPath;if(r){let m=f.join(t,E);if(!await w.pathExists(m))throw new Error("Git-aware workspace diff requires an existing snapshot at .rapidkit/reports/workspace-model-snapshot.json. Run: npx rapidkit workspace snapshot --json");c=E;}let n=L(t,c),s=await Z(n),i=e.model??await d({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}),p=S(i),d$1=[...te(s.model,i),...oe(s.model,i),...re(s.model,i)],g;e.includeGitObservation!==false&&(g=e.gitObservation??_(t,{ref:o}),g.available&&ie(d$1,g,i));let y=d$1.filter(m=>m.type.startsWith("git.")).length,v=s.hash!==p,O=r?`git:${o??"HEAD"}`:f.relative(t,n).split(f.sep).join("/");return {schemaVersion:G,generatedAt:(e.now??new Date).toISOString(),fromRef:O,toRef:b,fromHash:s.hash,toHash:p,summary:{changed:v||y>0,addedProjects:d$1.filter(m=>m.type==="project.added").length,removedProjects:d$1.filter(m=>m.type==="project.removed").length,changedProjects:d$1.filter(m=>m.type==="project.changed").length,workspaceChanges:d$1.filter(m=>m.type==="workspace.changed").length,validationChanges:d$1.filter(m=>m.type==="validation.changed").length,gitChangedFiles:y},git:g?.available?ce(g,o):{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:d$1,currentModel:i}}async function je(e,t){let r=f.join(t,N);return await w.ensureDir(f.dirname(r)),await w.writeJson(r,e,{spaces:2}),r}function R(e){return {none:0,low:1,medium:2,high:3,critical:4}[e]}function T(e){return e.reduce((t,r)=>R(r)>R(t)?r:t,"none")}function H(e){return e.join(" ")}function W(e,t,r,o){return {id:e,label:t,scope:o.scope,project:o.project,display:H(["npx","rapidkit",...r]),execute:H(["npx","--yes","--package","rapidkit","rapidkit",...r]),required:o.required!==false}}function ae(e){let t=`project:${e.name}`;return [W(`project.${e.name}.test`,`Run tests for ${e.name}`,["workspace","run","test","--scope",t,"--json"],{scope:"project",project:e.name,required:e.commands.fleetStages.includes("test")}),W(`project.${e.name}.build`,`Run build for ${e.name}`,["workspace","run","build","--scope",t,"--json"],{scope:"project",project:e.name,required:e.commands.fleetStages.includes("build")})]}function A(){return [W("workspace.doctor","Run workspace doctor",["doctor","workspace","--json"],{scope:"workspace"}),W("workspace.contract.verify","Verify workspace contract",["workspace","contract","verify","--json"],{scope:"workspace"}),W("workspace.readiness","Run release readiness",["readiness","--json"],{scope:"workspace"}),W("workspace.analyze","Run workspace analyze",["analyze","--json"],{scope:"workspace",required:false}),W("workspace.pipeline","Run governance pipeline",["pipeline","--json"],{scope:"workspace",required:false})]}function se(e,t){let r=t.split(f.sep).join("/");return e.projects.filter(c=>{let n=c.path.split(f.sep).join("/");return r===n||r.startsWith(`${n}/`)}).sort((c,n)=>n.path.length-c.path.length)[0]}function ie(e,t,r){let o=new Set(e.map(n=>n.target)),c=(n,s)=>{let i=s.split(f.sep).join("/"),p=`git:${i}`;if(o.has(p))return;let d=se(r,i),g=d?`${d.name} (${d.path})`:"workspace";h(e,{type:n,severity:n==="git.deleted"?"warning":"info",target:p,message:`Git ${n==="git.untracked"?"untracked":n==="git.deleted"?"deleted":"changed"} file affects ${g}: ${i}`,after:{path:i,project:d?.name,projectPath:d?.path}}),o.add(p);};for(let n of t.changedFiles)c("git.file.changed",n);for(let n of t.untrackedFiles)c("git.untracked",n);for(let n of t.deletedFiles)c("git.deleted",n);}function ce(e,t){return {available:true,ref:t??e.ref,branch:e.branch,commit:e.commit,dirty:e.dirty,changedFiles:e.changedFiles.length,untrackedFiles:e.untrackedFiles.length,deletedFiles:e.deletedFiles.length}}function pe(e){let t=new Set,r=[];for(let o of e){let c=`${o.scope}:${o.project??""}:${o.display}`;t.has(c)||(t.add(c),r.push(o));}return r}function de(e){return e.type==="project.removed"?"high":e.severity==="critical"?"critical":e.severity==="warning"?"high":("medium")}function le(e,t){return e.severity==="critical"?"critical":e.target==="policies"||e.target.includes("contract")?"high":e.type==="validation.changed"?(t?.projectCount??0)===0?"low":"high":e.target==="evidence"?"low":e.severity==="warning"?"medium":"low"}function fe(e){return e.affectedProjects>0||e.projectCount>0||!e.changes.every(r=>r.severity==="critical"?false:r.type.startsWith("git.")||r.type==="validation.changed")?e.risk:R(e.risk)>=R("high")||e.risk==="medium"?"low":e.risk}function me(e,t){if(!e||e==="workspace")return true;let r=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return [t.name,t.path,f.basename(t.path),t.absolutePath].filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim().toLowerCase()).includes(r)}function ue(e){if(!e.changed)return {headline:"No workspace model impact detected.",bullets:["The current workspace model matches the provided snapshot/report."],unsafeAssumptions:["Do not claim runtime verification passed unless a report exists."]};let t=e.affectedProjects.map(r=>r.project?.name??r.target);return {headline:`Workspace impact risk: ${e.risk}.`,bullets:[`Affected projects: ${t.length?t.join(", "):"none"}.`,`Workspace-level items: ${e.workspaceImpact.length}.`,"Use the verification plan before recommending apply, rollback, or release actions."],unsafeAssumptions:["Do not infer test/build success from impact alone.","Do not apply fixes without project scope and verification evidence.","Use display commands for users and execute commands for automation."]}}async function Ce(e){let t=f.resolve(e.workspacePath),r=B(e.fromPath),o=e.diff;if(!o&&!r){let a=L(t,e.fromPath);o=await ee(a)??void 0;}o||(o=await ne({workspacePath:t,fromPath:e.fromPath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,includeGitObservation:e.includeGitObservation,gitObservation:e.gitObservation,now:e.now,model:e.model}));let c=new Map(o.currentModel.projects.map(a=>[a.path,a])),n=new Map(o.currentModel.projects.map(a=>[a.name,a])),s=o.changes.filter(a=>a.type.startsWith("project.")),i=new Map;for(let a of s){let l=(c.get(a.target)??(typeof a.before?.name=="string"?n.get(a.before.name):void 0))?.path??a.target,b=i.get(l)??[];b.push(a),i.set(l,b);}let p=[];for(let[a,k]of i.entries()){let l=c.get(a);if(l&&!me(e.scope,l))continue;let b=T(k.map(de)),x=l?.name??(typeof k[0]?.before?.name=="string"?String(k[0].before.name):a);p.push({id:`project:${x}`,scope:"project",target:a,title:`Project impact: ${x}`,summary:k.map(P=>P.message).join(" "),risk:b,reasons:k.map(P=>`${P.type}: ${P.message}`),project:l?{name:l.name,path:l.path,kind:l.kind,runtime:l.runtime,framework:l.framework,supportTier:l.supportTier,...l.generator?{generator:l.generator}:{}}:void 0,verification:l?ae(l):A()});}let d=o.changes.filter(a=>!a.type.startsWith("project.")),g=o.currentModel.summary?.projectCount??o.currentModel.projects.length,y=d.map(a=>({id:`workspace:${a.target}`,scope:"workspace",target:a.target,title:`Workspace impact: ${a.target}`,summary:a.message,risk:le(a,{projectCount:g}),reasons:[`${a.type}: ${a.message}`],verification:A()})),v=pe([...p.flatMap(a=>a.verification),...y.flatMap(a=>a.verification),...o.summary.changed?A():[]]).filter(a=>a.required),O=T([...p.map(a=>a.risk),...y.map(a=>a.risk)]),m=fe({risk:O,affectedProjects:p.length,projectCount:g,changes:o.changes}),$={changed:o.summary.changed,risk:m,affectedProjects:p.length,workspaceItems:y.length,recommendedCommands:v.length};return {schemaVersion:Q,generatedAt:(e.now??new Date).toISOString(),fromRef:o.fromRef,diffRef:N,workspace:{name:o.currentModel.workspace.name,profile:o.currentModel.workspace.profile,type:o.currentModel.workspace.type},summary:$,affectedProjects:p.sort((a,k)=>a.target.localeCompare(k.target)),workspaceImpact:y.sort((a,k)=>a.target.localeCompare(k.target)),verificationPlan:v,agentBrief:ue({changed:$.changed,risk:m,affectedProjects:p,workspaceImpact:y}),diff:o}}async function Se(e,t){let r=f.join(t,X);return await w.ensureDir(f.dirname(r)),await w.writeJson(r,e,{spaces:2}),r}export{V as a,G as b,E as c,N as d,Q as e,X as f,B as g,Y as h,Pe as i,Me as j,ne as k,je as l,A as m,Ce as n,Se as o};
@@ -1,4 +0,0 @@
1
- import {a as a$1,b as b$1,d as d$1,c,f}from'./chunk-YBS2HGO3.js';import {a,b}from'./chunk-KMUWWZRT.js';import {c as c$1}from'./chunk-NFUXULIF.js';import u from'chalk';import d from'fs';import m from'fs-extra';import l from'path';function C(t,e){let a=l.resolve(t);if(!b(a))return a;let s=l.join(e,".rapidkit","workspace.contract.json");if(d.existsSync(s))try{let i=JSON.parse(d.readFileSync(s,"utf-8")),n=Array.isArray(i.projects)?i.projects:[];for(let c of n){let y=p(c),f=typeof y.relativePath=="string"?y.relativePath.trim():"";if(f)return l.join(e,f)}}catch{}let r=k(e),o=Array.isArray(r.payload?.projects)?r.payload.projects:[];for(let i of o){let n=p(i),c=typeof n.path=="string"?n.path.trim():"";if(c)return l.resolve(c)}return a}function $(t){let e=a$1(t);return b$1(e,t)?"go":d$1(e,t)?"java":c(e,t)?"node":f(e,t)?"python":"unknown"}function x(t,e){if(!d.existsSync(t))return null;let a=d.readdirSync(t).filter(s=>s.endsWith(".json")&&e.some(r=>r.test(s))).map(s=>l.join(t,s));return a.length===0?null:(a.sort((s,r)=>d.statSync(r).mtimeMs-d.statSync(s).mtimeMs),a[0])}function p(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function G(t){let e=l.join(t,".rapidkit","workspace.contract.json");if(d.existsSync(e))try{let r=JSON.parse(d.readFileSync(e,"utf-8")),o=Array.isArray(r.projects)?r.projects:[];if(o.length>0)return o.length}catch{}let a=k(t);return (Array.isArray(a.payload?.projects)?a.payload.projects:[]).length}function z(t,e,a){let s=l.join(t,".rapidkit","toolchain.lock");if(!d.existsSync(s))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run rapidkit bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:s};try{let r=JSON.parse(d.readFileSync(s,"utf-8")),o=p(r.runtime),n=["python","node","go","java"].filter(c=>{let y=p(o[c]);return typeof y.version=="string"&&y.version.trim().length>0});if(n.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via rapidkit setup <runtime> and re-run bootstrap."],evidencePath:s};if(e!=="unknown"){let c=p(o[e]);if(typeof c.version!="string"||c.version.trim().length===0)return {gate:"env",status:"fail",summary:`${a?.hasRegisteredProjects?"Project runtime":"Workspace"} (${e}) is not pinned in toolchain.lock`,details:[`Run rapidkit setup ${e} and rapidkit bootstrap to lock ${e} for this workspace.`],evidencePath:s}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${n.join(", ")}`,details:[],evidencePath:s}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with rapidkit bootstrap."],evidencePath:s}}}function k(t){let e=l.join(t,".rapidkit","reports","doctor-last-run.json");if(!d.existsSync(e))return {payload:null,path:e};try{let a=JSON.parse(d.readFileSync(e,"utf-8"));return c$1(a,"workspace")?{payload:a,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function V(t){let e=k(t);if(!e.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run rapidkit doctor workspace --json before release readiness checks."],evidencePath:e.path},payload:null};let a=p(e.payload.summary),s=Number(a.totalIssues??0);return a.hasSystemErrors?{gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:e.path},payload:e.payload}:s>0?{gate:{gate:"doctor",status:"warn",summary:`Doctor found ${s} issue(s)`,details:["Run rapidkit doctor workspace --fix and re-run readiness checks."],evidencePath:e.path},payload:e.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:e.path},payload:e.payload}}function E(t){let e=l.join(t,".rapidkit","reports","analyze-last-run.json");if(!d.existsSync(e))return {gate:"analyze",status:"fail",summary:"Analyze evidence is missing",details:["Run rapidkit analyze --json before release readiness checks."],evidencePath:e};try{let a=JSON.parse(d.readFileSync(e,"utf-8")),s=p(a.summary),r=String(s.verdict??"").toLowerCase(),o=Number(s.score??0),i=p(s.findings),n=Number(i.fail??0);return r==="blocked"||n>0?{gate:"analyze",status:"fail",summary:`Analyze verdict is blocked (score ${o}/100)`,details:["Resolve analyze findings and regenerate analyze-last-run.json."],evidencePath:e}:r==="needs-attention"?{gate:"analyze",status:"warn",summary:`Analyze needs attention (score ${o}/100)`,details:["Review analyze warnings before release."],evidencePath:e}:{gate:"analyze",status:"pass",summary:`Analyze passed (score ${o}/100)`,details:[],evidencePath:e}}catch{return {gate:"analyze",status:"fail",summary:"Analyze evidence is invalid JSON",details:["Re-run rapidkit analyze --json to regenerate evidence."],evidencePath:e}}}function J(t){try{let e=JSON.parse(d.readFileSync(t,"utf-8")),a=String(e.status??"").toLowerCase(),s=p(e.summary),r=Number(s.failedChecks??0);return a==="fail"||r>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:t}:a==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:t}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:t}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:t}}}async function L(t,e){if(e.skipVerify)return {gate:"verify",status:"pass",summary:"Verify gate skipped (--skip-verify)",details:["Verification was explicitly skipped for this readiness run."]};let a=l.join(t,".rapidkit","reports"),s=x(a,[/verify-pack-contract/i,/^verify.*\.json$/i]);if(s)return J(s);let r=l.join(a,"workspace-contract-verify-last-run.json"),o=x(a,[/workspace-contract-verify-last-run/i,/workspace-contract-verify/i]);if(o)try{let i=JSON.parse(d.readFileSync(o,"utf-8")),n=String(i.status??"").toLowerCase();if(n==="passed"||n==="pass")return {gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI cache)",details:[],evidencePath:o};if(n==="failed"||n==="fail")return {gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI cache)",details:(Array.isArray(i.violations)?i.violations:[]).slice(0,5),evidencePath:o}}catch{}try{let{verifyWorkspaceContract:i}=await import('./workspace-contract-A6QP7FPA.js'),n=await i({workspacePath:t}),c={schemaVersion:"v1",source:"cli",generatedAt:new Date().toISOString(),status:n.status,contractPath:n.contractPath,projectCount:n.projectCount,checks:n.checks,violations:n.violations};return await m.ensureDir(a),await m.writeJSON(r,c,{spaces:2}),n.status==="failed"?{gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI)",details:n.violations.slice(0,5),evidencePath:r}:{gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI)",details:[],evidencePath:r}}catch(i){return {gate:"verify",status:"fail",summary:"No verify evidence and workspace contract verification unavailable",details:["Run rapidkit workspace contract verify --json or export verify-pack contract from CI.",i instanceof Error?i.message:String(i)],evidencePath:l.join(a,"*verify*.json")}}}function D(t,e){let a=l.join(e,".rapidkit","reports","doctor-last-run.json");if(!t)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run rapidkit doctor workspace --json to include dependency findings."],evidencePath:a};let s=Array.isArray(t.projects)?t.projects:[],r=s.reduce((i,n)=>{let c=Number(n.vulnerabilities??0);return Number.isFinite(c)?i+Math.max(0,c):i},0),o=s.filter(i=>i.depsInstalled===false).length;return r>0?{gate:"dependency",status:"fail",summary:`${r} dependency vulnerability(ies) reported`,details:["Resolve vulnerabilities (npm/pip/go audit pipelines) before release."],evidencePath:a}:o>0?{gate:"dependency",status:"warn",summary:`${o} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:a}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:a}}function I(t){return t.some(e=>e.status==="fail")?"fail":t.some(e=>e.status==="warn")?"warn":"pass"}async function W(t,e){let a=l.join(t,".rapidkit","reports","release-readiness-last-run.json");return await m.ensureDir(l.dirname(a)),await m.writeJSON(a,e,{spaces:2}),a}async function F(t={}){let e=l.resolve(t.startPath??process.cwd()),a$1=a(e)??e,s=C(e,a$1),r=$(s),o=G(a$1)>0,i=z(a$1,r,{hasRegisteredProjects:o}),n=V(a$1),c=E(a$1),y=await L(a$1,{skipVerify:t.skipVerify}),f=D(n.payload,a$1),v=[i,n.gate,c,y,f],R=I(v),h={schemaVersion:"v1",generatedAt:new Date().toISOString(),workspacePath:a$1,projectPath:s,action:t.action,overallStatus:R,blocking:R==="fail",blockingReasons:v.filter(g=>g.status==="fail").map(g=>`${g.gate}: ${g.summary}`),gates:v};return t.writeReport!==false&&(h.evidencePath=await W(a$1,h)),h}function K(t){return t==="pass"?u.green("PASS"):t==="warn"?u.yellow("WARN"):u.red("FAIL")}function M(t){return t==="pass"?u.green("PASS"):t==="warn"?u.yellow("WARN"):u.red("FAIL")}async function _(t){let e=await F({writeReport:true,skipVerify:t.skipVerify===true});if(t.json)console.log(JSON.stringify(e,null,2));else {console.log(u.bold.cyan(`
2
- \u{1F6A6} RapidKit Release Readiness
3
- `)),console.log(u.bold(`Workspace: ${u.cyan(l.basename(e.workspacePath))}`)),console.log(u.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${M(e.overallStatus)}`);for(let a of e.gates){console.log(` - ${a.gate}: ${K(a.status)} ${a.summary}`);for(let s of a.details)console.log(u.gray(` ${s}`));a.evidencePath&&console.log(u.gray(` evidence: ${a.evidencePath}`));}e.evidencePath&&console.log(u.gray(`
4
- Evidence saved: ${e.evidencePath}`));}t.strict&&e.overallStatus!=="pass"&&process.exit(1);}export{F as a,_ as b};