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.
Files changed (194) hide show
  1. package/.devcontainer/.env +7 -1
  2. package/.devcontainer/.gitignore +1 -0
  3. package/.devcontainer/CHANGELOG.md +106 -0
  4. package/.devcontainer/CLAUDE.md +93 -15
  5. package/.devcontainer/README.md +44 -10
  6. package/.devcontainer/config/defaults/main-system-prompt.md +28 -0
  7. package/.devcontainer/config/defaults/rules/workspace-scope.md +13 -4
  8. package/.devcontainer/config/defaults/settings.json +5 -3
  9. package/.devcontainer/config/defaults/writing-system-prompt.md +46 -4
  10. package/.devcontainer/connect-external-terminal.ps1 +1 -1
  11. package/.devcontainer/devcontainer.json +41 -11
  12. package/.devcontainer/docs/configuration-reference.md +3 -0
  13. package/.devcontainer/docs/plugins.md +9 -2
  14. package/.devcontainer/docs/troubleshooting.md +2 -2
  15. package/.devcontainer/features/README.md +8 -9
  16. package/.devcontainer/features/agent-browser/devcontainer-feature.json +21 -21
  17. package/.devcontainer/features/agent-browser/install.sh +0 -7
  18. package/.devcontainer/features/ast-grep/devcontainer-feature.json +22 -22
  19. package/.devcontainer/features/biome/devcontainer-feature.json +12 -14
  20. package/.devcontainer/features/ccms/install.sh +30 -13
  21. package/.devcontainer/features/claude-session-dashboard/README.md +40 -0
  22. package/.devcontainer/features/claude-session-dashboard/devcontainer-feature.json +35 -0
  23. package/.devcontainer/features/claude-session-dashboard/install.sh +172 -0
  24. package/.devcontainer/features/lsp-servers/devcontainer-feature.json +43 -43
  25. package/.devcontainer/features/mcp-qdrant/poststart-hook.sh +2 -1
  26. package/.devcontainer/features/ruff/devcontainer-feature.json +17 -19
  27. package/.devcontainer/features/tmux/install.sh +2 -2
  28. package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +24 -3
  29. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/.claude-plugin/plugin.json +8 -0
  30. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/AGENT-REDIRECTION.md +7 -12
  31. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/REVIEW-RUBRIC.md +1 -1
  32. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/hooks/hooks.json +29 -0
  33. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/redirect-builtin-agents.py +17 -6
  34. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/README.md +81 -0
  35. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/README.md +92 -0
  36. package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/README.md +41 -0
  37. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/README.md +72 -0
  38. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +73 -47
  39. package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/README.md +42 -0
  40. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/README.md +86 -0
  41. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/hooks/hooks.json +25 -15
  42. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected-bash.py +122 -0
  43. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +3 -3
  44. package/.devcontainer/plugins/devs-marketplace/plugins/session-context/.claude-plugin/plugin.json +8 -0
  45. package/.devcontainer/plugins/devs-marketplace/plugins/session-context/hooks/hooks.json +34 -0
  46. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/.claude-plugin/plugin.json +8 -0
  47. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/hooks/hooks.json +29 -0
  48. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/skills/team/SKILL.md +205 -0
  49. package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/.claude-plugin/plugin.json +8 -0
  50. package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/hooks/hooks.json +17 -0
  51. package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/skills/spec-init/references/roadmap-template.md +33 -0
  52. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/README.md +96 -0
  53. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/hooks/hooks.json +17 -0
  54. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/README.md +94 -0
  55. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/guard-workspace-scope.py +1 -3
  56. package/.devcontainer/scripts/check-setup.sh +1 -1
  57. package/.devcontainer/scripts/setup-projects.sh +24 -17
  58. package/.devcontainer/scripts/setup.sh +48 -5
  59. package/README.md +17 -8
  60. package/package.json +1 -2
  61. package/.devcontainer/features/mcp-reasoner/README.md +0 -177
  62. package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +0 -25
  63. package/.devcontainer/features/mcp-reasoner/install.sh +0 -184
  64. package/.devcontainer/features/mcp-reasoner/poststart-hook.sh +0 -67
  65. package/.devcontainer/features/splitrail/README.md +0 -140
  66. package/.devcontainer/features/splitrail/devcontainer-feature.json +0 -39
  67. package/.devcontainer/features/splitrail/install.sh +0 -136
  68. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/.claude-plugin/plugin.json +0 -8
  69. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +0 -112
  70. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/advisory-test-runner.cpython-314.pyc +0 -0
  71. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/collect-edited-files.cpython-314.pyc +0 -0
  72. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/commit-reminder.cpython-314.pyc +0 -0
  73. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/git-state-injector.cpython-314.pyc +0 -0
  74. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/guard-readonly-bash.cpython-314.pyc +0 -0
  75. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/redirect-builtin-agents.cpython-314.pyc +0 -0
  76. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/skill-suggester.cpython-314.pyc +0 -0
  77. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/syntax-validator.cpython-314.pyc +0 -0
  78. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/ticket-linker.cpython-314.pyc +0 -0
  79. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/todo-harvester.cpython-314.pyc +0 -0
  80. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-no-regression.cpython-314.pyc +0 -0
  81. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-tests-pass.cpython-314.pyc +0 -0
  82. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/collect-edited-files.py +0 -46
  83. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/syntax-validator.py +0 -146
  84. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/.claude-plugin/commands/debug.md +0 -0
  85. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/architect.md +0 -0
  86. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/bash-exec.md +0 -0
  87. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/claude-guide.md +0 -0
  88. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/debug-logs.md +0 -0
  89. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/dependency-analyst.md +0 -0
  90. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/doc-writer.md +0 -0
  91. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/explorer.md +0 -0
  92. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/generalist.md +0 -0
  93. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/git-archaeologist.md +0 -0
  94. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/migrator.md +0 -0
  95. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/perf-profiler.md +0 -0
  96. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/refactorer.md +0 -0
  97. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/researcher.md +0 -0
  98. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/security-auditor.md +0 -0
  99. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/spec-writer.md +0 -0
  100. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/statusline-config.md +0 -0
  101. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/test-writer.md +0 -0
  102. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/guard-readonly-bash.py +0 -0
  103. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/inject-cwd.py +0 -0
  104. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/verify-no-regression.py +0 -0
  105. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/verify-tests-pass.py +0 -0
  106. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → auto-code-quality}/scripts/advisory-test-runner.py +0 -0
  107. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/commit-reminder.py +0 -0
  108. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/git-state-injector.py +0 -0
  109. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/todo-harvester.py +0 -0
  110. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/scripts/skill-suggester.py +0 -0
  111. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/SKILL.md +0 -0
  112. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/references/error-handling.md +0 -0
  113. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/references/rest-conventions.md +0 -0
  114. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/ast-grep-patterns/SKILL.md +0 -0
  115. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/ast-grep-patterns/references/language-patterns.md +0 -0
  116. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-agent-sdk/SKILL.md +0 -0
  117. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-agent-sdk/references/sdk-typescript-reference.md +0 -0
  118. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/SKILL.md +0 -0
  119. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/references/cli-flags-and-output.md +0 -0
  120. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/references/sdk-and-mcp.md +0 -0
  121. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/SKILL.md +0 -0
  122. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/references/error-patterns.md +0 -0
  123. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/references/log-locations.md +0 -0
  124. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/SKILL.md +0 -0
  125. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/references/ecosystem-commands.md +0 -0
  126. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/references/license-compliance.md +0 -0
  127. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/SKILL.md +0 -0
  128. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/references/compose-services.md +0 -0
  129. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/references/dockerfile-patterns.md +0 -0
  130. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/SKILL.md +0 -0
  131. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/references/container-lifecycle.md +0 -0
  132. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/references/resources-and-security.md +0 -0
  133. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/SKILL.md +0 -0
  134. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/references/api-doc-templates.md +0 -0
  135. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/references/docstring-formats.md +0 -0
  136. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/SKILL.md +0 -0
  137. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/middleware-and-lifespan.md +0 -0
  138. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/pydantic-models.md +0 -0
  139. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/routing-and-dependencies.md +0 -0
  140. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/sse-and-streaming.md +0 -0
  141. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/SKILL.md +0 -0
  142. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/references/advanced-commands.md +0 -0
  143. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/references/investigation-playbooks.md +0 -0
  144. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/SKILL.md +0 -0
  145. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/references/javascript-migrations.md +0 -0
  146. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/references/python-migrations.md +0 -0
  147. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/SKILL.md +0 -0
  148. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/references/interpreting-results.md +0 -0
  149. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/references/tool-commands.md +0 -0
  150. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/SKILL.md +0 -0
  151. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/references/agents-and-tools.md +0 -0
  152. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/references/models-and-streaming.md +0 -0
  153. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/SKILL.md +0 -0
  154. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/references/safe-transformations.md +0 -0
  155. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/references/smell-catalog.md +0 -0
  156. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/SKILL.md +0 -0
  157. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/references/owasp-patterns.md +0 -0
  158. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/references/secrets-patterns.md +0 -0
  159. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/SKILL.md +0 -0
  160. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/cross-vendor-principles.md +0 -0
  161. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/patterns-and-antipatterns.md +0 -0
  162. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/skill-authoring-patterns.md +0 -0
  163. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/SKILL.md +0 -0
  164. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/advanced-queries.md +0 -0
  165. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/javascript-patterns.md +0 -0
  166. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/python-patterns.md +0 -0
  167. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/schema-and-pragmas.md +0 -0
  168. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/SKILL.md +0 -0
  169. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/ai-sdk-svelte.md +0 -0
  170. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/component-patterns.md +0 -0
  171. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/layercake.md +0 -0
  172. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/migration-guide.md +0 -0
  173. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/runes-and-reactivity.md +0 -0
  174. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/spa-and-routing.md +0 -0
  175. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/svelte-dnd-action.md +0 -0
  176. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/SKILL.md +0 -0
  177. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/references/fastapi-testing.md +0 -0
  178. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/references/svelte-testing.md +0 -0
  179. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/scripts/spec-reminder.py +0 -0
  180. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-build/SKILL.md +0 -0
  181. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-build/references/review-checklist.md +0 -0
  182. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-check/SKILL.md +0 -0
  183. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/SKILL.md +0 -0
  184. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/references/backlog-template.md +0 -0
  185. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/references/milestones-template.md +0 -0
  186. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-new/SKILL.md +0 -0
  187. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-new/references/template.md +0 -0
  188. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-refine/SKILL.md +0 -0
  189. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-review/SKILL.md +0 -0
  190. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-update/SKILL.md +0 -0
  191. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/SKILL.md +0 -0
  192. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/references/criteria-patterns.md +0 -0
  193. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/references/ears-templates.md +0 -0
  194. /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, biome, lsp-servers)
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
- "ghcr.io/anthropics/devcontainer-features/claude-code:1": {},
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": "bash",
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": "bash",
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
- └── code-directive/ # Agents, skills, hooks
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
- - **16 coding skills** — Domain-specific reference materials (FastAPI, Docker, testing patterns, etc.)
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 (4GB+ recommended). CodeForge sets `--memory=4g` by default.
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 4GB RAM / 8GB swap. Increase in `devcontainer.json` `runArgs`.
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 | ✅ New |
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 are being converted to DevContainer Features:
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
- "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": "latest"
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
- ]
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
- "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": "latest"
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
- ]
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
- "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": "latest",
10
- "description": "Biome version to install"
11
- }
12
- },
13
- "installsAfter": [
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 [ "${CCMS_VERSION}" = "latest" ]; then
59
- echo "[ccms] Building from main branch..."
60
- cargo install --git "${REPO_URL}" 2>&1 | tail -5
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
- echo "[ccms] Building from ref: ${CCMS_VERSION}..."
63
- cargo install --git "${REPO_URL}" --rev "${CCMS_VERSION}" 2>&1 | tail -5
64
- fi
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
- # === ENSURE BINARY IS ON PATH ===
67
- # cargo install puts binaries in $CARGO_HOME/bin or ~/.cargo/bin
68
- # Symlink to /usr/local/bin so it's available to all users
69
- CARGO_BIN="${CARGO_HOME:-$HOME/.cargo}/bin/ccms"
70
- if [ -f "${CARGO_BIN}" ] && [ ! -f /usr/local/bin/ccms ]; then
71
- ln -s "${CARGO_BIN}" /usr/local/bin/ccms
72
- echo "[ccms] Symlinked ${CARGO_BIN} → /usr/local/bin/ccms"
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 "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"