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.
Files changed (159) hide show
  1. package/AGENTS.md +209 -0
  2. package/ARCHITECTURE.md +210 -0
  3. package/COMMANDS.md +241 -0
  4. package/CREATE-EXAMPLE.md +385 -0
  5. package/CREATE.md +315 -0
  6. package/EXTENSION.md +141 -0
  7. package/LICENSE +21 -0
  8. package/MEMORY.md +471 -0
  9. package/PORTABILITY.md +438 -0
  10. package/README.md +789 -0
  11. package/bin/git-hooks/post-commit +16 -0
  12. package/bin/git-hooks/pre-commit +21 -0
  13. package/bin/jdi-build.ps1 +381 -0
  14. package/bin/jdi-build.sh +332 -0
  15. package/bin/jdi-doctor.ps1 +403 -0
  16. package/bin/jdi-doctor.sh +400 -0
  17. package/bin/jdi-install-caveman.ps1 +97 -0
  18. package/bin/jdi-install-caveman.sh +99 -0
  19. package/bin/jdi-install-playwright.ps1 +319 -0
  20. package/bin/jdi-install-playwright.sh +284 -0
  21. package/bin/jdi-install.ps1 +154 -0
  22. package/bin/jdi-install.sh +132 -0
  23. package/bin/jdi-uninstall.ps1 +309 -0
  24. package/bin/jdi-uninstall.sh +264 -0
  25. package/bin/jdi-update.ps1 +215 -0
  26. package/bin/jdi-update.sh +209 -0
  27. package/bin/jdi.js +460 -0
  28. package/bin/lib/jdi-monitor.ps1 +66 -0
  29. package/bin/lib/jdi-monitor.sh +74 -0
  30. package/bin/lib/jdi-truncate.ps1 +96 -0
  31. package/bin/lib/jdi-truncate.sh +99 -0
  32. package/bin/lib/ui.js +197 -0
  33. package/core/agents/jdi-adopter.md +465 -0
  34. package/core/agents/jdi-architect.md +894 -0
  35. package/core/agents/jdi-asker.md +153 -0
  36. package/core/agents/jdi-bootstrap.md +247 -0
  37. package/core/agents/jdi-planner.md +254 -0
  38. package/core/agents/jdi-researcher.md +303 -0
  39. package/core/commands/jdi-adopt.md +155 -0
  40. package/core/commands/jdi-bootstrap.md +81 -0
  41. package/core/commands/jdi-create.md +80 -0
  42. package/core/commands/jdi-discuss.md +80 -0
  43. package/core/commands/jdi-do.md +200 -0
  44. package/core/commands/jdi-loop.md +315 -0
  45. package/core/commands/jdi-new.md +131 -0
  46. package/core/commands/jdi-plan.md +73 -0
  47. package/core/commands/jdi-ship.md +146 -0
  48. package/core/commands/jdi-verify.md +159 -0
  49. package/core/skills/clean-code/SKILL.md +261 -0
  50. package/core/skills/dry/SKILL.md +150 -0
  51. package/core/skills/frontend-rules/SKILL.md +386 -0
  52. package/core/skills/frontend-validator/SKILL.md +567 -0
  53. package/core/skills/kiss/SKILL.md +178 -0
  54. package/core/skills/solid/SKILL.md +281 -0
  55. package/core/skills/yagni/SKILL.md +207 -0
  56. package/core/templates/agent.md +72 -0
  57. package/core/templates/doer-specialist.md +216 -0
  58. package/core/templates/reviewer-specialist.md +405 -0
  59. package/core/templates/skill.md +66 -0
  60. package/package.json +70 -0
  61. package/runtimes/antigravity/agents.md +74 -0
  62. package/runtimes/antigravity/skills/clean-code/SKILL.md +252 -0
  63. package/runtimes/antigravity/skills/dry/SKILL.md +141 -0
  64. package/runtimes/antigravity/skills/frontend-rules/SKILL.md +376 -0
  65. package/runtimes/antigravity/skills/frontend-validator/SKILL.md +559 -0
  66. package/runtimes/antigravity/skills/jdi-adopt/SKILL.md +155 -0
  67. package/runtimes/antigravity/skills/jdi-adopter/SKILL.md +436 -0
  68. package/runtimes/antigravity/skills/jdi-architect/SKILL.md +872 -0
  69. package/runtimes/antigravity/skills/jdi-asker/SKILL.md +125 -0
  70. package/runtimes/antigravity/skills/jdi-asker/references/context-template.md +34 -0
  71. package/runtimes/antigravity/skills/jdi-asker/references/decision-format.md +19 -0
  72. package/runtimes/antigravity/skills/jdi-asker/scripts/find_phase_dir.sh +25 -0
  73. package/runtimes/antigravity/skills/jdi-bootstrap/SKILL.md +81 -0
  74. package/runtimes/antigravity/skills/jdi-create/SKILL.md +80 -0
  75. package/runtimes/antigravity/skills/jdi-discuss/SKILL.md +80 -0
  76. package/runtimes/antigravity/skills/jdi-discuss/scripts/run_command.sh +62 -0
  77. package/runtimes/antigravity/skills/jdi-do/SKILL.md +200 -0
  78. package/runtimes/antigravity/skills/jdi-loop/SKILL.md +315 -0
  79. package/runtimes/antigravity/skills/jdi-new/SKILL.md +131 -0
  80. package/runtimes/antigravity/skills/jdi-plan/SKILL.md +73 -0
  81. package/runtimes/antigravity/skills/jdi-planner/SKILL.md +225 -0
  82. package/runtimes/antigravity/skills/jdi-researcher/SKILL.md +274 -0
  83. package/runtimes/antigravity/skills/jdi-ship/SKILL.md +146 -0
  84. package/runtimes/antigravity/skills/jdi-verify/SKILL.md +159 -0
  85. package/runtimes/antigravity/skills/kiss/SKILL.md +169 -0
  86. package/runtimes/antigravity/skills/solid/SKILL.md +272 -0
  87. package/runtimes/antigravity/skills/yagni/SKILL.md +198 -0
  88. package/runtimes/claude/CLAUDE.md +91 -0
  89. package/runtimes/claude/agents/jdi-adopter.md +430 -0
  90. package/runtimes/claude/agents/jdi-architect.md +864 -0
  91. package/runtimes/claude/agents/jdi-asker.md +119 -0
  92. package/runtimes/claude/agents/jdi-bootstrap.md +213 -0
  93. package/runtimes/claude/agents/jdi-planner.md +221 -0
  94. package/runtimes/claude/agents/jdi-researcher.md +269 -0
  95. package/runtimes/claude/commands/jdi-adopt.md +155 -0
  96. package/runtimes/claude/commands/jdi-bootstrap.md +81 -0
  97. package/runtimes/claude/commands/jdi-create.md +80 -0
  98. package/runtimes/claude/commands/jdi-discuss.md +80 -0
  99. package/runtimes/claude/commands/jdi-do.md +200 -0
  100. package/runtimes/claude/commands/jdi-loop.md +315 -0
  101. package/runtimes/claude/commands/jdi-new.md +131 -0
  102. package/runtimes/claude/commands/jdi-plan.md +73 -0
  103. package/runtimes/claude/commands/jdi-ship.md +146 -0
  104. package/runtimes/claude/commands/jdi-verify.md +159 -0
  105. package/runtimes/claude/settings.example.json +132 -0
  106. package/runtimes/claude/skills/clean-code/SKILL.md +247 -0
  107. package/runtimes/claude/skills/dry/SKILL.md +136 -0
  108. package/runtimes/claude/skills/frontend-rules/SKILL.md +369 -0
  109. package/runtimes/claude/skills/frontend-validator/SKILL.md +553 -0
  110. package/runtimes/claude/skills/kiss/SKILL.md +164 -0
  111. package/runtimes/claude/skills/solid/SKILL.md +267 -0
  112. package/runtimes/claude/skills/yagni/SKILL.md +193 -0
  113. package/runtimes/copilot/agents/jdi-adopter.agent.md +430 -0
  114. package/runtimes/copilot/agents/jdi-architect.agent.md +864 -0
  115. package/runtimes/copilot/agents/jdi-asker.agent.md +119 -0
  116. package/runtimes/copilot/agents/jdi-bootstrap.agent.md +213 -0
  117. package/runtimes/copilot/agents/jdi-planner.agent.md +221 -0
  118. package/runtimes/copilot/agents/jdi-researcher.agent.md +269 -0
  119. package/runtimes/copilot/copilot-instructions.md +80 -0
  120. package/runtimes/copilot/prompts/jdi-adopt.prompt.md +155 -0
  121. package/runtimes/copilot/prompts/jdi-bootstrap.prompt.md +81 -0
  122. package/runtimes/copilot/prompts/jdi-create.prompt.md +80 -0
  123. package/runtimes/copilot/prompts/jdi-discuss.prompt.md +80 -0
  124. package/runtimes/copilot/prompts/jdi-do.prompt.md +200 -0
  125. package/runtimes/copilot/prompts/jdi-loop.prompt.md +315 -0
  126. package/runtimes/copilot/prompts/jdi-new.prompt.md +131 -0
  127. package/runtimes/copilot/prompts/jdi-plan.prompt.md +73 -0
  128. package/runtimes/copilot/prompts/jdi-ship.prompt.md +146 -0
  129. package/runtimes/copilot/prompts/jdi-verify.prompt.md +159 -0
  130. package/runtimes/opencode/AGENTS.md +87 -0
  131. package/runtimes/opencode/agents/jdi-adopter.md +434 -0
  132. package/runtimes/opencode/agents/jdi-architect.md +861 -0
  133. package/runtimes/opencode/agents/jdi-asker.md +123 -0
  134. package/runtimes/opencode/agents/jdi-bootstrap.md +217 -0
  135. package/runtimes/opencode/agents/jdi-planner.md +225 -0
  136. package/runtimes/opencode/agents/jdi-researcher.md +273 -0
  137. package/runtimes/opencode/commands/jdi-adopt.md +155 -0
  138. package/runtimes/opencode/commands/jdi-bootstrap.md +81 -0
  139. package/runtimes/opencode/commands/jdi-create.md +80 -0
  140. package/runtimes/opencode/commands/jdi-discuss.md +80 -0
  141. package/runtimes/opencode/commands/jdi-do.md +200 -0
  142. package/runtimes/opencode/commands/jdi-loop.md +315 -0
  143. package/runtimes/opencode/commands/jdi-new.md +131 -0
  144. package/runtimes/opencode/commands/jdi-plan.md +73 -0
  145. package/runtimes/opencode/commands/jdi-ship.md +146 -0
  146. package/runtimes/opencode/commands/jdi-verify.md +159 -0
  147. package/runtimes/opencode/opencode.example.jsonc +169 -0
  148. package/runtimes/opencode/skills/clean-code/SKILL.md +247 -0
  149. package/runtimes/opencode/skills/dry/SKILL.md +136 -0
  150. package/runtimes/opencode/skills/frontend-rules/SKILL.md +369 -0
  151. package/runtimes/opencode/skills/frontend-validator/SKILL.md +553 -0
  152. package/runtimes/opencode/skills/kiss/SKILL.md +164 -0
  153. package/runtimes/opencode/skills/solid/SKILL.md +267 -0
  154. package/runtimes/opencode/skills/yagni/SKILL.md +193 -0
  155. package/templates-jdi-folder/config.json +18 -0
  156. package/templates-jdi-folder/registry.md +31 -0
  157. package/templates-jdi-folder/reviewers.md +33 -0
  158. package/templates-jdi-folder/skills-registry.md +32 -0
  159. 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 ""