@chrisdudek/yg 1.1.0 → 1.3.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/dist/bin.js +147 -53
- package/dist/bin.js.map +1 -1
- package/dist/templates/default-config.ts +4 -21
- package/dist/templates/rules.ts +69 -26
- package/package.json +1 -1
|
@@ -10,6 +10,7 @@ node_types:
|
|
|
10
10
|
- name: module
|
|
11
11
|
- name: service
|
|
12
12
|
- name: library
|
|
13
|
+
- name: infrastructure
|
|
13
14
|
|
|
14
15
|
artifacts:
|
|
15
16
|
responsibility.md:
|
|
@@ -19,29 +20,11 @@ artifacts:
|
|
|
19
20
|
interface.md:
|
|
20
21
|
required:
|
|
21
22
|
when: has_incoming_relations
|
|
22
|
-
description: "Public API — methods, parameters, return types, contracts"
|
|
23
|
+
description: "Public API — methods, parameters, return types, contracts, failure modes, exposed data structures"
|
|
23
24
|
structural_context: true
|
|
24
|
-
|
|
25
|
+
internals.md:
|
|
25
26
|
required: never
|
|
26
|
-
description: "
|
|
27
|
-
constraints.md:
|
|
28
|
-
required: never
|
|
29
|
-
description: "Validation rules, business rules, invariants"
|
|
30
|
-
structural_context: true
|
|
31
|
-
errors.md:
|
|
32
|
-
required:
|
|
33
|
-
when: has_incoming_relations
|
|
34
|
-
description: "Failure modes, edge cases, error conditions, recovery behavior"
|
|
35
|
-
structural_context: true
|
|
36
|
-
model.md:
|
|
37
|
-
required: never
|
|
38
|
-
description: "Data structures, schemas, entities, type definitions — the shape of data this node owns or manages"
|
|
39
|
-
state.md:
|
|
40
|
-
required: never
|
|
41
|
-
description: "State machines, lifecycle, transitions"
|
|
42
|
-
decisions.md:
|
|
43
|
-
required: never
|
|
44
|
-
description: "Local design decisions and rationale — choices specific to this node, not system-wide"
|
|
27
|
+
description: "How the node works and why — algorithms, business rules, state machines, design decisions with rejected alternatives"
|
|
45
28
|
|
|
46
29
|
quality:
|
|
47
30
|
min_artifact_length: 50
|
package/dist/templates/rules.ts
CHANGED
|
@@ -19,11 +19,12 @@ Yggdrasil is persistent semantic memory stored in \`.yggdrasil/\`. It maps the r
|
|
|
19
19
|
BEFORE reading, researching, planning, OR modifying ANY mapped file:
|
|
20
20
|
1. yg owner --file <path>
|
|
21
21
|
2. yg build-context --node <owner>
|
|
22
|
-
The context package is your primary source of understanding
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
The context package is your primary source of ARCHITECTURAL understanding:
|
|
23
|
+
intent, constraints, relations, rationale. For IMPLEMENTATION precision
|
|
24
|
+
(exact behavior, error handling, await patterns, edge cases) — verify
|
|
25
|
+
against source code. Aspects describe intended patterns; individual
|
|
26
|
+
implementations may deviate.
|
|
25
27
|
If the context package seems insufficient — enrich the graph.
|
|
26
|
-
Do not bypass it.
|
|
27
28
|
|
|
28
29
|
AFTER modifying:
|
|
29
30
|
3. Update graph artifacts to reflect changes
|
|
@@ -44,7 +45,7 @@ WHEN UNSURE: ask the user. Never guess. Never assume.
|
|
|
44
45
|
|
|
45
46
|
### Five Core Rules
|
|
46
47
|
|
|
47
|
-
1. **Graph first.** Before reading, researching, planning, or modifying mapped files, run \`yg owner\` and \`yg build-context\`. Always. The context package
|
|
48
|
+
1. **Graph first.** Before reading, researching, planning, or modifying mapped files, run \`yg owner\` and \`yg build-context\`. Always. The context package is your primary source of architectural understanding. For implementation-level precision (exact behavior, error paths, edge cases) — verify against source code after loading the context package.
|
|
48
49
|
2. **Code and graph are one.** Code changed → graph updated in the same response. Graph changed → source verified in the same response. No exceptions.
|
|
49
50
|
3. **Never invent why.** The graph captures human intent. If you don't know why something was decided, ask. Never hallucinate rationale.
|
|
50
51
|
4. **Always capture why — especially why NOT.** When the user explains a reason, record it in the graph immediately. When a design choice is made, also record rejected alternatives: "Chose X over Y because Z." Rejected alternatives are the highest-value information — invisible in code and irrecoverable once forgotten. Conversation evaporates; graph persists.
|
|
@@ -54,21 +55,14 @@ WHEN UNSURE: ask the user. Never guess. Never assume.
|
|
|
54
55
|
|
|
55
56
|
You have broken Yggdrasil if you do any of the following:
|
|
56
57
|
|
|
57
|
-
- ❌
|
|
58
|
-
- ❌ Modified source code without updating graph artifacts in the same response.
|
|
59
|
-
- ❌
|
|
60
|
-
- ❌ Resolved a code-graph inconsistency without asking the user first.
|
|
58
|
+
- ❌ Worked on a mapped file without running \`yg owner\` + \`yg build-context\` first — whether reading to understand, planning, or modifying.
|
|
59
|
+
- ❌ Modified source code without updating graph artifacts in the same response, or vice versa.
|
|
60
|
+
- ❌ Resolved a code-graph inconsistency or ambiguity without asking the user first.
|
|
61
61
|
- ❌ Created or edited a graph element without reading its schema in \`schemas/\` first.
|
|
62
|
-
- ❌ Ran \`yg drift-sync\` before
|
|
63
|
-
- ❌
|
|
64
|
-
- ❌
|
|
65
|
-
- ❌ Placed a cross-cutting requirement in a local node artifact instead of an aspect.
|
|
66
|
-
- ❌ Invented a rationale, business rule, or architectural decision.
|
|
62
|
+
- ❌ Ran \`yg drift-sync\` before both graph artifacts and source code are current.
|
|
63
|
+
- ❌ Placed a cross-cutting requirement in a local artifact instead of an aspect, or used an aspect id with no \`aspects/\` directory.
|
|
64
|
+
- ❌ Invented a rationale, business rule, or decision — or recorded a decision without documenting rejected alternatives and rationale (use "rationale: unknown" if unknown).
|
|
67
65
|
- ❌ Used blackbox coverage for greenfield (new) code.
|
|
68
|
-
- ❌ Answered a question about a mapped file without running \`yg build-context\` first.
|
|
69
|
-
- ❌ Read mapped source files to plan or research changes without running \`yg build-context\` first.
|
|
70
|
-
- ❌ Deferred \`yg drift-sync\` to the end of a multi-step task instead of running it incrementally after each logical group of changes.
|
|
71
|
-
- ❌ Recorded a design decision without documenting which alternatives were rejected and why.
|
|
72
66
|
|
|
73
67
|
### Escape Hatch
|
|
74
68
|
|
|
@@ -110,6 +104,10 @@ WRAP-UP (user signals "done", "wrap up", "that's enough"):
|
|
|
110
104
|
- [ ] 2. yg drift --drifted-only → resolve
|
|
111
105
|
- [ ] 3. yg validate → fix errors
|
|
112
106
|
- [ ] 4. Report: which nodes and files were changed
|
|
107
|
+
|
|
108
|
+
BEFORE ENDING ANY RESPONSE (self-audit):
|
|
109
|
+
- [ ] Did I modify source code? If yes → did I update graph artifacts in this same response?
|
|
110
|
+
- [ ] If you changed code and did not sync the graph, you have broken the protocol. Do not finish until both are done.
|
|
113
111
|
\`\`\`
|
|
114
112
|
|
|
115
113
|
### Modify Source Code
|
|
@@ -141,7 +139,7 @@ You are not allowed to edit or create source code without establishing graph cov
|
|
|
141
139
|
|
|
142
140
|
1. Create aspects first (cross-cutting requirements the new code must satisfy)
|
|
143
141
|
2. Create flows if the code participates in a business process
|
|
144
|
-
3. Create nodes with full artifacts — responsibility,
|
|
142
|
+
3. Create nodes with full artifacts — responsibility, interface, internals
|
|
145
143
|
4. Review the context package (\`yg build-context\`) — it is now the behavioral specification
|
|
146
144
|
5. Implement code that satisfies the specification
|
|
147
145
|
6. The graph specifies WHAT and WHY; the code implements HOW (framework APIs, library choices)
|
|
@@ -178,7 +176,8 @@ Per area checklist:
|
|
|
178
176
|
- Business process unclear: "This code appears to be part of a larger process. Can you describe what it means from a business perspective?"
|
|
179
177
|
- Constraint without rationale: "I see [constraint X]. Do you know why this exists? I want to record the reason, not just the rule."
|
|
180
178
|
- Unexplained architectural choice: "I see [approach X]. What was the reason for this choice?"
|
|
181
|
-
- Decision without alternatives: "You chose [X]. What alternatives did you consider, and why did you reject them?" Record the answer in \`
|
|
179
|
+
- Decision without alternatives: "You chose [X]. What alternatives did you consider, and why did you reject them?" Record the answer in the Decisions section of \`internals.md\`.
|
|
180
|
+
- Decision without known rationale: Record the decision in \`internals.md\` with "rationale: unknown — inferred from code, not confirmed by developer." A recorded decision with unknown rationale is infinitely more valuable than no record at all, and safer than an invented rationale.
|
|
182
181
|
|
|
183
182
|
### Bootstrap Mode
|
|
184
183
|
|
|
@@ -206,6 +205,27 @@ Always ask the user before resolving drift. Never auto-resolve.
|
|
|
206
205
|
|
|
207
206
|
Threshold: >10 drifted nodes → ask user which area to prioritize. Do not resolve all at once.
|
|
208
207
|
|
|
208
|
+
**Drift triage:** Prioritize aspects and \`internals.md\` (highest decay rate), then \`responsibility.md\` and \`interface.md\` (most stable).
|
|
209
|
+
|
|
210
|
+
### Graph Audit
|
|
211
|
+
|
|
212
|
+
When reviewing graph quality (triggered by user or quality improvement):
|
|
213
|
+
|
|
214
|
+
**Step 1 — Consistency** (catches WRONG information):
|
|
215
|
+
|
|
216
|
+
- [ ] 1. \`yg build-context --node <path>\`
|
|
217
|
+
- [ ] 2. Read mapped source files
|
|
218
|
+
- [ ] 3. For each claim in graph: verify against source code
|
|
219
|
+
- [ ] 4. For each aspect: verify the pattern holds in THIS node. If it deviates, add \`aspect_exceptions\` in \`node.yaml\`
|
|
220
|
+
- [ ] 5. Report inconsistencies
|
|
221
|
+
|
|
222
|
+
**Step 2 — Completeness** (catches MISSING information):
|
|
223
|
+
|
|
224
|
+
- [ ] 1. For each public method: is it in \`interface.md\`?
|
|
225
|
+
- [ ] 2. For each error path: is it in \`interface.md\` (Failure Modes section)?
|
|
226
|
+
- [ ] 3. For each behavioral invariant: is it in the graph?
|
|
227
|
+
- [ ] 4. Report omissions separately from inconsistencies
|
|
228
|
+
|
|
209
229
|
### Error Recovery
|
|
210
230
|
|
|
211
231
|
- **\`yg\` not found** → inform user: "yg CLI is not installed or not in PATH." Stop.
|
|
@@ -236,9 +256,24 @@ Key facts:
|
|
|
236
256
|
- **Aspect id = directory path** under \`aspects/\`. Each aspect has \`aspect.yaml\` + content \`.md\` files. No automatic parent-child — use \`implies\` explicitly.
|
|
237
257
|
- **Flows = business processes.** A flow describes what happens in the world, not code sequences. Flow aspects propagate to all participants.
|
|
238
258
|
|
|
259
|
+
**Node type guidance:**
|
|
260
|
+
|
|
261
|
+
- \`module\` — business logic unit with clear domain responsibility
|
|
262
|
+
- \`service\` — component providing functionality to other nodes
|
|
263
|
+
- \`library\` — shared utility code with no domain knowledge
|
|
264
|
+
- \`infrastructure\` — guards, resolvers, middleware, interceptors, validators that intercept or modify request flow. These affect blast radius of changes but are invisible in call graphs. Map them to make blast radius analysis accurate. Key signal: code that runs WITHOUT being explicitly called by business logic (e.g., NestJS guards, Express middleware, GraphQL resolvers).
|
|
265
|
+
|
|
266
|
+
### Artifact Structure
|
|
267
|
+
|
|
268
|
+
Three artifacts capture node knowledge at three levels:
|
|
269
|
+
|
|
270
|
+
- **responsibility.md** (always required) — WHAT: identity, boundaries, what the node is NOT responsible for.
|
|
271
|
+
- **interface.md** (required when node has consumers) — HOW TO USE: public methods, parameters, return types, contracts, failure modes, exposed data structures. Everything another node needs to interact with this one.
|
|
272
|
+
- **internals.md** (optional, highest value for cross-module nodes) — HOW IT WORKS + WHY: algorithms, control flow, business rules, invariants, state machines, lifecycle, and design decisions with rejected alternatives. Use sections within the file: ## Logic, ## Constraints, ## State, ## Decisions (with "Chose X over Y because Z" format).
|
|
273
|
+
|
|
239
274
|
### Context Assembly
|
|
240
275
|
|
|
241
|
-
Run \`yg build-context --node <path>\` to get the deterministic context package for a node.
|
|
276
|
+
Run \`yg build-context --node <path>\` to get the deterministic context package for a node. The package assembles global config, hierarchy, own artifacts, aspects, and relational context. It is your architectural map. For implementation-level claims (exact call patterns, error handling, await vs fire-and-forget) — verify against source code. If the package is insufficient, enrich the graph.
|
|
242
277
|
|
|
243
278
|
### Information Routing
|
|
244
279
|
|
|
@@ -249,7 +284,7 @@ When you encounter information, route it to the correct location:
|
|
|
249
284
|
- **Business process** → flow (\`flows/<name>/\` with \`flow.yaml\` + \`description.md\`). Ask user if process unclear.
|
|
250
285
|
- **Shared across a domain** → parent node artifact. Children receive it through hierarchy.
|
|
251
286
|
- **Technology stack or standard** → \`config.yaml\` under \`stack\` or \`standards\` (+ \`rationale\` field)
|
|
252
|
-
- **Decision (why + why NOT):** one node → \`
|
|
287
|
+
- **Decision (why + why NOT):** one node → Decisions section of \`internals.md\` with format "Chose X over Y because Z"; category of nodes → aspect content files; tech choice → \`config.yaml\` rationale field. Always include rejected alternatives — they are the highest-value graph content. If the rationale is unknown: record the decision with "rationale: unknown" and note what CAN be observed from the code. Never invent a plausible-sounding rationale.
|
|
253
288
|
|
|
254
289
|
### Creating Aspects
|
|
255
290
|
|
|
@@ -267,6 +302,10 @@ Test: "Does this requirement apply to more than one node?" Yes → aspect. No
|
|
|
267
302
|
- **Architectural:** Structural patterns with rationale (e.g., dual-rollback on provider failure, idempotency via key generation, fire-and-forget dispatch)
|
|
268
303
|
- **Concurrency:** Shared concurrency strategies (e.g., pessimistic locking, retry-on-deadlock, optimistic versioning)
|
|
269
304
|
|
|
305
|
+
When a node follows an aspect's pattern with exceptions, record exceptions in \`node.yaml\` under \`aspect_exceptions\`. Example: aspect says "fire-and-forget" but this node awaits the publish call. The exception appears in the context package next to the aspect content, preventing abstractions from masking implementation details.
|
|
306
|
+
|
|
307
|
+
**Aspect lifecycle warning.** Aspects decay CATASTROPHICALLY — a pattern either exists or it doesn't. When a pattern changes, ALL aspect claims become wrong at once. This differs from other artifacts: \`interface.md\` and \`responsibility.md\` are most stable (~9-year half-life); \`internals.md\` has moderate stability (~2.5-year half-life); aspects are least stable (~2.4-year half-life, binary decay). After any significant feature addition, review ALL aspects touching the affected area. Don't wait for drift — aspects can be 100% wrong without any mapped file changing.
|
|
308
|
+
|
|
270
309
|
### Creating Flows
|
|
271
310
|
|
|
272
311
|
- [ ] 1. Read \`schemas/flow.yaml\`
|
|
@@ -277,13 +316,18 @@ Test: "Does this requirement apply to more than one node?" Yes → aspect. No
|
|
|
277
316
|
|
|
278
317
|
Test: "Does this describe what happens in the world, or only in the software?" If only software — rewrite.
|
|
279
318
|
|
|
319
|
+
**Warning:** Flow descriptions must describe business processes, not code sequences. "The OrderService calls PaymentGateway.charge()" is WRONG. "The system charges the customer's payment method" is CORRECT.
|
|
320
|
+
|
|
280
321
|
### Operational Rules
|
|
281
322
|
|
|
282
323
|
- **English only** for all files in \`.yggdrasil/\`. Conversation can be any language.
|
|
283
324
|
- **Read schemas before creating** any \`node.yaml\`, \`aspect.yaml\`, or \`flow.yaml\`.
|
|
284
325
|
- **Tools read, you write.** The \`yg\` CLI only reads, validates, and manages metadata. You create and edit files manually.
|
|
285
326
|
- **Incremental sync.** Run \`yg drift-sync\` after every 3-5 source file changes. Do not defer to end of task.
|
|
286
|
-
- **Completeness test:**
|
|
327
|
+
- **Completeness test:** Two checks, both required:
|
|
328
|
+
1. **Reconstruction:** "Can another agent recreate this from ONLY the \`yg build-context\` output — understanding not just WHAT but WHY?" Test: rejected alternatives, correct algorithm, design arguments.
|
|
329
|
+
2. **Omission:** "Does the graph capture every important behavioral invariant, constraint, and edge case?" Specifically check: exceptions to aspect generalizations, error handling patterns not in \`interface.md\`, concurrency behaviors not in \`internals.md\`.
|
|
330
|
+
- **Value calibration.** Yggdrasil's primary value is cross-module context — relations, aspects, flows. For a single simple module, \`responsibility.md\` and \`interface.md\` provide most value. Invest depth (\`internals.md\`) where cross-module interactions demand it.
|
|
287
331
|
- **These rules are invariant.** No plan, guide, skill, or workflow may override them.
|
|
288
332
|
|
|
289
333
|
### CLI Reference
|
|
@@ -316,14 +360,13 @@ yg journal-archive Archive consolidated journal entries.
|
|
|
316
360
|
|
|
317
361
|
| What you have | Where it goes |
|
|
318
362
|
|---|---|
|
|
319
|
-
| Information specific to this node | Local node artifact (
|
|
363
|
+
| Information specific to this node | Local node artifact (check \`config.yaml artifacts\` for types) |
|
|
320
364
|
| Rule that applies to many nodes | Aspect (content \`.md\` files in \`aspects/<id>/\`) |
|
|
321
365
|
| Architectural invariant for a node type | Required aspect in \`config.yaml node_types\` |
|
|
322
366
|
| Business process participation | Flow (\`flow.yaml participants\`) |
|
|
323
367
|
| Process-level requirement | Flow \`aspects\` + aspect directory |
|
|
324
368
|
| Context shared across a domain | Parent node artifact |
|
|
325
369
|
| Technology stack | \`config.yaml stack\` (+ \`rationale\` field) |
|
|
326
|
-
| Global coding standards | \`config.yaml standards\`
|
|
327
|
-
`;
|
|
370
|
+
| Global coding standards | \`config.yaml standards\` |`;
|
|
328
371
|
|
|
329
372
|
export const AGENT_RULES_CONTENT = [CORE_PROTOCOL, OPERATIONS, KNOWLEDGE_BASE].join('\n\n---\n\n');
|