jdi-cli 0.1.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/AGENTS.md +209 -0
- package/ARCHITECTURE.md +210 -0
- package/COMMANDS.md +241 -0
- package/CREATE-EXAMPLE.md +385 -0
- package/CREATE.md +315 -0
- package/EXTENSION.md +141 -0
- package/LICENSE +21 -0
- package/MEMORY.md +471 -0
- package/PORTABILITY.md +438 -0
- package/README.md +789 -0
- package/bin/git-hooks/post-commit +16 -0
- package/bin/git-hooks/pre-commit +21 -0
- package/bin/jdi-build.ps1 +381 -0
- package/bin/jdi-build.sh +332 -0
- package/bin/jdi-doctor.ps1 +403 -0
- package/bin/jdi-doctor.sh +400 -0
- package/bin/jdi-install-caveman.ps1 +97 -0
- package/bin/jdi-install-caveman.sh +99 -0
- package/bin/jdi-install-playwright.ps1 +319 -0
- package/bin/jdi-install-playwright.sh +284 -0
- package/bin/jdi-install.ps1 +154 -0
- package/bin/jdi-install.sh +132 -0
- package/bin/jdi-uninstall.ps1 +309 -0
- package/bin/jdi-uninstall.sh +264 -0
- package/bin/jdi-update.ps1 +215 -0
- package/bin/jdi-update.sh +209 -0
- package/bin/jdi.js +460 -0
- package/bin/lib/jdi-monitor.ps1 +66 -0
- package/bin/lib/jdi-monitor.sh +74 -0
- package/bin/lib/jdi-truncate.ps1 +96 -0
- package/bin/lib/jdi-truncate.sh +99 -0
- package/bin/lib/ui.js +197 -0
- package/core/agents/jdi-adopter.md +465 -0
- package/core/agents/jdi-architect.md +894 -0
- package/core/agents/jdi-asker.md +153 -0
- package/core/agents/jdi-bootstrap.md +247 -0
- package/core/agents/jdi-planner.md +254 -0
- package/core/agents/jdi-researcher.md +303 -0
- package/core/commands/jdi-adopt.md +155 -0
- package/core/commands/jdi-bootstrap.md +81 -0
- package/core/commands/jdi-create.md +80 -0
- package/core/commands/jdi-discuss.md +80 -0
- package/core/commands/jdi-do.md +200 -0
- package/core/commands/jdi-loop.md +315 -0
- package/core/commands/jdi-new.md +131 -0
- package/core/commands/jdi-plan.md +73 -0
- package/core/commands/jdi-ship.md +146 -0
- package/core/commands/jdi-verify.md +159 -0
- package/core/skills/clean-code/SKILL.md +261 -0
- package/core/skills/dry/SKILL.md +150 -0
- package/core/skills/frontend-rules/SKILL.md +386 -0
- package/core/skills/frontend-validator/SKILL.md +567 -0
- package/core/skills/kiss/SKILL.md +178 -0
- package/core/skills/solid/SKILL.md +281 -0
- package/core/skills/yagni/SKILL.md +207 -0
- package/core/templates/agent.md +72 -0
- package/core/templates/doer-specialist.md +216 -0
- package/core/templates/reviewer-specialist.md +405 -0
- package/core/templates/skill.md +66 -0
- package/package.json +70 -0
- package/runtimes/antigravity/agents.md +74 -0
- package/runtimes/antigravity/skills/clean-code/SKILL.md +252 -0
- package/runtimes/antigravity/skills/dry/SKILL.md +141 -0
- package/runtimes/antigravity/skills/frontend-rules/SKILL.md +376 -0
- package/runtimes/antigravity/skills/frontend-validator/SKILL.md +559 -0
- package/runtimes/antigravity/skills/jdi-adopt/SKILL.md +155 -0
- package/runtimes/antigravity/skills/jdi-adopter/SKILL.md +436 -0
- package/runtimes/antigravity/skills/jdi-architect/SKILL.md +872 -0
- package/runtimes/antigravity/skills/jdi-asker/SKILL.md +125 -0
- package/runtimes/antigravity/skills/jdi-asker/references/context-template.md +34 -0
- package/runtimes/antigravity/skills/jdi-asker/references/decision-format.md +19 -0
- package/runtimes/antigravity/skills/jdi-asker/scripts/find_phase_dir.sh +25 -0
- package/runtimes/antigravity/skills/jdi-bootstrap/SKILL.md +81 -0
- package/runtimes/antigravity/skills/jdi-create/SKILL.md +80 -0
- package/runtimes/antigravity/skills/jdi-discuss/SKILL.md +80 -0
- package/runtimes/antigravity/skills/jdi-discuss/scripts/run_command.sh +62 -0
- package/runtimes/antigravity/skills/jdi-do/SKILL.md +200 -0
- package/runtimes/antigravity/skills/jdi-loop/SKILL.md +315 -0
- package/runtimes/antigravity/skills/jdi-new/SKILL.md +131 -0
- package/runtimes/antigravity/skills/jdi-plan/SKILL.md +73 -0
- package/runtimes/antigravity/skills/jdi-planner/SKILL.md +225 -0
- package/runtimes/antigravity/skills/jdi-researcher/SKILL.md +274 -0
- package/runtimes/antigravity/skills/jdi-ship/SKILL.md +146 -0
- package/runtimes/antigravity/skills/jdi-verify/SKILL.md +159 -0
- package/runtimes/antigravity/skills/kiss/SKILL.md +169 -0
- package/runtimes/antigravity/skills/solid/SKILL.md +272 -0
- package/runtimes/antigravity/skills/yagni/SKILL.md +198 -0
- package/runtimes/claude/CLAUDE.md +91 -0
- package/runtimes/claude/agents/jdi-adopter.md +430 -0
- package/runtimes/claude/agents/jdi-architect.md +864 -0
- package/runtimes/claude/agents/jdi-asker.md +119 -0
- package/runtimes/claude/agents/jdi-bootstrap.md +213 -0
- package/runtimes/claude/agents/jdi-planner.md +221 -0
- package/runtimes/claude/agents/jdi-researcher.md +269 -0
- package/runtimes/claude/commands/jdi-adopt.md +155 -0
- package/runtimes/claude/commands/jdi-bootstrap.md +81 -0
- package/runtimes/claude/commands/jdi-create.md +80 -0
- package/runtimes/claude/commands/jdi-discuss.md +80 -0
- package/runtimes/claude/commands/jdi-do.md +200 -0
- package/runtimes/claude/commands/jdi-loop.md +315 -0
- package/runtimes/claude/commands/jdi-new.md +131 -0
- package/runtimes/claude/commands/jdi-plan.md +73 -0
- package/runtimes/claude/commands/jdi-ship.md +146 -0
- package/runtimes/claude/commands/jdi-verify.md +159 -0
- package/runtimes/claude/settings.example.json +132 -0
- package/runtimes/claude/skills/clean-code/SKILL.md +247 -0
- package/runtimes/claude/skills/dry/SKILL.md +136 -0
- package/runtimes/claude/skills/frontend-rules/SKILL.md +369 -0
- package/runtimes/claude/skills/frontend-validator/SKILL.md +553 -0
- package/runtimes/claude/skills/kiss/SKILL.md +164 -0
- package/runtimes/claude/skills/solid/SKILL.md +267 -0
- package/runtimes/claude/skills/yagni/SKILL.md +193 -0
- package/runtimes/copilot/agents/jdi-adopter.agent.md +430 -0
- package/runtimes/copilot/agents/jdi-architect.agent.md +864 -0
- package/runtimes/copilot/agents/jdi-asker.agent.md +119 -0
- package/runtimes/copilot/agents/jdi-bootstrap.agent.md +213 -0
- package/runtimes/copilot/agents/jdi-planner.agent.md +221 -0
- package/runtimes/copilot/agents/jdi-researcher.agent.md +269 -0
- package/runtimes/copilot/copilot-instructions.md +80 -0
- package/runtimes/copilot/prompts/jdi-adopt.prompt.md +155 -0
- package/runtimes/copilot/prompts/jdi-bootstrap.prompt.md +81 -0
- package/runtimes/copilot/prompts/jdi-create.prompt.md +80 -0
- package/runtimes/copilot/prompts/jdi-discuss.prompt.md +80 -0
- package/runtimes/copilot/prompts/jdi-do.prompt.md +200 -0
- package/runtimes/copilot/prompts/jdi-loop.prompt.md +315 -0
- package/runtimes/copilot/prompts/jdi-new.prompt.md +131 -0
- package/runtimes/copilot/prompts/jdi-plan.prompt.md +73 -0
- package/runtimes/copilot/prompts/jdi-ship.prompt.md +146 -0
- package/runtimes/copilot/prompts/jdi-verify.prompt.md +159 -0
- package/runtimes/opencode/AGENTS.md +87 -0
- package/runtimes/opencode/agents/jdi-adopter.md +434 -0
- package/runtimes/opencode/agents/jdi-architect.md +861 -0
- package/runtimes/opencode/agents/jdi-asker.md +123 -0
- package/runtimes/opencode/agents/jdi-bootstrap.md +217 -0
- package/runtimes/opencode/agents/jdi-planner.md +225 -0
- package/runtimes/opencode/agents/jdi-researcher.md +273 -0
- package/runtimes/opencode/commands/jdi-adopt.md +155 -0
- package/runtimes/opencode/commands/jdi-bootstrap.md +81 -0
- package/runtimes/opencode/commands/jdi-create.md +80 -0
- package/runtimes/opencode/commands/jdi-discuss.md +80 -0
- package/runtimes/opencode/commands/jdi-do.md +200 -0
- package/runtimes/opencode/commands/jdi-loop.md +315 -0
- package/runtimes/opencode/commands/jdi-new.md +131 -0
- package/runtimes/opencode/commands/jdi-plan.md +73 -0
- package/runtimes/opencode/commands/jdi-ship.md +146 -0
- package/runtimes/opencode/commands/jdi-verify.md +159 -0
- package/runtimes/opencode/opencode.example.jsonc +169 -0
- package/runtimes/opencode/skills/clean-code/SKILL.md +247 -0
- package/runtimes/opencode/skills/dry/SKILL.md +136 -0
- package/runtimes/opencode/skills/frontend-rules/SKILL.md +369 -0
- package/runtimes/opencode/skills/frontend-validator/SKILL.md +553 -0
- package/runtimes/opencode/skills/kiss/SKILL.md +164 -0
- package/runtimes/opencode/skills/solid/SKILL.md +267 -0
- package/runtimes/opencode/skills/yagni/SKILL.md +193 -0
- package/templates-jdi-folder/config.json +18 -0
- package/templates-jdi-folder/registry.md +31 -0
- package/templates-jdi-folder/reviewers.md +33 -0
- package/templates-jdi-folder/skills-registry.md +32 -0
- package/templates-jdi-folder/specialists.md +39 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# jdi-doctor: diagnostica ambiente JDI.
|
|
3
|
+
# Uso: ./bin/jdi-doctor.sh [--verbose]
|
|
4
|
+
#
|
|
5
|
+
# Checa:
|
|
6
|
+
# - dependencias bash (git, awk, sed, find)
|
|
7
|
+
# - runtimes detectados (claude, copilot, antigravity)
|
|
8
|
+
# - ctx7 (opcional)
|
|
9
|
+
# - estrutura .jdi/ no projeto atual
|
|
10
|
+
# - git hooks ativos (.githooks/)
|
|
11
|
+
# - source of truth (core/) se rodando do repo JDI
|
|
12
|
+
# - runtimes/ buildados
|
|
13
|
+
# - install no projeto atual
|
|
14
|
+
#
|
|
15
|
+
# Saida: relatorio com OK / WARN / FAIL por check.
|
|
16
|
+
# Exit 0 se tudo OK ou so WARN. Exit 1 se algum FAIL.
|
|
17
|
+
|
|
18
|
+
set -uo pipefail
|
|
19
|
+
|
|
20
|
+
VERBOSE="${1:-}"
|
|
21
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
22
|
+
JDI_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
23
|
+
PROJECT_DIR="$PWD"
|
|
24
|
+
|
|
25
|
+
# Cores (sem cor se nao for tty)
|
|
26
|
+
if [[ -t 1 ]]; then
|
|
27
|
+
GRN=$'\033[32m'; YLW=$'\033[33m'; RED=$'\033[31m'; DIM=$'\033[2m'; RST=$'\033[0m'
|
|
28
|
+
else
|
|
29
|
+
GRN=""; YLW=""; RED=""; DIM=""; RST=""
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
FAILS=0
|
|
33
|
+
WARNS=0
|
|
34
|
+
|
|
35
|
+
ok() { echo " ${GRN}OK${RST} $1"; }
|
|
36
|
+
warn() { echo " ${YLW}WARN${RST} $1"; ((WARNS++)) || true; }
|
|
37
|
+
fail() { echo " ${RED}FAIL${RST} $1"; ((FAILS++)) || true; }
|
|
38
|
+
note() { [[ "$VERBOSE" == "--verbose" ]] && echo " ${DIM}note $1${RST}" || true; }
|
|
39
|
+
section() { echo; echo "${1}"; }
|
|
40
|
+
|
|
41
|
+
# ---------------------------------------------------------------------------
|
|
42
|
+
section "1. Dependencias bash"
|
|
43
|
+
|
|
44
|
+
for cmd in git awk sed find grep; do
|
|
45
|
+
if command -v "$cmd" &>/dev/null; then
|
|
46
|
+
ok "$cmd disponivel ($(command -v "$cmd"))"
|
|
47
|
+
else
|
|
48
|
+
fail "$cmd ausente. Instale (Linux/Mac nativo. Windows: Git Bash ou WSL)."
|
|
49
|
+
fi
|
|
50
|
+
done
|
|
51
|
+
|
|
52
|
+
# ---------------------------------------------------------------------------
|
|
53
|
+
section "2. Runtimes"
|
|
54
|
+
|
|
55
|
+
CLAUDE_OK=false
|
|
56
|
+
if command -v claude &>/dev/null; then
|
|
57
|
+
ok "claude CLI: $(command -v claude)"
|
|
58
|
+
CLAUDE_OK=true
|
|
59
|
+
elif [[ -d "$HOME/.claude" ]]; then
|
|
60
|
+
warn "~/.claude/ existe mas claude CLI nao esta no PATH"
|
|
61
|
+
CLAUDE_OK=true
|
|
62
|
+
else
|
|
63
|
+
warn "Claude Code nao detectado (sem CLI nem ~/.claude/)"
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
COPILOT_OK=false
|
|
67
|
+
if command -v code &>/dev/null; then
|
|
68
|
+
if code --list-extensions 2>/dev/null | grep -qi "github.copilot"; then
|
|
69
|
+
ok "VS Code + extensao Copilot detectados"
|
|
70
|
+
COPILOT_OK=true
|
|
71
|
+
else
|
|
72
|
+
warn "VS Code presente mas extensao Copilot nao instalada"
|
|
73
|
+
fi
|
|
74
|
+
elif command -v gh &>/dev/null && gh extension list 2>/dev/null | grep -qi copilot; then
|
|
75
|
+
ok "gh CLI com extensao copilot"
|
|
76
|
+
COPILOT_OK=true
|
|
77
|
+
else
|
|
78
|
+
warn "Copilot nao detectado (sem VS Code ou sem extensao)"
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
ANTIGRAVITY_OK=false
|
|
82
|
+
if command -v antigravity &>/dev/null; then
|
|
83
|
+
ok "antigravity CLI: $(command -v antigravity)"
|
|
84
|
+
ANTIGRAVITY_OK=true
|
|
85
|
+
elif [[ -d "$HOME/.gemini/antigravity" ]]; then
|
|
86
|
+
ok "~/.gemini/antigravity/ existe"
|
|
87
|
+
ANTIGRAVITY_OK=true
|
|
88
|
+
else
|
|
89
|
+
warn "Antigravity nao detectado"
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
OPENCODE_OK=false
|
|
93
|
+
if command -v opencode &>/dev/null; then
|
|
94
|
+
ok "opencode CLI: $(command -v opencode)"
|
|
95
|
+
OPENCODE_OK=true
|
|
96
|
+
elif [[ -d "$HOME/.config/opencode" ]]; then
|
|
97
|
+
ok "~/.config/opencode/ existe"
|
|
98
|
+
OPENCODE_OK=true
|
|
99
|
+
else
|
|
100
|
+
warn "OpenCode nao detectado (sem CLI nem ~/.config/opencode/)"
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
if ! $CLAUDE_OK && ! $COPILOT_OK && ! $ANTIGRAVITY_OK && ! $OPENCODE_OK; then
|
|
104
|
+
fail "Nenhum runtime detectado. JDI nao serve pra nada sem runtime."
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# ---------------------------------------------------------------------------
|
|
108
|
+
section "3. Tooling opcional"
|
|
109
|
+
|
|
110
|
+
if command -v ctx7 &>/dev/null; then
|
|
111
|
+
ok "ctx7 disponivel ($(command -v ctx7))"
|
|
112
|
+
elif command -v npx &>/dev/null; then
|
|
113
|
+
warn "ctx7 ausente. Recomendado pra docs de libs. Instale: npm i -g ctx7"
|
|
114
|
+
else
|
|
115
|
+
warn "ctx7 e npx ausentes. Researcher fica limitado a WebSearch."
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
if command -v gh &>/dev/null; then
|
|
119
|
+
ok "gh CLI disponivel (necessario pra /jdi-ship abrir PR)"
|
|
120
|
+
else
|
|
121
|
+
warn "gh CLI ausente. /jdi-ship nao consegue criar PR. Install: cli.github.com"
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
if command -v jq &>/dev/null; then
|
|
125
|
+
ok "jq disponivel"
|
|
126
|
+
else
|
|
127
|
+
note "jq ausente (opcional, scripts JDI usam awk em vez)"
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
# ---------------------------------------------------------------------------
|
|
131
|
+
section "4. Repo JDI (source of truth)"
|
|
132
|
+
|
|
133
|
+
if [[ -d "$JDI_ROOT/core/agents" && -d "$JDI_ROOT/core/commands" ]]; then
|
|
134
|
+
AGENTS_COUNT=$(find "$JDI_ROOT/core/agents" -name "*.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
135
|
+
COMMANDS_COUNT=$(find "$JDI_ROOT/core/commands" -name "*.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
136
|
+
ok "core/ encontrado ($AGENTS_COUNT agents, $COMMANDS_COUNT commands)"
|
|
137
|
+
|
|
138
|
+
if [[ "$AGENTS_COUNT" -lt 1 ]]; then
|
|
139
|
+
fail "core/agents/ vazio. Repo do JDI nao esta integro."
|
|
140
|
+
fi
|
|
141
|
+
else
|
|
142
|
+
fail "core/ ausente em $JDI_ROOT. Esse script roda do repo do JDI?"
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
if [[ -x "$JDI_ROOT/bin/jdi-build.sh" ]]; then
|
|
146
|
+
ok "jdi-build.sh executavel"
|
|
147
|
+
else
|
|
148
|
+
warn "jdi-build.sh nao executavel. Rode: chmod +x bin/jdi-build.sh"
|
|
149
|
+
fi
|
|
150
|
+
|
|
151
|
+
if [[ -x "$JDI_ROOT/bin/jdi-install.sh" ]]; then
|
|
152
|
+
ok "jdi-install.sh executavel"
|
|
153
|
+
else
|
|
154
|
+
warn "jdi-install.sh nao executavel. Rode: chmod +x bin/jdi-install.sh"
|
|
155
|
+
fi
|
|
156
|
+
|
|
157
|
+
# ---------------------------------------------------------------------------
|
|
158
|
+
section "5. Adapters buildados (runtimes/)"
|
|
159
|
+
|
|
160
|
+
for rt in claude copilot antigravity opencode; do
|
|
161
|
+
if [[ -d "$JDI_ROOT/runtimes/$rt" ]]; then
|
|
162
|
+
case "$rt" in
|
|
163
|
+
claude) count=$(find "$JDI_ROOT/runtimes/claude/agents" -name "*.md" 2>/dev/null | wc -l | tr -d ' ') ;;
|
|
164
|
+
copilot) count=$(find "$JDI_ROOT/runtimes/copilot/agents" -name "*.agent.md" 2>/dev/null | wc -l | tr -d ' ') ;;
|
|
165
|
+
antigravity) count=$(find "$JDI_ROOT/runtimes/antigravity/skills" -name "SKILL.md" 2>/dev/null | wc -l | tr -d ' ') ;;
|
|
166
|
+
opencode) count=$(find "$JDI_ROOT/runtimes/opencode/agents" -name "*.md" 2>/dev/null | wc -l | tr -d ' ') ;;
|
|
167
|
+
esac
|
|
168
|
+
|
|
169
|
+
if [[ "$count" -gt 0 ]]; then
|
|
170
|
+
ok "runtimes/$rt buildado ($count agents/skills)"
|
|
171
|
+
else
|
|
172
|
+
warn "runtimes/$rt vazio. Rode: ./bin/jdi-build.sh"
|
|
173
|
+
fi
|
|
174
|
+
else
|
|
175
|
+
warn "runtimes/$rt ausente. Rode: ./bin/jdi-build.sh"
|
|
176
|
+
fi
|
|
177
|
+
done
|
|
178
|
+
|
|
179
|
+
# ---------------------------------------------------------------------------
|
|
180
|
+
section "6. Projeto atual ($PROJECT_DIR)"
|
|
181
|
+
|
|
182
|
+
if [[ "$PROJECT_DIR" == "$JDI_ROOT" ]]; then
|
|
183
|
+
note "Voce esta no proprio repo do JDI. Rode jdi-doctor de dentro do seu projeto pra checar install."
|
|
184
|
+
fi
|
|
185
|
+
|
|
186
|
+
if [[ -d "$PROJECT_DIR/.jdi" ]]; then
|
|
187
|
+
ok "projeto eh JDI (.jdi/ existe)"
|
|
188
|
+
|
|
189
|
+
for f in PROJECT.md ROADMAP.md STATE.md; do
|
|
190
|
+
if [[ -f "$PROJECT_DIR/.jdi/$f" ]]; then
|
|
191
|
+
ok ".jdi/$f presente"
|
|
192
|
+
else
|
|
193
|
+
warn ".jdi/$f ausente. /jdi-new nao completou ou foi removido."
|
|
194
|
+
fi
|
|
195
|
+
done
|
|
196
|
+
|
|
197
|
+
for f in DECISIONS.md specialists.md reviewers.md registry.md todos.md; do
|
|
198
|
+
[[ -f "$PROJECT_DIR/.jdi/$f" ]] && ok ".jdi/$f presente" || note ".jdi/$f ausente (criado on-demand)"
|
|
199
|
+
done
|
|
200
|
+
|
|
201
|
+
if [[ -d "$PROJECT_DIR/.jdi/agents" ]]; then
|
|
202
|
+
spec_count=$(find "$PROJECT_DIR/.jdi/agents" -name "jdi-doer-*.md" -o -name "jdi-reviewer-*.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
203
|
+
if [[ "$spec_count" -gt 0 ]]; then
|
|
204
|
+
ok ".jdi/agents/ com $spec_count specialist(s) per-project"
|
|
205
|
+
else
|
|
206
|
+
note ".jdi/agents/ vazio (rode /jdi-bootstrap pra criar specialists)"
|
|
207
|
+
fi
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
if [[ -d "$PROJECT_DIR/.jdi/phases" ]]; then
|
|
211
|
+
PHASE_COUNT=$(find "$PROJECT_DIR/.jdi/phases" -maxdepth 1 -mindepth 1 -type d 2>/dev/null | wc -l | tr -d ' ')
|
|
212
|
+
ok ".jdi/phases/ com $PHASE_COUNT phase(s)"
|
|
213
|
+
fi
|
|
214
|
+
else
|
|
215
|
+
warn ".jdi/ ausente. Rode /jdi-new ou esta fora de um projeto JDI."
|
|
216
|
+
fi
|
|
217
|
+
|
|
218
|
+
# ---------------------------------------------------------------------------
|
|
219
|
+
section "7. Runtime instalado no projeto"
|
|
220
|
+
|
|
221
|
+
INSTALL_FOUND=false
|
|
222
|
+
|
|
223
|
+
if [[ -d "$PROJECT_DIR/.claude/agents" ]]; then
|
|
224
|
+
count=$(find "$PROJECT_DIR/.claude/agents" -name "jdi-*.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
225
|
+
if [[ "$count" -gt 0 ]]; then
|
|
226
|
+
ok ".claude/agents/ com $count agents JDI"
|
|
227
|
+
INSTALL_FOUND=true
|
|
228
|
+
else
|
|
229
|
+
warn ".claude/agents/ existe mas sem agents JDI. Rode jdi-install.sh"
|
|
230
|
+
fi
|
|
231
|
+
fi
|
|
232
|
+
|
|
233
|
+
if [[ -d "$PROJECT_DIR/.github/agents" ]]; then
|
|
234
|
+
count=$(find "$PROJECT_DIR/.github/agents" -name "jdi-*.agent.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
235
|
+
if [[ "$count" -gt 0 ]]; then
|
|
236
|
+
ok ".github/agents/ com $count agents JDI"
|
|
237
|
+
INSTALL_FOUND=true
|
|
238
|
+
fi
|
|
239
|
+
fi
|
|
240
|
+
|
|
241
|
+
if [[ -d "$PROJECT_DIR/.gemini/antigravity/skills" ]]; then
|
|
242
|
+
count=$(find "$PROJECT_DIR/.gemini/antigravity/skills" -name "SKILL.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
243
|
+
if [[ "$count" -gt 0 ]]; then
|
|
244
|
+
ok ".gemini/antigravity/skills/ com $count skills JDI"
|
|
245
|
+
INSTALL_FOUND=true
|
|
246
|
+
fi
|
|
247
|
+
fi
|
|
248
|
+
|
|
249
|
+
if [[ -d "$PROJECT_DIR/.opencode/agents" ]]; then
|
|
250
|
+
count=$(find "$PROJECT_DIR/.opencode/agents" -name "jdi-*.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
251
|
+
if [[ "$count" -gt 0 ]]; then
|
|
252
|
+
ok ".opencode/agents/ com $count agents JDI"
|
|
253
|
+
INSTALL_FOUND=true
|
|
254
|
+
fi
|
|
255
|
+
fi
|
|
256
|
+
|
|
257
|
+
if [[ -d "$HOME/.claude/agents" ]]; then
|
|
258
|
+
count=$(find "$HOME/.claude/agents" -name "jdi-*.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
259
|
+
[[ "$count" -gt 0 ]] && ok "~/.claude/agents/ com $count agents JDI (scope user)" && INSTALL_FOUND=true
|
|
260
|
+
fi
|
|
261
|
+
|
|
262
|
+
if [[ -d "$HOME/.config/opencode/agents" ]]; then
|
|
263
|
+
count=$(find "$HOME/.config/opencode/agents" -name "jdi-*.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
264
|
+
[[ "$count" -gt 0 ]] && ok "~/.config/opencode/agents/ com $count agents JDI (scope user)" && INSTALL_FOUND=true
|
|
265
|
+
fi
|
|
266
|
+
|
|
267
|
+
if ! $INSTALL_FOUND; then
|
|
268
|
+
if [[ -d "$PROJECT_DIR/.jdi" ]]; then
|
|
269
|
+
fail "Projeto eh JDI mas nenhum runtime instalado. Rode: $JDI_ROOT/bin/jdi-install.sh <runtime>"
|
|
270
|
+
fi
|
|
271
|
+
fi
|
|
272
|
+
|
|
273
|
+
# ---------------------------------------------------------------------------
|
|
274
|
+
section "8. Git hooks"
|
|
275
|
+
|
|
276
|
+
if [[ -f "$PROJECT_DIR/.githooks/pre-commit" ]]; then
|
|
277
|
+
if [[ -x "$PROJECT_DIR/.githooks/pre-commit" ]]; then
|
|
278
|
+
ok ".githooks/pre-commit existe e executavel"
|
|
279
|
+
else
|
|
280
|
+
warn ".githooks/pre-commit nao executavel. Rode: chmod +x .githooks/pre-commit"
|
|
281
|
+
fi
|
|
282
|
+
|
|
283
|
+
HOOKS_PATH=$(git -C "$PROJECT_DIR" config core.hooksPath 2>/dev/null || echo "")
|
|
284
|
+
if [[ "$HOOKS_PATH" == ".githooks" || "$HOOKS_PATH" == "$PROJECT_DIR/.githooks" ]]; then
|
|
285
|
+
ok "git core.hooksPath aponta pra .githooks"
|
|
286
|
+
else
|
|
287
|
+
warn "git core.hooksPath nao configurado. Rode: git config core.hooksPath .githooks"
|
|
288
|
+
fi
|
|
289
|
+
elif [[ -d "$PROJECT_DIR/.jdi" ]]; then
|
|
290
|
+
warn ".githooks/ ausente em projeto JDI. Rode jdi-install.sh pra instalar."
|
|
291
|
+
fi
|
|
292
|
+
|
|
293
|
+
# ---------------------------------------------------------------------------
|
|
294
|
+
section "9. Repo git limpo (recomendado pra /jdi-create)"
|
|
295
|
+
|
|
296
|
+
if git -C "$PROJECT_DIR" rev-parse --git-dir &>/dev/null; then
|
|
297
|
+
if git -C "$PROJECT_DIR" diff-index --quiet HEAD -- 2>/dev/null; then
|
|
298
|
+
ok "working tree limpo"
|
|
299
|
+
else
|
|
300
|
+
note "working tree com mudancas (ok pra /jdi-do, mas commit antes de /jdi-create)"
|
|
301
|
+
fi
|
|
302
|
+
else
|
|
303
|
+
warn "Diretorio nao eh repo git. /jdi-new e atomic commits nao funcionam sem git."
|
|
304
|
+
fi
|
|
305
|
+
|
|
306
|
+
# ---------------------------------------------------------------------------
|
|
307
|
+
section "10. Playwright + MCP (optional)"
|
|
308
|
+
|
|
309
|
+
if [ -f "$PROJECT_DIR/package.json" ] && grep -q '"@playwright/test"' "$PROJECT_DIR/package.json" 2>/dev/null; then
|
|
310
|
+
ok "@playwright/test in package.json"
|
|
311
|
+
else
|
|
312
|
+
note "@playwright/test not installed (run: npx jdi-cli install-playwright)"
|
|
313
|
+
fi
|
|
314
|
+
|
|
315
|
+
if [ -f "$PROJECT_DIR/.claude/settings.local.json" ]; then
|
|
316
|
+
if grep -q '"playwright"' "$PROJECT_DIR/.claude/settings.local.json" 2>/dev/null; then
|
|
317
|
+
ok "Claude Code MCP playwright configured"
|
|
318
|
+
else
|
|
319
|
+
note "Claude Code settings.local.json present but no MCP playwright entry"
|
|
320
|
+
fi
|
|
321
|
+
fi
|
|
322
|
+
|
|
323
|
+
if [ -f "$PROJECT_DIR/.opencode/opencode.jsonc" ]; then
|
|
324
|
+
if grep -q '"playwright"' "$PROJECT_DIR/.opencode/opencode.jsonc" 2>/dev/null; then
|
|
325
|
+
ok "OpenCode MCP playwright configured"
|
|
326
|
+
else
|
|
327
|
+
note "OpenCode opencode.jsonc present but no MCP playwright entry"
|
|
328
|
+
fi
|
|
329
|
+
fi
|
|
330
|
+
|
|
331
|
+
if [ -f "$PROJECT_DIR/.vscode/mcp.json" ]; then
|
|
332
|
+
if grep -q '"playwright"' "$PROJECT_DIR/.vscode/mcp.json" 2>/dev/null; then
|
|
333
|
+
ok "Copilot (VS Code) MCP playwright configured"
|
|
334
|
+
else
|
|
335
|
+
note ".vscode/mcp.json present but no playwright entry"
|
|
336
|
+
fi
|
|
337
|
+
fi
|
|
338
|
+
|
|
339
|
+
if [ -f "$HOME/.gemini/settings.json" ] && grep -q '"playwright"' "$HOME/.gemini/settings.json" 2>/dev/null; then
|
|
340
|
+
ok "Antigravity MCP playwright configured (user scope)"
|
|
341
|
+
elif [ -f "$PROJECT_DIR/.gemini/settings.json" ] && grep -q '"playwright"' "$PROJECT_DIR/.gemini/settings.json" 2>/dev/null; then
|
|
342
|
+
ok "Antigravity MCP playwright configured (project scope)"
|
|
343
|
+
fi
|
|
344
|
+
|
|
345
|
+
# ---------------------------------------------------------------------------
|
|
346
|
+
section "12. Specialists (single vs multi-stack)"
|
|
347
|
+
|
|
348
|
+
SPEC_PATH="$PROJECT_DIR/.jdi/specialists.md"
|
|
349
|
+
REV_PATH="$PROJECT_DIR/.jdi/reviewers.md"
|
|
350
|
+
|
|
351
|
+
if [ -f "$SPEC_PATH" ]; then
|
|
352
|
+
DOERS=$(grep -oE 'jdi-doer-[a-z0-9-]+' "$SPEC_PATH" | sort -u)
|
|
353
|
+
DOER_COUNT=$(echo "$DOERS" | grep -c .)
|
|
354
|
+
if [ "$DOER_COUNT" -eq 0 ]; then
|
|
355
|
+
note "specialists.md exists but no doer registered"
|
|
356
|
+
elif [ "$DOER_COUNT" -eq 1 ]; then
|
|
357
|
+
ok "Single-stack: $DOERS"
|
|
358
|
+
else
|
|
359
|
+
ok "Multi-stack: $DOER_COUNT doer specialists"
|
|
360
|
+
echo "$DOERS" | while read d; do note " - $d"; done
|
|
361
|
+
fi
|
|
362
|
+
else
|
|
363
|
+
note ".jdi/specialists.md missing (run /jdi-bootstrap)"
|
|
364
|
+
fi
|
|
365
|
+
|
|
366
|
+
if [ -f "$REV_PATH" ]; then
|
|
367
|
+
REVS=$(grep -oE 'jdi-reviewer-[a-z0-9-]+' "$REV_PATH" | sort -u | wc -l)
|
|
368
|
+
if [ "$REVS" -gt 1 ]; then
|
|
369
|
+
note " Reviewer chain length: $REVS (multi-stack /jdi-verify)"
|
|
370
|
+
fi
|
|
371
|
+
fi
|
|
372
|
+
|
|
373
|
+
# ---------------------------------------------------------------------------
|
|
374
|
+
section "11. Caveman plugin (optional)"
|
|
375
|
+
|
|
376
|
+
CAVEMAN_USER="$HOME/.claude/plugins/caveman"
|
|
377
|
+
CAVEMAN_PROJECT="$PROJECT_DIR/.claude/plugins/caveman"
|
|
378
|
+
|
|
379
|
+
if [ -d "$CAVEMAN_USER" ]; then
|
|
380
|
+
ok "Caveman installed (user scope: $CAVEMAN_USER)"
|
|
381
|
+
elif [ -d "$CAVEMAN_PROJECT" ]; then
|
|
382
|
+
ok "Caveman installed (project scope: $CAVEMAN_PROJECT)"
|
|
383
|
+
else
|
|
384
|
+
note "Caveman plugin not installed (run: npx jdi-cli install-caveman)"
|
|
385
|
+
fi
|
|
386
|
+
|
|
387
|
+
# ---------------------------------------------------------------------------
|
|
388
|
+
section "Resumo"
|
|
389
|
+
|
|
390
|
+
if [[ "$FAILS" -gt 0 ]]; then
|
|
391
|
+
echo " ${RED}${FAILS} FAIL${RST}, ${YLW}${WARNS} WARN${RST}"
|
|
392
|
+
echo " -> Resolva os FAIL antes de usar JDI."
|
|
393
|
+
exit 1
|
|
394
|
+
elif [[ "$WARNS" -gt 0 ]]; then
|
|
395
|
+
echo " ${YLW}${WARNS} WARN${RST} (JDI funciona mas com limitacoes)"
|
|
396
|
+
exit 0
|
|
397
|
+
else
|
|
398
|
+
echo " ${GRN}Tudo OK${RST}. JDI pronto pra rodar."
|
|
399
|
+
exit 0
|
|
400
|
+
fi
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
<#
|
|
2
|
+
.SYNOPSIS
|
|
3
|
+
jdi-install-caveman (Windows): clones caveman plugin into Claude Code plugins dir.
|
|
4
|
+
|
|
5
|
+
.DESCRIPTION
|
|
6
|
+
Optional install. Caveman is an ultra-compressed communication mode plugin for
|
|
7
|
+
Claude Code (skills, commands, hooks). Default repo:
|
|
8
|
+
https://github.com/JuliusBrussee/caveman
|
|
9
|
+
|
|
10
|
+
Idempotent: if target dir exists, asks overwrite/keep/cancel.
|
|
11
|
+
|
|
12
|
+
.PARAMETER Repo
|
|
13
|
+
Git URL of the caveman plugin. Default: https://github.com/JuliusBrussee/caveman.git
|
|
14
|
+
|
|
15
|
+
.PARAMETER Scope
|
|
16
|
+
user (default) -> ~/.claude/plugins/caveman/
|
|
17
|
+
project -> ./.claude/plugins/caveman/
|
|
18
|
+
|
|
19
|
+
.PARAMETER Force
|
|
20
|
+
Overwrite existing install without prompting.
|
|
21
|
+
|
|
22
|
+
.EXAMPLE
|
|
23
|
+
.\bin\jdi-install-caveman.ps1
|
|
24
|
+
.\bin\jdi-install-caveman.ps1 -Scope project
|
|
25
|
+
.\bin\jdi-install-caveman.ps1 -Repo https://github.com/forked/caveman.git -Force
|
|
26
|
+
#>
|
|
27
|
+
[CmdletBinding()]
|
|
28
|
+
param(
|
|
29
|
+
[string]$Repo = 'https://github.com/JuliusBrussee/caveman.git',
|
|
30
|
+
[ValidateSet('user','project')]
|
|
31
|
+
[string]$Scope = 'user',
|
|
32
|
+
[switch]$Force
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
$ErrorActionPreference = 'Stop'
|
|
36
|
+
$ProjectDir = (Get-Location).Path
|
|
37
|
+
$UserHome = if ($env:HOME) { $env:HOME } else { $env:USERPROFILE }
|
|
38
|
+
|
|
39
|
+
$baseDir = if ($Scope -eq 'user') { Join-Path $UserHome '.claude\plugins' } else { Join-Path $ProjectDir '.claude\plugins' }
|
|
40
|
+
$target = Join-Path $baseDir 'caveman'
|
|
41
|
+
|
|
42
|
+
Write-Host ''
|
|
43
|
+
Write-Host '=== JDI: Install Caveman plugin ==='
|
|
44
|
+
Write-Host ''
|
|
45
|
+
Write-Host " Repo: $Repo"
|
|
46
|
+
Write-Host " Scope: $Scope"
|
|
47
|
+
Write-Host " Target: $target"
|
|
48
|
+
Write-Host ''
|
|
49
|
+
|
|
50
|
+
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
|
51
|
+
Write-Error "git not in PATH. Install git and retry."
|
|
52
|
+
exit 1
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (Test-Path $target) {
|
|
56
|
+
if (-not $Force) {
|
|
57
|
+
Write-Host " Target exists."
|
|
58
|
+
$answer = Read-Host " Overwrite? (y/N)"
|
|
59
|
+
if ($answer -notmatch '^[yY]') {
|
|
60
|
+
Write-Host " Skipped."
|
|
61
|
+
exit 0
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
Write-Host " Removing old install..."
|
|
65
|
+
Remove-Item -Recurse -Force $target
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
New-Item -ItemType Directory -Force -Path $baseDir | Out-Null
|
|
69
|
+
|
|
70
|
+
Write-Host " Cloning..."
|
|
71
|
+
& git clone --depth 1 $Repo $target 2>&1 | ForEach-Object { Write-Host " $_" }
|
|
72
|
+
|
|
73
|
+
if ($LASTEXITCODE -ne 0) {
|
|
74
|
+
Write-Error "git clone failed (exit $LASTEXITCODE)."
|
|
75
|
+
exit $LASTEXITCODE
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# Verify it looks like a Claude Code plugin
|
|
79
|
+
$looksValid = (Test-Path (Join-Path $target 'plugin.json')) -or
|
|
80
|
+
(Test-Path (Join-Path $target '.claude-plugin')) -or
|
|
81
|
+
(Test-Path (Join-Path $target 'skills')) -or
|
|
82
|
+
(Test-Path (Join-Path $target 'commands')) -or
|
|
83
|
+
(Test-Path (Join-Path $target 'agents'))
|
|
84
|
+
|
|
85
|
+
if (-not $looksValid) {
|
|
86
|
+
Write-Warning " Cloned repo does not look like a Claude Code plugin (no plugin.json / skills/ / commands/ / agents/)."
|
|
87
|
+
Write-Warning " Keeping clone but verify manually: $target"
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
Write-Host ''
|
|
91
|
+
Write-Host "Caveman installed at: $target"
|
|
92
|
+
Write-Host ''
|
|
93
|
+
Write-Host "Next steps:"
|
|
94
|
+
Write-Host " 1. Restart Claude Code (or run /plugin reload)"
|
|
95
|
+
Write-Host " 2. Verify with: /caveman-help"
|
|
96
|
+
Write-Host " 3. Toggle mode: /caveman lite|full|ultra"
|
|
97
|
+
Write-Host ''
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# jdi-install-caveman (POSIX): clones caveman plugin into Claude Code plugins dir.
|
|
3
|
+
#
|
|
4
|
+
# Optional install. Default repo: https://github.com/JuliusBrussee/caveman
|
|
5
|
+
# Idempotent: if target dir exists, asks overwrite/keep/cancel.
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# ./bin/jdi-install-caveman.sh
|
|
9
|
+
# ./bin/jdi-install-caveman.sh --scope project
|
|
10
|
+
# ./bin/jdi-install-caveman.sh --repo https://github.com/forked/caveman.git --force
|
|
11
|
+
#
|
|
12
|
+
# Flags:
|
|
13
|
+
# --repo <url> Git URL (default: https://github.com/JuliusBrussee/caveman.git)
|
|
14
|
+
# --scope <s> user (default) -> ~/.claude/plugins/caveman/
|
|
15
|
+
# project -> ./.claude/plugins/caveman/
|
|
16
|
+
# --force Overwrite existing install without prompt
|
|
17
|
+
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
|
|
20
|
+
REPO='https://github.com/JuliusBrussee/caveman.git'
|
|
21
|
+
SCOPE=user
|
|
22
|
+
FORCE=0
|
|
23
|
+
PROJECT_DIR="$(pwd)"
|
|
24
|
+
USER_HOME="${HOME:-$USERPROFILE}"
|
|
25
|
+
|
|
26
|
+
while [ $# -gt 0 ]; do
|
|
27
|
+
case "$1" in
|
|
28
|
+
--repo) REPO="$2"; shift 2 ;;
|
|
29
|
+
--scope) SCOPE="$2"; shift 2 ;;
|
|
30
|
+
--force) FORCE=1; shift ;;
|
|
31
|
+
*) echo "Unknown flag: $1"; exit 1 ;;
|
|
32
|
+
esac
|
|
33
|
+
done
|
|
34
|
+
|
|
35
|
+
case "$SCOPE" in
|
|
36
|
+
user|project) ;;
|
|
37
|
+
*) echo "Invalid --scope. Use: user | project"; exit 1 ;;
|
|
38
|
+
esac
|
|
39
|
+
|
|
40
|
+
if [ "$SCOPE" = "user" ]; then
|
|
41
|
+
BASE_DIR="$USER_HOME/.claude/plugins"
|
|
42
|
+
else
|
|
43
|
+
BASE_DIR="$PROJECT_DIR/.claude/plugins"
|
|
44
|
+
fi
|
|
45
|
+
TARGET="$BASE_DIR/caveman"
|
|
46
|
+
|
|
47
|
+
echo ""
|
|
48
|
+
echo "=== JDI: Install Caveman plugin ==="
|
|
49
|
+
echo ""
|
|
50
|
+
echo " Repo: $REPO"
|
|
51
|
+
echo " Scope: $SCOPE"
|
|
52
|
+
echo " Target: $TARGET"
|
|
53
|
+
echo ""
|
|
54
|
+
|
|
55
|
+
if ! command -v git >/dev/null 2>&1; then
|
|
56
|
+
echo "git not in PATH. Install git and retry."
|
|
57
|
+
exit 1
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if [ -d "$TARGET" ]; then
|
|
61
|
+
if [ "$FORCE" != "1" ]; then
|
|
62
|
+
echo " Target exists."
|
|
63
|
+
read -p " Overwrite? (y/N) " ans
|
|
64
|
+
case "$ans" in
|
|
65
|
+
[yY]*) ;;
|
|
66
|
+
*) echo " Skipped."; exit 0 ;;
|
|
67
|
+
esac
|
|
68
|
+
fi
|
|
69
|
+
echo " Removing old install..."
|
|
70
|
+
rm -rf "$TARGET"
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
mkdir -p "$BASE_DIR"
|
|
74
|
+
|
|
75
|
+
echo " Cloning..."
|
|
76
|
+
git clone --depth 1 "$REPO" "$TARGET" 2>&1 | sed 's/^/ /'
|
|
77
|
+
|
|
78
|
+
if [ $? -ne 0 ]; then
|
|
79
|
+
echo "git clone failed."
|
|
80
|
+
exit 1
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# Verify plugin shape
|
|
84
|
+
if [ -f "$TARGET/plugin.json" ] || [ -d "$TARGET/.claude-plugin" ] \
|
|
85
|
+
|| [ -d "$TARGET/skills" ] || [ -d "$TARGET/commands" ] || [ -d "$TARGET/agents" ]; then
|
|
86
|
+
: # valid
|
|
87
|
+
else
|
|
88
|
+
echo " [warn] Cloned repo does not look like a Claude Code plugin."
|
|
89
|
+
echo " [warn] Keeping clone but verify manually: $TARGET"
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
echo ""
|
|
93
|
+
echo "Caveman installed at: $TARGET"
|
|
94
|
+
echo ""
|
|
95
|
+
echo "Next steps:"
|
|
96
|
+
echo " 1. Restart Claude Code (or run /plugin reload)"
|
|
97
|
+
echo " 2. Verify with: /caveman-help"
|
|
98
|
+
echo " 3. Toggle mode: /caveman lite|full|ultra"
|
|
99
|
+
echo ""
|