codeforge-dev 1.11.0 → 1.13.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 +7 -1
- package/.devcontainer/.gitignore +1 -0
- package/.devcontainer/CHANGELOG.md +106 -0
- package/.devcontainer/CLAUDE.md +93 -15
- package/.devcontainer/README.md +44 -10
- package/.devcontainer/config/defaults/main-system-prompt.md +28 -0
- package/.devcontainer/config/defaults/rules/workspace-scope.md +13 -4
- package/.devcontainer/config/defaults/settings.json +5 -3
- package/.devcontainer/config/defaults/writing-system-prompt.md +46 -4
- package/.devcontainer/connect-external-terminal.ps1 +1 -1
- package/.devcontainer/devcontainer.json +41 -11
- package/.devcontainer/docs/configuration-reference.md +3 -0
- package/.devcontainer/docs/plugins.md +9 -2
- package/.devcontainer/docs/troubleshooting.md +2 -2
- package/.devcontainer/features/README.md +8 -9
- package/.devcontainer/features/agent-browser/devcontainer-feature.json +21 -21
- package/.devcontainer/features/agent-browser/install.sh +0 -7
- package/.devcontainer/features/ast-grep/devcontainer-feature.json +22 -22
- package/.devcontainer/features/biome/devcontainer-feature.json +12 -14
- package/.devcontainer/features/ccms/install.sh +30 -13
- package/.devcontainer/features/claude-session-dashboard/README.md +40 -0
- package/.devcontainer/features/claude-session-dashboard/devcontainer-feature.json +35 -0
- package/.devcontainer/features/claude-session-dashboard/install.sh +172 -0
- package/.devcontainer/features/lsp-servers/devcontainer-feature.json +43 -43
- package/.devcontainer/features/mcp-qdrant/poststart-hook.sh +2 -1
- package/.devcontainer/features/ruff/devcontainer-feature.json +17 -19
- package/.devcontainer/features/tmux/install.sh +2 -2
- package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +24 -3
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/.claude-plugin/plugin.json +8 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/AGENT-REDIRECTION.md +7 -12
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/REVIEW-RUBRIC.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/hooks/hooks.json +29 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/redirect-builtin-agents.py +17 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/README.md +81 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/README.md +92 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/README.md +41 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/README.md +72 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +73 -47
- package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/README.md +42 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/README.md +86 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/hooks/hooks.json +25 -15
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected-bash.py +122 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +3 -3
- package/.devcontainer/plugins/devs-marketplace/plugins/session-context/.claude-plugin/plugin.json +8 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/session-context/hooks/hooks.json +34 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/.claude-plugin/plugin.json +8 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/hooks/hooks.json +29 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/skills/team/SKILL.md +205 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/.claude-plugin/plugin.json +8 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/hooks/hooks.json +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/skills/spec-init/references/roadmap-template.md +33 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/README.md +96 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/hooks/hooks.json +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/README.md +94 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/guard-workspace-scope.py +1 -3
- package/.devcontainer/scripts/check-setup.sh +1 -1
- package/.devcontainer/scripts/setup-projects.sh +24 -17
- package/.devcontainer/scripts/setup.sh +48 -5
- package/README.md +17 -8
- package/package.json +1 -2
- package/.devcontainer/features/mcp-reasoner/README.md +0 -177
- package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +0 -25
- package/.devcontainer/features/mcp-reasoner/install.sh +0 -184
- package/.devcontainer/features/mcp-reasoner/poststart-hook.sh +0 -67
- package/.devcontainer/features/splitrail/README.md +0 -140
- package/.devcontainer/features/splitrail/devcontainer-feature.json +0 -39
- package/.devcontainer/features/splitrail/install.sh +0 -136
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/.claude-plugin/plugin.json +0 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +0 -112
- 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__/guard-readonly-bash.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__/skill-suggester.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/syntax-validator.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/__pycache__/verify-no-regression.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-tests-pass.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/collect-edited-files.py +0 -46
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/syntax-validator.py +0 -146
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/.claude-plugin/commands/debug.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/architect.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/bash-exec.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/claude-guide.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/debug-logs.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/dependency-analyst.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/doc-writer.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/explorer.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/generalist.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/git-archaeologist.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/migrator.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/perf-profiler.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/refactorer.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/researcher.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/security-auditor.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/spec-writer.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/statusline-config.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/test-writer.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/guard-readonly-bash.py +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/inject-cwd.py +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/verify-no-regression.py +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/verify-tests-pass.py +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → auto-code-quality}/scripts/advisory-test-runner.py +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/commit-reminder.py +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/git-state-injector.py +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/todo-harvester.py +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/scripts/skill-suggester.py +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/references/error-handling.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/references/rest-conventions.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/ast-grep-patterns/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/ast-grep-patterns/references/language-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-agent-sdk/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-agent-sdk/references/sdk-typescript-reference.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/references/cli-flags-and-output.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/references/sdk-and-mcp.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/references/error-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/references/log-locations.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/references/ecosystem-commands.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/references/license-compliance.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/references/compose-services.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/references/dockerfile-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/references/container-lifecycle.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/references/resources-and-security.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/references/api-doc-templates.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/references/docstring-formats.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/middleware-and-lifespan.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/pydantic-models.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/routing-and-dependencies.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/sse-and-streaming.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/references/advanced-commands.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/references/investigation-playbooks.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/references/javascript-migrations.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/references/python-migrations.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/references/interpreting-results.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/references/tool-commands.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/references/agents-and-tools.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/references/models-and-streaming.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/references/safe-transformations.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/references/smell-catalog.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/references/owasp-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/references/secrets-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/cross-vendor-principles.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/patterns-and-antipatterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/skill-authoring-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/advanced-queries.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/javascript-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/python-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/schema-and-pragmas.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/ai-sdk-svelte.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/component-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/layercake.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/migration-guide.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/runes-and-reactivity.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/spa-and-routing.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/svelte-dnd-action.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/references/fastapi-testing.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/references/svelte-testing.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/scripts/spec-reminder.py +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-build/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-build/references/review-checklist.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-check/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/references/backlog-template.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/references/milestones-template.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-new/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-new/references/template.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-refine/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-review/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-update/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/SKILL.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/references/criteria-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/references/ears-templates.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → ticket-workflow}/scripts/ticket-linker.py +0 -0
|
@@ -9,13 +9,31 @@
|
|
|
9
9
|
"WORKSPACE_ROOT": "/workspaces",
|
|
10
10
|
"CLAUDE_CONFIG_DIR": "/workspaces/.claude",
|
|
11
11
|
"GH_CONFIG_DIR": "/workspaces/.gh",
|
|
12
|
-
"TMPDIR": "/workspaces/.tmp"
|
|
12
|
+
"TMPDIR": "/workspaces/.tmp",
|
|
13
|
+
"CLAUDECODE": null
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
"secrets": {
|
|
17
|
+
"GH_TOKEN": {
|
|
18
|
+
"description": "GitHub Personal Access Token (optional - for git auth)",
|
|
19
|
+
"documentationUrl": "https://github.com/settings/tokens"
|
|
20
|
+
},
|
|
21
|
+
"NPM_TOKEN": {
|
|
22
|
+
"description": "NPM auth token (optional - for npm registry)",
|
|
23
|
+
"documentationUrl": "https://www.npmjs.com/settings/~/tokens"
|
|
24
|
+
},
|
|
25
|
+
"GH_USERNAME": {
|
|
26
|
+
"description": "GitHub username for git config (optional)"
|
|
27
|
+
},
|
|
28
|
+
"GH_EMAIL": {
|
|
29
|
+
"description": "GitHub email for git config (optional)"
|
|
30
|
+
}
|
|
13
31
|
},
|
|
14
32
|
|
|
15
33
|
// Feature install order: external runtimes first (Node, uv, Rust, Bun),
|
|
16
34
|
// then Claude Code (needs Node), then custom features.
|
|
17
|
-
// npm-dependent features (agent-browser, ccusage, ccburn,
|
|
18
|
-
// must come after Node. uv-dependent features (ruff, claude-monitor) must
|
|
35
|
+
// npm-dependent features (agent-browser, ccusage, ccburn, claude-session-dashboard,
|
|
36
|
+
// biome, lsp-servers) must come after Node. uv-dependent features (ruff, claude-monitor) must
|
|
19
37
|
// come after uv. cargo-dependent features (ccms) must come after Rust.
|
|
20
38
|
// notify-hook is last (lightweight, no dependencies).
|
|
21
39
|
"overrideFeatureInstallOrder": [
|
|
@@ -33,6 +51,7 @@
|
|
|
33
51
|
"./features/ccburn",
|
|
34
52
|
"./features/ccstatusline",
|
|
35
53
|
"./features/ccms",
|
|
54
|
+
"./features/claude-session-dashboard",
|
|
36
55
|
"./features/ast-grep",
|
|
37
56
|
"./features/tree-sitter",
|
|
38
57
|
"./features/lsp-servers",
|
|
@@ -46,20 +65,22 @@
|
|
|
46
65
|
],
|
|
47
66
|
|
|
48
67
|
"features": {
|
|
49
|
-
"ghcr.io/devcontainers/features/node:1": {
|
|
68
|
+
"ghcr.io/devcontainers/features/node:1.7.1": {
|
|
50
69
|
"version": "lts",
|
|
51
70
|
"nodeGypDependencies": true
|
|
52
71
|
},
|
|
53
|
-
"ghcr.io/devcontainers/features/github-cli:1": {},
|
|
54
|
-
"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {
|
|
72
|
+
"ghcr.io/devcontainers/features/github-cli:1.1.0": {},
|
|
73
|
+
"ghcr.io/devcontainers/features/docker-outside-of-docker:1.6": {
|
|
55
74
|
"moby": false
|
|
56
75
|
},
|
|
57
|
-
"ghcr.io/devcontainers-extra/features/uv:1": {},
|
|
76
|
+
"ghcr.io/devcontainers-extra/features/uv:1.0": {},
|
|
58
77
|
"ghcr.io/rails/devcontainer/features/bun:1.0.2": {},
|
|
59
|
-
"ghcr.io/devcontainers/features/rust:1": {
|
|
78
|
+
"ghcr.io/devcontainers/features/rust:1.5.0": {
|
|
60
79
|
"version": "latest"
|
|
61
80
|
},
|
|
62
|
-
|
|
81
|
+
// Uncomment to add Go runtime (not installed by default):
|
|
82
|
+
// "ghcr.io/devcontainers/features/go:1": {},
|
|
83
|
+
"ghcr.io/anthropics/devcontainer-features/claude-code:1.0.5": {},
|
|
63
84
|
"./features/tmux": {},
|
|
64
85
|
"./features/ccusage": {
|
|
65
86
|
"version": "latest",
|
|
@@ -80,6 +101,12 @@
|
|
|
80
101
|
"username": "automatic"
|
|
81
102
|
},
|
|
82
103
|
"./features/ccms": {},
|
|
104
|
+
"./features/claude-session-dashboard": {
|
|
105
|
+
"version": "latest",
|
|
106
|
+
"port": "3000",
|
|
107
|
+
"shells": "both",
|
|
108
|
+
"username": "automatic"
|
|
109
|
+
},
|
|
83
110
|
"./features/ast-grep": {},
|
|
84
111
|
"./features/tree-sitter": {},
|
|
85
112
|
"./features/lsp-servers": {},
|
|
@@ -111,18 +138,21 @@
|
|
|
111
138
|
"vscode": {
|
|
112
139
|
"settings": {
|
|
113
140
|
"terminal.integrated.profiles.linux": {
|
|
141
|
+
"zsh": {
|
|
142
|
+
"path": "zsh"
|
|
143
|
+
},
|
|
114
144
|
"bash": {
|
|
115
145
|
"path": "bash"
|
|
116
146
|
},
|
|
117
147
|
"Claude Teams (tmux)": {
|
|
118
|
-
"path": "
|
|
148
|
+
"path": "zsh",
|
|
119
149
|
"args": [
|
|
120
150
|
"-c",
|
|
121
151
|
"if tmux has-session -t claude-teams 2>/dev/null; then exec tmux -u new-session -t claude-teams; else exec tmux -u new-session -s claude-teams; fi"
|
|
122
152
|
]
|
|
123
153
|
}
|
|
124
154
|
},
|
|
125
|
-
"terminal.integrated.defaultProfile.linux": "
|
|
155
|
+
"terminal.integrated.defaultProfile.linux": "zsh",
|
|
126
156
|
"terminal.integrated.enableBell": true,
|
|
127
157
|
"terminal.integrated.commandsToSkipShell": [
|
|
128
158
|
"-workbench.action.quickOpen",
|
|
@@ -30,7 +30,9 @@ These control what `setup.sh` does on each container start. Copy `.env.example`
|
|
|
30
30
|
| `SETUP_AUTH` | `true` | Configure Git/NPM auth from `.secrets` file |
|
|
31
31
|
| `SETUP_PLUGINS` | `true` | Install Anthropic plugins + register local marketplace |
|
|
32
32
|
| `SETUP_UPDATE_CLAUDE` | `true` | Background-update Claude Code CLI binary |
|
|
33
|
+
| `SETUP_TERMINAL` | `true` | Configure VS Code Shift+Enter keybinding for Claude Code terminal |
|
|
33
34
|
| `SETUP_PROJECTS` | `true` | Auto-detect projects for VS Code Project Manager |
|
|
35
|
+
| `SETUP_POSTSTART` | `true` | Run post-start hooks from `/usr/local/devcontainer-poststart.d/` |
|
|
34
36
|
| `PLUGIN_BLACKLIST` | `""` | Comma-separated plugin names to skip during installation |
|
|
35
37
|
|
|
36
38
|
## `devcontainer.json` `remoteEnv` (Container Runtime)
|
|
@@ -43,6 +45,7 @@ These environment variables are set in every terminal session inside the contain
|
|
|
43
45
|
| `CLAUDE_CONFIG_DIR` | `/workspaces/.claude` | Claude Code config directory |
|
|
44
46
|
| `GH_CONFIG_DIR` | `/workspaces/.gh` | GitHub CLI config directory |
|
|
45
47
|
| `TMPDIR` | `/workspaces/.tmp` | Temporary files directory |
|
|
48
|
+
| `CLAUDECODE` | `null` (unset) | Unsets the variable to allow nested Claude Code sessions (claude-in-claude) |
|
|
46
49
|
|
|
47
50
|
## `config/file-manifest.json` (File Copy Rules)
|
|
48
51
|
|
|
@@ -16,7 +16,8 @@ plugins/devs-marketplace/
|
|
|
16
16
|
├── protected-files-guard/ # Safety: protect sensitive files
|
|
17
17
|
├── auto-formatter/ # Batch formatter (Stop hook)
|
|
18
18
|
├── auto-linter/ # Batch linter (Stop hook)
|
|
19
|
-
|
|
19
|
+
├── code-directive/ # Agents, skills, hooks
|
|
20
|
+
└── workspace-scope-guard/ # Workspace scope enforcement
|
|
20
21
|
```
|
|
21
22
|
|
|
22
23
|
Each plugin has a `.claude-plugin/plugin.json` manifest defining its name, description, and capabilities.
|
|
@@ -146,9 +147,15 @@ Runs as a PreToolUse hook on Write and Edit operations.
|
|
|
146
147
|
|
|
147
148
|
**Components**:
|
|
148
149
|
- **17 custom agents** — Specialized agent definitions for different task types (architect, test-writer, refactorer, etc.)
|
|
149
|
-
- **
|
|
150
|
+
- **28 coding skills** — Domain-specific reference materials (FastAPI, Docker, testing patterns, spec workflow, etc.)
|
|
150
151
|
- **Agent redirection hook** — Transparently swaps built-in agent types to custom agents (e.g., `Explore` → `explorer`, `Plan` → `architect`)
|
|
151
152
|
- **Syntax validation hook** — Validates code syntax before commits
|
|
152
153
|
- **Skill auto-suggestion hook** — Suggests relevant skills based on conversation context
|
|
153
154
|
|
|
154
155
|
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/`.
|
|
156
|
+
|
|
157
|
+
### workspace-scope-guard
|
|
158
|
+
|
|
159
|
+
**Purpose**: Enforces workspace scope by blocking writes outside the working directory and warning on out-of-scope reads.
|
|
160
|
+
|
|
161
|
+
Runs as a PreToolUse hook on Write, Edit, and Read operations. Compares file paths against the current working directory and rejects modifications to files outside the project scope. Read operations outside scope produce a warning but are not blocked. Resolves symlinks and worktree paths correctly via `os.path.realpath()`.
|
|
@@ -6,7 +6,7 @@ Common issues and solutions for the CodeForge devcontainer.
|
|
|
6
6
|
|
|
7
7
|
**Problem**: Container fails to build during feature installation.
|
|
8
8
|
|
|
9
|
-
- Check Docker has sufficient memory (
|
|
9
|
+
- Check Docker has sufficient memory (6GB+ recommended). CodeForge sets `--memory=6g` by default.
|
|
10
10
|
- If a specific feature fails, disable it temporarily by setting `"version": "none"` in `devcontainer.json`.
|
|
11
11
|
- Check internet connectivity — most features download binaries from GitHub releases.
|
|
12
12
|
- If hitting GitHub API rate limits during build, set `GH_TOKEN` or `GITHUB_TOKEN` as an environment variable.
|
|
@@ -107,7 +107,7 @@ Common issues and solutions for the CodeForge devcontainer.
|
|
|
107
107
|
|
|
108
108
|
**Problem**: Container is slow or running out of memory.
|
|
109
109
|
|
|
110
|
-
- CodeForge defaults to
|
|
110
|
+
- CodeForge defaults to 6GB RAM / 12GB swap. Increase in `devcontainer.json` `runArgs`.
|
|
111
111
|
- Disable features you don't need with `"version": "none"`.
|
|
112
112
|
- The background Claude Code update runs once on startup — it's not persistent.
|
|
113
113
|
|
|
@@ -10,16 +10,20 @@ This directory contains DevContainer Features for AI coding agent environments.
|
|
|
10
10
|
| `agent-browser` | Headless browser automation for AI agents | ✅ |
|
|
11
11
|
| `claude-monitor` | Real-time token usage monitoring | ✅ |
|
|
12
12
|
| `ccusage` | Token usage analytics CLI | ✅ |
|
|
13
|
-
| `ccburn` | Visual token burn rate tracker with pace indicators | ✅
|
|
13
|
+
| `ccburn` | Visual token burn rate tracker with pace indicators | ✅ |
|
|
14
14
|
| `ccstatusline` | 6-line powerline status display (v1.1.0) | ✅ |
|
|
15
15
|
| `ast-grep` | Structural code search using AST patterns | ✅ |
|
|
16
16
|
| `tree-sitter` | Parser with JS/TS/Python grammars | ✅ |
|
|
17
17
|
| `lsp-servers` | Pyright and TypeScript language servers | ✅ |
|
|
18
18
|
| `biome` | Fast JS/TS/JSON/CSS formatter | ✅ |
|
|
19
|
+
| `ruff` | Fast Python linter and formatter | ✅ |
|
|
20
|
+
| `shfmt` | Shell script formatter | ✅ (disabled by default) |
|
|
21
|
+
| `shellcheck` | Static analysis for shell scripts | ✅ (disabled by default) |
|
|
22
|
+
| `hadolint` | Dockerfile linter | ✅ (disabled by default) |
|
|
23
|
+
| `dprint` | Pluggable formatter for Markdown/YAML/TOML | ✅ (disabled by default) |
|
|
24
|
+
| `ccms` | Claude Code session history search | ✅ |
|
|
19
25
|
| `notify-hook` | Desktop notifications on Claude completion | ✅ |
|
|
20
|
-
| `splitrail` | Git worktree management for parallel branches | ✅ |
|
|
21
26
|
| `mcp-qdrant` | Qdrant vector database MCP server | ✅ (optional) |
|
|
22
|
-
| `mcp-reasoner` | Enhanced AI reasoning MCP server | ✅ (optional) |
|
|
23
27
|
| `claude-code` | Fallback config for Anthropic's official Claude Code feature | ✅ (config only) |
|
|
24
28
|
|
|
25
29
|
> **Note**: Claude Code itself is installed via `ghcr.io/anthropics/devcontainer-features/claude-code:1` (Anthropic's official feature). The local `claude-code/` directory provides only fallback configuration.
|
|
@@ -99,16 +103,11 @@ ghcr.io/yourorg/codeforge-features/feature-name:1
|
|
|
99
103
|
|
|
100
104
|
## Migration from Modules
|
|
101
105
|
|
|
102
|
-
CodeForge modules
|
|
106
|
+
CodeForge modules have been converted to DevContainer Features:
|
|
103
107
|
|
|
104
108
|
| Old Module | New Feature | Status |
|
|
105
109
|
|-----------|-------------|---------|
|
|
106
110
|
| mcp_qdrant | mcp-qdrant | ✅ Complete |
|
|
107
|
-
| mcp_reasoner | mcp-reasoner | ✅ Complete |
|
|
108
|
-
| mcp_browser | mcp-browser | 🔜 Planned |
|
|
109
|
-
| mcp_sourcerer | mcp-sourcerer | 🔜 Planned |
|
|
110
|
-
| mcp_obsidian | mcp-obsidian | 🔜 Planned |
|
|
111
|
-
| mcp_code_runner | mcp-code-runner | 🔜 Planned |
|
|
112
111
|
|
|
113
112
|
## Resources
|
|
114
113
|
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
2
|
+
"id": "agent-browser",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"name": "agent-browser",
|
|
5
|
+
"description": "Headless browser automation CLI for AI agents (Vercel Labs)",
|
|
6
|
+
"documentationURL": "https://github.com/vercel-labs/agent-browser",
|
|
7
|
+
"options": {
|
|
8
|
+
"version": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "agent-browser npm package version",
|
|
11
|
+
"default": "0.11.1"
|
|
12
|
+
},
|
|
13
|
+
"username": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Container user to install for",
|
|
16
|
+
"default": "automatic"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"installsAfter": [
|
|
20
|
+
"ghcr.io/devcontainers/features/common-utils:2",
|
|
21
|
+
"ghcr.io/devcontainers/features/node:1"
|
|
22
|
+
]
|
|
23
23
|
}
|
|
@@ -64,13 +64,6 @@ agent-browser install --with-deps 2>/dev/null || {
|
|
|
64
64
|
agent-browser install 2>/dev/null || true
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
# Install Playwright Chromium only (not all browsers)
|
|
68
|
-
echo "[agent-browser] Installing Playwright Chromium..."
|
|
69
|
-
npx playwright install chromium --with-deps 2>/dev/null || {
|
|
70
|
-
echo "[agent-browser] WARNING: Playwright chromium install with deps failed, trying without --with-deps"
|
|
71
|
-
npx playwright install chromium 2>/dev/null || true
|
|
72
|
-
}
|
|
73
|
-
|
|
74
67
|
echo "[agent-browser] Installed: $(agent-browser --version 2>/dev/null || echo 'unknown')"
|
|
75
68
|
echo "[agent-browser] Installation complete"
|
|
76
69
|
echo ""
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
2
|
+
"id": "ast-grep",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"name": "ast-grep",
|
|
5
|
+
"description": "Installs ast-grep CLI for structural code search, lint, and rewriting using AST matching",
|
|
6
|
+
"maintainer": "AnExiledDev",
|
|
7
|
+
"documentationURL": "https://ast-grep.github.io/",
|
|
8
|
+
"options": {
|
|
9
|
+
"version": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "@ast-grep/cli npm package version (e.g., 'latest', '0.31.1')",
|
|
12
|
+
"default": "0.40.5"
|
|
13
|
+
},
|
|
14
|
+
"username": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Container user to install for",
|
|
17
|
+
"default": "automatic"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"installsAfter": [
|
|
21
|
+
"ghcr.io/devcontainers/features/common-utils:2",
|
|
22
|
+
"ghcr.io/devcontainers/features/node:1"
|
|
23
|
+
]
|
|
24
24
|
}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"ghcr.io/devcontainers/features/node"
|
|
15
|
-
]
|
|
2
|
+
"id": "biome",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"name": "Biome",
|
|
5
|
+
"description": "Fast JS/TS/JSON/CSS formatter and linter",
|
|
6
|
+
"options": {
|
|
7
|
+
"version": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "2.4.2",
|
|
10
|
+
"description": "Biome version to install"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"installsAfter": ["ghcr.io/devcontainers/features/node"]
|
|
16
14
|
}
|
|
@@ -52,24 +52,41 @@ fi
|
|
|
52
52
|
|
|
53
53
|
echo "[ccms] Installing for user: ${USERNAME}"
|
|
54
54
|
|
|
55
|
+
# === BUILD CACHE ===
|
|
56
|
+
CACHE_DIR="/workspaces/.devcontainer/.build-cache/bin"
|
|
57
|
+
|
|
55
58
|
# === INSTALL ===
|
|
56
59
|
REPO_URL="https://github.com/mkusaka/ccms"
|
|
57
60
|
|
|
58
|
-
if [ "${
|
|
59
|
-
echo "[ccms]
|
|
60
|
-
|
|
61
|
+
if [ -x "${CACHE_DIR}/ccms" ]; then
|
|
62
|
+
echo "[ccms] Using cached binary from ${CACHE_DIR}/ccms"
|
|
63
|
+
cp "${CACHE_DIR}/ccms" /usr/local/bin/ccms
|
|
64
|
+
chmod +x /usr/local/bin/ccms
|
|
61
65
|
else
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
66
|
+
if [ "${CCMS_VERSION}" = "latest" ]; then
|
|
67
|
+
echo "[ccms] Building from main branch..."
|
|
68
|
+
cargo install --git "${REPO_URL}" --rev f90d259a4476 2>&1 | tail -5
|
|
69
|
+
else
|
|
70
|
+
echo "[ccms] Building from ref: ${CCMS_VERSION}..."
|
|
71
|
+
cargo install --git "${REPO_URL}" --rev "${CCMS_VERSION}" 2>&1 | tail -5
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# === ENSURE BINARY IS ON PATH ===
|
|
75
|
+
# cargo install puts binaries in $CARGO_HOME/bin or ~/.cargo/bin
|
|
76
|
+
# Symlink to /usr/local/bin so it's available to all users
|
|
77
|
+
CARGO_BIN="${CARGO_HOME:-$HOME/.cargo}/bin/ccms"
|
|
78
|
+
if [ -f "${CARGO_BIN}" ] && [ ! -f /usr/local/bin/ccms ]; then
|
|
79
|
+
ln -s "${CARGO_BIN}" /usr/local/bin/ccms
|
|
80
|
+
echo "[ccms] Symlinked ${CARGO_BIN} → /usr/local/bin/ccms"
|
|
81
|
+
fi
|
|
65
82
|
|
|
66
|
-
#
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
83
|
+
# Cache the binary for future rebuilds
|
|
84
|
+
mkdir -p "${CACHE_DIR}"
|
|
85
|
+
CARGO_BIN="${CARGO_HOME:-$HOME/.cargo}/bin/ccms"
|
|
86
|
+
if [ -f "${CARGO_BIN}" ]; then
|
|
87
|
+
cp "${CARGO_BIN}" "${CACHE_DIR}/ccms"
|
|
88
|
+
echo "[ccms] Cached binary to ${CACHE_DIR}/ccms"
|
|
89
|
+
fi
|
|
73
90
|
fi
|
|
74
91
|
|
|
75
92
|
# === VERIFICATION ===
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Claude Session Dashboard (devcontainer feature)
|
|
2
|
+
|
|
3
|
+
Installs [claude-session-dashboard](https://github.com/dlupiak/claude-session-dashboard) — a local analytics dashboard for Claude Code sessions.
|
|
4
|
+
|
|
5
|
+
## What it provides
|
|
6
|
+
|
|
7
|
+
- `claude-dashboard` command to launch the web UI
|
|
8
|
+
- Session browsing with full-text search and filtering
|
|
9
|
+
- Token usage breakdown, cost estimates, and activity heatmaps
|
|
10
|
+
- Tool call timeline visualization
|
|
11
|
+
- Per-project aggregated analytics
|
|
12
|
+
- Settings persisted across container rebuilds via symlink to `/workspaces/.claude-dashboard/`
|
|
13
|
+
|
|
14
|
+
## Options
|
|
15
|
+
|
|
16
|
+
| Option | Default | Description |
|
|
17
|
+
|--------|---------|-------------|
|
|
18
|
+
| `version` | `latest` | npm package version (`latest`, `1.0.0`, or `none` to skip) |
|
|
19
|
+
| `port` | `3000` | Default port for the dashboard server |
|
|
20
|
+
| `shells` | `both` | Shell configs to add alias to (`bash`, `zsh`, `both`) |
|
|
21
|
+
| `username` | `automatic` | Container user to install for |
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Start the dashboard (default port 3000)
|
|
27
|
+
claude-dashboard
|
|
28
|
+
|
|
29
|
+
# Start on a custom port
|
|
30
|
+
claude-dashboard -p 8080
|
|
31
|
+
|
|
32
|
+
# Show help
|
|
33
|
+
claude-dashboard --help
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The dashboard reads session data from `~/.claude/projects/` (symlinked to `/workspaces/.claude/projects/` in this devcontainer).
|
|
37
|
+
|
|
38
|
+
## How persistence works
|
|
39
|
+
|
|
40
|
+
Dashboard settings and cache are stored at `~/.claude-dashboard/`. Since the home directory is ephemeral in devcontainers, a poststart hook symlinks `~/.claude-dashboard` → `/workspaces/.claude-dashboard/`, which is bind-mounted and survives rebuilds.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "claude-session-dashboard",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"name": "Claude Session Dashboard",
|
|
5
|
+
"description": "Local analytics dashboard for Claude Code sessions (token usage, tool calls, cost estimates)",
|
|
6
|
+
"maintainer": "AnExiledDev",
|
|
7
|
+
"documentationURL": "https://github.com/dlupiak/claude-session-dashboard",
|
|
8
|
+
"options": {
|
|
9
|
+
"version": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "Dashboard version (e.g., 'latest', '1.0.0', 'none' to skip)",
|
|
12
|
+
"default": "latest"
|
|
13
|
+
},
|
|
14
|
+
"port": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Default port for the dashboard server",
|
|
17
|
+
"default": "3000"
|
|
18
|
+
},
|
|
19
|
+
"shells": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Which shells to configure aliases in (bash, zsh, or both)",
|
|
22
|
+
"default": "both",
|
|
23
|
+
"enum": ["bash", "zsh", "both"],
|
|
24
|
+
"proposals": ["bash", "zsh", "both"]
|
|
25
|
+
},
|
|
26
|
+
"username": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"description": "Container user to install for",
|
|
29
|
+
"default": "automatic"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"installsAfter": [
|
|
33
|
+
"ghcr.io/devcontainers/features/node:1"
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# ==============================
|
|
5
|
+
# Claude Session Dashboard
|
|
6
|
+
# DevContainer Feature Installer
|
|
7
|
+
# ==============================
|
|
8
|
+
|
|
9
|
+
# === IMPORT OPTIONS ===
|
|
10
|
+
DASHBOARD_VERSION="${VERSION:-latest}"
|
|
11
|
+
PORT="${PORT:-3000}"
|
|
12
|
+
SHELLS="${SHELLS:-both}"
|
|
13
|
+
USERNAME="${USERNAME:-automatic}"
|
|
14
|
+
|
|
15
|
+
# === SKIP IF DISABLED ===
|
|
16
|
+
if [ "${DASHBOARD_VERSION}" = "none" ]; then
|
|
17
|
+
echo "[claude-session-dashboard] Skipping installation (version=none)"
|
|
18
|
+
exit 0
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
echo "[claude-session-dashboard] Starting installation..."
|
|
22
|
+
|
|
23
|
+
# === SOURCE NVM ===
|
|
24
|
+
if [ -f /usr/local/share/nvm/nvm.sh ]; then
|
|
25
|
+
source /usr/local/share/nvm/nvm.sh
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# === VALIDATE DEPENDENCIES ===
|
|
29
|
+
if ! command -v npm &>/dev/null; then
|
|
30
|
+
echo "[claude-session-dashboard] ERROR: npm is not available"
|
|
31
|
+
echo " Ensure the node feature is installed first"
|
|
32
|
+
exit 1
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
NODE_MAJOR="$(node --version 2>/dev/null | sed 's/v\([0-9]*\).*/\1/' || echo 0)"
|
|
36
|
+
if [ "${NODE_MAJOR}" -lt 18 ]; then
|
|
37
|
+
echo "[claude-session-dashboard] ERROR: Node.js >= 18 required (found v${NODE_MAJOR})"
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
# === VALIDATE INPUT ===
|
|
42
|
+
if [[ ! "${SHELLS}" =~ ^(bash|zsh|both)$ ]]; then
|
|
43
|
+
echo "[claude-session-dashboard] ERROR: shells must be 'bash', 'zsh', or 'both'"
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
if [[ ! "${DASHBOARD_VERSION}" =~ ^[a-zA-Z0-9._-]+$ ]]; then
|
|
48
|
+
echo "[claude-session-dashboard] ERROR: version contains invalid characters"
|
|
49
|
+
exit 1
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
# === DETECT USER ===
|
|
53
|
+
if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then
|
|
54
|
+
USERNAME=""
|
|
55
|
+
for CURRENT_USER in vscode node codespace; do
|
|
56
|
+
if id -u "${CURRENT_USER}" >/dev/null 2>&1; then
|
|
57
|
+
USERNAME=${CURRENT_USER}
|
|
58
|
+
break
|
|
59
|
+
fi
|
|
60
|
+
done
|
|
61
|
+
[ -z "${USERNAME}" ] && USERNAME=root
|
|
62
|
+
elif [ "${USERNAME}" = "none" ] || ! id -u "${USERNAME}" >/dev/null 2>&1; then
|
|
63
|
+
USERNAME=root
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
USER_HOME=$(eval echo "~${USERNAME}")
|
|
67
|
+
if [ ! -d "${USER_HOME}" ]; then
|
|
68
|
+
echo "[claude-session-dashboard] ERROR: Home directory not found for user ${USERNAME}"
|
|
69
|
+
exit 1
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
echo "[claude-session-dashboard] Installing for user: ${USERNAME}"
|
|
73
|
+
|
|
74
|
+
# === INSTALL VIA NPM ===
|
|
75
|
+
echo "[claude-session-dashboard] Installing claude-session-dashboard@${DASHBOARD_VERSION} globally..."
|
|
76
|
+
npm install -g "claude-session-dashboard@${DASHBOARD_VERSION}"
|
|
77
|
+
|
|
78
|
+
# === PERSISTENCE SYMLINK (POSTSTART HOOK) ===
|
|
79
|
+
# Settings/cache live at ~/.claude-dashboard, which is ephemeral (/home/vscode).
|
|
80
|
+
# Create a poststart hook to symlink it to /workspaces/.claude-dashboard for persistence.
|
|
81
|
+
POSTSTART_DIR="/usr/local/devcontainer-poststart.d"
|
|
82
|
+
HOOK_SCRIPT="${POSTSTART_DIR}/claude-dashboard-symlink.sh"
|
|
83
|
+
|
|
84
|
+
mkdir -p "${POSTSTART_DIR}"
|
|
85
|
+
cat > "${HOOK_SCRIPT}" << 'HOOKEOF'
|
|
86
|
+
#!/bin/bash
|
|
87
|
+
# Symlink ~/.claude-dashboard → /workspaces/.claude-dashboard for persistence
|
|
88
|
+
DASHBOARD_DATA="/workspaces/.claude-dashboard"
|
|
89
|
+
USER_HOME="${HOME:-/home/vscode}"
|
|
90
|
+
LINK_PATH="${USER_HOME}/.claude-dashboard"
|
|
91
|
+
|
|
92
|
+
mkdir -p "${DASHBOARD_DATA}"
|
|
93
|
+
|
|
94
|
+
# Already correct symlink — nothing to do
|
|
95
|
+
if [ -L "${LINK_PATH}" ]; then
|
|
96
|
+
CURRENT_TARGET="$(readlink "${LINK_PATH}")"
|
|
97
|
+
if [ "${CURRENT_TARGET}" = "${DASHBOARD_DATA}" ]; then
|
|
98
|
+
exit 0
|
|
99
|
+
fi
|
|
100
|
+
rm "${LINK_PATH}"
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
# Real directory exists — merge contents, then replace with symlink
|
|
104
|
+
if [ -d "${LINK_PATH}" ]; then
|
|
105
|
+
cp -rn "${LINK_PATH}/." "${DASHBOARD_DATA}/" 2>/dev/null || true
|
|
106
|
+
rm -rf "${LINK_PATH}"
|
|
107
|
+
fi
|
|
108
|
+
|
|
109
|
+
ln -s "${DASHBOARD_DATA}" "${LINK_PATH}"
|
|
110
|
+
HOOKEOF
|
|
111
|
+
chmod +x "${HOOK_SCRIPT}"
|
|
112
|
+
echo "[claude-session-dashboard] Created poststart hook for settings persistence"
|
|
113
|
+
|
|
114
|
+
# === SHELL ALIASES ===
|
|
115
|
+
ALIAS_CMD="alias claude-dashboard=\"claude-dashboard --port ${PORT}\""
|
|
116
|
+
|
|
117
|
+
configure_shell() {
|
|
118
|
+
local shell_rc="$1"
|
|
119
|
+
local shell_name="$2"
|
|
120
|
+
|
|
121
|
+
if [ ! -f "${shell_rc}" ]; then
|
|
122
|
+
echo "[claude-session-dashboard] Creating ${shell_name} config: ${shell_rc}"
|
|
123
|
+
sudo -u "${USERNAME}" touch "${shell_rc}"
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
if grep -q "alias claude-dashboard=" "${shell_rc}"; then
|
|
127
|
+
echo "[claude-session-dashboard] ${shell_name} alias already configured. Skipping..."
|
|
128
|
+
else
|
|
129
|
+
echo "[claude-session-dashboard] Adding alias to ${shell_name}"
|
|
130
|
+
echo "${ALIAS_CMD}" >> "${shell_rc}"
|
|
131
|
+
chown "${USERNAME}:${USERNAME}" "${shell_rc}" 2>/dev/null || true
|
|
132
|
+
fi
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if [ "${SHELLS}" = "bash" ] || [ "${SHELLS}" = "both" ]; then
|
|
136
|
+
configure_shell "${USER_HOME}/.bashrc" "bash"
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
if [ "${SHELLS}" = "zsh" ] || [ "${SHELLS}" = "both" ]; then
|
|
140
|
+
configure_shell "${USER_HOME}/.zshrc" "zsh"
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
# === VERIFICATION ===
|
|
144
|
+
echo "[claude-session-dashboard] Verifying installation..."
|
|
145
|
+
if command -v claude-dashboard &>/dev/null; then
|
|
146
|
+
INSTALLED_VERSION="$(claude-dashboard --version 2>/dev/null || echo "unknown")"
|
|
147
|
+
echo "[claude-session-dashboard] ✓ claude-dashboard installed (${INSTALLED_VERSION})"
|
|
148
|
+
else
|
|
149
|
+
echo "[claude-session-dashboard] WARNING: claude-dashboard not found in PATH"
|
|
150
|
+
echo " The global npm install may need PATH adjustment"
|
|
151
|
+
echo " Try: npx claude-session-dashboard --version"
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
# === SUMMARY ===
|
|
155
|
+
echo ""
|
|
156
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
157
|
+
echo " Claude Session Dashboard Installation Complete"
|
|
158
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
159
|
+
echo ""
|
|
160
|
+
echo "Configuration:"
|
|
161
|
+
echo " • User: ${USERNAME}"
|
|
162
|
+
echo " • Version: ${DASHBOARD_VERSION}"
|
|
163
|
+
echo " • Default port: ${PORT}"
|
|
164
|
+
echo " • Shells: ${SHELLS}"
|
|
165
|
+
echo " • Settings persist to: /workspaces/.claude-dashboard/"
|
|
166
|
+
echo ""
|
|
167
|
+
echo "Usage:"
|
|
168
|
+
echo " claude-dashboard # Start on port ${PORT}"
|
|
169
|
+
echo " claude-dashboard -p 8080 # Start on custom port"
|
|
170
|
+
echo " claude-dashboard --help # Full options"
|
|
171
|
+
echo ""
|
|
172
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|