agentme 0.3.3 → 0.6.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 +32 -11
- package/.xdrs/agentme/edrs/application/010-golang-project-tooling.md +32 -18
- package/.xdrs/agentme/edrs/application/014-python-project-tooling.md +152 -0
- package/.xdrs/agentme/edrs/application/015-cli-tool-standards.md +107 -0
- package/.xdrs/agentme/edrs/application/skills/001-create-javascript-project/SKILL.md +61 -19
- package/.xdrs/agentme/edrs/application/skills/003-create-golang-project/SKILL.md +19 -9
- package/.xdrs/agentme/edrs/application/skills/005-create-python-project/SKILL.md +363 -0
- package/.xdrs/agentme/edrs/devops/005-monorepo-structure.md +37 -5
- package/.xdrs/agentme/edrs/devops/006-github-pipelines.md +6 -1
- package/.xdrs/agentme/edrs/devops/008-common-targets.md +5 -0
- package/.xdrs/agentme/edrs/devops/skills/002-monorepo-setup/SKILL.md +58 -12
- package/.xdrs/agentme/edrs/governance/013-contributing-guide-requirements.md +5 -0
- package/.xdrs/agentme/edrs/index.md +3 -0
- package/.xdrs/agentme/edrs/observability/011-service-health-check-endpoint.md +5 -0
- package/.xdrs/agentme/edrs/principles/002-coding-best-practices.md +5 -0
- package/.xdrs/agentme/edrs/principles/004-unit-test-requirements.md +5 -0
- package/.xdrs/agentme/edrs/principles/007-project-quality-standards.md +7 -2
- package/.xdrs/agentme/edrs/principles/009-error-handling.md +5 -0
- package/.xdrs/agentme/edrs/principles/012-continuous-xdr-enrichment.md +6 -1
- package/.xdrs/agentme/edrs/principles/016-cross-language-module-structure.md +133 -0
- package/.xdrs/agentme/edrs/principles/articles/001-continuous-xdr-improvement.md +3 -3
- package/package.json +23 -3
|
@@ -12,9 +12,9 @@ compatibility: Go 1.21+
|
|
|
12
12
|
|
|
13
13
|
## Overview
|
|
14
14
|
|
|
15
|
-
Creates a complete Go CLI project from scratch, following the layout from [agentme-edr-010](../../010-golang-project-tooling.md). Business logic lives in named feature packages; CLI wiring lives in `cli/<feature>/`; `main.go` is a thin dispatcher. The
|
|
15
|
+
Creates a complete Go CLI project from scratch, following the layout from [agentme-edr-010](../../010-golang-project-tooling.md). Business logic lives in named feature packages; CLI wiring lives in `cli/<feature>/`; `main.go` is a thin dispatcher. The module root owns its `Makefile`, `README.md`, `dist/`, and `.cache/` folders.
|
|
16
16
|
|
|
17
|
-
Related
|
|
17
|
+
Related EDRs: [agentme-edr-010](../../010-golang-project-tooling.md), [agentme-edr-016](../../../principles/016-cross-language-module-structure.md)
|
|
18
18
|
|
|
19
19
|
## Instructions
|
|
20
20
|
|
|
@@ -83,11 +83,16 @@ func main() {
|
|
|
83
83
|
SHELL := /bin/bash
|
|
84
84
|
|
|
85
85
|
BINARY := [binary]
|
|
86
|
+
CACHE_DIR := .cache
|
|
87
|
+
export GOCACHE := $(abspath $(CACHE_DIR)/go-build)
|
|
88
|
+
export GOMODCACHE := $(abspath $(CACHE_DIR)/go-mod)
|
|
89
|
+
export GOLANGCI_LINT_CACHE := $(abspath $(CACHE_DIR)/golangci-lint)
|
|
86
90
|
|
|
87
91
|
all: build lint test
|
|
88
92
|
|
|
89
93
|
build: install
|
|
90
94
|
@mkdir -p dist
|
|
95
|
+
@mkdir -p $(GOCACHE) $(GOMODCACHE)
|
|
91
96
|
go build -o dist/$(BINARY) .
|
|
92
97
|
|
|
93
98
|
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
|
|
@@ -113,6 +118,7 @@ build-arch-os:
|
|
|
113
118
|
@if [ "${ARCH}" == "" ]; then echo "ENV ARCH is required"; exit 1; fi
|
|
114
119
|
@echo "Compiling $(BINARY) for ${OS}-${ARCH}..."
|
|
115
120
|
@mkdir -p dist/${OS}-${ARCH}
|
|
121
|
+
@mkdir -p $(GOCACHE) $(GOMODCACHE)
|
|
116
122
|
go mod download
|
|
117
123
|
GOOS=${OS} GOARCH=${ARCH} CGO_ENABLED=0 go build -a -o dist/${OS}-${ARCH}/$(BINARY) .
|
|
118
124
|
@echo "Done"
|
|
@@ -130,15 +136,16 @@ test:
|
|
|
130
136
|
go test -cover ./...
|
|
131
137
|
|
|
132
138
|
test-coverage:
|
|
133
|
-
|
|
134
|
-
go
|
|
139
|
+
@mkdir -p $(CACHE_DIR)
|
|
140
|
+
go test -coverprofile=$(CACHE_DIR)/coverage.out ./...
|
|
141
|
+
go tool cover -func $(CACHE_DIR)/coverage.out
|
|
135
142
|
|
|
136
143
|
benchmark:
|
|
137
144
|
go test -bench . -benchmem -count 5 ./...
|
|
138
145
|
|
|
139
146
|
clean:
|
|
140
147
|
rm -rf dist
|
|
141
|
-
rm -
|
|
148
|
+
rm -rf .cache
|
|
142
149
|
|
|
143
150
|
start:
|
|
144
151
|
go run ./ [subcommand]
|
|
@@ -164,6 +171,7 @@ run:
|
|
|
164
171
|
|
|
165
172
|
```
|
|
166
173
|
dist/
|
|
174
|
+
.cache/
|
|
167
175
|
coverage.out
|
|
168
176
|
*.pprof
|
|
169
177
|
.DS_Store
|
|
@@ -182,10 +190,10 @@ coverage.out
|
|
|
182
190
|
|
|
183
191
|
## Development
|
|
184
192
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
193
|
+
make build # compile binary to dist/
|
|
194
|
+
make lint # run golangci-lint with cache in .cache/
|
|
195
|
+
make test # run tests with coverage artifacts in .cache/
|
|
196
|
+
make start # run locally with default args
|
|
189
197
|
```
|
|
190
198
|
|
|
191
199
|
---
|
|
@@ -306,6 +314,8 @@ Fix any compile or lint errors before finishing.
|
|
|
306
314
|
- Business logic only in `[feature]/` packages — no flag parsing, no `fmt.Println` for diagnostics.
|
|
307
315
|
- `cli/[feature]/` owns flags, output, and calls domain. No logic here beyond reading flags and printing results.
|
|
308
316
|
- All tests co-located (`*_test.go` next to the file under test).
|
|
317
|
+
- Use `tests_integration/` for integration flows and `tests_benchmark/` when benchmarks need dedicated harnesses or datasets.
|
|
309
318
|
- Log with `logrus`; never use `fmt.Println` for diagnostic/debug output.
|
|
310
319
|
- All development tasks go through `make` targets — never run `go` directly for routine ops.
|
|
311
320
|
- Do not create an `internal/` package unless explicitly justified (importability is preferred).
|
|
321
|
+
- 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.
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 005-create-python-project
|
|
3
|
+
description: >
|
|
4
|
+
Scaffolds the initial boilerplate structure for a Python library or CLI project following the
|
|
5
|
+
standard tooling and layout defined in agentme-edr-014. Activate this skill when the user asks
|
|
6
|
+
to create, scaffold, or initialize a new Python package, CLI, library, or similar project
|
|
7
|
+
structure.
|
|
8
|
+
metadata:
|
|
9
|
+
author: flaviostutz
|
|
10
|
+
version: "1.0"
|
|
11
|
+
compatibility: Python 3.12+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
Creates a complete Python project from scratch using `uv`, `pyproject.toml`, Ruff, Pyright,
|
|
17
|
+
Pytest, and Makefiles. The default layout keeps the library self-contained under `lib/`, uses a
|
|
18
|
+
shared root `.venv/`, redirects persistent caches into `.cache/`, and places runnable consumer
|
|
19
|
+
projects under the sibling `examples/` folder.
|
|
20
|
+
|
|
21
|
+
Related EDRs: [agentme-edr-014](../../014-python-project-tooling.md), [agentme-edr-016](../../../principles/016-cross-language-module-structure.md)
|
|
22
|
+
|
|
23
|
+
## Instructions
|
|
24
|
+
|
|
25
|
+
### Phase 1: Gather information
|
|
26
|
+
|
|
27
|
+
Ask for or infer from context:
|
|
28
|
+
|
|
29
|
+
- **Package name** - Python distribution/import name, e.g. `my_tool`
|
|
30
|
+
- **Short description** - one sentence
|
|
31
|
+
- **Author** name or GitHub username
|
|
32
|
+
- **Python version** - default `3.13`
|
|
33
|
+
- **Project kind** - `library` or `cli`
|
|
34
|
+
- **Primary entry point** - first module or command name to scaffold
|
|
35
|
+
- **GitHub repo URL** - optional, for project metadata
|
|
36
|
+
- **Confirm target directory** - default: current workspace root
|
|
37
|
+
|
|
38
|
+
### Phase 2: Create root files
|
|
39
|
+
|
|
40
|
+
Create these files first.
|
|
41
|
+
|
|
42
|
+
**`./Makefile`**
|
|
43
|
+
|
|
44
|
+
```makefile
|
|
45
|
+
SHELL := /bin/bash
|
|
46
|
+
ROOT_DIR := $(abspath .)
|
|
47
|
+
export UV_PROJECT_ENVIRONMENT := $(ROOT_DIR)/.venv
|
|
48
|
+
export UV_CACHE_DIR := $(ROOT_DIR)/.cache/uv
|
|
49
|
+
|
|
50
|
+
all: build lint test
|
|
51
|
+
|
|
52
|
+
install:
|
|
53
|
+
$(MAKE) -C lib install
|
|
54
|
+
|
|
55
|
+
build:
|
|
56
|
+
$(MAKE) -C lib build
|
|
57
|
+
|
|
58
|
+
lint:
|
|
59
|
+
$(MAKE) -C lib lint
|
|
60
|
+
|
|
61
|
+
lint-fix:
|
|
62
|
+
$(MAKE) -C lib lint-fix
|
|
63
|
+
|
|
64
|
+
test: test-unit test-examples
|
|
65
|
+
|
|
66
|
+
test-unit:
|
|
67
|
+
$(MAKE) -C lib test-unit
|
|
68
|
+
|
|
69
|
+
test-examples: build
|
|
70
|
+
@for dir in examples/*; do \
|
|
71
|
+
if [ -f "$$dir/pyproject.toml" ]; then \
|
|
72
|
+
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; \
|
|
76
|
+
fi; \
|
|
77
|
+
done
|
|
78
|
+
|
|
79
|
+
clean:
|
|
80
|
+
$(MAKE) -C lib clean
|
|
81
|
+
rm -rf .cache
|
|
82
|
+
rm -rf .venv
|
|
83
|
+
```
|
|
84
|
+
|
|
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`.
|
|
88
|
+
|
|
89
|
+
**`./.gitignore`**
|
|
90
|
+
|
|
91
|
+
```gitignore
|
|
92
|
+
.venv/
|
|
93
|
+
dist/
|
|
94
|
+
.cache/
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**`./README.md`**
|
|
98
|
+
|
|
99
|
+
Keep this README focused on the repository or workspace. Put Getting Started near the top.
|
|
100
|
+
|
|
101
|
+
````markdown
|
|
102
|
+
# [package-name]
|
|
103
|
+
|
|
104
|
+
[description]
|
|
105
|
+
|
|
106
|
+
## Getting Started
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
make test
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
The published package lives in `lib/` and runnable consumer examples live in `examples/`.
|
|
113
|
+
````
|
|
114
|
+
|
|
115
|
+
### Phase 3: Create `lib/`
|
|
116
|
+
|
|
117
|
+
`lib/` contains everything the library needs: source, tests, package metadata, lockfile, build
|
|
118
|
+
artifacts, and library-specific Makefile targets.
|
|
119
|
+
|
|
120
|
+
**`lib/Makefile`**
|
|
121
|
+
|
|
122
|
+
```makefile
|
|
123
|
+
SHELL := /bin/bash
|
|
124
|
+
ROOT_DIR := $(abspath ..)
|
|
125
|
+
export UV_PROJECT_ENVIRONMENT := $(ROOT_DIR)/.venv
|
|
126
|
+
export UV_CACHE_DIR := $(ROOT_DIR)/.cache/uv
|
|
127
|
+
export RUFF_CACHE_DIR := $(abspath .cache/ruff)
|
|
128
|
+
export PYTHONPYCACHEPREFIX := $(abspath .cache/pycache)
|
|
129
|
+
export COVERAGE_FILE := $(abspath .cache/coverage)
|
|
130
|
+
|
|
131
|
+
PACKAGE_NAME ?= your_package
|
|
132
|
+
|
|
133
|
+
all: build lint test-unit
|
|
134
|
+
|
|
135
|
+
install:
|
|
136
|
+
uv sync --project . --frozen --all-extras --dev
|
|
137
|
+
|
|
138
|
+
build: install
|
|
139
|
+
rm -rf dist
|
|
140
|
+
uv build --project . --out-dir dist
|
|
141
|
+
|
|
142
|
+
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
|
|
147
|
+
|
|
148
|
+
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
|
|
153
|
+
|
|
154
|
+
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
|
|
156
|
+
|
|
157
|
+
run: install
|
|
158
|
+
uv run --project . python -m $(PACKAGE_NAME)
|
|
159
|
+
|
|
160
|
+
dev: run
|
|
161
|
+
|
|
162
|
+
update-lockfile:
|
|
163
|
+
uv lock --project . --upgrade
|
|
164
|
+
|
|
165
|
+
clean:
|
|
166
|
+
rm -rf dist .cache
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**`lib/pyproject.toml`**
|
|
170
|
+
|
|
171
|
+
Replace placeholders such as `[package-name]`, `[description]`, `[author]`, and `[python-version]`.
|
|
172
|
+
|
|
173
|
+
```toml
|
|
174
|
+
[project]
|
|
175
|
+
name = "[package-name]"
|
|
176
|
+
version = "0.0.1"
|
|
177
|
+
description = "[description]"
|
|
178
|
+
readme = "README.md"
|
|
179
|
+
requires-python = ">=[python-version]"
|
|
180
|
+
dependencies = []
|
|
181
|
+
|
|
182
|
+
[[project.authors]]
|
|
183
|
+
name = "[author]"
|
|
184
|
+
|
|
185
|
+
[project.optional-dependencies]
|
|
186
|
+
dev = []
|
|
187
|
+
|
|
188
|
+
[dependency-groups]
|
|
189
|
+
dev = [
|
|
190
|
+
"pip-audit>=2.9.0",
|
|
191
|
+
"pyright>=1.1.400",
|
|
192
|
+
"pytest>=8.4.0",
|
|
193
|
+
"pytest-cov>=6.1.0",
|
|
194
|
+
"ruff>=0.11.0",
|
|
195
|
+
]
|
|
196
|
+
|
|
197
|
+
[build-system]
|
|
198
|
+
requires = ["hatchling>=1.27.0"]
|
|
199
|
+
build-backend = "hatchling.build"
|
|
200
|
+
|
|
201
|
+
[tool.ruff]
|
|
202
|
+
line-length = 100
|
|
203
|
+
target-version = "py313"
|
|
204
|
+
|
|
205
|
+
[tool.ruff.lint]
|
|
206
|
+
select = ["E", "F", "I", "B", "UP"]
|
|
207
|
+
|
|
208
|
+
[tool.pyright]
|
|
209
|
+
include = ["src", "tests"]
|
|
210
|
+
venvPath = ".."
|
|
211
|
+
venv = ".venv"
|
|
212
|
+
typeCheckingMode = "standard"
|
|
213
|
+
|
|
214
|
+
[tool.pytest.ini_options]
|
|
215
|
+
testpaths = ["tests"]
|
|
216
|
+
addopts = "-q"
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Use `lib/pyproject.toml` as the single configuration file for the package. Do not add
|
|
220
|
+
`requirements.txt`, `setup.py`, `setup.cfg`, `ruff.toml`, or `pyrightconfig.json` by default.
|
|
221
|
+
|
|
222
|
+
**`lib/README.md`**
|
|
223
|
+
|
|
224
|
+
This README is the published package README referenced by `lib/pyproject.toml`.
|
|
225
|
+
|
|
226
|
+
````markdown
|
|
227
|
+
# [package-name]
|
|
228
|
+
|
|
229
|
+
[description]
|
|
230
|
+
|
|
231
|
+
## Getting Started
|
|
232
|
+
|
|
233
|
+
```sh
|
|
234
|
+
uv sync --dev
|
|
235
|
+
make test
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
```python
|
|
239
|
+
from [package-name] import hello
|
|
240
|
+
|
|
241
|
+
print(hello("world"))
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Development
|
|
245
|
+
|
|
246
|
+
```sh
|
|
247
|
+
make build
|
|
248
|
+
make lint
|
|
249
|
+
make test
|
|
250
|
+
```
|
|
251
|
+
````
|
|
252
|
+
|
|
253
|
+
### Phase 4: Create the package and tests inside `lib/`
|
|
254
|
+
|
|
255
|
+
Create this baseline structure.
|
|
256
|
+
|
|
257
|
+
**`lib/src/[package_name]/__init__.py`**
|
|
258
|
+
|
|
259
|
+
```python
|
|
260
|
+
from .core import hello
|
|
261
|
+
|
|
262
|
+
__all__ = ["hello"]
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**`lib/src/[package_name]/core.py`**
|
|
266
|
+
|
|
267
|
+
```python
|
|
268
|
+
def hello(name: str) -> str:
|
|
269
|
+
return f"Hello, {name}!"
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**`lib/src/[package_name]/__main__.py`**
|
|
273
|
+
|
|
274
|
+
Use this only for CLI-oriented projects.
|
|
275
|
+
|
|
276
|
+
```python
|
|
277
|
+
from .core import hello
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def main() -> None:
|
|
281
|
+
print(hello("world"))
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
if __name__ == "__main__":
|
|
285
|
+
main()
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**`lib/tests/test_core.py`**
|
|
289
|
+
|
|
290
|
+
```python
|
|
291
|
+
from [package_name].core import hello
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def test_hello() -> None:
|
|
295
|
+
assert hello("world") == "Hello, world!"
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
If two or more test files need shared fixtures, create `lib/tests/conftest.py` and move shared setup there.
|
|
299
|
+
|
|
300
|
+
If the module needs slower end-to-end coverage, place those tests in `lib/tests_integration/`. Put dedicated benchmark harnesses in `lib/tests_benchmark/`.
|
|
301
|
+
|
|
302
|
+
### Phase 5: Create examples for libraries and utilities
|
|
303
|
+
|
|
304
|
+
If the project is a library or shared utility, add an `examples/` directory with one subdirectory per runnable consumer example. Each example must be its own Python project.
|
|
305
|
+
|
|
306
|
+
**`examples/basic-usage/pyproject.toml`**
|
|
307
|
+
|
|
308
|
+
```toml
|
|
309
|
+
[project]
|
|
310
|
+
name = "basic-usage"
|
|
311
|
+
version = "0.0.0"
|
|
312
|
+
requires-python = ">=[python-version]"
|
|
313
|
+
dependencies = []
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
The root `test-examples` target installs the wheel built into `lib/dist/` before running each
|
|
317
|
+
example. Do not point examples back to `../../lib` or `lib/src/`.
|
|
318
|
+
|
|
319
|
+
**`examples/basic-usage/main.py`**
|
|
320
|
+
|
|
321
|
+
```python
|
|
322
|
+
from [package_name] import hello
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
print(hello("world"))
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
Examples must import the package as a consumer would. Avoid relative imports back into `lib/src/`.
|
|
329
|
+
|
|
330
|
+
### Phase 6: Verify
|
|
331
|
+
|
|
332
|
+
After creating the files:
|
|
333
|
+
|
|
334
|
+
1. Run `make install`.
|
|
335
|
+
2. Run `make lint-fix`.
|
|
336
|
+
3. Run `make test`.
|
|
337
|
+
4. Run `make build`.
|
|
338
|
+
5. Fix all failures before finishing.
|
|
339
|
+
|
|
340
|
+
## Examples
|
|
341
|
+
|
|
342
|
+
**Input:** "Create a Python library called `event_tools`"
|
|
343
|
+
- Create `Makefile`, `README.md`, `lib/pyproject.toml`, `lib/Makefile`, `lib/src/event_tools/`, `lib/tests/`, and `examples/`
|
|
344
|
+
- Add `lib/README.md`, `.cache/` handling, and install examples from the built wheel in `lib/dist/`
|
|
345
|
+
- Configure `uv`, Ruff, Pyright, Pytest, `pytest-cov`, and `pip-audit`
|
|
346
|
+
- Verify with `make lint-fix`, `make test`, and `make build`
|
|
347
|
+
|
|
348
|
+
**Input:** "Scaffold a Python CLI package"
|
|
349
|
+
- Add `lib/src/<package_name>/__main__.py`
|
|
350
|
+
- Add `[project.scripts]` in `lib/pyproject.toml` when the command name must differ from the module name
|
|
351
|
+
- Keep the same Makefile and quality checks
|
|
352
|
+
|
|
353
|
+
## Edge Cases
|
|
354
|
+
|
|
355
|
+
- If the repository already has a root `.mise.toml`, pin Python and uv there instead of assuming host-installed tools.
|
|
356
|
+
- 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
|
+
- 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
|
+
- 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.
|
|
359
|
+
|
|
360
|
+
## References
|
|
361
|
+
|
|
362
|
+
- [agentme-edr-014](../../014-python-project-tooling.md)
|
|
363
|
+
- [_core-adr-003 - Skill standards](../../../../../_core/adrs/principles/003-skill-standards.md)
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agentme-edr-005-monorepo-structure
|
|
3
|
+
description: Defines the standard monorepo layout, naming, and build conventions using shared areas, Mise, and Makefiles. Use when creating or reviewing monorepos.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# agentme-edr-005: Monorepo structure
|
|
2
7
|
|
|
3
8
|
## Context and Problem Statement
|
|
@@ -8,9 +13,10 @@ What monorepo structure, naming conventions, tooling, and build standards should
|
|
|
8
13
|
|
|
9
14
|
## Decision Outcome
|
|
10
15
|
|
|
11
|
-
**Adopt a standardized monorepo layout with top-level application folders,
|
|
16
|
+
**Adopt a standardized monorepo layout with top-level application folders that aggregate independent module roots, shared parent-level example and test areas, Mise-managed tooling, and Makefiles at every level.**
|
|
12
17
|
|
|
13
18
|
For step-by-step scaffolding instructions see [skill 002-monorepo-setup](skills/002-monorepo-setup/SKILL.md).
|
|
19
|
+
Module folder responsibilities, artifact locations, and test-folder conventions follow [agentme-edr-016](../principles/016-cross-language-module-structure.md).
|
|
14
20
|
|
|
15
21
|
### Policies
|
|
16
22
|
|
|
@@ -18,16 +24,26 @@ For step-by-step scaffolding instructions see [skill 002-monorepo-setup](skills/
|
|
|
18
24
|
|
|
19
25
|
```
|
|
20
26
|
/
|
|
27
|
+
├── .cache/ # Optional shared cache for repo-level tooling
|
|
21
28
|
├── shared/ # Resources shared across ALL applications
|
|
22
29
|
│ ├── libs/ # Reusable libraries consumed by applications
|
|
23
30
|
│ └── scripts/ # Build/CI/dev scripts used across applications
|
|
24
31
|
│
|
|
25
32
|
├── <application>/ # One folder per application or project
|
|
26
33
|
│ ├── README.md # REQUIRED
|
|
27
|
-
│ ├──
|
|
34
|
+
│ ├── Makefile # REQUIRED
|
|
35
|
+
│ ├── <module>/ # One folder per buildable/publishable module
|
|
36
|
+
│ │ ├── Makefile # REQUIRED
|
|
37
|
+
│ │ ├── README.md # REQUIRED
|
|
38
|
+
│ │ ├── dist/ # REQUIRED when the module publishes/builds artifacts
|
|
39
|
+
│ │ └── .cache/ # REQUIRED when caches are not shared above
|
|
40
|
+
│ ├── examples/ # Optional sibling consumer examples for modules in this app
|
|
41
|
+
│ ├── tests_integration/# Optional cross-module integration tests for this app
|
|
42
|
+
│ ├── tests_benchmark/ # Optional cross-module benchmarks for this app
|
|
28
43
|
│ └── shared/ # Resources shared by modules within THIS application
|
|
29
44
|
│
|
|
30
45
|
├── Makefile # Root Makefile coordinating all areas
|
|
46
|
+
├── .gitignore # MUST ignore dist/ and .cache/
|
|
31
47
|
├── README.md # REQUIRED — onboarding and quickstart guide
|
|
32
48
|
└── .mise.toml # Mise tool version configuration
|
|
33
49
|
```
|
|
@@ -37,6 +53,7 @@ For step-by-step scaffolding instructions see [skill 002-monorepo-setup](skills/
|
|
|
37
53
|
- Represent a cohesive unit with its own lifecycle (e.g., `mymobileapp`, `graph-visualizer`).
|
|
38
54
|
- **MUST** depend only on resources in `/shared/`. Direct cross-application dependencies are forbidden; use published artifacts (container images, published libraries) instead.
|
|
39
55
|
- **MUST** contain a `README.md` with: purpose, architecture overview, how to build, and how to run.
|
|
56
|
+
- **MAY** contain `examples/`, `tests_integration/`, and `tests_benchmark/` when those artifacts apply to multiple modules inside the application.
|
|
40
57
|
|
|
41
58
|
*Why:* Isolating applications prevents implicit coupling and makes the `shared/` boundary explicit and intentional.
|
|
42
59
|
|
|
@@ -45,6 +62,9 @@ For step-by-step scaffolding instructions see [skill 002-monorepo-setup](skills/
|
|
|
45
62
|
- A module is a subfolder inside an application that is independently compilable and produces a build artifact.
|
|
46
63
|
- May depend on sibling modules within the same application or on `/shared/` resources.
|
|
47
64
|
- **MUST NOT** depend on modules from other applications.
|
|
65
|
+
- **MUST** contain its own `Makefile`, `README.md`, and language/tooling configuration.
|
|
66
|
+
- **MUST** keep build outputs under `dist/` and persistent caches under `.cache/`, following [agentme-edr-016](../principles/016-cross-language-module-structure.md).
|
|
67
|
+
- **MUST NOT** keep consumer examples inside the module folder; those belong in a sibling `examples/` folder at the nearest parent aggregation root.
|
|
48
68
|
|
|
49
69
|
#### 4. Naming conventions
|
|
50
70
|
|
|
@@ -56,7 +76,11 @@ For step-by-step scaffolding instructions see [skill 002-monorepo-setup](skills/
|
|
|
56
76
|
|
|
57
77
|
A `Makefile` **MUST** be present at the repository root, in every application folder, and in every module folder.
|
|
58
78
|
|
|
59
|
-
|
|
79
|
+
All Makefiles **MUST** use the shared target vocabulary from [agentme-edr-008](008-common-targets.md).
|
|
80
|
+
|
|
81
|
+
Repository, application, and module Makefiles **MUST** define at minimum: `all`, `build`, `lint`, `test`, and `clean`.
|
|
82
|
+
|
|
83
|
+
Module Makefiles **SHOULD** also provide `lint-fix` and `install` when the underlying tooling supports them.
|
|
60
84
|
|
|
61
85
|
The root `Makefile` **MUST** also define a `setup` target that guides a new contributor to prepare their machine.
|
|
62
86
|
|
|
@@ -79,7 +103,11 @@ The root `Makefile` **MUST** also define a `setup` target that guides a new cont
|
|
|
79
103
|
|
|
80
104
|
The root `README.md` **MUST** include: overview, machine setup, quickstart, and a repository map.
|
|
81
105
|
|
|
82
|
-
#### 8.
|
|
106
|
+
#### 8. Root `.gitignore`
|
|
107
|
+
|
|
108
|
+
The repository root **MUST** ignore `dist/` and `.cache/` so module artifacts and tool caches are never committed accidentally.
|
|
109
|
+
|
|
110
|
+
#### 9. Git tagging and artifact versioning
|
|
83
111
|
|
|
84
112
|
All releases **MUST** be tagged using the format `<module-name>/<semver>` (e.g., `graphvisualizer/renderer/1.0.0`, `shared/libs/mylib/2.1.0`).
|
|
85
113
|
|
|
@@ -95,10 +123,14 @@ All releases **MUST** be tagged using the format `<module-name>/<semver>` (e.g.,
|
|
|
95
123
|
|---|---|---|
|
|
96
124
|
| Lowercase folder/file names | All | Yes |
|
|
97
125
|
| `README.md` per application | Application folders | Yes |
|
|
98
|
-
| `
|
|
126
|
+
| `README.md` per module | Module folders | Yes |
|
|
127
|
+
| `Makefile` with `all`, `build`, `lint`, `test`, `clean` | Root, applications, modules | Yes |
|
|
99
128
|
| Root `Makefile` with `setup` target | Repository root | Yes |
|
|
100
129
|
| Root `README.md` with setup + quickstart | Repository root | Yes |
|
|
130
|
+
| Ignore `dist/` and `.cache/` | Repository root | Yes |
|
|
101
131
|
| Mise `.mise.toml` at root | Repository root | Yes |
|
|
102
132
|
| Applications depend only on `/shared/` | Application folders | Yes |
|
|
103
133
|
| Modules depend only on siblings or `/shared/` | Module folders | Yes |
|
|
134
|
+
| Module outputs live in `dist/` | Module folders | Yes |
|
|
135
|
+
| Persistent caches live in `.cache/` | Repo or module folders | Yes |
|
|
104
136
|
| Git tags follow `<module-name>/<semver>` format | All modules | Yes |
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agentme-edr-006-github-ci-cd-pipelines
|
|
3
|
+
description: Defines the standard GitHub Actions workflow split for CI, release tagging, and publishing. Use when configuring project automation.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# agentme-edr-006: GitHub CI/CD pipelines
|
|
2
7
|
|
|
3
8
|
## Context and Problem Statement
|
|
@@ -129,7 +134,7 @@ jobs:
|
|
|
129
134
|
|
|
130
135
|
*Why rebuild on publish:* The checkout is done from the exact tag commit. Rebuilding ensures the published artifact matches exactly what is tagged, rather than relying on a prior CI artifact.
|
|
131
136
|
|
|
132
|
-
*Why `id-token: write`:* Required for npm provenance attestation via `npm publish --provenance`, as specified in [agentme-edr-003](003-javascript-project-tooling.md).
|
|
137
|
+
*Why `id-token: write`:* Required for npm provenance attestation via `npm publish --provenance`, as specified in [agentme-edr-003](../application/003-javascript-project-tooling.md).
|
|
133
138
|
|
|
134
139
|
---
|
|
135
140
|
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agentme-edr-008-common-development-script-names
|
|
3
|
+
description: Defines standard development command names and lifecycle groups across projects, regardless of the underlying runner. Use when designing build, lint, test, and release entry points.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# agentme-edr-008: Common development script names
|
|
2
7
|
|
|
3
8
|
## Context and Problem Statement
|