workspai 0.43.0 → 0.43.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/contracts/extension-cli-compatibility.v1.json +1 -1
- package/dist/{artifact-remediation-plan-5GJWPPRS.js → artifact-remediation-plan-244S5K6I.js} +3 -3
- package/dist/autopilot-release-45YVOBQO.js +1 -0
- package/dist/chunk-3QVTWKUI.js +4 -0
- package/dist/{chunk-T6OR6YOI.js → chunk-7UZVOYF5.js} +1 -1
- package/dist/{chunk-CVTCPPEF.js → chunk-AMDKXXLP.js} +1 -1
- package/dist/{chunk-EWYYLJQY.js → chunk-CDE4Q77U.js} +1 -1
- package/dist/{chunk-AFSZHLQT.js → chunk-DOCPUNWS.js} +1 -1
- package/dist/{chunk-OJEWQO3Z.js → chunk-EMTQ6OKI.js} +17 -17
- package/dist/{chunk-RE773WOX.js → chunk-FDDDQMJ2.js} +5 -5
- package/dist/{chunk-5SWNSJGW.js → chunk-FHSMY75W.js} +1 -1
- package/dist/chunk-FM7GMFZA.js +2 -0
- package/dist/{chunk-54XJNLYC.js → chunk-HV5ZFXAZ.js} +1 -1
- package/dist/{chunk-LO4C4VXR.js → chunk-LRW2SAGL.js} +1 -1
- package/dist/{chunk-PI5KUXDA.js → chunk-LTWYYP6E.js} +1 -1
- package/dist/{chunk-VRDF2J46.js → chunk-ONU457VN.js} +17 -17
- package/dist/{chunk-LUP4U6EE.js → chunk-P424XYHP.js} +1 -1
- package/dist/{chunk-LPZFK3Y6.js → chunk-PPHTYJ7G.js} +61 -61
- package/dist/{chunk-XEJD4KCV.js → chunk-TH5Y3EMA.js} +1 -1
- package/dist/chunk-TQEMLBAG.js +1 -0
- package/dist/{chunk-3KXW53QI.js → chunk-U6AXYUQY.js} +1 -1
- package/dist/{chunk-AAKUNWPR.js → chunk-UQKCCWUL.js} +43 -43
- package/dist/{chunk-VZKSNUEE.js → chunk-XNGANEXM.js} +1 -1
- package/dist/{create-WRZO4HK2.js → create-42RTNLH2.js} +1 -1
- package/dist/demo-kit-DZ7TPG7K.js +149 -0
- package/dist/doctor-DK4BON3N.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.js +222 -185
- package/dist/pipeline-HQ57V6OZ.js +5 -0
- package/dist/{pythonRapidkitExec-3L3XJBSY.js → pythonRapidkitExec-GCQ3M46E.js} +1 -1
- package/dist/{springboot-standard-OZYF7ZM7.js → springboot-standard-PEHDKH2L.js} +27 -27
- package/dist/{workspace-PR6VZRBG.js → workspace-DZHWB7BV.js} +1 -1
- package/dist/{workspace-agent-sync-KTYF3HQR.js → workspace-agent-sync-5ADIQS7B.js} +1 -1
- package/dist/{workspace-context-QUTOP2XV.js → workspace-context-GEXDHA7A.js} +1 -1
- package/dist/{workspace-contract-XUGMCUSQ.js → workspace-contract-2TA27LGT.js} +1 -1
- package/dist/workspace-explain-D5NNL3NG.js +1 -0
- package/dist/{workspace-foundation-KGSV4E6D.js → workspace-foundation-FQWHPQGX.js} +1 -1
- package/dist/{workspace-intelligence-QJGVL37U.js → workspace-intelligence-BEM6WGCZ.js} +1 -1
- package/dist/{workspace-mcp-serve-AK4MYEHQ.js → workspace-mcp-serve-OMBA5V3C.js} +1 -1
- package/dist/{workspace-model-PNXXOGPO.js → workspace-model-F3B75TYT.js} +1 -1
- package/dist/workspace-registry-summary-6MFBRWDS.js +1 -0
- package/dist/workspace-run-3WJXIQKR.js +1 -0
- package/dist/{workspace-verify-WSDUUTR5.js → workspace-verify-OAATQV5T.js} +1 -1
- package/dist/{workspace-watch-AGPOJ74Q.js → workspace-watch-HU2OTQ52.js} +1 -1
- package/package.json +12 -2
- 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/autopilot-release-QYUOVB26.js +0 -1
- package/dist/chunk-LYC6AIF2.js +0 -2
- package/dist/chunk-WU4ZRRA5.js +0 -4
- 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-explain-JEONEGZZ.js +0 -1
- package/dist/workspace-registry-summary-RUJE6RPH.js +0 -1
- package/dist/workspace-run-Y7YMUIHX.js +0 -1
|
@@ -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>>>
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# {{ project_name | replace('_', ' ') | title }}
|
|
2
2
|
|
|
3
|
-
A minimal FastAPI service generated with
|
|
3
|
+
A minimal FastAPI service generated with **RapidKit Core** using the FastAPI Standard Kit. 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-managed 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,45 +22,47 @@ make audit
|
|
|
19
22
|
|
|
20
23
|
# Start development server with hot reload
|
|
21
24
|
make dev
|
|
22
|
-
|
|
25
|
+
rapidkit dev # same as make dev but auto-detects the project
|
|
23
26
|
|
|
24
|
-
# Prefer
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
# Prefer RapidKit Core helpers when you want it to resolve scripts automatically
|
|
28
|
+
rapidkit lint
|
|
29
|
+
rapidkit test
|
|
30
|
+
rapidkit start
|
|
28
31
|
```
|
|
29
32
|
|
|
30
|
-
>
|
|
33
|
+
> Always run `source .rapidkit/activate` after opening a new shell so the project-local `rapidkit` launcher and helper scripts stay on your PATH.
|
|
34
|
+
|
|
35
|
+
> Re-run `rapidkit init` (or `make init`) whenever dependencies change, or use `SKIP_INIT=1 make install` if you only need to refresh tooling/hooks without reinstalling packages.
|
|
31
36
|
|
|
32
|
-
> Lockfiles are generated automatically during scaffolding. Set `RAPIDKIT_SKIP_LOCKS=1` (or `RAPIDKIT_GENERATE_LOCKS=0`) before running `
|
|
37
|
+
> Lockfiles are generated automatically during scaffolding. Set `RAPIDKIT_SKIP_LOCKS=1` (or `RAPIDKIT_GENERATE_LOCKS=0`) before running `rapidkit create` if you need to opt out.
|
|
33
38
|
|
|
34
|
-
> Want the
|
|
39
|
+
> Want the project-local RapidKit Core catalog? Run `rapidkit --help`. If this project is part of a Workspai workspace, run `npx workspai --help` from the workspace root for workspace intelligence commands.
|
|
35
40
|
|
|
36
41
|
---
|
|
37
42
|
|
|
38
43
|
## Local development
|
|
39
44
|
|
|
40
|
-
- `
|
|
41
|
-
- `make init` is an optional alias for `
|
|
42
|
-
- `make install` re-runs `
|
|
45
|
+
- `rapidkit init` bootstraps dependencies via the project-local RapidKit Core launcher (run it after sourcing `.rapidkit/activate`).
|
|
46
|
+
- `make init` is an optional alias for `rapidkit init` when you prefer Make targets.
|
|
47
|
+
- `make install` re-runs `rapidkit init` (unless you set `SKIP_INIT=1`) and refreshes developer tooling such as pre-commit hooks.
|
|
43
48
|
- `./bootstrap.sh` copies `.env.example` to `.env` (if missing) and runs `SKIP_INIT=1 make install` for you.
|
|
44
|
-
- `make dev` (or `
|
|
49
|
+
- `make dev` (or `rapidkit dev`) launches Uvicorn with the correct module path and reload settings.
|
|
45
50
|
- `make lint`, `make typecheck`, and `make test` wrap Ruff, mypy, and pytest for consistent CI parity.
|
|
46
51
|
- `make audit` shells out to `pip-audit` to surface vulnerable dependencies.
|
|
47
|
-
- Prefer `
|
|
52
|
+
- Prefer `rapidkit lint`, `rapidkit test`, and `rapidkit start` if you want RapidKit Core to autodetect the virtualenv and command wiring.
|
|
48
53
|
```
|
|
49
54
|
|
|
50
55
|
## Available commands
|
|
51
56
|
|
|
52
57
|
```bash
|
|
53
|
-
|
|
54
|
-
make init # 🔧 Optional alias for
|
|
58
|
+
rapidkit init # 🔧 Bootstrap the project (create .venv + install deps)
|
|
59
|
+
make init # 🔧 Optional alias for rapidkit init (wraps the local Core launcher)
|
|
55
60
|
./bootstrap.sh # 🪄 Copy env template + install hooks/tooling (idempotent)
|
|
56
|
-
|
|
61
|
+
rapidkit dev # 🚀 Start development server with hot reload
|
|
57
62
|
make dev # 🚀 Alternative via Makefile helper
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
rapidkit start # ⚡ Start production server
|
|
64
|
+
rapidkit lint # 🔧 Run lint checks via RapidKit Core
|
|
65
|
+
rapidkit test # 🧪 Run pytest through RapidKit Core
|
|
61
66
|
make install # 📦 Install Poetry deps + hooks
|
|
62
67
|
make lint # ✅ Lint via Ruff + Black
|
|
63
68
|
make typecheck # 🔍 Run mypy on src
|
|
@@ -84,18 +89,18 @@ The scaffold ships with a tiny in-memory **notes** API mounted under `/api/examp
|
|
|
84
89
|
# Create a note
|
|
85
90
|
curl -s -X POST http://localhost:8000/api/examples/notes \
|
|
86
91
|
-H "Content-Type: application/json" \
|
|
87
|
-
-d '{"title":"first","body":"scaffolded by
|
|
92
|
+
-d '{"title":"first","body":"scaffolded by RapidKit"}'
|
|
88
93
|
|
|
89
94
|
# List notes
|
|
90
95
|
curl -s http://localhost:8000/api/examples/notes | jq
|
|
91
96
|
```
|
|
92
97
|
|
|
93
|
-
The implementation intentionally stays in memory so you can replace it with a repository-backed service once you install RapidKit
|
|
98
|
+
The implementation intentionally stays in memory so you can replace it with a repository-backed service once you install RapidKit database modules.
|
|
94
99
|
|
|
95
100
|
{% if selected_modules %}
|
|
96
|
-
## Recommended RapidKit
|
|
101
|
+
## Recommended RapidKit modules
|
|
97
102
|
|
|
98
|
-
The following RapidKit
|
|
103
|
+
The following RapidKit modules are suggested during scaffolding; install them any time with `rapidkit add module <name>`:
|
|
99
104
|
|
|
100
105
|
{% for module in selected_modules %}- {{ module.name | replace('_', ' ') | title }} (`{{ module.name }}`{% if not module.required %}, optional{% endif %}) – tier: {{ module.tier }}
|
|
101
106
|
{% endfor %}
|
|
@@ -105,18 +110,18 @@ The following RapidKit Core modules are suggested during scaffolding; install th
|
|
|
105
110
|
|
|
106
111
|
Use `rapidkit add module <module-name>` to install optional capabilities. Modules inject imports, routes, and services through the anchors defined in `src/main.py` and `src/routing/__init__.py`.
|
|
107
112
|
|
|
108
|
-
During kit generation you can decide whether the RapidKit
|
|
113
|
+
During kit generation you can decide whether the core RapidKit modules ship with the scaffold:
|
|
109
114
|
|
|
110
115
|
```text
|
|
111
|
-
Install the RapidKit
|
|
112
|
-
Install the RapidKit
|
|
116
|
+
Install the RapidKit settings module? [Y/n]
|
|
117
|
+
Install the RapidKit logging module? [Y/n]
|
|
113
118
|
Install deployment module assets (Docker/CI)? [Y/n]
|
|
114
119
|
```
|
|
115
120
|
|
|
116
|
-
### Scaffold toggles vs RapidKit
|
|
121
|
+
### Scaffold toggles vs RapidKit modules
|
|
117
122
|
|
|
118
123
|
- `enable_*` prompts (for Docker, CI, SQLite, etc.) control the starter assets generated by this kit.
|
|
119
|
-
- `install_*` prompts control which RapidKit
|
|
124
|
+
- `install_*` prompts control which RapidKit modules are installed up front.
|
|
120
125
|
- You can always add modules later with `rapidkit add module <name>` if you skip them during scaffolding.
|
|
121
126
|
|
|
122
127
|
When you need deployment artefacts in an existing project, install the optional `deployment` module:
|
|
@@ -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$)"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""Project CLI wrapper for {{ project_name }}.
|
|
3
3
|
|
|
4
|
-
This file prefers a per-project
|
|
4
|
+
This file prefers a per-project RapidKit Core wrapper (generated at `.rapidkit/cli.py`) when
|
|
5
5
|
available. If not present it prints helpful guidance directing users to
|
|
6
|
-
`
|
|
6
|
+
`rapidkit init` and does not attempt to make assumptions about a packaging
|
|
7
7
|
environment.
|
|
8
8
|
"""
|
|
9
9
|
|
|
@@ -15,19 +15,16 @@ from typing import Optional
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
def _missing_cli(name: str) -> None:
|
|
18
|
-
print(f"❌ Missing project-local
|
|
19
|
-
print("💡 If you're a new user run:
|
|
18
|
+
print(f"❌ Missing project-local RapidKit Core wrapper (.rapidkit/cli.py) - can't run '{name}'")
|
|
19
|
+
print("💡 If you're a new user run: rapidkit init # create venv + install deps")
|
|
20
20
|
sys.exit(127)
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
def _load_project_cli_module() -> Optional[object]:
|
|
24
24
|
project_root = Path(__file__).resolve().parents[1]
|
|
25
|
-
cli_file = project_root / ".
|
|
25
|
+
cli_file = project_root / ".rapidkit" / "cli.py"
|
|
26
26
|
if not cli_file.exists():
|
|
27
|
-
|
|
28
|
-
if not legacy_cli_file.exists():
|
|
29
|
-
return None
|
|
30
|
-
cli_file = legacy_cli_file
|
|
27
|
+
return None
|
|
31
28
|
spec = importlib.util.spec_from_file_location("project_cli", str(cli_file))
|
|
32
29
|
if spec is None or spec.loader is None:
|
|
33
30
|
return None
|
|
@@ -39,7 +36,7 @@ def _load_project_cli_module() -> Optional[object]:
|
|
|
39
36
|
_mod = _load_project_cli_module()
|
|
40
37
|
|
|
41
38
|
|
|
42
|
-
# Default placeholders -- call `_missing_cli` if the project-local
|
|
39
|
+
# Default placeholders -- call `_missing_cli` if the project-local RapidKit Core wrapper isn't
|
|
43
40
|
# available. These are real functions so linters don't complain.
|
|
44
41
|
def init() -> None:
|
|
45
42
|
_missing_cli("init")
|
|
@@ -32,7 +32,7 @@ from .routing import api_router
|
|
|
32
32
|
|
|
33
33
|
@asynccontextmanager
|
|
34
34
|
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
|
|
35
|
-
"""Coordinate startup/shutdown hooks contributed by RapidKit
|
|
35
|
+
"""Coordinate startup/shutdown hooks contributed by RapidKit modules."""
|
|
36
36
|
|
|
37
37
|
_ = app # ensure the app reference stays available for injected hooks
|
|
38
38
|
# <<<inject:startup>>>
|
|
@@ -10,7 +10,7 @@ client = TestClient(app)
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def test_create_and_list_notes() -> None:
|
|
13
|
-
payload = {"title": "First note", "body": "Documented via
|
|
13
|
+
payload = {"title": "First note", "body": "Documented via RapidKit."}
|
|
14
14
|
create_response = client.post("/api/examples/notes", json=payload)
|
|
15
15
|
assert create_response.status_code == 201
|
|
16
16
|
data = create_response.json()
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
parser: '@typescript-eslint/parser',
|
|
3
|
+
parserOptions: {
|
|
4
|
+
project: ['tsconfig.json'],
|
|
5
|
+
tsconfigRootDir: __dirname,
|
|
6
|
+
sourceType: 'module',
|
|
7
|
+
},
|
|
8
|
+
plugins: ['@typescript-eslint/eslint-plugin'],
|
|
9
|
+
extends: [
|
|
10
|
+
'plugin:@typescript-eslint/recommended',
|
|
11
|
+
'plugin:prettier/recommended',
|
|
12
|
+
],
|
|
13
|
+
root: true,
|
|
14
|
+
env: {
|
|
15
|
+
node: true,
|
|
16
|
+
jest: true,
|
|
17
|
+
},
|
|
18
|
+
ignorePatterns: ['.eslintrc.js'],
|
|
19
|
+
rules: {
|
|
20
|
+
'@typescript-eslint/interface-name-prefix': 'off',
|
|
21
|
+
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
22
|
+
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
|
23
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
24
|
+
},
|
|
25
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Node artifacts
|
|
2
|
+
node_modules/
|
|
3
|
+
dist/
|
|
4
|
+
.tmp/
|
|
5
|
+
.env
|
|
6
|
+
.env.*
|
|
7
|
+
|
|
8
|
+
# Logs
|
|
9
|
+
logs/
|
|
10
|
+
*.log
|
|
11
|
+
npm-debug.log*
|
|
12
|
+
yarn-debug.log*
|
|
13
|
+
yarn-error.log*
|
|
14
|
+
pnpm-debug.log*
|
|
15
|
+
|
|
16
|
+
# OS
|
|
17
|
+
.DS_Store
|
|
18
|
+
Thumbs.db
|
|
19
|
+
|
|
20
|
+
# IDEs
|
|
21
|
+
.idea/
|
|
22
|
+
.vscode/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{ node_version }}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{ node_version }}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
# {{ project_name | replace('-', ' ') | title }}
|
|
2
2
|
|
|
3
|
-
A production-ready NestJS 11 application generated with
|
|
3
|
+
A production-ready NestJS 11 application generated with **RapidKit Core** using the NestJS Standard Kit. It can be adopted into Workspai workspace intelligence when you want workspace-level context, evidence, and release governance.
|
|
4
4
|
|
|
5
5
|
## Getting Started
|
|
6
6
|
> Recommended Node version: `{{ node_version }}` (`.nvmrc` and `.node-version` are included for your toolchain)
|
|
7
7
|
|
|
8
8
|
```bash
|
|
9
|
-
#
|
|
10
|
-
|
|
9
|
+
# Load the project-local RapidKit Core launcher (adds .rapidkit/rapidkit to PATH)
|
|
10
|
+
source .rapidkit/activate
|
|
11
|
+
|
|
12
|
+
# Bootstrap dependencies using RapidKit Core
|
|
13
|
+
rapidkit init # use make init if you prefer a Make target
|
|
11
14
|
|
|
12
15
|
# Copy env templates + install hooks/tooling
|
|
13
16
|
./bootstrap.sh
|
|
@@ -16,37 +19,39 @@ npx workspai init # use make init if you prefer a Make target
|
|
|
16
19
|
make dev
|
|
17
20
|
|
|
18
21
|
# Or rely on the project-local RapidKit Core helpers:
|
|
19
|
-
|
|
22
|
+
rapidkit dev
|
|
20
23
|
|
|
21
24
|
# Run linting, type-checking, tests, and supply-chain audits
|
|
22
25
|
make lint
|
|
23
26
|
make typecheck
|
|
24
27
|
make test
|
|
25
28
|
make audit
|
|
26
|
-
|
|
27
|
-
|
|
29
|
+
rapidkit lint
|
|
30
|
+
rapidkit test
|
|
28
31
|
```
|
|
29
32
|
|
|
30
|
-
>
|
|
33
|
+
> Open a new shell? Run `source .rapidkit/activate` again so the project-local `rapidkit` launcher stays on your PATH.
|
|
34
|
+
|
|
35
|
+
> Use `rapidkit init` (or `make init`) whenever dependencies change. Pass `SKIP_INIT=1` (for example `SKIP_INIT=1 make install`) if you only need to refresh tooling/hooks.
|
|
31
36
|
|
|
32
|
-
> Lockfiles are generated automatically during scaffolding. Set `RAPIDKIT_SKIP_LOCKS=1` (or `RAPIDKIT_GENERATE_LOCKS=0`) before running `
|
|
37
|
+
> Lockfiles are generated automatically during scaffolding. Set `RAPIDKIT_SKIP_LOCKS=1` (or `RAPIDKIT_GENERATE_LOCKS=0`) before running `rapidkit create` if you need to skip this step.
|
|
33
38
|
|
|
34
|
-
> Need the project-local RapidKit Core command list? Run `rapidkit --help
|
|
39
|
+
> Need the project-local RapidKit Core command list? Run `rapidkit --help`. If this project is part of a Workspai workspace, run `npx workspai --help` from the workspace root for workspace intelligence commands.
|
|
35
40
|
|
|
36
41
|
---
|
|
37
42
|
|
|
38
43
|
## Quick start (developer)
|
|
39
44
|
|
|
40
|
-
1. `
|
|
41
|
-
2. `make init` remains available as an alias to `
|
|
45
|
+
1. `rapidkit init` (after `source .rapidkit/activate`) bootstraps dependencies through the project-local RapidKit Core launcher and enforces lockfile flags for your chosen package manager.
|
|
46
|
+
2. `make init` remains available as an alias to `rapidkit init` when you prefer Make targets.
|
|
42
47
|
3. `./bootstrap.sh` copies `.env.example` to `.env` (when missing) and runs `SKIP_INIT=1 make install` so git hooks and tooling stay current without reinstalling packages.
|
|
43
48
|
4. `make dev` wraps `{{ package_manager if package_manager != 'pnpm' else 'pnpm' }} run start:dev` and centralizes env loading; use it for day-to-day development.
|
|
44
49
|
5. `make lint`, `make typecheck`, and `make test` proxy to the underlying package scripts or `tsc` so local changes match CI expectations.
|
|
45
50
|
6. `make audit` executes `{{ package_manager }}`'s security audit (falling back to dev dependencies if needed) to surface vulnerable packages early.
|
|
46
51
|
|
|
47
|
-
`make install` is still available; it re-runs `
|
|
52
|
+
`make install` is still available; it re-runs `rapidkit init` unless you set `SKIP_INIT=1`, so prefer `SKIP_INIT=1 make install` when you only need to refresh tooling.
|
|
48
53
|
|
|
49
|
-
Prefer `
|
|
54
|
+
Prefer `rapidkit dev`, `rapidkit test`, or `rapidkit lint` when you want RapidKit Core to auto-detect the right runtime; they call into the same project scripts wrapped by the Make targets.
|
|
50
55
|
|
|
51
56
|
Prefer the Make targets for consistency, but you can always fall back to native commands if needed:
|
|
52
57
|
|
|
@@ -73,11 +78,11 @@ If you see engine compatibility errors during `{{ package_manager }} install`, u
|
|
|
73
78
|
|
|
74
79
|
- `src/main.ts` – Bootstraps the NestJS application
|
|
75
80
|
- `src/app.module.ts` – Core application module with injection anchors
|
|
76
|
-
- `src/modules/` – Container for RapidKit
|
|
81
|
+
- `src/modules/` – Container for RapidKit modules (`// <<<inject:module-init>>>`)
|
|
77
82
|
- `src/config/` – Centralized configuration module and validation
|
|
78
83
|
- `test/` – Unit and e2e testing with Jest
|
|
79
84
|
|
|
80
|
-
## RapidKit
|
|
85
|
+
## RapidKit Modules
|
|
81
86
|
|
|
82
87
|
Install additional modules as needed:
|
|
83
88
|
|
|
@@ -97,13 +102,13 @@ The scaffold ships with an `ExamplesModule` exposing a tiny in-memory notes API
|
|
|
97
102
|
# Create a note
|
|
98
103
|
curl -s -X POST http://localhost:3000/examples/notes \
|
|
99
104
|
-H "Content-Type: application/json" \
|
|
100
|
-
-d '{"title":"hello","body":"documented via
|
|
105
|
+
-d '{"title":"hello","body":"documented via RapidKit"}'
|
|
101
106
|
|
|
102
107
|
# List all notes
|
|
103
108
|
curl -s http://localhost:3000/examples/notes | jq
|
|
104
109
|
```
|
|
105
110
|
|
|
106
|
-
Replace the in-memory service with a proper repository once you add RapidKit
|
|
111
|
+
Replace the in-memory service with a proper repository once you add RapidKit database modules.
|
|
107
112
|
|
|
108
113
|
## Docker
|
|
109
114
|
|
|
@@ -121,7 +126,7 @@ docker-compose down
|
|
|
121
126
|
| `{{ package_manager if package_manager != 'pnpm' else 'pnpm' }} test` | Run tests |
|
|
122
127
|
|
|
123
128
|
---
|
|
124
|
-
Generated
|
|
129
|
+
Generated with RapidKit Core. Compatible with Workspai workspace intelligence.
|
|
125
130
|
|
|
126
131
|
## 📄 License
|
|
127
132
|
|
|
@@ -6,10 +6,10 @@ Welcome to the documentation portal for **{{ project_name | replace('-', ' ') |
|
|
|
6
6
|
|
|
7
7
|
- `architecture/` – System design documents and decisions
|
|
8
8
|
- `operations/` – Runbooks and operational procedures
|
|
9
|
-
- `modules/` – Documentation for installed RapidKit
|
|
9
|
+
- `modules/` – Documentation for installed RapidKit modules
|
|
10
10
|
|
|
11
11
|
## Getting Started
|
|
12
12
|
|
|
13
13
|
1. Update this documentation with project-specific details.
|
|
14
14
|
2. Document any architectural decisions in `architecture/adr-000-template.md`.
|
|
15
|
-
3. Keep module docs in sync with installed RapidKit
|
|
15
|
+
3. Keep module docs in sync with installed RapidKit modules.
|
|
@@ -5,13 +5,7 @@ const config: Config = {
|
|
|
5
5
|
rootDir: '.',
|
|
6
6
|
testEnvironment: 'node',
|
|
7
7
|
testRegex: '.*\\.spec.ts$',
|
|
8
|
-
testPathIgnorePatterns: [
|
|
9
|
-
'/node_modules/',
|
|
10
|
-
'/.workspai/vendor/',
|
|
11
|
-
'/.workspai/snapshots/',
|
|
12
|
-
'/.rapidkit/vendor/',
|
|
13
|
-
'/.rapidkit/snapshots/',
|
|
14
|
-
],
|
|
8
|
+
testPathIgnorePatterns: ['/node_modules/', '/.rapidkit/vendor/', '/.rapidkit/snapshots/'],
|
|
15
9
|
transform: {
|
|
16
10
|
'^.+\\.ts$': 'ts-jest',
|
|
17
11
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "{{ project_name | replace('_', '-') | lower }}",
|
|
3
3
|
"version": "{{ app_version | default('1.0.0') }}",
|
|
4
|
-
"description": "{{ description | default('NestJS application generated with
|
|
4
|
+
"description": "{{ description | default('NestJS application generated with RapidKit Core') }}",
|
|
5
5
|
"license": "{{ license | default('Apache-2.0') }}",
|
|
6
6
|
"author": "{{ author }}",
|
|
7
7
|
"engines": {
|
|
@@ -3,9 +3,9 @@ import { registerAs } from '@nestjs/config';
|
|
|
3
3
|
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
5
5
|
|
|
6
|
-
// Dynamic vendor loader - resolves .
|
|
6
|
+
// Dynamic vendor loader - resolves .rapidkit/vendor in project root or uses
|
|
7
7
|
// RAPIDKIT_VENDOR_ROOT if set. This avoids hard-coded relative imports into
|
|
8
|
-
// src/.
|
|
8
|
+
// src/.rapidkit and makes generated projects robust and portable.
|
|
9
9
|
const VENDOR_ROOT_ENV = 'RAPIDKIT_VENDOR_ROOT';
|
|
10
10
|
const VENDOR_MODULE = '{{ rapidkit_vendor_module }}';
|
|
11
11
|
const VENDOR_VERSION = '{{ rapidkit_vendor_version }}';
|
|
@@ -16,7 +16,7 @@ function resolveVendorRoot(): string {
|
|
|
16
16
|
if (override && override.trim().length > 0) {
|
|
17
17
|
return path.resolve(override);
|
|
18
18
|
}
|
|
19
|
-
return path.resolve(process.cwd(), '.
|
|
19
|
+
return path.resolve(process.cwd(), '.rapidkit', 'vendor');
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
function resolveVendorModule() {
|
|
@@ -27,7 +27,7 @@ function resolveVendorModule() {
|
|
|
27
27
|
VENDOR_CONFIGURATION_RELATIVE,
|
|
28
28
|
);
|
|
29
29
|
// Attempt to dynamically load a vendor-provided configuration. If the
|
|
30
|
-
// vendor snapshot is not present in .
|
|
30
|
+
// vendor snapshot is not present in .rapidkit/vendor (common when the
|
|
31
31
|
// 'settings' module wasn't installed), fail gracefully instead of
|
|
32
32
|
// allowing require() to throw and crash the application.
|
|
33
33
|
try {
|
|
@@ -30,7 +30,7 @@ async function bootstrap() {
|
|
|
30
30
|
const enableDocs = process.env.RAPIDKIT_ENABLE_SWAGGER === '1' || process.env.NODE_ENV !== 'production';
|
|
31
31
|
if (enableDocs) {
|
|
32
32
|
const config = new DocumentBuilder()
|
|
33
|
-
.setTitle('{{ project_name | default("
|
|
33
|
+
.setTitle('{{ project_name | default("RapidKit App") }} API')
|
|
34
34
|
.setDescription('Auto-generated API docs')
|
|
35
35
|
.setVersion('{{ app_version | default("1.0.0") }}')
|
|
36
36
|
.addBearerAuth()
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{b as AUTOPILOT_RELEASE_ALIAS_FILENAME,a as AUTOPILOT_RELEASE_LAST_RUN_FILENAME,c as runAutopilotRelease}from'./chunk-PI5KUXDA.js';
|