codeforge-dev 1.10.0 → 1.11.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.
Files changed (45) hide show
  1. package/.devcontainer/CHANGELOG.md +69 -0
  2. package/.devcontainer/CLAUDE.md +15 -6
  3. package/.devcontainer/README.md +22 -11
  4. package/.devcontainer/config/defaults/main-system-prompt.md +104 -152
  5. package/.devcontainer/config/defaults/rules/session-search.md +66 -0
  6. package/.devcontainer/config/defaults/rules/spec-workflow.md +39 -12
  7. package/.devcontainer/config/defaults/settings.json +2 -1
  8. package/.devcontainer/config/defaults/writing-system-prompt.md +143 -0
  9. package/.devcontainer/config/file-manifest.json +12 -0
  10. package/.devcontainer/devcontainer.json +9 -2
  11. package/.devcontainer/features/ccms/README.md +50 -0
  12. package/.devcontainer/features/ccms/devcontainer-feature.json +21 -0
  13. package/.devcontainer/features/ccms/install.sh +105 -0
  14. package/.devcontainer/features/ccstatusline/install.sh +24 -2
  15. package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +8 -1
  16. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +1 -0
  17. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +1 -1
  18. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +4 -4
  19. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +1 -0
  20. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +8 -8
  21. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +10 -0
  22. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/skill-suggester.cpython-314.pyc +0 -0
  23. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/git-state-injector.py +15 -4
  24. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/inject-cwd.py +37 -0
  25. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +24 -0
  26. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/spec-reminder.py +3 -2
  27. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-build/SKILL.md +353 -0
  28. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-build/references/review-checklist.md +175 -0
  29. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-check/SKILL.md +15 -14
  30. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/SKILL.md +12 -11
  31. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/backlog-template.md +1 -1
  32. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/milestones-template.md +32 -0
  33. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/SKILL.md +17 -18
  34. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/references/template.md +12 -2
  35. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-review/SKILL.md +229 -0
  36. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-update/SKILL.md +6 -2
  37. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +1 -1
  38. package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/.claude-plugin/plugin.json +38 -5
  39. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/.claude-plugin/plugin.json +7 -0
  40. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/hooks/hooks.json +17 -0
  41. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/__pycache__/guard-workspace-scope.cpython-314.pyc +0 -0
  42. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/guard-workspace-scope.py +132 -0
  43. package/.devcontainer/scripts/setup-aliases.sh +68 -75
  44. package/package.json +1 -1
  45. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/roadmap-template.md +0 -33
@@ -1,5 +1,74 @@
1
1
  # CodeForge Devcontainer Changelog
2
2
 
3
+ ## [v1.11.0] - 2026-02-17
4
+
5
+ ### Added
6
+
7
+ #### New Feature: ccms (Session History Search)
8
+ - **`ccms` devcontainer feature** — Rust-based CLI for searching Claude Code session JSONL files. Installed via `cargo install`. Supports boolean queries, role filtering, time scoping, project isolation, and JSON output
9
+ - **`session-search.md` rule** — global rule requiring project-scoped `ccms` usage and documenting CLI flags/query syntax
10
+ - **Rust runtime** — added `ghcr.io/devcontainers/features/rust:1` as a devcontainer feature (required by ccms)
11
+ - **System prompt `<session_search>` section** — inline reference for ccms usage with key flags and examples
12
+ - **Context management updated** — `<context_management>` now references ccms as the primary recovery tool for compacted sessions (three-source recovery: session history → source files → plan/requirement files)
13
+
14
+ #### New Feature: ccw (Writing Mode)
15
+ - **`ccw` alias** — launches Claude with `writing-system-prompt.md` for creative-writing tasks
16
+ - **`writing-system-prompt.md`** — dedicated system prompt for writing mode, distributed via file-manifest
17
+
18
+ #### New Plugin: workspace-scope-guard
19
+ - **`workspace-scope-guard`** — safety plugin that blocks writes and warns on reads outside the working directory. Registered in marketplace.json and enabled by default in settings.json
20
+
21
+ #### New Skills: spec-build, spec-review (code-directive plugin — 28 skills total)
22
+ - **`/spec-build`** — orchestrates the full implementation lifecycle from an approved spec: plan, build, review, and close in one pass. 5-phase workflow with acceptance criteria markers (`[ ]` → `[~]` → `[x]`)
23
+ - **`/spec-review`** — standalone deep implementation review against a spec. Reads code, verifies requirements and acceptance criteria, recommends `/spec-update` when done
24
+
25
+ #### New Hook: inject-cwd.py
26
+ - **`inject-cwd.py`** (PostToolUse, all tools) — injects current working directory into every tool response via `additionalContext`
27
+
28
+ #### Status Line: CWD Widget
29
+ - **`ccstatusline-cwd`** — new custom-command widget showing the basename of Claude Code's working directory. Layout expanded from 7 to 8 lines (16 → 17 widgets)
30
+
31
+ ### Changed
32
+
33
+ #### setup-aliases.sh Idempotency Fix
34
+ - **Block-marker strategy** — replaced cleanup+guard approach (which left aliases missing on re-run) with a delete-and-rewrite strategy using `START`/`END` block markers. The managed block is removed wholesale by sed range match, then always re-written fresh — no guard/`continue` needed
35
+ - **Legacy cleanup expanded** — added removal of v1.10.0 orphaned aliases/exports/`_CLAUDE_BIN`/`cc-tools()` that existed outside block markers, in addition to pre-v1.10.0 function forms
36
+ - **cc-tools expanded** — added `ccw`, `ccms`, `cargo` to the tool listing
37
+
38
+ #### Spec Workflow: Version-Based → Domain-Based Organization
39
+ - **Directory structure** — specs now live in domain subfolders (`.specs/{domain}/{feature}.md`) instead of version directories (`.specs/v0.1.0/feature.md`)
40
+ - **ROADMAP.md → MILESTONES.md** — version tracker renamed to milestone tracker throughout all skills, templates, and system prompt
41
+ - **`**Version:**` → `**Domain:**`** — spec template metadata field renamed across spec-new template, spec-writer agent, specification-writing skill, spec-update, spec-check
42
+ - **`roadmap-template.md` → `milestones-template.md`** — reference template replaced
43
+ - **Acceptance criteria markers** — three-state progress tracking: `[ ]` (not started), `[~]` (implemented, not yet verified), `[x]` (verified). Used by `/spec-build` phases and recognized by `/spec-check` and `/spec-update`
44
+ - **Spec lifecycle expanded** — `/spec-review` inserted before `/spec-update` in the recommended post-implementation workflow. `spec-reminder.py` advisory message updated accordingly
45
+ - **Agent skill lists** — architect, generalist, and spec-writer agents gained `/spec-review` access
46
+
47
+ #### LSP Plugin: Declarative Server Configuration
48
+ - **`codeforge-lsp/plugin.json`** — added `lspServers` block with pyright (Python), typescript-language-server (JS/TS), and gopls (Go) declarative configurations replacing implicit setup
49
+
50
+ #### git-state-injector.py Enhancements
51
+ - **Working directory injection** — always outputs cwd with scope restriction message, even outside git repos
52
+ - **cwd from hook input** — reads `cwd` from Claude Code's hook JSON input (falls back to `os.getcwd()`)
53
+
54
+ #### System Prompt Formatting
55
+ - **Line unwrapping** — long wrapped lines consolidated to single lines throughout (no content changes, only formatting)
56
+
57
+ #### Documentation
58
+ - **CLAUDE.md** — added `ccw`, `ccms` commands; added `writing-system-prompt.md` to directory tree and config table; added workspace-scope-guard to plugin list; skill count 17 → 28; added Rust to `version: "none"` support; updated setup-aliases.sh description
59
+ - **README.md** — added Safety Plugins section; updated spec workflow commands/lifecycle/structure for domain-based organization; added `/spec-build` and `/spec-review` to skill table; fixed system prompt override path (`system-prompt.md` → `main-system-prompt.md`)
60
+ - **claude-guide agent** — fixed system prompt path reference (`system-prompt.md` → `main-system-prompt.md`)
61
+ - **doc-writer agent** — "Version ships" → "Milestone ships" terminology
62
+ - **marketplace.json** — skill count updated (16 → 28); workspace-scope-guard added
63
+ - **skill-suggester.py** — added keyword mappings for `spec-build` and `spec-review`
64
+ - **spec-workflow.md rule** — added `/spec-build` and `/spec-review` rules (#10, #11); added acceptance criteria markers section; updated directory convention to domain-based
65
+
66
+ ### Removed
67
+
68
+ - **`spec-init/references/roadmap-template.md`** — replaced by `milestones-template.md`
69
+
70
+ ---
71
+
3
72
  ## [v1.10.0] - 2026-02-13
4
73
 
5
74
  ### Added
@@ -14,7 +14,8 @@ CodeForge devcontainer for AI-assisted development with Claude Code.
14
14
  │ │ └── defaults/ # Files copied per manifest
15
15
  │ │ ├── settings.json # Claude Code settings
16
16
  │ │ ├── keybindings.json # Claude Code keybindings
17
- │ │ └── main-system-prompt.md
17
+ │ │ ├── main-system-prompt.md
18
+ │ │ └── writing-system-prompt.md
18
19
  │ ├── features/ # Custom devcontainer features
19
20
  │ ├── plugins/ # Local plugin marketplace
20
21
  │ │ └── devs-marketplace/
@@ -22,7 +23,7 @@ CodeForge devcontainer for AI-assisted development with Claude Code.
22
23
  ├── .claude/ # Runtime Claude config (created on first run)
23
24
  │ ├── settings.json # Active settings (managed by file-manifest.json)
24
25
  │ ├── keybindings.json # Active keybindings
25
- │ └── system-prompt.md # Active system prompt
26
+ │ └── main-system-prompt.md # Active system prompt
26
27
  └── .gh/ # GitHub CLI config (persists across rebuilds)
27
28
  └── hosts.yml # Authenticated hosts
28
29
  ```
@@ -37,6 +38,7 @@ CodeForge devcontainer for AI-assisted development with Claude Code.
37
38
  | `config/defaults/settings.json` | Claude Code defaults: model, tokens, permissions, plugins |
38
39
  | `config/defaults/keybindings.json` | Claude Code keybindings (empty by default — customizable) |
39
40
  | `config/defaults/main-system-prompt.md` | Default system prompt defining assistant behavior |
41
+ | `config/defaults/writing-system-prompt.md` | Creative-writing system prompt used by `ccw` alias |
40
42
 
41
43
  > **Note**: Config file copying is controlled by `config/file-manifest.json`. Each entry specifies `overwrite`: `"if-changed"` (default, sha256-based), `"always"`, or `"never"`. Persistent changes go in `.devcontainer/config/defaults/settings.json`.
42
44
 
@@ -47,12 +49,14 @@ CodeForge devcontainer for AI-assisted development with Claude Code.
47
49
  | `claude` | Run Claude Code with auto-configuration (prefers native binary at `~/.local/bin/claude`) |
48
50
  | `cc` | Shorthand for `claude` with config |
49
51
  | `ccraw` | Vanilla Claude Code without any config (bypasses function override) |
52
+ | `ccw` | Shorthand for `claude` with writing system prompt |
50
53
  | `ccusage` | Analyze token usage history |
51
54
  | `ccburn` | Real-time token burn rate visualization |
52
55
  | `agent-browser` | Headless Chromium for browser automation (Playwright-based) |
53
56
  | `gh` | GitHub CLI for repo operations |
54
57
  | `uv` | Fast Python package manager |
55
58
  | `ast-grep` | Structural code search |
59
+ | `ccms` | Search Claude Code session history (project-scoped) |
56
60
  | `cc-tools` | List all installed tools with version info |
57
61
  | `check-setup` | Verify CodeForge setup health |
58
62
 
@@ -103,7 +107,7 @@ When `version` is set to `"none"`, the feature's `install.sh` exits immediately
103
107
  The auto-formatter and auto-linter plugins gracefully skip missing tools at runtime.
104
108
 
105
109
  **All local features support this pattern:**
106
- ast-grep, biome, ccstatusline, claude-monitor, dprint, hadolint, lsp-servers, mcp-qdrant, mcp-reasoner, notify-hook, ruff, shfmt, shellcheck, splitrail, tmux
110
+ ast-grep, biome, ccms, ccstatusline, claude-monitor, dprint, hadolint, lsp-servers, mcp-qdrant, mcp-reasoner, notify-hook, ruff, shfmt, shellcheck, splitrail, tmux
107
111
 
108
112
  **External features with `version: "none"` support:**
109
113
  `ghcr.io/devcontainers/features/node`, `ghcr.io/devcontainers/features/github-cli`, `ghcr.io/devcontainers/features/docker-outside-of-docker`, `ghcr.io/devcontainers/features/go` (all official Microsoft features)
@@ -111,6 +115,9 @@ ast-grep, biome, ccstatusline, claude-monitor, dprint, hadolint, lsp-servers, mc
111
115
  **External features without `version: "none"` support:**
112
116
  `ghcr.io/devcontainers-extra/features/uv`, `ghcr.io/anthropics/devcontainer-features/claude-code`, `ghcr.io/nickmccurdy/bun`
113
117
 
118
+ **External features with `version: "none"` support (Rust):**
119
+ `ghcr.io/devcontainers/features/rust` (official Microsoft feature)
120
+
114
121
  > **Convention**: Every new local feature must include a `version` option (default `"latest"`) in its `devcontainer-feature.json` and a skip guard at the top of `install.sh`:
115
122
  > ```bash
116
123
  > if [ "${VERSION}" = "none" ]; then
@@ -127,7 +134,7 @@ Scripts in `./scripts/` run via `postStartCommand`:
127
134
  |--------|---------|
128
135
  | `setup.sh` | Main orchestrator |
129
136
  | `setup-config.sh` | Copies config files per `config/file-manifest.json` to destinations |
130
- | `setup-aliases.sh` | Creates `cc`/`claude`/`ccraw` shell aliases (prefers native binary at `~/.local/bin/claude` via `_CLAUDE_BIN`) |
137
+ | `setup-aliases.sh` | Creates `cc`/`claude`/`ccraw`/`ccw` shell aliases (prefers native binary at `~/.local/bin/claude` via `_CLAUDE_BIN`) |
131
138
  | `setup-plugins.sh` | Registers local marketplace + installs official Anthropic plugins |
132
139
  | `setup-update-claude.sh` | Installs native Claude Code binary on first run; background auto-updates on subsequent starts |
133
140
  | `setup-terminal.sh` | Configures VS Code Shift+Enter keybinding for Claude Code multi-line input |
@@ -157,6 +164,7 @@ Plugins are declared in `config/defaults/settings.json` under `enabledPlugins` a
157
164
  - `auto-formatter@devs-marketplace` — Batch-formats edited files at Stop (Ruff for Python, Biome for JS/TS/CSS/JSON/GraphQL/HTML; also supports shfmt, dprint, gofmt, rustfmt when installed)
158
165
  - `auto-linter@devs-marketplace` — Auto-lints edited files at Stop (Pyright + Ruff for Python, Biome for JS/TS/CSS/GraphQL; also supports ShellCheck, hadolint, go vet, clippy when installed)
159
166
  - `code-directive@devs-marketplace` — 17 custom agents, 17 skills, syntax validation, skill suggestions, agent redirect hook
167
+ - `workspace-scope-guard@devs-marketplace` — Blocks writes and warns on reads outside the working directory
160
168
 
161
169
  ### Local Marketplace
162
170
 
@@ -172,12 +180,13 @@ plugins/devs-marketplace/
172
180
  ├── auto-formatter/ # Batch formatter (Stop hook)
173
181
  ├── auto-linter/ # Pyright linter
174
182
  ├── code-directive/ # Agents, skills + hooks
183
+ ├── workspace-scope-guard/ # Workspace scope enforcement
175
184
  └── ...
176
185
  ```
177
186
 
178
187
  ## Agents & Skills
179
188
 
180
- The `code-directive` plugin includes 17 custom agent definitions and 17 coding reference skills.
189
+ The `code-directive` plugin includes 17 custom agent definitions and 28 coding reference skills.
181
190
 
182
191
  **Agents** (`plugins/devs-marketplace/plugins/code-directive/agents/`):
183
192
  architect, bash-exec, claude-guide, debug-logs, dependency-analyst, doc-writer, explorer, generalist, git-archaeologist, migrator, perf-profiler, refactorer, researcher, security-auditor, spec-writer, statusline-config, test-writer
@@ -185,7 +194,7 @@ architect, bash-exec, claude-guide, debug-logs, dependency-analyst, doc-writer,
185
194
  The `redirect-builtin-agents.py` hook (PreToolUse/Task) transparently swaps built-in agent types to these custom agents (e.g., Explore→explorer, Plan→architect).
186
195
 
187
196
  **Skills** (`plugins/devs-marketplace/plugins/code-directive/skills/`):
188
- claude-agent-sdk, claude-code-headless, debugging, docker, docker-py, fastapi, git-forensics, performance-profiling, pydantic-ai, refactoring-patterns, security-checklist, skill-building, spec-refine, specification-writing, sqlite, svelte5, testing
197
+ api-design, ast-grep-patterns, claude-agent-sdk, claude-code-headless, debugging, dependency-management, docker, docker-py, documentation-patterns, fastapi, git-forensics, migration-patterns, performance-profiling, pydantic-ai, refactoring-patterns, security-checklist, skill-building, spec-build, spec-check, spec-init, spec-new, spec-refine, spec-review, spec-update, specification-writing, sqlite, svelte5, testing
189
198
 
190
199
  ## VS Code Keybinding Conflicts
191
200
 
@@ -243,7 +243,7 @@ For conflicting shortcuts, use Meta (Alt) variants or add custom keybindings.
243
243
 
244
244
  ### System Prompt
245
245
 
246
- The default system prompt is in `.devcontainer/config/defaults/main-system-prompt.md`. Override it by creating a `.claude/system-prompt.md` in your project directory.
246
+ The default system prompt is in `.devcontainer/config/defaults/main-system-prompt.md`. Override it by creating a `.claude/main-system-prompt.md` in your project directory.
247
247
 
248
248
  ## Custom Features
249
249
 
@@ -265,6 +265,14 @@ CodeForge includes several custom devcontainer features:
265
265
  | `mcp-qdrant` | Qdrant vector database MCP server (optional) |
266
266
  | `mcp-reasoner` | Enhanced AI reasoning MCP server (optional) |
267
267
 
268
+ ## Safety Plugins
269
+
270
+ | Plugin | Description |
271
+ |--------|-------------|
272
+ | `dangerous-command-blocker` | Blocks destructive bash commands (rm -rf, sudo rm, chmod 777, force push) |
273
+ | `protected-files-guard` | Blocks modifications to .env, lock files, .git/, and credentials |
274
+ | `workspace-scope-guard` | Enforces working directory scope — blocks writes and warns on reads outside the project |
275
+
268
276
  ## Agents & Skills
269
277
 
270
278
  The `code-directive` plugin includes specialized agent definitions and coding reference skills.
@@ -307,7 +315,7 @@ CodeForge includes a specification-driven development workflow. Every non-trivia
307
315
 
308
316
  ```bash
309
317
  /spec-init # Bootstrap .specs/ directory (first time only)
310
- /spec-new auth-flow v0.2.0 # Create a feature spec
318
+ /spec-new auth-flow # Create a feature spec (domain is inferred)
311
319
  /spec-refine auth-flow # Validate assumptions with user
312
320
  # ... implement the feature ...
313
321
  /spec-update auth-flow # As-built update after implementation
@@ -317,7 +325,7 @@ CodeForge includes a specification-driven development workflow. Every non-trivia
317
325
  ### The Lifecycle
318
326
 
319
327
  1. **Backlog** — features live in `.specs/BACKLOG.md` with priority grades (P0–P3)
320
- 2. **Roadmap** — when starting a version, pull features from backlog into `.specs/ROADMAP.md`
328
+ 2. **Milestone** — when starting a milestone, pull features from backlog into `.specs/MILESTONES.md`
321
329
  3. **Spec** — `/spec-new` creates a spec from the standard template with all requirements tagged `[assumed]`
322
330
  4. **Refine** — `/spec-refine` walks through every assumption with the user, converting `[assumed]` → `[user-approved]`. The spec's approval status moves from `draft` → `user-approved`. **No implementation begins until approved.**
323
331
  5. **Implement** — build the feature using the spec's acceptance criteria as the definition of done
@@ -337,26 +345,29 @@ A spec-reminder advisory hook fires at Stop when code was modified but specs wer
337
345
 
338
346
  | Skill | Purpose |
339
347
  |-------|---------|
340
- | `/spec-init` | Bootstrap `.specs/` directory with ROADMAP and BACKLOG |
348
+ | `/spec-init` | Bootstrap `.specs/` directory with MILESTONES and BACKLOG |
341
349
  | `/spec-new` | Create a feature spec from the standard template |
342
350
  | `/spec-refine` | Validate assumptions and get user approval (required before implementation) |
343
351
  | `/spec-update` | As-built update after implementation |
344
352
  | `/spec-check` | Audit all specs for health issues |
353
+ | `/spec-build` | Orchestrate full implementation from an approved spec (plan, build, review, close) |
354
+ | `/spec-review` | Standalone deep implementation review against a spec |
345
355
  | `/specification-writing` | EARS format templates and acceptance criteria patterns |
346
356
 
347
357
  ### Directory Structure
348
358
 
349
359
  ```
350
360
  .specs/
351
- ├── ROADMAP.md # Current version scope
352
- ├── BACKLOG.md # Priority-graded feature backlog
353
- ├── v0.1.0.md # Single-file spec (small versions)
354
- └── v0.2.0/ # Multi-feature version
355
- ├── _overview.md # Parent linking sub-specs
356
- └── feature.md # Individual feature spec
361
+ ├── MILESTONES.md # Milestone tracker linking to feature specs
362
+ ├── BACKLOG.md # Priority-graded feature backlog
363
+ ├── auth/ # Domain folder
364
+ │ ├── login-flow.md # Feature spec
365
+ │ └── oauth.md # Feature spec
366
+ └── search/ # Domain folder
367
+ └── full-text.md # Feature spec
357
368
  ```
358
369
 
359
- Specs aim for ~200 lines each. Split by feature boundary when longer; link via a parent overview.
370
+ All specs live in domain subfolders. Specs aim for ~200 lines each; split into separate specs in the domain folder when longer.
360
371
 
361
372
  ## Project Manager
362
373