@event4u/agent-config 8.9.0 → 8.10.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +41 -0
- package/README.md +5 -5
- package/dist/agent-src/commands/cost/report.md +13 -3
- package/dist/agent-src/commands/tests/create.md +28 -6
- package/dist/agent-src/commands/work.md +33 -0
- package/dist/agent-src/commands/worktree/cleanup.md +78 -0
- package/dist/agent-src/commands/worktree/create.md +62 -0
- package/dist/agent-src/commands/worktree/status.md +63 -0
- package/dist/agent-src/commands/worktree/verify.md +70 -0
- package/dist/agent-src/commands/worktree.md +85 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +47 -34
- package/dist/agent-src/rules/design-fidelity.md +40 -0
- package/dist/agent-src/rules/spreadsheet-source-quality.md +61 -0
- package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +15 -0
- package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +13 -0
- package/dist/agent-src/skills/api-testing/SKILL.md +15 -1
- package/dist/agent-src/skills/character-consistency/evals/evals.json +16 -0
- package/dist/agent-src/skills/command-routing/evals/evals.json +14 -0
- package/dist/agent-src/skills/dashboard-design/evals/evals.json +16 -0
- package/dist/agent-src/skills/dcf-modeling/evals/evals.json +20 -0
- package/dist/agent-src/skills/decision-record/evals/evals.json +20 -0
- package/dist/agent-src/skills/design-intelligence/evals/evals.json +14 -0
- package/dist/agent-src/skills/design-review/SKILL.md +6 -0
- package/dist/agent-src/skills/design-system-capture/SKILL.md +21 -0
- package/dist/agent-src/skills/design-system-capture/evals/evals.json +15 -0
- package/dist/agent-src/skills/developer-like-execution/evals/evals.json +16 -0
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +27 -0
- package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +16 -0
- package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +16 -0
- package/dist/agent-src/skills/editorial-calendar/evals/evals.json +16 -0
- package/dist/agent-src/skills/estimate-ticket/evals/evals.json +16 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +30 -0
- package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +47 -0
- package/dist/agent-src/skills/fe-design/SKILL.md +36 -5
- package/dist/agent-src/skills/fe-design/evals/triggers.json +47 -0
- package/dist/agent-src/skills/forecasting/evals/evals.json +20 -0
- package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +16 -0
- package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +16 -0
- package/dist/agent-src/skills/html-deck/SKILL.md +27 -0
- package/dist/agent-src/skills/iconography/SKILL.md +24 -0
- package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +16 -0
- package/dist/agent-src/skills/incident-commander/evals/evals.json +20 -0
- package/dist/agent-src/skills/launch-readiness/evals/evals.json +21 -0
- package/dist/agent-src/skills/logging-monitoring/evals/evals.json +16 -0
- package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +16 -0
- package/dist/agent-src/skills/messaging-architecture/evals/evals.json +16 -0
- package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +16 -0
- package/dist/agent-src/skills/pest-testing/SKILL.md +1 -1
- package/dist/agent-src/skills/playwright-testing/SKILL.md +16 -0
- package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +16 -0
- package/dist/agent-src/skills/refine-prompt/evals/evals.json +16 -0
- package/dist/agent-src/skills/refine-ticket/evals/evals.json +16 -0
- package/dist/agent-src/skills/release-comms/evals/evals.json +16 -0
- package/dist/agent-src/skills/rice-prioritization/evals/evals.json +20 -0
- package/dist/agent-src/skills/runway-cognition/evals/evals.json +20 -0
- package/dist/agent-src/skills/scenario-modeling/evals/evals.json +20 -0
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +98 -0
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +47 -0
- package/dist/agent-src/skills/systematic-debugging/evals/evals.json +20 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +118 -0
- package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +52 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +32 -6
- package/dist/agent-src/skills/test-driven-development/evals/evals.json +16 -0
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +7 -6
- package/dist/agent-src/skills/threat-modeling/evals/evals.json +21 -0
- package/dist/agent-src/skills/typography-system/evals/evals.json +14 -0
- package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +24 -0
- package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +16 -0
- package/dist/agent-src/skills/vision-articulation/evals/evals.json +16 -0
- package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +16 -0
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +180 -0
- package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +52 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +249 -32
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +6 -6
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +22 -13
- package/dist/discovery/trust-report.md +4 -4
- package/dist/discovery/workspaces.json +22 -11
- package/dist/mcp/registry-manifest.json +2 -2
- package/dist/router.json +1 -1
- package/docs/CLAIMS.md +3 -3
- package/docs/architecture.md +3 -3
- package/docs/catalog.md +19 -8
- package/docs/command-flows.md +6 -1
- package/docs/contracts/CHANGELOG-conventions.md +6 -0
- package/docs/contracts/design-artifact-lifecycle.md +93 -0
- package/docs/contracts/design-artifact-verification.md +30 -1
- package/docs/contracts/release-pr-gating.md +26 -0
- package/docs/contracts/release-sizing.md +85 -0
- package/docs/contracts/surface-agent-contracts.md +153 -0
- package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +1 -1
- package/docs/distribution/consumer-matrix.md +96 -0
- package/docs/featured-skills.md +2 -2
- package/docs/getting-started-by-role.md +1 -1
- package/docs/getting-started.md +2 -2
- package/docs/governance-advantage.md +1 -1
- package/docs/proof.md +4 -4
- package/docs/release-runbook.md +3 -0
- package/docs/self-review-gate.md +51 -0
- package/package.json +1 -1
- package/src/scripts/_lib/orchestration_record.ts +13 -0
- package/src/scripts/_lib/orchestration_savings.ts +52 -0
- package/src/scripts/check_release_adjacent_health.ts +121 -0
- package/src/scripts/check_rule_invariants.ts +275 -0
- package/src/scripts/consumer_matrix.ts +353 -0
- package/src/scripts/generate_index.ts +3 -2
- package/src/scripts/lint_changelog_rollback.ts +293 -0
- package/src/scripts/orchestration_record.ts +16 -0
- package/src/scripts/orchestration_savings_report.ts +36 -3
- package/src/scripts/second_brain_retrieval.ts +44 -2
- package/src/scripts/self_review_gate.test.ts +65 -0
- package/src/scripts/self_review_gate.ts +272 -0
- package/src/scripts/trigger_eval_grandfather.json +223 -224
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "voice-and-tone-design",
|
|
3
|
+
"_calibration": "Behavioural fixture (road-to-skill-eval-coverage Phase 2, default-surface). Deterministic assertions on a real output property where reliable; rubric pins the qualitative core as a known-limit (pass ratified in PR review, not a hidden judge). finding_floor n is a conservative floor, not a calibrated per-host number.",
|
|
4
|
+
"scenarios": [
|
|
5
|
+
{
|
|
6
|
+
"id": "define-voice",
|
|
7
|
+
"prompt": "Define the brand voice and tone for our fintech product.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
{
|
|
10
|
+
"kind": "rubric",
|
|
11
|
+
"criterion": "Produces named voice attributes with do/don't examples and a tone-by-context matrix, grounded in the audience — not adjectives alone."
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
model_tier: medium
|
|
3
|
+
name: worktree-lifecycle
|
|
4
|
+
description: "Use when governing a worktree across its whole life — scope-lock declaration, merge-readiness status, scoped verification, and safe cleanup that refuses while unique unmerged commits exist."
|
|
5
|
+
domain: process
|
|
6
|
+
workspaces:
|
|
7
|
+
- engineering
|
|
8
|
+
packs:
|
|
9
|
+
- engineering-base
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# worktree-lifecycle
|
|
13
|
+
|
|
14
|
+
Governance layer for worktrees that already exist (or are about to).
|
|
15
|
+
Creation mechanics — directory convention, ignore-safety, clean
|
|
16
|
+
baseline — live in [`using-git-worktrees`](../using-git-worktrees/SKILL.md)
|
|
17
|
+
and are **referenced, never restated** here. This skill owns everything
|
|
18
|
+
after the spawn: what the worktree is allowed to touch, when it is
|
|
19
|
+
merge-ready, and when it may be removed.
|
|
20
|
+
|
|
21
|
+
## When to use
|
|
22
|
+
|
|
23
|
+
* Deciding whether a task should be isolated in a worktree at all
|
|
24
|
+
* Declaring **which paths a worktree owns** so parallel agents stay disjoint
|
|
25
|
+
* Answering "is this worktree merge-ready?" — status, dirty state,
|
|
26
|
+
ahead/behind, verification evidence
|
|
27
|
+
* Running the scoped verification for a worktree's declared change
|
|
28
|
+
* Removing a finished worktree without losing commits
|
|
29
|
+
|
|
30
|
+
Do NOT use when:
|
|
31
|
+
|
|
32
|
+
* Creating the worktree — that is [`using-git-worktrees`](../using-git-worktrees/SKILL.md)
|
|
33
|
+
(Iron Law: no worktree without verified ignore + clean baseline)
|
|
34
|
+
* Plain branch work (switch, rebase, PR) without worktree isolation —
|
|
35
|
+
[`git-workflow`](../git-workflow/SKILL.md)
|
|
36
|
+
* Picking a subagent-orchestration mode — `subagent-orchestration`
|
|
37
|
+
selects the mode; this skill governs the worktrees a chosen mode uses
|
|
38
|
+
|
|
39
|
+
## The Iron Law
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
EVERY GOVERNED WORKTREE DECLARES ITS SCOPE. NO REMOVAL WHILE
|
|
43
|
+
UNIQUE UNMERGED COMMITS EXIST. INHERITED COMMITS ARE NEVER DROPPED.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Procedure
|
|
47
|
+
|
|
48
|
+
### 1. Decide isolation
|
|
49
|
+
|
|
50
|
+
Isolate when **any** holds; otherwise stay on the current branch
|
|
51
|
+
(per the Do-NOT list in `using-git-worktrees`):
|
|
52
|
+
|
|
53
|
+
* Parallel agents/sessions must not share a working directory
|
|
54
|
+
* The current branch is mid-work and a stash/switch would risk state
|
|
55
|
+
* The change is exploratory and may be thrown away whole
|
|
56
|
+
* A long-running build/test occupies the current worktree
|
|
57
|
+
|
|
58
|
+
Then create via [`using-git-worktrees`](../using-git-worktrees/SKILL.md)
|
|
59
|
+
(or the host primitive — § Host-native mapping below), declare the
|
|
60
|
+
scope lock (§ 2), keep status honest (§ 3), and gate removal (§ 4).
|
|
61
|
+
|
|
62
|
+
### 2. Scope lock
|
|
63
|
+
|
|
64
|
+
At worktree start, write a `.worktree-scope.md` note at the worktree
|
|
65
|
+
root and keep it untracked via `.git/info/exclude` (shared exclude —
|
|
66
|
+
one line `.worktree-scope.md`, no commit needed):
|
|
67
|
+
|
|
68
|
+
## Scope lock
|
|
69
|
+
- branch: <branch-name>
|
|
70
|
+
- owns: <path or glob list — the ONLY paths this worktree edits>
|
|
71
|
+
- task: <one-line task statement>
|
|
72
|
+
- created: <ISO date>
|
|
73
|
+
|
|
74
|
+
The lock is the disjointness contract between parallel worktrees. A
|
|
75
|
+
diff that leaves the owned paths is scope creep — stop and surface,
|
|
76
|
+
per `scope-control`. Check mechanically:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
git diff --name-only "$(git merge-base HEAD <base>)"..HEAD
|
|
80
|
+
# every path must match an `owns:` entry
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 3. Status / merge-ready checklist
|
|
84
|
+
|
|
85
|
+
A worktree is **merge-ready** only when ALL hold:
|
|
86
|
+
|
|
87
|
+
1. **Clean tree** — `git status --porcelain` is empty.
|
|
88
|
+
2. **Scope lock respected** — changed files ⊆ `owns:` paths (command above).
|
|
89
|
+
3. **Verification evidence attached** — the scoped probe for the
|
|
90
|
+
declared change ran fresh and passed (per `verify-before-complete`);
|
|
91
|
+
record command + result tail in the status report. No fresh
|
|
92
|
+
evidence → not merge-ready, regardless of how the diff looks.
|
|
93
|
+
4. **Ahead/behind known** — `git fetch origin --quiet` then
|
|
94
|
+
`git rev-list --left-right --count HEAD...origin/<base>`. Behind →
|
|
95
|
+
flag; divergent (both sides non-zero on a pushed branch) → route to
|
|
96
|
+
[`git-workflow § Divergent-State Recovery`](../git-workflow/SKILL.md#procedure-divergent-state-recovery).
|
|
97
|
+
5. **No inherited-commit drops** — commits on the branch that this
|
|
98
|
+
session did not author stay on the branch; never rebase-out,
|
|
99
|
+
reset-away, or exclude them (rule `git-history-discipline`,
|
|
100
|
+
shared-branch Iron Law).
|
|
101
|
+
|
|
102
|
+
### 4. Cleanup discipline
|
|
103
|
+
|
|
104
|
+
Removal is gated, in order:
|
|
105
|
+
|
|
106
|
+
1. **Dirty check** — `git status --porcelain` in the worktree non-empty
|
|
107
|
+
→ refuse (`git worktree remove` refuses too; never answer with
|
|
108
|
+
`--force`).
|
|
109
|
+
2. **Unique-commit check** — commits reachable from the worktree branch
|
|
110
|
+
but from **no other ref** (branches, remotes, tags):
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
git log <branch> --oneline --not \
|
|
114
|
+
$(git for-each-ref --format='%(refname)' | grep -v "^refs/heads/<branch>$")
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Non-empty → **refuse removal**; the branch holds work that exists
|
|
118
|
+
nowhere else. Surface the commit list and hand back — merging or
|
|
119
|
+
preserving them is the user's call (`git-history-discipline`).
|
|
120
|
+
Empty → removal allowed.
|
|
121
|
+
3. **Remove, never delete** — `git worktree remove <path>`, then
|
|
122
|
+
`git worktree prune`. Branch deletion is a separate, permission-gated
|
|
123
|
+
step (`scope-control`); never force-delete (`-D`) as part of cleanup.
|
|
124
|
+
|
|
125
|
+
## Host-native mapping
|
|
126
|
+
|
|
127
|
+
| Host capability | Use |
|
|
128
|
+
|---|---|
|
|
129
|
+
| Claude Code `EnterWorktree` / `ExitWorktree` | Enter/leave a governed worktree in-session; scope lock is written right after enter |
|
|
130
|
+
| Claude Code subagent `isolation: "worktree"` | Dispatch a slice into its own auto-managed worktree; unchanged worktrees are auto-cleaned by the host — the unique-commit gate still applies to any it leaves behind |
|
|
131
|
+
| No worktree primitive (other hosts) | Degrade to plain `git worktree add` per [`using-git-worktrees`](../using-git-worktrees/SKILL.md) § Procedure — same scope lock, same gates |
|
|
132
|
+
|
|
133
|
+
The mapping changes only who creates the directory. Scope lock,
|
|
134
|
+
merge-ready checklist, and cleanup gates are host-independent.
|
|
135
|
+
|
|
136
|
+
## Gotcha
|
|
137
|
+
|
|
138
|
+
* **`git log <branch> --not --all` is always empty** — `--all` includes
|
|
139
|
+
the branch itself, so the naive check never fires. The
|
|
140
|
+
`--exclude="refs/heads/<branch>" --all` variant is also unreliable
|
|
141
|
+
when combined with `--not` (observed on git 2.39). Use the
|
|
142
|
+
`for-each-ref` expansion above — it enumerates every ref except the
|
|
143
|
+
branch explicitly.
|
|
144
|
+
* **Scope note committed by accident** — `.worktree-scope.md` must be
|
|
145
|
+
in `.git/info/exclude`; `.gitignore` would be a tracked change
|
|
146
|
+
outside the scope lock.
|
|
147
|
+
* **"Unchanged worktree" ≠ "no unique commits"** — a host auto-clean
|
|
148
|
+
only covers worktrees with no changes; a worktree with committed but
|
|
149
|
+
unmerged work still needs the unique-commit gate.
|
|
150
|
+
* **Stale ahead/behind** — always `git fetch` before the
|
|
151
|
+
`rev-list --left-right` count; a cached view reports merge-ready on
|
|
152
|
+
a diverged branch.
|
|
153
|
+
|
|
154
|
+
## Output format
|
|
155
|
+
|
|
156
|
+
1. **Worktree** — path + branch, and the scope-lock `owns:` list
|
|
157
|
+
2. **State** — clean/dirty, ahead/behind vs base, merge-ready verdict
|
|
158
|
+
with the failing checklist item named when not ready
|
|
159
|
+
3. **Evidence** — verification command(s) run + result tail, or
|
|
160
|
+
"none attached" stated explicitly
|
|
161
|
+
4. **Next step** — merge path, missing verification, or cleanup verdict
|
|
162
|
+
(allowed / refused with the unique-commit list)
|
|
163
|
+
|
|
164
|
+
## Do NOT
|
|
165
|
+
|
|
166
|
+
* NEVER remove a worktree whose branch has commits on no other ref
|
|
167
|
+
* NEVER `git worktree remove --force` past a dirty tree
|
|
168
|
+
* NEVER drop, rebase-out, or reset-away inherited commits (rule
|
|
169
|
+
`git-history-discipline`)
|
|
170
|
+
* NEVER report merge-ready without fresh verification evidence
|
|
171
|
+
* NEVER edit outside the scope-lock `owns:` paths without surfacing it
|
|
172
|
+
|
|
173
|
+
## Handover
|
|
174
|
+
|
|
175
|
+
| Task | Skill / command |
|
|
176
|
+
|---|---|
|
|
177
|
+
| Creating the worktree (ignore-safety, baseline) | [`using-git-worktrees`](../using-git-worktrees/SKILL.md) |
|
|
178
|
+
| Divergence recovery, safe squash, PR flow | [`git-workflow`](../git-workflow/SKILL.md) |
|
|
179
|
+
| Finishing the branch | `finishing-a-development-branch` |
|
|
180
|
+
| Day-to-day operations | `/worktree create` · `status` · `verify` · `cleanup` |
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "worktree-lifecycle",
|
|
3
|
+
"last_eval": "2026-07-10",
|
|
4
|
+
"description": "5 should-trigger + 5 should-not-trigger queries. Should-trigger covers DE + EN phrasings for worktree governance (scope lock, merge-readiness status, scoped verification, safe cleanup). Should-not-trigger covers the near-miss neighbours (plain branch switch, git-worktree info question, subagent-orchestration mode selection, worktree creation mechanics, remote branch deletion) whose vocabulary overlaps.",
|
|
5
|
+
"queries": [
|
|
6
|
+
{
|
|
7
|
+
"q": "declare a scope lock for this worktree before I start editing",
|
|
8
|
+
"trigger": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"q": "is this worktree merge-ready? check dirty state, ahead/behind and verification evidence",
|
|
12
|
+
"trigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"q": "clean up the finished worktrees but make sure no unmerged commits get lost",
|
|
16
|
+
"trigger": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"q": "welche Worktrees sind noch aktiv, und welche Pfade gehören welchem Worktree?",
|
|
20
|
+
"trigger": true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"q": "run the scoped verification for the change in this worktree, not the full CI",
|
|
24
|
+
"trigger": true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"q": "switch to the feature branch and continue working there",
|
|
28
|
+
"trigger": false,
|
|
29
|
+
"note": "plain branch switch, no worktree governance → git-workflow"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"q": "what does the output of git worktree list mean?",
|
|
33
|
+
"trigger": false,
|
|
34
|
+
"note": "git info question, not lifecycle governance"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"q": "which subagent-orchestration mode should I pick for these three independent tasks?",
|
|
38
|
+
"trigger": false,
|
|
39
|
+
"note": "mode selection → subagent-orchestration; worktrees only enter after a mode is chosen"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"q": "spawn a worktree with ignore-safety checks and a clean test baseline for this refactor",
|
|
43
|
+
"trigger": false,
|
|
44
|
+
"note": "creation mechanics → using-git-worktrees"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"q": "delete the old release branch on origin",
|
|
48
|
+
"trigger": false,
|
|
49
|
+
"note": "remote branch deletion, no worktree involved → git-workflow (permission-gated)"
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
@@ -39,7 +39,7 @@ schema_version: 1
|
|
|
39
39
|
# CI guard: a release bump of `package.json` must update this value
|
|
40
40
|
# in lockstep — see scripts/check_template_pin_drift.ts (road-to-
|
|
41
41
|
# portable-runtime-and-update-check P3.3).
|
|
42
|
-
agent_config_version: "8.
|
|
42
|
+
agent_config_version: "8.10.0"
|
|
43
43
|
|
|
44
44
|
# --- Project identity ---
|
|
45
45
|
project:
|