workspai 0.43.0 → 0.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +26 -13
  2. package/contracts/agent-customization-pack.v1.json +1 -1
  3. package/contracts/autopilot-release.v1.json +204 -0
  4. package/contracts/cli-operation-result.v1.json +119 -0
  5. package/contracts/command-capabilities.v1.json +138 -0
  6. package/contracts/compatibility-matrix.v1.json +37 -0
  7. package/contracts/create-planner-capabilities.v1.json +156 -65
  8. package/contracts/doctor-project-scan.v2.json +60 -0
  9. package/contracts/doctor-remediation-plan.v1.json +19 -4
  10. package/contracts/doctor-remediation-plan.v2.json +7 -0
  11. package/contracts/doctor-workspace-cache.v2.json +82 -0
  12. package/contracts/extension-cli-compatibility.v1.json +47 -3
  13. package/contracts/infra-plan.v1.json +189 -0
  14. package/contracts/private-product-manifest.v1.json +155 -0
  15. package/contracts/product-factory-plan.v1.json +200 -0
  16. package/contracts/project-archive.v1.json +40 -0
  17. package/contracts/project-entry-capability.v1.json +127 -0
  18. package/contracts/published-contract-catalog.v1.json +334 -0
  19. package/contracts/runtime-command-surface.v1.json +239 -10
  20. package/contracts/version.v1.json +48 -0
  21. package/contracts/workspace-archive-capabilities.v1.json +90 -0
  22. package/contracts/workspace-archive-manifest.v1.json +107 -0
  23. package/contracts/workspace-archive-operation-result.v1.json +565 -0
  24. package/contracts/workspace-intelligence/agent-customization-pack-report.v1.json +98 -0
  25. package/contracts/workspace-intelligence/agent-hooks.v1.json +38 -0
  26. package/contracts/workspace-intelligence/agent-reports-index.v1.json +56 -0
  27. package/contracts/workspace-intelligence/mcp-design.v1.json +42 -0
  28. package/contracts/workspace-intelligence/workspace-context.v1.json +12 -0
  29. package/contracts/workspace-intelligence/workspace-explain.v1.json +1 -0
  30. package/contracts/workspace-intelligence-architecture.v1.json +723 -0
  31. package/contracts/workspace-intelligence-chain.v1.json +1194 -0
  32. package/contracts/workspace-list.v1.json +56 -0
  33. package/contracts/workspace-model-cache.v1.json +55 -0
  34. package/contracts/workspace-snapshot.v1.json +58 -0
  35. package/contracts/workspace-snapshot.v2.json +97 -0
  36. package/contracts/workspace-sync.v1.json +30 -0
  37. package/contracts/workspace-watch-event.v1.json +112 -0
  38. package/dist/analyze-6OCBM4ID.js +1 -0
  39. package/dist/{artifact-remediation-plan-5GJWPPRS.js → artifact-remediation-plan-Z7OCSME3.js} +3 -3
  40. package/dist/autopilot-release-LI2WJCEW.js +1 -0
  41. package/dist/{chunk-LZQNVH7D.js → chunk-2K3GYCPS.js} +1 -1
  42. package/dist/chunk-2QN6BMM7.js +2 -0
  43. package/dist/chunk-2QOWRBQD.js +1 -0
  44. package/dist/chunk-5AKYMAIL.js +1 -0
  45. package/dist/{chunk-RE773WOX.js → chunk-5PVEQ6CZ.js} +5 -5
  46. package/dist/{chunk-AFSZHLQT.js → chunk-7EIMPQR3.js} +1 -1
  47. package/dist/{chunk-3KXW53QI.js → chunk-7IHLTPZ6.js} +1 -1
  48. package/dist/chunk-7RIWU5TZ.js +1 -0
  49. package/dist/{chunk-T6OR6YOI.js → chunk-7UZVOYF5.js} +1 -1
  50. package/dist/chunk-B66A4TVP.js +1 -0
  51. package/dist/chunk-CL6TGI4Q.js +8 -0
  52. package/dist/chunk-FWJV7CCI.js +2 -0
  53. package/dist/chunk-J4AICQFB.js +1 -0
  54. package/dist/chunk-JICOD2GI.js +1 -0
  55. package/dist/{chunk-OJEWQO3Z.js → chunk-JP25YL3J.js} +17 -17
  56. package/dist/chunk-L2Q7B2OJ.js +1 -0
  57. package/dist/chunk-L3E6IRUQ.js +8 -0
  58. package/dist/chunk-LG6RFLPZ.js +1 -0
  59. package/dist/chunk-LGP6WXS2.js +4 -0
  60. package/dist/{chunk-VRDF2J46.js → chunk-M4VITK6X.js} +52 -50
  61. package/dist/chunk-NTXO7BMH.js +4 -0
  62. package/dist/{chunk-LPZFK3Y6.js → chunk-OW4UNG27.js} +65 -66
  63. package/dist/{chunk-LUP4U6EE.js → chunk-P424XYHP.js} +1 -1
  64. package/dist/chunk-P4SWTY5X.js +33 -0
  65. package/dist/chunk-TQEMLBAG.js +1 -0
  66. package/dist/chunk-TRMDODFM.js +13 -0
  67. package/dist/chunk-UNF72FTB.js +1 -0
  68. package/dist/chunk-V5JN4TDX.js +2 -0
  69. package/dist/chunk-VA5MRHKM.js +2 -0
  70. package/dist/chunk-XIVFLY6G.js +1 -0
  71. package/dist/chunk-YUX4YFGL.js +78 -0
  72. package/dist/{create-WRZO4HK2.js → create-DFAWAS5C.js} +1 -1
  73. package/dist/demo-kit-DZ7TPG7K.js +149 -0
  74. package/dist/doctor-PVSWDBJL.js +1 -0
  75. package/dist/{dotnet-webapi-clean-IPY3MCGQ.js → dotnet-webapi-clean-BYUUHX5Y.js} +20 -20
  76. package/dist/{gofiber-standard-N5N3QGH3.js → gofiber-standard-B6UK5GR7.js} +31 -31
  77. package/dist/{gogin-standard-LAWQTBWL.js → gogin-standard-BXU44VEM.js} +31 -31
  78. package/dist/index.d.ts +250 -24
  79. package/dist/index.js +218 -182
  80. package/dist/pipeline-ND734AJM.js +5 -0
  81. package/dist/{platform-capabilities-XAVU4HSM.js → platform-capabilities-YICBF4FA.js} +1 -1
  82. package/dist/{pythonRapidkitExec-3L3XJBSY.js → pythonRapidkitExec-UJYIB6FL.js} +1 -1
  83. package/dist/{springboot-standard-OZYF7ZM7.js → springboot-standard-PEHDKH2L.js} +27 -27
  84. package/dist/{workspace-PR6VZRBG.js → workspace-FQT3QIRS.js} +1 -1
  85. package/dist/workspace-agent-sync-ZYCPXTU3.js +1 -0
  86. package/dist/workspace-archive-EEGLHZDW.js +10 -0
  87. package/dist/workspace-context-WAGGJCDL.js +1 -0
  88. package/dist/{workspace-contract-XUGMCUSQ.js → workspace-contract-SEI4SNSG.js} +1 -1
  89. package/dist/workspace-explain-MVGGRCDN.js +1 -0
  90. package/dist/workspace-explain-contract-KT757JGQ.js +1 -0
  91. package/dist/{workspace-feedback-R6H4UFZB.js → workspace-feedback-RCB25NFO.js} +1 -1
  92. package/dist/{workspace-foundation-KGSV4E6D.js → workspace-foundation-KXDL6P6X.js} +1 -1
  93. package/dist/{workspace-history-CGCK2DJI.js → workspace-history-M4QQBIPB.js} +1 -1
  94. package/dist/workspace-intelligence-QOGD2TZS.js +1 -0
  95. package/dist/workspace-mcp-serve-CEFKEMYG.js +3 -0
  96. package/dist/{workspace-model-PNXXOGPO.js → workspace-model-GMSRBICO.js} +1 -1
  97. package/dist/workspace-registry-summary-S52SEJAG.js +1 -0
  98. package/dist/workspace-run-VC4OUPRF.js +1 -0
  99. package/dist/{workspace-verify-WSDUUTR5.js → workspace-verify-NP4GMFSV.js} +1 -1
  100. package/dist/workspace-watch-IIBH3Y25.js +1 -0
  101. package/docs/AI_FEATURES.md +67 -34
  102. package/docs/README.md +2 -1
  103. package/docs/commands-reference.md +26 -14
  104. package/docs/contracts/ARTIFACT_CATALOG.md +60 -36
  105. package/docs/contracts/README.md +3 -2
  106. package/docs/create-planner-capabilities.md +36 -18
  107. package/docs/workspace-operations.md +25 -0
  108. package/package.json +35 -13
  109. package/scripts/enterprise-package-smoke.mjs +40 -8
  110. package/scripts/prepack-enterprise.mjs +8 -0
  111. package/templates/kits/fastapi-ddd/.gitignore.j2 +11 -0
  112. package/templates/kits/fastapi-ddd/README.md.j2 +23 -18
  113. package/templates/kits/fastapi-ddd/common/env.example.j2 +2 -2
  114. package/templates/kits/fastapi-ddd/pyproject.toml.j2 +7 -7
  115. package/templates/kits/fastapi-ddd/src/app/config/__init__.py.j2 +1 -1
  116. package/templates/kits/fastapi-ddd/src/cli.py.j2 +6 -9
  117. package/templates/kits/fastapi-ddd/src/main.py.j2 +1 -1
  118. package/templates/kits/fastapi-standard/.gitignore.j2 +11 -0
  119. package/templates/kits/fastapi-standard/README.md.j2 +35 -30
  120. package/templates/kits/fastapi-standard/common/env.example.j2 +2 -2
  121. package/templates/kits/fastapi-standard/pyproject.toml.j2 +7 -7
  122. package/templates/kits/fastapi-standard/src/cli.py.j2 +7 -10
  123. package/templates/kits/fastapi-standard/src/main.py.j2 +1 -1
  124. package/templates/kits/fastapi-standard/src/routing/examples.py.j2 +1 -1
  125. package/templates/kits/fastapi-standard/tests/test_examples.py.j2 +1 -1
  126. package/templates/kits/nestjs-standard/.dockerignore.j2 +11 -0
  127. package/templates/kits/nestjs-standard/.eslintrc.js.j2 +25 -0
  128. package/templates/kits/nestjs-standard/.gitignore.j2 +22 -0
  129. package/templates/kits/nestjs-standard/.node-version.j2 +1 -0
  130. package/templates/kits/nestjs-standard/.nvmrc.j2 +1 -0
  131. package/templates/kits/nestjs-standard/.prettierrc.j2 +7 -0
  132. package/templates/kits/nestjs-standard/README.md.j2 +23 -18
  133. package/templates/kits/nestjs-standard/docs/README.md.j2 +2 -2
  134. package/templates/kits/nestjs-standard/jest.config.ts.j2 +1 -7
  135. package/templates/kits/nestjs-standard/package.json.j2 +1 -1
  136. package/templates/kits/nestjs-standard/src/config/configuration.ts.j2 +4 -4
  137. package/templates/kits/nestjs-standard/src/main.ts.j2 +1 -1
  138. package/templates/kits/nestjs-standard/src/modules/index.ts.j2 +1 -1
  139. package/templates/kits/nestjs-standard/tsconfig.build.json.j2 +1 -1
  140. package/templates/kits/nestjs-standard/tsconfig.json.j2 +1 -1
  141. package/dist/analyze-5BU4QIPK.js +0 -1
  142. package/dist/autopilot-release-QYUOVB26.js +0 -1
  143. package/dist/chunk-54XJNLYC.js +0 -13
  144. package/dist/chunk-5SWNSJGW.js +0 -1
  145. package/dist/chunk-753LOKFZ.js +0 -2
  146. package/dist/chunk-AAKUNWPR.js +0 -78
  147. package/dist/chunk-AQ4XZZC6.js +0 -1
  148. package/dist/chunk-CVTCPPEF.js +0 -1
  149. package/dist/chunk-DNAY5ALC.js +0 -1
  150. package/dist/chunk-EWYYLJQY.js +0 -2
  151. package/dist/chunk-LO4C4VXR.js +0 -4
  152. package/dist/chunk-LYC6AIF2.js +0 -2
  153. package/dist/chunk-NAAQMSO3.js +0 -1
  154. package/dist/chunk-NFUXULIF.js +0 -1
  155. package/dist/chunk-OL64GWQC.js +0 -9
  156. package/dist/chunk-PI5KUXDA.js +0 -7
  157. package/dist/chunk-SI3AQKIP.js +0 -1
  158. package/dist/chunk-VZKSNUEE.js +0 -2
  159. package/dist/chunk-WU4ZRRA5.js +0 -4
  160. package/dist/chunk-XEJD4KCV.js +0 -33
  161. package/dist/demo-kit-AJ5LIM5G.js +0 -149
  162. package/dist/doctor-MF3M3FS3.js +0 -1
  163. package/dist/pipeline-QCUHFWDY.js +0 -5
  164. package/dist/workspace-agent-sync-KTYF3HQR.js +0 -1
  165. package/dist/workspace-archive-GCZNI44O.js +0 -3
  166. package/dist/workspace-context-QUTOP2XV.js +0 -1
  167. package/dist/workspace-explain-JEONEGZZ.js +0 -1
  168. package/dist/workspace-explain-contract-DNS2YEL7.js +0 -1
  169. package/dist/workspace-intelligence-QJGVL37U.js +0 -1
  170. package/dist/workspace-mcp-serve-AK4MYEHQ.js +0 -3
  171. package/dist/workspace-registry-summary-RUJE6RPH.js +0 -1
  172. package/dist/workspace-run-Y7YMUIHX.js +0 -1
  173. package/dist/workspace-watch-AGPOJ74Q.js +0 -1
@@ -0,0 +1,149 @@
1
+ import {c}from'./chunk-Y45WZR5N.js';import {b,a as a$1}from'./chunk-TQEMLBAG.js';import {promises}from'fs';import a from'path';import T from'nunjucks';import e from'chalk';import h from'ora';import {fileURLToPath}from'url';import {execa}from'execa';import G from'crypto';var J=fileURLToPath(import.meta.url),M=a.dirname(J);function O(t=32){let i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",x=G.randomBytes(t),o="";for(let p=0;p<t;p++)o+=i[x[p]%i.length];return o}async function te(t,i){let o=(i.template||"fastapi")==="fastapi",p=o?"FastAPI":"NestJS",d=i.kit_name||(o?"fastapi.standard":"nestjs.standard"),D=d.replace(".","/"),$=h(`Generating ${p} project...`).start();try{let w=a.resolve(M,".."),m;d==="fastapi.ddd"?m="fastapi-ddd":d.startsWith("fastapi")?m="fastapi-standard":m="nestjs-standard";let f=a.join(w,"templates","kits",m),S=T.configure(f,{autoescape:false,trimBlocks:true,lstripBlocks:true});S.addFilter("generate_secret",function(n,r=32){return O(r)});let F={project_name:i.project_name,author:i.author||"Workspai User",description:i.description||(o?"FastAPI service generated with Workspai":"NestJS application generated with Workspai"),app_version:i.app_version||"0.1.0",license:i.license||"MIT",package_manager:i.package_manager||"npm",node_version:i.node_version||"20.0.0",database_type:i.database_type||"postgresql",include_caching:i.include_caching||false,created_at:new Date().toISOString(),workspai_version:c(),rapidkit_version:c()},y;o?y=["src/main.py.j2","src/__init__.py.j2","src/cli.py.j2","src/routing/__init__.py.j2","src/routing/health.py.j2","src/routing/examples.py.j2","src/modules/__init__.py.j2","tests/__init__.py.j2","tests/test_health.py.j2","tests/test_examples.py.j2","README.md.j2","pyproject.toml.j2","Makefile.j2","env.example.j2","rapidkit.j2","rapidkit.cmd.j2"]:y=["src/main.ts.j2","src/app.module.ts.j2","src/app.controller.ts.j2","src/app.service.ts.j2","src/config/configuration.ts.j2","src/config/validation.ts.j2","src/config/index.ts.j2","src/modules/index.ts.j2","src/examples/examples.module.ts.j2","src/examples/examples.controller.ts.j2","src/examples/examples.service.ts.j2","src/examples/dto/create-note.dto.ts.j2","test/app.controller.spec.ts.j2","test/examples.controller.spec.ts.j2","test/app.e2e-spec.ts.j2","test/jest-e2e.json.j2","package.json.j2","tsconfig.json.j2","tsconfig.build.json.j2","nest-cli.json.j2","jest.config.ts.j2","eslint.config.cjs.j2","env.example.j2","docker-compose.yml.j2","Dockerfile.j2","README.md.j2","rapidkit.j2","rapidkit.cmd.j2"];for(let n of y){let r=a.join(f,n);try{await promises.access(r);}catch{continue}let _=await promises.readFile(r,"utf-8"),g;try{g=S.renderString(_,F);}catch(W){throw console.error(`Failed to render template: ${n}`),W}let c=n==="env.example.j2"?".env.example":n.replace(/\.j2$/,""),v=a.join(t,c);await promises.mkdir(a.dirname(v),{recursive:true}),await promises.writeFile(v,g),(c.endsWith(".workspai/rapidkit")||c.endsWith(".workspai/cli.py")||c.endsWith(".workspai/activate")||c.endsWith(".rapidkit/rapidkit")||c.endsWith(".rapidkit/cli.py")||c.endsWith(".rapidkit/activate")||c==="rapidkit")&&await promises.chmod(v,493);}if(o){let n=a.join(f,".rapidkit","context.json"),r=a.join(t,".workspai","context.json");try{await promises.mkdir(a.join(t,".workspai"),{recursive:true}),await promises.copyFile(n,r);}catch{await promises.mkdir(a.join(t,".workspai"),{recursive:true});let g=i.engine||"pip";await promises.writeFile(r,JSON.stringify({engine:g,created_by:"workspai-cli-fallback",legacyCreatedBy:"rapidkit-npm-fallback"},null,2));}}let I=a.join(t,".workspai");await promises.mkdir(I,{recursive:true});let R=a.join(I,"project.json"),C={kit_name:d,profile:D,created_at:new Date().toISOString(),created_by:"workspai-cli-fallback",workspai_version:c(),rapidkit_version:c(),runtime:o?"python":"node"},P=JSON.stringify(C,null,2);await promises.writeFile(R,P,"utf-8");let j=a.join(t,"rapidkit");await promises.access(j).then(()=>true).catch(()=>false)||(await promises.writeFile(j,`#!/usr/bin/env bash
2
+ set -euo pipefail
3
+ SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
4
+ cd "$SCRIPT_DIR"
5
+ RAPIDKIT_LOCAL_LAUNCHER_BYPASS=1 npx workspai "$@"
6
+ `),await promises.chmod(j,493));let b$1=a.join(t,"rapidkit.cmd");await promises.access(b$1).then(()=>true).catch(()=>false)||await promises.writeFile(b$1,`@echo off
7
+ set RAPIDKIT_LOCAL_LAUNCHER_BYPASS=1
8
+ npx workspai %*
9
+ `);let L=o?`# Python
10
+ __pycache__/
11
+ *.py[cod]
12
+ *$py.class
13
+ *.so
14
+ .Python
15
+ build/
16
+ develop-eggs/
17
+ dist/
18
+ downloads/
19
+ eggs/
20
+ .eggs/
21
+ lib/
22
+ lib64/
23
+ parts/
24
+ sdist/
25
+ var/
26
+ wheels/
27
+ *.egg-info/
28
+ .installed.cfg
29
+ *.egg
30
+
31
+ # Virtual environments
32
+ .venv/
33
+ venv/
34
+ ENV/
35
+ env/
36
+
37
+ # IDEs
38
+ .vscode/
39
+ .idea/
40
+ *.swp
41
+ *.swo
42
+ *~
43
+
44
+ # OS
45
+ .DS_Store
46
+ Thumbs.db
47
+
48
+ # Project specific
49
+ .env
50
+ .env.local
51
+ `:`# Node artifacts
52
+ node_modules/
53
+ dist/
54
+ .tmp/
55
+ .env
56
+ .env.*
57
+ !.env.example
58
+
59
+ # Logs
60
+ logs/
61
+ *.log
62
+ npm-debug.log*
63
+ yarn-debug.log*
64
+ yarn-error.log*
65
+ pnpm-debug.log*
66
+
67
+ # OS
68
+ .DS_Store
69
+ Thumbs.db
70
+
71
+ # IDEs
72
+ .idea/
73
+ .vscode/
74
+
75
+ # Coverage
76
+ coverage/
77
+ `;if(await promises.writeFile(a.join(t,".gitignore"),L),$.succeed(`${p} project generated!`),!i.skipGit){let n=h("Initializing git repository...").start();try{await b(t)?n.warn("Git initialization skipped because target is already inside a git worktree"):(await execa("git",["init"],{cwd:t,env:a$1()}),await execa("git",["add","."],{cwd:t,env:a$1()}),await execa("git",["commit","-m",`Initial commit: ${p} project via Workspai`],{cwd:t,env:a$1()}),n.succeed("Git repository initialized"));}catch{n.warn("Could not initialize git repository");}}if(!o&&!i.skipInstall){let n=i.package_manager||"npm",r=h(`Installing dependencies with ${n}...`).start();try{await execa(n,n==="yarn"?["install"]:n==="pnpm"?["install"]:["install"],{cwd:t}),r.succeed("Dependencies installed");}catch{r.warn(`Could not install dependencies. Run '${n} install' manually.`);}}let A=a.basename(t);console.log(`
78
+ ${e.yellow("\u26A0\uFE0F Limited offline mode:")} This project was created using basic templates.
79
+ ${e.gray("For full kit features, install Python 3.10+ and rapidkit-core:")}
80
+ ${e.cyan(" sudo apt install python3 python3-pip python3-venv")}
81
+ ${e.cyan(" pip install rapidkit-core")}
82
+ `),console.log(o?`
83
+ ${e.green("\u2728 FastAPI project created successfully!")}
84
+
85
+ ${e.bold("\u{1F4C2} Project structure:")}
86
+ ${t}/
87
+ \u251C\u2500\u2500 .workspai/ # Workspai metadata
88
+ \u251C\u2500\u2500 src/
89
+ \u2502 \u251C\u2500\u2500 main.py # FastAPI application
90
+ \u2502 \u251C\u2500\u2500 cli.py # CLI commands
91
+ \u2502 \u251C\u2500\u2500 routing/ # API routes
92
+ \u2502 \u2514\u2500\u2500 modules/ # Module system
93
+ \u251C\u2500\u2500 tests/ # Test suite
94
+ \u251C\u2500\u2500 pyproject.toml # Poetry configuration
95
+ \u2514\u2500\u2500 README.md
96
+
97
+ ${e.bold("\u{1F680} Get started:")}
98
+ ${e.cyan(`cd ${A}`)}
99
+ ${e.cyan("npx workspai init")} ${e.gray("# Install dependencies")}
100
+ ${e.cyan("npx workspai dev")} ${e.gray("# Start dev server")}
101
+
102
+ ${e.bold("\u{1F4DA} Available commands:")}
103
+ npx workspai init # Install dependencies (poetry install)
104
+ npx workspai dev # Start dev server with hot reload
105
+ npx workspai start # Start production server
106
+ npx workspai test # Run tests
107
+ npx workspai lint # Lint code
108
+ npx workspai format # Format code
109
+
110
+ ${e.gray("Alternative: make dev, npx workspai dev, poetry run dev")}
111
+ ${e.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
112
+ `:`
113
+ ${e.green("\u2728 NestJS project created successfully!")}
114
+
115
+ ${e.bold("\u{1F4C2} Project structure:")}
116
+ ${t}/
117
+ \u251C\u2500\u2500 .workspai/ # Workspai metadata
118
+ \u251C\u2500\u2500 src/
119
+ \u2502 \u251C\u2500\u2500 main.ts # Application entry point
120
+ \u2502 \u251C\u2500\u2500 app.module.ts # Root module
121
+ \u2502 \u251C\u2500\u2500 config/ # Configuration
122
+ \u2502 \u2514\u2500\u2500 examples/ # Example module
123
+ \u251C\u2500\u2500 test/ # Test files
124
+ \u251C\u2500\u2500 package.json # Dependencies
125
+ \u2514\u2500\u2500 README.md
126
+
127
+ ${e.bold("\u{1F680} Get started:")}
128
+ ${e.cyan(`cd ${A}`)}
129
+ ${e.cyan("npx workspai init")} ${e.gray("# Install dependencies")}
130
+ ${e.cyan("cp .env.example .env")}
131
+ ${e.cyan("npx workspai dev")} ${e.gray("# Start dev server")}
132
+
133
+ ${e.bold("\u{1F4DA} Available commands:")}
134
+ npx workspai init # Install dependencies
135
+ npx workspai dev # Start dev server with hot reload
136
+ npx workspai start # Start production server
137
+ npx workspai build # Build for production
138
+ npx workspai test # Run tests
139
+ npx workspai lint # Lint code
140
+ npx workspai format # Format code
141
+
142
+ ${e.bold("\u{1F310} API endpoints:")}
143
+ http://localhost:8000/health # Health check
144
+ http://localhost:8000/docs # Swagger docs
145
+ http://localhost:8000/examples/notes # Example API
146
+
147
+ ${e.gray("Alternative: npm run start:dev, npx workspai dev")}
148
+ ${e.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
149
+ `);}catch(w){throw $.fail(`Failed to generate ${p} project`),w}}export{te as generateDemoKit};
@@ -0,0 +1 @@
1
+ export{a as DOCTOR_WORKSPACE_REPORT_PATH,d as computeDoctorFixAwareExitCode,c as computeDoctorGateExitCode,b as resolveDoctorPolicyProfile,e as runDoctor}from'./chunk-YUX4YFGL.js';
@@ -1,4 +1,4 @@
1
- import {b,c}from'./chunk-IBJEQHJR.js';import {c as c$1}from'./chunk-Y45WZR5N.js';import {promises}from'fs';import n from'path';import i from'chalk';import b$1 from'ora';import {execa}from'execa';var C="net8.0",R="8080";function A(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-")}function j(e,r){return e.trim().replace(/[^A-Za-z0-9_.]+/g,".").replace(/^\.+|\.+$/g,"").replace(/\.{2,}/g,".").split(".").map(a=>a.replace(/^[^A-Za-z_]+/,"").replace(/[^A-Za-z0-9_]/g,"")).filter(Boolean).join(".")||r}function S(e,r){return e.replace(/[\r\n\t]+/g," ").trim()||r}function y(e){return /^net\d+\.\d+$/.test(e.trim())}function _(){return JSON.stringify({engine:"npm",runtime:"dotnet"},null,2)}function E(e,r){return JSON.stringify({kit_name:"dotnet.webapi.clean",runtime:"dotnet",framework:"dotnet",module_support:false,project_name:e.project_name,root_namespace:e.root_namespace,target_framework:e.target_framework,app_version:e.app_version,created_by:"workspai",workspai_version:r,rapidkit_version:r,created_at:new Date().toISOString()},null,2)}function D(e){return `<Project Sdk="Microsoft.NET.Sdk.Web">
1
+ import {b,c}from'./chunk-IBJEQHJR.js';import {c as c$1}from'./chunk-Y45WZR5N.js';import {b as b$1,a}from'./chunk-TQEMLBAG.js';import {promises}from'fs';import n from'path';import i from'chalk';import R from'ora';import {execa}from'execa';var A="net8.0",S="8080";function j(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-")}function y(e,r){return e.trim().replace(/[^A-Za-z0-9_.]+/g,".").replace(/^\.+|\.+$/g,"").replace(/\.{2,}/g,".").split(".").map(a=>a.replace(/^[^A-Za-z_]+/,"").replace(/[^A-Za-z0-9_]/g,"")).filter(Boolean).join(".")||r}function _(e,r){return e.replace(/[\r\n\t]+/g," ").trim()||r}function E(e){return /^net\d+\.\d+$/.test(e.trim())}function D(){return JSON.stringify({engine:"npm",runtime:"dotnet"},null,2)}function $(e,r){return JSON.stringify({kit_name:"dotnet.webapi.clean",runtime:"dotnet",framework:"dotnet",module_support:false,project_name:e.project_name,root_namespace:e.root_namespace,target_framework:e.target_framework,app_version:e.app_version,created_by:"workspai",workspai_version:r,rapidkit_version:r,created_at:new Date().toISOString()},null,2)}function I(e){return `<Project Sdk="Microsoft.NET.Sdk.Web">
2
2
  <PropertyGroup>
3
3
  <TargetFramework>${e.target_framework}</TargetFramework>
4
4
  <Nullable>enable</Nullable>
@@ -16,7 +16,7 @@ import {b,c}from'./chunk-IBJEQHJR.js';import {c as c$1}from'./chunk-Y45WZR5N.js'
16
16
  <PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
17
17
  </ItemGroup>
18
18
  </Project>
19
- `}function $(e){return `<Project Sdk="Microsoft.NET.Sdk">
19
+ `}function P(e){return `<Project Sdk="Microsoft.NET.Sdk">
20
20
  <PropertyGroup>
21
21
  <TargetFramework>${e.target_framework}</TargetFramework>
22
22
  <ImplicitUsings>enable</ImplicitUsings>
@@ -36,7 +36,7 @@ import {b,c}from'./chunk-IBJEQHJR.js';import {c as c$1}from'./chunk-Y45WZR5N.js'
36
36
  <ProjectReference Include="..\\src\\${e.project_name}.csproj" />
37
37
  </ItemGroup>
38
38
  </Project>
39
- `}function I(e){return `using ${e.root_namespace}.Application;
39
+ `}function k(e){return `using ${e.root_namespace}.Application;
40
40
  using ${e.root_namespace}.Infrastructure;
41
41
  using ${e.root_namespace}.Presentation;
42
42
 
@@ -69,7 +69,7 @@ app.Run();
69
69
  public partial class Program
70
70
  {
71
71
  }
72
- `}function P(e){return `namespace ${e.root_namespace}.Application;
72
+ `}function w(e){return `namespace ${e.root_namespace}.Application;
73
73
 
74
74
  public sealed class ApplicationInfoOptions
75
75
  {
@@ -81,7 +81,7 @@ public sealed class ApplicationInfoOptions
81
81
 
82
82
  public string Description { get; init; } = "${e.description}";
83
83
  }
84
- `}function k(e){return `using Microsoft.Extensions.DependencyInjection;
84
+ `}function T(e){return `using Microsoft.Extensions.DependencyInjection;
85
85
 
86
86
  namespace ${e.root_namespace}.Application;
87
87
 
@@ -93,7 +93,7 @@ public static class ApplicationServiceRegistration
93
93
  return services;
94
94
  }
95
95
  }
96
- `}function T(e){return `using Microsoft.Extensions.Options;
96
+ `}function x(e){return `using Microsoft.Extensions.Options;
97
97
 
98
98
  namespace ${e.root_namespace}.Application;
99
99
 
@@ -117,7 +117,7 @@ public sealed class SystemInfoService(IOptions<ApplicationInfoOptions> options)
117
117
  DateTimeOffset.UtcNow);
118
118
  }
119
119
  }
120
- `}function w(e){return `using Microsoft.Extensions.DependencyInjection;
120
+ `}function v(e){return `using Microsoft.Extensions.DependencyInjection;
121
121
 
122
122
  namespace ${e.root_namespace}.Infrastructure;
123
123
 
@@ -128,7 +128,7 @@ public static class InfrastructureServiceRegistration
128
128
  return services;
129
129
  }
130
130
  }
131
- `}function x(e){return `using Microsoft.AspNetCore.Diagnostics;
131
+ `}function N(e){return `using Microsoft.AspNetCore.Diagnostics;
132
132
  using Microsoft.AspNetCore.Http;
133
133
  using Microsoft.Extensions.DependencyInjection;
134
134
 
@@ -162,7 +162,7 @@ internal sealed class GlobalExceptionHandler : IExceptionHandler
162
162
  return true;
163
163
  }
164
164
  }
165
- `}function v(e){return `using ${e.root_namespace}.Application;
165
+ `}function h(e){return `using ${e.root_namespace}.Application;
166
166
 
167
167
  namespace ${e.root_namespace}.Presentation;
168
168
 
@@ -180,7 +180,7 @@ public static class SystemEndpoints
180
180
  return app;
181
181
  }
182
182
  }
183
- `}function d(e){return JSON.stringify({Workspai:{Name:e.project_name,Version:e.app_version,Description:e.description},Logging:{LogLevel:{Default:"Information","Microsoft.AspNetCore":"Warning"}},AllowedHosts:"*",Kestrel:{Endpoints:{Http:{Url:`http://0.0.0.0:${e.port}`}}}},null,2)}function N(e){return `FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
183
+ `}function g(e){return JSON.stringify({Workspai:{Name:e.project_name,Version:e.app_version,Description:e.description},Logging:{LogLevel:{Default:"Information","Microsoft.AspNetCore":"Warning"}},AllowedHosts:"*",Kestrel:{Endpoints:{Http:{Url:`http://0.0.0.0:${e.port}`}}}},null,2)}function V(e){return `FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
184
184
  WORKDIR /src
185
185
  COPY src/*.csproj ./src/
186
186
  COPY tests/*.csproj ./tests/
@@ -197,7 +197,7 @@ ENV ASPNETCORE_URLS=http://+:${e.port}
197
197
  COPY --from=build /app/publish .
198
198
  HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -fsS http://localhost:${e.port}/health/live || exit 1
199
199
  ENTRYPOINT ["dotnet", "${e.root_namespace}.dll"]
200
- `}function h(e){return `services:
200
+ `}function U(e){return `services:
201
201
  api:
202
202
  build: .
203
203
  ports:
@@ -210,7 +210,7 @@ ENTRYPOINT ["dotnet", "${e.root_namespace}.dll"]
210
210
  interval: 30s
211
211
  timeout: 5s
212
212
  retries: 3
213
- `}function V(e){return `.PHONY: init dev start build test lint format docker-up docker-down
213
+ `}function O(e){return `.PHONY: init dev start build test lint format docker-up docker-down
214
214
 
215
215
  init:
216
216
  dotnet restore src/${e.project_name}.csproj
@@ -241,7 +241,7 @@ docker-up:
241
241
 
242
242
  docker-down:
243
243
  docker compose down
244
- `}function U(e){return `#!/usr/bin/env sh
244
+ `}function W(e){return `#!/usr/bin/env sh
245
245
  SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
246
246
  CMD="\${1:-help}"
247
247
  shift 2>/dev/null || true
@@ -270,7 +270,7 @@ case "$CMD" in
270
270
  ;;
271
271
  *) echo "rapidkit: unknown command: $CMD" >&2; exit 1 ;;
272
272
  esac
273
- `}function O(e){return `@echo off
273
+ `}function M(e){return `@echo off
274
274
  set CMD=%1
275
275
  if "%CMD%"=="" set CMD=help
276
276
  shift
@@ -300,7 +300,7 @@ if "%CMD%"=="format" (
300
300
 
301
301
  echo Available: init, dev, start, build, test, lint, format
302
302
  exit /b 1
303
- `}function W(e){return `name: CI
303
+ `}function G(e){return `name: CI
304
304
 
305
305
  on:
306
306
  push:
@@ -330,7 +330,7 @@ jobs:
330
330
  run: dotnet build src/${e.project_name}.csproj -c Release --no-restore
331
331
  - name: Test
332
332
  run: dotnet test tests/${e.project_name}.Tests.csproj -c Release --no-build --collect:"XPlat Code Coverage"
333
- `}function M(e){return `using System.Net;
333
+ `}function F(e){return `using System.Net;
334
334
  using Microsoft.AspNetCore.Mvc.Testing;
335
335
  using Xunit;
336
336
 
@@ -361,7 +361,7 @@ public sealed class RuntimeSmokeTests : IClassFixture<WebApplicationFactory<Prog
361
361
  Assert.Equal(HttpStatusCode.OK, response.StatusCode);
362
362
  }
363
363
  }
364
- `}function G(e){return `
364
+ `}function L(e){return `
365
365
  Microsoft Visual Studio Solution File, Format Version 12.00
366
366
  # Visual Studio Version 17
367
367
  VisualStudioVersion = 17.0.31903.59
@@ -417,9 +417,9 @@ Global
417
417
  {22222222-2222-2222-2222-222222222222} = {44444444-4444-4444-4444-444444444444}
418
418
  EndGlobalSection
419
419
  EndGlobal
420
- `.trimStart()}async function F(e,r){if(!r)try{await execa("git",["init"],{cwd:e,stdio:"ignore"});}catch{console.log(i.gray("\u26A0 git init skipped (git not found or error)"));}}async function L(e){try{await execa("dotnet",["--version"],{cwd:e,timeout:3e3,stdio:"pipe"});}catch{console.log(i.yellow("\u26A0 .NET SDK not found in PATH - project scaffolded, but init/build need .NET 8+")),console.log(i.gray(" Install: https://dotnet.microsoft.com/download"));}}async function Q(e,r){let s=A(r.project_name)||"dotnet-api",c$2=j(r.root_namespace||`Workspai.${b(s)}`,"Workspai.App"),a=r.target_framework&&y(r.target_framework)?r.target_framework:C,g=r.port&&/^\d+$/.test(r.port)?r.port:R,o={project_name:s,root_namespace:c$2,description:S(r.description||"","Production-ready ASP.NET Core Web API scaffolded by Workspai."),target_framework:a,app_version:r.app_version||"0.1.0",port:g,skipGit:r.skipGit??false},f=b$1(`Creating ASP.NET Core Web API project ${s}`).start();await promises.mkdir(e,{recursive:true}),await c(n.join(e,`${s}.sln`),G(o)),await c(n.join(e,"src",`${s}.csproj`),D(o)),await c(n.join(e,"src","Program.cs"),I(o)),await c(n.join(e,"src","Application","ApplicationInfoOptions.cs"),P(o)),await c(n.join(e,"src","Application","ApplicationServiceRegistration.cs"),k(o)),await c(n.join(e,"src","Application","SystemInfoService.cs"),T(o)),await c(n.join(e,"src","Infrastructure","InfrastructureServiceRegistration.cs"),w(o)),await c(n.join(e,"src","Presentation","PresentationServiceRegistration.cs"),x(o)),await c(n.join(e,"src","Presentation","SystemEndpoints.cs"),v(o)),await c(n.join(e,"src","appsettings.json"),d(o)),await c(n.join(e,"src","appsettings.Development.json"),d(o)),await c(n.join(e,"tests",`${s}.Tests.csproj`),$(o)),await c(n.join(e,"tests","RuntimeSmokeTests.cs"),M(o)),await c(n.join(e,"Dockerfile"),N(o)),await c(n.join(e,"docker-compose.yml"),h(o)),await c(n.join(e,"Makefile"),V(o)),await c(n.join(e,"rapidkit"),U(o)),await c(n.join(e,"rapidkit.cmd"),O(o)),await c(n.join(e,".env.example"),`ASPNETCORE_ENVIRONMENT=Development
420
+ `.trimStart()}async function H(e,r){if(!r)try{if(await b$1(e)){console.log(i.gray("\u26A0 git init skipped (target is inside an existing git worktree)"));return}await execa("git",["init"],{cwd:e,stdio:"ignore",env:a()});}catch{console.log(i.gray("\u26A0 git init skipped (git not found or error)"));}}async function B(e){try{await execa("dotnet",["--version"],{cwd:e,timeout:3e3,stdio:"pipe"});}catch{console.log(i.yellow("\u26A0 .NET SDK not found in PATH - project scaffolded, but init/build need .NET 8+")),console.log(i.gray(" Install: https://dotnet.microsoft.com/download"));}}async function ne(e,r){let s=j(r.project_name)||"dotnet-api",c$2=y(r.root_namespace||`Workspai.${b(s)}`,"Workspai.App"),a=r.target_framework&&E(r.target_framework)?r.target_framework:A,b$1=r.port&&/^\d+$/.test(r.port)?r.port:S,o={project_name:s,root_namespace:c$2,description:_(r.description||"","Production-ready ASP.NET Core Web API scaffolded by Workspai."),target_framework:a,app_version:r.app_version||"0.1.0",port:b$1,skipGit:r.skipGit??false},C=R(`Creating ASP.NET Core Web API project ${s}`).start();await promises.mkdir(e,{recursive:true}),await c(n.join(e,`${s}.sln`),L(o)),await c(n.join(e,"src",`${s}.csproj`),I(o)),await c(n.join(e,"src","Program.cs"),k(o)),await c(n.join(e,"src","Application","ApplicationInfoOptions.cs"),w(o)),await c(n.join(e,"src","Application","ApplicationServiceRegistration.cs"),T(o)),await c(n.join(e,"src","Application","SystemInfoService.cs"),x(o)),await c(n.join(e,"src","Infrastructure","InfrastructureServiceRegistration.cs"),v(o)),await c(n.join(e,"src","Presentation","PresentationServiceRegistration.cs"),N(o)),await c(n.join(e,"src","Presentation","SystemEndpoints.cs"),h(o)),await c(n.join(e,"src","appsettings.json"),g(o)),await c(n.join(e,"src","appsettings.Development.json"),g(o)),await c(n.join(e,"tests",`${s}.Tests.csproj`),P(o)),await c(n.join(e,"tests","RuntimeSmokeTests.cs"),F(o)),await c(n.join(e,"Dockerfile"),V(o)),await c(n.join(e,"docker-compose.yml"),U(o)),await c(n.join(e,"Makefile"),O(o)),await c(n.join(e,"rapidkit"),W(o)),await c(n.join(e,"rapidkit.cmd"),M(o)),await c(n.join(e,".env.example"),`ASPNETCORE_ENVIRONMENT=Development
421
421
  PORT=${o.port}
422
- `),await c(n.join(e,".github","workflows","ci.yml"),W(o)),await c(n.join(e,".workspai","context.json"),_()),await c(n.join(e,".workspai","project.json"),E(o,c$1())),process.platform!=="win32"&&await promises.chmod(n.join(e,"rapidkit"),493),await F(e,o.skipGit),f.succeed("ASP.NET Core Web API project ready"),await L(e),console.log(i.green(`
422
+ `),await c(n.join(e,".github","workflows","ci.yml"),G(o)),await c(n.join(e,".workspai","context.json"),D()),await c(n.join(e,".workspai","project.json"),$(o,c$1())),process.platform!=="win32"&&await promises.chmod(n.join(e,"rapidkit"),493),await H(e,o.skipGit),C.succeed("ASP.NET Core Web API project ready"),await B(e),console.log(i.green(`
423
423
  \u2705 ASP.NET Core project ready!
424
424
  `)),console.log(i.gray("Next steps:")),console.log(i.white(` cd ${s}`)),console.log(i.white(" npx workspai init")),console.log(i.white(" npx workspai dev")),console.log(i.gray(`
425
- Endpoints: /health/live, /health/ready, /api/v1/system/info, /docs`)),console.log(i.gray("\u2139 RapidKit Core modules are not available for .NET projects yet."));}export{R as DEFAULT_DOTNET_PORT,C as DEFAULT_DOTNET_TARGET_FRAMEWORK,Q as generateDotnetWebApiCleanKit};
425
+ Endpoints: /health/live, /health/ready, /api/v1/system/info, /docs`)),console.log(i.gray("\u2139 RapidKit Core modules are not available for .NET projects yet."));}export{S as DEFAULT_DOTNET_PORT,A as DEFAULT_DOTNET_TARGET_FRAMEWORK,ne as generateDotnetWebApiCleanKit};
@@ -1,4 +1,4 @@
1
- import {c as c$1,b,d as d$1,e,f,a}from'./chunk-IBJEQHJR.js';import {c}from'./chunk-Y45WZR5N.js';import {promises}from'fs';import d from'path';import o from'chalk';import S from'ora';import {execa}from'execa';function _(e){return `package main
1
+ import {c as c$1,b as b$1,d,e,f,a as a$1}from'./chunk-IBJEQHJR.js';import {c}from'./chunk-Y45WZR5N.js';import {b,a}from'./chunk-TQEMLBAG.js';import {promises}from'fs';import p from'path';import o from'chalk';import T from'ora';import {execa}from'execa';function q(e){return `package main
2
2
 
3
3
  import (
4
4
  "fmt"
@@ -52,7 +52,7 @@ func main() {
52
52
  }
53
53
  slog.Info("server stopped")
54
54
  }
55
- `}function T(e){return `module ${e.module_path}
55
+ `}function O(e){return `module ${e.module_path}
56
56
 
57
57
  go ${e.go_version}
58
58
 
@@ -61,7 +61,7 @@ require (
61
61
  github.com/swaggo/fiber-swagger v1.3.0
62
62
  github.com/swaggo/swag v1.16.3
63
63
  )
64
- `}function q(e){return `package config
64
+ `}function y(e){return `package config
65
65
 
66
66
  import (
67
67
  "log/slog"
@@ -114,7 +114,7 @@ func getEnv(key, fallback string) string {
114
114
  }
115
115
  return fallback
116
116
  }
117
- `}function O(e){return `package server
117
+ `}function C(e){return `package server
118
118
 
119
119
  import (
120
120
  "net/http"
@@ -180,7 +180,7 @@ func NewApp(cfg *config.Config) *fiber.App {
180
180
 
181
181
  return app
182
182
  }
183
- `}function y(){return `package handlers
183
+ `}function N(){return `package handlers
184
184
 
185
185
  import (
186
186
  "time"
@@ -218,7 +218,7 @@ func Readiness(c *fiber.Ctx) error {
218
218
  "time": time.Now().UTC().Format(time.RFC3339),
219
219
  })
220
220
  }
221
- `}function C(e){return `package handlers_test
221
+ `}function E(e){return `package handlers_test
222
222
 
223
223
  import (
224
224
  "encoding/json"
@@ -267,7 +267,7 @@ func TestReadiness(t *testing.T) {
267
267
  t.Fatalf("expected 200, got %d: %s", resp.StatusCode, resp.Status)
268
268
  }
269
269
  }
270
- `}function N(){return `# \u2500\u2500 Build stage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
270
+ `}function L(){return `# \u2500\u2500 Build stage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
271
271
  FROM golang:1.24-alpine AS builder
272
272
 
273
273
  # Build-time version injection
@@ -296,7 +296,7 @@ EXPOSE 3000
296
296
  HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\
297
297
  CMD wget -qO- http://localhost:3000/api/v1/health/live || exit 1
298
298
  ENTRYPOINT ["/server"]
299
- `}function E(e){return `version: "3.9"
299
+ `}function G(e){return `version: "3.9"
300
300
 
301
301
  services:
302
302
  api:
@@ -311,7 +311,7 @@ services:
311
311
  CORS_ALLOW_ORIGINS: "*"
312
312
  RATE_LIMIT_RPS: "100"
313
313
  restart: unless-stopped
314
- `}function L(e){return d$1({projectName:e.project_name,devCommand:"$(GOBIN)/air",runCommand:"go run $(LDFLAGS) ./cmd/server",testCommand:"go test ./... -v -race",includeLintAndFmt:true})}function G(e){return `# Application
314
+ `}function A(e){return d({projectName:e.project_name,devCommand:"$(GOBIN)/air",runCommand:"go run $(LDFLAGS) ./cmd/server",testCommand:"go test ./... -v -race",includeLintAndFmt:true})}function I(e){return `# Application
315
315
  PORT=${e.port}
316
316
  APP_ENV=development
317
317
  LOG_LEVEL=debug
@@ -321,7 +321,7 @@ CORS_ALLOW_ORIGINS=*
321
321
 
322
322
  # Rate limiting \u2014 max requests per IP per second
323
323
  RATE_LIMIT_RPS=100
324
- `}function A(){return `# Binaries
324
+ `}function k(){return `# Binaries
325
325
  bin/
326
326
  *.exe
327
327
  *.exe~
@@ -361,7 +361,7 @@ docs/docs.go
361
361
  # OS
362
362
  .DS_Store
363
363
  Thumbs.db
364
- `}function I(e){return `name: CI
364
+ `}function F(e){return `name: CI
365
365
 
366
366
  on:
367
367
  push:
@@ -415,7 +415,7 @@ jobs:
415
415
  uses: golangci/golangci-lint-action@v6
416
416
  with:
417
417
  version: latest
418
- `}function k(e){return `# ${b(e.project_name)}
418
+ `}function x(e){return `# ${b$1(e.project_name)}
419
419
 
420
420
  > ${e.description}
421
421
 
@@ -530,7 +530,7 @@ ${e.project_name}/
530
530
  ## License
531
531
 
532
532
  ${e.app_version} \xB7 ${e.author}
533
- `}function F(){return `package middleware
533
+ `}function P(){return `package middleware
534
534
 
535
535
  import (
536
536
  "crypto/rand"
@@ -583,7 +583,7 @@ func newID() string {
583
583
  }
584
584
  return hex.EncodeToString(b)
585
585
  }
586
- `}function x(e){return `package middleware_test
586
+ `}function D(e){return `package middleware_test
587
587
 
588
588
  import (
589
589
  "net/http"
@@ -636,7 +636,7 @@ func TestRequestID_IsReused(t *testing.T) {
636
636
  t.Fatalf("expected X-Request-ID to be reused, got %q", id)
637
637
  }
638
638
  }
639
- `}function P(){return `// Package apierr provides a consistent JSON error envelope for all API responses.
639
+ `}function M(){return `// Package apierr provides a consistent JSON error envelope for all API responses.
640
640
  //
641
641
  // Every error response looks like:
642
642
  //
@@ -700,7 +700,7 @@ func InternalError(c *fiber.Ctx, _ error) error {
700
700
  func TooManyRequests(c *fiber.Ctx, msg string) error {
701
701
  return reply(c, http.StatusTooManyRequests, msg, "TOO_MANY_REQUESTS")
702
702
  }
703
- `}function D(e){return `package apierr_test
703
+ `}function B(e){return `package apierr_test
704
704
 
705
705
  import (
706
706
  "encoding/json"
@@ -832,11 +832,11 @@ func TestTooManyRequests(t *testing.T) {
832
832
  t.Fatalf("expected TOO_MANY_REQUESTS, got %q", body.Code)
833
833
  }
834
834
  }
835
- `}function M(e){return `// Package docs provides the swaggo-generated OpenAPI specification.
835
+ `}function $(e){return `// Package docs provides the swaggo-generated OpenAPI specification.
836
836
  //
837
837
  // Run \`make docs\` to regenerate after changing handler annotations.
838
838
  //
839
- // @title ${b(e.project_name)} API
839
+ // @title ${b$1(e.project_name)} API
840
840
  // @version ${e.app_version}
841
841
  // @description ${e.description}
842
842
  // @host localhost:${e.port}
@@ -846,7 +846,7 @@ func TestTooManyRequests(t *testing.T) {
846
846
  // @contact.name ${e.author}
847
847
  // @license.name MIT
848
848
  package docs
849
- `}function B(e){return `package handlers
849
+ `}function j(e){return `package handlers
850
850
 
851
851
  import (
852
852
  "net/http"
@@ -888,7 +888,7 @@ func EchoParams(c *fiber.Ctx) error {
888
888
  RequestID: rid,
889
889
  })
890
890
  }
891
- `}function $(e){return `package handlers_test
891
+ `}function H(e){return `package handlers_test
892
892
 
893
893
  import (
894
894
  "encoding/json"
@@ -956,7 +956,7 @@ func TestEchoParams_EmptyName(t *testing.T) {
956
956
  t.Fatalf("expected code=BAD_REQUEST, got %v", body["code"])
957
957
  }
958
958
  }
959
- `}function j(e){return `package config_test
959
+ `}function U(e){return `package config_test
960
960
 
961
961
  import (
962
962
  "log/slog"
@@ -1024,7 +1024,7 @@ func TestLoad_Defaults(t *testing.T) {
1024
1024
  t.Errorf("expected default LogLevel=debug (development env), got %q", cfg.LogLevel)
1025
1025
  }
1026
1026
  }
1027
- `}function H(){return `package middleware
1027
+ `}function V(){return `package middleware
1028
1028
 
1029
1029
  import (
1030
1030
  "os"
@@ -1052,7 +1052,7 @@ func CORS() fiber.Handler {
1052
1052
  MaxAge: 600,
1053
1053
  })
1054
1054
  }
1055
- `}function U(e){return `package middleware_test
1055
+ `}function J(e){return `package middleware_test
1056
1056
 
1057
1057
  import (
1058
1058
  "net/http"
@@ -1124,7 +1124,7 @@ func TestCORS_Default_Origin(t *testing.T) {
1124
1124
  t.Fatal("expected CORS header when origins defaulting to *")
1125
1125
  }
1126
1126
  }
1127
- `}function V(e){return `package server_test
1127
+ `}function W(e){return `package server_test
1128
1128
 
1129
1129
  import (
1130
1130
  "encoding/json"
@@ -1213,7 +1213,7 @@ func TestServer_Docs_Redirect(t *testing.T) {
1213
1213
  t.Fatalf("expected Location=/docs/index.html, got %q", loc)
1214
1214
  }
1215
1215
  }
1216
- `}function J(e){return `package middleware
1216
+ `}function K(e){return `package middleware
1217
1217
 
1218
1218
  import (
1219
1219
  "os"
@@ -1246,7 +1246,7 @@ func RateLimit() fiber.Handler {
1246
1246
  },
1247
1247
  })
1248
1248
  }
1249
- `}function W(e){return `package middleware_test
1249
+ `}function X(e){return `package middleware_test
1250
1250
 
1251
1251
  import (
1252
1252
  "net/http"
@@ -1322,7 +1322,7 @@ func TestRateLimit_InvalidRPS(t *testing.T) {
1322
1322
  t.Fatalf("expected 200 with invalid RPS env, got %d", resp.StatusCode)
1323
1323
  }
1324
1324
  }
1325
- `}function K(e){return `# Air \u2014 live reload for Go projects
1325
+ `}function Q(e){return `# Air \u2014 live reload for Go projects
1326
1326
  # https://github.com/air-verse/air
1327
1327
  root = "."
1328
1328
  tmp_dir = "tmp"
@@ -1346,7 +1346,7 @@ tmp_dir = "tmp"
1346
1346
 
1347
1347
  [log]
1348
1348
  time = false
1349
- `}function X(e){return `run:
1349
+ `}function Y(e){return `run:
1350
1350
  timeout: 5m
1351
1351
 
1352
1352
  linters:
@@ -1392,6 +1392,6 @@ issues:
1392
1392
  linters:
1393
1393
  - errcheck
1394
1394
  - wrapcheck
1395
- `}function Q(){return JSON.stringify({engine:"npm",runtime:"go"},null,2)}function Y(e$1){return e({runtimeLabel:"Go/Fiber",projectName:e$1.project_name,fallbackDevCommand:'exec go run ./cmd/server "$@"'})}function z(e){return f({runtimeLabel:"Go/Fiber",projectName:e.project_name})}function Z(e,i){return JSON.stringify({kit_name:"gofiber.standard",runtime:"go",module_support:false,project_name:e.project_name,module_path:e.module_path,app_version:e.app_version,created_by:"workspai",workspai_version:i,rapidkit_version:i,created_at:new Date().toISOString()},null,2)}async function pe(e,i){let r={project_name:i.project_name,module_path:i.module_path||i.project_name,author:i.author||"Workspai User",description:i.description||`Go/Fiber REST API \u2014 ${i.project_name}`,go_version:i.go_version||a,app_version:i.app_version||"0.1.0",port:i.port||"3000",skipGit:i.skipGit??false,skipInstall:i.skipInstall??false},h=c();try{await execa("go",["version"],{timeout:3e3});}catch{console.log(o.yellow("\n\u26A0 Go not found in PATH \u2014 project will be scaffolded, but `go mod tidy` requires Go 1.21+")),console.log(o.gray(` Install: https://go.dev/dl/
1396
- `));}let n=S(`Generating Go/Fiber project: ${r.project_name}\u2026`).start();try{let t=(w,R)=>c$1(d.join(e,w),R),b=d.join(e,"rapidkit"),v=d.join(e,"rapidkit.cmd");if(await Promise.all([t("cmd/server/main.go",_(r)),t("go.mod",T(r)),t("internal/config/config.go",q(r)),t("internal/server/server.go",O(r)),t("internal/middleware/requestid.go",F()),t("internal/middleware/requestid_test.go",x(r)),t("internal/apierr/apierr.go",P()),t("internal/apierr/apierr_test.go",D(r)),t("internal/handlers/health.go",y()),t("internal/handlers/health_test.go",C(r)),t("internal/handlers/example.go",B(r)),t("internal/handlers/example_test.go",$(r)),t("internal/config/config_test.go",j(r)),t("internal/middleware/cors.go",H()),t("internal/middleware/cors_test.go",U(r)),t("internal/middleware/ratelimit.go",J(r)),t("internal/middleware/ratelimit_test.go",W(r)),t("internal/server/server_test.go",V(r)),t("docs/doc.go",M(r)),t(".air.toml",K(r)),t("Dockerfile",N()),t("docker-compose.yml",E(r)),t("Makefile",L(r)),t(".golangci.yml",X(r.module_path)),t(".env.example",G(r)),t(".gitignore",A()),t(".github/workflows/ci.yml",I(r)),t("README.md",k(r)),t(".workspai/project.json",Z(r,h)),t(".workspai/context.json",Q()),t("rapidkit",Y(r)),t("rapidkit.cmd",z(r))]),await promises.chmod(b,493),await promises.chmod(v,493),n.succeed(o.green(`Project created at ${e}`)),r.skipInstall)n.info(o.gray("Skipped Go dependency warm-up (--skip-install)."));else try{n.start("Fetching Go dependencies\u2026"),await execa("go",["mod","tidy"],{cwd:e,timeout:12e4}),n.succeed(o.gray("\u2713 go mod tidy completed"));}catch{n.warn(o.yellow("\u26A0 go mod tidy failed \u2014 run manually: go mod tidy"));}if(!r.skipGit)try{await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","chore: initial scaffold (rapidkit gofiber.standard)"],{cwd:e}),console.log(o.gray("\u2713 git repository initialized"));}catch{console.log(o.gray("\u26A0 git init skipped (git not found or error)"));}console.log(""),console.log(o.bold("\u2705 Go/Fiber project ready!")),console.log(""),console.log(o.cyan("Next steps:")),console.log(o.white(` cd ${r.project_name}`)),console.log(o.white(" make run # start dev server")),console.log(o.white(" make test # run tests")),console.log(""),console.log(o.gray("Server will listen on port "+r.port)),console.log(o.gray(" http://localhost:"+r.port+"/api/v1/health/live")),console.log(o.gray(" http://localhost:"+r.port+"/api/v1/health/ready")),console.log(""),console.log(o.yellow("\u2139 RapidKit Core modules are not available for Go projects (module system uses Python/pip).")),console.log("");}catch(t){throw n.fail(o.red("Failed to generate Go/Fiber project")),t}}
1397
- export{pe as generateGoFiberKit};
1395
+ `}function z(){return JSON.stringify({engine:"npm",runtime:"go"},null,2)}function Z(e$1){return e({runtimeLabel:"Go/Fiber",projectName:e$1.project_name,fallbackDevCommand:'exec go run ./cmd/server "$@"'})}function ee(e){return f({runtimeLabel:"Go/Fiber",projectName:e.project_name})}function te(e,i){return JSON.stringify({kit_name:"gofiber.standard",runtime:"go",module_support:false,project_name:e.project_name,module_path:e.module_path,app_version:e.app_version,created_by:"workspai",workspai_version:i,rapidkit_version:i,created_at:new Date().toISOString()},null,2)}async function ce(e,i){let r={project_name:i.project_name,module_path:i.module_path||i.project_name,author:i.author||"Workspai User",description:i.description||`Go/Fiber REST API \u2014 ${i.project_name}`,go_version:i.go_version||a$1,app_version:i.app_version||"0.1.0",port:i.port||"3000",skipGit:i.skipGit??false,skipInstall:i.skipInstall??false},v=c();try{await execa("go",["version"],{timeout:3e3});}catch{console.log(o.yellow("\n\u26A0 Go not found in PATH \u2014 project will be scaffolded, but `go mod tidy` requires Go 1.21+")),console.log(o.gray(` Install: https://go.dev/dl/
1396
+ `));}let n=T(`Generating Go/Fiber project: ${r.project_name}\u2026`).start();try{let t=(S,_)=>c$1(p.join(e,S),_),w=p.join(e,"rapidkit"),R=p.join(e,"rapidkit.cmd");if(await Promise.all([t("cmd/server/main.go",q(r)),t("go.mod",O(r)),t("internal/config/config.go",y(r)),t("internal/server/server.go",C(r)),t("internal/middleware/requestid.go",P()),t("internal/middleware/requestid_test.go",D(r)),t("internal/apierr/apierr.go",M()),t("internal/apierr/apierr_test.go",B(r)),t("internal/handlers/health.go",N()),t("internal/handlers/health_test.go",E(r)),t("internal/handlers/example.go",j(r)),t("internal/handlers/example_test.go",H(r)),t("internal/config/config_test.go",U(r)),t("internal/middleware/cors.go",V()),t("internal/middleware/cors_test.go",J(r)),t("internal/middleware/ratelimit.go",K(r)),t("internal/middleware/ratelimit_test.go",X(r)),t("internal/server/server_test.go",W(r)),t("docs/doc.go",$(r)),t(".air.toml",Q(r)),t("Dockerfile",L()),t("docker-compose.yml",G(r)),t("Makefile",A(r)),t(".golangci.yml",Y(r.module_path)),t(".env.example",I(r)),t(".gitignore",k()),t(".github/workflows/ci.yml",F(r)),t("README.md",x(r)),t(".workspai/project.json",te(r,v)),t(".workspai/context.json",z()),t("rapidkit",Z(r)),t("rapidkit.cmd",ee(r))]),await promises.chmod(w,493),await promises.chmod(R,493),n.succeed(o.green(`Project created at ${e}`)),r.skipInstall)n.info(o.gray("Skipped Go dependency warm-up (--skip-install)."));else try{n.start("Fetching Go dependencies\u2026"),await execa("go",["mod","tidy"],{cwd:e,timeout:12e4}),n.succeed(o.gray("\u2713 go mod tidy completed"));}catch{n.warn(o.yellow("\u26A0 go mod tidy failed \u2014 run manually: go mod tidy"));}if(!r.skipGit)try{await b(e)?console.log(o.gray("\u26A0 git init skipped (target is inside an existing git worktree)")):(await execa("git",["init"],{cwd:e,env:a()}),await execa("git",["add","-A"],{cwd:e,env:a()}),await execa("git",["commit","-m","chore: initial scaffold (rapidkit gofiber.standard)"],{cwd:e,env:a()}),console.log(o.gray("\u2713 git repository initialized")));}catch{console.log(o.gray("\u26A0 git init skipped (git not found or error)"));}console.log(""),console.log(o.bold("\u2705 Go/Fiber project ready!")),console.log(""),console.log(o.cyan("Next steps:")),console.log(o.white(` cd ${r.project_name}`)),console.log(o.white(" make run # start dev server")),console.log(o.white(" make test # run tests")),console.log(""),console.log(o.gray("Server will listen on port "+r.port)),console.log(o.gray(" http://localhost:"+r.port+"/api/v1/health/live")),console.log(o.gray(" http://localhost:"+r.port+"/api/v1/health/ready")),console.log(""),console.log(o.yellow("\u2139 RapidKit Core modules are not available for Go projects (module system uses Python/pip).")),console.log("");}catch(t){throw n.fail(o.red("Failed to generate Go/Fiber project")),t}}
1397
+ export{ce as generateGoFiberKit};