codeforge-dev 1.7.0 → 1.8.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/.devcontainer/.env +4 -6
- package/.devcontainer/.env.example +29 -0
- package/.devcontainer/.gitignore +8 -0
- package/.devcontainer/.secrets.example +12 -0
- package/.devcontainer/CHANGELOG.md +130 -0
- package/.devcontainer/CLAUDE.md +56 -19
- package/.devcontainer/README.md +111 -56
- package/.devcontainer/config/{main-system-prompt.md → defaults/main-system-prompt.md} +72 -0
- package/.devcontainer/config/file-manifest.json +20 -0
- package/.devcontainer/devcontainer.json +20 -0
- package/.devcontainer/docs/configuration-reference.md +90 -0
- package/.devcontainer/docs/keybindings.md +100 -0
- package/.devcontainer/docs/optional-features.md +129 -0
- package/.devcontainer/docs/plugins.md +154 -0
- package/.devcontainer/docs/troubleshooting.md +128 -0
- package/.devcontainer/features/agent-browser/install.sh +6 -0
- package/.devcontainer/features/ast-grep/install.sh +6 -0
- package/.devcontainer/features/biome/README.md +27 -0
- package/.devcontainer/features/biome/install.sh +6 -0
- package/.devcontainer/features/ccburn/install.sh +6 -0
- package/.devcontainer/features/ccstatusline/devcontainer-feature.json +5 -0
- package/.devcontainer/features/ccstatusline/install.sh +7 -0
- package/.devcontainer/features/ccusage/install.sh +6 -0
- package/.devcontainer/features/claude-monitor/install.sh +6 -0
- package/.devcontainer/features/dprint/README.md +30 -0
- package/.devcontainer/features/dprint/devcontainer-feature.json +18 -0
- package/.devcontainer/features/dprint/install.sh +131 -0
- package/.devcontainer/features/hadolint/README.md +35 -0
- package/.devcontainer/features/hadolint/devcontainer-feature.json +13 -0
- package/.devcontainer/features/hadolint/install.sh +86 -0
- package/.devcontainer/features/lsp-servers/devcontainer-feature.json +5 -0
- package/.devcontainer/features/lsp-servers/install.sh +7 -0
- package/.devcontainer/features/mcp-qdrant/devcontainer-feature.json +5 -0
- package/.devcontainer/features/mcp-qdrant/install.sh +13 -6
- package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +5 -0
- package/.devcontainer/features/mcp-reasoner/install.sh +8 -1
- package/.devcontainer/features/notify-hook/devcontainer-feature.json +5 -0
- package/.devcontainer/features/notify-hook/install.sh +7 -0
- package/.devcontainer/features/ruff/README.md +26 -0
- package/.devcontainer/features/ruff/devcontainer-feature.json +21 -0
- package/.devcontainer/features/ruff/install.sh +74 -0
- package/.devcontainer/features/shellcheck/README.md +38 -0
- package/.devcontainer/features/shellcheck/devcontainer-feature.json +13 -0
- package/.devcontainer/features/shellcheck/install.sh +24 -0
- package/.devcontainer/features/shfmt/README.md +37 -0
- package/.devcontainer/features/shfmt/devcontainer-feature.json +13 -0
- package/.devcontainer/features/shfmt/install.sh +85 -0
- package/.devcontainer/features/splitrail/devcontainer-feature.json +5 -0
- package/.devcontainer/features/splitrail/install.sh +7 -0
- package/.devcontainer/features/tmux/install.sh +8 -0
- package/.devcontainer/features/tree-sitter/install.sh +6 -0
- package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +3 -10
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/__pycache__/format-on-stop.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-on-stop.py +114 -9
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/hooks/hooks.json +4 -5
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/__pycache__/lint-file.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/lint-file.py +478 -76
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/.claude-plugin/plugin.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/AGENT-REDIRECTION.md +226 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/bash-exec.md +4 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +14 -23
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +2 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +2 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +13 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +2 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +10 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/migrator.md +6 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/refactorer.md +4 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +36 -23
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/statusline-config.md +3 -3
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/test-writer.md +3 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +39 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/advisory-test-runner.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/collect-edited-files.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/commit-reminder.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/git-state-injector.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/redirect-builtin-agents.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/ticket-linker.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/todo-harvester.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/advisory-test-runner.py +174 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/collect-edited-files.py +8 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/commit-reminder.py +90 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/git-state-injector.py +114 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +61 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/ticket-linker.py +137 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/todo-harvester.py +130 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/SKILL.md +224 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/error-handling.md +166 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/rest-conventions.md +215 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/SKILL.md +211 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/references/language-patterns.md +327 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/SKILL.md +134 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/ecosystem-commands.md +264 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/license-compliance.md +80 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/SKILL.md +153 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/api-doc-templates.md +221 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/docstring-formats.md +296 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/SKILL.md +150 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/javascript-migrations.md +179 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/python-migrations.md +141 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +32 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/__pycache__/block-dangerous.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/hooks/hooks.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/__pycache__/guard-protected.cpython-314.pyc +0 -0
- package/.devcontainer/scripts/check-setup.sh +72 -0
- package/.devcontainer/scripts/setup-aliases.sh +43 -3
- package/.devcontainer/scripts/setup-auth.sh +74 -0
- package/.devcontainer/scripts/setup-config.sh +112 -22
- package/.devcontainer/scripts/setup-update-claude.sh +8 -0
- package/.devcontainer/scripts/setup.sh +46 -13
- package/README.md +23 -190
- package/package.json +1 -1
- package/setup.js +245 -71
- package/.devcontainer/features/claude-code/README.md +0 -498
- package/.devcontainer/features/claude-code/config/settings.json +0 -72
- package/.devcontainer/features/claude-code/config/system-prompt.md +0 -118
- package/.devcontainer/features/claude-code/config/world-building-sp.md +0 -1432
- package/.devcontainer/features/claude-code/devcontainer-feature.json +0 -42
- package/.devcontainer/features/claude-code/install.sh +0 -466
- package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/.claude-plugin/plugin.json +0 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/hooks/hooks.json +0 -17
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/.claude-plugin/plugin.json +0 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/config/planning-instructions.md +0 -14
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/functional-conjuring-map.md +0 -989
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/hooks/hooks.json +0 -33
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/__pycache__/post-enhance-task.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhance-planning.py +0 -71
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-plan.sh +0 -68
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-task.sh +0 -120
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-plan.py +0 -133
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-task.py +0 -253
- /package/.devcontainer/config/{keybindings.json → defaults/keybindings.json} +0 -0
- /package/.devcontainer/config/{settings.json → defaults/settings.json} +0 -0
|
@@ -396,6 +396,78 @@ offset = len(header) + 1 # null terminator in legacy format
|
|
|
396
396
|
offset = len(header) + 1 # add one to header length
|
|
397
397
|
</documentation>
|
|
398
398
|
|
|
399
|
+
<specification_management>
|
|
400
|
+
Specs and project-level docs live in `.specs/` at the project root.
|
|
401
|
+
|
|
402
|
+
You (the orchestrator) own spec creation and maintenance. Agents do not update
|
|
403
|
+
specs directly — they flag when specs need attention, and you handle it.
|
|
404
|
+
|
|
405
|
+
Folder structure:
|
|
406
|
+
```
|
|
407
|
+
.specs/
|
|
408
|
+
├── roadmap.md # What each version delivers and why (≤150 lines)
|
|
409
|
+
├── lessons-learned.md # Workflow anti-patterns
|
|
410
|
+
├── ci-cd.md # CI/CD pipeline, environments, deploy process
|
|
411
|
+
├── v0.1.0.md # Feature spec (single file per version if ≤200 lines)
|
|
412
|
+
├── v0.2.0/ # Version folder when multiple specs needed
|
|
413
|
+
│ ├── overview.md # Parent linking sub-specs (≤50 lines)
|
|
414
|
+
│ └── feature-name.md # Sub-spec per feature (≤200 lines each)
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Spec rules:
|
|
418
|
+
- ≤200 lines per spec file. Split by feature boundary if larger; link via
|
|
419
|
+
a parent overview (≤50 lines). Monolithic specs rot — no AI context window
|
|
420
|
+
can use a 4,000-line spec.
|
|
421
|
+
- Reference files, don't reproduce them. Write "see `src/engine/db/migrations/002.sql`
|
|
422
|
+
lines 48-70" — never paste full schemas, SQL DDL, or type definitions. The
|
|
423
|
+
code is the source of truth; duplicated snippets go stale.
|
|
424
|
+
- Each spec is independently loadable. Include version, status, last-updated,
|
|
425
|
+
intent, key file paths, and acceptance criteria in every spec file.
|
|
426
|
+
|
|
427
|
+
Standard template:
|
|
428
|
+
```
|
|
429
|
+
# Feature: [Name]
|
|
430
|
+
**Version:** v0.X.0
|
|
431
|
+
**Status:** implemented | partial | planned
|
|
432
|
+
**Last Updated:** YYYY-MM-DD
|
|
433
|
+
|
|
434
|
+
## Intent
|
|
435
|
+
## Acceptance Criteria
|
|
436
|
+
## Key Files
|
|
437
|
+
## Schema / Data Model (reference only — no inline DDL)
|
|
438
|
+
## API Endpoints (table: Method | Path | Description)
|
|
439
|
+
## Requirements (EARS format: FR-1, NFR-1)
|
|
440
|
+
## Dependencies
|
|
441
|
+
## Out of Scope
|
|
442
|
+
## Implementation Notes (as-built deviations — post-implementation only)
|
|
443
|
+
## Discrepancies (spec vs reality gaps)
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
As-built workflow (after implementing a feature):
|
|
447
|
+
1. Find the feature spec: Glob `.specs/**/*.md`
|
|
448
|
+
2. Set status to "implemented" or "partial"
|
|
449
|
+
3. Check off acceptance criteria with passing tests
|
|
450
|
+
4. Add Implementation Notes for any deviations
|
|
451
|
+
5. Update file paths if they changed
|
|
452
|
+
6. Update Last Updated date
|
|
453
|
+
If no spec exists and the change is substantial, create one or note "spec needed."
|
|
454
|
+
|
|
455
|
+
Document types — don't mix:
|
|
456
|
+
- Roadmap (`.specs/roadmap.md`): what each version delivers and why. No
|
|
457
|
+
implementation detail — that belongs in feature specs. Target: ≤150 lines.
|
|
458
|
+
- Feature spec (`.specs/v*.md` or `.specs/vX.Y.0/*.md`): how a feature works.
|
|
459
|
+
≤200 lines.
|
|
460
|
+
- CI/CD (`.specs/ci-cd.md`): pipeline stages, environments, deploy process,
|
|
461
|
+
and automation config. Keep declarative — reference workflow files, don't
|
|
462
|
+
reproduce them.
|
|
463
|
+
- Lessons learned (`.specs/lessons-learned.md`): workflow anti-patterns.
|
|
464
|
+
|
|
465
|
+
After a version ships, update feature specs to as-built status. Delete or
|
|
466
|
+
merge superseded planning artifacts — don't accumulate snapshot documents.
|
|
467
|
+
|
|
468
|
+
Delegate spec writing to the spec-writer agent when creating new specs.
|
|
469
|
+
</specification_management>
|
|
470
|
+
|
|
399
471
|
<code_standards>
|
|
400
472
|
Files:
|
|
401
473
|
- Small, focused, single reason to change
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"src": "defaults/settings.json",
|
|
4
|
+
"dest": "${CLAUDE_CONFIG_DIR}",
|
|
5
|
+
"enabled": true,
|
|
6
|
+
"overwrite": "if-changed"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"src": "defaults/keybindings.json",
|
|
10
|
+
"dest": "${CLAUDE_CONFIG_DIR}",
|
|
11
|
+
"enabled": true,
|
|
12
|
+
"overwrite": "if-changed"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"src": "defaults/main-system-prompt.md",
|
|
16
|
+
"dest": "${CLAUDE_CONFIG_DIR}",
|
|
17
|
+
"enabled": true,
|
|
18
|
+
"overwrite": "if-changed"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
"TMPDIR": "/workspaces/.tmp"
|
|
13
13
|
},
|
|
14
14
|
|
|
15
|
+
// Feature install order: external runtimes first (Node, uv, Go, Bun),
|
|
16
|
+
// then Claude Code (needs Node), then custom features.
|
|
17
|
+
// npm-dependent features (agent-browser, ccusage, ccburn, biome, lsp-servers)
|
|
18
|
+
// must come after Node. uv-dependent features (ruff, claude-monitor) must
|
|
19
|
+
// come after uv. notify-hook is last (lightweight, no dependencies).
|
|
15
20
|
"overrideFeatureInstallOrder": [
|
|
16
21
|
"ghcr.io/devcontainers/features/node",
|
|
17
22
|
"ghcr.io/devcontainers/features/github-cli",
|
|
@@ -29,6 +34,11 @@
|
|
|
29
34
|
"./features/ast-grep",
|
|
30
35
|
"./features/tree-sitter",
|
|
31
36
|
"./features/lsp-servers",
|
|
37
|
+
"./features/ruff",
|
|
38
|
+
"./features/shfmt",
|
|
39
|
+
"./features/dprint",
|
|
40
|
+
"./features/shellcheck",
|
|
41
|
+
"./features/hadolint",
|
|
32
42
|
"./features/biome",
|
|
33
43
|
"./features/notify-hook"
|
|
34
44
|
],
|
|
@@ -69,6 +79,16 @@
|
|
|
69
79
|
"./features/tree-sitter": {},
|
|
70
80
|
"./features/lsp-servers": {},
|
|
71
81
|
"./features/agent-browser": {},
|
|
82
|
+
"./features/ruff": {
|
|
83
|
+
"version": "latest",
|
|
84
|
+
"username": "automatic"
|
|
85
|
+
},
|
|
86
|
+
"./features/shfmt": {},
|
|
87
|
+
"./features/dprint": {
|
|
88
|
+
"username": "automatic"
|
|
89
|
+
},
|
|
90
|
+
"./features/shellcheck": {},
|
|
91
|
+
"./features/hadolint": {},
|
|
72
92
|
"./features/biome": {},
|
|
73
93
|
"./features/notify-hook": {
|
|
74
94
|
"enableBell": true,
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Configuration Reference
|
|
2
|
+
|
|
3
|
+
Quick reference for all CodeForge configuration options.
|
|
4
|
+
|
|
5
|
+
## Which File to Edit
|
|
6
|
+
|
|
7
|
+
| Task | File to Edit |
|
|
8
|
+
|------|-------------|
|
|
9
|
+
| Change default model | `config/defaults/settings.json` |
|
|
10
|
+
| Change system prompt | `config/defaults/main-system-prompt.md` |
|
|
11
|
+
| Customize keybindings | `config/defaults/keybindings.json` |
|
|
12
|
+
| Control setup steps | `.env` |
|
|
13
|
+
| Add custom config file | `config/file-manifest.json` |
|
|
14
|
+
| Disable a feature | `devcontainer.json` (set `"version": "none"`) |
|
|
15
|
+
| Disable a plugin | `config/defaults/settings.json` (remove from `enabledPlugins`) |
|
|
16
|
+
| Skip a plugin install | `.env` (`PLUGIN_BLACKLIST`) |
|
|
17
|
+
| Change container memory | `devcontainer.json` (`runArgs`) |
|
|
18
|
+
| Add VS Code extension | `devcontainer.json` (`customizations.vscode.extensions`) |
|
|
19
|
+
|
|
20
|
+
## `.env` Variables (Setup Behavior)
|
|
21
|
+
|
|
22
|
+
These control what `setup.sh` does on each container start. Copy `.env.example` to `.env` and customize.
|
|
23
|
+
|
|
24
|
+
| Variable | Default | Description |
|
|
25
|
+
|----------|---------|-------------|
|
|
26
|
+
| `CLAUDE_CONFIG_DIR` | `/workspaces/.claude` | Where Claude Code config files are stored |
|
|
27
|
+
| `CONFIG_SOURCE_DIR` | `(auto-detected)` | Source directory for config defaults |
|
|
28
|
+
| `SETUP_CONFIG` | `true` | Copy config files per `file-manifest.json` |
|
|
29
|
+
| `SETUP_ALIASES` | `true` | Add cc/claude/ccraw/cc-tools aliases to shell |
|
|
30
|
+
| `SETUP_AUTH` | `true` | Configure Git/NPM auth from `.secrets` file |
|
|
31
|
+
| `SETUP_PLUGINS` | `true` | Install Anthropic plugins + register local marketplace |
|
|
32
|
+
| `SETUP_UPDATE_CLAUDE` | `true` | Background-update Claude Code CLI binary |
|
|
33
|
+
| `SETUP_PROJECTS` | `true` | Auto-detect projects for VS Code Project Manager |
|
|
34
|
+
| `PLUGIN_BLACKLIST` | `""` | Comma-separated plugin names to skip during installation |
|
|
35
|
+
|
|
36
|
+
## `devcontainer.json` `remoteEnv` (Container Runtime)
|
|
37
|
+
|
|
38
|
+
These environment variables are set in every terminal session inside the container.
|
|
39
|
+
|
|
40
|
+
| Variable | Value | Description |
|
|
41
|
+
|----------|-------|-------------|
|
|
42
|
+
| `WORKSPACE_ROOT` | `/workspaces` | Workspace root directory |
|
|
43
|
+
| `CLAUDE_CONFIG_DIR` | `/workspaces/.claude` | Claude Code config directory |
|
|
44
|
+
| `GH_CONFIG_DIR` | `/workspaces/.gh` | GitHub CLI config directory |
|
|
45
|
+
| `TMPDIR` | `/workspaces/.tmp` | Temporary files directory |
|
|
46
|
+
|
|
47
|
+
## `config/file-manifest.json` (File Copy Rules)
|
|
48
|
+
|
|
49
|
+
Each entry in the manifest array controls how a config file is deployed:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"src": "defaults/settings.json",
|
|
54
|
+
"dest": "${CLAUDE_CONFIG_DIR}",
|
|
55
|
+
"destFilename": "settings.json",
|
|
56
|
+
"overwrite": "if-changed",
|
|
57
|
+
"enabled": true
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
| Field | Required | Default | Description |
|
|
62
|
+
|-------|----------|---------|-------------|
|
|
63
|
+
| `src` | Yes | — | Source file path relative to `config/` |
|
|
64
|
+
| `dest` | Yes | — | Destination directory (supports `${CLAUDE_CONFIG_DIR}`, `${WORKSPACE_ROOT}`) |
|
|
65
|
+
| `destFilename` | No | basename of `src` | Override the destination filename |
|
|
66
|
+
| `overwrite` | No | `"if-changed"` | `"always"`, `"never"`, or `"if-changed"` (sha256 comparison) |
|
|
67
|
+
| `enabled` | No | `true` | Set `false` to skip this entry |
|
|
68
|
+
|
|
69
|
+
## Feature Options
|
|
70
|
+
|
|
71
|
+
Each feature in `devcontainer.json` supports options defined in its `devcontainer-feature.json`. Common options:
|
|
72
|
+
|
|
73
|
+
| Option | Description | Used By |
|
|
74
|
+
|--------|-------------|---------|
|
|
75
|
+
| `version` | Tool version to install. `"none"` skips installation. | All local features |
|
|
76
|
+
| `username` | Container user to install for. `"automatic"` auto-detects. | dprint, ruff, ccusage, ccburn, etc. |
|
|
77
|
+
| `shells` | Which shell rc files to modify (`"both"`, `"bash"`, `"zsh"`). | ccusage, ccburn |
|
|
78
|
+
|
|
79
|
+
## `.secrets` File (Authentication)
|
|
80
|
+
|
|
81
|
+
Create `.devcontainer/.secrets` with tokens for automatic authentication:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
GH_TOKEN=ghp_your_token_here
|
|
85
|
+
GH_USERNAME=your-github-username
|
|
86
|
+
GH_EMAIL=your-email@example.com
|
|
87
|
+
NPM_TOKEN=npm_your_token_here
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Environment variables with the same names take precedence over `.secrets` file values (useful for Codespaces).
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Keybinding Customization
|
|
2
|
+
|
|
3
|
+
Claude Code runs inside VS Code's integrated terminal. Some VS Code shortcuts are intercepted before reaching the terminal, conflicting with Claude Code's keybindings.
|
|
4
|
+
|
|
5
|
+
## Conflicts
|
|
6
|
+
|
|
7
|
+
| Shortcut | VS Code Action | Claude Code Action |
|
|
8
|
+
|----------|---------------|-------------------|
|
|
9
|
+
| `Ctrl+G` | Go to Line | `chat:externalEditor` |
|
|
10
|
+
| `Ctrl+S` | Save File | `chat:stash` |
|
|
11
|
+
| `Ctrl+T` | Open Symbol | `app:toggleTodos` |
|
|
12
|
+
| `Ctrl+O` | Open File | `app:toggleTranscript` |
|
|
13
|
+
| `Ctrl+B` | Toggle Sidebar | `task:background` |
|
|
14
|
+
| `Ctrl+P` | Quick Open | `chat:modelPicker` |
|
|
15
|
+
| `Ctrl+R` | Open Recent | `history:search` |
|
|
16
|
+
| `Ctrl+F` | Find in Terminal | (navigation) |
|
|
17
|
+
|
|
18
|
+
## Already Resolved
|
|
19
|
+
|
|
20
|
+
`Ctrl+P` and `Ctrl+F` are configured to pass through to Claude Code via `terminal.integrated.commandsToSkipShell` in `devcontainer.json`:
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
"terminal.integrated.commandsToSkipShell": [
|
|
24
|
+
"-workbench.action.quickOpen",
|
|
25
|
+
"-workbench.action.terminal.focusFind"
|
|
26
|
+
]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The `-` prefix removes the shortcut from VS Code's interception list when the terminal is focused.
|
|
30
|
+
|
|
31
|
+
## Resolving Other Conflicts
|
|
32
|
+
|
|
33
|
+
### Option 1: Use Meta (Alt) Variants
|
|
34
|
+
|
|
35
|
+
Claude Code binds Meta (Alt) variants for all shortcuts. Use `Alt+G` instead of `Ctrl+G`, etc. No configuration needed.
|
|
36
|
+
|
|
37
|
+
### Option 2: Add to VS Code's Skip List
|
|
38
|
+
|
|
39
|
+
Add more shortcuts to `terminal.integrated.commandsToSkipShell` in `devcontainer.json`:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
"terminal.integrated.commandsToSkipShell": [
|
|
43
|
+
"-workbench.action.quickOpen",
|
|
44
|
+
"-workbench.action.terminal.focusFind",
|
|
45
|
+
"-workbench.action.gotoLine",
|
|
46
|
+
"-workbench.action.files.save"
|
|
47
|
+
]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Common command IDs:
|
|
51
|
+
| Shortcut | Command ID |
|
|
52
|
+
|----------|-----------|
|
|
53
|
+
| `Ctrl+G` | `workbench.action.gotoLine` |
|
|
54
|
+
| `Ctrl+S` | `workbench.action.files.save` |
|
|
55
|
+
| `Ctrl+T` | `workbench.action.showAllSymbols` |
|
|
56
|
+
| `Ctrl+O` | `workbench.action.files.openFile` |
|
|
57
|
+
| `Ctrl+B` | `workbench.action.toggleSidebarVisibility` |
|
|
58
|
+
| `Ctrl+R` | `workbench.action.openRecent` |
|
|
59
|
+
|
|
60
|
+
### Option 3: Custom Claude Code Keybindings
|
|
61
|
+
|
|
62
|
+
Edit `config/defaults/keybindings.json` to remap Claude Code actions to non-conflicting shortcuts:
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"bindings": [
|
|
67
|
+
{
|
|
68
|
+
"key": "ctrl+shift+g",
|
|
69
|
+
"command": "chat:externalEditor",
|
|
70
|
+
"description": "Open external editor (remapped from Ctrl+G)"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"key": "ctrl+shift+s",
|
|
74
|
+
"command": "chat:stash",
|
|
75
|
+
"description": "Stash conversation (remapped from Ctrl+S)"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The keybindings file is copied to `/workspaces/.claude/keybindings.json` on container start (controlled by `file-manifest.json`).
|
|
82
|
+
|
|
83
|
+
## Claude Code Keybinding Reference
|
|
84
|
+
|
|
85
|
+
Full list of default Claude Code shortcuts (these work when Claude Code has terminal focus):
|
|
86
|
+
|
|
87
|
+
| Key | Action |
|
|
88
|
+
|-----|--------|
|
|
89
|
+
| `Ctrl+C` / `Esc` | Cancel / Interrupt |
|
|
90
|
+
| `Ctrl+L` | Clear screen |
|
|
91
|
+
| `Ctrl+P` | Model picker |
|
|
92
|
+
| `Ctrl+R` | Search history |
|
|
93
|
+
| `Ctrl+G` | External editor |
|
|
94
|
+
| `Ctrl+S` | Stash conversation |
|
|
95
|
+
| `Ctrl+T` | Toggle todos |
|
|
96
|
+
| `Ctrl+O` | Toggle transcript |
|
|
97
|
+
| `Ctrl+B` | Background current task |
|
|
98
|
+
| `Ctrl+F` | Find in output |
|
|
99
|
+
|
|
100
|
+
All of these also have `Meta` (Alt) variants that work even when VS Code intercepts the `Ctrl` version.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Optional Features
|
|
2
|
+
|
|
3
|
+
CodeForge includes several features that are available but not enabled by default. This guide covers how to enable and configure them.
|
|
4
|
+
|
|
5
|
+
## mcp-qdrant (Vector Memory for Claude)
|
|
6
|
+
|
|
7
|
+
Adds persistent vector memory to Claude Code via a Qdrant MCP server. Claude can store and retrieve information across sessions.
|
|
8
|
+
|
|
9
|
+
### Enabling
|
|
10
|
+
|
|
11
|
+
Add to `devcontainer.json` under `"features"`:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
"./features/mcp-qdrant": {
|
|
15
|
+
"collectionName": "my-project-memory",
|
|
16
|
+
"embeddingModel": "all-MiniLM-L6-v2"
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Options
|
|
21
|
+
|
|
22
|
+
| Option | Default | Description |
|
|
23
|
+
|--------|---------|-------------|
|
|
24
|
+
| `collectionName` | `agent-memory` | Qdrant collection name |
|
|
25
|
+
| `embeddingModel` | `all-MiniLM-L6-v2` | Embedding model for vector search |
|
|
26
|
+
| `qdrantUrl` | (empty) | Remote Qdrant server URL. If empty, uses local storage. |
|
|
27
|
+
| `qdrantApiKey` | (empty) | API key for remote Qdrant server |
|
|
28
|
+
| `qdrantLocalPath` | `/workspaces/.qdrant/storage` | Local storage path (when no URL set) |
|
|
29
|
+
|
|
30
|
+
### Supported Embedding Models
|
|
31
|
+
|
|
32
|
+
- `all-MiniLM-L6-v2` (default, smallest, fastest)
|
|
33
|
+
- `BAAI/bge-small-en-v1.5`
|
|
34
|
+
- `BAAI/bge-base-en-v1.5`
|
|
35
|
+
- `sentence-transformers/all-mpnet-base-v2`
|
|
36
|
+
|
|
37
|
+
### Prerequisites
|
|
38
|
+
|
|
39
|
+
Already met by default container: Python 3.14 and uv are pre-installed.
|
|
40
|
+
|
|
41
|
+
### How It Works
|
|
42
|
+
|
|
43
|
+
1. During container build, the embedding model is pre-downloaded from GCS (not HuggingFace, to avoid network issues in containers).
|
|
44
|
+
2. On container start, a post-start hook registers the Qdrant MCP server in Claude Code's `settings.json`.
|
|
45
|
+
3. Claude Code can then use `qdrant-store` and `qdrant-find` tools to persist and search memories.
|
|
46
|
+
|
|
47
|
+
### Verification
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
uvx mcp-server-qdrant --help
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## mcp-reasoner (Enhanced Reasoning)
|
|
56
|
+
|
|
57
|
+
Adds a reasoning MCP server that gives Claude Code access to structured thinking tools (beam search, Monte Carlo tree search, etc.).
|
|
58
|
+
|
|
59
|
+
### Enabling
|
|
60
|
+
|
|
61
|
+
Add to `devcontainer.json` under `"features"`:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
"./features/mcp-reasoner": {}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Options
|
|
68
|
+
|
|
69
|
+
| Option | Default | Description |
|
|
70
|
+
|--------|---------|-------------|
|
|
71
|
+
| `version` | `latest` | Version to install. `"none"` to skip. |
|
|
72
|
+
| `username` | `automatic` | Container user to install for |
|
|
73
|
+
|
|
74
|
+
### Prerequisites
|
|
75
|
+
|
|
76
|
+
Already met by default container: Node.js LTS is pre-installed.
|
|
77
|
+
|
|
78
|
+
### How It Works
|
|
79
|
+
|
|
80
|
+
1. During build, clones and builds the mcp-reasoner Node.js project.
|
|
81
|
+
2. On container start, a post-start hook registers it as an MCP server in `settings.json`.
|
|
82
|
+
3. Claude Code gains access to reasoning tools: `beam_search`, `mcts`, `hypothesis_test`, etc.
|
|
83
|
+
|
|
84
|
+
### Verification
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
node ~/mcp-reasoner/dist/index.js --help
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## splitrail (Terminal Splitting)
|
|
93
|
+
|
|
94
|
+
A terminal multiplexer utility for splitting panes. Useful for Agent Teams workflows.
|
|
95
|
+
|
|
96
|
+
### Enabling
|
|
97
|
+
|
|
98
|
+
Add to `devcontainer.json` under `"features"`:
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
"./features/splitrail": {}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Prerequisites
|
|
105
|
+
|
|
106
|
+
Requires Rust toolchain. Add the Rust devcontainer feature first:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
"ghcr.io/devcontainers/features/rust:1": {}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Then add splitrail to `overrideFeatureInstallOrder` after the Rust feature.
|
|
113
|
+
|
|
114
|
+
### How It Works
|
|
115
|
+
|
|
116
|
+
splitrail is a Rust-based tool that provides tmux pane management for Claude Code Agent Teams. It works alongside the tmux feature to provide split-pane terminal sessions.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Disabling Default Features
|
|
121
|
+
|
|
122
|
+
Any feature can be disabled without removing it from `devcontainer.json` by setting `"version": "none"`:
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
"./features/hadolint": { "version": "none" },
|
|
126
|
+
"./features/shellcheck": { "version": "none" }
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
The feature entry stays in the config for easy re-enabling — just remove `"version": "none"` or set it to `"latest"`.
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# Plugin System
|
|
2
|
+
|
|
3
|
+
CodeForge includes a local plugin marketplace that provides specialized tools and hooks for Claude Code.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
plugins/devs-marketplace/
|
|
9
|
+
├── .claude-plugin/
|
|
10
|
+
│ └── marketplace.json # Marketplace manifest (lists all plugins)
|
|
11
|
+
└── plugins/
|
|
12
|
+
├── codeforge-lsp/ # LSP language servers
|
|
13
|
+
├── ticket-workflow/ # EARS ticket workflow
|
|
14
|
+
├── notify-hook/ # Desktop notifications
|
|
15
|
+
├── dangerous-command-blocker/ # Safety: block destructive commands
|
|
16
|
+
├── protected-files-guard/ # Safety: protect sensitive files
|
|
17
|
+
├── auto-formatter/ # Batch formatter (Stop hook)
|
|
18
|
+
├── auto-linter/ # Batch linter (Stop hook)
|
|
19
|
+
└── code-directive/ # Agents, skills, hooks
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Each plugin has a `.claude-plugin/plugin.json` manifest defining its name, description, and capabilities.
|
|
23
|
+
|
|
24
|
+
## Enabling/Disabling Plugins
|
|
25
|
+
|
|
26
|
+
Plugins are enabled in `config/defaults/settings.json` under `enabledPlugins`:
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
"enabledPlugins": [
|
|
30
|
+
"auto-formatter@devs-marketplace",
|
|
31
|
+
"auto-linter@devs-marketplace",
|
|
32
|
+
"code-directive@devs-marketplace"
|
|
33
|
+
]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
To disable a plugin, remove its entry from the `enabledPlugins` array.
|
|
37
|
+
|
|
38
|
+
## PLUGIN_BLACKLIST
|
|
39
|
+
|
|
40
|
+
To skip a plugin during the installation/registration step (without editing `settings.json`), add it to `PLUGIN_BLACKLIST` in `.env`:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
PLUGIN_BLACKLIST="ticket-workflow,auto-linter"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
This prevents the plugin from being registered on container start but doesn't remove it from `enabledPlugins`.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Plugin Reference
|
|
51
|
+
|
|
52
|
+
### codeforge-lsp
|
|
53
|
+
|
|
54
|
+
**Purpose**: Provides Language Server Protocol servers for code intelligence.
|
|
55
|
+
|
|
56
|
+
**Servers**:
|
|
57
|
+
- **Pyright** — Python type checking and completion (`.py`, `.pyi`)
|
|
58
|
+
- **TypeScript Language Server** — TypeScript/JavaScript (`.ts`, `.tsx`, `.js`, `.jsx`, `.mts`, `.cts`, `.mjs`, `.cjs`)
|
|
59
|
+
- **gopls** — Go language server (`.go`, `.mod`, `.sum`)
|
|
60
|
+
|
|
61
|
+
Claude Code automatically uses these for hover info, go-to-definition, and find-references.
|
|
62
|
+
|
|
63
|
+
### ticket-workflow
|
|
64
|
+
|
|
65
|
+
**Purpose**: EARS-based ticket workflow with GitHub integration.
|
|
66
|
+
|
|
67
|
+
Provides structured ticket management using EARS (Easy Approach to Requirements Syntax) format. Integrates with GitHub Issues for tracking.
|
|
68
|
+
|
|
69
|
+
**Commands**: `/ticket:new`, `/ticket:work`, `/ticket:review-commit`, `/ticket:create-pr`
|
|
70
|
+
|
|
71
|
+
### notify-hook
|
|
72
|
+
|
|
73
|
+
**Purpose**: Desktop notifications when Claude Code finishes responding.
|
|
74
|
+
|
|
75
|
+
Sends an OSC escape sequence and terminal bell when Claude completes a response, triggering desktop notifications in supported terminals (WezTerm, iTerm2, VS Code with the OSC notifier extension).
|
|
76
|
+
|
|
77
|
+
**Configuration**: Enabled via `devcontainer.json` feature options:
|
|
78
|
+
```json
|
|
79
|
+
"./features/notify-hook": {
|
|
80
|
+
"enableBell": true,
|
|
81
|
+
"enableOsc": true
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### dangerous-command-blocker
|
|
86
|
+
|
|
87
|
+
**Purpose**: Prevents Claude Code from executing destructive bash commands.
|
|
88
|
+
|
|
89
|
+
**Blocked patterns**:
|
|
90
|
+
- `rm -rf /` and variants
|
|
91
|
+
- `sudo rm` on system directories
|
|
92
|
+
- `chmod 777` on sensitive paths
|
|
93
|
+
- `git push --force` to protected branches
|
|
94
|
+
- `dd` with output to block devices
|
|
95
|
+
- Other destructive system commands
|
|
96
|
+
|
|
97
|
+
The blocker runs as a PreToolUse hook on Bash commands. It checks the command against a pattern list and rejects matches.
|
|
98
|
+
|
|
99
|
+
### protected-files-guard
|
|
100
|
+
|
|
101
|
+
**Purpose**: Prevents Claude Code from modifying sensitive files.
|
|
102
|
+
|
|
103
|
+
**Protected patterns**:
|
|
104
|
+
- `.env` and `.secrets` files
|
|
105
|
+
- Lock files (`package-lock.json`, `uv.lock`, `Cargo.lock`, etc.)
|
|
106
|
+
- `.git/` directory contents
|
|
107
|
+
- Credential files and SSH keys
|
|
108
|
+
|
|
109
|
+
Runs as a PreToolUse hook on Write and Edit operations.
|
|
110
|
+
|
|
111
|
+
### auto-formatter
|
|
112
|
+
|
|
113
|
+
**Purpose**: Batch-formats all files edited during a Claude Code session.
|
|
114
|
+
|
|
115
|
+
**Supported languages**:
|
|
116
|
+
| Language | Formatter |
|
|
117
|
+
|----------|-----------|
|
|
118
|
+
| Python | Ruff |
|
|
119
|
+
| Go | gofmt |
|
|
120
|
+
| JavaScript/TypeScript/CSS/JSON/GraphQL/HTML | Biome |
|
|
121
|
+
| Shell scripts | shfmt |
|
|
122
|
+
| Markdown/YAML/TOML/Dockerfile | dprint |
|
|
123
|
+
| Rust | rustfmt |
|
|
124
|
+
|
|
125
|
+
**How it works**: Runs as a Stop hook. When Claude Code stops (end of a conversation turn), it checks which files were edited, detects their language, and runs the appropriate formatter. Has a 30-second timeout.
|
|
126
|
+
|
|
127
|
+
### auto-linter
|
|
128
|
+
|
|
129
|
+
**Purpose**: Batch-lints all files edited during a Claude Code session.
|
|
130
|
+
|
|
131
|
+
**Supported linters**:
|
|
132
|
+
| Language | Linter |
|
|
133
|
+
|----------|--------|
|
|
134
|
+
| Python | Pyright + Ruff |
|
|
135
|
+
| JavaScript/TypeScript/CSS/GraphQL | Biome |
|
|
136
|
+
| Shell scripts | ShellCheck |
|
|
137
|
+
| Go | go vet |
|
|
138
|
+
| Dockerfile | hadolint |
|
|
139
|
+
| Rust | clippy |
|
|
140
|
+
|
|
141
|
+
**How it works**: Runs as a Stop hook alongside auto-formatter. Checks edited files and runs the appropriate linter. Results are reported but don't block — they're informational.
|
|
142
|
+
|
|
143
|
+
### code-directive
|
|
144
|
+
|
|
145
|
+
**Purpose**: The main intelligence layer — custom agents, coding skills, and behavior hooks.
|
|
146
|
+
|
|
147
|
+
**Components**:
|
|
148
|
+
- **17 custom agents** — Specialized agent definitions for different task types (architect, test-writer, refactorer, etc.)
|
|
149
|
+
- **16 coding skills** — Domain-specific reference materials (FastAPI, Docker, testing patterns, etc.)
|
|
150
|
+
- **Agent redirection hook** — Transparently swaps built-in agent types to custom agents (e.g., `Explore` → `explorer`, `Plan` → `architect`)
|
|
151
|
+
- **Syntax validation hook** — Validates code syntax before commits
|
|
152
|
+
- **Skill auto-suggestion hook** — Suggests relevant skills based on conversation context
|
|
153
|
+
|
|
154
|
+
For detailed agent and skill documentation, see the agent markdown files in `plugins/devs-marketplace/plugins/code-directive/agents/` and skill files in `plugins/devs-marketplace/plugins/code-directive/skills/`.
|