agentme 0.25.0 → 0.25.2
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/.filedist-package.yml +1 -1
- package/.xdrs/agentme/edrs/application/019-ai-agents-development-standards.md +2 -2
- package/.xdrs/agentme/edrs/application/021-ai-workflow-development-standards.md +7 -7
- package/.xdrs/agentme/edrs/application/026-pragmatic-hexagonal-architecture.md +7 -3
- package/.xdrs/agentme/edrs/application/030-ai-test-types-taxonomy.md +5 -3
- package/.xdrs/agentme/edrs/devops/005-monorepo-structure.md +2 -0
- package/.xdrs/agentme/edrs/devops/006-github-pipelines.md +3 -3
- package/.xdrs/agentme/edrs/devops/008-common-targets.md +1 -1
- package/.xdrs/agentme/edrs/devops/027-environment-variable-configuration.md +8 -8
- package/.xdrs/agentme/edrs/principles/002-coding-best-practices.md +3 -3
- package/.xdrs/agentme/edrs/principles/004-unit-test-requirements.md +6 -6
- package/.xdrs/agentme/edrs/principles/007-project-quality-standards.md +7 -7
- package/.xdrs/agentme/edrs/principles/022-secrets-management.md +8 -8
- package/.xdrs/agentme/edrs/principles/023-coding-abstraction-practices.md +3 -3
- package/package.json +2 -2
package/.filedist-package.yml
CHANGED
|
@@ -108,11 +108,11 @@ When agents are used as nodes in workflows, the node name MUST use the `_agent`
|
|
|
108
108
|
|
|
109
109
|
#### 05-agent-composition
|
|
110
110
|
|
|
111
|
-
When multiple agents are needed:
|
|
111
|
+
When multiple agents are needed, one of these composition patterns MUST be chosen:
|
|
112
112
|
|
|
113
113
|
- **Single agent with multiple tools:** Use when tools share a common goal and context (e.g., a code analysis agent with `read_file`, `search_code`, and `analyze_pattern` tools).
|
|
114
114
|
- **Multiple agents as workflow nodes:** Use when agents have distinct responsibilities and outputs that feed into each other. Orchestrate them using LangGraph per [agentme-edr-021](021-ai-workflow-development-standards.md).
|
|
115
|
-
-
|
|
115
|
+
- Nested agent loops (agent calling agent autonomously) MUST NOT be created. Use workflows for multi-agent orchestration.
|
|
116
116
|
|
|
117
117
|
**Decision criteria:**
|
|
118
118
|
|
|
@@ -37,7 +37,7 @@ Use **MLflow** for all workflow observability and evaluation:
|
|
|
37
37
|
|
|
38
38
|
#### 04-dataset-driven-accuracy-measurement
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
Projects MUST follow the eval dataset and implementation requirements defined in [agentme-edr-028](028-ai-eval-standards.md). Testing requirements (when evals are required, release gates) are defined in [agentme-edr-007](../principles/007-project-quality-standards.md) rule `09-ai-project-testing-requirements`.
|
|
41
41
|
|
|
42
42
|
#### 05-flow-documentation
|
|
43
43
|
|
|
@@ -101,11 +101,11 @@ lib/src/<package_name>/
|
|
|
101
101
|
|
|
102
102
|
#### 08-workflow-evals
|
|
103
103
|
|
|
104
|
-
|
|
104
|
+
Projects MUST follow the eval folder structure and script requirements defined in [agentme-edr-028](028-ai-eval-standards.md).
|
|
105
105
|
|
|
106
106
|
#### 09-node-naming-conventions
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
Nodes MUST follow the naming conventions defined in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `01-node-naming-conventions`.
|
|
109
109
|
|
|
110
110
|
#### 10-workflow-unit-testing
|
|
111
111
|
|
|
@@ -159,15 +159,15 @@ Workflows MUST accept the LLM instance as a constructor parameter so that unit t
|
|
|
159
159
|
|
|
160
160
|
#### 11-state-type-conventions
|
|
161
161
|
|
|
162
|
-
|
|
162
|
+
State types MUST follow the conventions defined in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `02-state-type-conventions`.
|
|
163
163
|
|
|
164
164
|
#### 12-workflow-naming-conventions
|
|
165
165
|
|
|
166
|
-
|
|
166
|
+
Workflows MUST be named following the conventions in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `04-workflow-naming-conventions`.
|
|
167
167
|
|
|
168
168
|
#### 13-judge-node-output-format
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
Judge nodes MUST use the output format defined in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `03-judge-node-output-format`.
|
|
171
171
|
|
|
172
172
|
#### 15-workflow-state-persistence
|
|
173
173
|
|
|
@@ -200,7 +200,7 @@ result = graph.invoke(input_state, config={"thread_id": "session-123"})
|
|
|
200
200
|
|
|
201
201
|
#### 16-cross-element-naming-coherence
|
|
202
202
|
|
|
203
|
-
|
|
203
|
+
All workflow elements MUST maintain naming coherence as defined in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `05-cross-element-naming-coherence`.
|
|
204
204
|
|
|
205
205
|
## References
|
|
206
206
|
|
|
@@ -21,7 +21,7 @@ How should application source code be organized to separate business logic from
|
|
|
21
21
|
|
|
22
22
|
#### 01-three-layer-separation
|
|
23
23
|
|
|
24
|
-
Every application
|
|
24
|
+
Every application MUST be organized into these three conceptual layers:
|
|
25
25
|
|
|
26
26
|
| Layer | Description |
|
|
27
27
|
|-------|-------------|
|
|
@@ -31,6 +31,8 @@ Every application is conceptually divided into three layers:
|
|
|
31
31
|
|
|
32
32
|
#### 02-adapter-naming-conventions
|
|
33
33
|
|
|
34
|
+
Adapters MUST follow these naming conventions:
|
|
35
|
+
|
|
34
36
|
**Inbound adapters** receive external requests or events and trigger application logic. Each gets a flat folder under `adapters/`:
|
|
35
37
|
|
|
36
38
|
- `cli/` — command-line interface entry point
|
|
@@ -50,7 +52,7 @@ Every application is conceptually divided into three layers:
|
|
|
50
52
|
#### 03-application-layer-rules
|
|
51
53
|
|
|
52
54
|
- Expose functionality as typed library interfaces
|
|
53
|
-
- All inputs
|
|
55
|
+
- All inputs MUST be explicitly passed as typed parameters
|
|
54
56
|
- No global variables, no direct environment variable access in `app/` or `shared/`
|
|
55
57
|
- Business logic with well-defined input/output behavior
|
|
56
58
|
- Group related logic into subfolders (aggregation roots)
|
|
@@ -66,6 +68,8 @@ Kafka message → adapters/kafka/ → app/process-event → adapters/con
|
|
|
66
68
|
|
|
67
69
|
#### 04-mandatory-folder-structure
|
|
68
70
|
|
|
71
|
+
All projects MUST follow this folder structure:
|
|
72
|
+
|
|
69
73
|
```text
|
|
70
74
|
mysystem/
|
|
71
75
|
Makefile # targets to run different inbound interfaces (e.g. run-http, run-cli)
|
|
@@ -97,7 +101,7 @@ mysystem/
|
|
|
97
101
|
|
|
98
102
|
#### 06-bootstrap-and-entry-points
|
|
99
103
|
|
|
100
|
-
- Each inbound adapter folder (`cli/`, `http/`, `grpc/`, etc.)
|
|
104
|
+
- Each inbound adapter folder (`cli/`, `http/`, `grpc/`, etc.) MUST contain the bootstrap and entry point for that interface
|
|
101
105
|
- The project root Makefile must have targets to run the different inbound interfaces following [agentme-edr-008](../devops/008-common-targets.md) extension conventions (e.g. `run-http`, `run-grpc`)
|
|
102
106
|
- Bootstrap code lives in the adapter that receives inbound requests, not in a separate wiring layer
|
|
103
107
|
|
|
@@ -21,7 +21,7 @@ Each test type is named with its group, objective, mocking constraint, applicabi
|
|
|
21
21
|
|
|
22
22
|
#### 01-golden-dataset-concept
|
|
23
23
|
|
|
24
|
-
A **golden dataset** comprises all eval case entries used to test an AI component (LLM, Agent, or Workflow tier); each entry is labeled with the `test_types` (rule `04`) it applies to. It is the dataset consumed by [agentme-edr-028](028-ai-eval-standards.md) evals and stored as one JSON file per entry per [agentme-edr-024](024-ml-dataset-structure.md) rule `04`, at `evals/<component>/eval-<name>/golden_dataset/`.
|
|
24
|
+
Projects MUST use a golden dataset to test AI components. A **golden dataset** comprises all eval case entries used to test an AI component (LLM, Agent, or Workflow tier); each entry is labeled with the `test_types` (rule `04`) it applies to. It is the dataset consumed by [agentme-edr-028](028-ai-eval-standards.md) evals and stored as one JSON file per entry per [agentme-edr-024](024-ml-dataset-structure.md) rule `04`, at `evals/<component>/eval-<name>/golden_dataset/`.
|
|
25
25
|
|
|
26
26
|
#### 02-golden-dataset-entry-envelope
|
|
27
27
|
|
|
@@ -61,6 +61,8 @@ A golden dataset entry's `test_types` array MUST only use these values: `safety`
|
|
|
61
61
|
|
|
62
62
|
#### 05-test-type-taxonomy
|
|
63
63
|
|
|
64
|
+
Test types MUST be selected from this taxonomy. Each test type is named with its group, objective, mocking constraint, applicability, and relevance:
|
|
65
|
+
|
|
64
66
|
| Test Type Name | Group | Test Objective | Mocks Allowed | When to Apply | Relevance – Business | Relevance – Development Team | Priority (1-5) |
|
|
65
67
|
|---|---|---|---|---|---|---|---|
|
|
66
68
|
| Safety/content eval | Safety & adversarial | Detect harmful, biased, or policy-violating output | mocks disallowed for LLM calls | Any user-facing release | Avoids reputational harm; acceptable-use compliance | Automated content gate before merge/release | 5 |
|
|
@@ -79,11 +81,11 @@ A golden dataset entry's `test_types` array MUST only use these values: `safety`
|
|
|
79
81
|
|
|
80
82
|
#### 06-priority-and-relevance-are-descriptive-only
|
|
81
83
|
|
|
82
|
-
Priority, Relevance, and When to Apply in rule `05` are guidance for prioritization conversations — they
|
|
84
|
+
Priority, Relevance, and When to Apply in rule `05` are guidance for prioritization conversations — they MUST NOT be treated as mandating which test types a project must implement, nor their thresholds. [agentme-edr-007](../principles/007-project-quality-standards.md) rule `09` remains the only tier-level testing requirement in force (Workflow unit tests + functional evals). Once a project chooses to implement and threshold a test type, [agentme-edr-028](028-ai-eval-standards.md) rule `02`'s failing-threshold behavior applies uniformly, regardless of this table's priority rating — a project may enforce fairness at 70% and functional at 90%, or skip fairness entirely; that choice is a project/business decision, not one this Policy makes.
|
|
83
85
|
|
|
84
86
|
#### 07-smoke-is-distinct-from-test-smoke
|
|
85
87
|
|
|
86
|
-
The `smoke` test type (surfaced as the `eval-smoke` Makefile target, a fast subset of the golden-dataset functional eval) is a different concept from [agentme-edr-008](../devops/008-common-targets.md)'s existing `test-smoke` target (a fast subset of code-level tests). Both
|
|
88
|
+
The `smoke` test type (surfaced as the `eval-smoke` Makefile target, a fast subset of the golden-dataset functional eval) is a different concept from [agentme-edr-008](../devops/008-common-targets.md)'s existing `test-smoke` target (a fast subset of code-level tests). Both MAY exist in the same project; teams MUST NOT conflate them.
|
|
87
89
|
|
|
88
90
|
## References
|
|
89
91
|
|
|
@@ -114,6 +114,8 @@ All releases **MUST** be tagged using the format `<module-name>/<semver>` (e.g.,
|
|
|
114
114
|
|
|
115
115
|
#### 11-summary-of-requirements
|
|
116
116
|
|
|
117
|
+
All requirements marked 'Yes' MUST be met. The table below summarizes the mandatory requirements:
|
|
118
|
+
|
|
117
119
|
| Requirement | Scope | Mandatory |
|
|
118
120
|
|---|---|---|
|
|
119
121
|
| Lowercase folder/file names | All | Yes |
|
|
@@ -37,7 +37,7 @@ All workflows run on `ubuntu-latest`. Tool versions MUST be managed by Mise via
|
|
|
37
37
|
|
|
38
38
|
File: `.github/workflows/ci.yml`
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
Projects MUST configure this workflow, triggered on every PR targeting `main` and every push to `main`. It runs the standard `build`, `lint`, and `test` targets from the root Makefile and fails the workflow if any step exits non-zero.
|
|
41
41
|
|
|
42
42
|
```yaml
|
|
43
43
|
name: ci
|
|
@@ -67,7 +67,7 @@ jobs:
|
|
|
67
67
|
|
|
68
68
|
File: `.github/workflows/release.yml`
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
Projects MUST use this manually dispatched (`workflow_dispatch`) workflow. It calculates the next semantic version tag using **monotag** and pushes that tag to the repository. Pushing the tag then automatically triggers the publish workflow.
|
|
71
71
|
|
|
72
72
|
The checkout step **must** use `fetch-depth: 0` so monotag can traverse the full commit history to determine the correct next version.
|
|
73
73
|
|
|
@@ -112,7 +112,7 @@ jobs:
|
|
|
112
112
|
|
|
113
113
|
File: `.github/workflows/publish.yml`
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
Projects MUST configure this workflow, triggered exclusively when a tag matching `v*.*.*` is pushed to the repository. This ensures only explicitly tagged commits produce published artifacts. Runs `make publish` against the tagged commit.
|
|
116
116
|
|
|
117
117
|
```yaml
|
|
118
118
|
name: publish
|
|
@@ -195,7 +195,7 @@ A developer can run `make test` at the repo root to test everything, or `cd modu
|
|
|
195
195
|
|
|
196
196
|
#### 07-quick-reference
|
|
197
197
|
|
|
198
|
-
Any project following this EDR
|
|
198
|
+
Any project following this EDR MUST support the following actions through the root `Makefile`.
|
|
199
199
|
|
|
200
200
|
```sh
|
|
201
201
|
# install the pinned toolchain and project bootstrap
|
|
@@ -25,7 +25,7 @@ Secrets (API keys, passwords, tokens) must never be placed in `.env` files. Thos
|
|
|
25
25
|
|
|
26
26
|
#### 01-when-to-use-dotenv
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
A `.env` file MUST be used when either of the following is true:
|
|
29
29
|
|
|
30
30
|
1. **Spawned process needs env vars** — the project launches a process (a deployable service, background worker, or shell script) that reads configuration from OS environment variables such as port numbers or API endpoint URLs.
|
|
31
31
|
2. **Value must not be committed** — a configuration value used in a YAML config file (see rule 07) is environment-specific or sensitive enough to exclude from version control. In that case, store the value in `.env` and reference it from the YAML file using env var substitution (see rule 08).
|
|
@@ -43,13 +43,13 @@ FEATURE_FLAG_NEW_UI=false
|
|
|
43
43
|
|
|
44
44
|
#### 02-dotenv-not-committed
|
|
45
45
|
|
|
46
|
-
`.env`
|
|
46
|
+
`.env` MUST be listed in `.gitignore` and must never be committed to the repository. It is intended for local use in standalone projects and libraries that do not have a formal deployment pipeline.
|
|
47
47
|
|
|
48
48
|
---
|
|
49
49
|
|
|
50
50
|
#### 03-dotenv-example-committed
|
|
51
51
|
|
|
52
|
-
A `.env.example` file
|
|
52
|
+
A `.env.example` file MUST be committed alongside `.env`. It contains all the same variable names with placeholder or illustrative values — no real URLs, credentials, or server names. This file documents what configuration is expected without exposing real values.
|
|
53
53
|
|
|
54
54
|
Example `.env.example`:
|
|
55
55
|
```
|
|
@@ -62,7 +62,7 @@ FEATURE_FLAG_NEW_UI=false
|
|
|
62
62
|
|
|
63
63
|
#### 04-stage-specific-dotenv-committed
|
|
64
64
|
|
|
65
|
-
Stage-specific overrides
|
|
65
|
+
Stage-specific overrides MUST use the naming convention `.env.[stage]` (e.g., `.env.production`, `.env.staging`, `.env.test`). These files may be committed to the repository because they carry deployment-stage configuration rather than local developer configuration. They are used during deployment pipelines where the stage is known and explicit.
|
|
66
66
|
|
|
67
67
|
The generic `.env` must still not be committed. The distinction is: `.env` is for local, ad-hoc, standalone use; `.env.[stage]` is for deployment pipelines with a defined environment identity.
|
|
68
68
|
|
|
@@ -70,7 +70,7 @@ The generic `.env` must still not be committed. The distinction is: `.env` is fo
|
|
|
70
70
|
|
|
71
71
|
#### 05-load-in-makefile-before-processes
|
|
72
72
|
|
|
73
|
-
When `.env` defines variables consumed by shell scripts or spawned processes, the Makefile
|
|
73
|
+
When `.env` defines variables consumed by shell scripts or spawned processes, the Makefile MUST load and export them before invoking those processes. Use the following pattern at the top of the relevant Makefile or in a shared include:
|
|
74
74
|
|
|
75
75
|
```makefile
|
|
76
76
|
ifneq (,$(wildcard .env))
|
|
@@ -85,7 +85,7 @@ This ensures all variables in `.env` are available as environment variables to e
|
|
|
85
85
|
|
|
86
86
|
#### 06-no-application-level-dotenv-loading
|
|
87
87
|
|
|
88
|
-
Applications
|
|
88
|
+
Applications MUST NOT load `.env` files directly inside their own code using dotenv libraries or equivalent mechanisms. Configuration must enter the process exclusively as OS-level environment variables, set before the process is launched (by the Makefile, a shell script, CI, or a container runtime).
|
|
89
89
|
|
|
90
90
|
Prohibited patterns:
|
|
91
91
|
|
|
@@ -114,7 +114,7 @@ This rule prevents two parallel loading paths — OS env and file-based env —
|
|
|
114
114
|
|
|
115
115
|
#### 07-cli-adapters-use-yaml-config
|
|
116
116
|
|
|
117
|
-
CLI adapters with multiple configuration attributes
|
|
117
|
+
CLI adapters with multiple configuration attributes MUST use a YAML config file rather than env vars or flags for those attributes. This applies whenever configuration is nested, repetitive, or too verbose for flags alone.
|
|
118
118
|
|
|
119
119
|
The CLI layer is responsible for loading and parsing the YAML file and passing the resolved values to the application layer. The application layer must not read the config file directly.
|
|
120
120
|
|
|
@@ -131,7 +131,7 @@ max_retries: 3
|
|
|
131
131
|
|
|
132
132
|
#### 08-env-var-substitution-in-config-files
|
|
133
133
|
|
|
134
|
-
When a YAML config file contains a value that
|
|
134
|
+
When a YAML config file contains a value that MUST NOT be committed (such as a real endpoint URL, a username, or any other environment-specific value), that value must be expressed as an environment variable reference using `${VAR_NAME}` syntax, and the actual value must be defined in `.env`.
|
|
135
135
|
|
|
136
136
|
This keeps the YAML file committable while keeping the environment-specific value out of the repository.
|
|
137
137
|
|
|
@@ -46,7 +46,7 @@ src/
|
|
|
46
46
|
|
|
47
47
|
#### 02-apply-template-method-pattern
|
|
48
48
|
|
|
49
|
-
When a function's main logic contains well-defined sections and **any individual section exceeds ~20 lines**,
|
|
49
|
+
When a function's main logic contains well-defined sections and **any individual section exceeds ~20 lines**, each section MUST be extracted into its own named function. The outer function becomes an orchestrator that calls the extracted helpers in sequence.
|
|
50
50
|
|
|
51
51
|
**Example (Python):**
|
|
52
52
|
|
|
@@ -110,13 +110,13 @@ Every change to a public interface, behavior, or configuration option MUST be re
|
|
|
110
110
|
|
|
111
111
|
#### 05-declare-types-in-file-where-used
|
|
112
112
|
|
|
113
|
-
|
|
113
|
+
Types used in only **one** file MUST be declared in that same file. Move a type to a shared module only when it is referenced in two or more files.
|
|
114
114
|
|
|
115
115
|
---
|
|
116
116
|
|
|
117
117
|
#### 06-keep-test-files-next-to-source
|
|
118
118
|
|
|
119
|
-
Where the language ecosystem supports it (e.g. JavaScript/TypeScript, Go, Rust),
|
|
119
|
+
Where the language ecosystem supports it (e.g. JavaScript/TypeScript, Go, Rust), test files MUST be placed **beside** the source file they cover and use a consistent naming convention rather than mirroring the source tree in a separate `tests/` folder.
|
|
120
120
|
|
|
121
121
|
**Recommended naming conventions:**
|
|
122
122
|
|
|
@@ -21,7 +21,7 @@ What unit testing practices should be followed to ensure tests are meaningful, r
|
|
|
21
21
|
|
|
22
22
|
#### 01-must-have-at-least-one-assertion-per-test
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Every test MUST have at least one assertion that validates the expected behavior.
|
|
25
25
|
// bad — no assertion; passes even when code is broken
|
|
26
26
|
it("processes the order", () => { processOrder(mockOrder); });
|
|
27
27
|
|
|
@@ -36,7 +36,7 @@ it("processes the order and returns a confirmation id", () => {
|
|
|
36
36
|
|
|
37
37
|
#### 02-must-run-offline
|
|
38
38
|
|
|
39
|
-
Unit tests
|
|
39
|
+
Unit tests MUST NOT depend on any external resources: no network calls, no running databases, no external APIs, no file system paths outside the repo. Tests must pass with only static code available.
|
|
40
40
|
|
|
41
41
|
```typescript
|
|
42
42
|
// bad — hits a real HTTP endpoint
|
|
@@ -64,13 +64,13 @@ export default defineConfig({
|
|
|
64
64
|
});
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
-
Builds that miss the threshold
|
|
67
|
+
Builds that miss the threshold MUST NOT be merged.
|
|
68
68
|
|
|
69
69
|
---
|
|
70
70
|
|
|
71
71
|
#### 04-must-place-test-files-alongside-source
|
|
72
72
|
|
|
73
|
-
Test files
|
|
73
|
+
Test files MUST live next to the source file they test, in the same directory, following the convention of the language/framework:
|
|
74
74
|
|
|
75
75
|
| Language | Pattern | Example |
|
|
76
76
|
|----------|---------|-------|
|
|
@@ -96,7 +96,7 @@ Do not flatten or reorganize paths when using a separate test folder.
|
|
|
96
96
|
|
|
97
97
|
#### 05-should-extract-shared-setup
|
|
98
98
|
|
|
99
|
-
When setup logic is repeated across two or more test files,
|
|
99
|
+
When setup logic is repeated across two or more test files, it SHOULD be centralized (`src/test-utils/`, `internal/testutil/`, `tests/conftest.py`).
|
|
100
100
|
|
|
101
101
|
```typescript
|
|
102
102
|
// src/test-utils/order-factory.ts
|
|
@@ -109,7 +109,7 @@ export function makeOrder(overrides: Partial<Order> = {}): Order {
|
|
|
109
109
|
|
|
110
110
|
#### 06-should-avoid-mocks
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
Tests SHOULD use the lowest-cost alternative that exercises real behavior:
|
|
113
113
|
|
|
114
114
|
1. **Real implementation** — always prefer this
|
|
115
115
|
2. **In-memory / lightweight fake** — e.g. in-memory DB, stub HTTP server
|
|
@@ -23,7 +23,7 @@ These standards form a non-negotiable baseline. Individual projects may raise th
|
|
|
23
23
|
|
|
24
24
|
#### 01-readme-must-have-getting-started
|
|
25
25
|
|
|
26
|
-
`README.md`
|
|
26
|
+
`README.md` MUST include a **Getting Started** section in the first 20 lines with the minimal steps to install and use the project.
|
|
27
27
|
|
|
28
28
|
**Required content:**
|
|
29
29
|
- Installation or setup command(s)
|
|
@@ -52,7 +52,7 @@ myFunction({ input: "value" });
|
|
|
52
52
|
|
|
53
53
|
#### 02-unit-tests-must-run-on-every-release
|
|
54
54
|
|
|
55
|
-
A unit test suite
|
|
55
|
+
A unit test suite MUST run automatically before every release. Failing tests must block the release — no silent skips or overrides.
|
|
56
56
|
|
|
57
57
|
**Requirements:**
|
|
58
58
|
- A `make test` target must exist and run the full suite
|
|
@@ -67,7 +67,7 @@ A unit test suite must run automatically before every release. Failing tests mus
|
|
|
67
67
|
|
|
68
68
|
#### 03-project-must-comply-with-xdrs
|
|
69
69
|
|
|
70
|
-
All XDRs that apply to the project's scope (as listed in [.xdrs/index.md](../../../index.md))
|
|
70
|
+
All XDRs that apply to the project's scope (as listed in [.xdrs/index.md](../../../index.md)) MUST be followed. A deviation requires a project-local XDR documenting the override.
|
|
71
71
|
|
|
72
72
|
**Requirements:**
|
|
73
73
|
- Review applicable XDRs before any significant implementation
|
|
@@ -77,7 +77,7 @@ All XDRs that apply to the project's scope (as listed in [.xdrs/index.md](../../
|
|
|
77
77
|
|
|
78
78
|
#### 04-project-must-have-linting
|
|
79
79
|
|
|
80
|
-
Projects larger than 10 files or 200 lines of code
|
|
80
|
+
Projects larger than 10 files or 200 lines of code MUST have a linter configured and actively enforced. Lint failures block CI builds.
|
|
81
81
|
|
|
82
82
|
**Requirements:**
|
|
83
83
|
- `make lint` runs the linter with zero-warning tolerance
|
|
@@ -93,7 +93,7 @@ Projects larger than 10 files or 200 lines of code must have a linter configured
|
|
|
93
93
|
|
|
94
94
|
#### 05-project-structure-must-be-clear
|
|
95
95
|
|
|
96
|
-
Directory and file layout
|
|
96
|
+
Directory and file layout MUST be self-explanatory: source code, tests, configuration, and examples must be clearly separated and named.
|
|
97
97
|
|
|
98
98
|
**Requirements:**
|
|
99
99
|
- Directory names must reflect their purpose (`src/`, `lib/`, `tests/`, `examples/`, `docs/`)
|
|
@@ -118,7 +118,7 @@ Directory and file layout must be self-explanatory: source code, tests, configur
|
|
|
118
118
|
|
|
119
119
|
#### 06-libraries-must-have-runnable-examples
|
|
120
120
|
|
|
121
|
-
Projects that are libraries or shared utilities
|
|
121
|
+
Projects that are libraries or shared utilities MUST include an `examples/` directory. Each subdirectory represents a usage scenario and must be independently runnable. Examples that are "offline" (require no external credentials, no running servers, no paid APIs, and no environment-specific configuration outside the repository) must be executed as part of `make test`. Examples that depend on external entities may be left out of `make test`.
|
|
122
122
|
|
|
123
123
|
**Requirements:**
|
|
124
124
|
- `examples/` must contain at least one subdirectory per major usage scenario
|
|
@@ -170,7 +170,7 @@ all:
|
|
|
170
170
|
|
|
171
171
|
#### 07-statistical-models-must-have-eval-targets
|
|
172
172
|
|
|
173
|
-
Projects that contain statistical models (e.g., ML models, LLM-based evaluators, classifiers, ranking systems, or any component whose output quality is measured probabilistically)
|
|
173
|
+
Projects that contain statistical models (e.g., ML models, LLM-based evaluators, classifiers, ranking systems, or any component whose output quality is measured probabilistically) MUST define measurable performance thresholds and verify them automatically.
|
|
174
174
|
|
|
175
175
|
**Requirements:**
|
|
176
176
|
- A `make eval` target must exist and execute all performance evaluations
|
|
@@ -29,7 +29,7 @@ All implementation practices derive from three guiding principles:
|
|
|
29
29
|
|
|
30
30
|
#### 01-no-secrets-on-disk
|
|
31
31
|
|
|
32
|
-
Secrets
|
|
32
|
+
Secrets MUST NEVER be stored on the disk of a developer machine or server. This includes `.env` files (even when gitignored), plaintext config files, embedded in source code, or any other file-based storage.
|
|
33
33
|
|
|
34
34
|
The only acceptable local persistence is through the operating system's native secret manager (e.g., macOS Keychain, Windows Credential Manager, Linux Secret Service).
|
|
35
35
|
|
|
@@ -37,7 +37,7 @@ The only acceptable local persistence is through the operating system's native s
|
|
|
37
37
|
|
|
38
38
|
#### 02-local-dev-uses-native-keychain
|
|
39
39
|
|
|
40
|
-
During local development, secrets
|
|
40
|
+
During local development, secrets MUST be stored and retrieved using the native OS secret manager. Use cross-platform libraries to keep the code OS-agnostic:
|
|
41
41
|
|
|
42
42
|
| Language | Library |
|
|
43
43
|
|----------|---------|
|
|
@@ -51,7 +51,7 @@ The "group" (service name) defaults to the module name. The secret identifier sh
|
|
|
51
51
|
|
|
52
52
|
#### 03-fallback-lookup-order
|
|
53
53
|
|
|
54
|
-
Secret fetching
|
|
54
|
+
Secret fetching MUST implement a fallback chain in the following order:
|
|
55
55
|
|
|
56
56
|
1. **Native OS keychain** — attempt to retrieve the secret using the local keychain library (used during local development).
|
|
57
57
|
2. **Cloud secret manager** — if not found locally, fetch from the configured cloud secret manager (AWS Secrets Manager, Azure Key Vault, etc.) (used in cloud environments).
|
|
@@ -66,13 +66,13 @@ Secret 'db-password' could not be found in keychain under group 'mymodule' or in
|
|
|
66
66
|
|
|
67
67
|
#### 04-secret-fetching-in-connector
|
|
68
68
|
|
|
69
|
-
The secret fetching logic (including the fallback chain from rule 03)
|
|
69
|
+
The secret fetching logic (including the fallback chain from rule 03) MUST live in a dedicated "connector" module or function. This isolates secret-access concerns from business logic and provides a single point to configure secret sources, caching policy, and error handling.
|
|
70
70
|
|
|
71
71
|
---
|
|
72
72
|
|
|
73
73
|
#### 05-setup-secrets-makefile-target
|
|
74
74
|
|
|
75
|
-
Every module that requires secrets
|
|
75
|
+
Every module that requires secrets MUST expose a `setup-secrets` Makefile target. This target:
|
|
76
76
|
|
|
77
77
|
- Prompts the user for each required secret value interactively.
|
|
78
78
|
- If the user provides an empty value, the existing secret is not updated.
|
|
@@ -120,13 +120,13 @@ In library code (Python, JS/TS, Go), continue using the cross-platform libraries
|
|
|
120
120
|
|
|
121
121
|
#### 06-never-log-or-leak-secrets
|
|
122
122
|
|
|
123
|
-
Secrets
|
|
123
|
+
Secrets MUST NEVER be logged under any circumstance or sent to any service that is not clearly the intended consumer of that secret (authentication, encryption, etc.). This applies to all log levels including debug and trace. Error messages must reference the secret name or identifier, never its value.
|
|
124
124
|
|
|
125
125
|
---
|
|
126
126
|
|
|
127
127
|
#### 07-prefer-dynamic-fetching
|
|
128
128
|
|
|
129
|
-
Wherever possible,
|
|
129
|
+
Wherever possible, secrets SHOULD be fetched dynamically from the secret manager at the time of use. Avoid storing secrets in global variables or caching them indefinitely. Dynamic fetching through a specialized service enables:
|
|
130
130
|
|
|
131
131
|
- Automatic password rotation without redeployment.
|
|
132
132
|
- Immediate propagation of rotated secrets.
|
|
@@ -138,7 +138,7 @@ Short-lived caching (e.g., a few minutes) is acceptable when performance require
|
|
|
138
138
|
|
|
139
139
|
#### 08-prefer-fetching-at-point-of-use
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
Developers SHOULD prefer fetching the secret inside the function that directly needs it rather than passing it through multiple layers as a function argument. This minimizes the exposure surface by reducing the number of code paths that handle the raw secret value.
|
|
142
142
|
|
|
143
143
|
Passing secrets via function arguments is acceptable when the consuming function cannot access the connector directly, but the default design should fetch at the point of use.
|
|
144
144
|
|
|
@@ -27,7 +27,7 @@ Prefer functional programming: pure functions with clear input → processing
|
|
|
27
27
|
|
|
28
28
|
#### 02-prefer-explicit-calls-over-indirections
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
Developers SHOULD prefer a sequence of direct calls to libraries and resources to keep logic straightforward. Avoid:
|
|
31
31
|
|
|
32
32
|
- Aspect-oriented programming (AOP)
|
|
33
33
|
- Implicit context injection / dependency injection containers
|
|
@@ -103,7 +103,7 @@ function createServerConfig(opts: Partial<ServerOpts>): ServerConfig {
|
|
|
103
103
|
|
|
104
104
|
#### 05-abstractions-for-business-logic-are-encouraged
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
Developers SHOULD extract domain logic into a named function when it:
|
|
107
107
|
|
|
108
108
|
- Encapsulates a business rule so the reader does not need to parse low-level conditions to understand domain intent.
|
|
109
109
|
- Communicates intent at a glance, making compound conditions or multi-step checks self-describing.
|
|
@@ -122,6 +122,6 @@ if (event.status === 'active' && event.role !== 'guest' && event.quota > 0) { ..
|
|
|
122
122
|
|
|
123
123
|
#### 06-idiomatic-framework-patterns-are-exempt
|
|
124
124
|
|
|
125
|
-
React hooks, higher-order components, middleware chains, and similar patterns established by the framework in use
|
|
125
|
+
React hooks, higher-order components, middleware chains, and similar patterns established by the framework in use MUST NOT be treated as unnecessary abstraction. The reader already expects them, and fighting the framework's idioms creates more confusion than it removes.
|
|
126
126
|
|
|
127
127
|
This exemption does not override other rules — a trivial wrapper inside a hook is still prohibited.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentme",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"filedist": "^0.39.0"
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"url": "https://github.com/flaviostutz/agentme.git"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"xdrs-core": "^0.
|
|
21
|
+
"xdrs-core": "^0.38.0"
|
|
22
22
|
}
|
|
23
23
|
}
|