workspai 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +624 -0
  3. package/contracts/agent-customization-pack.v1.json +229 -0
  4. package/contracts/analyze-last-run.v1.json +106 -0
  5. package/contracts/artifact-remediation-plan.v1.json +163 -0
  6. package/contracts/backend-import-stack-parity.snapshot.json +37 -0
  7. package/contracts/cli-log-event.v1.json +51 -0
  8. package/contracts/create-planner-capabilities.v1.json +251 -0
  9. package/contracts/doctor-project-evidence.v1.json +304 -0
  10. package/contracts/doctor-remediation-plan.v1.json +496 -0
  11. package/contracts/doctor-workspace-evidence.v1.json +315 -0
  12. package/contracts/extension-cli-compatibility.v1.json +26 -0
  13. package/contracts/infra-stack.v1.json +305 -0
  14. package/contracts/module-layout.v1.json +34 -0
  15. package/contracts/module-support.v1.json +20 -0
  16. package/contracts/pipeline-last-run.v1.json +80 -0
  17. package/contracts/release-readiness.v1.json +60 -0
  18. package/contracts/runtime-command-surface.v1.json +364 -0
  19. package/contracts/workspace-intelligence/agent-action-outcome.v1.json +38 -0
  20. package/contracts/workspace-intelligence/blocker-resolution.v1.json +65 -0
  21. package/contracts/workspace-intelligence/doctor-fix-result.v1.json +44 -0
  22. package/contracts/workspace-intelligence/fact-freshness.v1.json +58 -0
  23. package/contracts/workspace-intelligence/studio-blocker-handoff.v1.json +115 -0
  24. package/contracts/workspace-intelligence/workspace-context.v1.json +142 -0
  25. package/contracts/workspace-intelligence/workspace-contract-verify.v1.json +51 -0
  26. package/contracts/workspace-intelligence/workspace-dependency-graph.v1.json +152 -0
  27. package/contracts/workspace-intelligence/workspace-explain.v1.json +31 -0
  28. package/contracts/workspace-intelligence/workspace-impact.v1.json +114 -0
  29. package/contracts/workspace-intelligence/workspace-intelligence-history.v1.json +40 -0
  30. package/contracts/workspace-intelligence/workspace-model-diff.v1.json +105 -0
  31. package/contracts/workspace-intelligence/workspace-model-snapshot.v1.json +36 -0
  32. package/contracts/workspace-intelligence/workspace-model.v1.json +135 -0
  33. package/contracts/workspace-intelligence/workspace-operational-skill.v1.json +37 -0
  34. package/contracts/workspace-intelligence/workspace-skills-index.v1.json +27 -0
  35. package/contracts/workspace-intelligence/workspace-verify.v1.json +213 -0
  36. package/contracts/workspace-registry.v1.json +83 -0
  37. package/contracts/workspace-run-last.v1.json +112 -0
  38. package/data/modules-embeddings.json +16953 -0
  39. package/dist/analyze-5BU4QIPK.js +1 -0
  40. package/dist/artifact-remediation-plan-5GJWPPRS.js +3 -0
  41. package/dist/autopilot-release-QYUOVB26.js +1 -0
  42. package/dist/chunk-22DT744Z.js +1 -0
  43. package/dist/chunk-2E6WGUN6.js +1 -0
  44. package/dist/chunk-2FIX2MDC.js +1 -0
  45. package/dist/chunk-3KXW53QI.js +1 -0
  46. package/dist/chunk-3ZK2GU7C.js +1 -0
  47. package/dist/chunk-4KUIFXHM.js +5 -0
  48. package/dist/chunk-54XJNLYC.js +13 -0
  49. package/dist/chunk-5SWNSJGW.js +1 -0
  50. package/dist/chunk-5XATWNME.js +1 -0
  51. package/dist/chunk-753LOKFZ.js +2 -0
  52. package/dist/chunk-7YHK5NM3.js +2 -0
  53. package/dist/chunk-A5FBGRJA.js +1 -0
  54. package/dist/chunk-AAKUNWPR.js +78 -0
  55. package/dist/chunk-AFSZHLQT.js +1 -0
  56. package/dist/chunk-AQ4XZZC6.js +1 -0
  57. package/dist/chunk-CVTCPPEF.js +1 -0
  58. package/dist/chunk-DNAY5ALC.js +1 -0
  59. package/dist/chunk-EWYYLJQY.js +2 -0
  60. package/dist/chunk-GSWPGELT.js +2 -0
  61. package/dist/chunk-GZTYAEWX.js +1 -0
  62. package/dist/chunk-HTYMXMQM.js +1 -0
  63. package/dist/chunk-IBJEQHJR.js +205 -0
  64. package/dist/chunk-ICGWHIMK.js +1 -0
  65. package/dist/chunk-JEI6BTZI.js +3 -0
  66. package/dist/chunk-JHC6SCJC.js +1 -0
  67. package/dist/chunk-LO4C4VXR.js +4 -0
  68. package/dist/chunk-LPZFK3Y6.js +920 -0
  69. package/dist/chunk-LUP4U6EE.js +1 -0
  70. package/dist/chunk-LYC6AIF2.js +2 -0
  71. package/dist/chunk-LZQNVH7D.js +1 -0
  72. package/dist/chunk-NAAQMSO3.js +1 -0
  73. package/dist/chunk-NFUXULIF.js +1 -0
  74. package/dist/chunk-OCGZNSOE.js +1 -0
  75. package/dist/chunk-OJEWQO3Z.js +33 -0
  76. package/dist/chunk-OL64GWQC.js +9 -0
  77. package/dist/chunk-PI5KUXDA.js +7 -0
  78. package/dist/chunk-PYCJWW4B.js +1 -0
  79. package/dist/chunk-RE773WOX.js +13 -0
  80. package/dist/chunk-RO73VVHW.js +2 -0
  81. package/dist/chunk-S5KTATOU.js +1 -0
  82. package/dist/chunk-SI3AQKIP.js +1 -0
  83. package/dist/chunk-T3GJ7YVG.js +1 -0
  84. package/dist/chunk-T6OR6YOI.js +2 -0
  85. package/dist/chunk-VRDF2J46.js +653 -0
  86. package/dist/chunk-VZKSNUEE.js +2 -0
  87. package/dist/chunk-WU4ZRRA5.js +4 -0
  88. package/dist/chunk-XEJD4KCV.js +33 -0
  89. package/dist/chunk-XZGVNGRB.js +1 -0
  90. package/dist/chunk-Y45WZR5N.js +5 -0
  91. package/dist/create-WRZO4HK2.js +1 -0
  92. package/dist/demo-kit-AJ5LIM5G.js +149 -0
  93. package/dist/doctor-MF3M3FS3.js +1 -0
  94. package/dist/dotnet-webapi-clean-IPY3MCGQ.js +425 -0
  95. package/dist/gofiber-standard-N5N3QGH3.js +1397 -0
  96. package/dist/gogin-standard-LAWQTBWL.js +1459 -0
  97. package/dist/imported-projects-registry-FOIE27WT.js +1 -0
  98. package/dist/index.d.ts +141 -0
  99. package/dist/index.js +454 -0
  100. package/dist/managed-agent-markers-AXUM75OE.js +8 -0
  101. package/dist/module-layout-NZ43RSC5.js +1 -0
  102. package/dist/pipeline-QCUHFWDY.js +5 -0
  103. package/dist/platform-capabilities-XAVU4HSM.js +1 -0
  104. package/dist/pythonRapidkitExec-3L3XJBSY.js +1 -0
  105. package/dist/springboot-standard-OZYF7ZM7.js +697 -0
  106. package/dist/workspace-PR6VZRBG.js +1 -0
  107. package/dist/workspace-agent-sync-KTYF3HQR.js +1 -0
  108. package/dist/workspace-archive-GCZNI44O.js +3 -0
  109. package/dist/workspace-context-QUTOP2XV.js +1 -0
  110. package/dist/workspace-contract-XUGMCUSQ.js +1 -0
  111. package/dist/workspace-explain-JEONEGZZ.js +1 -0
  112. package/dist/workspace-explain-contract-DNS2YEL7.js +1 -0
  113. package/dist/workspace-feedback-R6H4UFZB.js +1 -0
  114. package/dist/workspace-foundation-KGSV4E6D.js +1 -0
  115. package/dist/workspace-graph-2A5THUCI.js +1 -0
  116. package/dist/workspace-history-CGCK2DJI.js +1 -0
  117. package/dist/workspace-intelligence-QJGVL37U.js +1 -0
  118. package/dist/workspace-marker-SMBC3Z2Q.js +1 -0
  119. package/dist/workspace-mcp-serve-AK4MYEHQ.js +3 -0
  120. package/dist/workspace-model-PNXXOGPO.js +1 -0
  121. package/dist/workspace-python-engine-state-MTWIIZPY.js +2 -0
  122. package/dist/workspace-registry-summary-RUJE6RPH.js +1 -0
  123. package/dist/workspace-run-Y7YMUIHX.js +1 -0
  124. package/dist/workspace-verify-WSDUUTR5.js +1 -0
  125. package/dist/workspace-watch-AGPOJ74Q.js +1 -0
  126. package/docs/AI_DYNAMIC_INTEGRATION.md +440 -0
  127. package/docs/AI_EXAMPLES.md +419 -0
  128. package/docs/AI_FEATURES.md +460 -0
  129. package/docs/AI_QUICKSTART.md +245 -0
  130. package/docs/DEVELOPMENT.md +90 -0
  131. package/docs/From Code to Shared Understanding.png +0 -0
  132. package/docs/OPEN_SOURCE_USER_SCENARIOS.md +170 -0
  133. package/docs/OPTIMIZATION_GUIDE.md +504 -0
  134. package/docs/PACKAGE_MANAGER_POLICY.md +25 -0
  135. package/docs/README.md +125 -0
  136. package/docs/SECURITY.md +63 -0
  137. package/docs/SETUP.md +107 -0
  138. package/docs/UTILITIES.md +221 -0
  139. package/docs/WORKSPACE_MARKER_SPEC.md +276 -0
  140. package/docs/ci-workflows.md +59 -0
  141. package/docs/commands-reference.md +172 -0
  142. package/docs/config-file-guide.md +299 -0
  143. package/docs/contracts/ARTIFACT_CATALOG.md +333 -0
  144. package/docs/contracts/CLI_LOG_EVENT_STREAM.md +123 -0
  145. package/docs/contracts/COMMAND_OWNERSHIP_MATRIX.md +138 -0
  146. package/docs/contracts/NAMING_AND_COEXISTENCE.md +60 -0
  147. package/docs/contracts/README.md +86 -0
  148. package/docs/contracts/RUNTIME_ACCEPTANCE_MATRIX.md +98 -0
  149. package/docs/contracts/RUNTIME_SUPPORT_MATRIX.md +75 -0
  150. package/docs/contracts/rapidkit-cli-contracts.json +239 -0
  151. package/docs/create-planner-capabilities.md +81 -0
  152. package/docs/doctor-command.md +467 -0
  153. package/docs/examples/ci-agent-grounding.yml +65 -0
  154. package/docs/from-code-to-shared-understanding.md +45 -0
  155. package/docs/governance-policy.enterprise.example.json +40 -0
  156. package/docs/mirror-config.enterprise.example.json +60 -0
  157. package/docs/policies.workspace.example.yml +23 -0
  158. package/docs/workspace-operations.md +160 -0
  159. package/docs/workspace-run.md +104 -0
  160. package/package.json +179 -0
  161. package/rapidkit.config.example.cjs +62 -0
  162. package/scripts/check-agent-customization-drift.mjs +78 -0
  163. package/scripts/check-cli-resolution.cjs +72 -0
  164. package/scripts/enforce-package-manager.cjs +10 -0
  165. package/scripts/enterprise-package-smoke.mjs +463 -0
  166. package/scripts/prepack-enterprise.mjs +43 -0
  167. package/templates/generator.js +179 -0
  168. package/templates/kits/fastapi-ddd/README.md.j2 +117 -0
  169. package/templates/kits/fastapi-ddd/common/env.example.j2 +10 -0
  170. package/templates/kits/fastapi-ddd/env.example.j2 +1 -0
  171. package/templates/kits/fastapi-ddd/pyproject.toml.j2 +64 -0
  172. package/templates/kits/fastapi-ddd/src/__init__.py.j2 +3 -0
  173. package/templates/kits/fastapi-ddd/src/app/__init__.py.j2 +11 -0
  174. package/templates/kits/fastapi-ddd/src/app/application/__init__.py.j2 +5 -0
  175. package/templates/kits/fastapi-ddd/src/app/application/interfaces.py.j2 +43 -0
  176. package/templates/kits/fastapi-ddd/src/app/application/use_cases/__init__.py.j2 +6 -0
  177. package/templates/kits/fastapi-ddd/src/app/application/use_cases/health.py.j2 +14 -0
  178. package/templates/kits/fastapi-ddd/src/app/application/use_cases/notes.py.j2 +24 -0
  179. package/templates/kits/fastapi-ddd/src/app/config/__init__.py.j2 +16 -0
  180. package/templates/kits/fastapi-ddd/src/app/domain/__init__.py.j2 +3 -0
  181. package/templates/kits/fastapi-ddd/src/app/domain/models/__init__.py.j2 +6 -0
  182. package/templates/kits/fastapi-ddd/src/app/domain/models/health.py.j2 +16 -0
  183. package/templates/kits/fastapi-ddd/src/app/domain/models/note.py.j2 +27 -0
  184. package/templates/kits/fastapi-ddd/src/app/infrastructure/__init__.py.j2 +5 -0
  185. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/__init__.py.j2 +6 -0
  186. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/health.py.j2 +17 -0
  187. package/templates/kits/fastapi-ddd/src/app/infrastructure/repositories/notes.py.j2 +28 -0
  188. package/templates/kits/fastapi-ddd/src/app/main.py.j2 +61 -0
  189. package/templates/kits/fastapi-ddd/src/app/presentation/__init__.py.j2 +3 -0
  190. package/templates/kits/fastapi-ddd/src/app/presentation/api/__init__.py.j2 +5 -0
  191. package/templates/kits/fastapi-ddd/src/app/presentation/api/dependencies/__init__.py.j2 +19 -0
  192. package/templates/kits/fastapi-ddd/src/app/presentation/api/router.py.j2 +10 -0
  193. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/__init__.py.j2 +5 -0
  194. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/health.py.j2 +27 -0
  195. package/templates/kits/fastapi-ddd/src/app/presentation/api/routes/notes.py.j2 +50 -0
  196. package/templates/kits/fastapi-ddd/src/app/shared/__init__.py.j2 +5 -0
  197. package/templates/kits/fastapi-ddd/src/app/shared/result.py.j2 +28 -0
  198. package/templates/kits/fastapi-ddd/src/cli.py.j2 +170 -0
  199. package/templates/kits/fastapi-ddd/src/main.py.j2 +35 -0
  200. package/templates/kits/fastapi-ddd/src/modules/__init__.py.j2 +3 -0
  201. package/templates/kits/fastapi-ddd/src/routing/__init__.py.j2 +13 -0
  202. package/templates/kits/fastapi-ddd/src/routing/health.py.j2 +7 -0
  203. package/templates/kits/fastapi-ddd/src/routing/notes.py.j2 +7 -0
  204. package/templates/kits/fastapi-ddd/tests/__init__.py.j2 +1 -0
  205. package/templates/kits/fastapi-ddd/tests/test_app_factory.py.j2 +22 -0
  206. package/templates/kits/fastapi-ddd/tests/test_health.py.j2 +17 -0
  207. package/templates/kits/fastapi-ddd/tests/test_notes.py.j2 +27 -0
  208. package/templates/kits/fastapi-standard/README.md.j2 +140 -0
  209. package/templates/kits/fastapi-standard/common/env.example.j2 +10 -0
  210. package/templates/kits/fastapi-standard/env.example.j2 +1 -0
  211. package/templates/kits/fastapi-standard/pyproject.toml.j2 +64 -0
  212. package/templates/kits/fastapi-standard/src/__init__.py.j2 +3 -0
  213. package/templates/kits/fastapi-standard/src/cli.py.j2 +171 -0
  214. package/templates/kits/fastapi-standard/src/main.py.j2 +66 -0
  215. package/templates/kits/fastapi-standard/src/modules/__init__.py.j2 +3 -0
  216. package/templates/kits/fastapi-standard/src/routing/__init__.py.j2 +16 -0
  217. package/templates/kits/fastapi-standard/src/routing/examples.py.j2 +71 -0
  218. package/templates/kits/fastapi-standard/src/routing/health.py.j2 +22 -0
  219. package/templates/kits/fastapi-standard/tests/__init__.py.j2 +1 -0
  220. package/templates/kits/fastapi-standard/tests/test_examples.py.j2 +29 -0
  221. package/templates/kits/fastapi-standard/tests/test_health.py.j2 +17 -0
  222. package/templates/kits/nestjs-standard/Dockerfile.j2 +41 -0
  223. package/templates/kits/nestjs-standard/README.md.j2 +134 -0
  224. package/templates/kits/nestjs-standard/docker-compose.yml.j2 +94 -0
  225. package/templates/kits/nestjs-standard/docs/README.md.j2 +15 -0
  226. package/templates/kits/nestjs-standard/env.example.j2 +18 -0
  227. package/templates/kits/nestjs-standard/eslint.config.cjs.j2 +9 -0
  228. package/templates/kits/nestjs-standard/jest.config.ts.j2 +28 -0
  229. package/templates/kits/nestjs-standard/nest-cli.json.j2 +10 -0
  230. package/templates/kits/nestjs-standard/package.json.j2 +101 -0
  231. package/templates/kits/nestjs-standard/src/app.controller.ts.j2 +14 -0
  232. package/templates/kits/nestjs-standard/src/app.module.ts.j2 +26 -0
  233. package/templates/kits/nestjs-standard/src/app.service.ts.j2 +16 -0
  234. package/templates/kits/nestjs-standard/src/auth/auth.controller.ts.j2 +20 -0
  235. package/templates/kits/nestjs-standard/src/auth/auth.module.ts.j2 +13 -0
  236. package/templates/kits/nestjs-standard/src/auth/auth.service.ts.j2 +6 -0
  237. package/templates/kits/nestjs-standard/src/auth/entities/token.entity.ts.j2 +3 -0
  238. package/templates/kits/nestjs-standard/src/auth/entities/user.entity.ts.j2 +3 -0
  239. package/templates/kits/nestjs-standard/src/auth/entities/webauthn.entity.ts.j2 +3 -0
  240. package/templates/kits/nestjs-standard/src/config/configuration.ts.j2 +85 -0
  241. package/templates/kits/nestjs-standard/src/config/index.ts.j2 +2 -0
  242. package/templates/kits/nestjs-standard/src/config/validation.ts.j2 +21 -0
  243. package/templates/kits/nestjs-standard/src/examples/dto/create-note.dto.ts.j2 +11 -0
  244. package/templates/kits/nestjs-standard/src/examples/examples.controller.ts.j2 +24 -0
  245. package/templates/kits/nestjs-standard/src/examples/examples.module.ts.j2 +10 -0
  246. package/templates/kits/nestjs-standard/src/examples/examples.service.ts.j2 +33 -0
  247. package/templates/kits/nestjs-standard/src/main.ts.j2 +53 -0
  248. package/templates/kits/nestjs-standard/src/modules/index.ts.j2 +25 -0
  249. package/templates/kits/nestjs-standard/test/app.controller.spec.ts.j2 +24 -0
  250. package/templates/kits/nestjs-standard/test/app.e2e-spec.ts.j2 +60 -0
  251. package/templates/kits/nestjs-standard/test/examples.controller.spec.ts.j2 +28 -0
  252. package/templates/kits/nestjs-standard/test/jest-e2e.json.j2 +15 -0
  253. package/templates/kits/nestjs-standard/tsconfig.build.json.j2 +12 -0
  254. package/templates/kits/nestjs-standard/tsconfig.json.j2 +26 -0
  255. package/workspai.config.example.cjs +62 -0
@@ -0,0 +1,205 @@
1
+ import {promises}from'fs';import r from'path';var g="1.24",n="github.com/air-verse/air@v1.52.3",i="github.com/swaggo/swag/cmd/swag@v1.16.3",a="main.go -d cmd/server,internal/handlers,internal/apierr -o docs --parseDependency";function u(e){return e.split(/[-_\s]+/).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}async function h(e,t){await promises.mkdir(r.dirname(e),{recursive:true}),await promises.writeFile(e,t,"utf8");}function f(e){let t=e.includeLintAndFmt?`
2
+ lint:
3
+ @command -v golangci-lint >/dev/null 2>&1 || (echo "golangci-lint not found. Install: https://golangci-lint.run/usage/install/" && exit 1)
4
+ golangci-lint run ./...
5
+
6
+ fmt:
7
+ @GOFMT_FILES="$$(find . -type f -name '*.go' -not -path './.workspai/*' -not -path './.rapidkit/*' -not -path './vendor/*' -not -path './tmp/*')" ; \\
8
+ if [ -n "$$GOFMT_FILES" ]; then gofmt -w $$GOFMT_FILES; fi
9
+ `:"";return `.PHONY: dev run build test cover${e.includeLintAndFmt?" lint fmt":""} tidy docs docker-up docker-down
10
+
11
+ # Build-time metadata
12
+ VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
13
+ COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo "none")
14
+ DATE ?= $(shell date -u +"%Y-%m-%dT%H:%M:%SZ")
15
+ LDFLAGS = -ldflags "-s -w -X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(DATE)"
16
+ # Go tool binaries are installed to GOPATH/bin; include it so \`air\` and \`swag\` are found.
17
+ GOBIN ?= $(shell go env GOPATH)/bin
18
+
19
+ # Hot reload \u2014 installs pinned air version on first use
20
+ dev:
21
+ @test -x "$(GOBIN)/air" || go install ${n}
22
+ ${e.devCommand}
23
+
24
+ run:
25
+ ${e.runCommand}
26
+
27
+ build:
28
+ go build -buildvcs=false $(LDFLAGS) -o bin/${e.projectName} ./cmd/server
29
+
30
+ test:
31
+ ${e.testCommand}
32
+
33
+ cover:
34
+ ${e.testCommand.replace("./... -v -race","./... -race -coverprofile=coverage.out").replace("GIN_MODE=test ","GIN_MODE=test ")}
35
+ go tool cover -html=coverage.out -o coverage.html
36
+ @echo "Coverage report: coverage.html"
37
+
38
+ # Generate Swagger docs \u2014 installs pinned swag version on first use
39
+ docs:
40
+ @test -x "$(GOBIN)/swag" || go install ${i}
41
+ $(GOBIN)/swag init -g ${a}${t}
42
+ tidy:
43
+ go mod tidy
44
+
45
+ docker-up:
46
+ go mod tidy
47
+ docker compose up --build \\
48
+ --build-arg VERSION=$(VERSION) \\
49
+ --build-arg COMMIT=$(COMMIT) \\
50
+ --build-arg DATE=$(DATE) \\
51
+ -d
52
+
53
+ docker-down:
54
+ docker compose down
55
+ `}function $(e){return `#!/usr/bin/env sh
56
+ # Workspai ${e.runtimeLabel} project launcher \u2014 generated by Workspai CLI
57
+ # https://workspai.dev
58
+
59
+ SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
60
+ CMD="\${1:-}"
61
+ shift 2>/dev/null || true
62
+
63
+ case "$CMD" in
64
+ init)
65
+ cd "$SCRIPT_DIR"
66
+ echo "\u{1F439} Initializing ${e.runtimeLabel} project\u2026"
67
+ GOBIN="$(go env GOPATH)/bin"
68
+ echo " \u2192 installing air (hot reload)\u2026"
69
+ go install ${n} 2>/dev/null && echo " \u2713 air" || echo " \u26A0 air install failed (run: go install ${n})"
70
+ echo " \u2192 installing swag (swagger)\u2026"
71
+ go install ${i} 2>/dev/null && echo " \u2713 swag" || echo " \u26A0 swag install failed (run: go install ${i})"
72
+ if [ ! -f ".env" ] && [ -f ".env.example" ]; then
73
+ cp .env.example .env && echo " \u2713 .env created from .env.example"
74
+ fi
75
+ go mod tidy && echo " \u2713 go mod tidy"
76
+ echo " \u2192 generating swagger docs (first build)\u2026"
77
+ "$(go env GOPATH)/bin/swag" init -g ${a} 2>/dev/null \\
78
+ && echo " \u2713 swagger docs generated" \\
79
+ || echo " \u26A0 swagger docs skipped (run: npx workspai docs)"
80
+ echo "\u2705 Ready \u2014 run: npx workspai dev"
81
+ ;;
82
+ dev)
83
+ cd "$SCRIPT_DIR"
84
+ echo "\u{1F4D6} Syncing swagger docs\u2026"
85
+ "$(go env GOPATH)/bin/swag" init -g ${a} 2>/dev/null || true
86
+ if [ -f "$SCRIPT_DIR/Makefile" ]; then
87
+ exec make -C "$SCRIPT_DIR" dev "$@"
88
+ else
89
+ ${e.fallbackDevCommand}
90
+ fi
91
+ ;;
92
+ start)
93
+ BIN="$SCRIPT_DIR/bin/${e.projectName}"
94
+ if [ ! -f "$BIN" ]; then
95
+ make -C "$SCRIPT_DIR" build
96
+ fi
97
+ exec "$BIN" "$@"
98
+ ;;
99
+ build)
100
+ exec make -C "$SCRIPT_DIR" build "$@"
101
+ ;;
102
+ test)
103
+ exec make -C "$SCRIPT_DIR" test "$@"
104
+ ;;
105
+ lint)
106
+ exec make -C "$SCRIPT_DIR" lint "$@"
107
+ ;;
108
+ format|fmt)
109
+ exec make -C "$SCRIPT_DIR" fmt "$@"
110
+ ;;
111
+ docs)
112
+ exec make -C "$SCRIPT_DIR" docs "$@"
113
+ ;;
114
+ help|--help|-h)
115
+ echo "Workspai \u2014 ${e.runtimeLabel} project: ${e.projectName}"
116
+ echo ""
117
+ echo "Usage: npx workspai <command>"
118
+ echo "Legacy local launcher: ./rapidkit <command>"
119
+ echo ""
120
+ echo " init Install tools + create .env (air, swag, go mod tidy)"
121
+ echo " dev Hot reload dev server (make dev \u2014 requires air)"
122
+ echo " start Run compiled binary (make build + bin)"
123
+ echo " build Build binary (make build)"
124
+ echo " docs Generate Swagger docs (make docs \u2014 requires swag)"
125
+ echo " test Run tests (make test)"
126
+ echo " lint Run linter (make lint)"
127
+ echo " format Format code (make fmt)"
128
+ ;;
129
+ *)
130
+ if [ -n "$CMD" ]; then
131
+ echo "workspai: unknown command: $CMD" >&2
132
+ fi
133
+ echo "Available: init, dev, start, build, docs, test, lint, format" >&2
134
+ exit 1
135
+ ;;
136
+ esac
137
+ `}function p(e){return `@echo off
138
+ setlocal
139
+ rem Workspai ${e.runtimeLabel} project launcher \u2014 Windows
140
+ set CMD=%1
141
+ if "%CMD%"=="" goto usage
142
+ shift
143
+
144
+ if "%CMD%"=="init" (
145
+ echo Initializing ${e.runtimeLabel} project...
146
+ go install ${n}
147
+ go install ${i}
148
+ if not exist .env if exist .env.example copy .env.example .env
149
+ go mod tidy
150
+ exit /b %ERRORLEVEL%
151
+ )
152
+ if "%CMD%"=="dev" (
153
+ where air >nul 2>nul
154
+ if errorlevel 1 (
155
+ go run ./cmd/server %*
156
+ ) else (
157
+ air %*
158
+ )
159
+ exit /b %ERRORLEVEL%
160
+ )
161
+ if "%CMD%"=="build" (
162
+ if not exist bin mkdir bin
163
+ go build -buildvcs=false -o bin\\${e.projectName}.exe ./cmd/server
164
+ exit /b %ERRORLEVEL%
165
+ )
166
+ if "%CMD%"=="test" (
167
+ go test ./... -v -race %*
168
+ exit /b %ERRORLEVEL%
169
+ )
170
+ if "%CMD%"=="lint" (
171
+ golangci-lint run %*
172
+ exit /b %ERRORLEVEL%
173
+ )
174
+ if "%CMD%"=="format" (
175
+ gofmt -w .
176
+ exit /b %ERRORLEVEL%
177
+ )
178
+ if "%CMD%"=="fmt" (
179
+ gofmt -w .
180
+ exit /b %ERRORLEVEL%
181
+ )
182
+ if "%CMD%"=="docs" (
183
+ where swag >nul 2>nul
184
+ if errorlevel 1 (
185
+ echo swag is required for docs. Run: go install ${i}
186
+ exit /b 1
187
+ )
188
+ swag init -g ${a}
189
+ exit /b %ERRORLEVEL%
190
+ )
191
+ if "%CMD%"=="start" (
192
+ if not exist bin\\${e.projectName}.exe call "%~f0" build
193
+ if errorlevel 1 exit /b %ERRORLEVEL%
194
+ bin\\${e.projectName}.exe %*
195
+ exit /b %ERRORLEVEL%
196
+ )
197
+
198
+ :usage
199
+ echo Workspai ${e.runtimeLabel} project launcher
200
+ echo.
201
+ echo Available: init, dev, start, build, docs, test, lint, format
202
+ echo.
203
+ echo Windows launcher uses native Go commands and does not require GNU Make.
204
+ exit /b 1
205
+ `}export{g as a,u as b,h as c,f as d,$ as e,p as f};
@@ -0,0 +1 @@
1
+ var c="agent-action-outcome.v1",s=["ok","failed"];function f(t){if(typeof t!="string")return null;let e=t.trim();return s.includes(e)?e:null}function g(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=f(e.outcome);if(typeof e.actionId!="string"||typeof e.summary!="string"||!r)return null;let o=typeof e.scope=="string"&&e.scope.trim()?e.scope.trim():"workspace",i=typeof e.generatedAt=="string"&&e.generatedAt.trim()?e.generatedAt.trim():new Date().toISOString();return {schemaVersion:c,generatedAt:i,actionId:e.actionId.trim(),scope:o,summary:e.summary.trim(),outcome:r,...Array.isArray(e.affectedFiles)?{affectedFiles:e.affectedFiles.filter(n=>typeof n=="string"&&n.trim().length>0)}:{},...Array.isArray(e.commandsRun)?{commandsRun:e.commandsRun.filter(n=>typeof n=="string"&&n.trim().length>0)}:{},...typeof e.verifyBefore=="string"?{verifyBefore:e.verifyBefore}:{},...typeof e.verifyAfter=="string"?{verifyAfter:e.verifyAfter}:{},...typeof e.evidenceSha256=="string"?{evidenceSha256:e.evidenceSha256}:{},...typeof e.evidencePath=="string"?{evidencePath:e.evidencePath}:{}}}export{c as a,g as b};
@@ -0,0 +1,3 @@
1
+ import {a as a$2}from'./chunk-PYCJWW4B.js';import {a as a$1}from'./chunk-HTYMXMQM.js';import {a,b}from'./chunk-S5KTATOU.js';function m(t,n){return [...t.values()].filter(r=>r.id!==n).map(r=>({id:r.id,distance:r.distance,path:r.path,via:r.via})).sort((r,s)=>r.distance-s.distance||r.id.localeCompare(s.id))}function x(t,n){let r=a(t);if(!r.nodeIds.has(n))return {project:n,found:false,centrality:null,directDependents:[],directDependencies:[],transitiveDependents:[],transitiveDependencies:[]};let e=a$1(t).byId.get(n)??null,o=b(r,[n],{direction:"dependents"}),u=b(r,[n],{direction:"dependencies"}),f=(r.reverse.get(n)??[]).slice().sort((d,i)=>d.localeCompare(i)),k=(r.forward.get(n)??[]).slice().sort((d,i)=>d.localeCompare(i));return {project:n,found:true,centrality:e,directDependents:f,directDependencies:k,transitiveDependents:m(o,n),transitiveDependencies:m(u,n)}}function c(t){return t.replace(/"/g,'\\"')}var G={"code-import":"solid","package-dep":"solid","event-pub-sub":"dashed","service-dependsOn":"bold","shared-resource":"dotted"};function C(t){let n=[...t.nodes].sort((e,o)=>e.id.localeCompare(o.id)),r=[...t.edges].sort((e,o)=>e.from.localeCompare(o.from)||e.to.localeCompare(o.to)||e.kind.localeCompare(o.kind)),s=["digraph workspace {"," rankdir=LR;"," node [shape=box];"];for(let e of n)s.push(` "${c(e.id)}";`);for(let e of r){let o=G[e.kind]??"solid";s.push(` "${c(e.from)}" -> "${c(e.to)}" [label="${e.kind}", style=${o}];`);}return s.push("}"),s.join(`
2
+ `)}function l(t){let n=t.replace(/[^A-Za-z0-9_]/g,"_");return /^[A-Za-z_]/.test(n)?n:`n_${n}`}function I(t){let n=[...t.nodes].sort((e,o)=>e.id.localeCompare(o.id)),r=[...t.edges].sort((e,o)=>e.from.localeCompare(o.from)||e.to.localeCompare(o.to)||e.kind.localeCompare(o.kind)),s=["flowchart LR"];for(let e of n)s.push(` ${l(e.id)}["${e.id}"]`);for(let e of r)s.push(` ${l(e.from)} -->|${e.kind}| ${l(e.to)}`);return s.join(`
3
+ `)}function $(t){return {graph:t,integrity:a$2(t),hotspots:a$1(t).hotspots}}export{x as a,C as b,I as c,$ as d};
@@ -0,0 +1 @@
1
+ import {a as a$1}from'./chunk-7YHK5NM3.js';import {b}from'./chunk-RO73VVHW.js';import {intro,confirm,isCancel,password,text,multiselect,select,cancel}from'@clack/prompts';var c=false;function S(n){if(b()||c)return;c=true;let i=`${a$1.brand("\u25C6")} ${a$1.white("Workspai")}${n?a$1.dim(` ${n}`):""}`;intro(i);}function a(n="Cancelled"){b()||(cancel(a$1.dim(n)),c=false);}function m(n){if(n)return i=>{let e=n(i);if(e!==true)return e===false?"Invalid value":e}}function v(n){return n.replace(/^[\p{Emoji_Presentation}\p{Extended_Pictographic}\s]+/u,"").trim()}function E(n){let i=v(n);for(let e of [" \u2014 "," \u2013 "," - "]){let t=i.indexOf(e);if(t>0)return {label:i.slice(0,t).trim(),hint:i.slice(t+e.length).trim()}}return {label:i}}function g(n){if(n.label)return {label:n.label,hint:n.hint};let i=E(n.name??String(n.value));return {label:i.label,hint:n.hint??i.hint}}function w(n,i){if(typeof n=="number")return n;if(n===void 0)return;let e=i.findIndex(t=>t.value===n);return e>=0?e:void 0}function h(n,i){return n.when===void 0?true:typeof n.when=="function"?n.when(i):n.when}async function Q(n,i){let e=n,t=v(e.message??e.name);if(e.type==="confirm"){let r=await confirm({message:t,initialValue:typeof e.default=="boolean"?e.default:false,active:a$1.success("yes"),inactive:a$1.dim("no")});return isCancel(r)&&(a(),process.exit(130)),r}if(e.type==="password"){let r=await password({message:t,validate:m(e.validate)});return isCancel(r)&&(a(),process.exit(130)),r}if(e.type==="input"){let r=await text({message:t,defaultValue:typeof e.default=="string"?e.default:void 0,initialValue:typeof e.default=="string"?e.default:void 0,validate:m(e.validate),placeholder:typeof e.default=="string"?e.default:void 0});return isCancel(r)&&(a(),process.exit(130)),r}if(e.type==="checkbox"){let r=[...e.choices??[]],l=await multiselect({message:t,options:r.map(u=>{let s=g(u);return {value:u.value,label:s.label,hint:s.hint}}),required:false});return isCancel(l)&&(a(),process.exit(130)),l}if(e.type==="rawlist"||e.type==="list"){let r=[...e.choices??[]].filter(s=>!s.disabled),l=w(e.default,r),u=await select({message:t,options:r.map(s=>{let p=g(s);return {value:s.value,label:p.label,hint:p.hint}}),initialValue:l!==void 0?r[l]?.value:void 0});return isCancel(u)&&(a(),process.exit(130)),u}throw new Error(`Unsupported prompt type: ${e.type}`)}async function A(n){if(b()){let e={};for(let t of n)if(h(t,e))if(t.default!==void 0)e[t.name]=t.default;else if(t.type==="confirm")e[t.name]=false;else if(t.type==="checkbox")e[t.name]=[];else if(t.choices?.length){let r=w(t.default,[...t.choices]);e[t.name]=r!==void 0?t.choices[r]?.value:t.choices[0]?.value;}else e[t.name]="";return e}let i={};for(let e of n)h(e,i)&&(i[e.name]=await Q(e));return i}export{S as a,A as b};
@@ -0,0 +1,4 @@
1
+ import {f as f$1,e}from'./chunk-T3GJ7YVG.js';import {a,b}from'./chunk-22DT744Z.js';import {c}from'./chunk-NFUXULIF.js';import {d as d$1,e as e$1,g,f as f$2,i}from'./chunk-T6OR6YOI.js';import {a as a$1,d as d$2}from'./chunk-NAAQMSO3.js';import {o}from'./chunk-5XATWNME.js';import d from'chalk';import l from'fs';import p from'path';var L="release-readiness-v1";function D(t,e){let s=p.resolve(t);if(!b(s))return s;let a=V(e,"workspace.contract.json");if(l.existsSync(a))try{let o=JSON.parse(l.readFileSync(a,"utf-8")),n=Array.isArray(o.projects)?o.projects:[];for(let r of n){let u=f(r),m=typeof u.relativePath=="string"?u.relativePath.trim():"";if(m)return p.join(e,m)}}catch{}let i=W(e),c=Array.isArray(i.payload?.projects)?i.payload.projects:[];for(let o of c){let n=f(o),r=typeof n.path=="string"?n.path.trim():"";if(r)return p.resolve(r)}return s}function J(t){let e=d$1(t);return e$1(e,t)?"go":g(e,t)?"java":f$2(e,t)?"node":i(e,t)?"python":"unknown"}function $(t,e){if(!l.existsSync(t))return null;let s=l.readdirSync(t).filter(a=>a.endsWith(".json")&&e.some(i=>i.test(a))).map(a=>p.join(t,a));return s.length===0?null:(s.sort((a,i)=>l.statSync(i).mtimeMs-l.statSync(a).mtimeMs),s[0])}function f(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function I(t){for(let e of t)if(l.existsSync(e))return e;return null}function V(t,...e){let s=o(t,...e);return I(s)??s[0]}function P(t,e){let s=a$1(t,`.workspai/reports/${e}`);return I([s,p.join(t,".rapidkit","reports",e)])??s}async function F(t){let{readWorkspaceRegistrySummary:e,resolveWorkspaceRegisteredProjects:s}=await import('./workspace-registry-summary-RUJE6RPH.js'),a=await e(t);return a?a.projectCount:(await s(t)).summary.projectCount}function M(t,e,s){let a=V(t,"toolchain.lock");if(!l.existsSync(a))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run workspai bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:a};try{let i=JSON.parse(l.readFileSync(a,"utf-8")),c=f(i.runtime),n=["python","node","go","java"].filter(r=>{let u=f(c[r]);return typeof u.version=="string"&&u.version.trim().length>0});if(n.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via workspai setup <runtime> and re-run bootstrap."],evidencePath:a};if(e!=="unknown"){let r=f(c[e]);if(typeof r.version!="string"||r.version.trim().length===0)return {gate:"env",status:"fail",summary:`${s?.hasRegisteredProjects?"Project runtime":"Workspace"} (${e}) is not pinned in toolchain.lock`,details:[`Run workspai setup ${e} and workspai bootstrap to lock ${e} for this workspace.`],evidencePath:a}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${n.join(", ")}`,details:[],evidencePath:a}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with workspai bootstrap."],evidencePath:a}}}function W(t){let e=P(t,"doctor-last-run.json");if(!l.existsSync(e))return {payload:null,path:e};try{let s=JSON.parse(l.readFileSync(e,"utf-8"));return c(s,"workspace")?{payload:s,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function _(t){let e=W(t);if(!e.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run workspai doctor workspace --json before release readiness checks."],evidencePath:e.path},payload:null};let s=f(e.payload.summary),a=Number(s.totalIssues??0);return s.hasSystemErrors?{gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:e.path},payload:e.payload}:a>0?{gate:{gate:"doctor",status:"warn",summary:`Doctor found ${a} issue(s)`,details:["Run workspai doctor workspace --fix and re-run readiness checks."],evidencePath:e.path},payload:e.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:e.path},payload:e.payload}}function H(t){let e=P(t,"analyze-last-run.json");if(!l.existsSync(e))return {gate:"analyze",status:"fail",summary:"Analyze evidence is missing",details:["Run workspai analyze --json before release readiness checks."],evidencePath:e};try{let s=JSON.parse(l.readFileSync(e,"utf-8")),a=f(s.summary),i=String(a.verdict??"").toLowerCase(),c=Number(a.score??0),o=f(a.findings),n=Number(o.fail??0);return i==="blocked"||n>0?{gate:"analyze",status:"fail",summary:`Analyze verdict is blocked (score ${c}/100)`,details:["Resolve analyze findings and regenerate analyze-last-run.json."],evidencePath:e}:i==="needs-attention"?{gate:"analyze",status:"warn",summary:`Analyze needs attention (score ${c}/100)`,details:["Review analyze warnings before release."],evidencePath:e}:{gate:"analyze",status:"pass",summary:`Analyze passed (score ${c}/100)`,details:[],evidencePath:e}}catch{return {gate:"analyze",status:"fail",summary:"Analyze evidence is invalid JSON",details:["Re-run workspai analyze --json to regenerate evidence."],evidencePath:e}}}function K(t){try{let e=JSON.parse(l.readFileSync(t,"utf-8")),s=String(e.status??"").toLowerCase(),a=f(e.summary),i=Number(a.failedChecks??0);return s==="fail"||i>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:t}:s==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:t}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:t}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:t}}}async function B(t,e){if(e.skipVerify)return {gate:"verify",status:"pass",summary:"Verify gate skipped (--skip-verify)",details:["Verification was explicitly skipped for this readiness run."]};let s=[a$1(t,".workspai/reports"),p.join(t,".rapidkit","reports")],a=s[0],i=s.map(n=>$(n,[/verify-pack-contract/i,/^verify.*\.json$/i])).find(n=>typeof n=="string")??null;if(i)return K(i);let c=a$1(t,".workspai/reports/workspace-contract-verify-last-run.json"),o=s.map(n=>$(n,[/workspace-contract-verify-last-run/i,/workspace-contract-verify/i])).find(n=>typeof n=="string")??null;if(o)try{let n=JSON.parse(l.readFileSync(o,"utf-8")),r=String(n.status??"").toLowerCase();if(r==="passed"||r==="pass")return {gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI cache)",details:[],evidencePath:o};if(r==="failed"||r==="fail")return {gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI cache)",details:(Array.isArray(n.violations)?n.violations:[]).slice(0,5),evidencePath:o}}catch{}try{let{verifyWorkspaceContract:n}=await import('./workspace-contract-XUGMCUSQ.js'),r=await n({workspacePath:t}),u={schemaVersion:"v1",source:"cli",generatedAt:new Date().toISOString(),status:r.status,contractPath:r.contractPath,projectCount:r.projectCount,checks:r.checks,violations:r.violations};return await d$2(t,".workspai/reports/workspace-contract-verify-last-run.json",u),r.status==="failed"?{gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI)",details:r.violations.slice(0,5),evidencePath:c}:{gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI)",details:[],evidencePath:c}}catch(n){return {gate:"verify",status:"fail",summary:"No verify evidence and workspace contract verification unavailable",details:["Run workspai workspace contract verify --json or export verify-pack contract from CI.",n instanceof Error?n.message:String(n)],evidencePath:p.join(a,"*verify*.json")}}}function U(t,e){let s=P(e,"doctor-last-run.json");if(!t)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run workspai doctor workspace --json to include dependency findings."],evidencePath:s};let a=Array.isArray(t.projects)?t.projects:[],i=a.reduce((o,n)=>{let r=Number(n.vulnerabilities??0);return Number.isFinite(r)?o+Math.max(0,r):o},0),c=a.filter(o=>o.depsInstalled===false).length;return i>0?{gate:"dependency",status:"fail",summary:`${i} dependency vulnerability(ies) reported`,details:["Resolve vulnerabilities (npm/pip/go audit pipelines) before release."],evidencePath:s}:c>0?{gate:"dependency",status:"warn",summary:`${c} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:s}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:s}}function q(t){return t.some(e=>e.status==="fail")?"fail":t.some(e=>e.status==="warn")?"warn":"pass"}async function Q(t,e){return d$2(t,".workspai/reports/release-readiness-last-run.json",e)}async function T(t={}){let e$1=p.resolve(t.startPath??process.cwd()),s=a(e$1)??e$1,a$1=await F(s)>0,i=a$1&&b(e$1)?s:D(e$1,s),c=i===s?"unknown":J(i),n=M(s,a$1?c:"unknown",{hasRegisteredProjects:a$1}),r=_(s),u=H(s),m=await B(s,{skipVerify:t.skipVerify}),z=U(r.payload,s),h=[n,r.gate,u,m,z],v=q(h),g={schemaVersion:L,generatedAt:new Date().toISOString(),workspacePath:s,projectPath:i,action:t.action,overallStatus:v,blocking:v==="fail",blockingReasons:h.filter(y=>y.status==="fail").map(y=>`${y.gate}: ${y.summary}`),gates:h};if(t.writeReport!==false){let y=f$1(g,{commandId:"workspaceReadiness",exitCode:v==="fail"?2:v==="warn"?1:0,generatedAt:g.generatedAt,blockers:g.blockingReasons,runId:e()});g.evidencePath=await Q(s,y);}return g}function X(t){return t==="pass"?d.green("PASS"):t==="warn"?d.yellow("WARN"):d.red("FAIL")}function Y(t){return t==="pass"?d.green("PASS"):t==="warn"?d.yellow("WARN"):d.red("FAIL")}async function de(t){let e=await T({writeReport:true,skipVerify:t.skipVerify===true});if(t.json)console.log(JSON.stringify(e,null,2));else {console.log(d.bold.cyan(`
2
+ \u{1F6A6} Workspai Release Readiness
3
+ `)),console.log(d.bold(`Workspace: ${d.cyan(p.basename(e.workspacePath))}`)),console.log(d.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${Y(e.overallStatus)}`);for(let s of e.gates){console.log(` - ${s.gate}: ${X(s.status)} ${s.summary}`);for(let a of s.details)console.log(d.gray(` ${a}`));s.evidencePath&&console.log(d.gray(` evidence: ${s.evidencePath}`));}e.evidencePath&&console.log(d.gray(`
4
+ Evidence saved: ${e.evidencePath}`));}t.strict&&e.overallStatus!=="pass"&&process.exit(1);}export{T as a,de as b};