agile-context-engineering 0.3.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/.claude-plugin/marketplace.json +18 -0
  2. package/.claude-plugin/plugin.json +10 -0
  3. package/CHANGELOG.md +7 -1
  4. package/LICENSE +51 -51
  5. package/README.md +330 -318
  6. package/agents/ace-code-discovery-analyst.md +245 -245
  7. package/agents/ace-code-integration-analyst.md +248 -248
  8. package/agents/ace-code-reviewer.md +375 -375
  9. package/agents/ace-product-owner.md +365 -361
  10. package/agents/ace-project-researcher.md +606 -606
  11. package/agents/ace-research-synthesizer.md +228 -228
  12. package/agents/ace-technical-application-architect.md +315 -315
  13. package/agents/ace-wiki-mapper.md +449 -445
  14. package/bin/install.js +605 -195
  15. package/hooks/ace-check-update.js +71 -62
  16. package/hooks/ace-statusline.js +107 -89
  17. package/hooks/hooks.json +14 -0
  18. package/package.json +7 -5
  19. package/shared/lib/ace-core.js +361 -0
  20. package/shared/lib/ace-core.test.js +308 -0
  21. package/shared/lib/ace-github.js +753 -0
  22. package/shared/lib/ace-story.js +400 -0
  23. package/shared/lib/ace-story.test.js +250 -0
  24. package/{agile-context-engineering → shared}/utils/questioning.xml +110 -110
  25. package/{agile-context-engineering → shared}/utils/ui-formatting.md +299 -299
  26. package/{commands/ace/execute-story.md → skills/execute-story/SKILL.md} +116 -138
  27. package/skills/execute-story/script.js +291 -0
  28. package/skills/execute-story/script.test.js +261 -0
  29. package/{agile-context-engineering/templates/product/story.xml → skills/execute-story/story-template.xml} +451 -451
  30. package/skills/execute-story/walkthrough-template.xml +255 -0
  31. package/{agile-context-engineering/workflows/execute-story.xml → skills/execute-story/workflow.xml} +1221 -1219
  32. package/skills/help/SKILL.md +71 -0
  33. package/skills/help/script.js +315 -0
  34. package/skills/help/script.test.js +183 -0
  35. package/{agile-context-engineering/workflows/help.xml → skills/help/workflow.xml} +544 -533
  36. package/{commands/ace/init-coding-standards.md → skills/init-coding-standards/SKILL.md} +91 -83
  37. package/{agile-context-engineering/templates/wiki/coding-standards.xml → skills/init-coding-standards/coding-standards-template.xml} +531 -531
  38. package/skills/init-coding-standards/script.js +50 -0
  39. package/skills/init-coding-standards/script.test.js +70 -0
  40. package/{agile-context-engineering/workflows/init-coding-standards.xml → skills/init-coding-standards/workflow.xml} +381 -386
  41. package/skills/map-cross-cutting/SKILL.md +126 -0
  42. package/{agile-context-engineering/templates/wiki → skills/map-cross-cutting}/system-cross-cutting.xml +197 -197
  43. package/skills/map-cross-cutting/workflow.xml +330 -0
  44. package/skills/map-guide/SKILL.md +126 -0
  45. package/{agile-context-engineering/templates/wiki → skills/map-guide}/guide.xml +137 -137
  46. package/skills/map-guide/workflow.xml +320 -0
  47. package/skills/map-pattern/SKILL.md +125 -0
  48. package/{agile-context-engineering/templates/wiki → skills/map-pattern}/pattern.xml +159 -159
  49. package/skills/map-pattern/workflow.xml +331 -0
  50. package/{commands/ace/map-story.md → skills/map-story/SKILL.md} +180 -165
  51. package/{agile-context-engineering/templates/wiki → skills/map-story/templates}/decizions.xml +115 -115
  52. package/skills/map-story/templates/guide.xml +137 -0
  53. package/skills/map-story/templates/pattern.xml +159 -0
  54. package/skills/map-story/templates/system-cross-cutting.xml +197 -0
  55. package/{agile-context-engineering/templates/wiki → skills/map-story/templates}/system.xml +381 -381
  56. package/{agile-context-engineering/templates/wiki → skills/map-story/templates}/tech-debt-index.xml +125 -125
  57. package/{agile-context-engineering/templates/wiki → skills/map-story/templates}/walkthrough.xml +255 -255
  58. package/{agile-context-engineering/workflows/map-story.xml → skills/map-story/workflow.xml} +1046 -1046
  59. package/{commands/ace/map-subsystem.md → skills/map-subsystem/SKILL.md} +155 -140
  60. package/skills/map-subsystem/script.js +51 -0
  61. package/skills/map-subsystem/script.test.js +68 -0
  62. package/skills/map-subsystem/templates/decizions.xml +115 -0
  63. package/skills/map-subsystem/templates/guide.xml +137 -0
  64. package/{agile-context-engineering/templates/wiki → skills/map-subsystem/templates}/module-discovery.xml +174 -174
  65. package/skills/map-subsystem/templates/pattern.xml +159 -0
  66. package/{agile-context-engineering/templates/wiki → skills/map-subsystem/templates}/subsystem-architecture.xml +343 -343
  67. package/{agile-context-engineering/templates/wiki → skills/map-subsystem/templates}/subsystem-structure.xml +234 -234
  68. package/skills/map-subsystem/templates/system-cross-cutting.xml +197 -0
  69. package/skills/map-subsystem/templates/system.xml +381 -0
  70. package/skills/map-subsystem/templates/walkthrough.xml +255 -0
  71. package/{agile-context-engineering/workflows/map-subsystem.xml → skills/map-subsystem/workflow.xml} +1173 -1178
  72. package/skills/map-sys-doc/SKILL.md +125 -0
  73. package/skills/map-sys-doc/system.xml +381 -0
  74. package/skills/map-sys-doc/workflow.xml +336 -0
  75. package/{commands/ace/map-system.md → skills/map-system/SKILL.md} +103 -92
  76. package/skills/map-system/script.js +75 -0
  77. package/skills/map-system/script.test.js +73 -0
  78. package/{agile-context-engineering/templates/wiki → skills/map-system/templates}/system-architecture.xml +254 -254
  79. package/{agile-context-engineering/templates/wiki → skills/map-system/templates}/system-structure.xml +177 -177
  80. package/{agile-context-engineering/templates/wiki → skills/map-system/templates}/testing-framework.xml +283 -283
  81. package/{agile-context-engineering/templates/wiki → skills/map-system/templates}/wiki-readme.xml +296 -296
  82. package/{agile-context-engineering/workflows/map-system.xml → skills/map-system/workflow.xml} +667 -672
  83. package/{commands/ace/map-walkthrough.md → skills/map-walkthrough/SKILL.md} +140 -127
  84. package/skills/map-walkthrough/walkthrough.xml +255 -0
  85. package/{agile-context-engineering/workflows/map-walkthrough.xml → skills/map-walkthrough/workflow.xml} +457 -457
  86. package/{commands/ace/plan-backlog.md → skills/plan-backlog/SKILL.md} +93 -83
  87. package/{agile-context-engineering/templates/product/product-backlog.xml → skills/plan-backlog/product-backlog-template.xml} +231 -231
  88. package/skills/plan-backlog/script.js +121 -0
  89. package/skills/plan-backlog/script.test.js +83 -0
  90. package/{agile-context-engineering/workflows/plan-backlog.xml → skills/plan-backlog/workflow.xml} +1348 -1356
  91. package/{commands/ace/plan-feature.md → skills/plan-feature/SKILL.md} +99 -89
  92. package/{agile-context-engineering/templates/product/feature.xml → skills/plan-feature/feature-template.xml} +361 -361
  93. package/skills/plan-feature/script.js +131 -0
  94. package/skills/plan-feature/script.test.js +80 -0
  95. package/{agile-context-engineering/workflows/plan-feature.xml → skills/plan-feature/workflow.xml} +1487 -1495
  96. package/{commands/ace/plan-product-vision.md → skills/plan-product-vision/SKILL.md} +91 -81
  97. package/{agile-context-engineering/templates/product/product-vision.xml → skills/plan-product-vision/product-vision-template.xml} +227 -227
  98. package/skills/plan-product-vision/script.js +51 -0
  99. package/skills/plan-product-vision/script.test.js +69 -0
  100. package/{agile-context-engineering/workflows/plan-product-vision.xml → skills/plan-product-vision/workflow.xml} +337 -342
  101. package/{commands/ace/plan-story.md → skills/plan-story/SKILL.md} +139 -159
  102. package/skills/plan-story/script.js +295 -0
  103. package/skills/plan-story/script.test.js +240 -0
  104. package/skills/plan-story/story-template.xml +458 -0
  105. package/{agile-context-engineering/workflows/plan-story.xml → skills/plan-story/workflow.xml} +1301 -944
  106. package/{commands/ace/research-external-solution.md → skills/research-external-solution/SKILL.md} +120 -138
  107. package/{agile-context-engineering/templates/product/external-solution.xml → skills/research-external-solution/external-solution-template.xml} +832 -832
  108. package/skills/research-external-solution/script.js +229 -0
  109. package/skills/research-external-solution/script.test.js +134 -0
  110. package/{agile-context-engineering/workflows/research-external-solution.xml → skills/research-external-solution/workflow.xml} +657 -659
  111. package/{commands/ace/research-integration-solution.md → skills/research-integration-solution/SKILL.md} +121 -135
  112. package/{agile-context-engineering/templates/product/story-integration-solution.xml → skills/research-integration-solution/integration-solution-template.xml} +1015 -1015
  113. package/skills/research-integration-solution/script.js +223 -0
  114. package/skills/research-integration-solution/script.test.js +134 -0
  115. package/{agile-context-engineering/workflows/research-integration-solution.xml → skills/research-integration-solution/workflow.xml} +711 -713
  116. package/{commands/ace/research-story-wiki.md → skills/research-story-wiki/SKILL.md} +101 -116
  117. package/skills/research-story-wiki/script.js +223 -0
  118. package/skills/research-story-wiki/script.test.js +138 -0
  119. package/{agile-context-engineering/templates/product/story-wiki.xml → skills/research-story-wiki/story-wiki-template.xml} +194 -194
  120. package/{agile-context-engineering/workflows/research-story-wiki.xml → skills/research-story-wiki/workflow.xml} +473 -475
  121. package/{commands/ace/research-technical-solution.md → skills/research-technical-solution/SKILL.md} +131 -147
  122. package/skills/research-technical-solution/script.js +223 -0
  123. package/skills/research-technical-solution/script.test.js +134 -0
  124. package/{agile-context-engineering/templates/product/story-technical-solution.xml → skills/research-technical-solution/technical-solution-template.xml} +1025 -1025
  125. package/{agile-context-engineering/workflows/research-technical-solution.xml → skills/research-technical-solution/workflow.xml} +761 -763
  126. package/{commands/ace/review-story.md → skills/review-story/SKILL.md} +99 -109
  127. package/skills/review-story/script.js +249 -0
  128. package/skills/review-story/script.test.js +169 -0
  129. package/skills/review-story/story-template.xml +451 -0
  130. package/{agile-context-engineering/workflows/review-story.xml → skills/review-story/workflow.xml} +279 -281
  131. package/{commands/ace/update.md → skills/update/SKILL.md} +65 -56
  132. package/{agile-context-engineering/workflows/update.xml → skills/update/workflow.xml} +33 -18
  133. package/agile-context-engineering/src/ace-tools.js +0 -2881
  134. package/agile-context-engineering/src/ace-tools.test.js +0 -1089
  135. package/agile-context-engineering/templates/_command.md +0 -54
  136. package/agile-context-engineering/templates/_workflow.xml +0 -17
  137. package/agile-context-engineering/templates/config.json +0 -0
  138. package/agile-context-engineering/templates/product/integration-solution.xml +0 -0
  139. package/commands/ace/help.md +0 -93
@@ -0,0 +1,73 @@
1
+ const { describe, it, before, after } = require('node:test');
2
+ const assert = require('node:assert');
3
+ const { execSync } = require('child_process');
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const os = require('os');
7
+
8
+ const SCRIPT = path.join(__dirname, 'script.js');
9
+
10
+ function createTestProject() {
11
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ace-test-'));
12
+
13
+ const aceDir = path.join(tmpDir, '.ace');
14
+ fs.mkdirSync(aceDir, { recursive: true });
15
+ fs.writeFileSync(path.join(aceDir, 'config.json'), JSON.stringify({
16
+ version: '0.1.0',
17
+ projectName: 'test-project',
18
+ model_profile: 'quality',
19
+ commit_docs: true,
20
+ github: { enabled: false },
21
+ }, null, 2));
22
+
23
+ return tmpDir;
24
+ }
25
+
26
+ function runScript(subcommand, args, cwd) {
27
+ return execSync(`node "${SCRIPT}" ${subcommand} ${args}`, {
28
+ cwd,
29
+ encoding: 'utf-8',
30
+ timeout: 10000,
31
+ });
32
+ }
33
+
34
+ function cleanup(tmpDir) {
35
+ fs.rmSync(tmpDir, { recursive: true, force: true });
36
+ }
37
+
38
+ describe('map-system script', () => {
39
+ it('errors on unknown command', () => {
40
+ assert.throws(() => {
41
+ execSync(`node "${SCRIPT}" bogus`, { encoding: 'utf-8', stdio: 'pipe' });
42
+ });
43
+ });
44
+
45
+ describe('init', () => {
46
+ let tmpDir;
47
+
48
+ before(() => { tmpDir = createTestProject(); });
49
+ after(() => { cleanup(tmpDir); });
50
+
51
+ it('init returns valid JSON', () => {
52
+ const result = JSON.parse(runScript('init', '', tmpDir));
53
+ assert.ok(typeof result === 'object');
54
+ assert.ok(result.mapper_model, 'should have mapper_model');
55
+ assert.strictEqual(typeof result.commit_docs, 'boolean');
56
+ assert.strictEqual(typeof result.has_git, 'boolean');
57
+ assert.strictEqual(typeof result.is_brownfield, 'boolean');
58
+ assert.strictEqual(typeof result.wiki_dir_exists, 'boolean');
59
+ assert.ok(Array.isArray(result.existing_wiki_files), 'should have existing_wiki_files array');
60
+ assert.strictEqual(typeof result.has_system_structure, 'boolean');
61
+ assert.strictEqual(typeof result.has_system_architecture, 'boolean');
62
+ assert.strictEqual(typeof result.has_testing_framework, 'boolean');
63
+ assert.strictEqual(typeof result.has_coding_standards, 'boolean');
64
+ });
65
+
66
+ it('returns brownfield detection fields', () => {
67
+ const result = JSON.parse(runScript('init', '', tmpDir));
68
+ assert.strictEqual(typeof result.is_brownfield, 'boolean');
69
+ assert.strictEqual(typeof result.is_greenfield, 'boolean');
70
+ assert.strictEqual(result.is_brownfield, !result.is_greenfield);
71
+ });
72
+ });
73
+ });
@@ -1,254 +1,254 @@
1
- <system-architecture>
2
- <purpose>
3
- Template for `.docs/wiki/system-wide/system-architecture.md` — the living high-level
4
- architecture document. Captures L1/L2 views (C4 model), core runtime flows, and tech stack.
5
-
6
- Complements per-subsystem docs (which cover L3 Component and L4 Code levels).
7
- Complements STRUCTURE.md (which shows physical file/folder layout).
8
-
9
- A "subsystem" is any cohesive code unit with a clear responsibility boundary —
10
- whether deployed as a microservice, a monolith module, or a library package.
11
- </purpose>
12
-
13
- <template>
14
- <system-overview>
15
- ## System Overview
16
-
17
- [2-3 sentences. What does this system do and who uses it? Product language, not jargon.
18
- This orients the reader before they look at any diagrams.]
19
- </system-overview>
20
-
21
- <c4-l1-system-context>
22
- <diagram lang="mermaid" type="C4Context">
23
- ## L1: System Context
24
-
25
- ```mermaid
26
- C4Context
27
- title System Context - [System Name]
28
-
29
- Person(user1, "[Primary User Role]", "[What they do with the system]")
30
- Person(user2, "[Secondary User Role]", "[What they do]")
31
-
32
- System(system, "[System Name]", "[Core purpose - one line]")
33
-
34
- System_Ext(ext1, "[External System 1]", "[What it provides/consumes]")
35
- System_Ext(ext2, "[External System 2]", "[What it provides/consumes]")
36
-
37
- Rel(user1, system, "[Uses]", "[HTTPS/WebSocket]")
38
- Rel(system, ext1, "[Fetches/Sends]", "[REST/WebSocket]")
39
- Rel(ext2, system, "[Pushes]", "[Protocol]")
40
- ```
41
- </diagram>
42
-
43
- <external-integrations-overview>
44
- ### External Integrations
45
-
46
- | External System | Direction | What Flows | Protocol |
47
- |----------------|-----------|------------|----------|
48
- | [System 1] | Inbound | [Data/events description] | [REST/WS/gRPC] |
49
- | [System 2] | Outbound | [Data/events description] | [Protocol] |
50
- | [System 3] | Bidirectional | [Data/events description] | [Protocol] |
51
- </external-integrations-overview>
52
- </c4-l1-system-context>
53
-
54
- <c4-l2-container>
55
- <diagram lang="mermaid" type="flowchart LR">
56
- ## L2: Subsystem Overview
57
-
58
- ```mermaid
59
- flowchart LR
60
- subgraph Users
61
- user([fa:fa-user User Role])
62
- end
63
-
64
- subgraph Core["Core Services"]
65
- sub1["Subsystem 1<br/><small>Tech · One-line responsibility</small>"]
66
- sub2["Subsystem 2<br/><small>Tech · One-line responsibility</small>"]
67
- end
68
-
69
- subgraph Workers["Background Workers"]
70
- sub3["Subsystem 3<br/><small>Tech · One-line responsibility</small>"]
71
- end
72
-
73
- subgraph Data["Data Stores"]
74
- db1[(Data Store<br/><small>Tech</small>)]
75
- cache1[(Cache<br/><small>Tech</small>)]
76
- end
77
-
78
- subgraph Messaging["Messaging"]
79
- mq1>Message Broker<br/><small>Tech</small>]
80
- end
81
-
82
- subgraph External["External Systems"]
83
- ext1["External System<br/><small>From L1</small>"]
84
- end
85
-
86
- user -->|"HTTPS"| sub1
87
- sub1 -->|"HTTP/gRPC"| sub2
88
- sub2 -->|"SQL"| db1
89
- sub2 -->|"Publishes"| mq1
90
- mq1 -->|"Consumes"| sub3
91
- sub3 -->|"R/W"| cache1
92
- sub1 -->|"REST"| ext1
93
- ```
94
- </diagram>
95
-
96
- <subsystem-responsibility-matrix>
97
- ### Subsystem Responsibility Matrix
98
-
99
- | Subsystem | Responsibility | Owns (Data) | Publishes | Consumes | Tech |
100
- |-----------|---------------|-------------|-----------|----------|------|
101
- | [Sub 1] | [One-line purpose] | [Tables/schemas] | [Events/APIs exposed] | [Events/APIs called] | [Lang + framework] |
102
- | [Sub 2] | [One-line purpose] | [Tables/schemas] | [Events/APIs exposed] | [Events/APIs called] | [Lang + framework] |
103
- </subsystem-responsibility-matrix>
104
-
105
- <communication-patterns>
106
- ### Communication Patterns
107
-
108
- | From | To | Pattern | Protocol | Purpose |
109
- |------|----|---------|----------|---------|
110
- | [Sub 1] | [Sub 2] | Sync request-response | [HTTP/gRPC] | [Why this call exists] |
111
- | [Sub 2] | [Sub 3] | Async event | [Kafka/Redis pub-sub] | [Why async over sync] |
112
- | [Sub 3] | [Sub 1] | Real-time push | [SignalR/WebSocket] | [Why push over poll] |
113
- </communication-patterns>
114
- </c4-l2-container>
115
-
116
- <main-flows>
117
- ## Core Flows
118
-
119
- The flows that define this system's core value. Subsystem-to-subsystem level only —
120
- internal class-level details belong in per-subsystem docs.
121
-
122
- <diagram lang="mermaid" type="sequenceDiagram">
123
- ### Flow: [Flow Name]
124
-
125
- [One sentence: what this achieves and when it triggers.]
126
-
127
- ```mermaid
128
- sequenceDiagram
129
- participant Actor as [User/External]
130
- participant S1 as [Subsystem 1]
131
- participant S2 as [Subsystem 2]
132
- participant MQ as [Broker]
133
- participant S3 as [Subsystem 3]
134
- participant DB as [Data Store]
135
-
136
- Actor->>S1: [Trigger]
137
- S1->>S2: [What passes]
138
- S2->>DB: [Operation]
139
- DB-->>S2: [Result]
140
- S2->>MQ: [Publish event]
141
- MQ-->>S3: [Consume]
142
- S3-->>S1: [Push update]
143
- S1-->>Actor: [Outcome]
144
- ```
145
- </diagram>
146
- </main-flows>
147
-
148
- <tech-stack>
149
- ## Tech Stack
150
-
151
- | Category | Technology | Version | Purpose |
152
- |----------|-----------|---------|---------|
153
- | Backend | [e.g., .NET] | [8.0] | [API services] |
154
- | Frontend | [e.g., Next.js] | [15] | [Web application] |
155
- | Database | [e.g., PostgreSQL] | [16] | [Primary store] |
156
- | Cache | [e.g., Redis] | [7] | [Caching, pub/sub] |
157
- | Messaging | [e.g., Kafka] | [3.x] | [Event streaming] |
158
- | Real-time | [e.g., SignalR] | [-] | [Client push] |
159
- </tech-stack>
160
-
161
- <key-system-wide-architectural-decisions>
162
- ## Key System Wide Architectural Decisions
163
-
164
- System-wide decisions only. Per-subsystem decisions live in per-subsystem docs.
165
-
166
- | Decision | Rationale |
167
- |----------|-----------|
168
- | [e.g., Clean Architecture per service] | [Consistent boundaries, testability] |
169
- | [e.g., Kafka over RabbitMQ] | [Need replay, ordering, high throughput] |
170
- </key-system-wide-architectural-decisions>
171
- </template>
172
-
173
- <guidelines>
174
-
175
- **ALL visual representations of architecture, dependencies, flows, or relationships MUST be ```mermaid fenced code blocks. NO ASCII arrows (->), NO dependency trees, NO PlantUML. Only mermaid. The ONLY ASCII exception is file trees.**
176
-
177
- **System Overview:**
178
- - 2-3 sentences maximum. Orients the AI before it reads diagrams
179
- - Product language — a PM should understand it
180
- - NOT a product vision or mission statement. Just "what this system does and who uses it"
181
-
182
- **L1 System Context (`c4-l1-system-context`):**
183
- - The ENTIRE system is ONE box — do NOT show internal subsystems
184
- - Show ALL user roles (human actors) and ALL external systems (third-party)
185
- - Diagram arrows: label with WHAT flows and WHICH protocol
186
- - External = anything your team does NOT deploy. If you deploy it, it's a subsystem in L2
187
- - Integrations table: one row per external system. Keep it simple — direction, data, protocol
188
-
189
- **L2 Container (`c4-l2-container`):**
190
- - Use `flowchart LR` with small focused subgraphs — data pipeline reads naturally left-to-right
191
- - Group related nodes into subgraphs (e.g., "Core Services", "Data Stores", "External Systems")
192
- - Keep subgraphs small (2-4 nodes each) — split large groups rather than making one big subgraph
193
- - One node per subsystem (see "subsystem" definition in purpose)
194
- - Data stores and message brokers are SEPARATE nodes — they are NOT subsystems
195
- - Subsystem matrix is the quick-reference — agents scan this FIRST to find "who does what"
196
- - Communication patterns table explains WHY each link exists and whether it's sync/async.
197
- The diagram shows topology; the table explains rationale
198
- - Do NOT show components within subsystems — that's L3, handled by per-subsystem docs
199
-
200
- **Subsystem examples by project type:**
201
- - Microservices: each service = one subsystem
202
- - Monolith: each bounded context/module = one subsystem
203
- - Monorepo packages: each publishable package = one subsystem
204
- - Hybrid: mix of all three — anything with a clear boundary is a subsystem
205
-
206
- **Core Flows (`main-flows`):**
207
- - Generate however many flows define the system's core value (usually 1-2)
208
- - Subsystem-to-subsystem only — NO classes, NO method names, NO file references
209
- - If a flow needs internal detail, that belongs in the subsystem's `systems/*.md` doc
210
- - These are C4 Dynamic Diagrams at the Container level
211
- - Choose flows a NEW TEAM MEMBER must understand to work on the system
212
-
213
- **Tech Stack:**
214
- - List what's ACTUALLY in use, not aspirational
215
- - One row per technology. Group by category
216
- - If a technology is used by only one subsystem, mention it in Purpose
217
-
218
- **Key System Wide Architectural Decisions:**
219
- - System-wide only (e.g., "all services use Clean Architecture")
220
- - Per-subsystem decisions go in per-subsystem docs
221
- - Keep under 10 rows. This is a bird's eye view, not a decision log
222
- - Decision + Rationale only. No tracking, no status, no dates
223
-
224
- </guidelines>
225
-
226
- <evolution>
227
-
228
- This document evolves at STRUCTURAL changes only — not every story or bugfix.
229
-
230
- **Update triggers:**
231
- - New subsystem added, or existing one split/merged
232
- - New external integration added or removed
233
- - Core flow fundamentally changed (not just a step added)
234
- - Tech stack changed (new database, new framework, migration)
235
- - Communication pattern between subsystems changed
236
- - New system-wide architectural decision made
237
-
238
- **NOT an update trigger:**
239
- - New feature within an existing subsystem (per-subsystem docs)
240
- - Bug fixes or internal refactoring
241
- - New API endpoints within existing subsystem
242
- - New tables within existing subsystem's database
243
-
244
- **After structural change:**
245
- 1. L1 still accurate? (new external system? removed integration?)
246
- 2. L2 still accurate? (new subsystem? new data store? new broker?)
247
- 3. Subsystem matrix need a new row or updated cell?
248
- 4. Core flow shape changed? (rare)
249
- 5. Tech stack changed?
250
- 6. New system-wide decision to log?
251
-
252
- </evolution>
253
-
254
- </system-architecture>
1
+ <system-architecture>
2
+ <purpose>
3
+ Template for `.docs/wiki/system-wide/system-architecture.md` — the living high-level
4
+ architecture document. Captures L1/L2 views (C4 model), core runtime flows, and tech stack.
5
+
6
+ Complements per-subsystem docs (which cover L3 Component and L4 Code levels).
7
+ Complements STRUCTURE.md (which shows physical file/folder layout).
8
+
9
+ A "subsystem" is any cohesive code unit with a clear responsibility boundary —
10
+ whether deployed as a microservice, a monolith module, or a library package.
11
+ </purpose>
12
+
13
+ <template>
14
+ <system-overview>
15
+ ## System Overview
16
+
17
+ [2-3 sentences. What does this system do and who uses it? Product language, not jargon.
18
+ This orients the reader before they look at any diagrams.]
19
+ </system-overview>
20
+
21
+ <c4-l1-system-context>
22
+ <diagram lang="mermaid" type="C4Context">
23
+ ## L1: System Context
24
+
25
+ ```mermaid
26
+ C4Context
27
+ title System Context - [System Name]
28
+
29
+ Person(user1, "[Primary User Role]", "[What they do with the system]")
30
+ Person(user2, "[Secondary User Role]", "[What they do]")
31
+
32
+ System(system, "[System Name]", "[Core purpose - one line]")
33
+
34
+ System_Ext(ext1, "[External System 1]", "[What it provides/consumes]")
35
+ System_Ext(ext2, "[External System 2]", "[What it provides/consumes]")
36
+
37
+ Rel(user1, system, "[Uses]", "[HTTPS/WebSocket]")
38
+ Rel(system, ext1, "[Fetches/Sends]", "[REST/WebSocket]")
39
+ Rel(ext2, system, "[Pushes]", "[Protocol]")
40
+ ```
41
+ </diagram>
42
+
43
+ <external-integrations-overview>
44
+ ### External Integrations
45
+
46
+ | External System | Direction | What Flows | Protocol |
47
+ |----------------|-----------|------------|----------|
48
+ | [System 1] | Inbound | [Data/events description] | [REST/WS/gRPC] |
49
+ | [System 2] | Outbound | [Data/events description] | [Protocol] |
50
+ | [System 3] | Bidirectional | [Data/events description] | [Protocol] |
51
+ </external-integrations-overview>
52
+ </c4-l1-system-context>
53
+
54
+ <c4-l2-container>
55
+ <diagram lang="mermaid" type="flowchart LR">
56
+ ## L2: Subsystem Overview
57
+
58
+ ```mermaid
59
+ flowchart LR
60
+ subgraph Users
61
+ user([fa:fa-user User Role])
62
+ end
63
+
64
+ subgraph Core["Core Services"]
65
+ sub1["Subsystem 1<br/><small>Tech · One-line responsibility</small>"]
66
+ sub2["Subsystem 2<br/><small>Tech · One-line responsibility</small>"]
67
+ end
68
+
69
+ subgraph Workers["Background Workers"]
70
+ sub3["Subsystem 3<br/><small>Tech · One-line responsibility</small>"]
71
+ end
72
+
73
+ subgraph Data["Data Stores"]
74
+ db1[(Data Store<br/><small>Tech</small>)]
75
+ cache1[(Cache<br/><small>Tech</small>)]
76
+ end
77
+
78
+ subgraph Messaging["Messaging"]
79
+ mq1>Message Broker<br/><small>Tech</small>]
80
+ end
81
+
82
+ subgraph External["External Systems"]
83
+ ext1["External System<br/><small>From L1</small>"]
84
+ end
85
+
86
+ user -->|"HTTPS"| sub1
87
+ sub1 -->|"HTTP/gRPC"| sub2
88
+ sub2 -->|"SQL"| db1
89
+ sub2 -->|"Publishes"| mq1
90
+ mq1 -->|"Consumes"| sub3
91
+ sub3 -->|"R/W"| cache1
92
+ sub1 -->|"REST"| ext1
93
+ ```
94
+ </diagram>
95
+
96
+ <subsystem-responsibility-matrix>
97
+ ### Subsystem Responsibility Matrix
98
+
99
+ | Subsystem | Responsibility | Owns (Data) | Publishes | Consumes | Tech |
100
+ |-----------|---------------|-------------|-----------|----------|------|
101
+ | [Sub 1] | [One-line purpose] | [Tables/schemas] | [Events/APIs exposed] | [Events/APIs called] | [Lang + framework] |
102
+ | [Sub 2] | [One-line purpose] | [Tables/schemas] | [Events/APIs exposed] | [Events/APIs called] | [Lang + framework] |
103
+ </subsystem-responsibility-matrix>
104
+
105
+ <communication-patterns>
106
+ ### Communication Patterns
107
+
108
+ | From | To | Pattern | Protocol | Purpose |
109
+ |------|----|---------|----------|---------|
110
+ | [Sub 1] | [Sub 2] | Sync request-response | [HTTP/gRPC] | [Why this call exists] |
111
+ | [Sub 2] | [Sub 3] | Async event | [Kafka/Redis pub-sub] | [Why async over sync] |
112
+ | [Sub 3] | [Sub 1] | Real-time push | [SignalR/WebSocket] | [Why push over poll] |
113
+ </communication-patterns>
114
+ </c4-l2-container>
115
+
116
+ <main-flows>
117
+ ## Core Flows
118
+
119
+ The flows that define this system's core value. Subsystem-to-subsystem level only —
120
+ internal class-level details belong in per-subsystem docs.
121
+
122
+ <diagram lang="mermaid" type="sequenceDiagram">
123
+ ### Flow: [Flow Name]
124
+
125
+ [One sentence: what this achieves and when it triggers.]
126
+
127
+ ```mermaid
128
+ sequenceDiagram
129
+ participant Actor as [User/External]
130
+ participant S1 as [Subsystem 1]
131
+ participant S2 as [Subsystem 2]
132
+ participant MQ as [Broker]
133
+ participant S3 as [Subsystem 3]
134
+ participant DB as [Data Store]
135
+
136
+ Actor->>S1: [Trigger]
137
+ S1->>S2: [What passes]
138
+ S2->>DB: [Operation]
139
+ DB-->>S2: [Result]
140
+ S2->>MQ: [Publish event]
141
+ MQ-->>S3: [Consume]
142
+ S3-->>S1: [Push update]
143
+ S1-->>Actor: [Outcome]
144
+ ```
145
+ </diagram>
146
+ </main-flows>
147
+
148
+ <tech-stack>
149
+ ## Tech Stack
150
+
151
+ | Category | Technology | Version | Purpose |
152
+ |----------|-----------|---------|---------|
153
+ | Backend | [e.g., .NET] | [8.0] | [API services] |
154
+ | Frontend | [e.g., Next.js] | [15] | [Web application] |
155
+ | Database | [e.g., PostgreSQL] | [16] | [Primary store] |
156
+ | Cache | [e.g., Redis] | [7] | [Caching, pub/sub] |
157
+ | Messaging | [e.g., Kafka] | [3.x] | [Event streaming] |
158
+ | Real-time | [e.g., SignalR] | [-] | [Client push] |
159
+ </tech-stack>
160
+
161
+ <key-system-wide-architectural-decisions>
162
+ ## Key System Wide Architectural Decisions
163
+
164
+ System-wide decisions only. Per-subsystem decisions live in per-subsystem docs.
165
+
166
+ | Decision | Rationale |
167
+ |----------|-----------|
168
+ | [e.g., Clean Architecture per service] | [Consistent boundaries, testability] |
169
+ | [e.g., Kafka over RabbitMQ] | [Need replay, ordering, high throughput] |
170
+ </key-system-wide-architectural-decisions>
171
+ </template>
172
+
173
+ <guidelines>
174
+
175
+ **ALL visual representations of architecture, dependencies, flows, or relationships MUST be ```mermaid fenced code blocks. NO ASCII arrows (->), NO dependency trees, NO PlantUML. Only mermaid. The ONLY ASCII exception is file trees.**
176
+
177
+ **System Overview:**
178
+ - 2-3 sentences maximum. Orients the AI before it reads diagrams
179
+ - Product language — a PM should understand it
180
+ - NOT a product vision or mission statement. Just "what this system does and who uses it"
181
+
182
+ **L1 System Context (`c4-l1-system-context`):**
183
+ - The ENTIRE system is ONE box — do NOT show internal subsystems
184
+ - Show ALL user roles (human actors) and ALL external systems (third-party)
185
+ - Diagram arrows: label with WHAT flows and WHICH protocol
186
+ - External = anything your team does NOT deploy. If you deploy it, it's a subsystem in L2
187
+ - Integrations table: one row per external system. Keep it simple — direction, data, protocol
188
+
189
+ **L2 Container (`c4-l2-container`):**
190
+ - Use `flowchart LR` with small focused subgraphs — data pipeline reads naturally left-to-right
191
+ - Group related nodes into subgraphs (e.g., "Core Services", "Data Stores", "External Systems")
192
+ - Keep subgraphs small (2-4 nodes each) — split large groups rather than making one big subgraph
193
+ - One node per subsystem (see "subsystem" definition in purpose)
194
+ - Data stores and message brokers are SEPARATE nodes — they are NOT subsystems
195
+ - Subsystem matrix is the quick-reference — agents scan this FIRST to find "who does what"
196
+ - Communication patterns table explains WHY each link exists and whether it's sync/async.
197
+ The diagram shows topology; the table explains rationale
198
+ - Do NOT show components within subsystems — that's L3, handled by per-subsystem docs
199
+
200
+ **Subsystem examples by project type:**
201
+ - Microservices: each service = one subsystem
202
+ - Monolith: each bounded context/module = one subsystem
203
+ - Monorepo packages: each publishable package = one subsystem
204
+ - Hybrid: mix of all three — anything with a clear boundary is a subsystem
205
+
206
+ **Core Flows (`main-flows`):**
207
+ - Generate however many flows define the system's core value (usually 1-2)
208
+ - Subsystem-to-subsystem only — NO classes, NO method names, NO file references
209
+ - If a flow needs internal detail, that belongs in the subsystem's `systems/*.md` doc
210
+ - These are C4 Dynamic Diagrams at the Container level
211
+ - Choose flows a NEW TEAM MEMBER must understand to work on the system
212
+
213
+ **Tech Stack:**
214
+ - List what's ACTUALLY in use, not aspirational
215
+ - One row per technology. Group by category
216
+ - If a technology is used by only one subsystem, mention it in Purpose
217
+
218
+ **Key System Wide Architectural Decisions:**
219
+ - System-wide only (e.g., "all services use Clean Architecture")
220
+ - Per-subsystem decisions go in per-subsystem docs
221
+ - Keep under 10 rows. This is a bird's eye view, not a decision log
222
+ - Decision + Rationale only. No tracking, no status, no dates
223
+
224
+ </guidelines>
225
+
226
+ <evolution>
227
+
228
+ This document evolves at STRUCTURAL changes only — not every story or bugfix.
229
+
230
+ **Update triggers:**
231
+ - New subsystem added, or existing one split/merged
232
+ - New external integration added or removed
233
+ - Core flow fundamentally changed (not just a step added)
234
+ - Tech stack changed (new database, new framework, migration)
235
+ - Communication pattern between subsystems changed
236
+ - New system-wide architectural decision made
237
+
238
+ **NOT an update trigger:**
239
+ - New feature within an existing subsystem (per-subsystem docs)
240
+ - Bug fixes or internal refactoring
241
+ - New API endpoints within existing subsystem
242
+ - New tables within existing subsystem's database
243
+
244
+ **After structural change:**
245
+ 1. L1 still accurate? (new external system? removed integration?)
246
+ 2. L2 still accurate? (new subsystem? new data store? new broker?)
247
+ 3. Subsystem matrix need a new row or updated cell?
248
+ 4. Core flow shape changed? (rare)
249
+ 5. Tech stack changed?
250
+ 6. New system-wide decision to log?
251
+
252
+ </evolution>
253
+
254
+ </system-architecture>