arcane-cli 0.14.0 → 0.15.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/LICENSE +21 -21
- package/README.md +253 -253
- package/dist/assets/.arcane/agents/agent-policies-template.md +414 -414
- package/dist/assets/.arcane/governance/agent-policies.md +414 -414
- package/dist/assets/.arcane/governance/agent-work-queue-model.md +61 -61
- package/dist/assets/.arcane/governance/cicd-standards.md +227 -227
- package/dist/assets/.arcane/governance/development-methodology.md +384 -384
- package/dist/assets/.arcane/governance/git-conventions.md +759 -759
- package/dist/assets/.arcane/governance/naming-conventions.md +142 -142
- package/dist/assets/.arcane/governance/new-business-setup.md +182 -182
- package/dist/assets/.arcane/governance/portable-bootstrap.md +101 -101
- package/dist/assets/.arcane/governance/product-excellence-standards.md +211 -211
- package/dist/assets/.arcane/governance/testing-standards.md +158 -158
- package/dist/assets/.arcane/governance/universal-agent-rules.md +108 -108
- package/dist/assets/.arcane/image-prompts/adelaide-image-prompt.md +140 -140
- package/dist/assets/.arcane/image-prompts/alexander-image-prompt.md +138 -138
- package/dist/assets/.arcane/image-prompts/bess-image-prompt.md +139 -139
- package/dist/assets/.arcane/image-prompts/circe-image-prompt.md +143 -143
- package/dist/assets/.arcane/image-prompts/custodio-image-prompt.md +140 -140
- package/dist/assets/.arcane/image-prompts/iris-image-prompt.md +139 -139
- package/dist/assets/.arcane/image-prompts/kellar-image-prompt.md +141 -141
- package/dist/assets/.arcane/image-prompts/lafayette-image-prompt.md +140 -140
- package/dist/assets/.arcane/image-prompts/lince-image-prompt.md +142 -142
- package/dist/assets/.arcane/image-prompts/mercurio-image-prompt.md +140 -140
- package/dist/assets/.arcane/image-prompts/merlin-image-prompt.md +139 -139
- package/dist/assets/.arcane/image-prompts/prospero-image-prompt.md +141 -141
- package/dist/assets/.claude/commands/spell-enchant.md +9 -9
- package/dist/assets/.github/agents/adelaide.agent.md +44 -44
- package/dist/assets/.github/agents/alexander.agent.md +43 -43
- package/dist/assets/.github/agents/bess.agent.md +42 -42
- package/dist/assets/.github/agents/circe.agent.md +43 -43
- package/dist/assets/.github/agents/custodio.agent.md +44 -44
- package/dist/assets/.github/agents/iris.agent.md +43 -43
- package/dist/assets/.github/agents/kellar.agent.md +43 -43
- package/dist/assets/.github/agents/lafayette.agent.md +42 -42
- package/dist/assets/.github/agents/lince.agent.md +43 -43
- package/dist/assets/.github/agents/mercurio.agent.md +43 -43
- package/dist/assets/.github/agents/merlin.agent.md +44 -44
- package/dist/assets/.github/agents/prospero.agent.md +43 -43
- package/dist/assets/.github/prompts/spell-close-session.prompt.md +17 -5
- package/dist/assets/.github/prompts/spell-commit-work.prompt.md +24 -6
- package/dist/assets/.github/prompts/spell-create-pull-request.prompt.md +12 -3
- package/dist/assets/.github/prompts/spell-enchant.prompt.md +385 -385
- package/dist/assets/.github/prompts/spell-feedback.prompt.md +113 -113
- package/dist/assets/.github/prompts/spell-full-cycle.prompt.md +202 -201
- package/dist/assets/.github/prompts/spell-implement.prompt.md +101 -101
- package/dist/assets/.github/prompts/spell-open-session.prompt.md +20 -5
- package/dist/assets/.github/prompts/spell-scope.prompt.md +263 -263
- package/dist/assets/agents/architecture-lead.yaml +61 -61
- package/dist/assets/agents/collaborator.yaml +59 -59
- package/dist/assets/agents/devops.yaml +60 -60
- package/dist/assets/agents/frontend-dev.yaml +60 -60
- package/dist/assets/agents/fullstack-dev.yaml +59 -59
- package/dist/assets/agents/marketing-strategist.yaml +60 -60
- package/dist/assets/agents/mobile-dev.yaml +59 -59
- package/dist/assets/agents/operations-comms.yaml +58 -58
- package/dist/assets/agents/orchestrator.yaml +60 -60
- package/dist/assets/agents/qa-lead.yaml +60 -60
- package/dist/assets/agents/research-analyst.yaml +59 -59
- package/dist/assets/agents/security-ops.yaml +61 -61
- package/dist/index.js +323 -7
- package/dist/index.js.map +1 -1
- package/package.json +72 -72
- package/dist/assets/.claude/commands/spell-eas-ios-deploy.md +0 -9
- package/dist/assets/.github/prompts/spell-eas-ios-deploy.prompt.md +0 -183
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Agent Work Queue Model
|
|
3
|
-
audience: both
|
|
4
|
-
last_updated: YYYY-MM-DD
|
|
5
|
-
status: draft
|
|
6
|
-
distributable: true
|
|
7
|
-
tags: [governance, queue, agents, work-management]
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Agent Work Queue Model
|
|
11
|
-
|
|
12
|
-
Defines a single markdown-first queue for assigning work across businesses, while keeping Azure DevOps at Story-level visibility per [[DECISIONS#ADR-015|ADR-015]].
|
|
13
|
-
|
|
14
|
-
## Executive Summary
|
|
15
|
-
|
|
16
|
-
- One queue controls cross-business assignment to avoid agent contention and hidden work.
|
|
17
|
-
- Markdown remains source of truth; Azure DevOps mirrors milestone status for humans.
|
|
18
|
-
- Queue rows include execution host and approval gate so autonomy stays explicit.
|
|
19
|
-
- {BUSINESS_NAME} starts first; same structure extends to AcmeStore and other businesses.
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Queue Principles
|
|
24
|
-
|
|
25
|
-
1. Single intake queue for all businesses
|
|
26
|
-
2. One active owner per queue item
|
|
27
|
-
3. Explicit agent, host, and power-level per item
|
|
28
|
-
4. Exit criteria required before status can move to Done
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Canonical Fields
|
|
33
|
-
|
|
34
|
-
| Field | Description |
|
|
35
|
-
|------|-------------|
|
|
36
|
-
| Queue ID | Unique work identifier |
|
|
37
|
-
| Business | `acme-store`, `example-app`, etc. |
|
|
38
|
-
| Repo | Target repo name |
|
|
39
|
-
| DevOps Item | Story/Task/Bug link or ID |
|
|
40
|
-
| Priority | Critical / High / Medium / Low |
|
|
41
|
-
| Assigned Agent | {AGENT_NAME}, Lafayette, Mercurio, Lince, etc. |
|
|
42
|
-
| Power Level | Apprentice/Wizard/Sorcerer/Magus/Archmage |
|
|
43
|
-
| Execution Host | Atlas, Voyager, Nimbus |
|
|
44
|
-
| Approval Gate | Required reviewer and checkpoint |
|
|
45
|
-
| Exit Criteria | Objective definition of done |
|
|
46
|
-
| Status | Backlog / Ready / In Progress / Blocked / Done |
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Initial Rollout
|
|
51
|
-
|
|
52
|
-
1. Start with {BUSINESS_NAME} items only.
|
|
53
|
-
2. Populate 5–10 current backlog items from Azure DevOps.
|
|
54
|
-
3. Validate assignment cadence for one week.
|
|
55
|
-
4. Extend same queue format to AcmeStore.
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## Next Action
|
|
60
|
-
|
|
61
|
-
Create the first queue instance document (dated journal or governance execution log) and seed it with open {BUSINESS_NAME} stories.
|
|
1
|
+
---
|
|
2
|
+
title: Agent Work Queue Model
|
|
3
|
+
audience: both
|
|
4
|
+
last_updated: YYYY-MM-DD
|
|
5
|
+
status: draft
|
|
6
|
+
distributable: true
|
|
7
|
+
tags: [governance, queue, agents, work-management]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Agent Work Queue Model
|
|
11
|
+
|
|
12
|
+
Defines a single markdown-first queue for assigning work across businesses, while keeping Azure DevOps at Story-level visibility per [[DECISIONS#ADR-015|ADR-015]].
|
|
13
|
+
|
|
14
|
+
## Executive Summary
|
|
15
|
+
|
|
16
|
+
- One queue controls cross-business assignment to avoid agent contention and hidden work.
|
|
17
|
+
- Markdown remains source of truth; Azure DevOps mirrors milestone status for humans.
|
|
18
|
+
- Queue rows include execution host and approval gate so autonomy stays explicit.
|
|
19
|
+
- {BUSINESS_NAME} starts first; same structure extends to AcmeStore and other businesses.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Queue Principles
|
|
24
|
+
|
|
25
|
+
1. Single intake queue for all businesses
|
|
26
|
+
2. One active owner per queue item
|
|
27
|
+
3. Explicit agent, host, and power-level per item
|
|
28
|
+
4. Exit criteria required before status can move to Done
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Canonical Fields
|
|
33
|
+
|
|
34
|
+
| Field | Description |
|
|
35
|
+
|------|-------------|
|
|
36
|
+
| Queue ID | Unique work identifier |
|
|
37
|
+
| Business | `acme-store`, `example-app`, etc. |
|
|
38
|
+
| Repo | Target repo name |
|
|
39
|
+
| DevOps Item | Story/Task/Bug link or ID |
|
|
40
|
+
| Priority | Critical / High / Medium / Low |
|
|
41
|
+
| Assigned Agent | {AGENT_NAME}, Lafayette, Mercurio, Lince, etc. |
|
|
42
|
+
| Power Level | Apprentice/Wizard/Sorcerer/Magus/Archmage |
|
|
43
|
+
| Execution Host | Atlas, Voyager, Nimbus |
|
|
44
|
+
| Approval Gate | Required reviewer and checkpoint |
|
|
45
|
+
| Exit Criteria | Objective definition of done |
|
|
46
|
+
| Status | Backlog / Ready / In Progress / Blocked / Done |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Initial Rollout
|
|
51
|
+
|
|
52
|
+
1. Start with {BUSINESS_NAME} items only.
|
|
53
|
+
2. Populate 5–10 current backlog items from Azure DevOps.
|
|
54
|
+
3. Validate assignment cadence for one week.
|
|
55
|
+
4. Extend same queue format to AcmeStore.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Next Action
|
|
60
|
+
|
|
61
|
+
Create the first queue instance document (dated journal or governance execution log) and seed it with open {BUSINESS_NAME} stories.
|
|
@@ -1,227 +1,227 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: CI/CD Standards
|
|
3
|
-
audience: both
|
|
4
|
-
last_updated: YYYY-MM-DD
|
|
5
|
-
status: active
|
|
6
|
-
tags: [cicd, pipelines, devops, prospero, azure-devops]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# CI/CD Standards
|
|
10
|
-
|
|
11
|
-
Pipeline patterns, branch policies, and deployment gates for all your projects. Owned by Prospero (DevOps Engineer).
|
|
12
|
-
|
|
13
|
-
## Executive Summary
|
|
14
|
-
|
|
15
|
-
- Every code repository must have a CI pipeline that runs on PR creation and merge to main.
|
|
16
|
-
- Branch policies enforce PR requirements: build must pass, reviewer required, work item linked.
|
|
17
|
-
- Terraform changes use plan-on-PR / apply-on-merge with manual approval gates.
|
|
18
|
-
- Prospero owns pipeline creation and maintenance across all repos.
|
|
19
|
-
- ADR-049 (Spell Loop) and ADR-051 (Prospero) provide the decision rationale.
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Pipeline Matrix
|
|
24
|
-
|
|
25
|
-
| Repo | Org | Pipeline | Triggers | Steps | Owner |
|
|
26
|
-
|------|-----|----------|----------|-------|-------|
|
|
27
|
-
| example-app / .NET backend | {ado-org} | Build + Test + Deploy | PR, merge to main | restore → build → test → deploy staging | Prospero |
|
|
28
|
-
| example-app / Mobile | {ado-org} | Build + Test | PR, merge to main | build → unit tests → integration tests → artifact publish | Prospero |
|
|
29
|
-
| example-app / Firmware | {ado-org} | Build + Test | PR, merge to main | PlatformIO build → unit tests → OTA artifact publish | Prospero |
|
|
30
|
-
| ops-docs / docs | {ado-org} | Lint + Link Check | PR | markdownlint → link validation → frontmatter schema check | Prospero |
|
|
31
|
-
| storefront / web | {ado-org} | Build + Deploy | PR, merge to main | build → deploy (platform-dependent) | Prospero |
|
|
32
|
-
| legacy-app / App | {ado-org} | Build + Test | PR, merge to main | dotnet restore → build → test | Prospero |
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Branch Policies (Azure DevOps)
|
|
37
|
-
|
|
38
|
-
Applied to all code repositories (not docs-only repos per ADR-048):
|
|
39
|
-
|
|
40
|
-
| Policy | Setting | Rationale |
|
|
41
|
-
|--------|---------|-----------|
|
|
42
|
-
| **Require PR** | All branches → main | No direct pushes to main |
|
|
43
|
-
| **Minimum reviewers** | 1 (Lince for code, Merlin for architecture) | Quality gate |
|
|
44
|
-
| **Build validation** | CI pipeline must pass | No merging broken code |
|
|
45
|
-
| **Work item linking** | Required (when ticketing active) | Traceability |
|
|
46
|
-
| **Comment resolution** | All comments must be resolved | No ignored feedback |
|
|
47
|
-
| **Merge type** | Squash merge or rebase (no merge commits) | Clean linear history |
|
|
48
|
-
|
|
49
|
-
For docs-only repos (Arcane):
|
|
50
|
-
- PR not required (ADR-048 allows local ff-only merge for docs)
|
|
51
|
-
- CI lint check runs on push to any branch
|
|
52
|
-
- Branch discipline still applies (branch → work → ff-only merge)
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## Pipeline Templates
|
|
57
|
-
|
|
58
|
-
### .NET Backend Pipeline
|
|
59
|
-
|
|
60
|
-
```yaml
|
|
61
|
-
# azure-pipelines.yml
|
|
62
|
-
trigger:
|
|
63
|
-
branches:
|
|
64
|
-
include:
|
|
65
|
-
- main
|
|
66
|
-
paths:
|
|
67
|
-
include:
|
|
68
|
-
- src/**
|
|
69
|
-
|
|
70
|
-
pr:
|
|
71
|
-
branches:
|
|
72
|
-
include:
|
|
73
|
-
- main
|
|
74
|
-
|
|
75
|
-
pool:
|
|
76
|
-
vmImage: 'ubuntu-latest'
|
|
77
|
-
|
|
78
|
-
steps:
|
|
79
|
-
- task: UseDotNet@2
|
|
80
|
-
inputs:
|
|
81
|
-
version: '10.x'
|
|
82
|
-
|
|
83
|
-
- script: dotnet restore
|
|
84
|
-
displayName: 'Restore packages'
|
|
85
|
-
|
|
86
|
-
- script: dotnet build --no-restore --configuration Release
|
|
87
|
-
displayName: 'Build'
|
|
88
|
-
|
|
89
|
-
- script: dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage" --results-directory $(Agent.TempDirectory)
|
|
90
|
-
displayName: 'Run tests'
|
|
91
|
-
|
|
92
|
-
- task: PublishCodeCoverageResults@2
|
|
93
|
-
inputs:
|
|
94
|
-
summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'
|
|
95
|
-
failIfCoverageEmpty: true
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Node.js Pipeline
|
|
99
|
-
|
|
100
|
-
```yaml
|
|
101
|
-
trigger:
|
|
102
|
-
branches:
|
|
103
|
-
include:
|
|
104
|
-
- main
|
|
105
|
-
|
|
106
|
-
pr:
|
|
107
|
-
branches:
|
|
108
|
-
include:
|
|
109
|
-
- main
|
|
110
|
-
|
|
111
|
-
pool:
|
|
112
|
-
vmImage: 'ubuntu-latest'
|
|
113
|
-
|
|
114
|
-
steps:
|
|
115
|
-
- task: UseNode@1
|
|
116
|
-
inputs:
|
|
117
|
-
version: '20.x'
|
|
118
|
-
|
|
119
|
-
- script: npm ci
|
|
120
|
-
displayName: 'Install dependencies'
|
|
121
|
-
|
|
122
|
-
- script: npm test
|
|
123
|
-
displayName: 'Run tests'
|
|
124
|
-
|
|
125
|
-
- script: npm run lint
|
|
126
|
-
displayName: 'Lint'
|
|
127
|
-
condition: succeededOrFailed()
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### Terraform Pipeline
|
|
131
|
-
|
|
132
|
-
```yaml
|
|
133
|
-
trigger: none # Manual only for apply
|
|
134
|
-
|
|
135
|
-
pr:
|
|
136
|
-
branches:
|
|
137
|
-
include:
|
|
138
|
-
- main
|
|
139
|
-
paths:
|
|
140
|
-
include:
|
|
141
|
-
- infrastructure/terraform/**
|
|
142
|
-
|
|
143
|
-
pool:
|
|
144
|
-
vmImage: 'ubuntu-latest'
|
|
145
|
-
|
|
146
|
-
steps:
|
|
147
|
-
- script: |
|
|
148
|
-
terraform init
|
|
149
|
-
terraform validate
|
|
150
|
-
displayName: 'Validate'
|
|
151
|
-
|
|
152
|
-
- script: terraform plan -out=tfplan
|
|
153
|
-
displayName: 'Plan'
|
|
154
|
-
|
|
155
|
-
- script: checkov -d . --framework terraform
|
|
156
|
-
displayName: 'Security scan (Checkov)'
|
|
157
|
-
|
|
158
|
-
# Apply step is manual — requires approval gate
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### Markdown Lint Pipeline
|
|
162
|
-
|
|
163
|
-
```yaml
|
|
164
|
-
trigger:
|
|
165
|
-
branches:
|
|
166
|
-
include:
|
|
167
|
-
- '**'
|
|
168
|
-
paths:
|
|
169
|
-
include:
|
|
170
|
-
- '**.md'
|
|
171
|
-
|
|
172
|
-
pool:
|
|
173
|
-
vmImage: 'ubuntu-latest'
|
|
174
|
-
|
|
175
|
-
steps:
|
|
176
|
-
- task: UseNode@1
|
|
177
|
-
inputs:
|
|
178
|
-
version: '20.x'
|
|
179
|
-
|
|
180
|
-
- script: npx markdownlint-cli2 "**/*.md" "#node_modules"
|
|
181
|
-
displayName: 'Lint markdown'
|
|
182
|
-
|
|
183
|
-
- script: npx markdown-link-check --config .markdown-link-check.json **/*.md
|
|
184
|
-
displayName: 'Check links'
|
|
185
|
-
condition: succeededOrFailed()
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## Deployment Gates
|
|
191
|
-
|
|
192
|
-
| Environment | Gate | Who Approves |
|
|
193
|
-
|-------------|------|-------------|
|
|
194
|
-
| **Staging** | CI passes + PR approved | Automatic on merge |
|
|
195
|
-
| **Production** | Staging verified + manual approval | Human (operator) |
|
|
196
|
-
| **Terraform apply** | Plan reviewed + Checkov clean | Human (operator) |
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## Prospero's Responsibilities
|
|
201
|
-
|
|
202
|
-
1. **Create and maintain all CI/CD pipelines** across Azure DevOps organizations
|
|
203
|
-
2. **Configure branch policies** per repo risk level
|
|
204
|
-
3. **Monitor pipeline health** — alert on persistent failures
|
|
205
|
-
4. **Manage Terraform state** — ensure remote state backend is configured
|
|
206
|
-
5. **Set up Azure cost alerts** — per resource group, per business
|
|
207
|
-
6. **Security scanning** — Checkov for Terraform, dependency audits for code repos
|
|
208
|
-
7. **Deployment automation** — Azure Functions, App Service, container deployments
|
|
209
|
-
8. **Documentation** — keep this file and pipeline configs in sync
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## Implementation Priority
|
|
214
|
-
|
|
215
|
-
1. WidgetApp .NET backend pipeline (highest business priority)
|
|
216
|
-
2. ops docs lint pipeline (catches documentation drift)
|
|
217
|
-
3. WidgetApp mobile pipeline (when mobile development begins)
|
|
218
|
-
4. WidgetApp firmware pipeline (when firmware work resumes)
|
|
219
|
-
5. Terraform pipeline (when new Azure resources are provisioned)
|
|
220
|
-
6. AcmeStore pipeline (when platform is selected)
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
## Related
|
|
224
|
-
|
|
225
|
-
- [[DECISIONS]]
|
|
226
|
-
- [[governance/development-methodology|Development Methodology]]
|
|
227
|
-
- [[governance/testing-standards|Testing Standards]]
|
|
1
|
+
---
|
|
2
|
+
title: CI/CD Standards
|
|
3
|
+
audience: both
|
|
4
|
+
last_updated: YYYY-MM-DD
|
|
5
|
+
status: active
|
|
6
|
+
tags: [cicd, pipelines, devops, prospero, azure-devops]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# CI/CD Standards
|
|
10
|
+
|
|
11
|
+
Pipeline patterns, branch policies, and deployment gates for all your projects. Owned by Prospero (DevOps Engineer).
|
|
12
|
+
|
|
13
|
+
## Executive Summary
|
|
14
|
+
|
|
15
|
+
- Every code repository must have a CI pipeline that runs on PR creation and merge to main.
|
|
16
|
+
- Branch policies enforce PR requirements: build must pass, reviewer required, work item linked.
|
|
17
|
+
- Terraform changes use plan-on-PR / apply-on-merge with manual approval gates.
|
|
18
|
+
- Prospero owns pipeline creation and maintenance across all repos.
|
|
19
|
+
- ADR-049 (Spell Loop) and ADR-051 (Prospero) provide the decision rationale.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Pipeline Matrix
|
|
24
|
+
|
|
25
|
+
| Repo | Org | Pipeline | Triggers | Steps | Owner |
|
|
26
|
+
|------|-----|----------|----------|-------|-------|
|
|
27
|
+
| example-app / .NET backend | {ado-org} | Build + Test + Deploy | PR, merge to main | restore → build → test → deploy staging | Prospero |
|
|
28
|
+
| example-app / Mobile | {ado-org} | Build + Test | PR, merge to main | build → unit tests → integration tests → artifact publish | Prospero |
|
|
29
|
+
| example-app / Firmware | {ado-org} | Build + Test | PR, merge to main | PlatformIO build → unit tests → OTA artifact publish | Prospero |
|
|
30
|
+
| ops-docs / docs | {ado-org} | Lint + Link Check | PR | markdownlint → link validation → frontmatter schema check | Prospero |
|
|
31
|
+
| storefront / web | {ado-org} | Build + Deploy | PR, merge to main | build → deploy (platform-dependent) | Prospero |
|
|
32
|
+
| legacy-app / App | {ado-org} | Build + Test | PR, merge to main | dotnet restore → build → test | Prospero |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Branch Policies (Azure DevOps)
|
|
37
|
+
|
|
38
|
+
Applied to all code repositories (not docs-only repos per ADR-048):
|
|
39
|
+
|
|
40
|
+
| Policy | Setting | Rationale |
|
|
41
|
+
|--------|---------|-----------|
|
|
42
|
+
| **Require PR** | All branches → main | No direct pushes to main |
|
|
43
|
+
| **Minimum reviewers** | 1 (Lince for code, Merlin for architecture) | Quality gate |
|
|
44
|
+
| **Build validation** | CI pipeline must pass | No merging broken code |
|
|
45
|
+
| **Work item linking** | Required (when ticketing active) | Traceability |
|
|
46
|
+
| **Comment resolution** | All comments must be resolved | No ignored feedback |
|
|
47
|
+
| **Merge type** | Squash merge or rebase (no merge commits) | Clean linear history |
|
|
48
|
+
|
|
49
|
+
For docs-only repos (Arcane):
|
|
50
|
+
- PR not required (ADR-048 allows local ff-only merge for docs)
|
|
51
|
+
- CI lint check runs on push to any branch
|
|
52
|
+
- Branch discipline still applies (branch → work → ff-only merge)
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Pipeline Templates
|
|
57
|
+
|
|
58
|
+
### .NET Backend Pipeline
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
# azure-pipelines.yml
|
|
62
|
+
trigger:
|
|
63
|
+
branches:
|
|
64
|
+
include:
|
|
65
|
+
- main
|
|
66
|
+
paths:
|
|
67
|
+
include:
|
|
68
|
+
- src/**
|
|
69
|
+
|
|
70
|
+
pr:
|
|
71
|
+
branches:
|
|
72
|
+
include:
|
|
73
|
+
- main
|
|
74
|
+
|
|
75
|
+
pool:
|
|
76
|
+
vmImage: 'ubuntu-latest'
|
|
77
|
+
|
|
78
|
+
steps:
|
|
79
|
+
- task: UseDotNet@2
|
|
80
|
+
inputs:
|
|
81
|
+
version: '10.x'
|
|
82
|
+
|
|
83
|
+
- script: dotnet restore
|
|
84
|
+
displayName: 'Restore packages'
|
|
85
|
+
|
|
86
|
+
- script: dotnet build --no-restore --configuration Release
|
|
87
|
+
displayName: 'Build'
|
|
88
|
+
|
|
89
|
+
- script: dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage" --results-directory $(Agent.TempDirectory)
|
|
90
|
+
displayName: 'Run tests'
|
|
91
|
+
|
|
92
|
+
- task: PublishCodeCoverageResults@2
|
|
93
|
+
inputs:
|
|
94
|
+
summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'
|
|
95
|
+
failIfCoverageEmpty: true
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Node.js Pipeline
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
trigger:
|
|
102
|
+
branches:
|
|
103
|
+
include:
|
|
104
|
+
- main
|
|
105
|
+
|
|
106
|
+
pr:
|
|
107
|
+
branches:
|
|
108
|
+
include:
|
|
109
|
+
- main
|
|
110
|
+
|
|
111
|
+
pool:
|
|
112
|
+
vmImage: 'ubuntu-latest'
|
|
113
|
+
|
|
114
|
+
steps:
|
|
115
|
+
- task: UseNode@1
|
|
116
|
+
inputs:
|
|
117
|
+
version: '20.x'
|
|
118
|
+
|
|
119
|
+
- script: npm ci
|
|
120
|
+
displayName: 'Install dependencies'
|
|
121
|
+
|
|
122
|
+
- script: npm test
|
|
123
|
+
displayName: 'Run tests'
|
|
124
|
+
|
|
125
|
+
- script: npm run lint
|
|
126
|
+
displayName: 'Lint'
|
|
127
|
+
condition: succeededOrFailed()
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Terraform Pipeline
|
|
131
|
+
|
|
132
|
+
```yaml
|
|
133
|
+
trigger: none # Manual only for apply
|
|
134
|
+
|
|
135
|
+
pr:
|
|
136
|
+
branches:
|
|
137
|
+
include:
|
|
138
|
+
- main
|
|
139
|
+
paths:
|
|
140
|
+
include:
|
|
141
|
+
- infrastructure/terraform/**
|
|
142
|
+
|
|
143
|
+
pool:
|
|
144
|
+
vmImage: 'ubuntu-latest'
|
|
145
|
+
|
|
146
|
+
steps:
|
|
147
|
+
- script: |
|
|
148
|
+
terraform init
|
|
149
|
+
terraform validate
|
|
150
|
+
displayName: 'Validate'
|
|
151
|
+
|
|
152
|
+
- script: terraform plan -out=tfplan
|
|
153
|
+
displayName: 'Plan'
|
|
154
|
+
|
|
155
|
+
- script: checkov -d . --framework terraform
|
|
156
|
+
displayName: 'Security scan (Checkov)'
|
|
157
|
+
|
|
158
|
+
# Apply step is manual — requires approval gate
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Markdown Lint Pipeline
|
|
162
|
+
|
|
163
|
+
```yaml
|
|
164
|
+
trigger:
|
|
165
|
+
branches:
|
|
166
|
+
include:
|
|
167
|
+
- '**'
|
|
168
|
+
paths:
|
|
169
|
+
include:
|
|
170
|
+
- '**.md'
|
|
171
|
+
|
|
172
|
+
pool:
|
|
173
|
+
vmImage: 'ubuntu-latest'
|
|
174
|
+
|
|
175
|
+
steps:
|
|
176
|
+
- task: UseNode@1
|
|
177
|
+
inputs:
|
|
178
|
+
version: '20.x'
|
|
179
|
+
|
|
180
|
+
- script: npx markdownlint-cli2 "**/*.md" "#node_modules"
|
|
181
|
+
displayName: 'Lint markdown'
|
|
182
|
+
|
|
183
|
+
- script: npx markdown-link-check --config .markdown-link-check.json **/*.md
|
|
184
|
+
displayName: 'Check links'
|
|
185
|
+
condition: succeededOrFailed()
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Deployment Gates
|
|
191
|
+
|
|
192
|
+
| Environment | Gate | Who Approves |
|
|
193
|
+
|-------------|------|-------------|
|
|
194
|
+
| **Staging** | CI passes + PR approved | Automatic on merge |
|
|
195
|
+
| **Production** | Staging verified + manual approval | Human (operator) |
|
|
196
|
+
| **Terraform apply** | Plan reviewed + Checkov clean | Human (operator) |
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Prospero's Responsibilities
|
|
201
|
+
|
|
202
|
+
1. **Create and maintain all CI/CD pipelines** across Azure DevOps organizations
|
|
203
|
+
2. **Configure branch policies** per repo risk level
|
|
204
|
+
3. **Monitor pipeline health** — alert on persistent failures
|
|
205
|
+
4. **Manage Terraform state** — ensure remote state backend is configured
|
|
206
|
+
5. **Set up Azure cost alerts** — per resource group, per business
|
|
207
|
+
6. **Security scanning** — Checkov for Terraform, dependency audits for code repos
|
|
208
|
+
7. **Deployment automation** — Azure Functions, App Service, container deployments
|
|
209
|
+
8. **Documentation** — keep this file and pipeline configs in sync
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Implementation Priority
|
|
214
|
+
|
|
215
|
+
1. WidgetApp .NET backend pipeline (highest business priority)
|
|
216
|
+
2. ops docs lint pipeline (catches documentation drift)
|
|
217
|
+
3. WidgetApp mobile pipeline (when mobile development begins)
|
|
218
|
+
4. WidgetApp firmware pipeline (when firmware work resumes)
|
|
219
|
+
5. Terraform pipeline (when new Azure resources are provisioned)
|
|
220
|
+
6. AcmeStore pipeline (when platform is selected)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
## Related
|
|
224
|
+
|
|
225
|
+
- [[DECISIONS]]
|
|
226
|
+
- [[governance/development-methodology|Development Methodology]]
|
|
227
|
+
- [[governance/testing-standards|Testing Standards]]
|