rapidkit 0.41.0 → 0.41.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 (163) hide show
  1. package/README.md +12 -5
  2. package/contracts/extension-cli-compatibility.v1.json +1 -1
  3. package/contracts/workspace-intelligence/agent-action-outcome.v1.json +17 -1
  4. package/contracts/workspace-intelligence/workspace-dependency-graph.v1.json +61 -1
  5. package/dist/analyze-QYHMGLSG.js +1 -0
  6. package/dist/autopilot-release-AHMQEUFH.js +1 -0
  7. package/dist/{chunk-WA6JYVJM.js → chunk-33LR2QEM.js} +1 -1
  8. package/dist/{chunk-DMUEGR36.js → chunk-3PTJID76.js} +1 -1
  9. package/dist/chunk-46AGNYI7.js +50 -0
  10. package/dist/chunk-AQ4XZZC6.js +1 -0
  11. package/dist/{chunk-MGUJWRZA.js → chunk-BFEBZABL.js} +3 -3
  12. package/dist/chunk-CDPR2YKL.js +13 -0
  13. package/dist/{chunk-73IS6RIM.js → chunk-CKXJR3YT.js} +1 -1
  14. package/dist/chunk-E5ZVQL3C.js +13 -0
  15. package/dist/chunk-ELU3G6DQ.js +9 -0
  16. package/dist/chunk-EN6YCX36.js +1 -0
  17. package/dist/chunk-FMBSON6H.js +33 -0
  18. package/dist/chunk-GBJBQ43T.js +1 -0
  19. package/dist/{chunk-FPUNOIAR.js → chunk-ITJ6RKUW.js} +3 -3
  20. package/dist/{chunk-XOVB2ZP5.js → chunk-JU3VNLTY.js} +1 -1
  21. package/dist/chunk-JW2FSKT3.js +2 -0
  22. package/dist/{chunk-44GSDNPQ.js → chunk-KIUSCFHF.js} +1 -1
  23. package/dist/{chunk-AT3EQ2S7.js → chunk-LKX3L7TE.js} +1 -1
  24. package/dist/{chunk-KTQZUWAM.js → chunk-RSYUNEH7.js} +13 -13
  25. package/dist/chunk-TJN7G2MA.js +1 -0
  26. package/dist/{chunk-Y2SCTWL4.js → chunk-UQR6G7KH.js} +2 -2
  27. package/dist/chunk-WRMCPKGA.js +1 -0
  28. package/dist/{create-UGXMC4CT.js → create-RNP5ACQL.js} +1 -1
  29. package/dist/demo-kit-N5U3NGAE.js +149 -0
  30. package/dist/{doctor-LCKG5S76.js → doctor-XM6QDTDC.js} +1 -1
  31. package/dist/index.js +118 -117
  32. package/dist/{pipeline-MKNYPNGD.js → pipeline-DH6Z47O4.js} +1 -1
  33. package/dist/platform-capabilities-TSLK667K.js +1 -0
  34. package/dist/{pythonRapidkitExec-MNWRC4F2.js → pythonRapidkitExec-SGKW76XM.js} +1 -1
  35. package/dist/{workspace-FDMJD5XI.js → workspace-E554C5SM.js} +1 -1
  36. package/dist/{workspace-agent-sync-WJIZCZX5.js → workspace-agent-sync-2HRPM5ZD.js} +1 -1
  37. package/dist/{workspace-context-RYOQYGOP.js → workspace-context-VJTXW3K4.js} +1 -1
  38. package/dist/{workspace-contract-ITFCJCHI.js → workspace-contract-OO4GMENV.js} +1 -1
  39. package/dist/workspace-explain-3WSJLIJ6.js +1 -0
  40. package/dist/workspace-explain-contract-24RQ7KIW.js +1 -0
  41. package/dist/{workspace-foundation-SILFUKL5.js → workspace-foundation-LISDH53T.js} +1 -1
  42. package/dist/{workspace-intelligence-YOZQBAK5.js → workspace-intelligence-E3KXEZCM.js} +1 -1
  43. package/dist/workspace-mcp-serve-RFYDCA2L.js +3 -0
  44. package/dist/{workspace-model-VMMLHJWI.js → workspace-model-YL7W3573.js} +1 -1
  45. package/dist/workspace-registry-summary-X5WRUU3T.js +1 -0
  46. package/dist/workspace-run-GCIQD73R.js +1 -0
  47. package/dist/workspace-verify-NRYH7RNB.js +1 -0
  48. package/dist/{workspace-watch-3MEZRSEE.js → workspace-watch-H2AETGFI.js} +1 -1
  49. package/docs/DEVELOPMENT.md +1 -1
  50. package/docs/OPEN_SOURCE_USER_SCENARIOS.md +1 -1
  51. package/docs/README.md +1 -1
  52. package/docs/commands-reference.md +10 -2
  53. package/package.json +7 -3
  54. package/scripts/enterprise-package-smoke.mjs +427 -0
  55. package/scripts/prepack-enterprise.mjs +40 -0
  56. package/templates/generator.js +175 -0
  57. package/templates/kits/fastapi-ddd/README.md.j2 +122 -0
  58. package/templates/kits/fastapi-ddd/common/env.example.j2 +10 -0
  59. package/templates/kits/fastapi-ddd/env.example.j2 +1 -0
  60. package/templates/kits/fastapi-ddd/pyproject.toml.j2 +64 -0
  61. package/templates/kits/fastapi-ddd/src/__init__.py.j2 +3 -0
  62. package/templates/kits/fastapi-ddd/src/app/__init__.py.j2 +11 -0
  63. package/templates/kits/fastapi-ddd/src/app/application/__init__.py.j2 +5 -0
  64. package/templates/kits/fastapi-ddd/src/app/application/interfaces.py.j2 +43 -0
  65. package/templates/kits/fastapi-ddd/src/app/application/use_cases/__init__.py.j2 +6 -0
  66. package/templates/kits/fastapi-ddd/src/app/application/use_cases/health.py.j2 +14 -0
  67. package/templates/kits/fastapi-ddd/src/app/application/use_cases/notes.py.j2 +24 -0
  68. package/templates/kits/fastapi-ddd/src/app/config/__init__.py.j2 +16 -0
  69. package/templates/kits/fastapi-ddd/src/app/domain/__init__.py.j2 +3 -0
  70. package/templates/kits/fastapi-ddd/src/app/domain/models/__init__.py.j2 +6 -0
  71. package/templates/kits/fastapi-ddd/src/app/domain/models/health.py.j2 +16 -0
  72. package/templates/kits/fastapi-ddd/src/app/domain/models/note.py.j2 +27 -0
  73. package/templates/kits/fastapi-ddd/src/app/infrastructure/__init__.py.j2 +5 -0
  74. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/__init__.py.j2 +6 -0
  75. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/health.py.j2 +17 -0
  76. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/notes.py.j2 +28 -0
  77. package/templates/kits/fastapi-ddd/src/app/main.py.j2 +61 -0
  78. package/templates/kits/fastapi-ddd/src/app/presentation/__init__.py.j2 +3 -0
  79. package/templates/kits/fastapi-ddd/src/app/presentation/api/__init__.py.j2 +5 -0
  80. package/templates/kits/fastapi-ddd/src/app/presentation/api/dependencies/__init__.py.j2 +19 -0
  81. package/templates/kits/fastapi-ddd/src/app/presentation/api/router.py.j2 +10 -0
  82. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/__init__.py.j2 +5 -0
  83. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/health.py.j2 +27 -0
  84. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/notes.py.j2 +50 -0
  85. package/templates/kits/fastapi-ddd/src/app/shared/__init__.py.j2 +5 -0
  86. package/templates/kits/fastapi-ddd/src/app/shared/result.py.j2 +28 -0
  87. package/templates/kits/fastapi-ddd/src/cli.py.j2 +167 -0
  88. package/templates/kits/fastapi-ddd/src/main.py.j2 +35 -0
  89. package/templates/kits/fastapi-ddd/src/modules/__init__.py.j2 +3 -0
  90. package/templates/kits/fastapi-ddd/src/routing/__init__.py.j2 +13 -0
  91. package/templates/kits/fastapi-ddd/src/routing/health.py.j2 +7 -0
  92. package/templates/kits/fastapi-ddd/src/routing/notes.py.j2 +7 -0
  93. package/templates/kits/fastapi-ddd/tests/__init__.py.j2 +1 -0
  94. package/templates/kits/fastapi-ddd/tests/test_app_factory.py.j2 +22 -0
  95. package/templates/kits/fastapi-ddd/tests/test_health.py.j2 +17 -0
  96. package/templates/kits/fastapi-ddd/tests/test_notes.py.j2 +27 -0
  97. package/templates/kits/fastapi-standard/README.md.j2 +145 -0
  98. package/templates/kits/fastapi-standard/common/env.example.j2 +10 -0
  99. package/templates/kits/fastapi-standard/env.example.j2 +1 -0
  100. package/templates/kits/fastapi-standard/pyproject.toml.j2 +64 -0
  101. package/templates/kits/fastapi-standard/src/__init__.py.j2 +3 -0
  102. package/templates/kits/fastapi-standard/src/cli.py.j2 +168 -0
  103. package/templates/kits/fastapi-standard/src/main.py.j2 +66 -0
  104. package/templates/kits/fastapi-standard/src/modules/__init__.py.j2 +3 -0
  105. package/templates/kits/fastapi-standard/src/routing/__init__.py.j2 +16 -0
  106. package/templates/kits/fastapi-standard/src/routing/examples.py.j2 +71 -0
  107. package/templates/kits/fastapi-standard/src/routing/health.py.j2 +22 -0
  108. package/templates/kits/fastapi-standard/tests/__init__.py.j2 +1 -0
  109. package/templates/kits/fastapi-standard/tests/test_examples.py.j2 +29 -0
  110. package/templates/kits/fastapi-standard/tests/test_health.py.j2 +17 -0
  111. package/templates/kits/nestjs-standard/Dockerfile.j2 +41 -0
  112. package/templates/kits/nestjs-standard/README.md.j2 +139 -0
  113. package/templates/kits/nestjs-standard/docker-compose.yml.j2 +94 -0
  114. package/templates/kits/nestjs-standard/docs/README.md.j2 +15 -0
  115. package/templates/kits/nestjs-standard/env.example.j2 +18 -0
  116. package/templates/kits/nestjs-standard/eslint.config.cjs.j2 +9 -0
  117. package/templates/kits/nestjs-standard/jest.config.ts.j2 +22 -0
  118. package/templates/kits/nestjs-standard/nest-cli.json.j2 +10 -0
  119. package/templates/kits/nestjs-standard/package.json.j2 +101 -0
  120. package/templates/kits/nestjs-standard/src/app.controller.ts.j2 +14 -0
  121. package/templates/kits/nestjs-standard/src/app.module.ts.j2 +26 -0
  122. package/templates/kits/nestjs-standard/src/app.service.ts.j2 +16 -0
  123. package/templates/kits/nestjs-standard/src/auth/auth.controller.ts.j2 +20 -0
  124. package/templates/kits/nestjs-standard/src/auth/auth.module.ts.j2 +13 -0
  125. package/templates/kits/nestjs-standard/src/auth/auth.service.ts.j2 +6 -0
  126. package/templates/kits/nestjs-standard/src/auth/entities/token.entity.ts.j2 +3 -0
  127. package/templates/kits/nestjs-standard/src/auth/entities/user.entity.ts.j2 +3 -0
  128. package/templates/kits/nestjs-standard/src/auth/entities/webauthn.entity.ts.j2 +3 -0
  129. package/templates/kits/nestjs-standard/src/config/configuration.ts.j2 +85 -0
  130. package/templates/kits/nestjs-standard/src/config/index.ts.j2 +2 -0
  131. package/templates/kits/nestjs-standard/src/config/validation.ts.j2 +21 -0
  132. package/templates/kits/nestjs-standard/src/examples/dto/create-note.dto.ts.j2 +11 -0
  133. package/templates/kits/nestjs-standard/src/examples/examples.controller.ts.j2 +24 -0
  134. package/templates/kits/nestjs-standard/src/examples/examples.module.ts.j2 +10 -0
  135. package/templates/kits/nestjs-standard/src/examples/examples.service.ts.j2 +33 -0
  136. package/templates/kits/nestjs-standard/src/main.ts.j2 +53 -0
  137. package/templates/kits/nestjs-standard/src/modules/index.ts.j2 +25 -0
  138. package/templates/kits/nestjs-standard/test/app.controller.spec.ts.j2 +24 -0
  139. package/templates/kits/nestjs-standard/test/app.e2e-spec.ts.j2 +60 -0
  140. package/templates/kits/nestjs-standard/test/examples.controller.spec.ts.j2 +28 -0
  141. package/templates/kits/nestjs-standard/test/jest-e2e.json.j2 +15 -0
  142. package/templates/kits/nestjs-standard/tsconfig.build.json.j2 +12 -0
  143. package/templates/kits/nestjs-standard/tsconfig.json.j2 +26 -0
  144. package/dist/analyze-JVMUCQ22.js +0 -1
  145. package/dist/autopilot-release-GM5ALPWO.js +0 -1
  146. package/dist/chunk-424B73UF.js +0 -1
  147. package/dist/chunk-56RL5OB6.js +0 -2
  148. package/dist/chunk-AO6PG3K2.js +0 -9
  149. package/dist/chunk-FVCZGUVX.js +0 -1
  150. package/dist/chunk-GX7UU7LL.js +0 -33
  151. package/dist/chunk-P5ODFWB2.js +0 -13
  152. package/dist/chunk-QN2LPLHO.js +0 -1
  153. package/dist/chunk-RIZCWYRR.js +0 -1
  154. package/dist/chunk-YOQ2546V.js +0 -50
  155. package/dist/chunk-Z5LKRG57.js +0 -1
  156. package/dist/chunk-ZQRFVFKK.js +0 -13
  157. package/dist/demo-kit-2VI4H6OJ.js +0 -141
  158. package/dist/workspace-explain-VKSUKP3O.js +0 -1
  159. package/dist/workspace-explain-contract-CLHQ3XEH.js +0 -1
  160. package/dist/workspace-mcp-serve-OOLITFCK.js +0 -3
  161. package/dist/workspace-registry-summary-ZXGKL2NT.js +0 -1
  162. package/dist/workspace-run-IHB2TPMD.js +0 -1
  163. package/dist/workspace-verify-3CAKAZIL.js +0 -1
@@ -0,0 +1,28 @@
1
+ import { Test, TestingModule } from '@nestjs/testing';
2
+
3
+ import { ExamplesController } from '../src/examples/examples.controller';
4
+ import { ExamplesService } from '../src/examples/examples.service';
5
+
6
+ describe('ExamplesController', () => {
7
+ let controller: ExamplesController;
8
+
9
+ beforeEach(async () => {
10
+ const module: TestingModule = await Test.createTestingModule({
11
+ controllers: [ExamplesController],
12
+ providers: [ExamplesService],
13
+ }).compile();
14
+
15
+ controller = module.get<ExamplesController>(ExamplesController);
16
+ });
17
+
18
+ it('creates and retrieves notes', () => {
19
+ const created = controller.create({ title: 'spec', body: 'covered by tests' });
20
+ expect(created).toMatchObject({ id: 1, title: 'spec' });
21
+
22
+ const list = controller.findAll();
23
+ expect(list).toHaveLength(1);
24
+
25
+ const single = controller.findOne(created.id);
26
+ expect(single).toMatchObject({ id: created.id, title: 'spec' });
27
+ });
28
+ });
@@ -0,0 +1,15 @@
1
+ {
2
+ "moduleFileExtensions": ["js", "json", "ts"],
3
+ "rootDir": "../",
4
+ "testEnvironment": "node",
5
+ "testRegex": ".e2e-spec.ts$",
6
+ "transform": {
7
+ "^.+\\.ts$": "ts-jest"
8
+ },
9
+ "setupFiles": ["dotenv/config"],
10
+ "moduleNameMapper": {
11
+ "^@config/(.*)$": "<rootDir>/src/config/$1",
12
+ "^@modules/(.*)$": "<rootDir>/src/modules/$1",
13
+ "^@shared/(.*)$": "<rootDir>/src/shared/$1"
14
+ }
15
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "declaration": true,
6
+ "sourceMap": false,
7
+ "removeComments": true,
8
+ "incremental": false
9
+ },
10
+ "exclude": ["node_modules", "test", "src/**/*.spec.ts", "src/**/*.e2e-spec.ts"],
11
+ "include": ["src/.rapidkit/**/*.ts", "src/**/*.ts"]
12
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonjs",
4
+ "declaration": true,
5
+ "removeComments": true,
6
+ "emitDecoratorMetadata": true,
7
+ "experimentalDecorators": true,
8
+ "allowSyntheticDefaultImports": true,
9
+ "target": "es2021",
10
+ "sourceMap": true,
11
+ "outDir": "./dist",
12
+ "baseUrl": "./",
13
+ "incremental": true,
14
+ "strict": true,
15
+ "skipLibCheck": true,
16
+ "moduleResolution": "node",
17
+ "esModuleInterop": true,
18
+ "paths": {
19
+ "@config/*": ["src/config/*"],
20
+ "@modules/*": ["src/modules/*"],
21
+ "@shared/*": ["src/shared/*"]
22
+ }
23
+ },
24
+ "exclude": ["node_modules", "dist"],
25
+ "include": ["src/.rapidkit/**/*.ts", "src/**/*.ts", "test/**/*.ts"]
26
+ }
@@ -1 +0,0 @@
1
- export{b as printAnalyzeReport,a as runAnalyze}from'./chunk-AO6PG3K2.js';
@@ -1 +0,0 @@
1
- export{b as AUTOPILOT_RELEASE_ALIAS_FILENAME,a as AUTOPILOT_RELEASE_LAST_RUN_FILENAME,c as runAutopilotRelease}from'./chunk-73IS6RIM.js';
@@ -1 +0,0 @@
1
- var n="workspace-explain.v1",a=["project","release-blocked","blocker","trace"];function p(t){let r=t.trim();if(!r)return null;if(r==="release-blocked")return {kind:"release-blocked"};if(r.startsWith("project:")){let e=r.slice(8).trim();return e?{kind:"project",project:e}:null}if(r.startsWith("blocker:")){let e=r.slice(8).trim();return e?{kind:"blocker",blockerId:e}:null}if(r.startsWith("trace:")){let e=r.slice(6).trim();return e?{kind:"trace",diffRef:e}:null}return {kind:"project",project:r}}function l(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let r=t;return r.schemaVersion===n&&typeof r.generatedAt=="string"&&typeof r.summary=="string"&&Array.isArray(r.sections)&&r.target!=null&&typeof r.target=="object"&&!Array.isArray(r.target)&&typeof r.target.kind=="string"}export{n as a,a as b,p as c,l as d};
@@ -1,2 +0,0 @@
1
- import {d,a,b,e}from'./chunk-64RTZBHU.js';import {d as d$1}from'./chunk-S5KTATOU.js';import {n,q,g}from'./chunk-YBS2HGO3.js';import {h,i,f,e as e$1}from'./chunk-UZW5QFRW.js';import {a as a$1}from'./chunk-VKLL63TL.js';import _ from'fs';import w from'path';import S from'chalk';import {execa}from'execa';function ke(e){return _.existsSync(w.join(e,"bun.lock"))||_.existsSync(w.join(e,"bunfig.toml"))?"bun":_.existsSync(w.join(e,"pnpm-lock.yaml"))?"pnpm":_.existsSync(w.join(e,"yarn.lock"))?"yarn":(_.existsSync(w.join(e,"package-lock.json")),"npm")}function we(e,t,r=ke(e)){return r==="npm"?`npm run ${t}`:`${r} run ${t}`}function be(e,t=ke(e)){return `${t} install`}var $e={"python-fastapi":{runtime:"python",framework:"FastAPI",markers:["pyproject.toml","fastapi"],commands:{init:"python -m pip install -e .",test:"pytest",build:"python -m build",start:"uvicorn main:app --reload"},errorPatterns:{setup:["ModuleNotFoundError","No module named","pip: command not found"],"test-failure":["FAILED","ERROR","test session started"],dependency:["ImportError","missing.*dependency"],runtime:["TypeError","AttributeError","ValueError"],timeout:["timeout","Timeout","timed out"],unknown:[]},healthCheck:{stage:"start",type:"http",value:"http://localhost:8000/docs"},validation:{command:"python -m pip list | grep fastapi",error:"FastAPI not installed"}},"python-django":{runtime:"python",framework:"Django",markers:["manage.py","django"],commands:{init:"python manage.py migrate",test:"python manage.py test",build:"python manage.py collectstatic --noinput",start:"python manage.py runserver 0.0.0.0:8000"},errorPatterns:{setup:["ModuleNotFoundError","ProgrammingError.*migrate"],"test-failure":["FAILED","ERROR","Ran.*test"],dependency:["ImportError","missing.*dependency"],runtime:["DatabaseError","ImproperlyConfigured"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8e3},dependencies:["init"]},"node-nestjs":{runtime:"node",framework:"NestJS",markers:["package.json","@nestjs/core"],commands:{init:"npm install",test:"npm run test",build:"npm run build",start:"npm run start"},errorPatterns:{setup:["npm ERR!","ENOENT","not found"],"test-failure":["Tests.*failed","FAIL","fail.*test"],dependency:["Cannot find module","ERR_MODULE_NOT_FOUND"],runtime:["TypeError","Error: ","ReferenceError"],timeout:["timeout","TIMEOUT"],unknown:[]},healthCheck:{stage:"start",type:"port",value:3e3}},"node-express":{runtime:"node",framework:"Express",markers:["package.json","express"],commands:{init:"npm install",test:"npm run test",build:"npm run build",start:"npm start"},errorPatterns:{setup:["npm ERR!","ENOENT"],"test-failure":["failed","FAIL"],dependency:["Cannot find module"],runtime:["Error","TypeError"],timeout:["timeout"],unknown:[]}},"go-fiber":{runtime:"go",framework:"Fiber",markers:["go.mod","fiber"],commands:{init:"go mod download && go mod tidy",test:"go test ./...",build:"go build -o app .",start:"./app"},errorPatterns:{setup:["go: .*not found","cannot find","go mod tidy"],"test-failure":["FAIL","--- FAIL"],dependency:["missing.*module"],runtime:["panic","fatal","Error"],timeout:["timeout","context deadline"],unknown:[]},dependencies:["init"]},"go-gin":{runtime:"go",framework:"Gin",markers:["go.mod","gin-gonic"],commands:{init:"go mod download && go mod tidy",test:"go test ./...",build:"go build -o app .",start:"./app"},errorPatterns:{setup:["go: .*not found"],"test-failure":["FAIL"],dependency:["missing.*module"],runtime:["panic"],timeout:["timeout"],unknown:[]}},"java-springboot":{runtime:"java",framework:"Spring Boot",markers:["pom.xml","build.gradle","spring-boot"],commands:{init:"mvn dependency:go-offline",test:"mvn test",build:"mvn package -DskipTests",start:"mvn spring-boot:run"},errorPatterns:{setup:["\\[ERROR\\]","BUILD FAILURE","missing dependencies"],"test-failure":["\\[ERROR\\] Tests run:","BUILD FAILURE"],dependency:["missing.*dependency"],runtime:["Exception","Error","NullPointerException"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8080}},"php-laravel":{runtime:"php",framework:"Laravel",markers:["composer.json","artisan","app/Models"],commands:{init:"composer install && php artisan migrate:fresh --seed",test:"php artisan test",build:"php artisan config:cache && php artisan route:cache && php artisan view:cache",start:"php artisan serve --host=0.0.0.0 --port=8000"},errorPatterns:{setup:["Composer.*lock","Fatal error","Class.*not found"],"test-failure":["FAILED","Tests.*failed"],dependency:["Class.*not found","require.*failed"],runtime:["Fatal error","Exception","Error"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8e3},dependencies:["init"]},"php-symfony":{runtime:"php",framework:"Symfony",markers:["composer.json","symfony.lock","bin/console"],commands:{init:"composer install && php bin/console doctrine:database:create",test:"php bin/phpunit",build:"php bin/console cache:clear --env=prod",start:"symfony serve --no-tls"},errorPatterns:{setup:["Composer.*error","Fatal error"],"test-failure":["FAILED","failure"],dependency:["Class.*not found"],runtime:["Fatal error","Exception"],timeout:["timeout"],unknown:[]},dependencies:["init"]},"rust-actix":{runtime:"rust",framework:"Actix-web",markers:["Cargo.toml","actix"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find","failed.*download"],"test-failure":["test result:","FAILED"],dependency:["can.t find.*crate"],runtime:["error\\[E","thread.*panicked"],timeout:["timeout"],unknown:[]},validation:{command:"cargo --version",error:"Rust/Cargo not installed"}},"rust-axum":{runtime:"rust",framework:"Axum",markers:["Cargo.toml","axum"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find"],"test-failure":["test result:","FAILED"],dependency:["can.t find.*crate"],runtime:["error\\[E"],timeout:["timeout"],unknown:[]}},"rust-rocket":{runtime:"rust",framework:"Rocket",markers:["Cargo.toml","rocket"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find"],"test-failure":["FAILED"],dependency:["can.t find"],runtime:["error\\[E"],timeout:["timeout"],unknown:[]}},"dotnet-aspnetcore":{runtime:"dotnet",framework:"ASP.NET Core",markers:[".csproj",".sln","Program.cs"],commands:{init:"dotnet restore",test:"dotnet test",build:"dotnet build -c Release",start:"dotnet run"},errorPatterns:{setup:["error CS","CSPROJ.*not found","NuGet.*restore"],"test-failure":["Failed:.*test","FAILED"],dependency:["error NU1101"],runtime:["error CS","Exception"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:5e3}},"elixir-phoenix":{runtime:"elixir",framework:"Phoenix",markers:["mix.exs","phoenix"],commands:{init:"mix setup",test:"mix test",build:"mix compile --all-warnings",start:"mix phx.server"},errorPatterns:{setup:["\\*\\* \\(.*Error\\)","Mix.InstallError"],"test-failure":["\\d+\\sfailed","FAILED"],dependency:["dependencies are not available"],runtime:["\\*\\* \\(","RuntimeError"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:4e3},dependencies:["init"]},"ruby-rails":{runtime:"ruby",framework:"Rails",markers:["Gemfile","config/application.rb","bin/rails"],commands:{init:"bundle install && rails db:prepare",test:"rails test",build:"rails assets:precompile",start:"rails server --binding=0.0.0.0 --port=3000"},errorPatterns:{setup:["Bundler::.*Error","Gem::.*Error"],"test-failure":["failures,","error,","FAILED"],dependency:["Could not find.*gem"],runtime:["Error","Exception","NoMethodError"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:3e3},dependencies:["init"]},"ruby-sinatra":{runtime:"ruby",framework:"Sinatra",markers:["Gemfile","app.rb","sinatra"],commands:{init:"bundle install",test:"rspec",build:`echo "Sinatra apps don't require build"`,start:"ruby app.rb"},errorPatterns:{setup:["Bundler.*Error","Gem.*Error"],"test-failure":["failure","FAILED"],dependency:["Could not find.*gem"],runtime:["Error","NoMethodError"],timeout:["timeout"],unknown:[]}}},Ie={init:{python:["pip install -e .","poetry install","pip install -r requirements.txt"],node:["npm install","pnpm install","yarn install"],go:["go mod download && go mod tidy","go get ./..."],java:["mvn dependency:go-offline","gradle dependencies"],php:["composer install"],rust:["cargo fetch"],dotnet:["dotnet restore"],elixir:["mix deps.get"],ruby:["bundle install"],"jvm-generic":["mvn dependency:go-offline","gradle dependencies"],unknown:[]},test:{python:["pytest","python -m unittest","python -m pytest"],node:["npm test","npm run test"],go:["go test ./...","make test"],java:["mvn test","gradle test"],php:["php artisan test","phpunit","pest"],rust:["cargo test"],dotnet:["dotnet test"],elixir:["mix test"],ruby:["rspec","ruby -m minitest"],"jvm-generic":["mvn test","gradle test"],unknown:[]},build:{python:["python -m build","python setup.py build"],node:["npm run build"],go:["go build -o app .","go build ./..."],java:["mvn package -DskipTests","gradle build -x test"],php:['echo "PHP build: typically no build step"'],rust:["cargo build --release"],dotnet:["dotnet build -c Release"],elixir:["mix compile"],ruby:["gem build *.gemspec"],"jvm-generic":["mvn package -DskipTests","gradle build"],unknown:[]},start:{python:["python app.py","python main.py","uvicorn main:app --reload"],node:["npm start","node index.js","node src/index.js"],go:["./app","go run main.go","go run ./..."],java:["mvn spring-boot:run","gradle bootRun","java -jar target/*.jar"],php:["php -S 0.0.0.0:8000","php artisan serve"],rust:["cargo run --release","./target/release/app"],dotnet:["dotnet run"],elixir:["mix phx.server","iex -S mix"],ruby:["rails server","ruby app.rb","bundle exec puma"],"jvm-generic":["java -jar *.jar","gradle run"],unknown:[]}};function Z(e,t){if(t){let r=t.trim().toLowerCase().replace(/[_.\s]+/g,"-"),n=e$1(t),s=`${e}-${n==="gofiber"?"fiber":n==="gogin"?"gin":n==="dotnet"?"aspnetcore":n!=="unknown"?n:r==="fiber"?"fiber":r==="aspnetcore"||r==="asp-net-core"?"aspnetcore":r}`;return $e[s]}}function xe(e,t,r){if(t){let n=Z(e,t);if(n&&n.commands[r])return n.commands[r]}if(["init","test","build","start"].includes(r)){let n=Ie[r]?.[e]??[];return n.length>0?n[0]:void 0}}var Me={test:"test",build:"build",start:"start"};function ee(e){if(e.stage==="init")return e.runtime==="node"?be(e.projectPath):xe(e.runtime,e.framework,e.stage);if(e.runtime==="node"){let t=Me[e.stage];if(t){let r=g(e.projectPath,t,{framework:e.framework});if(r)return we(e.projectPath,r.scriptName)}}return xe(e.runtime,e.framework,e.stage)}function Oe(e){let t=h(e).map(r=>r==="python"?"python":r==="node"||r==="bun"?"node":r==="go"?"go":r==="java"?"java":r==="php"?"php":r==="rust"?"rust":r==="dotnet"?"dotnet":r==="elixir"?"elixir":r==="ruby"?"ruby":r==="clojure"||r==="scala"||r==="kotlin"?"jvm-generic":null).filter(r=>r!==null).filter((r,n,o)=>o.indexOf(r)===n);return {primary:t.length>0?t[0]:"unknown",secondary:t.slice(1)}}function Re(e){return Oe(e).primary}function ve(e,t){if(!e)return "unknown";t||(t={setup:["ModuleNotFoundError","npm ERR!","error:","not found"],"test-failure":["FAILED","FAIL","failed"],dependency:["cannot find module","import.*error"],runtime:["Exception","Error:","panic","TypeError"],timeout:["timeout","Timeout","deadline exceeded"],unknown:[]});for(let[r,n]of Object.entries(t))for(let o of n)if(new RegExp(o,"i").test(e))return r;return "unknown"}async function z(e){let t=e.split(/[&|;]\s*/)[0].trim().split(/\s+/)[0];if(["echo","cd","pwd","test","true","false","exit"].includes(t))return {valid:true};try{let n=process.platform==="win32"?"where":"which";if((await execa(n,[t],{reject:false})).exitCode===0)return {valid:true}}catch{}return {valid:false,reason:`Command '${t}' not found or not executable`}}function Se(e,t,r){if(!t)return e;let n=typeof t=="object"&&!Array.isArray(t)&&("dev"in t||"staging"in t||"prod"in t||"default"in t)&&!Object.keys(t).some(o=>["init","test","build","start"].includes(o))?t:{};return r&&typeof n[r]=="string"?n[r]:typeof n.default=="string"?n.default:e}var je={init:"init",test:"test",build:"build",start:"start"};function Le(e){return e in je?je[e]:null}function _e(e,t){let n$1=n(e)?.contextJson?.commands;if(!n$1||typeof n$1!="object"||Array.isArray(n$1))return;let o=n$1[t];if(typeof o=="string"&&o.trim().length>0)return o.trim();if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o,c=s.default??s.dev;if(typeof c=="string"&&c.trim().length>0)return c.trim()}}function Ee(e,t,r=q(e)){let n=Le(t);if(!n)return _e(e,t)?{supported:true}:{supported:false,reason:`Workspace stage "${t}" is not part of the RapidKit fleet contract.`};if(!r.projectRoot)return {supported:false,reason:"No RapidKit project metadata was detected for this target."};let o=r.commandMap[n];return !o||o.status!=="supported"?{supported:false,reason:o?.reason??`Command "${n}" is not supported for this project runtime/framework.`}:{supported:true}}var Ge=new Set(["init","test","build","start"]),Be=new Set([".git","node_modules",".rapidkit",".venv","dist","build","coverage","htmlcov"]);async function $(e){try{return await _.promises.access(e,_.constants.F_OK),true}catch{return false}}async function Ke(e,t,r){if(t==="python"){let n=w.join(e,".rapidkit","cli.py");return await $(n)?{valid:true}:{valid:false,reason:"Project-local .rapidkit/cli.py is missing. Run `rapidkit init` in this project first."}}return z(r)}async function ne(e){let t=await _.promises.readFile(e,"utf-8");return JSON.parse(t)}function C(e){return e.replace(/\\/g,"/")}function Ve(e){let t=e?.trim();return t?t.startsWith("project:")?t.slice(8).trim()||null:t:null}async function ze(e){return a$1(e,{skipDirs:Be,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(t,r)=>await $(w.join(t,".rapidkit","context.json"))||await $(w.join(t,".rapidkit","project.json"))?true:w.resolve(t)===w.resolve(r)?false:h(t).length>0})}async function He(e){for(let t of [w.join(".rapidkit","project.json"),w.join(".rapidkit","context.json")]){let r=w.join(e,t);if(await $(r))try{let n=await ne(r),o=n.name??n.projectName??n.slug;if(typeof o=="string"&&o.trim())return o.trim()}catch{}}return null}async function Ue(e,t,r){let n=Ve(r);if(!n)return {projects:t,normalizedScope:null};let o=C(n).toLowerCase(),s=[];for(let c of t){let d=C(w.relative(e,c)),p=w.basename(c),f=await He(c);[d,p,f].filter(a=>typeof a=="string"&&a.length>0).map(a=>C(a).toLowerCase()).includes(o)&&s.push(c);}if(s.length===0)throw new Error(`Workspace run scope did not match any project: ${r}`);return {projects:s,normalizedScope:n}}async function Je(e,t,r){let n=await execa("git",["diff","--name-only",`${r}...HEAD`],{cwd:e,reject:false});if(n.exitCode!==0)return new Set(t);let o=n.stdout.split(/\r?\n/).map(c=>c.trim()).filter(c=>c.length>0).map(c=>C(c));if(o.length===0)return new Set;let s=new Set;for(let c of t){let d=C(w.relative(e,c));if(!d||d===".")continue;let p=`${d}/`;o.some(f=>f===d||f.startsWith(p))&&s.add(c);}return s}async function qe(e,t,r){let n=w.join(e,".rapidkit","workspace.contract.json");if(await $(n))try{let g=await Ye(e,t,r,n);if(g.graphStatus!=="missing")return g}catch{return {expanded:r,graphStatus:"invalid",expansionDepth:0}}let o=w.join(e,".rapidkit","workspace-dependency-graph.json");if(!await $(o))return {expanded:r,graphStatus:"missing",expansionDepth:0};let s;try{s=await ne(o);}catch{return {expanded:r,graphStatus:"invalid",expansionDepth:0}}let c=new Set(t.map(g=>w.resolve(g))),d=new Map;if(!s||typeof s!="object"||Array.isArray(s))return {expanded:r,graphStatus:"invalid",expansionDepth:0};let p=Array.isArray(s.projects)?s.projects:[];for(let g of p){if(!g||typeof g!="object"||Array.isArray(g))continue;let a=g,l=typeof a.path=="string"?a.path:"",y=w.resolve(e,l);if(!c.has(y))continue;let h=Array.isArray(a.dependsOn)?a.dependsOn.filter(R=>typeof R=="string"):[];for(let R of h){let u=w.resolve(e,R);c.has(u)&&(d.has(u)||d.set(u,new Set),d.get(u)?.add(y));}}let f=d$1(d,r);return {expanded:f.reached,graphStatus:"loaded",expansionDepth:f.added}}async function Ye(e,t,r,n){let o=await ne(n);if(!o||typeof o!="object"||Array.isArray(o))return {expanded:r,graphStatus:"invalid",expansionDepth:0};let s=o,c=Array.isArray(s.projects)?s.projects:null;if(!c)return {expanded:r,graphStatus:"invalid",expansionDepth:0};let d=new Map,p=new Map;for(let y of t){let h=C(w.relative(e,y));p.set(h,w.resolve(y));}let f=new Map,g=new Map,a=new Map;for(let y of c){if(!y||typeof y!="object"||Array.isArray(y))continue;let h=y,R=typeof h.slug=="string"?h.slug:"",u=typeof h.relativePath=="string"?C(h.relativePath):R,b=p.get(u);!R||!b||d.set(R,b);}for(let y of c){if(!y||typeof y!="object"||Array.isArray(y))continue;let h=y,R=typeof h.slug=="string"?h.slug:"",u=d.get(R);if(!u)continue;let b=h.contracts&&typeof h.contracts=="object"&&!Array.isArray(h.contracts)?h.contracts:{},v=Array.isArray(b.dependsOn)?b.dependsOn.filter(x=>typeof x=="string"):[],I=Array.isArray(b.publishes)?b.publishes.filter(x=>typeof x=="string"):[],M=Array.isArray(b.consumes)?b.consumes.filter(x=>typeof x=="string"):[];for(let x of v){let P=d.get(x);P&&(a.has(P)||a.set(P,new Set),a.get(P)?.add(u));}for(let x of I)f.has(x)||f.set(x,new Set),f.get(x)?.add(u);for(let x of M)g.has(x)||g.set(x,new Set),g.get(x)?.add(u);}for(let[y,h]of f.entries()){let R=g.get(y);if(R)for(let u of h){a.has(u)||a.set(u,new Set);for(let b of R)b!==u&&a.get(u)?.add(b);}}let l=d$1(a,r);return {expanded:l.reached,graphStatus:"loaded",expansionDepth:l.added}}async function Qe(e,t){if(typeof t=="boolean")return t;let r=w.join(e,".rapidkit","policies.yml");if(!await $(r))return true;let n="";try{n=await _.promises.readFile(r,"utf-8");}catch{return true}let o=n.match(/^[\t ]*rules\.enforce_workspace_run_gates:\s*(true|false)\s*(?:#.*)?$/m);return o?o[1]==="true":true}async function te(e,t){let r=process.argv[1];if(!r)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for nested workspace-run execution."};let n=await execa(process.execPath,[r,...e],{cwd:t,reject:false,env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}});return {exitCode:Number(n.exitCode??1),stdout:n.stdout,stderr:n.stderr}}function Xe(e){return e==="node"||e==="go"||e==="java"||e==="python"||e==="dotnet"}function Ze(){return process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"}async function et(e){let t=process.cwd();try{process.chdir(e);let{handleInitCommand:r}=await import('./index.js');return {exitCode:await r(["init"]),stdout:"",stderr:""}}finally{process.chdir(t);}}async function tt(e){let t=a=>{let l=f(a);return l==="node"||l==="bun"?"node":l==="python"?"python":l==="go"?"go":l==="java"?"java":l==="php"?"php":l==="ruby"?"ruby":l==="rust"?"rust":l==="dotnet"?"dotnet":l==="elixir"?"elixir":l==="clojure"||l==="scala"||l==="kotlin"?"jvm-generic":Re(e)},r=a=>{if(!a)return;let l=e$1(a);if(new Set(["fastapi","django","flask","nestjs","express","fastify","koa","gofiber","gogin","echo","springboot","laravel","symfony","rails","sinatra","dotnet","actix","axum","rocket","phoenix"]).has(l))return l},n$1=n(e),o=n$1?.detection??i(e,n$1?.projectJson??null),s=n$1?.contextJson,c=t(o.runtime),d=r(o.key),p={},f$1=new Set(["init","test","build","start"]);if(s?.commands&&typeof s.commands=="object")for(let[a,l]of Object.entries(s.commands))typeof l=="string"&&f$1.has(a)&&(p[a]=l);let g;if(s?.commandEnvironments&&typeof s.commandEnvironments=="object"){let a=s.commandEnvironments;g={dev:typeof a.dev=="string"?a.dev:void 0,staging:typeof a.staging=="string"?a.staging:void 0,prod:typeof a.prod=="string"?a.prod:void 0,default:typeof a.default=="string"?a.default:void 0};}return {runtime:c,framework:d,commandOverrides:Object.keys(p).length>0?p:void 0,environmentCommandVariants:g,environment:typeof s?.environment=="string"?s.environment:void 0}}async function rt(e,t,r,n,o,s,c){let d=!o?.[t]&&Xe(r),p;if(o&&o[t]?p=o[t]:d?p=`rapidkit ${t}`:p=ee({projectPath:e,runtime:r,framework:n,stage:t}),!p)return {exitCode:127,command:`<stage not supported for ${r}>`,message:`No stage command found for runtime '${r}' and framework '${n||"unknown"}'`,errorCategory:"runtime"};let f=Se(p,s,c);if(!f)return {exitCode:127,command:p,message:"Failed to resolve stage command",errorCategory:"runtime"};let g=ee({projectPath:e,runtime:r,framework:n,stage:t});if(d){if(g){let u=d?await Ke(e,r,g):await z(g);if(!u.valid)return {exitCode:127,command:f,message:u.reason||"Command not available",errorCategory:"setup"}}}else {let u=await z(f);if(!u.valid)return {exitCode:127,command:f,message:u.reason||"Command not available",errorCategory:"setup"}}let a=0,l="",y="",h;try{let u=d?t==="init"&&Ze()?await et(e):await te([t],e):await execa(f,[],{cwd:e,reject:false,shell:true});if(a=Number(u.exitCode??0),l=u.stdout,y=u.stderr,a!==0){let b=`${l}
2
- ${y}`;h=ve(b);}}catch(u){return {exitCode:1,command:f,message:u instanceof Error?u.message:"Command execution failed",errorCategory:"runtime"}}return {exitCode:a,command:f,errorCategory:h,healthStatus:void 0,message:a!==0?`Stage failed with exit code ${a}`:void 0}}function Ce(e){try{return JSON.parse(e)}catch{return null}}function nt(e){switch(e){case "dotnet":return "Install .NET 8+ SDK, then rerun `npx rapidkit setup dotnet` or `npx rapidkit init`.";case "go":return "Install Go 1.21+, then rerun `npx rapidkit setup go` or `npx rapidkit init`.";case "java":case "jvm-generic":return "Install Java 21+ and Maven/Gradle, then rerun `npx rapidkit setup java` or `npx rapidkit init`.";case "node":return "Install Node.js LTS and npm/pnpm/yarn, then rerun `npx rapidkit setup node` or `npx rapidkit init`.";case "python":return "Install Python 3.10+ and pip/Poetry, then rerun `npx rapidkit setup python` or `npx rapidkit init`.";default:return null}}async function ot(e){let t=[],r=await te(["doctor","workspace","--json"],e);if(r.exitCode!==0)t.push({gate:"doctor-workspace",status:"fail",summary:"doctor workspace command failed"});else {let s=Ce(r.stdout)?.healthScore,c=Number(s?.errors??0);Number.isFinite(c)&&c>0?t.push({gate:"doctor-workspace",status:"fail",summary:`doctor workspace reports ${c} error(s)`}):t.push({gate:"doctor-workspace",status:"pass",summary:"doctor workspace passed"});}let n=await te(["readiness","--json"],e);if(n.exitCode!==0)t.push({gate:"readiness",status:"fail",summary:"readiness command failed"});else {let o=Ce(n.stdout),s=String(o?.overallStatus??"").toLowerCase();s==="fail"?t.push({gate:"readiness",status:"fail",summary:"readiness overall status is fail"}):s==="warn"?t.push({gate:"readiness",status:"warn",summary:"readiness overall status is warn"}):t.push({gate:"readiness",status:"pass",summary:"readiness overall status is pass"});}return t}var st=new Set(["dev","stop"]);function at(e){let t=e.trim();return !t||st.has(t.toLowerCase())?false:Ge.has(t)?true:/^[a-z][a-z0-9_-]*$/i.test(t)}function Pe(e,t,r){let n=C(w.relative(r,t));return (Array.isArray(e.projects)?e.projects:[]).some(s=>{if(!s||typeof s!="object")return false;let c=s,d=[c.relativePath,c.path].filter(p=>typeof p=="string"&&p.length>0).map(p=>C(p));return c.status==="passed"&&(d.includes(n)||d.some(p=>p.endsWith(`/${n}`)))})}function it(e,t){return Z(e,t)?.dependencies??[]}function ct(e,t){let r=Math.max(1,Math.min(4,t)),n=Number(e??r);return Number.isFinite(n)?Math.max(1,Math.min(16,Math.trunc(n))):r}async function Lt(e$1){if(!at(e$1.stage))throw new Error(`Unsupported workspace run stage: ${e$1.stage}`);let t=Date.now(),r=w.resolve(e$1.workspacePath),n=await d(r),o=await ze(r),{projects:s,normalizedScope:c}=await Ue(r,o,e$1.scope),d$1=e$1.affected===true,p=e$1.blastRadius===true,f=e$1.since?.trim()||"HEAD~1",g=d$1?await Je(r,s,f):new Set(s),a$1,l="not-applicable",y=0,h="all";if(d$1&&p){let m=await qe(r,o,g);a$1=m.expanded,l=m.graphStatus,y=m.expansionDepth,h="affected+blast-radius";}else d$1?(a$1=g,h="affected"):(a$1=g,h="all");let R=e$1.stage==="init"?false:await Qe(r,e$1.enforceGates),u=R?await ot(r):[{gate:"doctor-workspace",status:"skipped",summary:"workspace run gates disabled"},{gate:"readiness",status:"skipped",summary:"workspace run gates disabled"}],b$1=u.find(m=>m.status==="fail"),v=s.filter(m=>a$1.has(m)),I=e$1.continueOnError===true||e$1.stage==="init",M=e$1.parallel===true,x=ct(e$1.maxWorkers,v.length),P=v.length,N=0;e$1.json||console.log(S.gray(`Workspace run (${e$1.stage}) started: ${P} target(s), ${M?`parallel x${x}`:"sequential"}`));let A=new Map;for(let m of o){let k=s.includes(m),i=k&&a$1.has(m);A.set(m,{path:m,relativePath:C(w.relative(r,m)),selected:i,affected:i,status:"skipped",exitCode:null,durationMs:0,reason:i?void 0:k?"not affected":"outside scope",framework:void 0,runtimeDetected:void 0,executionCommand:void 0});}if(b$1)for(let m of v){let k=A.get(m);k&&(k.status="skipped",k.reason=`blocked by ${b$1.gate}`);}else {let m=async k=>{let i=A.get(k);if(!i)return;let T=C(w.relative(r,k));e$1.json||console.log(S.gray(`\u23F3 [${N}/${P}] ${e$1.stage} ${T}`)),i.selected=true,i.affected=true;let E=Date.now(),{runtime:j,framework:F,commandOverrides:Ne,environmentCommandVariants:Te,environment:We}=await tt(k);i.runtimeDetected=j,i.framework=F;let ce=Ee(k,e$1.stage);if(!ce.supported){i.status="skipped",i.reason=ce.reason??`stage "${e$1.stage}" unsupported for project`,i.durationMs=Date.now()-E,i.exitCode=null,N+=1;return}if(e$1.reusePassed&&n){let D=n.stages[e$1.stage]??n.stages[e$1.stage];if(D&&Pe(D,k,r)){i.status="passed",i.reason="reused passed result from workspace-run-last.json",i.durationMs=Date.now()-E,i.exitCode=0,N+=1,e$1.json||console.log(S.gray(`\u21BA reused passed cache for ${T}`));return}}let ue=it(j,F);if(ue.length>0&&n){let D=ue.find(J=>{let L=n.stages[J];return !L||!Pe(L,k,r)});if(D){i.status="skipped",i.reason=`dependency stage "${D}" not satisfied in workspace-run-last.json`,i.durationMs=Date.now()-E,i.exitCode=null,N+=1;return}}let W=await rt(k,e$1.stage,j,F,Ne,Te,We);if(i.executionCommand=W.command,i.errorCategory=W.errorCategory,i.healthStatus=W.healthStatus,i.durationMs=Date.now()-E,i.exitCode=W.exitCode,W.exitCode===0?(i.status="passed",i.reason=void 0):(i.status="failed",i.reason=W.message||"stage command failed",i.errorMessage=W.message),N+=1,!e$1.json){let D=P>0?Math.round(N/P*100):100,J=i.status==="passed"?S.green("\u2705"):S.red("\u274C");if(console.log(S.gray(`${J} [${N}/${P}] (${D}%) ${T} ${i.durationMs}ms`)),i.status==="failed"){i.reason&&console.log(S.red(` Reason: ${i.reason}`)),i.executionCommand&&console.log(S.gray(` Command: ${i.executionCommand}`));let L=nt(i.runtimeDetected);L&&i.errorCategory==="setup"&&console.log(S.gray(` Hint: ${L}`));}}};if(M&&v.length>1){let k=0,i=false,T=new Array(x).fill(null).map(async()=>{for(;k<v.length;){if(i&&!I)return;let E=k;k+=1;let j=v[E];await m(j),A.get(j)?.status==="failed"&&(i=true);}});if(await Promise.all(T),!I&&i){let E=false;for(let j of v){let F=A.get(j);if(F){if(F.status==="failed"){E=true;continue}E&&F.status==="skipped"&&(F.reason=F.reason||"stopped after failure");}}}}else for(let k of v){await m(k);let i=A.get(k);if(!I&&i?.status==="failed"){let T=v.slice(v.indexOf(k)+1);for(let E of T){let j=A.get(E);j&&(j.status="skipped",j.reason="stopped after failure");}break}}}let O=[];for(let m of o){let k=A.get(m);k&&O.push(k);}let oe=O.filter(m=>m.status==="passed").length,U=O.filter(m=>m.status==="failed").length,se=O.filter(m=>m.status==="skipped").length,ae=e$1.strict===true,Fe=U>0||ae&&u.some(m=>m.status==="fail"||m.status==="warn")?1:0,ie={schemaVersion:"1.0",workspacePath:r,stage:e$1.stage,generatedAt:new Date().toISOString(),durationMs:Date.now()-t,options:{affected:d$1,blastRadius:p,since:d$1?f:null,parallel:M,maxWorkers:x,continueOnError:I,strict:ae,enforceGates:R,scope:c,reusePassed:e$1.reusePassed===true},selection:{mode:h,since:d$1?f:null,scope:c,graphStatus:l,expansionDepth:y},gates:{enforced:R,results:u,blocked:!!b$1,blockingGate:b$1?.gate},summary:{projectCount:o.length,selectedCount:v.length,passed:oe,failed:U,skipped:se,exitCode:Fe},projects:O,enterpriseControls:{jsonReady:true,evidencePath:b}},Ae=w.join(r,".rapidkit","reports",a);return await e(r,ie),e$1.json||(b$1&&(console.log(S.red(`\u274C Workspace run blocked by ${b$1.gate}`)),console.log(S.gray(` ${b$1.summary}`))),console.log(S.cyan(`Workspace run (${e$1.stage}) => passed: ${oe}, failed: ${U}, skipped: ${se}`)),console.log(S.gray(`Report: ${Ae}`))),ie}export{Lt as a};
@@ -1,9 +0,0 @@
1
- import {a,b}from'./chunk-KMUWWZRT.js';import {f as f$1,e}from'./chunk-PCXSTKZ5.js';import {h as h$1,i}from'./chunk-UZW5QFRW.js';import {a as a$1}from'./chunk-VKLL63TL.js';import h from'fs';import o from'path';import s from'chalk';var S=new Set([".git",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next"]);async function y(e){try{return await h.promises.access(e,h.constants.F_OK),true}catch{return false}}async function z(e){try{let n=JSON.parse(await h.promises.readFile(e,"utf-8"));return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async function T(e){try{return await h.promises.readFile(e,"utf-8")}catch{return ""}}function N(e){return a(e)}async function K(e,n){return await y(o.join(e,".rapidkit","project.json"))||await y(o.join(e,".rapidkit","context.json"))?true:b(e)?false:o.resolve(e)===o.resolve(n)?h$1(e).length>0:h$1(e).length>0}async function O(e){let n=await a$1(e,{skipDirs:S,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:K});return n.length>0?n:b(e)?[]:h$1(e).length>0?[e]:[]}function _(e,n){return o.relative(e,n).replace(/\\/g,"/")||"."}async function A(e,n){for(let t of n)if(await y(o.join(e,t)))return true;return false}async function M(e){return A(e,["health","health.ts","health.js","health.py","health.go","health.kt","health.rb","health.php","healthcheck","health-check","src/health.ts","src/health.js","src/health.py","src/health.go","src/health.kt","src/health.rb","src/health.php","src/healthcheck.ts","src/healthcheck.js","src/liveness.ts","src/readiness.ts","src/ping.ts"])}async function J(e){if(await A(e,["tests","test","__tests__","src/__tests__","pytest.ini","vitest.config.ts","jest.config.ts"]))return true;let t=await z(o.join(e,"package.json")),i=t?.scripts&&typeof t.scripts=="object"?t.scripts:{};return typeof i.test=="string"&&i.test.trim().length>0}async function W(e){let n=await z(o.join(e,"package.json")),t=n?.scripts&&typeof n.scripts=="object"?n.scripts:{};return Object.keys(t).sort()}function f(e,n,t,i,r,c){return {id:e,severity:n,target:t,title:i,detail:r,remediation:c}}function H(e){let n=e.reduce((t,i)=>i.severity==="fail"?t+28:i.severity==="warn"?t+12:t+3,0);return Math.max(0,100-n)}async function B(e,n){let t=await z(o.join(n,".rapidkit","project.json")),i$1=i(n,t),r=h$1(n),c=i$1.runtime==="unknown"?r[0]||"unknown":i$1.runtime,a=_(e,n),d=a,u=await W(n),g=await y(o.join(n,".rapidkit","project.json"))||await y(o.join(n,".rapidkit","context.json")),m=await J(n),k=await A(n,["Dockerfile","dockerfile"]),w=await A(n,[".env.example","env.example","config/env.example"]),P=await A(n,[".github/workflows/ci.yml",".github/workflows/ci.yaml",".github/workflows/main.yml",".github/workflows/build.yml",".github/workflows/test.yml",".github/workflows/deploy.yml",".gitlab-ci.yml",".circleci/config.yml","azure-pipelines.yml","bitbucket-pipelines.yml","cloudbuild.yaml"]),R=await M(n),l=[];return i$1.key==="unknown"&&l.push(f("project.stack.unknown","fail",d,"Project stack is unknown","RapidKit cannot confidently classify this backend project.","Add .rapidkit/project.json metadata or import the project with `rapidkit import`.")),g||l.push(f("project.marker.missing","warn",d,"RapidKit marker is missing","The project can be detected by files, but it is not registered with RapidKit metadata.","Run `rapidkit import <path>` from a workspace or create the project through RapidKit.")),m||l.push(f("project.tests.missing","warn",d,"Test entrypoint is missing","No common test folder, config, or package test script was found.","Add a test command so `rapidkit workspace run test --affected` can gate changes.")),w||l.push(f("project.env.example.missing","info",d,"Environment example is missing","No .env.example or env.example file was found.","Add an env example for onboarding and CI secret documentation.")),P||l.push(f("project.ci.missing","warn",d,"Continuous integration is missing","No recognized CI/CD configuration file was detected for this project.","Add CI configuration so tests and checks run automatically for every change.")),R||l.push(f("project.health.missing","info",d,"Health or readiness probe is missing","The project has no obvious health or readiness endpoint to support automated deployment and runtime checks.","Add a simple health endpoint and document it for readiness gates and observability.")),k||l.push(f("project.container.missing","info",d,"Container recipe is missing","No Dockerfile was found for this project.","Add a Dockerfile when the service is intended for containerized deployment.")),{name:o.basename(n),path:n,relativePath:a,runtime:c,framework:i$1.key,confidence:i$1.confidence,supportTier:i$1.supportTier,hasRapidKitMarker:g,hasTests:m,hasDockerfile:k,hasEnvExample:w,hasCiConfig:P,hasHealthEndpoint:R,scripts:u,findings:l,score:H(l)}}function U(e){return e.name.toLowerCase()}async function V(e){let n=new Map(e.map(r=>[U(r),r])),t=[];for(let r of e){let c=await z(o.join(r.path,"package.json")),a={...c?.dependencies??{},...c?.devDependencies??{},...c?.peerDependencies??{}};for(let u of Object.keys(a)){let g=u.replace(/^@[^/]+\//,"").toLowerCase(),m=n.get(g);m&&m.relativePath!==r.relativePath&&t.push({from:r.relativePath,to:m.relativePath,kind:"package"});}let d=await T(o.join(r.path,"pyproject.toml"));for(let u of e)u.relativePath!==r.relativePath&&d.includes(u.name)&&t.push({from:r.relativePath,to:u.relativePath,kind:"workspace-reference"});}let i=new Set;return t.filter(r=>{let c=`${r.from}\0${r.to}\0${r.kind}`;return i.has(c)?false:(i.add(c),true)})}function L(e,n){let t=new Map;for(let i of e)t.set(i.relativePath,{project:i.relativePath,directDependents:0,directDependencies:0});for(let i of n){let r=t.get(i.from),c=t.get(i.to);r&&(r.directDependencies+=1),c&&(c.directDependents+=1);}return Array.from(t.values()).sort((i,r)=>r.directDependents-i.directDependents||r.directDependencies-i.directDependencies)}async function q(e){let n=await z(o.join(e,".rapidkit","workspace.json"));return typeof n?.profile=="string"?n.profile:null}function Q(e){return {fail:e.filter(n=>n.severity==="fail").length,warn:e.filter(n=>n.severity==="warn").length,info:e.filter(n=>n.severity==="info").length}}function X(e){if(e.projectCount===0)return e.workspaceDetected?["Add your first project: npx rapidkit create project <name> --kit <kit>","Import an existing service: npx rapidkit import <path>"]:["Create a RapidKit workspace: npx rapidkit create workspace my-workspace --profile polyglot","Import an existing service: npx rapidkit import ../service"];let n=[];return e.findings.some(t=>t.id==="workspace.marker.missing")&&n.push("Initialize workspace metadata with `rapidkit bootstrap --profile polyglot`."),e.findings.some(t=>t.id==="project.marker.missing")&&n.push("Register detected projects with `rapidkit import <path>` or recreate them via `rapidkit create project`."),e.findings.some(t=>t.id==="project.tests.missing")&&n.push("Add test entrypoints, then gate changes with `rapidkit workspace run test --affected --strict`."),e.findings.some(t=>t.id==="project.ci.missing")&&n.push("Add CI/CD configuration to catch regressions early and make workspace health checks actionable."),e.findings.some(t=>t.id==="project.health.missing")&&n.push("Add a health/readiness endpoint so runtime probes and deployment checks can verify service health."),e.hasGraph||n.push("Create `.rapidkit/workspace-dependency-graph.json` or use analyze output as the first graph seed."),n.push("Run `rapidkit autopilot release --mode audit --json` before release."),Array.from(new Set(n))}async function ae(e$1={}){let n=o.resolve(e$1.workspacePath||process.cwd());if(!await y(n))throw new Error(`Workspace path does not exist: ${n}`);let t=N(n)??n,i=await y(o.join(t,".rapidkit-workspace"))||await y(o.join(t,".rapidkit","workspace.json")),r=await q(t),c=await O(t),a=await Promise.all(c.map(p=>B(t,p))),d=await V(a),u=L(a,d),g=[];i||g.push(f("workspace.marker.missing","warn",".","Workspace metadata is missing","The directory can be analyzed, but it is not a registered RapidKit workspace.","Run `rapidkit create workspace` or `rapidkit bootstrap --profile polyglot` in a workspace root.")),a.length===0&&g.push(f("workspace.projects.missing","warn",".","No backend projects detected","RapidKit did not find runtime markers or project metadata under this root.","Create a project with `rapidkit create project` or import one with `rapidkit import <path>`."));let m=[...g,...a.flatMap(p=>p.findings)],k=Q(m),w={};for(let p of a)w[p.runtime]=(w[p.runtime]||0)+1;let P=a.length>0?Math.round(a.reduce((p,v)=>p+v.score,0)/a.length):0,R=g.reduce((p,v)=>p+(v.severity==="fail"?20:v.severity==="warn"?8:2),0),l=Math.max(0,P-R),E=k.fail>0||e$1.strict&&k.warn>0?"blocked":k.warn>0?"needs-attention":"ready",j={schemaVersion:"rapidkit-analyze-v1",generatedAt:new Date().toISOString(),workspacePath:t,workspaceDetected:i,profile:r,summary:{score:l,verdict:E,projectCount:a.length,runtimeCount:Object.keys(w).length,findings:k},runtimes:w,projects:a,dependencyGraph:{status:d.length>0?"generated":"empty",edges:d,topImpactedProjects:u.slice(0,5)},findings:m,nextActions:X({findings:m,projectCount:a.length,hasGraph:d.length>0,workspaceDetected:i}),enterpriseControls:{jsonReady:true,ciGateCommand:"rapidkit analyze --json --strict",releaseGateCommand:"rapidkit autopilot release --mode enforce --json",evidencePath:".rapidkit/reports/analyze-last-run.json"}};if(e$1.output&&(await h.promises.mkdir(o.dirname(o.resolve(e$1.output)),{recursive:true}),await h.promises.writeFile(o.resolve(e$1.output),`${JSON.stringify(j,null,2)}
2
- `)),!e$1.output&&i){let p=o.join(t,".rapidkit","reports","analyze-last-run.json");await h.promises.mkdir(o.dirname(p),{recursive:true});let v=f$1(j,{commandId:"workspaceAnalyze",exitCode:j.summary.verdict==="blocked"?2:j.summary.verdict==="needs-attention"?1:0,generatedAt:j.generatedAt,blockers:j.findings.filter(x=>x.severity==="fail").map(x=>x.title).slice(0,12),runId:e()});await h.promises.writeFile(p,`${JSON.stringify(v,null,2)}
3
- `);}return j}function ce(e){let n=e.summary.verdict==="ready"?s.green:e.summary.verdict==="needs-attention"?s.yellow:s.red;if(console.log(s.bold(`
4
- RapidKit Workspace Analysis
5
- `)),console.log(s.cyan("Workspace:"),e.workspacePath),console.log(s.cyan("Profile:"),e.profile||"not configured"),console.log(s.cyan("Score:"),`${e.summary.score}/100`),console.log(s.cyan("Verdict:"),n(e.summary.verdict)),console.log(s.gray(`Projects: ${e.summary.projectCount}, runtimes: ${e.summary.runtimeCount}, findings: ${e.summary.findings.fail} fail / ${e.summary.findings.warn} warn / ${e.summary.findings.info} info`)),e.projects.length>0){console.log(s.bold(`
6
- Projects`));for(let t of e.projects){let i=t.score>=85?s.green("pass"):t.score>=65?s.yellow("watch"):s.red("risk");console.log(` ${t.relativePath} ${s.gray(`${t.runtime}/${t.framework}`)} ${i} ${t.score}/100`);}}if(e.dependencyGraph.status==="generated"&&(console.log(s.bold(`
7
- Dependency Graph`)),console.log(s.gray(` edges: ${e.dependencyGraph.edges.length}`)),e.dependencyGraph.topImpactedProjects.length>0)){console.log(s.gray(" Top impacted projects:"));for(let t of e.dependencyGraph.topImpactedProjects.slice(0,3))console.log(` ${t.project} (${t.directDependents} dependents, ${t.directDependencies} dependencies)`);}if(e.findings.length>0){console.log(s.bold(`
8
- Top Findings`));for(let t of e.findings.slice(0,8)){let i=t.severity==="fail"?s.red:t.severity==="warn"?s.yellow:s.gray;console.log(` ${i(t.severity.toUpperCase())} ${t.target}: ${t.title}`),console.log(s.gray(` ${t.remediation}`));}}console.log(s.bold(`
9
- Next Actions`));for(let t of e.nextActions.slice(0,5))console.log(s.gray(` - ${t}`));console.log();}export{ae as a,ce as b};
@@ -1 +0,0 @@
1
- import {a,b as b$2}from'./chunk-PYCJWW4B.js';import {b as b$1,c,d as d$1}from'./chunk-44GSDNPQ.js';import {m,f,c as c$1,n,e}from'./chunk-AT3EQ2S7.js';import {c as c$2}from'./chunk-64RTZBHU.js';import {j,b as b$3}from'./chunk-QN2LPLHO.js';import {a as a$1}from'./chunk-DMUEGR36.js';import d from'path';import y from'fs-extra';var K="rapidkit-blocker-resolution-v1";function z(e){let t=e.blockers.map(r=>r.trim()).filter(Boolean).slice(0,12),s=e.stderrTail?.trim().slice(-400)??"";return b$3({blockers:t,exitCode:e.exitCode??null,stderrTail:s})}function X(e){let t=e.trim().toLowerCase();return t?t.includes("missing evidence")||t.includes(": missing")||t.includes("artifact missing")||t.includes("not found on disk")?"artifact-missing":t.includes("policy.")||t.includes("contract")?"config-fixable":t.includes("impact")||t.includes("untracked")||t.includes("grounding")?"semantic-attention":t.includes("failed")||t.includes("blocked")||t.includes(": fail")?"command-failed-repeat":"config-fixable":"unresolvable-without-human"}function Q(e){let t=X(e.reason),s=z({blockers:[e.reason]}),r=t==="artifact-missing"?[{actionKind:"run-once",detail:e.sourceCommand?`Run the source command once: ${e.sourceCommand}`:"Run the mapped workspace intelligence command once to generate the missing artifact.",studioActionId:"run-analyze"}]:t==="semantic-attention"?[{actionKind:"commit-files",detail:"Review workspace-level grounding files (AGENTS.md, agent-sync outputs) and commit or refresh the impact baseline."},{actionKind:"refresh-baseline",detail:"Refresh snapshot + diff + impact before re-running verify."}]:[{actionKind:"edit-file",detail:"Apply the smallest safe file or policy fix for this blocker before re-running verification.",studioActionId:"fix-lens"}];return {schemaVersion:K,blockerId:e.blockerId,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,resolutionClass:t,blockerSignature:s,commandRetryHint:t==="artifact-missing"?"Run the source command once, then verify.":"Do not re-run the same failing command; fix the source issue first, then verify.",fixHints:r,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}}function J(e){return Array.from(new Set(e.blockingReasons.map(s=>s.trim()).filter(Boolean))).slice(0,12).map((s,r)=>Q({reason:s,blockerId:`blocker-${r+1}`,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}))}var G="workspace-verify.v1",P=".rapidkit/reports/workspace-verify-last-run.json";function Z(e,t){return d.isAbsolute(t)?t:d.join(e,t)}async function U(e$1){let t=await y.readJson(e$1);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace impact input is not a JSON object: ${e$1}`);let s=t;if(s.schemaVersion!==e)throw new Error(`Unsupported workspace impact schema: ${String(s.schemaVersion)}`);return s}function ee(e){let t=new Set,s=[];for(let r of e){let i=`${r.scope}:${r.project??""}:${r.display}`;t.has(i)||(t.add(i),s.push(r));}return s}function te(e,t){if(!e||e==="workspace")return true;let s=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return t.scope==="workspace"?true:(t.project??"").trim().toLowerCase()===s}function se(e,t){if(e.id==="workspace.doctor")return d.join(t,".rapidkit","reports","doctor-last-run.json");if(e.id==="workspace.contract.verify")return d.join(t,".rapidkit","reports","workspace-contract-verify-last-run.json");if(e.id==="workspace.readiness")return d.join(t,".rapidkit","reports","release-readiness-last-run.json");if(e.id==="workspace.analyze")return d.join(t,".rapidkit","reports","analyze-last-run.json");if(e.id==="workspace.pipeline")return d.join(t,".rapidkit","reports","pipeline-last-run.json");if(e.id==="workspace.doctor-fix")return d.join(t,".rapidkit","reports","doctor-last-run.json");if(e.id.startsWith("project.")&&e.id.includes("."))return d.join(t,".rapidkit","reports","workspace-run-last.json")}function b(e){return !e||typeof e!="object"||Array.isArray(e)?null:e}function re(e){let t=b(e.healthScore),s=typeof t?.errors=="number"?t.errors:0,r=typeof t?.percent=="number"?t.percent:void 0;return s>0?{status:"fail",message:`Doctor evidence reports ${s} error(s).`}:typeof r=="number"&&r<70?{status:"warn",message:`Doctor health score is ${r}%.`}:{status:"pass",message:"Doctor evidence is present and healthy."}}function ie(e){let t=typeof e.overallStatus=="string"?e.overallStatus:"unknown";return t==="fail"?{status:"fail",message:"Release readiness evidence reports blocking failures."}:t==="warn"?{status:"warn",message:"Release readiness evidence reports warnings."}:t==="pass"?{status:"pass",message:"Release readiness evidence passed."}:{status:"warn",message:`Release readiness evidence status is ${t}.`}}function ne(e){let t=typeof e.status=="string"?e.status:"unknown";return t==="failed"||t==="fail"?{status:"fail",message:"Workspace contract verify evidence failed."}:t==="passed"||t==="pass"?{status:"pass",message:"Workspace contract verify evidence passed."}:{status:"warn",message:`Workspace contract verify evidence status is ${t}.`}}function oe(e){let t=b(e.summary);if(t?.blocking===true||e.blocking===true)return {status:"fail",message:"Analyze evidence reports blocking findings."};let r=typeof t?.status=="string"?t.status:void 0;return r==="warn"||r==="warning"?{status:"warn",message:"Analyze evidence reports warnings."}:{status:"pass",message:"Analyze evidence is present."}}function ae(e){let t=e.fixResult;if(!t||typeof t!="object"||Array.isArray(t))return {status:"skipped",message:"Doctor fix result not present; run doctor workspace --fix --json to record fixes."};let s=t,r=Array.isArray(s.remainingBlockers)?s.remainingBlockers:[];if(r.length>0)return {status:"fail",message:`Doctor fix result reports ${r.length} remaining blocker(s).`};let i=Array.isArray(s.appliedFixes)?s.appliedFixes:[];return i.length===0?{status:"pass",message:"Doctor fix result recorded with no remaining blockers."}:{status:"pass",message:`Doctor fix result recorded ${i.length} applied fix(es) with no remaining blockers.`}}function ce(e){return e.id.endsWith(".init")?"init":e.id.endsWith(".test")?"test":e.id.endsWith(".build")?"build":e.id.endsWith(".start")?"start":null}function le(e){let t=b(e.summary),s=typeof t?.verdict=="string"?t.verdict:void 0;return s==="blocked"?{status:"fail",message:"Pipeline evidence is blocked."}:s==="needs-attention"?{status:"warn",message:"Pipeline evidence needs attention."}:s==="ready"?{status:"pass",message:"Pipeline evidence is ready."}:{status:"warn",message:"Pipeline evidence status is unknown."}}function ue(e,t,s){let r=ce(t),i=c$2(e,r??void 0);if(!i)return {status:"missing",message:"Workspace run evidence is missing or unreadable."};let n=i.stage;if(r&&n!==r)return {status:"missing",message:`Workspace run evidence is for stage "${n}", expected "${r}".`};let u=Array.isArray(i.projects)?i.projects:[],l=t.project?.toLowerCase();if(!l)return {status:"missing",message:"Project-scoped workspace run evidence is missing a project identifier."};let a=u.find(f=>{let g=b(f);if(!g)return false;let c=typeof g.projectName=="string"?g.projectName.toLowerCase():"",o=["projectPath","relativePath","path"].map(p=>g[p]).filter(p=>typeof p=="string"&&p.trim().length>0).map(p=>p.replace(/\\/g,"/").toLowerCase());return c===l||o.some(p=>p.endsWith(`/${l}`)||p===l)});if(a){let f=v(i.generatedAt,s,`Workspace run evidence for ${t.project??t.id}`);if(f)return {status:"fail",message:f};let g=b(a),c=typeof g?.status=="string"?g.status:"unknown";return c==="failed"?{status:"fail",message:`Workspace run evidence failed for ${t.project}.`}:c==="passed"?{status:"pass",message:`Workspace run evidence passed for ${t.project}.`}:c==="skipped"?{status:"warn",message:`Workspace run evidence skipped for ${t.project}.`}:{status:"warn",message:`Workspace run evidence status is ${c} for ${t.project}.`}}return {status:"missing",message:`Workspace run evidence does not include project ${t.project}.`}}function v(e,t,s){if(!t)return null;if(typeof e!="string"||e.trim().length===0)return `${s} is stale: missing generatedAt timestamp (required after impact ${t}).`;let r=Date.parse(e),i=Date.parse(t);return Number.isFinite(r)?Number.isFinite(i)&&r<i?`${s} is stale: generated at ${e}, before impact ${t}.`:null:`${s} is stale: invalid generatedAt timestamp (required after impact ${t}).`}async function pe(e,t,s,r){let i=se(e,t),n=i?d.relative(t,i).split(d.sep).join("/"):void 0;if(e.id==="workspace.contract.verify"&&!s)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"skipped",required:e.required,message:"Workspace contract is not present; contract verify skipped."};if(!i||!await y.pathExists(i))return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"missing",required:e.required,evidencePath:n,message:n?`Missing evidence report: ${n}`:"No evidence mapping exists for this command."};let u=b(await y.readJson(i));if(!u)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:n,message:"Evidence report is not a JSON object."};let l;if(e.id==="workspace.doctor"){let a=v(u.generatedAt,r,"Doctor evidence");a?l={status:"fail",message:a}:l=re(u);}else if(e.id==="workspace.readiness"){let a=v(u.generatedAt,r,"Release readiness evidence");a?l={status:"fail",message:a}:l=ie(u);}else if(e.id==="workspace.contract.verify"){let a=v(u.generatedAt,r,"Workspace contract verify evidence");a?l={status:"fail",message:a}:l=ne(u);}else if(e.id==="workspace.analyze"){let a=v(u.generatedAt,r,"Analyze evidence");a?l={status:"fail",message:a}:l=oe(u);}else if(e.id==="workspace.pipeline"){let a=v(u.generatedAt,r,"Pipeline evidence");a?l={status:"fail",message:a}:l=le(u);}else if(e.id==="workspace.doctor-fix")l=ae(u);else if(e.id.startsWith("project."))l=ue(u,e,r);else {let a=v(u.generatedAt,r,"Evidence report");a?l={status:"fail",message:a}:l={status:"pass",message:"Evidence report is present."};}return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:l.status,required:e.required,evidencePath:n,message:l.message}}function de(e,t={blockingReasons:[],needsAttention:false}){let s=e.filter(c=>c.status==="pass").length,r=e.filter(c=>c.status==="warn").length,i=e.filter(c=>c.status==="fail").length,n=e.filter(c=>c.status==="missing").length,u=e.filter(c=>c.status==="skipped").length,l=e.filter(c=>c.required&&(c.status==="fail"||c.status==="missing")).map(c=>`${c.id}: ${c.message}`),a=e.filter(c=>c.required&&c.status==="missing").length,f="ready",g=0;return l.length>0||t.blockingReasons.length>0?(f="blocked",g=2):(r>0||a>0||t.needsAttention)&&(f="needs-attention",g=1),{verdict:f,exitCode:g,stepsPassed:s,stepsWarn:r,stepsFailed:i,stepsMissing:n,stepsSkipped:u}}function fe(e,t){let s=A(e.affectedProjects.map(o=>o.project?.name).filter(o=>typeof o=="string")),r=new Set(s.map(o=>o.toLowerCase())),i=A(e.transitiveImpact.map(o=>o.project?.name).filter(o=>typeof o=="string").filter(o=>!r.has(o.toLowerCase()))),n=new Map;for(let o of t){if(o.scope!=="project"||!o.project)continue;let p=o.project.toLowerCase(),h=n.get(p)??[];h.push(o),n.set(p,h);}let u=[],l=[],a=[],f=[],g=false,c=(o,p)=>{let h=n.get(o.toLowerCase())??[];if(h.length===0){a.push(o);return}let w=h.filter(k=>k.status==="fail"),R=h.filter(k=>k.status==="missing"),C=R.filter(k=>k.required),W=h.some(k=>k.status==="pass"||k.status==="warn");if(w.length>0){l.push(o),f.push(`graph.subgraph.${o}: ${p} has failed verification evidence (${w.map(k=>k.id).join(", ")}).`);return}if(C.length>0){l.push(o),f.push(`graph.subgraph.${o}: ${p} has missing required verification evidence (${C.map(k=>k.id).join(", ")}).`);return}if(R.length>0){l.push(o),g=true;return}if(W){u.push(o);return}a.push(o);};for(let o of s)c(o,"directly-changed");for(let o of i)c(o,"transitive dependent");return {subgraph:{totalProjects:s.length+i.length,directlyChanged:s,transitiveDependents:i,covered:A(u),uncovered:A(l),unverifiable:A(a)},blockingReasons:f,needsAttention:g}}function A(e){return [...new Set(e)].sort((t,s)=>t.localeCompare(s))}async function ge(e$1){let t=d.resolve(e$1.workspacePath);if(e$1.fromImpactPath){let n=Z(t,e$1.fromImpactPath);return {impact:await U(n),fromImpactRef:d.relative(t,n).split(d.sep).join("/"),impactFromDisk:true}}let s=d.join(t,f);if(await y.pathExists(s))return {impact:await U(s),fromImpactRef:f,impactFromDisk:true};let r=d.join(t,c$1);if(await y.pathExists(r))return {impact:await n({workspacePath:t,fromPath:c$1,scope:e$1.scope,includeAbsolutePaths:e$1.includeAbsolutePaths,includeEvidence:e$1.includeEvidence,observableScanDepth:e$1.observableScanDepth,now:e$1.now}),fromImpactRef:c$1,impactFromDisk:false};let i=await j({workspacePath:t,includeAbsolutePaths:e$1.includeAbsolutePaths,includeEvidence:e$1.includeEvidence,observableScanDepth:e$1.observableScanDepth,now:e$1.now});return {impact:{schemaVersion:e,generatedAt:(e$1.now??new Date).toISOString(),fromRef:"baseline",diffRef:".rapidkit/reports/workspace-model-diff-last-run.json",workspace:{name:i.workspace.name,profile:i.workspace.profile,type:i.workspace.type},summary:{changed:false,risk:"none",affectedProjects:0,workspaceItems:0,recommendedCommands:0,blastRadius:{directlyAffected:0,transitivelyAffected:0,maxDistance:0,graphEdges:i.graph?.edges.length??0}},affectedProjects:[],transitiveImpact:[],criticalPathHotspots:[],workspaceImpact:[],verificationPlan:[],agentBrief:{headline:"Baseline workspace verify run.",bullets:["No impact report or snapshot was available; baseline gates were evaluated."],unsafeAssumptions:["Do not claim runtime verification passed unless evidence exists."]},diff:{schemaVersion:"workspace-model-diff.v1",generatedAt:(e$1.now??new Date).toISOString(),fromRef:"baseline",toRef:".rapidkit/reports/workspace-model.json",fromHash:"baseline",toHash:"baseline",summary:{changed:false,addedProjects:0,removedProjects:0,changedProjects:0,workspaceChanges:0,validationChanges:0,gitChangedFiles:0},git:{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:[],currentModel:i}},impactFromDisk:false}}function me(e,t){if(t)return e.generatedAt;let s=e.diff?.generatedAt;if(typeof s=="string"&&s.trim().length>0)return s}async function Fe(e){let t=d.resolve(e.workspacePath),{impact:s,fromImpactRef:r,impactFromDisk:i}=await ge(e),n=s.diff.currentModel,u=me(s,i),l=ee([...m(),...s.verificationPlan]).filter(m=>te(e.scope,m)),a$1=[];for(let m of l)a$1.push(await pe(m,t,n.contracts.exists===true,u));let f=fe(s,a$1),g=a(n.graph??{nodes:[],edges:[]}),c$1=b$1(n),o=await he(t),p=c(c$1,o?.freshness?.projectHashes),h={verdict:p.verdict,baseline:p.baseline,changed:p.changed,added:p.added,removed:p.removed,projectHashes:d$1(c$1)},w=b$2(g),R=n.policies?.mode??"warn",C=await ke(n,t),W=ye(R,C),k=de(a$1,{blockingReasons:[...f.blockingReasons,...w,...W.blockingReasons],needsAttention:f.needsAttention||W.needsAttention}),Y=a$1.filter(m=>m.status==="missing"&&m.evidencePath).map(m=>m.evidencePath),S=[...a$1.filter(m=>m.required&&(m.status==="fail"||m.status==="missing")).map(m=>`${m.id}: ${m.message}`),...f.blockingReasons,...w,...W.blockingReasons],I=S.length>0?J({blockingReasons:S,verifyCommand:"npx rapidkit workspace verify --from-impact .rapidkit/reports/workspace-impact-last-run.json --json",verifyArtifact:P}):[];return {schemaVersion:G,generatedAt:(e.now??new Date).toISOString(),workspacePath:t,mode:"evidence",fromImpactRef:r,scope:e.scope,impact:{changed:s.summary.changed,risk:s.summary.risk,affectedProjects:s.summary.affectedProjects,recommendedCommands:s.summary.recommendedCommands},summary:k,steps:a$1,missingEvidence:Y,blockingReasons:S,...I.length>0?{resolutionHints:I}:{},verificationPlan:l,affectedSubgraph:f.subgraph,graphIntegrity:g,freshness:h,policyMode:R,policyViolations:C}}async function ke(e,t){let s=[];for(let i of e.validation?.issues??[])s.push({source:"model",severity:i.severity,code:i.code,message:i.message,target:i.target});let r=d.join(t,".rapidkit","reports","workspace-contract-verify-last-run.json");try{if(await y.pathExists(r)){let i=await y.readJson(r);if(Array.isArray(i.violations))for(let n of i.violations)typeof n=="string"&&n.trim().length>0&&s.push({source:"contract",severity:"error",code:"contract.violation",message:n});}}catch{}return s.sort((i,n)=>i.source!==n.source?i.source.localeCompare(n.source):i.code!==n.code?i.code.localeCompare(n.code):i.message.localeCompare(n.message))}function ye(e,t){let s=t.filter(r=>r.severity==="error");return e==="enforce"&&s.length>0?{blockingReasons:s.map(r=>`policy.${r.code}: ${r.message}`),needsAttention:false}:{blockingReasons:[],needsAttention:s.length>0}}async function he(e){let t=d.join(e,P);try{if(!await y.pathExists(t))return null;let s=await y.readJson(t);return s&&s.schemaVersion===G?s:null}catch{return null}}async function _e(e,t){let s=d.join(t,P);return await y.ensureDir(d.dirname(s)),await y.writeJson(s,a$1(e),{spaces:2}),s}function ve(e,t){let s=t?.strict?"strict":"default",r=[];if(e.summary.verdict==="blocked")return r.push(...e.blockingReasons),r.length===0&&r.push("verify verdict is blocked."),{passed:false,mode:s,exitCode:2,reasons:r};if(s==="strict"){if(e.summary.verdict!=="ready"&&r.push(`verify verdict is ${e.summary.verdict} (strict requires ready).`),e.freshness.verdict==="stale"){let i=[...e.freshness.changed,...e.freshness.added].slice(0,5);r.push(`freshness is stale${i.length>0?`: ${i.join(", ")}`:""} (strict requires fresh).`);}if(r.length>0)return {passed:false,mode:s,exitCode:1,reasons:r}}return {passed:true,mode:s,exitCode:e.summary.exitCode===2?0:e.summary.exitCode,reasons:r}}function De(e,t){let s=ve(e,t);return s.passed?e.summary.verdict==="blocked"?2:t?.strict&&e.summary.verdict!=="ready"?1:e.summary.exitCode:s.exitCode}export{K as a,G as b,P as c,fe as d,Fe as e,_e as f,ve as g,De as h};
@@ -1,33 +0,0 @@
1
- import {f,e,d,a as a$1,k as k$1,g as g$1,c}from'./chunk-Z5LKRG57.js';import {a}from'./chunk-2FIX2MDC.js';import ft from'crypto';import q from'os';import u from'path';import*as p from'fs-extra';import {execa}from'execa';var mt=["version","project","create","add","list","info","upgrade","diff","doctor","license","commands","reconcile","rollback","uninstall","checkpoint","optimize","snapshot","frameworks","modules","merge"],M=new Set(mt);var g=a();function O(){let t=[],e$1=i=>{let o=i?.trim();o&&t.push(o);};e$1(process.env.RAPIDKIT_BRIDGE_PYTHON),e$1(process.env.RAPIDKIT_PYTHON_CMD),e$1(process.env.POETRY_PYTHON);let r=_();(r.startsWith("/")||r.startsWith(".")||r.startsWith(".."))&&!r.startsWith("file:")&&e$1(f(u.join(u.resolve(r),".venv")));for(let i of e())i.args.length===1&&i.args[0]==="--version"&&e$1(i.command);for(let i of d())e$1(i);return [...new Set(t)]}function v(t,e){return t==="py"?["-3",...e]:e}function J(t){if(!t)return t;let e=["Installed Poetry version does not support '--no-update'. Falling back to 'poetry lock'."];return t.split(/\r?\n/).filter(i=>!e.some(o=>i.includes(o))).join(`
2
- `)}var w=class extends Error{code;constructor(e,r){super(r),this.code=e;}};function S(t){if(t instanceof w)switch(t.code){case "PYTHON_NOT_FOUND":return `RapidKit (npm) could not find Python (python3/python/py) on your PATH.
3
- Install Python 3.10+ and ensure \`${c()}\` is available, then retry.
4
- Tip: if you are inside a RapidKit project, use the local ./rapidkit launcher.`;case "BRIDGE_VENV_CREATE_FAILED":return `RapidKit (npm) failed to create its bridge virtual environment.
5
- `+(a$1()?`Ensure Python is installed with venv support.
6
- `:`Ensure Python venv support is installed (e.g., python3-venv).
7
- `)+`Details: ${t.message}`;case "BRIDGE_PIP_BOOTSTRAP_FAILED":return `RapidKit (npm) could not bootstrap pip inside the bridge virtual environment.
8
- `+(a$1()?`Ensure pip is available for your Python installation and retry.
9
- `:`Install python3-venv/python3-pip and retry.
10
- `)+`Details: ${t.message}`;case "BRIDGE_PIP_UPGRADE_FAILED":return `RapidKit (npm) could not upgrade pip in the bridge virtual environment.
11
- Check your network/proxy or disable RAPIDKIT_BRIDGE_UPGRADE_PIP.
12
- Details: ${t.message}`;case "BRIDGE_PIP_INSTALL_FAILED":return `RapidKit (npm) could not install rapidkit-core in the bridge virtual environment.
13
- Check your network/proxy, or install manually with: pipx install rapidkit-core.
14
- Details: ${t.message}`;default:return `RapidKit (npm) bridge error: ${t.message}`}return `RapidKit (npm) failed to run the Python core engine: ${t instanceof Error?t.message:String(t)}`}function _(){let t=process.env.RAPIDKIT_CORE_PYTHON_PACKAGE;return t&&t.trim()?t.trim():"rapidkit-core"}function ht(){let t=_(),e=process.env.RAPIDKIT_CORE_PYTHON_PACKAGE_ID,r=e&&e.trim()?`${t}|${e.trim()}`:t;return ft.createHash("sha256").update(r).digest("hex").slice(0,12)}function j(){let t=process.env.XDG_CACHE_HOME;return t&&t.trim()?t:u.join(q.homedir(),".cache")}function gt(){return u.join(j(),"rapidkit","npm-bridge","venv")}function Q(){let t=ht();return u.join(j(),"rapidkit","npm-bridge",`venv-${t}`)}function H(t){return f(t)}function U(t){return g$1(t)}async function tt(t=process.platform,e=process.env){let r=a$1(t)?["rapidkit.exe","rapidkit.cmd"]:["rapidkit"],n=k$1(e,t).flatMap(i=>r.map(o=>u.join(i,o)));for(let i of [...new Set(n)])try{if(!await p.pathExists(i))continue;let o=await execa(i,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(o.exitCode===0&&await D(o.stdout))return {cmd:i,baseArgs:[]}}catch{}return null}function et(t){return /[<>=!~]=|@|\.whl$|\.tar\.gz$|\.zip$|git\+|https?:\/\//.test(t)}function yt(t){return u.dirname(u.dirname(t))}function nt(){return u.join(j(),"rapidkit","npm-bridge","core-commands.json")}async function rt(t){let e=!!process.env.RAPIDKIT_DEBUG,r=n=>{e&&process.stderr.write(`[DEBUG] tryRapidkit(${t}): ${n}
15
- `);};try{r("probing interpreter-specific rapidkit script");let i=((await execa(t,v(t,["-c","import sysconfig, os; print(os.path.join(sysconfig.get_path('scripts'), 'rapidkit'))"]),{reject:false,stdio:"pipe",timeout:2e3})).stdout??"").toString().trim();if(r(`script path: ${i}`),i)try{if(await p.pathExists(i)){r(`found script at ${i}; invoking --version --json`);let o=await execa(i,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(r(`script exitCode=${o.exitCode}`),o.exitCode===0){let a=(o.stdout??"").toString().trim();try{let s=JSON.parse(a),c=!!s&&typeof s=="object"&&s!==null&&"version"in s;if(r(`script JSON parse ok=${c}`),c)return true}catch{r("script output not valid JSON");}}}}catch(o){r(`interpreter-specific script probe failed: ${String(o)}`);}}catch(n){r(`interpreter-specific script probe error: ${String(n)}`);}try{r('probing importlib.find_spec("rapidkit")');let n=await execa(t,v(t,["-c","import importlib.util; print(1 if importlib.util.find_spec('rapidkit') else 0)"]),{reject:false,stdio:"pipe",timeout:2e3});if(r(`import probe exitCode=${n.exitCode} stdout=${(n.stdout??"").toString().trim()}`),n.exitCode===0&&(n.stdout??"").toString().trim()==="1")return true}catch(n){r(`import probe error: ${String(n)}`);}try{r("probing python -m rapidkit");let n=await execa(t,v(t,["-m","rapidkit","--version","--json"]),{reject:false,stdio:"pipe",timeout:8e3});if(r(`-m probe exitCode=${n.exitCode}`),n.exitCode===0)return true}catch(n){r(`-m probe error: ${String(n)}`);}try{r("probing PATH for rapidkit executables");let n=(process.env.PATH??"").split(u.delimiter).filter(Boolean);for(let i of n){let o=u.join(i,a$1()?"rapidkit.exe":"rapidkit");try{if(await p.pathExists(o)){r(`found candidate on PATH: ${o}; invoking --version --json`);let a=await execa(o,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(r(`candidate exitCode=${a.exitCode}`),a.exitCode===0){let s=(a.stdout??"").toString().trim();try{let c=JSON.parse(s);if(c&&typeof c=="object"&&c!==null&&"version"in c)return true}catch{r("candidate output not valid JSON, skipping");}}}}catch(a){r(`error probing candidate ${o}: ${String(a)}`);}}return r("no valid rapidkit found on PATH"),false}catch(n){return r(`PATH probe error: ${String(n)}`),false}}async function D(t){let e=(t??"").toString().trim();if(!e)return false;try{let r=JSON.parse(e);return !!r&&typeof r=="object"&&r!==null&&"version"in r}catch{return false}}async function it(t,e=process.platform){let r=async o=>{try{let a=u.join(o,".rapidkit-workspace");if(!await p.pathExists(a))return null;let c=(await p.readJson(a))?.metadata?.python?.venvPath;return typeof c!="string"||!c.trim()?null:u.isAbsolute(c)?c:u.join(o,c)}catch{return null}},n=async(o,a)=>{let s=g$1(a,e);if(await p.pathExists(s)){let l=await execa(s,["--version","--json"],{reject:false,stdio:"pipe",timeout:1500,cwd:o});if(l.exitCode===0&&await D(l.stdout))return {cmd:s,baseArgs:[],workspaceDir:o}}let c=f(a,e);if(await p.pathExists(c)){let l=await execa(c,["-m","rapidkit","--version","--json"],{reject:false,stdio:"pipe",timeout:1500,cwd:o});if(l.exitCode===0&&await D(l.stdout))return {cmd:c,baseArgs:["-m","rapidkit"],workspaceDir:o}}return null},i=t;for(let o=0;o<25;o+=1){let a=await r(i),s=[u.join(i,".venv"),a].filter(l=>!!l);for(let l of [...new Set(s)]){let P=await n(i,l);if(P)return P}let c=u.dirname(i);if(c===i)break;i=c;}return null}async function wt(t){try{let e=u.join(t,".python-version");if(await p.pathExists(e)){let n=(await p.readFile(e,"utf-8")).trim();if(n)return n}}catch{}try{let e=u.join(t,".rapidkit-workspace");if(await p.pathExists(e)){let r=await p.readJson(e);if(typeof r?.pythonVersion=="string"&&r.pythonVersion.trim())return r.pythonVersion.trim();let n=r?.metadata?.python?.pythonVersion;if(typeof n=="string"&&n.trim())return n.trim()}}catch{}return null}async function F(t){if(t&&t.trim())try{let a=await it(t);if(a){let s=a.workspaceDir??(u.dirname(a.cmd).includes(".venv")?u.dirname(u.dirname(u.dirname(a.cmd))):u.dirname(a.cmd)),c=await wt(s);return c&&(process.env.PYENV_VERSION=c),a}}catch{}let e=await xt();if(e.kind==="venv"){let a=yt(e.pythonPath),s=U(a);return await p.pathExists(s)?{cmd:s,baseArgs:[]}:{cmd:e.pythonPath,baseArgs:["-m","rapidkit"]}}try{if((await execa(e.cmd,["-m","rapidkit","--version","--json"],{reject:false,stdio:"pipe",timeout:4e3})).exitCode===0)return {cmd:e.cmd,baseArgs:["-m","rapidkit"]}}catch{}try{let s=((await execa(e.cmd,["-c","import sysconfig, os; print(os.path.join(sysconfig.get_path('scripts'), 'rapidkit'))"],{reject:false,stdio:"pipe",timeout:2e3})).stdout??"").toString().trim();if(s&&await p.pathExists(s))try{let c=await execa(s,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(c.exitCode===0&&await D(c.stdout))return {cmd:s,baseArgs:[]}}catch{}}catch{}let r=await tt();if(r)return r;let n=Q(),i=await N(e.cmd),o=U(n);return await p.pathExists(o)?{cmd:o,baseArgs:[]}:{cmd:i,baseArgs:["-m","rapidkit"]}}async function ot(){for(let t of O())try{return await execa(t,v(t,["--version"]),{reject:false,stdio:"pipe",timeout:2e3}),t}catch{}return null}async function B(){let t=null;for(let e of O()){try{await execa(e,v(e,["--version"]),{reject:false,stdio:"pipe",timeout:2e3});}catch(r){t=r;continue}try{return await N(e)}catch(r){t=r;continue}}throw t instanceof w?t:t instanceof Error?new w("BRIDGE_VENV_BOOTSTRAP_FAILED",t.message):new w("PYTHON_NOT_FOUND","No Python interpreter found (python3/python/py).")}async function vt(){let t=!!process.env.RAPIDKIT_DEBUG,e$1=n=>{t&&process.stderr.write(`[DEBUG] checkRapidkitCore: ${n}
16
- `);},r=Array.from(new Set([...d(),...e(14,10).map(n=>n.command)]));for(let n of r)try{e$1(`Method 1: trying ${n} import`);let i=await execa(n,v(n,["-c","import rapidkit_core; print(1)"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.trim()==="1")return e$1(`\u2713 Found via ${n} import`),true}catch{continue}for(let n of r)try{e$1(`Method 2: trying ${n} -m pip show`);let i=await execa(n,v(n,["-m","pip","show","rapidkit-core"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.includes("Name: rapidkit-core"))return e$1(`\u2713 Found via ${n} -m pip show`),true}catch{continue}for(let n of ["pip","pip3"])try{e$1(`Method 3: trying ${n} show`);let i=await execa(n,["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.includes("Name: rapidkit-core"))return e$1(`\u2713 Found via ${n} show`),true}catch{continue}try{e$1("Method 4: checking pyenv versions");let n=await execa("pyenv",["versions","--bare"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0&&n.stdout){let i=n.stdout.split(`
17
- `).filter(o=>o.trim());e$1(`Found pyenv versions: ${i.join(", ")}`);for(let o of i){let a=process.env.PYENV_ROOT||u.join(q.homedir(),".pyenv"),s=u.join(a,"versions",o.trim(),"bin","pip");try{let c=await execa(s,["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(c.exitCode===0&&c.stdout?.includes("Name: rapidkit-core"))return e$1(`\u2713 Found in pyenv ${o}`),true}catch{try{let c=await execa("pyenv",["exec","pip","show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g,env:{...process.env,PYENV_VERSION:o.trim()}});if(c.exitCode===0&&c.stdout?.includes("Name: rapidkit-core"))return e$1(`\u2713 Found in pyenv ${o} via PYENV_VERSION`),true}catch{continue}}}}}catch{e$1("pyenv not available");}for(let n of r)try{e$1(`Method 5: checking ${n} user site`);let i=await execa(n,v(n,["-m","site","--user-site"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout){let o=i.stdout.trim(),a=u.join(o,"rapidkit_core");if(await p.pathExists(a))return e$1("\u2713 Found in user site-packages"),true}}catch{continue}try{e$1("Method 6: checking pipx");let n=await execa("pipx",["list"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0&&n.stdout?.includes("rapidkit-core"))return e$1("\u2713 Found via pipx"),true}catch{e$1("pipx not available");}for(let n of r)try{e$1(`Method 6: checking ${n} -m pipx list`);let i=await execa(n,v(n,["-m","pipx","list"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.includes("rapidkit-core"))return e$1(`\u2713 Found via ${n} -m pipx list`),true}catch{continue}try{if(e$1("Method 7: checking poetry"),(await execa("poetry",["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g})).exitCode===0)return e$1("\u2713 Found via poetry"),true}catch{e$1("poetry check failed");}for(let n of r)try{if(e$1(`Method 7: checking ${n} -m poetry show rapidkit-core`),(await execa(n,v(n,["-m","poetry","show","rapidkit-core"]),{reject:false,stdio:"pipe",timeout:g})).exitCode===0)return e$1(`\u2713 Found via ${n} -m poetry`),true}catch{continue}try{e$1("Method 8: checking conda");let n=await execa("conda",["list","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0&&n.stdout?.includes("rapidkit-core"))return e$1("\u2713 Found via conda"),true}catch{e$1("conda not available");}return e$1("\u2717 Not found in any environment"),false}function Pt(t){let e=t.trim();if(!e||!e.startsWith("rapidkit-core"))return null;let r=e.slice(13).trim();return !r||/[\/@]|\.whl$|\.tar\.gz$|\.zip$|git\+|https?:\/\//.test(r)?null:r}function Y(t){let e=t.trim();if(!e)return null;let r=e.split("."),n=[];for(let i of r){let o=i.match(/^(\d+)/);if(!o){n.push(0);continue}n.push(Number.parseInt(o[1],10));}return n}function W(t,e){let r=Math.max(t.length,e.length);for(let n=0;n<r;n+=1){let i=n<t.length?t[n]:0,o=n<e.length?e[n]:0;if(i>o)return 1;if(i<o)return -1}return 0}function Ct(t){return t.length<=1?[t[0]+1]:t.length===2?[t[0]+1,0]:[t[0],t[1]+1,0]}function Et(t){let e=t.split(",").map(n=>n.trim()).filter(Boolean);if(e.length===0)return null;let r=[];for(let n of e){let i=n.match(/^(==|>=|<=|>|<|~=)\s*([0-9][0-9A-Za-z+._-]*)$/);if(!i)return null;r.push({op:i[1],version:i[2]});}return r}function st(t,e){let r=Y(t);if(!r)return false;let n=Et(e);if(!n)return false;for(let i of n){let o=Y(i.version);if(!o)return false;let a=W(r,o);if(i.op==="=="&&a!==0||i.op===">="&&a<0||i.op==="<="&&a>0||i.op===">"&&a<=0||i.op==="<"&&a>=0)return false;if(i.op==="~="){if(a<0)return false;let s=Ct(o);if(W(r,s)>=0)return false}}return true}async function _t(){let t=Array.from(new Set([...d(),...e(14,10).map(r=>r.command)])),e$1=r=>{let n=r.match(/^Version:\s*(.+)$/m);return n?n[1].trim():null};for(let r of t)try{let n=await execa(r,v(r,["-m","pip","show","rapidkit-core"]),{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0){let i=e$1(n.stdout||"");if(i)return i}}catch{continue}for(let r of ["pip","pip3"])try{let n=await execa(r,["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0){let i=e$1(n.stdout||"");if(i)return i}}catch{continue}try{let r=await execa("pipx",["list"],{reject:false,stdio:"pipe",timeout:g});if(r.exitCode===0&&r.stdout){let n=r.stdout.match(/rapidkit-core\s+([0-9][0-9A-Za-z+._-]*)/i);if(n?.[1])return n[1]}}catch{}return null}async function kt(){let t=_(),e=Pt(t);if(!e)return {isCompatible:false,installedVersion:null,expectedConstraint:null,reason:et(t)?"constraint-unsupported":"constraint-missing"};let r=await _t();if(!r)return {isCompatible:false,installedVersion:null,expectedConstraint:e,reason:"version-not-detected"};let n=st(r,e);return {isCompatible:n,installedVersion:r,expectedConstraint:e,reason:n?"compatible":"incompatible-version"}}async function N(t){let e=Q(),r=gt(),n=_(),i=[e];!et(n)&&!await p.pathExists(e)&&await p.pathExists(r)&&i.push(r);for(let m of i){let h=H(m);if(await p.pathExists(h))try{let f=await execa(h,["-c","import importlib.util; print(1 if importlib.util.find_spec('rapidkit') else 0)"],{reject:false,stdio:"pipe",timeout:2e3});if(f.exitCode===0&&(f.stdout??"").toString().trim()==="1")return h;await p.remove(m);}catch{await p.remove(m);}}let o=e,a={...process.env,PIP_DISABLE_PIP_VERSION_CHECK:"1",PIP_NO_PYTHON_VERSION_WARNING:"1"},s=Math.max(0,Number(process.env.RAPIDKIT_BRIDGE_PIP_RETRY??"2")),c=Math.max(200,Number(process.env.RAPIDKIT_BRIDGE_PIP_RETRY_DELAY_MS??"800")),l=Math.max(1e4,Number(process.env.RAPIDKIT_BRIDGE_PIP_TIMEOUT_MS??"120000")),P=m=>new Promise(h=>setTimeout(h,m)),C=async(m,h,f)=>{let y=await execa(m,h,{reject:false,stdio:["ignore","pipe","inherit"],env:a,timeout:f});if(y.exitCode===0)return;let T=(y.stdout??"").toString(),$=(y.stderr??"").toString(),R=[T,$].filter(Boolean).join(`
18
- `),pt=R?`${m} ${h.join(" ")}
19
- ${R}`:`${m} ${h.join(" ")}`;throw new Error(pt)},x=async(m,h,f)=>{let y=0;for(;;)try{await C(m,h,f);return}catch(T){if(y>=s)throw T;let $=Math.floor(Math.random()*200),R=c*Math.pow(2,y)+$;y+=1,await P(R);}};try{await p.ensureDir(u.dirname(o));try{await C(t,v(t,["-m","venv",o]),6e4);}catch(f){let y=f instanceof Error?f.message:String(f);throw new w("BRIDGE_VENV_CREATE_FAILED",y)}let m=H(o);if((await execa(m,["-m","pip","--version"],{reject:false,stdio:"pipe",timeout:2e3})).exitCode!==0&&(await execa(m,["-m","ensurepip","--default-pip"],{reject:false,stdio:["ignore","pipe","inherit"],env:a,timeout:6e4})).exitCode!==0)throw new w("BRIDGE_PIP_BOOTSTRAP_FAILED","ensurepip failed; install python3-venv/python3-pip and retry.");if(process.env.RAPIDKIT_BRIDGE_UPGRADE_PIP==="1")try{await x(m,["-m","pip","install","-U","pip"],l);}catch(f){let y=f instanceof Error?f.message:String(f);throw new w("BRIDGE_PIP_UPGRADE_FAILED",y)}try{await x(m,["-m","pip","install","-U",_()],l);}catch(f){let y=f instanceof Error?f.message:String(f);throw new w("BRIDGE_PIP_INSTALL_FAILED",y)}return m}catch(m){if(m instanceof w)throw m;let h=m instanceof Error?m.message:String(m);throw new w("BRIDGE_VENV_BOOTSTRAP_FAILED",h)}}async function xt(){if(process.env.RAPIDKIT_BRIDGE_FORCE_VENV==="1")return {kind:"venv",pythonPath:await B()};for(let r of O())if(await rt(r))return {kind:"system",cmd:r};let t=await ot();if(!t)throw new w("PYTHON_NOT_FOUND","No Python interpreter found (python3/python/py).");let e;try{e=await N(t);}catch{e=await B();}return {kind:"venv",pythonPath:e}}async function Bt(t,e){try{let r=await F(e?.cwd),n=r.cmd,i=[...r.baseArgs,...t];if(t[0]==="init"){let s=await execa(n,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"pipe"}),c=J((s.stdout??"").toString()),l=J((s.stderr??"").toString());return c&&process.stdout.write(c.endsWith(`
20
- `)?c:`${c}
21
- `),l&&process.stderr.write(l.endsWith(`
22
- `)?l:`${l}
23
- `),typeof s.exitCode=="number"?s.exitCode:1}let a=await execa(n,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"inherit"});return typeof a.exitCode=="number"?a.exitCode:1}catch(r){return process.stderr.write(`${S(r)}
24
- `),1}}var Rt=[{pattern:/RapidKitError:\s*Directory '([^']+)' exists and force is not set/,message:t=>`\u274C Directory "${u.basename(t[1])}" already exists.
25
- \u{1F4A1} Choose a different name, or remove the existing directory first:
26
- rm -rf ${t[1]}`},{pattern:/RapidKitError:\s*Project name '([^']+)' is (invalid|not allowed)/i,message:t=>`\u274C Invalid project name: "${t[1]}"
27
- \u{1F4A1} Use lowercase letters, numbers, and hyphens only (e.g. my-api).`},{pattern:/RapidKitError:\s*Kit '([^']+)' not found/i,message:t=>`\u274C Unknown kit: "${t[1]}"
28
- \u{1F4A1} Run "npx rapidkit list" to see available kits.`},{pattern:/RapidKitError:\s*(.+)/,message:t=>`\u274C ${t[1].trim()}`}];async function Ft(t,e){let{spawn:r}=await import('child_process');try{let n=await F(e?.cwd),i=n.cmd,o=[...n.baseArgs,...t];return await new Promise(a=>{let s=r(i,o,{cwd:e?.cwd,env:{...process.env,...e?.env},stdio:["inherit","inherit","pipe"]}),c=[];s.stderr?.on("data",l=>{c.push(l);}),s.on("close",l=>{let P=l??1;if(P!==0&&c.length>0){let C=Buffer.concat(c).toString("utf8");for(let{pattern:x,message:m}of Rt){let h=C.match(x);if(h){process.stderr.write(m(h)+`
29
- `),a(P);return}}process.stderr.write(C);}a(P);}),s.on("error",l=>{process.stderr.write(`${S(l)}
30
- `),a(1);});})}catch(n){return process.stderr.write(`${S(n)}
31
- `),1}}async function k(t,e){try{let r=await F(e?.cwd),n=r.cmd,i=[...r.baseArgs,...t],o=await execa(n,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"pipe"});return {exitCode:typeof o.exitCode=="number"?o.exitCode:1,stdout:(o.stdout??"").toString(),stderr:(o.stderr??"").toString()}}catch(r){return {exitCode:1,stdout:"",stderr:`${S(r)}
32
- `}}}function at(t){let e=new Set,r=t.split(`
33
- `),n=false;for(let i of r){let o=i.replace(/\r$/,"");if(!n){/^\s*Commands:\s*$/i.test(o)&&(n=true);let c=o.match(/^\s*rapidkit\s+([a-z0-9_-]+)\b/i);if(c){let l=c[1].trim();l&&!l.startsWith("-")&&e.add(l);}continue}if(!o.trim())break;if(/^\s*(Options|Arguments|Usage|Commands)\s*:/i.test(o))continue;let a=o.match(/^\s*([a-z0-9][a-z0-9_-]*)\b/i);if(!a)continue;let s=a[1].trim();s&&!s.startsWith("-")&&e.add(s);}return e}async function ct(){let t=nt();if(!await p.pathExists(t))return null;try{let e=await p.readJson(t);if(e&&e.schema_version===1&&Array.isArray(e.commands))return e}catch{}return null}async function z(t){let e=nt();await p.ensureDir(u.dirname(e)),await p.writeJson(e,t,{spaces:2});}async function bt(){let t=await k(["version","--json"],{cwd:process.cwd()});if(t.exitCode===0)try{let r=JSON.parse(t.stdout)?.version;return typeof r=="string"?r:void 0}catch{return}}async function At(){let t=await k(["commands","--json"],{cwd:process.cwd()});if(t.exitCode!==0)return null;try{let e=JSON.parse(t.stdout);if(e?.schema_version!==1||!Array.isArray(e.commands))return null;let r=e.commands.filter(n=>typeof n=="string");return r.length?r:null}catch{return null}}async function Gt(){let e=Date.now(),r=await ct(),n=await bt(),i=!!r?.commands?.length;if(i&&e-r.fetched_at<864e5&&(!n||!r.rapidkit_version||r.rapidkit_version===n))return new Set(r.commands);let o=await At();if(o?.length){let l=Array.from(new Set(o)).sort();return await z({schema_version:1,fetched_at:e,rapidkit_version:n,commands:l}),new Set(l)}let a=await k(["--help"],{cwd:process.cwd()});if(a.exitCode!==0)return i&&r?.commands?new Set(r.commands):new Set(M);let s=at(a.stdout);if(s.size===0)return new Set(M);let c=Array.from(s).sort();return await z({schema_version:1,fetched_at:e,rapidkit_version:n,commands:c}),s}async function Lt(){let e=Date.now(),r=await ct();return !r||e-r.fetched_at>=864e5||!r.commands?.length?null:new Set(r.commands)}function dt(){return u.join(j(),"rapidkit","npm-bridge","modules-catalog.json")}async function It(){let t=dt();if(!await p.pathExists(t))return null;try{let e=await p.readJson(t);if(e&&e.schema_version===1&&Array.isArray(e.modules))return e}catch{}return null}async function Z(t){let e=dt();await p.ensureDir(u.dirname(e)),await p.writeJson(e,t,{spaces:2});}function X(t){try{return JSON.parse(t)}catch{return null}}async function Kt(t={}){let e=typeof t.ttlMs=="number"?t.ttlMs:18e5,r=Date.now(),n=await It();if(n?.fetched_at&&r-n.fetched_at<e)return n;let i=["modules","list","--json-schema","1"];t.category&&i.push("--category",t.category),t.tag&&i.push("--tag",t.tag),t.detailed&&i.push("--detailed");let o=await k(i,{cwd:t.cwd,env:t.env});if(o.exitCode===0){let s=X(o.stdout);if(s&&s.schema_version===1&&Array.isArray(s.modules)){let c={...s,fetched_at:r};return await Z(c),c}}let a=await k(["modules","list","--json"],{cwd:t.cwd,env:t.env});if(a.exitCode===0){let s=X(a.stdout);if(Array.isArray(s)){let c={schema_version:1,generated_at:new Date().toISOString(),filters:{category:t.category??null,tag:t.tag??null,detailed:!!t.detailed},stats:{total:s.length,returned:s.length,invalid:0},modules:s,source:"legacy-json",fetched_at:r};return await Z(c),c}}return n||null}var Jt={pythonCommandCandidates:O,pickSystemPython:ot,ensureBridgeVenv:N,ensureBridgeVenvFromCandidates:B,parseCoreCommandsFromHelp:at,tryRapidkit:rt,findUserLocalRapidkitRunner:tt,findWorkspaceRunner:it,checkRapidkitCoreAvailable:vt,checkRapidkitCoreVersionCompatible:kt,isVersionSatisfyingConstraint:st};export{M as a,vt as b,kt as c,xt as d,Bt as e,Ft as f,k as g,Gt as h,Lt as i,Kt as j,Jt as k};
@@ -1,13 +0,0 @@
1
- import {a as a$1}from'./chunk-JEI6BTZI.js';import {c}from'./chunk-FVCZGUVX.js';import {f}from'./chunk-AT3EQ2S7.js';import {a}from'./chunk-424B73UF.js';import {c as c$1}from'./chunk-RIZCWYRR.js';import {j}from'./chunk-QN2LPLHO.js';import {j as j$1,a as a$2}from'./chunk-DMUEGR36.js';import h from'path';import $ from'fs-extra';async function P(e){try{return await $.pathExists(e)?await $.readJson(e):null}catch{return null}}function _(e,r){if(!e)return null;let n=r.trim().toLowerCase();return e.projects.find(s=>s.slug.toLowerCase()===n||s.relativePath.toLowerCase()===n)??null}function D(e,r,n){let s=n.trim().toLowerCase(),t=(e.graph?.nodes.map(i=>i.id)??e.projects.map(i=>i.name)).find(i=>i.toLowerCase()===s);if(t)return t;let m=e.projects.find(i=>[i.name,i.path,h.basename(i.path)].filter(u=>u.trim().length>0).some(u=>u.toLowerCase()===s));if(m)return m.name;let l=_(r,n);if(l){let i=e.projects.find(u=>u.path===l.relativePath||u.path.endsWith(`/${l.relativePath}`));if(i)return i.name}return n}function N(e,r){if(!e)return [];let n=r.trim().toLowerCase(),s=new Set;for(let d of e.projects){d.contracts.dependsOn?.some(t=>t.toLowerCase()===n)&&s.add(d.slug);for(let t of d.contracts.consumes??[])for(let m of e.projects)m.contracts.publishes?.includes(t)&&m.slug===n&&s.add(d.slug);}return [...s].sort()}function V(e,r){if(!e)return [];let n=r.trim().toLowerCase();return e.steps.filter(s=>s.scope==="project"&&s.project?.toLowerCase()===n&&s.command?.display).map(s=>s.command.display).slice(0,8)}function p(e,r,n){return {id:e,title:r,body:n.trim()}}async function Z(e){let r=h.resolve(e.workspacePath),n=(e.now??new Date).toISOString(),s=e.model??await j({workspacePath:r,includeEvidence:true}),d=e.contract;if(d===void 0)try{d=(await j$1({workspacePath:r})).contract;}catch{d=null;}let t=e.verify;t===void 0&&(t=await P(h.join(r,c)));let m=e.impact;if(m===void 0&&(m=await P(h.join(r,f))),e.target.kind==="release-blocked"){let o=t?.blockingReasons??[],c=[p("verdict","Release verdict",t?`Verdict: **${t.summary.verdict}** (exit ${t.summary.exitCode}). Risk: **${t.impact.risk}**. Freshness: **${t.freshness.verdict}**.`:"No workspace verify report found. Run `npx rapidkit workspace verify --json --write` first."),p("blockers","Blocking reasons",o.length?o.map(a=>`- ${a}`).join(`
2
- `):"No blocking reasons in the latest verify report.")];return t?.resolutionHints?.length&&c.push(p("resolution","Resolution hints",t.resolutionHints.map(a=>`- **${a.blockerId}** (${a.resolutionClass}): ${a.commandRetryHint??a.fixHints[0]?.detail??"See fix hints"}`).join(`
3
- `))),{schemaVersion:a,generatedAt:n,workspacePath:r,target:e.target,summary:t?`Release blocked: ${t.summary.verdict} with ${o.length} blocking reason(s).`:"Release posture unknown \u2014 verify report missing.",sections:c,releaseRisk:t?.impact.risk,blockingReasons:o,resolutionHints:t?.resolutionHints}}if(e.target.kind==="blocker"){let o=e.target,c=t?.resolutionHints?.find(k=>k.blockerId===o.blockerId),a$1=t?.blockingReasons.find(k=>k.includes(o.blockerId))??t?.blockingReasons[0];return {schemaVersion:a,generatedAt:n,workspacePath:r,target:o,summary:c?`Blocker ${o.blockerId}: ${c.resolutionClass}`:`Blocker ${o.blockerId} (no structured hint)`,sections:[p("reason","Blocking signal",a$1??"No matching blocking reason in verify."),p("hint","Resolution class",c?`${c.resolutionClass}
4
-
5
- ${c.commandRetryHint??""}
6
-
7
- ${c.fixHints.map(k=>`- ${k.detail}`).join(`
8
- `)}`:"Run workspace verify to emit resolutionHints for this blocker.")],blockingReasons:a$1?[a$1]:[],resolutionHints:c?[c]:[]}}if(e.target.kind==="trace"){let o=h.isAbsolute(e.target.diffRef)?e.target.diffRef:h.join(r,e.target.diffRef),c=await P(o),a$1=c?.summary?.changedProjects??[...new Set((c?.changes??[]).map(f=>f.project).filter(Boolean))],k=m?.transitiveImpact?.map(f=>`${f.project?.name??f.target} (d${f.distance??0}, via ${f.via??"\u2014"})`)??[],y=t?.affectedSubgraph;return {schemaVersion:a,generatedAt:n,workspacePath:r,target:e.target,summary:a$1?.length?`Trace from ${a$1.length} changed project(s) through blast radius to gate coverage.`:"Trace: diff baseline missing or empty.",sections:[p("origin","Change origin",a$1?.length?a$1.map(f=>`- ${f}`).join(`
9
- `):"No changed projects in diff."),p("blast-radius","Transitive impact",k.length?k.map(f=>`- ${f}`).join(`
10
- `):"No transitive impact report."),p("gate","Subgraph gate",y?`Directly changed: ${y.directlyChanged}; transitive dependents: ${y.transitiveDependents}; covered: ${y.covered}; uncovered: ${y.uncovered}; unverifiable: ${y.unverifiable}.`:"No verify subgraph coverage available.")],releaseRisk:m?.summary?.risk??t?.impact.risk,blockingReasons:t?.blockingReasons}}let l=e.target.project,i=D(s,d,l),u=s.graph,g=u?a$1(u,i):{found:false,centrality:null,directDependents:[],transitiveDependents:[]},j$2=_(d,l),R=N(d,l),C=V(t,l),v=s.projects.find(o=>o.name.toLowerCase()===l.toLowerCase()),W=[p("overview","Project overview",v?`${v.name} (${v.frameworkDisplayName}, ${v.runtime}) at \`${v.path}\`.`:`Project **${l}** ${g.found?"exists in graph":"not found in workspace model"}.`),p("consumers","Consumers / dependents",[`Direct dependents: ${g.directDependents.join(", ")||"none"}`,`Contract consumers: ${R.join(", ")||"none"}`,`Transitive dependents (blast radius): ${g.transitiveDependents.length}`].join(`
11
- `)),p("contracts","Critical contracts",j$2?[`Owns: ${j$2.contracts.owns.join(", ")||"none"}`,`Publishes: ${j$2.contracts.publishes.join(", ")||"none"}`,`Consumes: ${j$2.contracts.consumes.join(", ")||"none"}`,`APIs: ${j$2.contracts.apis.map(o=>o.name).join(", ")||"none"}`].join(`
12
- `):"No workspace.contract.json entry for this project."),p("verification","Required verification",C.length?C.map(o=>`- ${o}`).join(`
13
- `):"- `npx rapidkit workspace verify --json`\n- Project test/build via `workspace run` when configured")];g.centrality&&W.push(p("centrality","Graph centrality",`fanIn ${g.centrality.fanIn}, fanOut ${g.centrality.fanOut}, reach ${g.centrality.reach}, hotspot ${g.centrality.isHotspot?"yes":"no"}.`));let E=l.trim().toLowerCase(),x=o=>o.project?.name?.toLowerCase()===E||o.target.toLowerCase()===E,I=m?.affectedProjects?.find(x)?.risk??m?.transitiveImpact?.find(x)?.risk??t?.impact.risk??"unknown";return {schemaVersion:a,generatedAt:n,workspacePath:r,target:e.target,summary:`${l}: ${R.length} consumer(s), release risk **${I}**.`,sections:W,releaseRisk:String(I)}}async function ee(e,r){let n=h.join(r,c$1);return await $.ensureDir(h.dirname(n)),await $.writeJson(n,a$2(e),{spaces:2}),c$1}export{Z as a,ee as b};
@@ -1 +0,0 @@
1
- import {a as a$4,q as q$2,k}from'./chunk-YBS2HGO3.js';import {i,h}from'./chunk-UZW5QFRW.js';import {a as a$3,j as j$2,b}from'./chunk-DMUEGR36.js';import {r,j,q as q$1}from'./chunk-ZQRFVFKK.js';import {a}from'./chunk-RV6HBTFC.js';import {a as a$2}from'./chunk-VKLL63TL.js';import {a as a$1}from'./chunk-HHJAANUC.js';import m from'path';import j$1 from'fs-extra';import Ze from'crypto';import {createRequire}from'module';var Ue=new Set(["service","frontend","worker","library","infra","docs","test-suite","unknown"]);async function Ce(e){try{if(!await j$1.pathExists(e))return null;let t=await j$1.readJSON(e);return t&&typeof t=="object"?t:null}catch{return null}}function Se(e){if(typeof e!="string")return null;let t=e.trim().toLowerCase();return Ue.has(t)?t:null}async function We(e,t){let n=t??await Ce(m.join(e,".rapidkit","project.json")),s=Se(n?.kind)??Se(n?.type);if(s)return s;let o=await Ce(m.join(e,"package.json"));if(o){let r={...o.dependencies??{},...o.devDependencies??{}},a=o.scripts??{},i=Object.values(a).filter(c=>typeof c=="string").join(" ").toLowerCase();if(r.next||r.react||r.vue||r.svelte||r.vite||r["@angular/core"]||i.includes("next ")||i.includes("vite "))return "frontend";if(o.private===true&&!r.express&&!r["@nestjs/core"])return "library"}return await j$1.pathExists(m.join(e,"Dockerfile"))||await j$1.pathExists(m.join(e,"docker-compose.yml"))||await j$1.pathExists(m.join(e,"terraform.tf"))?"infra":"service"}var Xe=new Set([...r().map(e=>e.id),...j().map(e=>e.kitId)]),Ye=[{id:"wordpress-site",aliases:["wordpress","wordpress-site","wp","wp-site"],ecosystem:"wordpress",status:"planned",officialCommands:["wp core download","wp config create","wp db create","wp core install"],adoptAfterCreate:true},{id:"wordpress-block",aliases:["wordpress-block","wp-block","gutenberg-block"],ecosystem:"wordpress",status:"planned",officialCommands:["npx @wordpress/create-block@latest <slug>"],adoptAfterCreate:true},{id:"laravel",aliases:["laravel","php-laravel"],ecosystem:"php",status:"planned",officialCommands:["composer create-project laravel/laravel <name>"],adoptAfterCreate:true},{id:"symfony",aliases:["symfony","php-symfony"],ecosystem:"php",status:"planned",officialCommands:["composer create-project symfony/skeleton <name>"],adoptAfterCreate:true},{id:"rails",aliases:["rails","ruby-on-rails","ruby-rails"],ecosystem:"ruby",status:"planned",officialCommands:["rails new <name>"],adoptAfterCreate:true}],F=new Map;for(let e of Ye){F.set(e.id,e);for(let t of e.aliases)F.set(t,e);}var Qe=new Set(["php","ruby","rust","elixir","clojure","scala","kotlin","unknown"]);function M(e){return e?.trim().toLowerCase()||void 0}function xe(e){let t=M(e.kitId)??M(e.framework)??M(e.runtime)??"unknown";if(e.projectExists)return {lane:"adopt-only",status:"available",canExecuteCreate:false,requested:t,reason:"Existing projects enter Workspace Intelligence through adopt/import."};let n=e.kitId?q$1(e.kitId):void 0;if(n&&Xe.has(n))return {lane:"native-create",status:"available",canExecuteCreate:true,requested:t,resolved:n,reason:"RapidKit owns the create contract, project marker, registry, doctor, and workspace model path."};let s=F.get(t)??F.get(M(e.framework)??"")??F.get(M(e.runtime)??"");if(s)return {lane:"external-create-adopt",status:s.status,canExecuteCreate:false,requested:t,resolved:s.id,officialCommands:s.officialCommands,fallbackLane:"adopt-only",reason:"External generator support is planned but not enabled; use adopt/import until RapidKit owns the post-create contract."};let o=M(e.runtime);return o&&Qe.has(o)?{lane:"adopt-only",status:"available",canExecuteCreate:false,requested:t,resolved:o,reason:"Runtime can be governed through Workspace Intelligence, but native create is not supported."}:{lane:"adopt-only",status:"available",canExecuteCreate:false,requested:t,reason:"No native create contract is available; use adopt/import to enter Workspace Intelligence."}}function zt(e){return !e.canExecuteCreate&&(e.lane==="external-create-adopt"||e.lane==="adopt-only"&&e.resolved!==void 0)}var Re="workspace-dependency-graph.v1",Ae=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"];var Qt="rapidkit-freshness-metadata-v1";function re(e){if(Array.isArray(e))return e.map(t=>re(t));if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=re(e[n]);return t}return e}function et(e){return JSON.stringify(re(e))}function z(e){return Ze.createHash("sha256").update(et(e)).digest("hex")}var Me=".rapidkit/workspace-graph.overrides.json",tt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),nt=new Set([".git",".hg",".svn",".rapidkit",".venv","node_modules","dist","build","out","target","coverage","htmlcov",".next",".turbo",".cache"]),_e=600,De=5,rt=256*1024,Ie={inferred:1,contract:2,manual:3};function ot(e){return e.split(m.sep).join("/")}function J(e,t){return ot(m.relative(e,t)||".")}function Oe(e){let t=new Map;for(let n of e.projects)t.has(n.name)||t.set(n.name,{id:n.name,path:n.path,...n.runtime?{runtime:n.runtime}:{},...n.framework?{framework:n.framework}:{},...n.kind?{kind:n.kind}:{}});return [...t.values()].sort((n,s)=>n.id.localeCompare(s.id))}function Ge(e,t){let n=new Map,s=new Map;for(let r of t.projects){if(n.has(r.name))continue;let a=r.absolutePath?m.resolve(r.absolutePath):m.resolve(e,r.path);n.set(r.name,a),s.has(a)||s.set(a,r.name);}let o=[...s.entries()].map(([r,a])=>({dir:r,id:a})).sort((r,a)=>a.dir.length-r.dir.length||r.dir.localeCompare(a.dir));return {idToDir:n,dirToId:s,sortedDirs:o}}function q(e,t){let n=m.resolve(t);for(let{dir:s,id:o}of e.sortedDirs)if(n===s||n.startsWith(`${s}${m.sep}`))return o;return null}async function se(e){try{if(!await j$1.pathExists(e))return null;let t=await j$1.readJSON(e);return t&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ie(e){try{return await j$1.pathExists(e)?await j$1.readFile(e,"utf8"):null}catch{return null}}async function Ne(e,t){let n=[],s=new Map;for(let[o,r]of t.idToDir.entries()){let a=await se(m.join(r,"package.json")),i=typeof a?.name=="string"?a.name.trim():"";i&&!s.has(i)&&s.set(i,o);}for(let[o,r]of t.idToDir.entries()){let a=await se(m.join(r,"package.json"));if(a){let i=["dependencies","devDependencies","peerDependencies","optionalDependencies"],c=new Set;for(let p of i){let l=a[p];if(!(!l||typeof l!="object"||Array.isArray(l)))for(let d of Object.keys(l)){let u=s.get(d);!u||u===o||c.has(u)||(c.add(u),n.push({from:o,to:u,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:J(e,m.join(r,"package.json")),detail:`declares dependency ${d}`}]}));}}}n.push(...await st(e,t,o,r)),n.push(...await at(e,t,o,r));}return n}async function st(e,t,n,s){let o=await ie(m.join(s,"pyproject.toml"));if(!o)return [];let r=[],a=new Set,i=/path\s*=\s*["']([^"']+)["']/g,c;for(;(c=i.exec(o))!==null;){let p=q(t,m.resolve(s,c[1]));!p||p===n||a.has(p)||(a.add(p),r.push({from:n,to:p,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:J(e,m.join(s,"pyproject.toml")),detail:`path dependency ${c[1]}`}]}));}return r}async function at(e,t,n,s){let o=await ie(m.join(s,"go.mod"));if(!o)return [];let r=[],a=new Set,i=/replace\s+\S+\s+=>\s+(\.[^\s]+)/g,c;for(;(c=i.exec(o))!==null;){let p=q(t,m.resolve(s,c[1]));!p||p===n||a.has(p)||(a.add(p),r.push({from:n,to:p,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:J(e,m.join(s,"go.mod")),detail:`go.mod replace ${c[1]}`}]}));}return r}async function it(e,t){let n=[],s=[e];for(;s.length>0&&n.length<t;){let o=s.shift();if(!o)continue;let r=[];try{r=await j$1.readdir(o,{withFileTypes:true});}catch{continue}let a=[],i=[];for(let c of r)if(c.isDirectory()){if(nt.has(c.name)||c.name.startsWith("."))continue;a.push(m.join(o,c.name));}else c.isFile()&&tt.has(m.extname(c.name))&&i.push(m.join(o,c.name));i.sort((c,p)=>c.localeCompare(p)),a.sort((c,p)=>c.localeCompare(p));for(let c of i){if(n.length>=t)break;n.push(c);}s.push(...a);}return n}var ct=[/\bfrom\s+["']([^"']+)["']/g,/\bimport\s+["']([^"']+)["']/g,/\bimport\s*\(\s*["']([^"']+)["']\s*\)/g,/\brequire\s*\(\s*["']([^"']+)["']\s*\)/g];function dt(e){let t=new Set;for(let n of ct){n.lastIndex=0;let s;for(;(s=n.exec(e))!==null;){let o=s[1];o.startsWith(".")&&t.add(o);}}return [...t]}async function ae(e,t,n,s){let o=new Map;for(let[r,a]of t.idToDir.entries()){if(s&&!s.has(r))continue;let i=await it(a,n);for(let c of i){let p=await j$1.stat(c).catch(()=>null);if(!p||p.size>rt)continue;let l=await ie(c);if(l)for(let d of dt(l)){let u=m.resolve(m.dirname(c),d),k=q(t,u);if(!k||k===r)continue;let b=`${r}\0${k}`,y=o.get(b);y||(y={from:r,to:k,evidence:[]},o.set(b,y)),y.evidence.length<De&&y.evidence.push({file:J(e,c),detail:`imports ${d}`});}}}return [...o.values()].map(r=>({from:r.from,to:r.to,kind:"code-import",source:"inferred",confidence:"medium",evidence:r.evidence}))}function pt(e,t,n){let s=new Map;for(let o of n.projects){let r=lt(e,t,o);r&&s.set(o.slug,r);}return s}function lt(e,t,n){let s=[n.relativePath,n.externalPath].filter(o=>typeof o=="string"&&o.length>0);for(let o of s){let r=m.resolve(e,o),a=t.dirToId.get(r)??q(t,r);if(a)return a}return t.idToDir.has(n.slug)?n.slug:null}function Te(e,t,n){let s=[],o=pt(e,t,n),r=b,a=new Map,i=new Map;for(let c of n.projects){let p=o.get(c.slug);if(!p)continue;let l=c.contracts??{publishes:[],consumes:[],dependsOn:[]};for(let d of l.dependsOn??[]){let u=o.get(d);!u||u===p||s.push({from:p,to:u,kind:"service-dependsOn",source:"contract",confidence:"high",evidence:[{file:r,detail:`dependsOn ${d}`}]});}for(let d of l.publishes??[])a.has(d)||a.set(d,new Set),a.get(d)?.add(p);for(let d of l.consumes??[])i.has(d)||i.set(d,new Set),i.get(d)?.add(p);}for(let[c,p]of a.entries()){let l=i.get(c);if(l)for(let d of l)for(let u of p)d!==u&&s.push({from:d,to:u,kind:"event-pub-sub",source:"contract",confidence:"high",evidence:[{file:r,detail:`consumes event ${c}`}]});}return s.push(...ut(n,o)),s}function oe(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"")}function ut(e,t){let n=[],s=e.projects.map(o=>({project:o,id:t.get(o.slug)})).filter(o=>!!o.id).filter(o=>oe(o.project.slug).length>=3);for(let o of e.projects){let r=t.get(o.slug);if(!r)continue;let a=o.contracts?.env??[];if(a.length===0)continue;let i=new Set;for(let c of a){let p=oe(c);for(let l of s)l.id===r||i.has(l.id)||!(p.includes(oe(l.project.slug))&&(l.project.ports?.length??0)>0)||(i.add(l.id),n.push({from:r,to:l.id,kind:"shared-resource",source:"inferred",confidence:"low",evidence:[{file:b,detail:`env ${c} references ${l.project.slug}`}]}));}}return n}async function Fe(e,t){let n=await se(m.join(e,Me)),s=Array.isArray(n?.edges)?n?.edges:[],o=[],r=new Set(Ae);for(let a of s){if(!a||typeof a!="object"||Array.isArray(a))continue;let i=a,c=typeof i.from=="string"?i.from:"",p=typeof i.to=="string"?i.to:"",l=typeof i.kind=="string"?i.kind:"";if(!t.has(c)||!t.has(p)||c===p||!r.has(l))continue;let d=Array.isArray(i.evidence)?i.evidence.map(u=>u&&typeof u=="object"&&typeof u.file=="string"?{file:u.file,...typeof u.detail=="string"?{detail:u.detail}:{}}:null).filter(u=>!!u):[];o.push({from:c,to:p,kind:l,source:"manual",confidence:"high",evidence:d.length>0?d:[{file:Me,detail:"manual edge"}]});}return o}function mt(e){return `${e.from}\0${e.to}\0${e.kind}`}function ft(e){let t=new Set,n=[];for(let s of e){let o=`${s.file}\0${s.detail??""}`;t.has(o)||(t.add(o),n.push(s));}return n.sort((s,o)=>s.file.localeCompare(o.file)||(s.detail??"").localeCompare(o.detail??"")).slice(0,De)}function gt(e){let t=new Map;for(let n of e){let s=mt(n),o=t.get(s);if(!o){t.set(s,{...n,evidence:[...n.evidence]});continue}let r=Ie[o.source],a=Ie[n.source];a>r?t.set(s,{...n,evidence:[...n.evidence,...o.evidence]}):a===r&&o.evidence.push(...n.evidence);}return [...t.values()].map(n=>({from:n.from,to:n.to,kind:n.kind,source:n.source,confidence:n.confidence,evidence:ft(n.evidence)})).sort((n,s)=>n.from.localeCompare(s.from)||n.to.localeCompare(s.to)||n.kind.localeCompare(s.kind)||n.source.localeCompare(s.source))}function ht(e,t){let n=new Map;for(let c of e)n.set(c.id,[]);for(let c of t)n.has(c.from)||n.set(c.from,[]),n.get(c.from)?.push(c.to);let s=0,o=1,r=2,a=new Map;for(let c of n.keys())a.set(c,s);let i=c=>{let p=[{id:c,index:0}];for(a.set(c,o);p.length>0;){let l=p[p.length-1],d=n.get(l.id)??[];if(l.index>=d.length){a.set(l.id,r),p.pop();continue}let u=d[l.index];l.index+=1;let k=a.get(u)??s;if(k===o)return true;k===s&&(a.set(u,o),p.push({id:u,index:0}));}return false};for(let c of [...n.keys()].sort())if(a.get(c)===s&&i(c))return true;return false}function Ke(e,t,n,s){let o=gt(n.filter(r=>t.has(r.from)&&t.has(r.to)));return {schemaVersion:Re,generatedAt:(s??new Date).toISOString(),nodes:e,edges:o,stats:{nodeCount:e.length,edgeCount:o.length,inferredEdges:o.filter(r=>r.source==="inferred").length,contractEdges:o.filter(r=>r.source==="contract").length,manualEdges:o.filter(r=>r.source==="manual").length,hasCycle:ht(e,o)}}}async function He(e){let t=m.resolve(e.workspacePath),n=e.maxImportFilesPerProject??_e,s=Oe(e.model),o=new Set(s.map(i=>i.id)),r=Ge(t,e.model),a=[];return a.push(...await Ne(t,r)),a.push(...await ae(t,r,n)),e.contract&&a.push(...Te(t,r,e.contract)),a.push(...await Fe(t,o)),Ke(s,o,a,e.now)}async function Ve(e){let t=m.resolve(e.workspacePath),n=e.maxImportFilesPerProject??_e,s=Oe(e.model),o=new Set(s.map(i=>i.id)),r=Ge(t,e.model),a=[];if(a.push(...await Ne(t,r)),e.structuralChange)a.push(...await ae(t,r,n));else {a.push(...await ae(t,r,n,e.changedProjectIds));for(let i of e.previousGraph.edges)i.kind==="code-import"&&i.source==="inferred"&&!e.changedProjectIds.has(i.from)&&o.has(i.from)&&o.has(i.to)&&a.push({from:i.from,to:i.to,kind:"code-import",source:"inferred",confidence:i.confidence,evidence:i.evidence});}return e.contract&&a.push(...Te(t,r,e.contract)),a.push(...await Fe(t,o)),Ke(s,o,a,e.now)}var ce="workspace-model-cache.v1",$e=".rapidkit/cache/workspace-model.v1.json",Le=["package.json","pyproject.toml","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","rapidkit.project.json",".rapidkit/project.json"],wt=[".rapidkit/workspace.contract.json",".rapidkit/workspace.json","rapidkit.workspace.json",".rapidkit/policies.yml",".rapidkit/policies.yaml"],Et=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),jt=new Set([".git",".rapidkit","node_modules","dist","build","out","target","coverage",".next",".turbo",".cache",".venv"]),bt=1500,K=null;function de(){if(K)return K;try{K=createRequire(import.meta.url)("../package.json")?.version??"0.0.0";}catch{K="0.0.0";}return K}async function U(e){try{let t=await j$1.readFile(e);return Ze.createHash("sha256").update(t).digest("hex")}catch{return null}}async function Pt(e){let t={};for(let o of Le){let r=await U(m.join(e,o));r&&(t[o]=r);}let n=[],s=[e];for(;s.length>0&&n.length<bt;){let o=s.shift();if(!o)continue;let r=[];try{r=await j$1.readdir(o,{withFileTypes:true});}catch{continue}let a=[];for(let i of r)if(i.isDirectory()){if(jt.has(i.name)||i.name.startsWith("."))continue;a.push(m.join(o,i.name));}else if(i.isFile()&&Et.has(m.extname(i.name))){let c=m.join(o,i.name),p=await j$1.stat(c).catch(()=>null);if(p){let l=m.relative(e,c).split(m.sep).join("/");n.push(`${l}:${p.size}:${Math.round(p.mtimeMs)}`);}}a.sort((i,c)=>i.localeCompare(c)),s.push(...a);}return n.sort((o,r)=>o.localeCompare(r)),z({manifests:t,source:n})}async function X(e,t){let n=m.resolve(e),s={},o=[...new Set(t.map(r=>m.relative(n,m.resolve(r)).split(m.sep).join("/")))].sort((r,a)=>r.localeCompare(a));for(let r of o)s[r]=await Pt(m.join(n,r));return s}async function Y(e){let t=m.resolve(e),n={};for(let s of wt){let o=await U(m.join(t,s));o&&(n[s]=o);}return n}async function Q(e){let t=m.resolve(e.workspacePath),n=[...new Set(e.projectPaths.map(r=>m.relative(t,m.resolve(r)).split(m.sep).join("/")))].sort((r,a)=>r.localeCompare(a)),s=[];for(let r of n){let a={};for(let i of Le){let c=await U(m.join(t,r,i));c&&(a[i]=c);}s.push({project:r,manifests:a});}let o={};for(let r of [".rapidkit/workspace.contract.json",".rapidkit/workspace.json","rapidkit.workspace.json",".rapidkit/policies.yml",".rapidkit/policies.yaml"]){let a=await U(m.join(t,r));a&&(o[r]=a);}return z({cacheSchema:ce,cliVersion:e.cliVersion,flags:e.flags,workspaceJson:e.workspaceJson??null,marker:e.marker??null,projects:s,workspaceFiles:o})}async function pe(e){let t=m.join(m.resolve(e),$e);try{if(!await j$1.pathExists(t))return null;let n=await j$1.readJson(t);return !n||n.schemaVersion!==ce||typeof n.inputsHash!="string"||typeof n.cliVersion!="string"||!n.model?null:n}catch{return null}}async function Z(e,t){let n=m.join(m.resolve(e),$e);await j$1.ensureDir(m.dirname(n));let s={schemaVersion:ce,...t};return await j$1.writeJson(n,s,{spaces:2}),n}var vt="workspace-model.v1",Ct=".rapidkit/reports/workspace-model.json",St=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","deno.jsonc","bun.lock","bun.lockb","deps.edn","project.clj","build.sbt","docker-compose.yml","docker-compose.yaml","terraform.tf"],Wt=new Set([".git",".hg",".svn",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next",".turbo"]);function ze(e,t){return (m.relative(e,t)||".").split(m.sep).join("/")}async function Je(e){try{if(!await j$1.pathExists(e))return null;let t=await j$1.readJSON(e);return t&&typeof t=="object"?t:null}catch{return null}}async function xt(e,t){for(let n of t)if(await j$1.pathExists(m.join(e,n)))return true;return false}function le(e){let t=Number.parseInt(process.env.RAPIDKIT_WORKSPACE_MODEL_SCAN_DEPTH??"",10),n=typeof e=="number"&&Number.isFinite(e)?e:Number.isFinite(t)?t:4;return Math.min(12,Math.max(1,Math.trunc(n)))}async function ue(e,t){let n=m.resolve(e),s=[{dirPath:n,depth:0}],o=new Set,r=new Set;for(;s.length>0;){let a=s.shift();if(!a)continue;let i=m.resolve(a.dirPath);if(r.has(i))continue;if(r.add(i),i!==n&&await xt(i,St)){o.add(i);continue}if(a.depth>=t)continue;let c=[];try{c=await j$1.readdir(i,{withFileTypes:true});}catch{continue}for(let p of c)!p.isDirectory()||Wt.has(p.name)||p.name.startsWith(".")&&p.name!==".config"||s.push({dirPath:m.join(i,p.name),depth:a.depth+1});}return Array.from(o).sort((a,i)=>a.localeCompare(i))}function me(e){let t=new Set,n=[];for(let s of e){let o=m.resolve(s);t.has(o)||(t.add(o),n.push(o));}return n.sort((s,o)=>s.localeCompare(o))}function Be(e,t){let n=e?.[t];return typeof n=="string"&&n.trim()?n.trim():void 0}function Rt(e,t){return e?.[t]===true}function At(e,t,n){let s=e?.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,o=Be(s,"generator"),r=Be(s,"command_display"),a=typeof t=="string"&&t.startsWith("frontend.");if(!(!o&&!a))return {...o?{id:o}:{},...t?{kit:t}:{},displayName:n,source:Rt(s,"official_generator")?"official-generator":"metadata",...r?{commandDisplay:r}:{}}}async function Mt(e){let t=[".rapidkit/project.json",".rapidkit/context.json","package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","Dockerfile","docker-compose.yml","README.md"],n=[];for(let s of t)await j$1.pathExists(m.join(e,s))&&n.push(s);return n}async function P(e,t,n){let s=m.join(e,t),o=await j$1.pathExists(s),r={path:t.split(m.sep).join("/"),exists:o};if(o&&n){let a=await Je(s);typeof a?.generatedAt=="string"&&(r.generatedAt=a.generatedAt);let i=a?.status??a?.result??a?.verdict;typeof i=="string"&&(r.status=i);}return r}async function It(e,t,n){let o=`${ze(e,t)}/.rapidkit/reports`,r=await P(e,`${o}/doctor-project-last-run.json`,n);return {doctor:r?.exists===true?r:await P(e,`${o}/doctor-last-run.json`,n),analyze:await P(e,`${o}/analyze-last-run.json`,n),readiness:await P(e,`${o}/release-readiness-last-run.json`,n)}}async function _t(e,t,n){let s=a$4(t),o=i(t,s),r=q$2(t),a=k(o.runtime),i$1=await We(t,s),c=typeof s?.name=="string"&&s.name.trim()?s.name.trim():m.basename(t),p=typeof s?.kit_name=="string"?s.kit_name:typeof s?.kit=="string"?s.kit:void 0,l=typeof s?.engine=="string"?s.engine:r.engine!=="unknown"?r.engine:void 0,d=At(s,p,o.displayName),u=xe({kitId:p,framework:o.key,runtime:o.runtime});return {name:c,path:ze(e,t),...n.includeAbsolutePaths?{absolutePath:t}:{},kind:i$1,runtime:o.runtime,runtimeCandidates:h(t),framework:o.key,frameworkDisplayName:o.displayName,confidence:o.confidence,detectionSource:o.source,supportTier:o.supportTier,runtimeSupportTier:a.tier,runtimeDoctorSupport:a.doctorSupport,moduleSupport:r.moduleSupport,...p?{kit:p}:{},...l?{engine:l}:{},...d?{generator:d}:{},createCapability:u,commands:{supported:r.supportedCommands,unsupported:r.unsupportedCommands,global:r.globalCommands,fleetStages:r.fleetStages,localOnly:r.localOnlyCommands,map:r.commandMap},importantFiles:await Mt(t),evidence:await It(e,t,n.includeEvidence),provenance:{path:"filesystem discovery",runtime:o.source,framework:o.source,commands:"project command capability matrix",createCapability:"create planner capability contract",evidence:"project .rapidkit/reports"}}}async function fe(e){return Je(m.join(e,".rapidkit","workspace.json"))}function Dt(e){return e.some(t=>t.kind==="frontend")&&e.length>1?"full-stack-workspace":e.some(t=>t.kind==="frontend")?"frontend-workspace":e.length>1?"backend-platform":"backend-workspace"}function Ot(e){let t=new Set;for(let n of e){let s=`${n.name} ${n.path}`.toLowerCase();for(let o of ["auth","billing","payment","notification","order","admin","report","search","analytics"])s.includes(o)&&t.add(o);}return Array.from(t).sort()}function E(e,t,n,s){return {severity:e,code:t,message:n,target:s}}function qe(e){let t=[];e.workspace.name.trim()||t.push(E("error","workspace.name.missing","Workspace name could not be resolved.","workspace")),e.workspace.type==="observed-workspace"&&t.push(E("warning","workspace.marker.missing","Workspace marker is missing; model is based on filesystem observation.","workspace.marker")),e.summary.projectCount===0&&t.push(E("warning","workspace.projects.empty","No project roots were detected in this workspace.","projects")),e.contracts.exists||t.push(E("warning","workspace.contract.missing","Workspace contract is missing; dependency and API edges may be incomplete.",e.contracts.workspaceContractPath));let n=new Map;for(let r of e.projects){let a=r.name.toLowerCase(),i=n.get(a)??[];i.push(r),n.set(a,i),r.importantFiles.length||t.push(E("warning","project.markers.missing",`Project ${r.name} has no important manifest files recorded.`,r.path)),r.runtime==="unknown"&&t.push(E("warning","project.runtime.unknown",`Project ${r.name} runtime could not be confidently detected.`,r.path));let c=["test","build"];for(let d of c)r.commands.supported.includes(d)&&r.commands.unsupported.includes(d)&&t.push(E("error","project.commands.conflict",`Project ${r.name} marks ${d} as both supported and unsupported.`,r.path));let p=new Set(r.commands.fleetStages),l=new Set(r.commands.localOnly);for(let d of r.commands.fleetStages){l.has(d)&&t.push(E("error","project.commands.scope-conflict",`Project ${r.name} marks ${d} as both fleet and local-only.`,r.path));let u=r.commands.map[d];(!u||u.status!=="supported"||u.fleetEligible!==true||u.executionScope!=="fleet")&&t.push(E("error","project.commands.fleet-stage-invalid",`Project ${r.name} advertises ${d} as a fleet stage without a supported fleet capability.`,r.path));}for(let d of r.commands.localOnly){let u=r.commands.map[d];(!u||u.status!=="supported"||u.executionScope!=="local-only"||u.fleetEligible===true)&&t.push(E("error","project.commands.local-only-invalid",`Project ${r.name} advertises ${d} as local-only without a matching local-only capability.`,r.path));}for(let d of Object.values(r.commands.map))d.status==="supported"&&(d.fleetEligible===true&&!p.has(d.command)&&t.push(E("error","project.commands.fleet-stage-missing",`Project ${r.name} capability ${d.command} is fleet-eligible but missing from fleetStages.`,r.path)),d.executionScope==="local-only"&&d.fleetEligible!==true&&!l.has(d.command)&&t.push(E("error","project.commands.local-only-missing",`Project ${r.name} capability ${d.command} is local-only but missing from localOnly commands.`,r.path)));}for(let[r,a]of n.entries())a.length>1&&t.push(E("error","project.name.duplicate",`Project name "${r}" is ambiguous across ${a.length} project roots.`,a.map(i=>i.path).join(", ")));let s=t.filter(r=>r.severity==="error").length,o=t.filter(r=>r.severity==="warning").length;return {status:s>0?"failed":o>0?"warning":"passed",errors:s,warnings:o,issues:t}}function Mn(e){return qe(e)}async function ee(e){let t=m.resolve(e.workspacePath),n=e.includeAbsolutePaths===true,s=e.includeEvidence===true,o=le(e.observableScanDepth),r=e.now??new Date,[a$3,i,c,p,l]=await Promise.all([a(t),fe(t),a$1(t),a$2(t,{descendIntoMatchedProjects:false}),ue(t,o)]),d=me([...p,...l,...c.map(f=>m.isAbsolute(f.path)?f.path:m.join(t,f.path))]),u=e.reuseProjectModels,k=await Promise.all(d.map(f=>{if(u){let W=m.relative(t,m.resolve(f)).split(m.sep).join("/"),x=u.get(W);if(x)return Promise.resolve(x)}return _t(t,f,{includeAbsolutePaths:n,includeEvidence:s})})),b=typeof i?.workspace_name=="string"?i.workspace_name:typeof i?.name=="string"?i.name:a$3?.name||m.basename(t),y=typeof i?.profile=="string"?i.profile:typeof i?.mode=="string"?i.mode:void 0,_=Array.from(new Set(k.map(f=>f.kind))).sort(),S=Array.from(new Set(k.map(f=>f.runtime))).sort(),te=Array.from(new Set(k.map(f=>f.framework))).sort(),D=[".rapidkit/policies.yml",".rapidkit/policies.yaml"].find(f=>j$1.existsSync(m.join(t,f))),O=".rapidkit/workspace.contract.json",v=await j$1.pathExists(m.join(t,O)),H={schemaVersion:vt,generatedAt:r.toISOString(),workspace:{name:b,root:t,...y?{profile:y}:{},type:a$3?"rapidkit-workspace":"observed-workspace",...a$3?{marker:{createdBy:a$3.createdBy,version:a$3.version,createdAt:a$3.createdAt}}:{}},identity:{workspaceType:Dt(k),surfaces:_,runtimeFamilies:S,businessCapabilities:Ot(k)},discovery:{observableScanDepth:o},projects:k,policies:{mode:typeof i?.policy_mode=="string"?i.policy_mode:typeof i?.policyMode=="string"?i.policyMode:"warn",source:D??null,exists:!!D},contracts:{workspaceContractPath:O,exists:v,status:v?"known":"missing"},evidence:{doctor:await P(t,".rapidkit/reports/doctor-last-run.json",s),analyze:await P(t,".rapidkit/reports/analyze-last-run.json",s),readiness:await P(t,".rapidkit/reports/release-readiness-last-run.json",s),pipeline:await P(t,".rapidkit/reports/pipeline-last-run.json",s)},summary:{projectCount:k.length,runtimes:S,frameworks:te,firstClassProjects:k.filter(f=>f.supportTier==="first-class").length,observedProjects:k.filter(f=>f.supportTier==="observed").length}},G=await Ft(t,H,{contractExists:v,now:r,incrementalGraph:e.incrementalGraph}),V={...H,graph:G},w=qe(V);return {...V,validation:w}}async function In(e){if(e.cache!==true)return {model:await ee(e),cache:"disabled"};let t=m.resolve(e.workspacePath),n=le(e.observableScanDepth),s=de(),[o,r,a$3,i,c]=await Promise.all([a(t),fe(t),a$1(t),a$2(t,{descendIntoMatchedProjects:false}),ue(t,n)]),p=me([...i,...c,...a$3.map(y=>m.isAbsolute(y.path)?y.path:m.join(t,y.path))]),l=await Q({workspacePath:t,cliVersion:s,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:n},projectPaths:p,workspaceJson:r,marker:o}),d=await pe(t);if(d&&d.cliVersion===s&&d.inputsHash===l)return {model:d.model,cache:"hit"};let u=await ee({...e}),[k,b]=await Promise.all([X(t,p),Y(t)]);return await Z(t,{cliVersion:s,inputsHash:l,generatedAt:(e.now??new Date).toISOString(),model:u,projectSignatures:k,workspaceFileSignatures:b}),{model:u,cache:"miss"}}function Gt(e,t){let n=new Set,s=new Set,o=new Set;for(let[r,a]of Object.entries(t))r in e?e[r]!==a&&n.add(r):s.add(r);for(let r of Object.keys(e))r in t||o.add(r);return {changed:n,added:s,removed:o}}function Nt(e={},t={}){let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of n)if(e[s]!==t[s])return false;return true}async function _n(e){let t=m.resolve(e.workspacePath),n=le(e.observableScanDepth),s=de(),o=e.now??new Date,[r,a$3,i,c,p]=await Promise.all([a(t),fe(t),a$1(t),a$2(t,{descendIntoMatchedProjects:false}),ue(t,n)]),l=me([...c,...p,...i.map(w=>m.isAbsolute(w.path)?w.path:m.join(t,w.path))]),d=await pe(t),u=async()=>{let w=await ee({...e}),f=await Q({workspacePath:t,cliVersion:s,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:n},projectPaths:l,workspaceJson:a$3,marker:r}),[W,x]=await Promise.all([X(t,l),Y(t)]);return await Z(t,{cliVersion:s,inputsHash:f,generatedAt:o.toISOString(),model:w,projectSignatures:W,workspaceFileSignatures:x}),{model:w,mode:"full"}};if(!d||d.cliVersion!==s||!d.projectSignatures||!d.model?.graph)return u();let k=await Y(t);if(!Nt(d.workspaceFileSignatures,k))return u();let b=await X(t,l),{changed:y,added:_,removed:S}=Gt(d.projectSignatures,b);if(y.size===0&&_.size===0&&S.size===0)return {model:d.model,mode:"unchanged"};let te=new Set([...y,..._]),D=new Map;for(let w of d.model.projects){let f=w.path.split(m.sep).join("/");!te.has(f)&&!S.has(f)&&D.set(f,w);}let O=new Set,v=false;for(let w of d.model.projects){let f=w.path.split(m.sep).join("/");y.has(f)&&O.add(w.name);}let H=_.size>0||S.size>0,G=await ee({...e,reuseProjectModels:D,incrementalGraph:{previousGraph:d.model.graph,changedProjectIds:O,structuralChange:H||v}});for(let w of d.model.projects){let f=w.path.split(m.sep).join("/");if(!y.has(f))continue;let W=G.projects.find(x=>x.path.split(m.sep).join("/")===f);if(W&&W.name!==w.name){v=true;break}}if(v)return u();let V=await Q({workspacePath:t,cliVersion:s,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:n},projectPaths:l,workspaceJson:a$3,marker:r});return await Z(t,{cliVersion:s,inputsHash:V,generatedAt:o.toISOString(),model:G,projectSignatures:b,workspaceFileSignatures:k}),{model:G,mode:"incremental"}}async function Tt(e){try{let{contract:t}=await j$2({workspacePath:e});return t&&typeof t=="object"?t:null}catch{return null}}async function Ft(e,t,n){let s=n.contractExists?await Tt(e):null;try{return n.incrementalGraph?await Ve({workspacePath:e,model:t,contract:s,now:n.now,previousGraph:n.incrementalGraph.previousGraph,changedProjectIds:n.incrementalGraph.changedProjectIds,structuralChange:n.incrementalGraph.structuralChange}):await He({workspacePath:e,model:t,contract:s,now:n.now})}catch{let o=t.projects.map(r=>({id:r.name,path:r.path}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:n.now.toISOString(),nodes:o,edges:[],stats:{nodeCount:o.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,hasCycle:false}}}}async function Dn(e,t){let n=m.join(t,Ct);return await j$1.ensureDir(m.dirname(n)),await j$1.writeJSON(n,a$3(e),{spaces:2}),n}export{Qt as a,z as b,xe as c,zt as d,We as e,Re as f,vt as g,Ct as h,Mn as i,ee as j,In as k,_n as l,Dn as m};
@@ -1 +0,0 @@
1
- var r=".rapidkit/skills",n=".rapidkit/reports/workspace-skills-index.json",s=".rapidkit/reports/workspace-explain-last-run.json";function o(e){let i=e.trim();if(!i||i.includes("..")||i.includes("/"))throw new Error(`Invalid operational skill id: ${e}`);return `${r}/${i}.md`}var p={"rapidkit-diagnose-api-failure":"rapidkit-diagnose","rapidkit-release-readiness":"rapidkit-release-readiness","rapidkit-safe-schema-migration":"rapidkit-safe-schema-migration","rapidkit-dependency-upgrade":"rapidkit-dependency-upgrade","rapidkit-rename-contract":"rapidkit-rename-contract"};export{r as a,n as b,s as c,o as d,p as e};