agentme 0.6.0 → 0.7.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/.xdrs/agentme/edrs/application/003-javascript-project-tooling.md +13 -13
- package/.xdrs/agentme/edrs/application/010-golang-project-tooling.md +21 -20
- package/.xdrs/agentme/edrs/application/014-python-project-tooling.md +15 -13
- package/.xdrs/agentme/edrs/application/skills/001-create-javascript-project/SKILL.md +4 -4
- package/.xdrs/agentme/edrs/application/skills/003-create-golang-project/SKILL.md +29 -13
- package/.xdrs/agentme/edrs/application/skills/005-create-python-project/SKILL.md +46 -30
- package/.xdrs/agentme/edrs/devops/005-monorepo-structure.md +4 -3
- package/.xdrs/agentme/edrs/devops/008-common-targets.md +59 -50
- package/.xdrs/agentme/edrs/devops/skills/002-monorepo-setup/SKILL.md +9 -9
- package/README.md +9 -11
- package/package.json +1 -1
|
@@ -23,14 +23,14 @@ Clear, consistent tooling and layout enable fast onboarding, reliable CI pipelin
|
|
|
23
23
|
|
|
24
24
|
| Tool | Purpose |
|
|
25
25
|
|------|---------|
|
|
26
|
-
| **Mise** |
|
|
26
|
+
| **Mise** | Mandatory tool version management and command runner for Node.js, pnpm, and project CLIs |
|
|
27
27
|
| **pnpm** | Package manager — strict linking, workspace support, fast installs |
|
|
28
28
|
| **tsc** | TypeScript compilation — type checking, declaration generation |
|
|
29
29
|
| **esbuild** | Bundling — fast bundling for distribution or single-binary outputs |
|
|
30
30
|
| **eslint** | Linting — code style and quality enforcement |
|
|
31
31
|
| **jest** | Testing — unit and integration test runner |
|
|
32
32
|
|
|
33
|
-
All commands are run exclusively through Makefiles, not through `package.json` scripts. The repository root
|
|
33
|
+
All commands are run exclusively through Makefiles, not through `package.json` scripts. The repository root MUST define a `.mise.toml` that pins at least Node.js and pnpm. Contributors and CI MUST bootstrap with `make setup` or `mise install`, then invoke routine work with `make <target>`. Each Makefile recipe MUST execute the underlying tool through `mise exec -- <tool> ...` so command behavior does not depend on an activated shell. Using host-installed `node`, `pnpm`, or other project CLIs directly for routine project work is not allowed.
|
|
34
34
|
|
|
35
35
|
#### ESLint
|
|
36
36
|
|
|
@@ -74,35 +74,35 @@ When `tsconfig.json` extends `@tsconfig/node24/tsconfig.json`, the default `modu
|
|
|
74
74
|
└── tests_benchmark/ # optional benchmark harnesses
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
The root `Makefile` delegates every target to `/lib` then `/examples` in sequence and is
|
|
77
|
+
The root `Makefile` delegates every target to `/lib` then `/examples` in sequence. Parent Makefiles should call child Makefiles directly, and each module Makefile is responsible for running its actual tool commands through `mise exec --`.
|
|
78
78
|
|
|
79
79
|
When a repository contains multiple JavaScript/TypeScript packages, each package MUST live in its own module folder such as `lib/my-package/` or `services/my-service/`, each with its own `Makefile`, `README.md`, `dist/`, and `.cache/`.
|
|
80
80
|
|
|
81
81
|
Persistent caches MUST live under `.cache/`. Recommended locations are Jest `cacheDirectory`, ESLint `--cache-location`, TypeScript `tsBuildInfoFile`, and coverage outputs.
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
Contributors and CI MUST invoke the commands below as `make <target>`. The Makefile recipes themselves MUST call the underlying tools through `mise exec -- <tool> ...`.
|
|
84
84
|
|
|
85
85
|
#### lib/Makefile targets
|
|
86
86
|
|
|
87
87
|
| Target | Description |
|
|
88
88
|
|--------|-------------|
|
|
89
|
-
| `install` | `pnpm install --frozen-lockfile` |
|
|
90
|
-
| `build` |
|
|
91
|
-
| `build-module` |
|
|
92
|
-
| `lint` | `pnpm exec eslint ./src` |
|
|
93
|
-
| `lint-fix` | `pnpm exec eslint ./src --fix` |
|
|
94
|
-
| `test` | `pnpm exec jest --verbose` |
|
|
95
|
-
| `test-watch` | `pnpm exec jest --watch` |
|
|
89
|
+
| `install` | `mise exec -- pnpm install --frozen-lockfile` |
|
|
90
|
+
| `build` | `mise exec -- pnpm exec tsc ...`, strip test files from `dist/`, then `mise exec -- pnpm pack` for local use by examples |
|
|
91
|
+
| `build-module` | `mise exec -- pnpm exec tsc ...` only (no pack) |
|
|
92
|
+
| `lint` | `mise exec -- pnpm exec eslint ./src` |
|
|
93
|
+
| `lint-fix` | `mise exec -- pnpm exec eslint ./src --fix` |
|
|
94
|
+
| `test` | `mise exec -- pnpm exec jest --verbose` |
|
|
95
|
+
| `test-watch` | `mise exec -- pnpm exec jest --watch` |
|
|
96
96
|
| `clean` | remove `node_modules/`, `dist/`, and `.cache/` |
|
|
97
97
|
| `all` | `build lint test` |
|
|
98
|
-
| `publish` |
|
|
98
|
+
| `publish` | `mise exec -- npx -y monotag ...`, then `mise exec -- npm publish --provenance` |
|
|
99
99
|
|
|
100
100
|
#### lib/package.json key fields
|
|
101
101
|
|
|
102
102
|
- `"main"`: `dist/index.js`
|
|
103
103
|
- `"types"`: `dist/index.d.ts`
|
|
104
104
|
- `"files"`: `["dist/**", "package.json", "README.md"]`
|
|
105
|
-
- `"scripts"`: empty
|
|
105
|
+
- `"scripts"`: empty by default. If reverse compatibility requires scripts, each script must be a direct one-line delegation to one Makefile target.
|
|
106
106
|
|
|
107
107
|
#### examples/
|
|
108
108
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agentme-edr-010-go-project-tooling-and-structure
|
|
3
|
-
description: Defines the standard Go project toolchain, layout, and Makefile workflow for agentme-based projects. Use when scaffolding or reviewing Go projects.
|
|
3
|
+
description: Defines the standard Go project toolchain, layout, and Makefile workflow using Mise for agentme-based projects. Use when scaffolding or reviewing Go projects.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# agentme-edr-010: Go project tooling and structure
|
|
@@ -13,7 +13,7 @@ What tooling and project structure should Go projects follow to ensure consisten
|
|
|
13
13
|
|
|
14
14
|
## Decision Outcome
|
|
15
15
|
|
|
16
|
-
**Use
|
|
16
|
+
**Use a Mise-managed Go toolchain with `go build`, `go test`, and `golangci-lint`, module-root folder responsibilities from [agentme-edr-016](../principles/016-cross-language-module-structure.md), feature packages in subdirectories, a `cli/` package for command wiring, and a Makefile as the single entry point for all development tasks.**
|
|
17
17
|
|
|
18
18
|
A predictable layout and minimal external tooling keep Go projects approachable, fast to build, and easy to distribute as cross-platform binaries.
|
|
19
19
|
|
|
@@ -23,18 +23,19 @@ A predictable layout and minimal external tooling keep Go projects approachable,
|
|
|
23
23
|
|
|
24
24
|
| Tool | Purpose |
|
|
25
25
|
|------|---------|
|
|
26
|
+
| **Mise** | Mandatory tool version management and command runner for Go, `golangci-lint`, and project CLIs |
|
|
26
27
|
| **go toolchain** | Compilation, testing, formatting (`go build`, `go test`, `go fmt`, `go vet`, `go mod`) |
|
|
27
28
|
| **golangci-lint** | Linting — aggregates many linters in one fast run; configured via `.golangci.yml` |
|
|
28
29
|
| **monotag** | Version tagging from git history for the `publish` target |
|
|
29
30
|
|
|
30
|
-
All commands are run exclusively through the Makefile, never ad-hoc.
|
|
31
|
-
When the repository has a root `.mise.toml`, `go`, `golangci-lint`, and any other Go-related CLIs used by the project **MUST** be pinned there and resolved from the Mise-managed environment rather than the host machine.
|
|
31
|
+
All commands are run exclusively through the Makefile, never ad-hoc. The project root **MUST** define a `.mise.toml` that pins `go`, `golangci-lint`, and any other Go-related CLIs used by the project. Contributors and CI **MUST** bootstrap with `make setup` or `mise install`, then invoke routine work with `make <target>`. Each Makefile recipe **MUST** execute the underlying tool through `mise exec -- <tool> ...`.
|
|
32
32
|
Direct installation of project-required Go CLIs with `go install ...@latest` as a repair step is **NOT** allowed unless an XDR for that repository explicitly permits it.
|
|
33
33
|
|
|
34
34
|
#### Project structure
|
|
35
35
|
|
|
36
36
|
```
|
|
37
37
|
/ # project root or Go module root inside a monorepo
|
|
38
|
+
├── .mise.toml # pinned Go, golangci-lint, and related CLIs
|
|
38
39
|
├── Makefile # build, lint, test, publish, and utility targets
|
|
39
40
|
├── README.md # module README with usage and development commands
|
|
40
41
|
├── .gitignore # MUST ignore dist/ and .cache/
|
|
@@ -74,36 +75,36 @@ Direct installation of project-required Go CLIs with `go install ...@latest` as
|
|
|
74
75
|
- Module path: `github.com/<owner>/<project>` (or the relevant VCS path for the project)
|
|
75
76
|
- Use the latest stable Go version (e.g. `go 1.24`).
|
|
76
77
|
- Separate `require` blocks: direct dependencies first, then `// indirect` dependencies.
|
|
77
|
-
-
|
|
78
|
+
- The Go version declared in `go.mod` and the Go version pinned in `.mise.toml` **MUST** stay aligned.
|
|
78
79
|
|
|
79
80
|
#### Makefile targets
|
|
80
81
|
|
|
81
82
|
| Target | Description |
|
|
82
83
|
|--------|-------------|
|
|
83
84
|
| `all` | Default; runs `build lint test` in sequence |
|
|
84
|
-
| `build` | `go mod download && go build -o dist/<binary>` with Go caches redirected into `.cache/` |
|
|
85
|
+
| `build` | `mise exec -- go mod download && mise exec -- go build -o dist/<binary>` with Go caches redirected into `.cache/` |
|
|
85
86
|
| `build-all` | Cross-compile for all target platforms (darwin/linux/windows × amd64/arm64) |
|
|
86
87
|
| `build-arch-os` | Compile for a specific `OS` and `ARCH` environment variable pair; output to `dist/${OS}-${ARCH}/<binary>` |
|
|
87
|
-
| `install` | `go mod download` |
|
|
88
|
-
| `lint` | `golangci-lint run ./...` with its cache redirected into `.cache/` |
|
|
89
|
-
| `lint-fix` | `golangci-lint run --fix ./...` with its cache redirected into `.cache/` |
|
|
90
|
-
| `test` | `go test -cover ./...` — runs all tests with coverage and stores disposable outputs under `.cache/` |
|
|
91
|
-
| `test-unit` | `go test -cover ./...` — alias for unit tests only (same here; integration tests get a separate tag) |
|
|
92
|
-
| `coverage` | `go tool cover -func .cache/coverage.out` — displays coverage summary |
|
|
88
|
+
| `install` | `mise exec -- go mod download` |
|
|
89
|
+
| `lint` | `mise exec -- golangci-lint run ./...` with its cache redirected into `.cache/` |
|
|
90
|
+
| `lint-fix` | `mise exec -- golangci-lint run --fix ./...` with its cache redirected into `.cache/` |
|
|
91
|
+
| `test` | `mise exec -- go test -cover ./...` — runs all tests with coverage and stores disposable outputs under `.cache/` |
|
|
92
|
+
| `test-unit` | `mise exec -- go test -cover ./...` — alias for unit tests only (same here; integration tests get a separate tag) |
|
|
93
|
+
| `coverage` | `mise exec -- go tool cover -func .cache/coverage.out` — displays coverage summary |
|
|
93
94
|
| `clean` | Remove `dist/` and `.cache/` |
|
|
94
|
-
| `start` | `go run ./ <default-args>` — launch the binary locally for dev use |
|
|
95
|
-
| `publish` | Tag with `monotag
|
|
95
|
+
| `start` | `mise exec -- go run ./ <default-args>` — launch the binary locally for dev use |
|
|
96
|
+
| `publish` | Tag with `mise exec -- npx -y monotag ...`, then push tag + binaries to GitHub Releases |
|
|
96
97
|
|
|
97
|
-
|
|
98
|
+
The required invocation pattern is:
|
|
98
99
|
|
|
99
100
|
```sh
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
make setup
|
|
102
|
+
make build
|
|
103
|
+
make test
|
|
104
|
+
make lint
|
|
104
105
|
```
|
|
105
106
|
|
|
106
|
-
|
|
107
|
+
The Makefile recipes themselves must use `mise exec --` for the underlying tool commands.
|
|
107
108
|
|
|
108
109
|
#### Cross-platform binary distribution
|
|
109
110
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agentme-edr-014-python-project-tooling-and-structure
|
|
3
|
-
description: Defines the standard Python project toolchain, layout, and Makefile workflow using uv, ruff, pyright, pytest, and pip-audit. Use when scaffolding or reviewing Python projects.
|
|
3
|
+
description: Defines the standard Python project toolchain, layout, and Makefile workflow using Mise, uv, ruff, pyright, pytest, and pip-audit. Use when scaffolding or reviewing Python projects.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# agentme-edr-014: Python project tooling and structure
|
|
@@ -13,7 +13,7 @@ What tooling and project structure should Python projects follow to ensure consi
|
|
|
13
13
|
|
|
14
14
|
## Decision Outcome
|
|
15
15
|
|
|
16
|
-
**Use a
|
|
16
|
+
**Use a Mise-managed Python and uv toolchain with `pyproject.toml`, `ruff`, `pyright`, `pytest`, `pytest-cov`, `pip-audit`, and a layout that follows [agentme-edr-016](../principles/016-cross-language-module-structure.md): a module root under `lib/`, runnable consumer examples in sibling `examples/`, and standardized `dist/` and `.cache/` locations.**
|
|
17
17
|
|
|
18
18
|
A single dependency manager, isolated package internals under `lib/`, and a standard Makefile contract keep Python projects predictable for contributors and CI while keeping the repository root clean.
|
|
19
19
|
|
|
@@ -23,6 +23,7 @@ A single dependency manager, isolated package internals under `lib/`, and a stan
|
|
|
23
23
|
|
|
24
24
|
| Tool | Purpose |
|
|
25
25
|
|------|---------|
|
|
26
|
+
| **Mise** | Mandatory tool version management and command runner for Python, uv, and project CLIs |
|
|
26
27
|
| **uv** | Dependency management, lockfile management, virtualenv sync, build, publish |
|
|
27
28
|
| **pyproject.toml** | Single source of truth for package metadata and tool configuration |
|
|
28
29
|
| **ruff** | Formatting, import sorting, linting, and common code-quality checks |
|
|
@@ -33,7 +34,7 @@ A single dependency manager, isolated package internals under `lib/`, and a stan
|
|
|
33
34
|
|
|
34
35
|
All routine commands must run through the project `Makefile`, never by calling `uv`, `ruff`, `pytest`, or `pyright` directly in docs, CI, or daily development workflows.
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
The repository root MUST define a `.mise.toml` that pins Python and uv. Contributors and CI MUST bootstrap with `make setup` or `mise install`, then invoke routine work with `make <target>`. Each Makefile recipe MUST execute the underlying tool through `mise exec -- <tool> ...`. Using host-installed `python`, `uv`, or other project CLIs directly for routine project work is not allowed.
|
|
37
38
|
|
|
38
39
|
The root `.venv/` is the canonical environment location for both the library and all examples. Subdirectory commands must set `UV_PROJECT_ENVIRONMENT` to the workspace root `.venv/` instead of creating nested virtual environments.
|
|
39
40
|
|
|
@@ -43,7 +44,7 @@ Persistent caches must live under `.cache/`, preferably the module `lib/.cache/`
|
|
|
43
44
|
|
|
44
45
|
```text
|
|
45
46
|
/
|
|
46
|
-
├── .mise.toml #
|
|
47
|
+
├── .mise.toml # required; pins Python and uv
|
|
47
48
|
├── .gitignore
|
|
48
49
|
├── .cache/ # optional shared uv cache at repo level
|
|
49
50
|
├── .venv/ # shared uv environment for lib/ and examples/
|
|
@@ -101,7 +102,7 @@ Pytest coverage must fail below 80% line and branch coverage, following [agentme
|
|
|
101
102
|
|
|
102
103
|
#### Makefile targets
|
|
103
104
|
|
|
104
|
-
|
|
105
|
+
Contributors and CI MUST invoke the commands below as `make <target>`. The Makefile recipes themselves MUST call the underlying tools through `mise exec -- <tool> ...`.
|
|
105
106
|
|
|
106
107
|
#### Root `Makefile`
|
|
107
108
|
|
|
@@ -109,6 +110,7 @@ The root `Makefile` is the only contract for CI and contributors. It delegates l
|
|
|
109
110
|
|
|
110
111
|
| Target | Description |
|
|
111
112
|
|--------|-------------|
|
|
113
|
+
| `setup` | Run `mise install`, then `lib/install` to create or update the shared root `.venv/` |
|
|
112
114
|
| `install` | Run `lib/install` to create or update the shared root `.venv/` |
|
|
113
115
|
| `build` | Run `lib/build` |
|
|
114
116
|
| `lint` | Run `lib/lint` |
|
|
@@ -123,17 +125,17 @@ The root `Makefile` is the only contract for CI and contributors. It delegates l
|
|
|
123
125
|
|
|
124
126
|
| Target | Description |
|
|
125
127
|
|--------|-------------|
|
|
126
|
-
| `install` | `uv sync --project . --frozen --all-extras --dev` using the shared root `.venv/` |
|
|
127
|
-
| `build` | `uv sync --project . --frozen --all-extras --dev && uv build --project . --out-dir dist` |
|
|
128
|
-
| `lint` | `uv run --project . ruff format --check . && uv run --project . ruff check . && uv run --project . pyright && uv run --project . pip-audit`, with caches redirected into `.cache/` |
|
|
129
|
-
| `lint-fix` | `uv run --project . ruff format . && uv run --project . ruff check . --fix && uv run --project . pyright && uv run --project . pip-audit`, with caches redirected into `.cache/` |
|
|
130
|
-
| `test-unit` | `uv run --project . pytest --cov=src/<package_name> --cov-branch --cov-report=term-missing --cov-fail-under=80`, with pytest and coverage outputs stored under `.cache/` |
|
|
128
|
+
| `install` | `mise exec -- uv sync --project . --frozen --all-extras --dev` using the shared root `.venv/` |
|
|
129
|
+
| `build` | `mise exec -- uv sync --project . --frozen --all-extras --dev && mise exec -- uv build --project . --out-dir dist` |
|
|
130
|
+
| `lint` | `mise exec -- uv run --project . ruff format --check . && mise exec -- uv run --project . ruff check . && mise exec -- uv run --project . pyright && mise exec -- uv run --project . pip-audit`, with caches redirected into `.cache/` |
|
|
131
|
+
| `lint-fix` | `mise exec -- uv run --project . ruff format . && mise exec -- uv run --project . ruff check . --fix && mise exec -- uv run --project . pyright && mise exec -- uv run --project . pip-audit`, with caches redirected into `.cache/` |
|
|
132
|
+
| `test-unit` | `mise exec -- uv run --project . pytest --cov=src/<package_name> --cov-branch --cov-report=term-missing --cov-fail-under=80`, with pytest and coverage outputs stored under `.cache/` |
|
|
131
133
|
| `clean` | Remove `dist/` and `.cache/` inside `lib/` |
|
|
132
134
|
| `all` | `build lint test-unit` |
|
|
133
|
-
| `update-lockfile` | `uv lock --project . --upgrade` |
|
|
134
|
-
| `run` | `uv run --project . python -m <package_name>` or the project CLI entry point |
|
|
135
|
+
| `update-lockfile` | `mise exec -- uv lock --project . --upgrade` |
|
|
136
|
+
| `run` | `mise exec -- uv run --project . python -m <package_name>` or the project CLI entry point |
|
|
135
137
|
| `dev` | Same as `run`, optionally with repository-specific dev defaults |
|
|
136
|
-
| `publish` | `uv publish --project .` after versioning and packaging are complete |
|
|
138
|
+
| `publish` | `mise exec -- uv publish --project .` after versioning and packaging are complete |
|
|
137
139
|
|
|
138
140
|
The root `Makefile` must remain the only contract for CI and contributors, in line with [agentme-edr-008](../devops/008-common-targets.md).
|
|
139
141
|
|
|
@@ -39,7 +39,7 @@ Related EDRs: [agentme-edr-003](../../003-javascript-project-tooling.md), [agent
|
|
|
39
39
|
|
|
40
40
|
**`./Makefile`**
|
|
41
41
|
|
|
42
|
-
Delegates every make target to `/lib` then `/examples` in sequence:
|
|
42
|
+
Delegates every make target to `/lib` then `/examples` in sequence. Child Makefiles own the actual `mise exec -- <tool>` calls:
|
|
43
43
|
|
|
44
44
|
```makefile
|
|
45
45
|
SHELL := /bin/bash
|
|
@@ -47,13 +47,13 @@ MISE := mise exec --
|
|
|
47
47
|
%:
|
|
48
48
|
@echo ''
|
|
49
49
|
@echo '>>> Running /lib:$@...'
|
|
50
|
-
@$(
|
|
50
|
+
@$(MAKE) -C lib $@
|
|
51
51
|
@echo ''
|
|
52
52
|
@echo '>>> Running /examples:$@...'
|
|
53
|
-
@STAGE=dev $(
|
|
53
|
+
@STAGE=dev $(MAKE) -C examples $@
|
|
54
54
|
|
|
55
55
|
publish:
|
|
56
|
-
@$(
|
|
56
|
+
@$(MAKE) -C lib publish
|
|
57
57
|
|
|
58
58
|
setup:
|
|
59
59
|
mise install
|
|
@@ -35,6 +35,16 @@ Ask for (or infer from context):
|
|
|
35
35
|
|
|
36
36
|
### Phase 2: Create root files
|
|
37
37
|
|
|
38
|
+
**`./.mise.toml`** (replace `[go-version]` and `[golangci-lint-version]`):
|
|
39
|
+
|
|
40
|
+
```toml
|
|
41
|
+
[tools]
|
|
42
|
+
go = "[go-version]"
|
|
43
|
+
golangci-lint = "[golangci-lint-version]"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Pin any additional project CLIs used by the Makefile here as well. Use an explicit `golangci-lint` version rather than `latest`.
|
|
47
|
+
|
|
38
48
|
**`go.mod`** (replace `[module]`, `[go-version]`):
|
|
39
49
|
|
|
40
50
|
```
|
|
@@ -81,6 +91,7 @@ func main() {
|
|
|
81
91
|
|
|
82
92
|
```makefile
|
|
83
93
|
SHELL := /bin/bash
|
|
94
|
+
MISE := mise exec --
|
|
84
95
|
|
|
85
96
|
BINARY := [binary]
|
|
86
97
|
CACHE_DIR := .cache
|
|
@@ -90,10 +101,14 @@ export GOLANGCI_LINT_CACHE := $(abspath $(CACHE_DIR)/golangci-lint)
|
|
|
90
101
|
|
|
91
102
|
all: build lint test
|
|
92
103
|
|
|
104
|
+
setup:
|
|
105
|
+
mise install
|
|
106
|
+
$(MAKE) install
|
|
107
|
+
|
|
93
108
|
build: install
|
|
94
109
|
@mkdir -p dist
|
|
95
110
|
@mkdir -p $(GOCACHE) $(GOMODCACHE)
|
|
96
|
-
go build -o dist/$(BINARY) .
|
|
111
|
+
$(MISE) go build -o dist/$(BINARY) .
|
|
97
112
|
|
|
98
113
|
build-all: build-arch-os-darwin-amd64 build-arch-os-darwin-arm64 build-arch-os-linux-amd64 build-arch-os-linux-arm64 build-arch-os-windows-amd64
|
|
99
114
|
@echo "All platform builds complete"
|
|
@@ -119,36 +134,36 @@ build-arch-os:
|
|
|
119
134
|
@echo "Compiling $(BINARY) for ${OS}-${ARCH}..."
|
|
120
135
|
@mkdir -p dist/${OS}-${ARCH}
|
|
121
136
|
@mkdir -p $(GOCACHE) $(GOMODCACHE)
|
|
122
|
-
go mod download
|
|
123
|
-
GOOS=${OS} GOARCH=${ARCH} CGO_ENABLED=0 go build -a -o dist/${OS}-${ARCH}/$(BINARY) .
|
|
137
|
+
$(MISE) go mod download
|
|
138
|
+
GOOS=${OS} GOARCH=${ARCH} CGO_ENABLED=0 $(MISE) go build -a -o dist/${OS}-${ARCH}/$(BINARY) .
|
|
124
139
|
@echo "Done"
|
|
125
140
|
|
|
126
141
|
install:
|
|
127
|
-
go mod download
|
|
142
|
+
$(MISE) go mod download
|
|
128
143
|
|
|
129
144
|
lint:
|
|
130
|
-
golangci-lint run ./...
|
|
145
|
+
$(MISE) golangci-lint run ./...
|
|
131
146
|
|
|
132
147
|
lint-fix:
|
|
133
|
-
golangci-lint run --fix ./...
|
|
148
|
+
$(MISE) golangci-lint run --fix ./...
|
|
134
149
|
|
|
135
150
|
test:
|
|
136
|
-
go test -cover ./...
|
|
151
|
+
$(MISE) go test -cover ./...
|
|
137
152
|
|
|
138
153
|
test-coverage:
|
|
139
154
|
@mkdir -p $(CACHE_DIR)
|
|
140
|
-
go test -coverprofile=$(CACHE_DIR)/coverage.out ./...
|
|
141
|
-
go tool cover -func $(CACHE_DIR)/coverage.out
|
|
155
|
+
$(MISE) go test -coverprofile=$(CACHE_DIR)/coverage.out ./...
|
|
156
|
+
$(MISE) go tool cover -func $(CACHE_DIR)/coverage.out
|
|
142
157
|
|
|
143
158
|
benchmark:
|
|
144
|
-
go test -bench . -benchmem -count 5 ./...
|
|
159
|
+
$(MISE) go test -bench . -benchmem -count 5 ./...
|
|
145
160
|
|
|
146
161
|
clean:
|
|
147
162
|
rm -rf dist
|
|
148
163
|
rm -rf .cache
|
|
149
164
|
|
|
150
165
|
start:
|
|
151
|
-
go run ./ [subcommand]
|
|
166
|
+
$(MISE) go run ./ [subcommand]
|
|
152
167
|
```
|
|
153
168
|
|
|
154
169
|
**`.golangci.yml`**:
|
|
@@ -190,6 +205,7 @@ coverage.out
|
|
|
190
205
|
|
|
191
206
|
## Development
|
|
192
207
|
|
|
208
|
+
make setup
|
|
193
209
|
make build # compile binary to dist/
|
|
194
210
|
make lint # run golangci-lint with cache in .cache/
|
|
195
211
|
make test # run tests with coverage artifacts in .cache/
|
|
@@ -300,7 +316,7 @@ func Run(args []string) {
|
|
|
300
316
|
After creating all files, run the following in the project root:
|
|
301
317
|
|
|
302
318
|
```bash
|
|
303
|
-
|
|
319
|
+
make setup
|
|
304
320
|
make all
|
|
305
321
|
```
|
|
306
322
|
|
|
@@ -316,6 +332,6 @@ Fix any compile or lint errors before finishing.
|
|
|
316
332
|
- All tests co-located (`*_test.go` next to the file under test).
|
|
317
333
|
- Use `tests_integration/` for integration flows and `tests_benchmark/` when benchmarks need dedicated harnesses or datasets.
|
|
318
334
|
- Log with `logrus`; never use `fmt.Println` for diagnostic/debug output.
|
|
319
|
-
- All development tasks go through `make` targets
|
|
335
|
+
- All development tasks go through `make` targets. The Makefile recipes call `mise exec -- go ...` and related tools directly.
|
|
320
336
|
- Do not create an `internal/` package unless explicitly justified (importability is preferred).
|
|
321
337
|
- If the project is a reusable library, place consumer examples in a sibling `examples/` folder outside the module root and keep them on the public module import path.
|
|
@@ -13,10 +13,10 @@ compatibility: Python 3.12+
|
|
|
13
13
|
|
|
14
14
|
## Overview
|
|
15
15
|
|
|
16
|
-
Creates a complete Python project from scratch using `uv`, `pyproject.toml`, Ruff,
|
|
17
|
-
Pytest, and Makefiles. The default layout keeps the library self-contained under `lib/`,
|
|
18
|
-
shared root `.venv/`, redirects persistent caches into `.cache/`, and places runnable
|
|
19
|
-
projects under the sibling `examples/` folder.
|
|
16
|
+
Creates a complete Python project from scratch using Mise, `uv`, `pyproject.toml`, Ruff,
|
|
17
|
+
Pyright, Pytest, and Makefiles. The default layout keeps the library self-contained under `lib/`,
|
|
18
|
+
uses a shared root `.venv/`, redirects persistent caches into `.cache/`, and places runnable
|
|
19
|
+
consumer projects under the sibling `examples/` folder.
|
|
20
20
|
|
|
21
21
|
Related EDRs: [agentme-edr-014](../../014-python-project-tooling.md), [agentme-edr-016](../../../principles/016-cross-language-module-structure.md)
|
|
22
22
|
|
|
@@ -39,16 +39,31 @@ Ask for or infer from context:
|
|
|
39
39
|
|
|
40
40
|
Create these files first.
|
|
41
41
|
|
|
42
|
+
**`./.mise.toml`**
|
|
43
|
+
|
|
44
|
+
```toml
|
|
45
|
+
[tools]
|
|
46
|
+
python = "3.13"
|
|
47
|
+
uv = "latest"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Replace `3.13` with the chosen Python version and pin any additional project CLIs used by the project here.
|
|
51
|
+
|
|
42
52
|
**`./Makefile`**
|
|
43
53
|
|
|
44
54
|
```makefile
|
|
45
55
|
SHELL := /bin/bash
|
|
56
|
+
MISE := mise exec --
|
|
46
57
|
ROOT_DIR := $(abspath .)
|
|
47
58
|
export UV_PROJECT_ENVIRONMENT := $(ROOT_DIR)/.venv
|
|
48
59
|
export UV_CACHE_DIR := $(ROOT_DIR)/.cache/uv
|
|
49
60
|
|
|
50
61
|
all: build lint test
|
|
51
62
|
|
|
63
|
+
setup:
|
|
64
|
+
mise install
|
|
65
|
+
$(MAKE) install
|
|
66
|
+
|
|
52
67
|
install:
|
|
53
68
|
$(MAKE) -C lib install
|
|
54
69
|
|
|
@@ -70,9 +85,9 @@ test-examples: build
|
|
|
70
85
|
@for dir in examples/*; do \
|
|
71
86
|
if [ -f "$$dir/pyproject.toml" ]; then \
|
|
72
87
|
echo ">>> Running $$dir"; \
|
|
73
|
-
UV_PROJECT_ENVIRONMENT="$(UV_PROJECT_ENVIRONMENT)" UV_CACHE_DIR="$(UV_CACHE_DIR)" uv sync --project "$$dir" --frozen || exit 1; \
|
|
74
|
-
UV_PROJECT_ENVIRONMENT="$(UV_PROJECT_ENVIRONMENT)" UV_CACHE_DIR="$(UV_CACHE_DIR)" uv pip install --python "$(UV_PROJECT_ENVIRONMENT)/bin/python" lib/dist/*.whl || exit 1; \
|
|
75
|
-
UV_PROJECT_ENVIRONMENT="$(UV_PROJECT_ENVIRONMENT)" UV_CACHE_DIR="$(UV_CACHE_DIR)" uv run --project "$$dir" python main.py || exit 1; \
|
|
88
|
+
UV_PROJECT_ENVIRONMENT="$(UV_PROJECT_ENVIRONMENT)" UV_CACHE_DIR="$(UV_CACHE_DIR)" $(MISE) uv sync --project "$$dir" --frozen || exit 1; \
|
|
89
|
+
UV_PROJECT_ENVIRONMENT="$(UV_PROJECT_ENVIRONMENT)" UV_CACHE_DIR="$(UV_CACHE_DIR)" $(MISE) uv pip install --python "$(UV_PROJECT_ENVIRONMENT)/bin/python" lib/dist/*.whl || exit 1; \
|
|
90
|
+
UV_PROJECT_ENVIRONMENT="$(UV_PROJECT_ENVIRONMENT)" UV_CACHE_DIR="$(UV_CACHE_DIR)" $(MISE) uv run --project "$$dir" python main.py || exit 1; \
|
|
76
91
|
fi; \
|
|
77
92
|
done
|
|
78
93
|
|
|
@@ -82,9 +97,7 @@ clean:
|
|
|
82
97
|
rm -rf .venv
|
|
83
98
|
```
|
|
84
99
|
|
|
85
|
-
The root `Makefile` keeps the repository clean by delegating package work to `lib/` and treating each example directory as an independent consumer project.
|
|
86
|
-
|
|
87
|
-
If the repository already uses Mise, wrap the delegated commands with `mise exec --` and pin both Python and uv in `.mise.toml`.
|
|
100
|
+
The root `Makefile` keeps the repository clean by delegating package work to `lib/` and treating each example directory as an independent consumer project. Child Makefiles own the actual `mise exec -- <tool>` calls.
|
|
88
101
|
|
|
89
102
|
**`./.gitignore`**
|
|
90
103
|
|
|
@@ -106,6 +119,7 @@ Keep this README focused on the repository or workspace. Put Getting Started nea
|
|
|
106
119
|
## Getting Started
|
|
107
120
|
|
|
108
121
|
```sh
|
|
122
|
+
make setup
|
|
109
123
|
make test
|
|
110
124
|
```
|
|
111
125
|
|
|
@@ -121,6 +135,7 @@ artifacts, and library-specific Makefile targets.
|
|
|
121
135
|
|
|
122
136
|
```makefile
|
|
123
137
|
SHELL := /bin/bash
|
|
138
|
+
MISE := mise exec --
|
|
124
139
|
ROOT_DIR := $(abspath ..)
|
|
125
140
|
export UV_PROJECT_ENVIRONMENT := $(ROOT_DIR)/.venv
|
|
126
141
|
export UV_CACHE_DIR := $(ROOT_DIR)/.cache/uv
|
|
@@ -133,34 +148,34 @@ PACKAGE_NAME ?= your_package
|
|
|
133
148
|
all: build lint test-unit
|
|
134
149
|
|
|
135
150
|
install:
|
|
136
|
-
uv sync --project . --frozen --all-extras --dev
|
|
151
|
+
$(MISE) uv sync --project . --frozen --all-extras --dev
|
|
137
152
|
|
|
138
153
|
build: install
|
|
139
154
|
rm -rf dist
|
|
140
|
-
uv build --project . --out-dir dist
|
|
155
|
+
$(MISE) uv build --project . --out-dir dist
|
|
141
156
|
|
|
142
157
|
lint: install
|
|
143
|
-
uv run --project . ruff format --check .
|
|
144
|
-
uv run --project . ruff check .
|
|
145
|
-
uv run --project . pyright
|
|
146
|
-
uv run --project . pip-audit
|
|
158
|
+
$(MISE) uv run --project . ruff format --check .
|
|
159
|
+
$(MISE) uv run --project . ruff check .
|
|
160
|
+
$(MISE) uv run --project . pyright
|
|
161
|
+
$(MISE) uv run --project . pip-audit
|
|
147
162
|
|
|
148
163
|
lint-fix: install
|
|
149
|
-
uv run --project . ruff format .
|
|
150
|
-
uv run --project . ruff check . --fix
|
|
151
|
-
uv run --project . pyright
|
|
152
|
-
uv run --project . pip-audit
|
|
164
|
+
$(MISE) uv run --project . ruff format .
|
|
165
|
+
$(MISE) uv run --project . ruff check . --fix
|
|
166
|
+
$(MISE) uv run --project . pyright
|
|
167
|
+
$(MISE) uv run --project . pip-audit
|
|
153
168
|
|
|
154
169
|
test-unit: install
|
|
155
|
-
uv run --project . pytest -o cache_dir=.cache/pytest --cov=src/$(PACKAGE_NAME) --cov-branch --cov-report=term-missing --cov-report=html:.cache/htmlcov --cov-fail-under=80
|
|
170
|
+
$(MISE) uv run --project . pytest -o cache_dir=.cache/pytest --cov=src/$(PACKAGE_NAME) --cov-branch --cov-report=term-missing --cov-report=html:.cache/htmlcov --cov-fail-under=80
|
|
156
171
|
|
|
157
172
|
run: install
|
|
158
|
-
uv run --project . python -m $(PACKAGE_NAME)
|
|
173
|
+
$(MISE) uv run --project . python -m $(PACKAGE_NAME)
|
|
159
174
|
|
|
160
175
|
dev: run
|
|
161
176
|
|
|
162
177
|
update-lockfile:
|
|
163
|
-
uv lock --project . --upgrade
|
|
178
|
+
$(MISE) uv lock --project . --upgrade
|
|
164
179
|
|
|
165
180
|
clean:
|
|
166
181
|
rm -rf dist .cache
|
|
@@ -231,7 +246,7 @@ This README is the published package README referenced by `lib/pyproject.toml`.
|
|
|
231
246
|
## Getting Started
|
|
232
247
|
|
|
233
248
|
```sh
|
|
234
|
-
|
|
249
|
+
make setup
|
|
235
250
|
make test
|
|
236
251
|
```
|
|
237
252
|
|
|
@@ -331,11 +346,12 @@ Examples must import the package as a consumer would. Avoid relative imports bac
|
|
|
331
346
|
|
|
332
347
|
After creating the files:
|
|
333
348
|
|
|
334
|
-
1. Run `make
|
|
335
|
-
2. Run `make
|
|
336
|
-
3. Run `make
|
|
337
|
-
4. Run `make
|
|
338
|
-
5.
|
|
349
|
+
1. Run `make setup`.
|
|
350
|
+
2. Run `make install`.
|
|
351
|
+
3. Run `make lint-fix`.
|
|
352
|
+
4. Run `make test`.
|
|
353
|
+
5. Run `make build`.
|
|
354
|
+
6. Fix all failures before finishing.
|
|
339
355
|
|
|
340
356
|
## Examples
|
|
341
357
|
|
|
@@ -352,7 +368,7 @@ After creating the files:
|
|
|
352
368
|
|
|
353
369
|
## Edge Cases
|
|
354
370
|
|
|
355
|
-
-
|
|
371
|
+
- Pin Python and uv in the root `.mise.toml`; do not assume host-installed tools.
|
|
356
372
|
- If the project is fewer than 100 lines and explicitly marked as a spike or experiment, examples and linting may be skipped only when another applicable XDR allows it.
|
|
357
373
|
- If an example needs extra dependencies, keep them in that example's `pyproject.toml`; do not move them into `lib/pyproject.toml` unless the library truly needs them.
|
|
358
374
|
- If the user asks for an app with framework-specific needs such as FastAPI or Django, keep this baseline and add the framework config on top instead of replacing it.
|
|
@@ -83,6 +83,7 @@ Repository, application, and module Makefiles **MUST** define at minimum: `all`,
|
|
|
83
83
|
Module Makefiles **SHOULD** also provide `lint-fix` and `install` when the underlying tooling supports them.
|
|
84
84
|
|
|
85
85
|
The root `Makefile` **MUST** also define a `setup` target that guides a new contributor to prepare their machine.
|
|
86
|
+
The root `setup` target **MUST** run `mise install` and any small repository bootstrap required before routine targets work.
|
|
86
87
|
|
|
87
88
|
*Why:* Makefiles provide a universal, stack-agnostic entry point regardless of programming language.
|
|
88
89
|
|
|
@@ -91,11 +92,11 @@ The root `Makefile` **MUST** also define a `setup` target that guides a new cont
|
|
|
91
92
|
- [Mise](https://mise.jdx.dev/) **MUST** be used to pin all tool versions (compilers, runtimes, CLI tools).
|
|
92
93
|
- A `.mise.toml` **MUST** exist at the repository root.
|
|
93
94
|
- Every language runtime or CLI referenced by any module `Makefile`, CI workflow, or README command **MUST** be pinned in `.mise.toml`.
|
|
94
|
-
- Contributors run `
|
|
95
|
+
- Contributors and CI run `make setup` after cloning or checkout; this target must call `mise install`.
|
|
95
96
|
- Agents and contributors **MUST** check `.mise.toml` before using a system-installed compiler, runtime, or CLI.
|
|
96
|
-
- When `.mise.toml` exists, all build, test, lint, and code-generation commands **MUST** run
|
|
97
|
+
- When `.mise.toml` exists, all build, test, lint, and code-generation commands **MUST** run through `make <target>`, and the Makefile recipes **MUST** execute the underlying tools via `mise exec -- <command>`.
|
|
97
98
|
- If a required tool is missing, the first remediation step **MUST** be to update `.mise.toml` or run `mise install`, not to install ad-hoc global tools with language-specific installers such as `go install`, `npm install -g`, `pip install --user`, or `cargo install`.
|
|
98
|
-
- Root and module `Makefile` targets **
|
|
99
|
+
- Root and module `Makefile` targets **MUST** work when invoked as plain `make <target>` after `make setup`.
|
|
99
100
|
|
|
100
101
|
*Why:* Eliminates "works on my machine" build failures by ensuring identical tool versions across all environments.
|
|
101
102
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agentme-edr-008-common-development-script-names
|
|
3
|
-
description: Defines standard
|
|
3
|
+
description: Defines standard Makefile target names and the mandatory tool-execution flow using Mise. Use when designing build, lint, test, and release entry points.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# agentme-edr-008: Common development script names
|
|
@@ -9,46 +9,67 @@ description: Defines standard development command names and lifecycle groups acr
|
|
|
9
9
|
|
|
10
10
|
Software projects use a wide variety of commands and tooling to perform the same fundamental tasks — building, testing, linting, and deploying. This diversity is amplified across language ecosystems, meaning developers must re-learn project-specific conventions every time they switch contexts. CI pipelines suffer from the same fragmentation, each one requiring bespoke scripts.
|
|
11
11
|
|
|
12
|
-
What standard set of
|
|
12
|
+
What standard set of Makefile target names and execution rules should projects adopt so that any developer or CI pipeline can immediately operate on any project without needing to read documentation first?
|
|
13
13
|
|
|
14
14
|
## Decision Outcome
|
|
15
15
|
|
|
16
|
-
**Every project must expose its development actions using a defined set of standardized
|
|
16
|
+
**Every project must expose its development actions through a root `Makefile` using a defined set of standardized target names. Makefile recipes must run explicit tool commands through `mise exec --`, so developers and CI use the same entry point and can see the real command path without extra script indirection.**
|
|
17
17
|
|
|
18
|
-
Standardizing
|
|
18
|
+
Standardizing both the target names and the execution chain removes per-project guesswork, makes CI pipelines reusable, and keeps tooling behavior visible in one place.
|
|
19
19
|
|
|
20
20
|
### Implementation Details
|
|
21
21
|
|
|
22
|
-
#### 1. Every project MUST have a root
|
|
22
|
+
#### 1. Every project MUST have a root `Makefile` exposing the standard target names
|
|
23
23
|
|
|
24
|
-
The project root must contain a single authoritative
|
|
24
|
+
The project root must contain a single authoritative `Makefile` that exposes the standard target names defined in rule 3. Developers and CI pipelines must invoke routine actions through this `Makefile`, never by calling underlying tools directly in documentation, CI, or daily workflow commands.
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
`make <target>` is the shared contract across projects and languages.
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
- The root `Makefile` must be the entry point for both developers and pipelines.
|
|
29
|
+
- The root `Makefile` must expose at minimum the common targets defined in this XDR.
|
|
30
|
+
- Reverse-compatibility wrappers are allowed when an ecosystem expects them, but they must stay trivial.
|
|
31
|
+
- Allowed: `package.json` script `"test": "make test"`
|
|
32
|
+
- Not allowed: `make test` -> `npm run test` -> tool command
|
|
33
|
+
- Project logic must not live in npm scripts, Mise tasks, shell wrappers, or other secondary runners when the same logic belongs in the `Makefile`.
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
|--------|--------------------|------------------|
|
|
32
|
-
| Makefile | `make build` | Default; recommended for all projects |
|
|
33
|
-
| npm scripts | `npm run build` | Pure Node.js/frontend projects without a Makefile |
|
|
34
|
-
| Shell script | `./dev.sh build` | Projects where `make` is unavailable or impractical |
|
|
35
|
-
| Other (Taskfile, just, etc.) | `task build` | When agreed upon at the project or org level |
|
|
35
|
+
*Why:* The project entry point must stay language-agnostic and obvious. A developer should be able to inspect the `Makefile` and immediately see which real tool commands will run.
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
#### 2. Makefile recipes MUST use the explicit tool-execution chain
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
After a checkout, the only assumed prerequisites are `make` and [Mise](https://mise.jdx.dev/). The standard execution flow is:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
make <target>
|
|
43
|
+
-> Makefile recipe
|
|
44
|
+
-> mise exec -- <tool> [tool arguments]
|
|
45
|
+
-> explicit tool command
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- The `setup` target must run `mise install` and any small project-specific bootstrap needed before normal targets work.
|
|
49
|
+
- Routine targets such as `build`, `lint`, `test`, `run`, and `publish` must be invoked as `make <target>` by both contributors and CI.
|
|
50
|
+
- Each Makefile recipe must call the real underlying command directly through `mise exec --`.
|
|
51
|
+
- Makefile recipes must not add extra script layers such as `npm run`, `pnpm run`, `yarn run`, `mise run`, `mise tasks`, or shell aliases when those layers only forward to another command.
|
|
52
|
+
- Calling the actual tool is allowed even when that tool itself launches another program as part of its normal interface.
|
|
53
|
+
- Allowed: `mise exec -- pnpm exec eslint ./src`
|
|
54
|
+
- Allowed: `mise exec -- go test -cover ./...`
|
|
55
|
+
- Allowed: `mise exec -- uv run --project . pytest`
|
|
56
|
+
- Disallowed: `mise exec -- pnpm run lint`
|
|
57
|
+
- Disallowed: `mise run lint`
|
|
58
|
+
- Disallowed: `make lint` implemented as `./scripts/lint.sh` when the shell script only forwards to one visible tool command
|
|
59
|
+
|
|
60
|
+
*Why:* This keeps the execution path inspectable, avoids hidden logic spread across multiple scripting systems, and makes CI behave the same way as local development.
|
|
40
61
|
|
|
41
62
|
---
|
|
42
63
|
|
|
43
|
-
####
|
|
64
|
+
#### 3. Standard target groups and names
|
|
44
65
|
|
|
45
|
-
|
|
66
|
+
Targets are organized into five lifecycle groups. Projects must use these names unchanged. Extensions are allowed (see rule 5) but the core names must not be repurposed.
|
|
46
67
|
|
|
47
68
|
##### Developer group
|
|
48
69
|
|
|
49
|
-
|
|
|
70
|
+
| Target | Purpose |
|
|
50
71
|
|--------|---------|
|
|
51
|
-
| `setup` |
|
|
72
|
+
| `setup` | Run `mise install` and any small project bootstrap needed before normal targets work. This is the first command after checkout. |
|
|
52
73
|
| `all` | Alias that runs `build`, `lint`, and `test` in sequence. Must be the default target (i.e., running `make` or the runner with no arguments invokes `all`). Used by developers as a fast pre-push check to verify the software meets minimum quality standards in one command. |
|
|
53
74
|
| `clean` | Remove all temporary or generated files created during build, lint, or test (e.g., `node_modules`, virtual environments, compiled binaries, generated files). Used both locally and in CI for a clean slate. |
|
|
54
75
|
| `dev` | Run the software locally for development (e.g., start a Node.js API server, open a Jupyter notebook, launch a React dev server). May have debugging tools, verbose logging, or hot reloading features enabled. |
|
|
@@ -57,7 +78,7 @@ Scripts are organized into five lifecycle groups. Projects must use these names
|
|
|
57
78
|
|
|
58
79
|
##### Build group
|
|
59
80
|
|
|
60
|
-
|
|
|
81
|
+
| Target | Purpose |
|
|
61
82
|
|--------|---------|
|
|
62
83
|
| `build` | Install dependencies, compile, and package the software. The full `install → compile → package` workflow. |
|
|
63
84
|
| `install` | Download and install all project dependencies. Assumes the language runtime is already available (installed via `setup`). |
|
|
@@ -67,13 +88,13 @@ Scripts are organized into five lifecycle groups. Projects must use these names
|
|
|
67
88
|
|
|
68
89
|
##### Lint group
|
|
69
90
|
|
|
70
|
-
|
|
|
91
|
+
| Target | Purpose |
|
|
71
92
|
|--------|---------|
|
|
72
93
|
| `lint` | Run **all static quality checks** outside of tests. This MUST include: code formatting validation, code style enforcement, code smell detection, static analysis, dependency audits for known CVEs, security vulnerability scans (e.g., SAST), and project/configuration structure checks. All checks must be non-destructive (read-only); fixes are handled by `lint-fix`. |
|
|
73
94
|
| `lint-fix` | Automatically fix linting and formatting issues where possible. || `lint-format` | *(Optional)* Check code formatting only (e.g., Prettier, gofmt, Black). |
|
|
74
95
|
##### Test group
|
|
75
96
|
|
|
76
|
-
|
|
|
97
|
+
| Target | Purpose |
|
|
77
98
|
|--------|---------|
|
|
78
99
|
| `test` | Run **all tests** required for the project. This MUST include unit tests (with coverage enforcement — the build MUST fail if coverage thresholds are not met) and integration/end-to-end tests. Normally delegates to `test-unit` and `test-integration` in sequence. |
|
|
79
100
|
| `test-unit` | Run unit tests only, including coverage report generation and coverage threshold enforcement. |
|
|
@@ -82,7 +103,7 @@ Scripts are organized into five lifecycle groups. Projects must use these names
|
|
|
82
103
|
|
|
83
104
|
##### Release group
|
|
84
105
|
|
|
85
|
-
|
|
|
106
|
+
| Target | Purpose |
|
|
86
107
|
|--------|---------|
|
|
87
108
|
| `release` | Determine the next version (e.g., via semantic versioning and git tags), generate changelogs and release notes, tag the repository, and create a release artifact. Normally invokes `docgen`. |
|
|
88
109
|
| `docgen` | Generate documentation (API docs, static sites, changelogs, example outputs). |
|
|
@@ -103,9 +124,9 @@ Two environment variables have defined semantics and must be used consistently.
|
|
|
103
124
|
|
|
104
125
|
---
|
|
105
126
|
|
|
106
|
-
####
|
|
127
|
+
#### 5. Extending targets with prefixes
|
|
107
128
|
|
|
108
|
-
Projects may add custom
|
|
129
|
+
Projects may add custom targets beyond the standard set. Custom targets must be named by prefixing a standard target name with a descriptive qualifier, keeping the naming intuitive and consistent with the group it belongs to.
|
|
109
130
|
|
|
110
131
|
**Examples:**
|
|
111
132
|
|
|
@@ -121,13 +142,13 @@ start-debugger # launch the software with a visual debugger attached
|
|
|
121
142
|
deploy-infra # deploy only the infrastructure layer
|
|
122
143
|
```
|
|
123
144
|
|
|
124
|
-
The prefix convention ensures developers can infer the purpose of any
|
|
145
|
+
The prefix convention ensures developers can infer the purpose of any target without documentation.
|
|
125
146
|
|
|
126
147
|
---
|
|
127
148
|
|
|
128
|
-
####
|
|
149
|
+
#### 6. Monorepo usage
|
|
129
150
|
|
|
130
|
-
In a monorepo, each module has its own `Makefile` with its own `build`, `lint`, `test`, and `deploy` targets scoped to that module. Parent-level Makefiles (at the application or repo root) delegate to
|
|
151
|
+
In a monorepo, each module has its own `Makefile` with its own `build`, `lint`, `test`, and `deploy` targets scoped to that module. Parent-level Makefiles (at the application or repo root) delegate to child Makefiles in sequence. The parent Makefile should call `$(MAKE) -C <child> <target>` directly, while each child `Makefile` runs its actual tool commands through `mise exec --`.
|
|
131
152
|
|
|
132
153
|
```makefile
|
|
133
154
|
# root Makefile — delegates to all modules
|
|
@@ -146,12 +167,12 @@ A developer can run `make test` at the repo root to test everything, or `cd modu
|
|
|
146
167
|
|
|
147
168
|
---
|
|
148
169
|
|
|
149
|
-
####
|
|
170
|
+
#### 7. Quick-reference — commands a developer can always rely on
|
|
150
171
|
|
|
151
|
-
Any project following this EDR supports the following actions
|
|
172
|
+
Any project following this EDR supports the following actions through the root `Makefile`.
|
|
152
173
|
|
|
153
174
|
```sh
|
|
154
|
-
# install
|
|
175
|
+
# install the pinned toolchain and project bootstrap
|
|
155
176
|
make setup
|
|
156
177
|
|
|
157
178
|
# build the software (install deps, compile, package)
|
|
@@ -188,25 +209,13 @@ make clean
|
|
|
188
209
|
make all
|
|
189
210
|
```
|
|
190
211
|
|
|
191
|
-
**Equivalent examples for npm scripts and shell:**
|
|
192
|
-
|
|
193
|
-
```sh
|
|
194
|
-
# npm scripts (package.json)
|
|
195
|
-
npm run build
|
|
196
|
-
npm run test
|
|
197
|
-
npm run lint
|
|
198
|
-
STAGE=dev npm run deploy
|
|
199
|
-
|
|
200
|
-
# shell wrapper
|
|
201
|
-
./dev.sh build
|
|
202
|
-
./dev.sh test
|
|
203
|
-
STAGE=dev ./dev.sh deploy
|
|
204
|
-
```
|
|
205
|
-
|
|
206
212
|
## Considered Options
|
|
207
213
|
|
|
208
|
-
* (REJECTED) **Language-native entry points only** - Use `npm run`, `python -m`, `go run
|
|
214
|
+
* (REJECTED) **Language-native entry points only** - Use `npm run`, `python -m`, `go run`, and similar tool-specific commands directly as the standard surface
|
|
209
215
|
* Reason: Ties CI pipelines and developer muscle memory to language-specific tooling; breaks the abstraction when the underlying tool changes; target names vary per ecosystem
|
|
210
216
|
|
|
211
|
-
* (
|
|
212
|
-
|
|
217
|
+
* (REJECTED) **Runner-agnostic targets with multiple primary runners** - Keep the target names standard but allow Makefile, npm scripts, shell wrappers, or other runners as equivalent first-class entry points
|
|
218
|
+
* Reason: Preserves naming consistency but still spreads behavior across multiple scripting systems, which hides the real command path and weakens CI standardization.
|
|
219
|
+
|
|
220
|
+
* (CHOSEN) **Standardized Makefile targets with Mise-managed explicit tool execution** - Use `make <target>` as the only routine entry point, keep target names standard, and run the actual underlying tool commands through `mise exec --`
|
|
221
|
+
* Reason: This keeps names, execution flow, and tool versions equally predictable while avoiding script indirection.
|
|
@@ -220,13 +220,13 @@ For each module inside an application:
|
|
|
220
220
|
all: build lint test
|
|
221
221
|
|
|
222
222
|
build:
|
|
223
|
-
|
|
223
|
+
mise exec -- go build ./...
|
|
224
224
|
|
|
225
225
|
lint:
|
|
226
|
-
|
|
226
|
+
mise exec -- golangci-lint run ./...
|
|
227
227
|
|
|
228
228
|
test:
|
|
229
|
-
|
|
229
|
+
mise exec -- go test ./... -cover
|
|
230
230
|
|
|
231
231
|
clean:
|
|
232
232
|
rm -rf dist .cache
|
|
@@ -239,13 +239,13 @@ For each module inside an application:
|
|
|
239
239
|
all: build lint test
|
|
240
240
|
|
|
241
241
|
build:
|
|
242
|
-
|
|
242
|
+
mise exec -- pnpm exec tsc --project tsconfig.json
|
|
243
243
|
|
|
244
244
|
lint:
|
|
245
|
-
|
|
245
|
+
mise exec -- pnpm exec eslint ./src
|
|
246
246
|
|
|
247
247
|
test:
|
|
248
|
-
|
|
248
|
+
mise exec -- pnpm exec jest --verbose
|
|
249
249
|
|
|
250
250
|
clean:
|
|
251
251
|
rm -rf dist .cache
|
|
@@ -258,13 +258,13 @@ For each module inside an application:
|
|
|
258
258
|
all: build lint test
|
|
259
259
|
|
|
260
260
|
build:
|
|
261
|
-
|
|
261
|
+
mise exec -- uv build --project . --out-dir dist
|
|
262
262
|
|
|
263
263
|
lint:
|
|
264
|
-
|
|
264
|
+
mise exec -- uv run --project . ruff check .
|
|
265
265
|
|
|
266
266
|
test:
|
|
267
|
-
|
|
267
|
+
mise exec -- uv run --project . pytest
|
|
268
268
|
|
|
269
269
|
clean:
|
|
270
270
|
rm -rf dist .cache
|
package/README.md
CHANGED
|
@@ -80,27 +80,25 @@ This is useful when you want to:
|
|
|
80
80
|
|
|
81
81
|
## Development
|
|
82
82
|
|
|
83
|
-
Install [Mise](https://mise.jdx.dev/getting-started.html), then
|
|
83
|
+
Install [Mise](https://mise.jdx.dev/getting-started.html), then bootstrap the repository through the root `Makefile`:
|
|
84
84
|
|
|
85
85
|
```sh
|
|
86
|
-
|
|
86
|
+
make setup
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
-
Use the root `Makefile` as the entry point for local verification
|
|
89
|
+
Use the root `Makefile` as the entry point for local verification:
|
|
90
90
|
|
|
91
91
|
```sh
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
make build
|
|
93
|
+
make lint
|
|
94
|
+
make test
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
Running `make build`, `make lint`, or `make test` from an already activated Mise shell is equivalent.
|
|
98
|
-
|
|
99
97
|
What these targets do:
|
|
100
98
|
|
|
101
|
-
- `
|
|
102
|
-
- `
|
|
103
|
-
- `
|
|
99
|
+
- `make build` installs dependencies and creates a local npm package in `dist/`.
|
|
100
|
+
- `make lint` runs the repository lint target.
|
|
101
|
+
- `make test` rebuilds the package and validates the consumer extraction flow through the runnable example in `examples/`.
|
|
104
102
|
|
|
105
103
|
## Repository Map
|
|
106
104
|
|