codeforge-dev 1.14.1 → 2.0.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/config/defaults → .codeforge/config}/ccstatusline-settings.json +44 -6
- package/{.devcontainer/config/defaults → .codeforge/config}/main-system-prompt.md +14 -6
- package/.codeforge/config/orchestrator-system-prompt.md +333 -0
- package/{.devcontainer/config/defaults → .codeforge/config}/settings.json +3 -1
- package/{.devcontainer/config → .codeforge}/file-manifest.json +15 -9
- package/{.devcontainer → .codeforge/scripts}/connect-external-terminal.sh +3 -1
- package/.devcontainer/.env.example +5 -5
- package/.devcontainer/.secrets.example +3 -0
- package/.devcontainer/CHANGELOG.md +251 -3
- package/.devcontainer/CLAUDE.md +129 -22
- package/.devcontainer/README.md +34 -19
- package/.devcontainer/devcontainer.json +28 -10
- package/.devcontainer/features/agent-browser/install.sh +2 -0
- package/.devcontainer/features/ast-grep/install.sh +2 -0
- package/.devcontainer/features/biome/install.sh +2 -0
- package/.devcontainer/features/ccburn/devcontainer-feature.json +0 -5
- package/.devcontainer/features/ccburn/install.sh +2 -0
- package/.devcontainer/features/ccms/install.sh +2 -0
- package/.devcontainer/features/ccstatusline/README.md +7 -6
- package/.devcontainer/features/ccstatusline/install.sh +9 -4
- package/.devcontainer/features/ccusage/devcontainer-feature.json +0 -5
- package/.devcontainer/features/ccusage/install.sh +2 -0
- package/.devcontainer/features/chromaterm/chromaterm.yml +2 -2
- package/.devcontainer/features/chromaterm/install.sh +2 -0
- package/.devcontainer/features/claude-code-native/README.md +47 -0
- package/.devcontainer/features/claude-code-native/devcontainer-feature.json +29 -0
- package/.devcontainer/features/claude-code-native/install.sh +131 -0
- package/.devcontainer/features/claude-monitor/devcontainer-feature.json +0 -5
- package/.devcontainer/features/claude-monitor/install.sh +2 -0
- package/.devcontainer/features/claude-session-dashboard/README.md +2 -2
- package/.devcontainer/features/claude-session-dashboard/devcontainer-feature.json +1 -2
- package/.devcontainer/features/claude-session-dashboard/install.sh +2 -0
- package/.devcontainer/features/dprint/install.sh +2 -0
- package/.devcontainer/features/hadolint/install.sh +2 -0
- package/.devcontainer/features/kitty-terminfo/README.md +3 -1
- package/.devcontainer/features/kitty-terminfo/install.sh +2 -0
- package/.devcontainer/features/lsp-servers/install.sh +2 -0
- package/.devcontainer/features/mcp-qdrant/CHANGES.md +3 -3
- package/.devcontainer/features/mcp-qdrant/README.md +1 -0
- package/.devcontainer/features/mcp-qdrant/devcontainer-feature.json +1 -7
- package/.devcontainer/features/mcp-qdrant/install.sh +9 -2
- package/.devcontainer/features/mcp-qdrant/poststart-hook.sh +9 -2
- package/.devcontainer/features/notify-hook/devcontainer-feature.json +1 -1
- package/.devcontainer/features/notify-hook/install.sh +2 -0
- package/.devcontainer/features/ruff/install.sh +2 -0
- package/.devcontainer/features/shellcheck/install.sh +2 -0
- package/.devcontainer/features/shfmt/install.sh +2 -0
- package/.devcontainer/features/tmux/README.md +3 -3
- package/.devcontainer/features/tmux/install.sh +3 -1
- package/.devcontainer/features/tree-sitter/devcontainer-feature.json +0 -6
- package/.devcontainer/features/tree-sitter/install.sh +2 -0
- package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +27 -11
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/README.md +23 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/agents/claude-guide.md +4 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/agents/documenter.md +254 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/agents/implementer.md +260 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/agents/investigator.md +255 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/agents/tester.md +304 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/README.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/advisory-test-runner.py +4 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +2 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/git-workflow/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/git-workflow/README.md +125 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/git-workflow/skills/pr-review/SKILL.md +325 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/git-workflow/skills/ship/SKILL.md +314 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/prompt-snippets/.claude-plugin/plugin.json +5 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/prompt-snippets/README.md +52 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/prompt-snippets/skills/ps/SKILL.md +37 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected-bash.py +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/session-context/README.md +30 -14
- package/.devcontainer/plugins/devs-marketplace/plugins/session-context/hooks/hooks.json +13 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/session-context/scripts/collect-session-edits.py +44 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/session-context/scripts/commit-reminder.py +89 -10
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/.claude-plugin/plugin.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/README.md +19 -11
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/scripts/skill-suggester.py +476 -282
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/skills/worktree/SKILL.md +227 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/skills/worktree/references/manual-worktree-commands.md +238 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/skills/worktree/references/parallel-workflow-patterns.md +228 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/scripts/ticket-linker.py +2 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/README.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/guard-workspace-scope.py +3 -2
- package/.devcontainer/scripts/check-setup.sh +5 -3
- package/.devcontainer/scripts/preflight.sh +113 -0
- package/.devcontainer/scripts/setup-aliases.sh +13 -8
- package/.devcontainer/scripts/setup-auth.sh +46 -0
- package/.devcontainer/scripts/setup-config.sh +29 -10
- package/.devcontainer/scripts/setup-migrate-claude.sh +80 -0
- package/.devcontainer/scripts/setup-migrate-codeforge.sh +60 -0
- package/.devcontainer/scripts/setup-plugins.sh +3 -1
- package/.devcontainer/scripts/setup-projects.sh +3 -1
- package/.devcontainer/scripts/setup-terminal.sh +3 -1
- package/.devcontainer/scripts/setup-update-claude.sh +22 -27
- package/.devcontainer/scripts/setup.sh +57 -5
- package/LICENSE.txt +14 -0
- package/README.md +79 -5
- package/package.json +2 -1
- package/setup.js +392 -21
- package/.devcontainer/docs/configuration-reference.md +0 -93
- package/.devcontainer/docs/keybindings.md +0 -100
- package/.devcontainer/docs/optional-features.md +0 -64
- package/.devcontainer/docs/plugins.md +0 -176
- package/.devcontainer/docs/troubleshooting.md +0 -128
- package/.devcontainer/scripts/setup-symlink-claude.sh +0 -36
- /package/{.devcontainer/config/defaults → .codeforge/config}/keybindings.json +0 -0
- /package/{.devcontainer/config/defaults → .codeforge/config}/rules/session-search.md +0 -0
- /package/{.devcontainer/config/defaults → .codeforge/config}/rules/spec-workflow.md +0 -0
- /package/{.devcontainer/config/defaults → .codeforge/config}/rules/workspace-scope.md +0 -0
- /package/{.devcontainer/config/defaults → .codeforge/config}/writing-system-prompt.md +0 -0
- /package/{.devcontainer → .codeforge/scripts}/connect-external-terminal.ps1 +0 -0
package/.devcontainer/plugins/devs-marketplace/plugins/session-context/scripts/commit-reminder.py
CHANGED
|
@@ -2,21 +2,31 @@
|
|
|
2
2
|
"""
|
|
3
3
|
Commit reminder — Stop hook that advises about uncommitted changes.
|
|
4
4
|
|
|
5
|
-
On Stop, checks
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
On Stop, checks whether this session edited any files (via the tmp file
|
|
6
|
+
written by collect-session-edits.py) and whether uncommitted changes exist.
|
|
7
|
+
Uses tiered logic: meaningful changes (3+ files, 2+ source files, or test
|
|
8
|
+
files touched) get an advisory suggestion; small changes are silent.
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
before finishing. The stop_hook_active guard prevents infinite loops.
|
|
10
|
+
Output is a systemMessage wrapped in <system-reminder> tags — advisory only,
|
|
11
|
+
never blocks. The stop_hook_active guard prevents loops.
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
14
|
import json
|
|
15
|
+
import os
|
|
15
16
|
import subprocess
|
|
16
17
|
import sys
|
|
17
18
|
|
|
18
19
|
GIT_CMD_TIMEOUT = 5
|
|
19
20
|
|
|
21
|
+
# Extensions considered source code (not config/docs)
|
|
22
|
+
SOURCE_EXTS = frozenset((
|
|
23
|
+
".py", ".ts", ".tsx", ".js", ".jsx", ".go", ".rs",
|
|
24
|
+
".java", ".kt", ".rb", ".svelte", ".vue", ".c", ".cpp", ".h",
|
|
25
|
+
))
|
|
26
|
+
|
|
27
|
+
# Patterns that indicate test files
|
|
28
|
+
TEST_PATTERNS = ("test_", "_test.", ".test.", ".spec.", "/tests/", "/test/")
|
|
29
|
+
|
|
20
30
|
|
|
21
31
|
def _run_git(args: list[str]) -> str | None:
|
|
22
32
|
"""Run a git command and return stdout, or None on any failure."""
|
|
@@ -34,6 +44,58 @@ def _run_git(args: list[str]) -> str | None:
|
|
|
34
44
|
return None
|
|
35
45
|
|
|
36
46
|
|
|
47
|
+
def _read_session_edits(session_id: str) -> list[str]:
|
|
48
|
+
"""Read the list of files edited this session."""
|
|
49
|
+
tmp_path = f"/tmp/claude-session-edits-{session_id}"
|
|
50
|
+
try:
|
|
51
|
+
with open(tmp_path, "r") as f:
|
|
52
|
+
raw = f.read()
|
|
53
|
+
except OSError:
|
|
54
|
+
return []
|
|
55
|
+
|
|
56
|
+
seen: set[str] = set()
|
|
57
|
+
result: list[str] = []
|
|
58
|
+
for line in raw.strip().splitlines():
|
|
59
|
+
path = line.strip()
|
|
60
|
+
if path and path not in seen:
|
|
61
|
+
seen.add(path)
|
|
62
|
+
result.append(path)
|
|
63
|
+
return result
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _is_source_file(path: str) -> bool:
|
|
67
|
+
"""Check if a file path looks like source code."""
|
|
68
|
+
_, ext = os.path.splitext(path)
|
|
69
|
+
return ext.lower() in SOURCE_EXTS
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _is_test_file(path: str) -> bool:
|
|
73
|
+
"""Check if a file path looks like a test file."""
|
|
74
|
+
lower = path.lower()
|
|
75
|
+
return any(pattern in lower for pattern in TEST_PATTERNS)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _is_meaningful(edited_files: list[str]) -> bool:
|
|
79
|
+
"""Determine if the session's edits are meaningful enough to suggest committing.
|
|
80
|
+
|
|
81
|
+
Meaningful when any of:
|
|
82
|
+
- 3+ total files edited
|
|
83
|
+
- 2+ source code files edited
|
|
84
|
+
- Any test files edited (suggests feature work)
|
|
85
|
+
"""
|
|
86
|
+
if len(edited_files) >= 3:
|
|
87
|
+
return True
|
|
88
|
+
|
|
89
|
+
source_count = sum(1 for f in edited_files if _is_source_file(f))
|
|
90
|
+
if source_count >= 2:
|
|
91
|
+
return True
|
|
92
|
+
|
|
93
|
+
if any(_is_test_file(f) for f in edited_files):
|
|
94
|
+
return True
|
|
95
|
+
|
|
96
|
+
return False
|
|
97
|
+
|
|
98
|
+
|
|
37
99
|
def main():
|
|
38
100
|
try:
|
|
39
101
|
input_data = json.load(sys.stdin)
|
|
@@ -44,7 +106,20 @@ def main():
|
|
|
44
106
|
if input_data.get("stop_hook_active"):
|
|
45
107
|
sys.exit(0)
|
|
46
108
|
|
|
47
|
-
#
|
|
109
|
+
# Only fire if this session actually edited files
|
|
110
|
+
session_id = input_data.get("session_id", "")
|
|
111
|
+
if not session_id:
|
|
112
|
+
sys.exit(0)
|
|
113
|
+
|
|
114
|
+
edited_files = _read_session_edits(session_id)
|
|
115
|
+
if not edited_files:
|
|
116
|
+
sys.exit(0)
|
|
117
|
+
|
|
118
|
+
# Small changes — stay silent
|
|
119
|
+
if not _is_meaningful(edited_files):
|
|
120
|
+
sys.exit(0)
|
|
121
|
+
|
|
122
|
+
# Check if there are any uncommitted changes
|
|
48
123
|
porcelain = _run_git(["status", "--porcelain"])
|
|
49
124
|
if porcelain is None:
|
|
50
125
|
# Not a git repo or git not available
|
|
@@ -79,11 +154,15 @@ def main():
|
|
|
79
154
|
summary = ", ".join(parts) if parts else f"{total} changed"
|
|
80
155
|
|
|
81
156
|
message = (
|
|
82
|
-
|
|
83
|
-
"
|
|
157
|
+
"<system-reminder>\n"
|
|
158
|
+
f"[Session Summary] Modified {total} files ({summary}). "
|
|
159
|
+
"This looks like a complete unit of work.\n"
|
|
160
|
+
"Consider asking the user if they would like to commit.\n"
|
|
161
|
+
"Do NOT commit without explicit user approval.\n"
|
|
162
|
+
"</system-reminder>"
|
|
84
163
|
)
|
|
85
164
|
|
|
86
|
-
json.dump({"
|
|
165
|
+
json.dump({"systemMessage": message}, sys.stdout)
|
|
87
166
|
sys.exit(0)
|
|
88
167
|
|
|
89
168
|
|
package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/.claude-plugin/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skill-engine",
|
|
3
|
-
"description": "
|
|
3
|
+
"description": "22 coding knowledge packs with auto-suggestion for frameworks, tools, and patterns",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "AnExiledDev"
|
|
6
6
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# skill-engine
|
|
2
2
|
|
|
3
|
-
Claude Code plugin that provides
|
|
3
|
+
Claude Code plugin that provides 22 coding knowledge packs (skills) with automatic suggestion based on user prompts. Each skill contains domain-specific instructions and reference material that Claude loads on demand via the `/skill` command.
|
|
4
4
|
|
|
5
5
|
## What It Does
|
|
6
6
|
|
|
7
7
|
Two capabilities:
|
|
8
8
|
|
|
9
|
-
1. **Skill library** —
|
|
9
|
+
1. **Skill library** — 22 skills covering frameworks, tools, and development patterns. Each skill is a structured knowledge pack with a `SKILL.md` entrypoint and `references/` subdirectory containing detailed reference docs.
|
|
10
10
|
|
|
11
11
|
2. **Auto-suggestion** — A `UserPromptSubmit` hook watches user prompts for keyword matches and suggests relevant skills as context, so Claude can proactively load the right knowledge.
|
|
12
12
|
|
|
@@ -35,14 +35,18 @@ Two capabilities:
|
|
|
35
35
|
| svelte5 | Runes, reactivity, components, SPA routing, LayerCake |
|
|
36
36
|
| team | Agent team orchestration, parallel workstreams, task coordination |
|
|
37
37
|
| testing | Testing frameworks, FastAPI testing, Svelte testing |
|
|
38
|
+
| worktree | Git worktree lifecycle, EnterWorktree, parallel development |
|
|
38
39
|
|
|
39
40
|
### Auto-Suggestion
|
|
40
41
|
|
|
41
|
-
The `skill-suggester.py` hook
|
|
42
|
+
The `skill-suggester.py` hook scores user prompts against keyword maps for each skill using weighted matching. Suggestions are ranked by confidence and capped at **3 skills maximum** per prompt.
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
- **Phrases** —
|
|
45
|
-
- **Terms** —
|
|
44
|
+
Each skill defines:
|
|
45
|
+
- **Phrases** — `(substring, weight)` tuples. Weight 0.0–1.0 reflects specificity (e.g., `("build a fastapi app", 1.0)` vs `("pydantic model", 0.3)`)
|
|
46
|
+
- **Terms** — Whole-word regex patterns, all scored at 0.6
|
|
47
|
+
- **Negative patterns** — Substrings that instantly disqualify a skill (e.g., `"pydanticai"` suppresses `fastapi`)
|
|
48
|
+
- **Context guards** — Required co-occurring words for low-confidence matches. When the best score is below 0.6, at least one guard word must appear in the prompt or the match is dropped
|
|
49
|
+
- **Priority** — Integer tie-breaker (10 = commands, 7 = tech, 5 = patterns, 3 = generic)
|
|
46
50
|
|
|
47
51
|
## How It Works
|
|
48
52
|
|
|
@@ -55,9 +59,12 @@ User submits a prompt
|
|
|
55
59
|
|
|
|
56
60
|
+-> skill-suggester.py
|
|
57
61
|
|
|
|
58
|
-
+->
|
|
59
|
-
+->
|
|
60
|
-
+->
|
|
62
|
+
+-> Check negative patterns (instant disqualify)
|
|
63
|
+
+-> Score phrases (best weight) and terms (0.6)
|
|
64
|
+
+-> Enforce context guards on low-confidence matches
|
|
65
|
+
+-> Rank by score desc, priority desc
|
|
66
|
+
+-> Return top 3 as additionalContext
|
|
67
|
+
+-> No matches above threshold? -> Silent (no output)
|
|
61
68
|
```
|
|
62
69
|
|
|
63
70
|
### Skill Structure
|
|
@@ -126,9 +133,9 @@ skill-engine/
|
|
|
126
133
|
+-- hooks/
|
|
127
134
|
| +-- hooks.json # UserPromptSubmit hook registration
|
|
128
135
|
+-- scripts/
|
|
129
|
-
| +-- skill-suggester.py #
|
|
136
|
+
| +-- skill-suggester.py # Weighted scoring skill auto-suggestion
|
|
130
137
|
+-- skills/
|
|
131
|
-
| +-- api-design/ #
|
|
138
|
+
| +-- api-design/ # 22 skill directories
|
|
132
139
|
| +-- ast-grep-patterns/
|
|
133
140
|
| +-- claude-agent-sdk/
|
|
134
141
|
| +-- claude-code-headless/
|
|
@@ -149,6 +156,7 @@ skill-engine/
|
|
|
149
156
|
| +-- svelte5/
|
|
150
157
|
| +-- team/
|
|
151
158
|
| +-- testing/
|
|
159
|
+
| +-- worktree/
|
|
152
160
|
+-- README.md # This file
|
|
153
161
|
```
|
|
154
162
|
|