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.
- package/README.md +26 -13
- package/contracts/agent-customization-pack.v1.json +1 -1
- package/contracts/autopilot-release.v1.json +204 -0
- package/contracts/cli-operation-result.v1.json +119 -0
- package/contracts/command-capabilities.v1.json +138 -0
- package/contracts/compatibility-matrix.v1.json +37 -0
- package/contracts/create-planner-capabilities.v1.json +156 -65
- package/contracts/doctor-project-scan.v2.json +60 -0
- package/contracts/doctor-remediation-plan.v1.json +19 -4
- package/contracts/doctor-remediation-plan.v2.json +7 -0
- package/contracts/doctor-workspace-cache.v2.json +82 -0
- package/contracts/extension-cli-compatibility.v1.json +47 -3
- package/contracts/infra-plan.v1.json +189 -0
- package/contracts/private-product-manifest.v1.json +155 -0
- package/contracts/product-factory-plan.v1.json +200 -0
- package/contracts/project-archive.v1.json +40 -0
- package/contracts/project-entry-capability.v1.json +127 -0
- package/contracts/published-contract-catalog.v1.json +334 -0
- package/contracts/runtime-command-surface.v1.json +239 -10
- package/contracts/version.v1.json +48 -0
- package/contracts/workspace-archive-capabilities.v1.json +90 -0
- package/contracts/workspace-archive-manifest.v1.json +107 -0
- package/contracts/workspace-archive-operation-result.v1.json +565 -0
- package/contracts/workspace-intelligence/agent-customization-pack-report.v1.json +98 -0
- package/contracts/workspace-intelligence/agent-hooks.v1.json +38 -0
- package/contracts/workspace-intelligence/agent-reports-index.v1.json +56 -0
- package/contracts/workspace-intelligence/mcp-design.v1.json +42 -0
- package/contracts/workspace-intelligence/workspace-context.v1.json +12 -0
- package/contracts/workspace-intelligence/workspace-explain.v1.json +1 -0
- package/contracts/workspace-intelligence-architecture.v1.json +723 -0
- package/contracts/workspace-intelligence-chain.v1.json +1194 -0
- package/contracts/workspace-list.v1.json +56 -0
- package/contracts/workspace-model-cache.v1.json +55 -0
- package/contracts/workspace-snapshot.v1.json +58 -0
- package/contracts/workspace-snapshot.v2.json +97 -0
- package/contracts/workspace-sync.v1.json +30 -0
- package/contracts/workspace-watch-event.v1.json +112 -0
- package/dist/analyze-6OCBM4ID.js +1 -0
- package/dist/{artifact-remediation-plan-5GJWPPRS.js → artifact-remediation-plan-Z7OCSME3.js} +3 -3
- package/dist/autopilot-release-LI2WJCEW.js +1 -0
- package/dist/{chunk-LZQNVH7D.js → chunk-2K3GYCPS.js} +1 -1
- package/dist/chunk-2QN6BMM7.js +2 -0
- package/dist/chunk-2QOWRBQD.js +1 -0
- package/dist/chunk-5AKYMAIL.js +1 -0
- package/dist/{chunk-RE773WOX.js → chunk-5PVEQ6CZ.js} +5 -5
- package/dist/{chunk-AFSZHLQT.js → chunk-7EIMPQR3.js} +1 -1
- package/dist/{chunk-3KXW53QI.js → chunk-7IHLTPZ6.js} +1 -1
- package/dist/chunk-7RIWU5TZ.js +1 -0
- package/dist/{chunk-T6OR6YOI.js → chunk-7UZVOYF5.js} +1 -1
- package/dist/chunk-B66A4TVP.js +1 -0
- package/dist/chunk-CL6TGI4Q.js +8 -0
- package/dist/chunk-FWJV7CCI.js +2 -0
- package/dist/chunk-J4AICQFB.js +1 -0
- package/dist/chunk-JICOD2GI.js +1 -0
- package/dist/{chunk-OJEWQO3Z.js → chunk-JP25YL3J.js} +17 -17
- package/dist/chunk-L2Q7B2OJ.js +1 -0
- package/dist/chunk-L3E6IRUQ.js +8 -0
- package/dist/chunk-LG6RFLPZ.js +1 -0
- package/dist/chunk-LGP6WXS2.js +4 -0
- package/dist/{chunk-VRDF2J46.js → chunk-M4VITK6X.js} +52 -50
- package/dist/chunk-NTXO7BMH.js +4 -0
- package/dist/{chunk-LPZFK3Y6.js → chunk-OW4UNG27.js} +65 -66
- package/dist/{chunk-LUP4U6EE.js → chunk-P424XYHP.js} +1 -1
- package/dist/chunk-P4SWTY5X.js +33 -0
- package/dist/chunk-TQEMLBAG.js +1 -0
- package/dist/chunk-TRMDODFM.js +13 -0
- package/dist/chunk-UNF72FTB.js +1 -0
- package/dist/chunk-V5JN4TDX.js +2 -0
- package/dist/chunk-VA5MRHKM.js +2 -0
- package/dist/chunk-XIVFLY6G.js +1 -0
- package/dist/chunk-YUX4YFGL.js +78 -0
- package/dist/{create-WRZO4HK2.js → create-DFAWAS5C.js} +1 -1
- package/dist/demo-kit-DZ7TPG7K.js +149 -0
- package/dist/doctor-PVSWDBJL.js +1 -0
- package/dist/{dotnet-webapi-clean-IPY3MCGQ.js → dotnet-webapi-clean-BYUUHX5Y.js} +20 -20
- package/dist/{gofiber-standard-N5N3QGH3.js → gofiber-standard-B6UK5GR7.js} +31 -31
- package/dist/{gogin-standard-LAWQTBWL.js → gogin-standard-BXU44VEM.js} +31 -31
- package/dist/index.d.ts +250 -24
- package/dist/index.js +218 -182
- package/dist/pipeline-ND734AJM.js +5 -0
- package/dist/{platform-capabilities-XAVU4HSM.js → platform-capabilities-YICBF4FA.js} +1 -1
- package/dist/{pythonRapidkitExec-3L3XJBSY.js → pythonRapidkitExec-UJYIB6FL.js} +1 -1
- package/dist/{springboot-standard-OZYF7ZM7.js → springboot-standard-PEHDKH2L.js} +27 -27
- package/dist/{workspace-PR6VZRBG.js → workspace-FQT3QIRS.js} +1 -1
- package/dist/workspace-agent-sync-ZYCPXTU3.js +1 -0
- package/dist/workspace-archive-EEGLHZDW.js +10 -0
- package/dist/workspace-context-WAGGJCDL.js +1 -0
- package/dist/{workspace-contract-XUGMCUSQ.js → workspace-contract-SEI4SNSG.js} +1 -1
- package/dist/workspace-explain-MVGGRCDN.js +1 -0
- package/dist/workspace-explain-contract-KT757JGQ.js +1 -0
- package/dist/{workspace-feedback-R6H4UFZB.js → workspace-feedback-RCB25NFO.js} +1 -1
- package/dist/{workspace-foundation-KGSV4E6D.js → workspace-foundation-KXDL6P6X.js} +1 -1
- package/dist/{workspace-history-CGCK2DJI.js → workspace-history-M4QQBIPB.js} +1 -1
- package/dist/workspace-intelligence-QOGD2TZS.js +1 -0
- package/dist/workspace-mcp-serve-CEFKEMYG.js +3 -0
- package/dist/{workspace-model-PNXXOGPO.js → workspace-model-GMSRBICO.js} +1 -1
- package/dist/workspace-registry-summary-S52SEJAG.js +1 -0
- package/dist/workspace-run-VC4OUPRF.js +1 -0
- package/dist/{workspace-verify-WSDUUTR5.js → workspace-verify-NP4GMFSV.js} +1 -1
- package/dist/workspace-watch-IIBH3Y25.js +1 -0
- package/docs/AI_FEATURES.md +67 -34
- package/docs/README.md +2 -1
- package/docs/commands-reference.md +26 -14
- package/docs/contracts/ARTIFACT_CATALOG.md +60 -36
- package/docs/contracts/README.md +3 -2
- package/docs/create-planner-capabilities.md +36 -18
- package/docs/workspace-operations.md +25 -0
- package/package.json +35 -13
- package/scripts/enterprise-package-smoke.mjs +40 -8
- package/scripts/prepack-enterprise.mjs +8 -0
- package/templates/kits/fastapi-ddd/.gitignore.j2 +11 -0
- package/templates/kits/fastapi-ddd/README.md.j2 +23 -18
- package/templates/kits/fastapi-ddd/common/env.example.j2 +2 -2
- package/templates/kits/fastapi-ddd/pyproject.toml.j2 +7 -7
- package/templates/kits/fastapi-ddd/src/app/config/__init__.py.j2 +1 -1
- package/templates/kits/fastapi-ddd/src/cli.py.j2 +6 -9
- package/templates/kits/fastapi-ddd/src/main.py.j2 +1 -1
- package/templates/kits/fastapi-standard/.gitignore.j2 +11 -0
- package/templates/kits/fastapi-standard/README.md.j2 +35 -30
- package/templates/kits/fastapi-standard/common/env.example.j2 +2 -2
- package/templates/kits/fastapi-standard/pyproject.toml.j2 +7 -7
- package/templates/kits/fastapi-standard/src/cli.py.j2 +7 -10
- package/templates/kits/fastapi-standard/src/main.py.j2 +1 -1
- package/templates/kits/fastapi-standard/src/routing/examples.py.j2 +1 -1
- package/templates/kits/fastapi-standard/tests/test_examples.py.j2 +1 -1
- package/templates/kits/nestjs-standard/.dockerignore.j2 +11 -0
- package/templates/kits/nestjs-standard/.eslintrc.js.j2 +25 -0
- package/templates/kits/nestjs-standard/.gitignore.j2 +22 -0
- package/templates/kits/nestjs-standard/.node-version.j2 +1 -0
- package/templates/kits/nestjs-standard/.nvmrc.j2 +1 -0
- package/templates/kits/nestjs-standard/.prettierrc.j2 +7 -0
- package/templates/kits/nestjs-standard/README.md.j2 +23 -18
- package/templates/kits/nestjs-standard/docs/README.md.j2 +2 -2
- package/templates/kits/nestjs-standard/jest.config.ts.j2 +1 -7
- package/templates/kits/nestjs-standard/package.json.j2 +1 -1
- package/templates/kits/nestjs-standard/src/config/configuration.ts.j2 +4 -4
- package/templates/kits/nestjs-standard/src/main.ts.j2 +1 -1
- package/templates/kits/nestjs-standard/src/modules/index.ts.j2 +1 -1
- package/templates/kits/nestjs-standard/tsconfig.build.json.j2 +1 -1
- package/templates/kits/nestjs-standard/tsconfig.json.j2 +1 -1
- package/dist/analyze-5BU4QIPK.js +0 -1
- package/dist/autopilot-release-QYUOVB26.js +0 -1
- package/dist/chunk-54XJNLYC.js +0 -13
- package/dist/chunk-5SWNSJGW.js +0 -1
- package/dist/chunk-753LOKFZ.js +0 -2
- package/dist/chunk-AAKUNWPR.js +0 -78
- package/dist/chunk-AQ4XZZC6.js +0 -1
- package/dist/chunk-CVTCPPEF.js +0 -1
- package/dist/chunk-DNAY5ALC.js +0 -1
- package/dist/chunk-EWYYLJQY.js +0 -2
- package/dist/chunk-LO4C4VXR.js +0 -4
- package/dist/chunk-LYC6AIF2.js +0 -2
- package/dist/chunk-NAAQMSO3.js +0 -1
- package/dist/chunk-NFUXULIF.js +0 -1
- package/dist/chunk-OL64GWQC.js +0 -9
- package/dist/chunk-PI5KUXDA.js +0 -7
- package/dist/chunk-SI3AQKIP.js +0 -1
- package/dist/chunk-VZKSNUEE.js +0 -2
- package/dist/chunk-WU4ZRRA5.js +0 -4
- package/dist/chunk-XEJD4KCV.js +0 -33
- package/dist/demo-kit-AJ5LIM5G.js +0 -149
- package/dist/doctor-MF3M3FS3.js +0 -1
- package/dist/pipeline-QCUHFWDY.js +0 -5
- package/dist/workspace-agent-sync-KTYF3HQR.js +0 -1
- package/dist/workspace-archive-GCZNI44O.js +0 -3
- package/dist/workspace-context-QUTOP2XV.js +0 -1
- package/dist/workspace-explain-JEONEGZZ.js +0 -1
- package/dist/workspace-explain-contract-DNS2YEL7.js +0 -1
- package/dist/workspace-intelligence-QJGVL37U.js +0 -1
- package/dist/workspace-mcp-serve-AK4MYEHQ.js +0 -3
- package/dist/workspace-registry-summary-RUJE6RPH.js +0 -1
- package/dist/workspace-run-Y7YMUIHX.js +0 -1
- package/dist/workspace-watch-AGPOJ74Q.js +0 -1
|
@@ -6,31 +6,40 @@ CI, and AI agents share the same expectations.
|
|
|
6
6
|
|
|
7
7
|
## Lanes
|
|
8
8
|
|
|
9
|
-
| Lane
|
|
10
|
-
|
|
|
11
|
-
| `native
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
9
|
+
| Lane | Status | Meaning |
|
|
10
|
+
| ---------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
11
|
+
| `native` | Available | Workspai owns the scaffold contract, marker, registry, doctor, bootstrap, and workspace model path. |
|
|
12
|
+
| `official` | Available | A stable ecosystem generator exists. Available entries run the official generator and register the project; planned entries fall back to adopt. |
|
|
13
|
+
| `existing` | Available | The project enters Workspace Intelligence through import/adopt, not native create. |
|
|
14
14
|
|
|
15
15
|
## Native create
|
|
16
16
|
|
|
17
|
-
Native create is reserved for kits with deterministic
|
|
17
|
+
Native create is reserved for Workspai-owned kits with deterministic contracts:
|
|
18
18
|
|
|
19
19
|
- FastAPI
|
|
20
20
|
- NestJS
|
|
21
21
|
- Go Fiber and Go Gin
|
|
22
22
|
- Spring Boot
|
|
23
23
|
- ASP.NET Core Web API
|
|
24
|
-
- Frontend kits (`frontend.nextjs`, `frontend.vite-react`, `frontend.angular`, and related frontend generators)
|
|
25
24
|
|
|
26
25
|
These kits can be exposed through `workspai create project` because Workspai can
|
|
27
26
|
create the project and immediately produce the expected `.workspai` metadata,
|
|
28
27
|
workspace registry entries, doctor evidence, and workspace model data.
|
|
29
28
|
|
|
30
|
-
##
|
|
29
|
+
## Official generators
|
|
31
30
|
|
|
32
|
-
Some ecosystems have stable
|
|
33
|
-
|
|
31
|
+
Some ecosystems have stable official generators. Available entries are invoked
|
|
32
|
+
by Workspai and then registered in Workspace Intelligence:
|
|
33
|
+
|
|
34
|
+
- Next.js: `npx create-next-app@latest <name>`
|
|
35
|
+
- React Router: `npx create-react-router@latest <name>`
|
|
36
|
+
- React, Vue, Svelte, Solid, and Vite: `npm create vite@latest <name> ...`
|
|
37
|
+
- Nuxt: `npx create-nuxt@latest <name> ...`
|
|
38
|
+
- Angular: `npx @angular/cli@19 new <name>`
|
|
39
|
+
- Astro: `npm create astro@4 <name>`
|
|
40
|
+
- SvelteKit: `npx sv@latest create <name>`
|
|
41
|
+
|
|
42
|
+
Other ecosystems are planned official handoffs but are not automated yet:
|
|
34
43
|
|
|
35
44
|
- WordPress site: `wp core download`, `wp config create`, `wp db create`, `wp core install`
|
|
36
45
|
- WordPress block/plugin: `npx @wordpress/create-block@latest <slug>`
|
|
@@ -38,14 +47,19 @@ targets yet:
|
|
|
38
47
|
- Symfony: `composer create-project symfony/skeleton <name>`
|
|
39
48
|
- Rails: `rails new <name>`
|
|
40
49
|
|
|
41
|
-
These are `
|
|
50
|
+
These are `official` candidates, not active native kits. Until each planned
|
|
42
51
|
post-create contract is implemented end to end, Workspai should guide users to
|
|
43
52
|
create externally and then adopt/import the project.
|
|
44
53
|
|
|
45
54
|
## Adopt only
|
|
46
55
|
|
|
47
56
|
If a project already exists, or if the requested runtime has no Workspai-owned
|
|
48
|
-
create contract, the correct lane is `
|
|
57
|
+
create contract, the correct lane is `existing`.
|
|
58
|
+
|
|
59
|
+
The runtime names in the create planner are detection signals, not an allowlist.
|
|
60
|
+
Adopt/import is intentionally open-ended for readable projects that can be
|
|
61
|
+
registered and modeled. A project does not need to be PHP, Ruby, Rust, Elixir,
|
|
62
|
+
Clojure, Scala, or Kotlin to enter Workspace Intelligence.
|
|
49
63
|
|
|
50
64
|
Adoption still gives the project Workspace Intelligence:
|
|
51
65
|
|
|
@@ -61,19 +75,23 @@ Do not convert an unsupported or ambiguous stack request into a different native
|
|
|
61
75
|
kit. For example, a PHP, WordPress, Laravel, Symfony, or Rails request must not
|
|
62
76
|
be translated into FastAPI, NestJS, Go, Java, .NET, or a frontend kit.
|
|
63
77
|
|
|
64
|
-
If
|
|
65
|
-
and guide the user to `
|
|
78
|
+
If executable create is unavailable, the planner should explain the supported
|
|
79
|
+
lane and guide the user to `existing` or a future `official` flow.
|
|
66
80
|
|
|
67
81
|
## CLI guard
|
|
68
82
|
|
|
69
83
|
`workspai create project <kit> <name>` must check the capability lane before
|
|
70
|
-
running any native generator or
|
|
84
|
+
running any native kit, official generator, or Core engine handoff.
|
|
85
|
+
|
|
86
|
+
If the request resolves to an available `official` generator, the CLI may run
|
|
87
|
+
that ecosystem generator and then register the project in Workspace
|
|
88
|
+
Intelligence.
|
|
71
89
|
|
|
72
|
-
If the request resolves to `
|
|
73
|
-
runtime, the CLI must stop early and explain:
|
|
90
|
+
If the request resolves to a planned `official` handoff or an explicit
|
|
91
|
+
`existing` runtime signal, the CLI must stop early and explain:
|
|
74
92
|
|
|
75
93
|
- native create is not available yet for the requested stack
|
|
76
|
-
- whether the future lane is `
|
|
94
|
+
- whether the future lane is `official` or current `existing`
|
|
77
95
|
- which external generator commands are relevant, when known
|
|
78
96
|
- how to run `npx workspai adopt <project-path>` after the project exists
|
|
79
97
|
|
|
@@ -94,6 +94,13 @@ Contract file: `.workspai/workspace.contract.json`. Verification checks schema,
|
|
|
94
94
|
|
|
95
95
|
Workspai keeps the contract alive during `create project` and `workspace sync` without overwriting manual API/event/owner declarations.
|
|
96
96
|
|
|
97
|
+
On a freshly cloned or moved workspace, `workspace sync` also repairs the
|
|
98
|
+
machine-local global registry entry before discovering projects. The command is
|
|
99
|
+
therefore safe to use as the first reconciliation step after clone. For a
|
|
100
|
+
legacy workspace, run `workspace foundation ensure` once to add canonical
|
|
101
|
+
`.workspai-workspace` and `.workspai/*` foundation files while retaining legacy
|
|
102
|
+
metadata as read compatibility input.
|
|
103
|
+
|
|
97
104
|
## Portable workspace archives
|
|
98
105
|
|
|
99
106
|
```bash
|
|
@@ -106,6 +113,24 @@ npx workspai workspace hydrate team-workspace.workspai-archive.zip --output ./te
|
|
|
106
113
|
|
|
107
114
|
Export excludes dependency folders, build output, git history, logs, `.env`, and private keys by default. Use `--include-env` only for trusted internal handoffs. Hydrate accepts legacy `.rapidkit-workspace` and `.rapidkit/*` archive entries, but restores them as canonical `.workspai-workspace` and `.workspai/*` paths.
|
|
108
115
|
|
|
116
|
+
Archive export, verification, and hydrate stream file payloads instead of loading the workspace into memory. Exports use ZIP64, so multi-gigabyte workspaces and archives with more than 65,535 files are supported. Stored ZIP entries are the default; use `--archive-compression deflate` when transfer size matters more than export CPU time.
|
|
117
|
+
|
|
118
|
+
Workspace size is unrestricted by default. For untrusted remote archives, optional operational budgets can be set without imposing a product-wide workspace limit:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
npx workspai workspace hydrate https://example.test/team.zip \
|
|
122
|
+
--output ./team-workspace \
|
|
123
|
+
--max-download-size 100gb \
|
|
124
|
+
--max-expanded-size 500gb \
|
|
125
|
+
--download-timeout-ms 21600000
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
IDE, CI, and AI consumers can discover archive behavior from
|
|
129
|
+
`contracts/workspace-archive-capabilities.v1.json`. The embedded manifest and every successful
|
|
130
|
+
`--json` operation result are runtime-validated against
|
|
131
|
+
`contracts/workspace-archive-manifest.v1.json` and
|
|
132
|
+
`contracts/workspace-archive-operation-result.v1.json`.
|
|
133
|
+
|
|
109
134
|
## Workspace infrastructure (sidecar)
|
|
110
135
|
|
|
111
136
|
Discovery sources: Core module slugs, project `.env.example`, workspace contract env, and `.workspai/infra/overrides.json`.
|
package/package.json
CHANGED
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "workspai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.44.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Open-source workspace intelligence CLI for software systems: create, adopt, govern, verify, and align polyglot workspaces for humans, CI, IDEs, and AI agents.",
|
|
6
6
|
"keywords": [
|
|
7
|
-
"rapidkit",
|
|
8
7
|
"workspai",
|
|
8
|
+
"rapidkit",
|
|
9
|
+
"wspai",
|
|
9
10
|
"ai",
|
|
10
11
|
"cli",
|
|
12
|
+
"agents",
|
|
11
13
|
"create",
|
|
12
14
|
"workspace",
|
|
13
15
|
"workspace-intelligence",
|
|
16
|
+
"workspace-ai",
|
|
17
|
+
"skills",
|
|
18
|
+
"model",
|
|
19
|
+
"graph",
|
|
20
|
+
"knowledge",
|
|
14
21
|
"governance",
|
|
22
|
+
"AI-agents",
|
|
15
23
|
"backend",
|
|
16
24
|
"frontend",
|
|
25
|
+
"microservices",
|
|
26
|
+
"api",
|
|
17
27
|
"fastapi",
|
|
18
28
|
"nestjs",
|
|
19
29
|
"nextjs",
|
|
@@ -22,8 +32,6 @@
|
|
|
22
32
|
"spring",
|
|
23
33
|
"gofiber",
|
|
24
34
|
"gogin",
|
|
25
|
-
"microservices",
|
|
26
|
-
"api",
|
|
27
35
|
"generator",
|
|
28
36
|
"scaffold"
|
|
29
37
|
],
|
|
@@ -59,6 +67,7 @@
|
|
|
59
67
|
"preinstall": "node scripts/enforce-package-manager.cjs",
|
|
60
68
|
"postinstall": "node scripts/check-cli-resolution.cjs",
|
|
61
69
|
"sync-kits": "bash scripts/sync-kits.sh",
|
|
70
|
+
"sync:kits": "corepack npm run sync-kits",
|
|
62
71
|
"build": "tsup",
|
|
63
72
|
"build:watch": "tsup --watch",
|
|
64
73
|
"dev": "tsup --watch",
|
|
@@ -85,6 +94,9 @@
|
|
|
85
94
|
"test:prepare-embeddings": "node scripts/prepare-mock-embeddings.mjs",
|
|
86
95
|
"generate-embeddings": "npx tsx src/ai/generate-embeddings.ts",
|
|
87
96
|
"verify:package-cli": "node scripts/verify-package-cli.mjs",
|
|
97
|
+
"check:workspace-intelligence-runtime": "node scripts/check-workspace-intelligence-runtime-conformance.mjs",
|
|
98
|
+
"check:workspace-intelligence-adversarial": "node scripts/check-workspace-intelligence-adversarial.mjs",
|
|
99
|
+
"check:windows-registry": "node scripts/check-windows-registry-invariants.mjs",
|
|
88
100
|
"smoke:enterprise-package": "node scripts/enterprise-package-smoke.mjs",
|
|
89
101
|
"prepack": "node scripts/prepack-enterprise.mjs",
|
|
90
102
|
"test:e2e": "vitest run src/__tests__/e2e.test.ts",
|
|
@@ -99,8 +111,8 @@
|
|
|
99
111
|
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
100
112
|
"typecheck": "tsc --noEmit",
|
|
101
113
|
"validate": "corepack npm run typecheck && corepack npm run lint && corepack npm run format:check && corepack npm test",
|
|
102
|
-
"security": "npm audit --audit-level=moderate",
|
|
103
|
-
"security:fix": "npm audit fix",
|
|
114
|
+
"security": "corepack npm audit --audit-level=moderate",
|
|
115
|
+
"security:fix": "corepack npm audit fix",
|
|
104
116
|
"metrics": "npx tsx scripts/metrics.ts",
|
|
105
117
|
"validate:docs-examples": "node scripts/validate-doc-examples.mjs",
|
|
106
118
|
"check:markdown-links": "node scripts/check-markdown-links.mjs",
|
|
@@ -115,15 +127,25 @@
|
|
|
115
127
|
"analyze": "corepack npm run build && node scripts/analyze-dist.mjs",
|
|
116
128
|
"size-check": "corepack npm run build && size-limit",
|
|
117
129
|
"bench": "npx tsx scripts/benchmarks.ts",
|
|
118
|
-
"quality": "corepack npm run typecheck && corepack npm run lint && corepack npm run format:check && corepack npm test && corepack npm run size-check && corepack npm run security && corepack npm run validate:docs && corepack npm run smoke:frontend-generators && corepack npm run check:contracts && corepack npm run check:shared-contracts && corepack npm run check:parity-snapshot && corepack npm run check:agent-customization-drift",
|
|
130
|
+
"quality": "corepack npm run typecheck && corepack npm run lint && corepack npm run format:check && corepack npm test && corepack npm run size-check && corepack npm run check:workspace-intelligence-runtime && corepack npm run check:workspace-intelligence-adversarial && corepack npm run security && corepack npm run validate:docs && corepack npm run smoke:frontend-generators && corepack npm run check:contracts && corepack npm run check:shared-contracts && corepack npm run check:parity-snapshot && corepack npm run check:agent-customization-drift",
|
|
119
131
|
"act-matrix": "act -P ubuntu-latest=ghcr.io/catthehacker/ubuntu:act-22.04 -P macos-latest=ghcr.io/catthehacker/ubuntu:act-22.04 -P windows-latest=ghcr.io/catthehacker/ubuntu:act-22.04 --pull=false -j build-test-matrix",
|
|
120
132
|
"release:dry": "bash scripts/release.sh --no-publish --yes --allow-dirty",
|
|
121
133
|
"release:patch": "bash scripts/release.sh patch",
|
|
122
134
|
"release:minor": "bash scripts/release.sh minor",
|
|
123
|
-
"release:major": "bash scripts/release.sh major"
|
|
135
|
+
"release:major": "bash scripts/release.sh major",
|
|
136
|
+
"check": "corepack npm run check:windows-registry && corepack npm run typecheck && corepack npm run lint && corepack npm run format:check",
|
|
137
|
+
"ci": "corepack npm run quality",
|
|
138
|
+
"contracts:sync": "corepack npm run sync:contracts && corepack npm run sync:shared-contracts",
|
|
139
|
+
"contracts:check": "corepack npm run check:contracts && corepack npm run check:shared-contracts && corepack npm run check:parity-snapshot && corepack npm run check:generated-contracts && corepack npm run check:agent-customization-drift",
|
|
140
|
+
"contracts:validate": "corepack npm run contracts:check && corepack npm run validate:contracts && corepack npm run build && corepack npm run check:workspace-intelligence-runtime && corepack npm run check:workspace-intelligence-adversarial",
|
|
141
|
+
"docs:validate": "corepack npm run validate:docs",
|
|
142
|
+
"smoke": "corepack npm run smoke:enterprise-package && corepack npm run smoke:readme && corepack npm run smoke:frontend-generators",
|
|
143
|
+
"fix": "corepack npm run lint:fix && corepack npm run format && corepack npm run sync:contracts && corepack npm run sync:shared-contracts && corepack npm run sync-kits"
|
|
124
144
|
},
|
|
125
145
|
"dependencies": {
|
|
126
146
|
"@clack/prompts": "^0.9.1",
|
|
147
|
+
"ajv": "^8.20.0",
|
|
148
|
+
"ajv-formats": "^3.0.1",
|
|
127
149
|
"chalk": "^5.3.0",
|
|
128
150
|
"cli-progress": "^3.12.0",
|
|
129
151
|
"commander": "^12.1.0",
|
|
@@ -133,7 +155,9 @@
|
|
|
133
155
|
"nunjucks": "^3.2.4",
|
|
134
156
|
"openai": "^6.22.0",
|
|
135
157
|
"ora": "^8.0.1",
|
|
136
|
-
"validate-npm-package-name": "^5.0.1"
|
|
158
|
+
"validate-npm-package-name": "^5.0.1",
|
|
159
|
+
"yauzl": "^3.4.0",
|
|
160
|
+
"yazl": "^3.3.1"
|
|
137
161
|
},
|
|
138
162
|
"devDependencies": {
|
|
139
163
|
"@eslint/eslintrc": "^3.3.3",
|
|
@@ -144,6 +168,8 @@
|
|
|
144
168
|
"@types/node": "^20.14.0",
|
|
145
169
|
"@types/nunjucks": "^3.2.6",
|
|
146
170
|
"@types/validate-npm-package-name": "^4.0.2",
|
|
171
|
+
"@types/yauzl": "^2.10.3",
|
|
172
|
+
"@types/yazl": "^3.3.1",
|
|
147
173
|
"@typescript-eslint/eslint-plugin": "^8.46.2",
|
|
148
174
|
"@typescript-eslint/parser": "^8.46.2",
|
|
149
175
|
"@vitest/coverage-v8": "^4.0.15",
|
|
@@ -171,9 +197,5 @@
|
|
|
171
197
|
"prettier --write"
|
|
172
198
|
]
|
|
173
199
|
},
|
|
174
|
-
"overrides": {
|
|
175
|
-
"minimatch": "^10.2.1",
|
|
176
|
-
"esbuild": "^0.28.1"
|
|
177
|
-
},
|
|
178
200
|
"packageManager": "npm@10.8.2"
|
|
179
201
|
}
|
|
@@ -182,6 +182,13 @@ function parseTrailingJsonArray(stdout) {
|
|
|
182
182
|
const REQUIRED_PACKAGE_FILES = [
|
|
183
183
|
'dist/index.js',
|
|
184
184
|
'contracts/runtime-command-surface.v1.json',
|
|
185
|
+
'contracts/workspace-archive-capabilities.v1.json',
|
|
186
|
+
'contracts/workspace-archive-manifest.v1.json',
|
|
187
|
+
'contracts/workspace-archive-operation-result.v1.json',
|
|
188
|
+
'contracts/create-planner-capabilities.v1.json',
|
|
189
|
+
'contracts/project-entry-capability.v1.json',
|
|
190
|
+
'contracts/workspace-intelligence-architecture.v1.json',
|
|
191
|
+
'contracts/workspace-intelligence-chain.v1.json',
|
|
185
192
|
'contracts/extension-cli-compatibility.v1.json',
|
|
186
193
|
'data/modules-embeddings.json',
|
|
187
194
|
'templates/kits/fastapi-standard/README.md.j2',
|
|
@@ -193,10 +200,7 @@ const REQUIRED_PACKAGE_FILES = [
|
|
|
193
200
|
'scripts/enforce-package-manager.cjs',
|
|
194
201
|
];
|
|
195
202
|
|
|
196
|
-
const FORBIDDEN_PACKAGE_FILES = [
|
|
197
|
-
'workspai.config.example.js',
|
|
198
|
-
'rapidkit.config.example.js',
|
|
199
|
-
];
|
|
203
|
+
const FORBIDDEN_PACKAGE_FILES = ['workspai.config.example.js', 'rapidkit.config.example.js'];
|
|
200
204
|
|
|
201
205
|
function isPublishedByFilesPolicy(packageJson, assetPath) {
|
|
202
206
|
const files = packageJson.files ?? [];
|
|
@@ -223,7 +227,10 @@ function assertPackageFilesPolicy(requiredFiles) {
|
|
|
223
227
|
assertFile(required);
|
|
224
228
|
}
|
|
225
229
|
for (const forbidden of FORBIDDEN_PACKAGE_FILES) {
|
|
226
|
-
if (
|
|
230
|
+
if (
|
|
231
|
+
isPublishedByFilesPolicy(packageJson, forbidden) ||
|
|
232
|
+
fs.existsSync(path.join(repoRoot, forbidden))
|
|
233
|
+
) {
|
|
227
234
|
fail(`forbidden legacy package file is still present or published: ${forbidden}`);
|
|
228
235
|
}
|
|
229
236
|
}
|
|
@@ -294,7 +301,15 @@ function assertCliContracts() {
|
|
|
294
301
|
fail(`commands surface is missing top-level command: ${topLevel}`);
|
|
295
302
|
}
|
|
296
303
|
}
|
|
297
|
-
for (const subcommand of [
|
|
304
|
+
for (const subcommand of [
|
|
305
|
+
'model',
|
|
306
|
+
'snapshot',
|
|
307
|
+
'diff',
|
|
308
|
+
'impact',
|
|
309
|
+
'verify',
|
|
310
|
+
'context',
|
|
311
|
+
'explain',
|
|
312
|
+
]) {
|
|
298
313
|
if (!commands.workspace?.intelligenceSubcommands?.includes(subcommand)) {
|
|
299
314
|
fail(`workspace intelligence surface is missing subcommand: ${subcommand}`);
|
|
300
315
|
}
|
|
@@ -331,13 +346,23 @@ function smokeCreateNpmBackedKits() {
|
|
|
331
346
|
kit: 'springboot.standard',
|
|
332
347
|
name: 'enterprise-spring',
|
|
333
348
|
extraArgs: ['--java-version', '21'],
|
|
334
|
-
expectedFiles: [
|
|
349
|
+
expectedFiles: [
|
|
350
|
+
'pom.xml',
|
|
351
|
+
'src/main/resources/application.yml',
|
|
352
|
+
'.workspai/project.json',
|
|
353
|
+
'rapidkit',
|
|
354
|
+
],
|
|
335
355
|
},
|
|
336
356
|
{
|
|
337
357
|
kit: 'dotnet.webapi.clean',
|
|
338
358
|
name: 'enterprise-dotnet',
|
|
339
359
|
extraArgs: ['--target-framework', 'net8.0'],
|
|
340
|
-
expectedFiles: [
|
|
360
|
+
expectedFiles: [
|
|
361
|
+
'src/Program.cs',
|
|
362
|
+
'src/enterprise-dotnet.csproj',
|
|
363
|
+
'.workspai/project.json',
|
|
364
|
+
'rapidkit',
|
|
365
|
+
],
|
|
341
366
|
},
|
|
342
367
|
];
|
|
343
368
|
|
|
@@ -449,6 +474,13 @@ for (const relativePath of [
|
|
|
449
474
|
'package.json',
|
|
450
475
|
'dist/index.js',
|
|
451
476
|
'contracts/runtime-command-surface.v1.json',
|
|
477
|
+
'contracts/workspace-archive-capabilities.v1.json',
|
|
478
|
+
'contracts/workspace-archive-manifest.v1.json',
|
|
479
|
+
'contracts/workspace-archive-operation-result.v1.json',
|
|
480
|
+
'contracts/create-planner-capabilities.v1.json',
|
|
481
|
+
'contracts/project-entry-capability.v1.json',
|
|
482
|
+
'contracts/workspace-intelligence-architecture.v1.json',
|
|
483
|
+
'contracts/workspace-intelligence-chain.v1.json',
|
|
452
484
|
'contracts/extension-cli-compatibility.v1.json',
|
|
453
485
|
'data/modules-embeddings.json',
|
|
454
486
|
]) {
|
|
@@ -36,6 +36,14 @@ if (!fs.existsSync(tsupCli)) {
|
|
|
36
36
|
runNode([tsupCli], 'building dist');
|
|
37
37
|
runNode(['scripts/prepare-mock-embeddings.mjs'], 'preparing packaged embeddings');
|
|
38
38
|
runNode(['scripts/verify-package-cli.mjs'], 'verifying bundled CLI command ownership');
|
|
39
|
+
runNode(
|
|
40
|
+
['scripts/check-workspace-intelligence-runtime-conformance.mjs'],
|
|
41
|
+
'validating Workspace Intelligence runtime artifacts against canonical schemas'
|
|
42
|
+
);
|
|
43
|
+
runNode(
|
|
44
|
+
['scripts/check-workspace-intelligence-adversarial.mjs'],
|
|
45
|
+
'running Workspace Intelligence adversarial scenarios'
|
|
46
|
+
);
|
|
39
47
|
runNode(['scripts/enterprise-package-smoke.mjs'], 'running enterprise package smoke', {
|
|
40
48
|
RAPIDKIT_ENTERPRISE_PREPACK: '1',
|
|
41
49
|
});
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# {{ project_name }}
|
|
2
2
|
|
|
3
|
-
Domain-driven FastAPI service generated with
|
|
3
|
+
Domain-driven FastAPI service generated with [RapidKit Core](https://github.com/rapidkitlabs/rapidkit-core). It can be adopted into Workspai workspace intelligence when you want workspace-level context, evidence, and release governance.
|
|
4
4
|
|
|
5
5
|
## Quick start
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
+
# Load the project-local RapidKit Core launcher (adds .rapidkit/rapidkit to PATH)
|
|
9
|
+
source .rapidkit/activate
|
|
10
|
+
|
|
8
11
|
# Bootstrap dependencies (creates .venv + installs Poetry deps)
|
|
9
|
-
|
|
12
|
+
rapidkit init # use make init if you prefer a Make target
|
|
10
13
|
|
|
11
14
|
# Copy env templates and install hooks/tooling
|
|
12
15
|
./bootstrap.sh
|
|
@@ -19,20 +22,22 @@ make test
|
|
|
19
22
|
# Run the service
|
|
20
23
|
make dev
|
|
21
24
|
|
|
22
|
-
# Use
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
# Use RapidKit Core helpers when you prefer auto-detected environments
|
|
26
|
+
rapidkit dev
|
|
27
|
+
rapidkit lint
|
|
28
|
+
rapidkit test
|
|
26
29
|
|
|
27
30
|
# Run supply-chain and dependency audits
|
|
28
31
|
make audit
|
|
29
32
|
```
|
|
30
33
|
|
|
31
|
-
> Re-
|
|
34
|
+
> Re-source `.rapidkit/activate` whenever you open a new shell so the project-local `rapidkit` launcher is always on your PATH.
|
|
35
|
+
|
|
36
|
+
> Re-run `rapidkit init` (or `make init`) when dependencies change. If you only need to refresh tooling/hooks, run `SKIP_INIT=1 make install` or rely on `./bootstrap.sh`.
|
|
32
37
|
|
|
33
|
-
> Lockfiles are generated automatically during scaffolding. Set `RAPIDKIT_SKIP_LOCKS=1` (or `RAPIDKIT_GENERATE_LOCKS=0`) before running `
|
|
38
|
+
> Lockfiles are generated automatically during scaffolding. Set `RAPIDKIT_SKIP_LOCKS=1` (or `RAPIDKIT_GENERATE_LOCKS=0`) before running `rapidkit create` if you want to skip the lockfile attempt.
|
|
34
39
|
|
|
35
|
-
> Need to see every project-local RapidKit Core command? Run `rapidkit --help
|
|
40
|
+
> Need to see every project-local RapidKit Core command? Run `rapidkit --help`. If this project is part of a Workspai workspace, run `npx workspai --help` from the workspace root for workspace intelligence commands.
|
|
36
41
|
|
|
37
42
|
## Project structure
|
|
38
43
|
|
|
@@ -45,7 +50,7 @@ src/
|
|
|
45
50
|
presentation/ # API routers and dependencies
|
|
46
51
|
shared/ # Cross-cutting primitives (Result, types, etc.)
|
|
47
52
|
routing/ # Glue for module-provided routers
|
|
48
|
-
modules/ # RapidKit
|
|
53
|
+
modules/ # RapidKit module bootstrapping
|
|
49
54
|
```
|
|
50
55
|
|
|
51
56
|
## Layer overview
|
|
@@ -72,7 +77,7 @@ curl -s -X POST http://localhost:8000/api/examples/notes \
|
|
|
72
77
|
curl -s http://localhost:8000/api/examples/notes/1 | jq
|
|
73
78
|
```
|
|
74
79
|
|
|
75
|
-
Swap the in-memory repository with a RapidKit
|
|
80
|
+
Swap the in-memory repository with a RapidKit database module when you are ready for persistence.
|
|
76
81
|
|
|
77
82
|
## Deployment
|
|
78
83
|
|
|
@@ -84,7 +89,7 @@ Swap the in-memory repository with a RapidKit Core database module when you are
|
|
|
84
89
|
## Testing
|
|
85
90
|
|
|
86
91
|
```bash
|
|
87
|
-
|
|
92
|
+
rapidkit test
|
|
88
93
|
```
|
|
89
94
|
|
|
90
95
|
The scaffold ships with a smoke test (`tests/test_app_factory.py`) that validates the
|
|
@@ -94,15 +99,15 @@ health endpoint and the application factory.
|
|
|
94
99
|
|
|
95
100
|
## Local development
|
|
96
101
|
|
|
97
|
-
- `
|
|
98
|
-
- `make init` is an optional alias for `
|
|
99
|
-
- `make install` re-runs `
|
|
102
|
+
- `rapidkit init` bootstraps dependencies via the project-local RapidKit Core launcher (run it after sourcing `.rapidkit/activate`).
|
|
103
|
+
- `make init` is an optional alias for `rapidkit init` when you prefer Make targets.
|
|
104
|
+
- `make install` re-runs `rapidkit init` unless `SKIP_INIT=1` is set and refreshes developer tooling such as pre-commit hooks.
|
|
100
105
|
- `./bootstrap.sh` copies `.env.example` to `.env` (when missing) and runs `SKIP_INIT=1 make install` for you.
|
|
101
|
-
- `make dev` or `
|
|
102
|
-
- `make lint`, `make typecheck`, and `make test` (or `
|
|
106
|
+
- `make dev` or `rapidkit dev` starts the FastAPI server with hot-reload and ensures environment variables from `.env` are loaded.
|
|
107
|
+
- `make lint`, `make typecheck`, and `make test` (or `rapidkit lint` / `rapidkit test`) are thin wrappers around Ruff, mypy, and pytest for consistent CI parity.
|
|
103
108
|
- `make audit` runs `pip-audit` and `npm audit` to surface vulnerable dependencies early.
|
|
104
109
|
|
|
105
|
-
Pre-commit is configured with Ruff, Black, mypy, and hygiene hooks; `./bootstrap.sh` installs them automatically (or run `SKIP_INIT=1 make install`). Use the
|
|
110
|
+
Pre-commit is configured with Ruff, Black, mypy, and hygiene hooks; `./bootstrap.sh` installs them automatically (or run `SKIP_INIT=1 make install`). Use the RapidKit Core variants when you need them to auto-discover the right virtual environment inside automation scripts.
|
|
106
111
|
|
|
107
112
|
<!-- <<<inject:module-snippet>>> -->
|
|
108
113
|
|
|
@@ -17,21 +17,21 @@ help = "src.cli:help_cmd"
|
|
|
17
17
|
|
|
18
18
|
[tool.poetry.dependencies]
|
|
19
19
|
python = "^{{ python_version }}"
|
|
20
|
-
fastapi = "^0.
|
|
21
|
-
uvicorn = { extras = ["standard"], version = "^0.
|
|
20
|
+
fastapi = "^0.139.0"
|
|
21
|
+
uvicorn = { extras = ["standard"], version = "^0.50.2" }
|
|
22
22
|
pydantic = "^2.12.5"
|
|
23
23
|
{% if has_settings -%}
|
|
24
|
-
pydantic-settings = { version = "^2.
|
|
24
|
+
pydantic-settings = { version = "^2.14.2", extras = ["yaml"] }
|
|
25
25
|
{% endif %}
|
|
26
26
|
# <<<inject:poetry-dependencies>>>
|
|
27
27
|
|
|
28
28
|
[tool.poetry.group.dev.dependencies]
|
|
29
|
-
pytest = "^9.0.
|
|
29
|
+
pytest = "^9.0.3"
|
|
30
30
|
pytest-asyncio = "^1.3.0"
|
|
31
31
|
pytest-cov = "^7.0.0"
|
|
32
32
|
httpx = "^0.28.1"
|
|
33
33
|
ruff = "^0.14.10"
|
|
34
|
-
black = "^
|
|
34
|
+
black = "^26.3.1"
|
|
35
35
|
isort = "^7.0.0"
|
|
36
36
|
mypy = "^1.19.1"
|
|
37
37
|
build = "^1.3.0"
|
|
@@ -50,7 +50,7 @@ markers = [
|
|
|
50
50
|
|
|
51
51
|
[tool.ruff]
|
|
52
52
|
line-length = 100
|
|
53
|
-
exclude = [".
|
|
53
|
+
exclude = [".rapidkit/vendor"]
|
|
54
54
|
|
|
55
55
|
[tool.ruff.lint]
|
|
56
56
|
ignore = ["E501"]
|
|
@@ -61,4 +61,4 @@ ignore_missing_imports = true
|
|
|
61
61
|
warn_unused_configs = false
|
|
62
62
|
show_error_codes = true
|
|
63
63
|
# Ignore vendor snapshots and generated health shims from strict static checking
|
|
64
|
-
exclude = "(^\\.
|
|
64
|
+
exclude = "(^\\.rapidkit/vendor/|src/health/|src/main.py$|src/app/)"
|
|
@@ -7,7 +7,7 @@ from dataclasses import dataclass
|
|
|
7
7
|
|
|
8
8
|
@dataclass(slots=True)
|
|
9
9
|
class AppConfig:
|
|
10
|
-
"""Application-level configuration aggregated from RapidKit
|
|
10
|
+
"""Application-level configuration aggregated from RapidKit settings."""
|
|
11
11
|
|
|
12
12
|
environment: str = "development"
|
|
13
13
|
service_name: str = "{{ project_name }}"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""Project CLI wrapper for {{ project_name }} (DDD edition).
|
|
3
3
|
|
|
4
|
-
Prefer a per-project
|
|
4
|
+
Prefer a per-project RapidKit Core wrapper in `.rapidkit/cli.py` when present. Otherwise
|
|
5
5
|
provide helpful guidance to the developer rather than guessing environment
|
|
6
6
|
details.
|
|
7
7
|
"""
|
|
@@ -14,19 +14,16 @@ from typing import Optional
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
def _missing_cli(name: str) -> None:
|
|
17
|
-
print(f"❌ Missing project-local
|
|
18
|
-
print("💡 If you're a new user run:
|
|
17
|
+
print(f"❌ Missing project-local RapidKit Core wrapper (.rapidkit/cli.py) - can't run '{name}'")
|
|
18
|
+
print("💡 If you're a new user run: rapidkit init # create venv + install deps")
|
|
19
19
|
sys.exit(127)
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
def _load_project_cli_module() -> Optional[object]:
|
|
23
23
|
project_root = Path(__file__).resolve().parents[1]
|
|
24
|
-
cli_file = project_root / ".
|
|
24
|
+
cli_file = project_root / ".rapidkit" / "cli.py"
|
|
25
25
|
if not cli_file.exists():
|
|
26
|
-
|
|
27
|
-
if not legacy_cli_file.exists():
|
|
28
|
-
return None
|
|
29
|
-
cli_file = legacy_cli_file
|
|
26
|
+
return None
|
|
30
27
|
spec = importlib.util.spec_from_file_location("project_cli", str(cli_file))
|
|
31
28
|
if spec is None or spec.loader is None:
|
|
32
29
|
return None
|
|
@@ -38,7 +35,7 @@ def _load_project_cli_module() -> Optional[object]:
|
|
|
38
35
|
_mod = _load_project_cli_module()
|
|
39
36
|
|
|
40
37
|
|
|
41
|
-
# Default placeholders -- call `_missing_cli` if the project-local
|
|
38
|
+
# Default placeholders -- call `_missing_cli` if the project-local RapidKit Core wrapper isn't
|
|
42
39
|
# available. These are real functions so linters don't complain.
|
|
43
40
|
def init() -> None:
|
|
44
41
|
_missing_cli("init")
|
|
@@ -14,7 +14,7 @@ from src.app.main import create_app
|
|
|
14
14
|
|
|
15
15
|
@asynccontextmanager
|
|
16
16
|
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
|
|
17
|
-
"""Coordinate startup/shutdown hooks contributed by RapidKit
|
|
17
|
+
"""Coordinate startup/shutdown hooks contributed by RapidKit modules."""
|
|
18
18
|
|
|
19
19
|
_ = app # ensure the app reference stays available for injected hooks
|
|
20
20
|
# <<<inject:startup>>>
|