don-cheli-sdd 1.28.0 → 1.30.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/CHANGELOG.md +18 -0
- package/README.es.md +1 -1
- package/README.md +1 -1
- package/README.pt.md +1 -1
- package/VERSION +1 -1
- package/package.json +2 -2
- package/scripts/.claude/don-cheli/VERSION +1 -1
- package/scripts/.claude/don-cheli/scripts/generar-config.sh +374 -0
- package/scripts/.claude/don-cheli/scripts/instalar.sh +8 -5
- package/scripts/generar-config.sh +29 -1
- package/scripts/instalar.sh +8 -5
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,24 @@ Todos los cambios notables en Don Cheli SDD Framework.
|
|
|
4
4
|
|
|
5
5
|
Formato basado en [Conventional Commits](https://www.conventionalcommits.org/).
|
|
6
6
|
|
|
7
|
+
## [1.30.0](https://github.com/doncheli/don-cheli-sdd/compare/v1.29.0...v1.30.0) (2026-04-08)
|
|
8
|
+
|
|
9
|
+
### Nuevas Funcionalidades
|
|
10
|
+
|
|
11
|
+
* agregar soporte para Qwen + fix mirrors generar-config ([099a03f](https://github.com/doncheli/don-cheli-sdd/commit/099a03f3ddbafc7d7e3197d60304b0a1e946c87e))
|
|
12
|
+
|
|
13
|
+
### Documentación
|
|
14
|
+
|
|
15
|
+
* agregar benchmark posts para X y LinkedIn con datos verificados ([40cc480](https://github.com/doncheli/don-cheli-sdd/commit/40cc480eb2391b502513f16762683a664ed3c957))
|
|
16
|
+
* agregar benchmark posts para X y LinkedIn con datos verificados ([7f3c570](https://github.com/doncheli/don-cheli-sdd/commit/7f3c570d48e51ae0867f2c42823b2e2cd2ebca60))
|
|
17
|
+
* optimizar post LinkedIn a <3000 caracteres ([a2a8b31](https://github.com/doncheli/don-cheli-sdd/commit/a2a8b319d3a400005ca88abcde602a4aa040a475))
|
|
18
|
+
|
|
19
|
+
## [1.29.0](https://github.com/doncheli/don-cheli-sdd/compare/v1.28.0...v1.29.0) (2026-04-07)
|
|
20
|
+
|
|
21
|
+
### Nuevas Funcionalidades
|
|
22
|
+
|
|
23
|
+
* mejoras al framework — actualizar npm description con números reales ([7b59acf](https://github.com/doncheli/don-cheli-sdd/commit/7b59acf01436523a9d3b6e1848f176db1ddc3f6e))
|
|
24
|
+
|
|
7
25
|
## [1.28.0](https://github.com/doncheli/don-cheli-sdd/compare/v1.27.1...v1.28.0) (2026-04-07)
|
|
8
26
|
|
|
9
27
|
### Nuevas Funcionalidades
|
package/README.es.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
</p>
|
|
13
13
|
<p align="center">
|
|
14
14
|
<a href="#-instalación"><img src="https://img.shields.io/badge/instalación-2_minutos-brightgreen" alt="Install"></a>
|
|
15
|
-
<img src="https://img.shields.io/badge/versión-1.
|
|
15
|
+
<img src="https://img.shields.io/badge/versión-1.30.0-blue" alt="Version">
|
|
16
16
|
<img src="https://img.shields.io/badge/licencia-Apache%202.0-green" alt="License">
|
|
17
17
|
<img src="https://img.shields.io/badge/idiomas-ES%20|%20EN%20|%20PT-red" alt="Languages">
|
|
18
18
|
<img src="https://img.shields.io/badge/comandos-93+-purple" alt="Commands">
|
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
</p>
|
|
13
13
|
<p align="center">
|
|
14
14
|
<a href="#-installation"><img src="https://img.shields.io/badge/install-2_minutes-brightgreen" alt="Install"></a>
|
|
15
|
-
<img src="https://img.shields.io/badge/version-1.
|
|
15
|
+
<img src="https://img.shields.io/badge/version-1.30.0-blue" alt="Version">
|
|
16
16
|
<img src="https://img.shields.io/badge/license-Apache%202.0-green" alt="License">
|
|
17
17
|
<img src="https://img.shields.io/badge/languages-ES%20|%20EN%20|%20PT-red" alt="Languages">
|
|
18
18
|
<img src="https://img.shields.io/badge/commands-93+-purple" alt="Commands">
|
package/README.pt.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
</p>
|
|
13
13
|
<p align="center">
|
|
14
14
|
<a href="#-instalação"><img src="https://img.shields.io/badge/instalação-2_minutos-brightgreen" alt="Install"></a>
|
|
15
|
-
<img src="https://img.shields.io/badge/versão-1.
|
|
15
|
+
<img src="https://img.shields.io/badge/versão-1.30.0-blue" alt="Version">
|
|
16
16
|
<img src="https://img.shields.io/badge/licença-Apache%202.0-green" alt="License">
|
|
17
17
|
<img src="https://img.shields.io/badge/idiomas-ES%20|%20EN%20|%20PT-red" alt="Languages">
|
|
18
18
|
<img src="https://img.shields.io/badge/comandos-93+-purple" alt="Commands">
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.30.0
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "don-cheli-sdd",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.30.0",
|
|
4
|
+
"description": "Don Cheli SDD Framework — 93+ commands, 51 skills, 15 reasoning models, Autonomous Mode, TDD Iron Law, OWASP audit, PRD Generator, Crash Recovery. Works with Claude Code, Gemini, Cursor, Codex, Warp, Amp, OpenCode. ES/EN/PT.",
|
|
5
5
|
"main": "bin/don-cheli.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"instalar": "bash scripts/instalar.sh",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.30.0
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Don Cheli - Config Generator
|
|
3
|
+
# Generates tool-specific configuration files based on profile, skills, and commands
|
|
4
|
+
#
|
|
5
|
+
# Intended to be sourced from instalar.sh, not run standalone.
|
|
6
|
+
# Main entry point: generar_configs()
|
|
7
|
+
|
|
8
|
+
# Helper: detect project root from FRAMEWORK_HOME path
|
|
9
|
+
# .claude/don-cheli → project root is the parent
|
|
10
|
+
_get_project_root() {
|
|
11
|
+
local dir="$1"
|
|
12
|
+
local root
|
|
13
|
+
if [[ "$dir" == *".claude/don-cheli"* ]]; then
|
|
14
|
+
root="${dir%/.claude/don-cheli*}"
|
|
15
|
+
[ -z "$root" ] && root="."
|
|
16
|
+
elif [[ "$dir" == *".claude"* ]]; then
|
|
17
|
+
root="${dir%/.claude*}"
|
|
18
|
+
[ -z "$root" ] && root="."
|
|
19
|
+
else
|
|
20
|
+
root="$dir"
|
|
21
|
+
fi
|
|
22
|
+
echo "$root"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
generar_configs() {
|
|
26
|
+
local tools="$1"
|
|
27
|
+
local profile="$2"
|
|
28
|
+
local skills="$3"
|
|
29
|
+
local commands="$4"
|
|
30
|
+
local install_dir="$5"
|
|
31
|
+
local framework_home="$6"
|
|
32
|
+
local locale="${7:-es}"
|
|
33
|
+
|
|
34
|
+
# Colors (fallback to empty if not set by caller)
|
|
35
|
+
local GREEN="${GREEN:-\033[0;32m}"
|
|
36
|
+
local RED="${RED:-\033[0;31m}"
|
|
37
|
+
local YELLOW="${YELLOW:-\033[1;33m}"
|
|
38
|
+
local NC="${NC:-\033[0m}"
|
|
39
|
+
|
|
40
|
+
# Validate required args
|
|
41
|
+
if [ -z "$tools" ] || [ -z "$install_dir" ] || [ -z "$framework_home" ]; then
|
|
42
|
+
echo -e " ${RED}✗${NC} generar_configs: missing required arguments (tools, install_dir, framework_home)" >&2
|
|
43
|
+
return 1
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
# Parse tools into array
|
|
47
|
+
IFS=',' read -ra TOOL_ARRAY <<< "$tools"
|
|
48
|
+
|
|
49
|
+
for tool in "${TOOL_ARRAY[@]}"; do
|
|
50
|
+
# Trim whitespace
|
|
51
|
+
tool="${tool#"${tool%%[![:space:]]*}"}"
|
|
52
|
+
tool="${tool%"${tool##*[![:space:]]}"}"
|
|
53
|
+
|
|
54
|
+
case "$tool" in
|
|
55
|
+
claude)
|
|
56
|
+
_gen_claude "$install_dir" "$framework_home" "$locale" "$profile" "$skills" "$commands"
|
|
57
|
+
;;
|
|
58
|
+
codex)
|
|
59
|
+
_gen_codex "$install_dir" "$framework_home" "$locale"
|
|
60
|
+
;;
|
|
61
|
+
cursor)
|
|
62
|
+
_gen_cursor "$install_dir" "$framework_home" "$locale"
|
|
63
|
+
;;
|
|
64
|
+
antigravity)
|
|
65
|
+
_gen_antigravity "$install_dir" "$framework_home" "$locale"
|
|
66
|
+
;;
|
|
67
|
+
windsurf)
|
|
68
|
+
_gen_windsurf "$install_dir" "$framework_home" "$locale"
|
|
69
|
+
;;
|
|
70
|
+
amp)
|
|
71
|
+
_gen_amp "$install_dir" "$framework_home" "$locale"
|
|
72
|
+
;;
|
|
73
|
+
continue)
|
|
74
|
+
_gen_continue "$install_dir" "$framework_home" "$locale"
|
|
75
|
+
;;
|
|
76
|
+
opencode)
|
|
77
|
+
_gen_opencode "$install_dir" "$framework_home" "$locale"
|
|
78
|
+
;;
|
|
79
|
+
qwen)
|
|
80
|
+
_gen_qwen "$install_dir" "$framework_home" "$locale"
|
|
81
|
+
;;
|
|
82
|
+
*)
|
|
83
|
+
echo -e " ${YELLOW}⚠${NC} Unknown tool: '$tool' — skipping" >&2
|
|
84
|
+
;;
|
|
85
|
+
esac
|
|
86
|
+
done
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
# ─────────────────────────────────────────────
|
|
90
|
+
# Claude Code → CLAUDE.md + .claude/commands/
|
|
91
|
+
# ─────────────────────────────────────────────
|
|
92
|
+
_gen_claude() {
|
|
93
|
+
local dir="$1" home="$2" locale="$3" profile="$4" skills="$5" commands="$6"
|
|
94
|
+
|
|
95
|
+
echo -e " ${GREEN:-}✓${NC:-} Claude Code → CLAUDE.md + commands/"
|
|
96
|
+
|
|
97
|
+
# Copy locale-specific CLAUDE.md, fall back to default es
|
|
98
|
+
if [ "$locale" != "es" ] && [ -f "$home/CLAUDE.${locale}.md" ]; then
|
|
99
|
+
cp "$home/CLAUDE.${locale}.md" "$dir/CLAUDE.md" 2>/dev/null || true
|
|
100
|
+
elif [ -f "$home/CLAUDE.md" ]; then
|
|
101
|
+
cp "$home/CLAUDE.md" "$dir/" 2>/dev/null || true
|
|
102
|
+
else
|
|
103
|
+
echo -e " ${YELLOW:-}⚠${NC:-} CLAUDE.md not found in $home — skipping" >&2
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# Append active profile/skills/commands summary to CLAUDE.md
|
|
107
|
+
if [ -f "$dir/CLAUDE.md" ] && { [ -n "$profile" ] || [ -n "$skills" ] || [ -n "$commands" ]; }; then
|
|
108
|
+
{
|
|
109
|
+
echo ""
|
|
110
|
+
echo "## Perfil de instalación"
|
|
111
|
+
[ -n "$profile" ] && echo "- **Perfil**: $profile"
|
|
112
|
+
[ -n "$skills" ] && echo "- **Skills activos**: $skills"
|
|
113
|
+
[ -n "$commands" ] && echo "- **Comandos activos**: $commands"
|
|
114
|
+
} >> "$dir/CLAUDE.md" 2>/dev/null || true
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
# Create command directories and copy command files
|
|
118
|
+
mkdir -p "$dir/.claude/commands/dc" \
|
|
119
|
+
"$dir/.claude/commands/especdev" \
|
|
120
|
+
"$dir/.claude/commands/razonar" 2>/dev/null || true
|
|
121
|
+
|
|
122
|
+
local commands_root
|
|
123
|
+
commands_root="$(cd "$home/../.." 2>/dev/null && pwd)" || commands_root=""
|
|
124
|
+
|
|
125
|
+
if [ -n "$commands_root" ] && [ -d "$commands_root/commands" ]; then
|
|
126
|
+
cp "$commands_root/commands/especdev/"*.md "$dir/.claude/commands/especdev/" 2>/dev/null || true
|
|
127
|
+
cp "$commands_root/commands/dc/"*.md "$dir/.claude/commands/dc/" 2>/dev/null || true
|
|
128
|
+
cp "$commands_root/commands/razonar/"*.md "$dir/.claude/commands/razonar/" 2>/dev/null || true
|
|
129
|
+
fi
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
# ─────────────────────────────────────────────
|
|
133
|
+
# Codex → AGENTS.md
|
|
134
|
+
# ─────────────────────────────────────────────
|
|
135
|
+
_gen_codex() {
|
|
136
|
+
local dir="$1" home="$2" locale="$3"
|
|
137
|
+
local project_root
|
|
138
|
+
project_root=$(_get_project_root "$dir")
|
|
139
|
+
|
|
140
|
+
echo -e " ${GREEN:-}✓${NC:-} Codex → AGENTS.md (en $project_root/)"
|
|
141
|
+
|
|
142
|
+
if [ -f "$home/AGENTS.md" ]; then
|
|
143
|
+
cp "$home/AGENTS.md" "$project_root/" 2>/dev/null || true
|
|
144
|
+
else
|
|
145
|
+
# Generate a minimal AGENTS.md if template is missing
|
|
146
|
+
cat > "$dir/AGENTS.md" 2>/dev/null << 'AGENTSEOF' || true
|
|
147
|
+
# Don Cheli SDD — Codex Agent Instructions
|
|
148
|
+
|
|
149
|
+
## Iron Laws
|
|
150
|
+
1. **TDD**: All production code requires tests (RED → GREEN → REFACTOR)
|
|
151
|
+
2. **Debugging**: Root cause first, then fix
|
|
152
|
+
3. **Verification**: Evidence before assertions
|
|
153
|
+
|
|
154
|
+
## Workflow
|
|
155
|
+
- Read files on demand, not preemptively
|
|
156
|
+
- Structured outputs from the start
|
|
157
|
+
- Retrocompatible changes unless explicitly stated otherwise
|
|
158
|
+
AGENTSEOF
|
|
159
|
+
fi
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
# ─────────────────────────────────────────────
|
|
163
|
+
# Cursor → .cursorrules
|
|
164
|
+
# ─────────────────────────────────────────────
|
|
165
|
+
_gen_cursor() {
|
|
166
|
+
local dir="$1" home="$2" locale="$3"
|
|
167
|
+
local project_root
|
|
168
|
+
project_root=$(_get_project_root "$dir")
|
|
169
|
+
|
|
170
|
+
echo -e " ${GREEN:-}✓${NC:-} Cursor → .cursorrules (en $project_root/)"
|
|
171
|
+
|
|
172
|
+
if [ "$locale" != "en" ] && [ -f "$home/.cursorrules.${locale}" ]; then
|
|
173
|
+
cp "$home/.cursorrules.${locale}" "$project_root/.cursorrules" 2>/dev/null || true
|
|
174
|
+
elif [ -f "$home/.cursorrules" ]; then
|
|
175
|
+
cp "$home/.cursorrules" "$project_root/" 2>/dev/null || true
|
|
176
|
+
else
|
|
177
|
+
echo -e " ${YELLOW:-}⚠${NC:-} .cursorrules not found in $home — skipping" >&2
|
|
178
|
+
fi
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
# ─────────────────────────────────────────────
|
|
182
|
+
# Antigravity → GEMINI.md + .agent/ (at PROJECT ROOT, not inside .claude/)
|
|
183
|
+
# ─────────────────────────────────────────────
|
|
184
|
+
_gen_antigravity() {
|
|
185
|
+
local dir="$1" home="$2" locale="$3"
|
|
186
|
+
local project_root
|
|
187
|
+
project_root=$(_get_project_root "$dir")
|
|
188
|
+
|
|
189
|
+
echo -e " ${GREEN:-}✓${NC:-} Antigravity → GEMINI.md + .agent/ (en $project_root/)"
|
|
190
|
+
|
|
191
|
+
if [ "$locale" != "en" ] && [ -f "$home/GEMINI.${locale}.md" ]; then
|
|
192
|
+
cp "$home/GEMINI.${locale}.md" "$project_root/GEMINI.md" 2>/dev/null || true
|
|
193
|
+
elif [ -f "$home/GEMINI.md" ]; then
|
|
194
|
+
cp "$home/GEMINI.md" "$project_root/" 2>/dev/null || true
|
|
195
|
+
else
|
|
196
|
+
echo -e " ${YELLOW:-}⚠${NC:-} GEMINI.md not found in $home — skipping" >&2
|
|
197
|
+
fi
|
|
198
|
+
|
|
199
|
+
if [ -d "$home/.agent" ]; then
|
|
200
|
+
mkdir -p "$project_root/.agent" 2>/dev/null || true
|
|
201
|
+
cp -r "$home/.agent/"* "$project_root/.agent/" 2>/dev/null || true
|
|
202
|
+
fi
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
# ─────────────────────────────────────────────
|
|
206
|
+
# Windsurf → .windsurf/rules/don-cheli.md
|
|
207
|
+
# ─────────────────────────────────────────────
|
|
208
|
+
_gen_windsurf() {
|
|
209
|
+
local dir="$1" home="$2" locale="$3"
|
|
210
|
+
local project_root
|
|
211
|
+
project_root=$(_get_project_root "$dir")
|
|
212
|
+
|
|
213
|
+
echo -e " ${GREEN:-}✓${NC:-} Windsurf → .windsurf/rules/don-cheli.md (en $project_root/)"
|
|
214
|
+
|
|
215
|
+
mkdir -p "$project_root/.windsurf/rules" 2>/dev/null || true
|
|
216
|
+
|
|
217
|
+
if [ -f "$home/.windsurf/rules/don-cheli.md" ]; then
|
|
218
|
+
cp "$home/.windsurf/rules/don-cheli.md" "$project_root/.windsurf/rules/don-cheli.md" 2>/dev/null || true
|
|
219
|
+
elif [ -f "$home/.cursorrules" ]; then
|
|
220
|
+
cp "$home/.cursorrules" "$project_root/.windsurf/rules/don-cheli.md" 2>/dev/null || true
|
|
221
|
+
else
|
|
222
|
+
echo -e " ${YELLOW:-}⚠${NC:-} No Windsurf template found in $home — skipping" >&2
|
|
223
|
+
fi
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
# ─────────────────────────────────────────────
|
|
227
|
+
# Amp → prompt.md
|
|
228
|
+
# ─────────────────────────────────────────────
|
|
229
|
+
_gen_amp() {
|
|
230
|
+
local dir="$1" home="$2" locale="$3"
|
|
231
|
+
local project_root
|
|
232
|
+
project_root=$(_get_project_root "$dir")
|
|
233
|
+
|
|
234
|
+
echo -e " ${GREEN:-}✓${NC:-} Amp → prompt.md (en $project_root/)"
|
|
235
|
+
|
|
236
|
+
if [ -f "$home/prompt.md" ]; then
|
|
237
|
+
cp "$home/prompt.md" "$project_root/" 2>/dev/null || true
|
|
238
|
+
else
|
|
239
|
+
echo -e " ${YELLOW:-}⚠${NC:-} prompt.md not found in $home — skipping" >&2
|
|
240
|
+
fi
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
# ─────────────────────────────────────────────
|
|
244
|
+
# Continue.dev → .continue/config/don-cheli.json
|
|
245
|
+
# ─────────────────────────────────────────────
|
|
246
|
+
_gen_continue() {
|
|
247
|
+
local dir="$1" home="$2" locale="$3"
|
|
248
|
+
local project_root
|
|
249
|
+
project_root=$(_get_project_root "$dir")
|
|
250
|
+
|
|
251
|
+
echo -e " ${GREEN:-}✓${NC:-} Continue.dev → .continue/config/don-cheli.json (en $project_root/)"
|
|
252
|
+
|
|
253
|
+
mkdir -p "$project_root/.continue/config" 2>/dev/null || true
|
|
254
|
+
|
|
255
|
+
if [ -f "$home/.continue/config/don-cheli.json" ]; then
|
|
256
|
+
cp "$home/.continue/config/don-cheli.json" "$project_root/.continue/config/don-cheli.json" 2>/dev/null || true
|
|
257
|
+
else
|
|
258
|
+
cat > "$project_root/.continue/config/don-cheli.json" 2>/dev/null << 'CONTEOF' || true
|
|
259
|
+
{
|
|
260
|
+
"name": "don-cheli-sdd",
|
|
261
|
+
"version": "1.29.0",
|
|
262
|
+
"description": "Don Cheli SDD Framework",
|
|
263
|
+
"rules": [
|
|
264
|
+
"All production code requires tests (TDD: RED → GREEN → REFACTOR)",
|
|
265
|
+
"Root cause first, then fix (Debugging)",
|
|
266
|
+
"Evidence before assertions (Verification)",
|
|
267
|
+
"Read files on demand, not preemptively",
|
|
268
|
+
"Structured outputs from the start"
|
|
269
|
+
]
|
|
270
|
+
}
|
|
271
|
+
CONTEOF
|
|
272
|
+
fi
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
# ─────────────────────────────────────────────
|
|
276
|
+
# OpenCode → ~/.config/opencode/config.json
|
|
277
|
+
# ─────────────────────────────────────────────
|
|
278
|
+
_gen_opencode() {
|
|
279
|
+
local dir="$1" home="$2" locale="$3"
|
|
280
|
+
local project_root
|
|
281
|
+
project_root=$(_get_project_root "$dir")
|
|
282
|
+
|
|
283
|
+
echo -e " ${GREEN:-}✓${NC:-} OpenCode → config + .opencode/ (en $project_root/)"
|
|
284
|
+
|
|
285
|
+
# Copy opencode.json and .opencode/ to project root
|
|
286
|
+
if [ -f "$home/opencode.json" ]; then
|
|
287
|
+
cp "$home/opencode.json" "$project_root/" 2>/dev/null || true
|
|
288
|
+
fi
|
|
289
|
+
if [ -d "$home/.opencode" ]; then
|
|
290
|
+
mkdir -p "$project_root/.opencode/agents" 2>/dev/null || true
|
|
291
|
+
cp -r "$home/.opencode/"* "$project_root/.opencode/" 2>/dev/null || true
|
|
292
|
+
fi
|
|
293
|
+
|
|
294
|
+
local opencode_config="$HOME/.config/opencode/config.json"
|
|
295
|
+
local skills_path="${home}/.agent/skills"
|
|
296
|
+
local tmp_config
|
|
297
|
+
|
|
298
|
+
# Ensure opencode config directory exists
|
|
299
|
+
mkdir -p "$(dirname "$opencode_config")" 2>/dev/null || true
|
|
300
|
+
|
|
301
|
+
# If config doesn't exist, create it
|
|
302
|
+
if [ ! -f "$opencode_config" ]; then
|
|
303
|
+
cat > "$opencode_config" << 'OPENCODECONFIG'
|
|
304
|
+
{
|
|
305
|
+
"$schema": "https://opencode.ai/config.json",
|
|
306
|
+
"autoupdate": true,
|
|
307
|
+
"permission": {
|
|
308
|
+
"external_directory": {}
|
|
309
|
+
},
|
|
310
|
+
"skills": {
|
|
311
|
+
"paths": []
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
OPENCODECONFIG
|
|
315
|
+
echo -e " ${GREEN:-}✓${NC:-} Created new opencode config"
|
|
316
|
+
fi
|
|
317
|
+
|
|
318
|
+
# Use jq if available for robust JSON editing
|
|
319
|
+
if command -v jq &>/dev/null; then
|
|
320
|
+
# Add external_directory permission
|
|
321
|
+
jq '(.permission.external_directory // {}) |= if has("/root/.claude/**") then . else . + {"/root/.claude/**": "allow"} end' "$opencode_config" > "${opencode_config}.tmp" && mv "${opencode_config}.tmp" "$opencode_config"
|
|
322
|
+
|
|
323
|
+
# Add skills path
|
|
324
|
+
jq ".skills.paths += [\"${skills_path}\"] | .skills.paths = (.skills.paths | unique)" "$opencode_config" > "${opencode_config}.tmp" && mv "${opencode_config}.tmp" "$opencode_config"
|
|
325
|
+
|
|
326
|
+
echo -e " ${GREEN:-}✓${NC:-} Config updated with jq"
|
|
327
|
+
else
|
|
328
|
+
# Fallback: append to paths array manually (less robust)
|
|
329
|
+
if ! grep -q "${skills_path}" "$opencode_config" 2>/dev/null; then
|
|
330
|
+
# Simple append to paths array (last element stays as empty array)
|
|
331
|
+
sed -i "s/\"paths\": \[\]/\"paths\": [\"${skills_path}\"]/" "$opencode_config" 2>/dev/null || true
|
|
332
|
+
fi
|
|
333
|
+
|
|
334
|
+
if ! grep -q '"/root/.claude' "$opencode_config" 2>/dev/null; then
|
|
335
|
+
# Simple append to external_directory (might create invalid JSON)
|
|
336
|
+
sed -i 's/"external_directory": {}/"external_directory": { "\/root\/.claude\/**": "allow" }/' "$opencode_config" 2>/dev/null || true
|
|
337
|
+
fi
|
|
338
|
+
|
|
339
|
+
echo -e " ${YELLOW:-}⚠${NC:-} jq not found, used fallback sed (less reliable)"
|
|
340
|
+
fi
|
|
341
|
+
|
|
342
|
+
# Verify final config
|
|
343
|
+
if [ -f "$opencode_config" ]; then
|
|
344
|
+
echo -e " ${GREEN:-}✓${NC:-} Config saved to ${opencode_config}"
|
|
345
|
+
echo -e " ${GREEN:-}✓${NC:-} Skills path: ${skills_path}"
|
|
346
|
+
else
|
|
347
|
+
echo -e " ${YELLOW:-}⚠${NC:-} Failed to write config"
|
|
348
|
+
fi
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
# ─────────────────────────────────────────────
|
|
352
|
+
# Qwen → AGENTS.md + .opencode/ (at project root)
|
|
353
|
+
# ─────────────────────────────────────────────
|
|
354
|
+
_gen_qwen() {
|
|
355
|
+
local dir="$1" home="$2" locale="$3"
|
|
356
|
+
local project_root
|
|
357
|
+
project_root=$(_get_project_root "$dir")
|
|
358
|
+
|
|
359
|
+
echo -e " ${GREEN:-}✓${NC:-} Qwen → AGENTS.md + .opencode/ (en $project_root/)"
|
|
360
|
+
|
|
361
|
+
# Qwen uses AGENTS.md like Codex
|
|
362
|
+
if [ -f "$home/AGENTS.md" ]; then
|
|
363
|
+
cp "$home/AGENTS.md" "$project_root/" 2>/dev/null || true
|
|
364
|
+
fi
|
|
365
|
+
|
|
366
|
+
# Also copy OpenCode agent (Qwen can use opencode format)
|
|
367
|
+
if [ -d "$home/.opencode" ]; then
|
|
368
|
+
mkdir -p "$project_root/.opencode/agents" 2>/dev/null || true
|
|
369
|
+
cp -r "$home/.opencode/"* "$project_root/.opencode/" 2>/dev/null || true
|
|
370
|
+
fi
|
|
371
|
+
if [ -f "$home/opencode.json" ]; then
|
|
372
|
+
cp "$home/opencode.json" "$project_root/" 2>/dev/null || true
|
|
373
|
+
fi
|
|
374
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
set -euo pipefail
|
|
6
6
|
|
|
7
|
-
VERSION="1.
|
|
7
|
+
VERSION="1.30.0"
|
|
8
8
|
REPO_URL="https://github.com/doncheli/don-cheli-sdd"
|
|
9
9
|
CLEANUP_TMPDIR=""
|
|
10
10
|
|
|
@@ -338,7 +338,7 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
338
338
|
if [ -z "$TOOLS_FLAG" ]; then
|
|
339
339
|
GUM_TOOLS_OK=false
|
|
340
340
|
if [ "$HAS_GUM" = true ]; then
|
|
341
|
-
TOOLS_RAW=$(printf "Claude Code\nCodex\nCursor\nAntigravity\nWindsurf\nAmp\nContinue.dev\nOpenCode\nTodos" | \
|
|
341
|
+
TOOLS_RAW=$(printf "Claude Code\nCodex\nCursor\nAntigravity\nWindsurf\nAmp\nContinue.dev\nOpenCode\nQwen\nTodos" | \
|
|
342
342
|
gum choose --no-limit \
|
|
343
343
|
--header "¿Dónde quieres instalar Don Cheli SDD?" \
|
|
344
344
|
--header.foreground="99" \
|
|
@@ -358,7 +358,8 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
358
358
|
"Amp") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}amp" ;;
|
|
359
359
|
"Continue.dev") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}continue" ;;
|
|
360
360
|
"OpenCode") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}opencode" ;;
|
|
361
|
-
"
|
|
361
|
+
"Qwen") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}qwen" ;;
|
|
362
|
+
"Todos") TOOLS_FLAG="claude,codex,cursor,antigravity,windsurf,amp,continue,opencode,qwen" ;;
|
|
362
363
|
esac
|
|
363
364
|
done <<< "$TOOLS_RAW"
|
|
364
365
|
GUM_TOOLS_OK=true
|
|
@@ -375,7 +376,8 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
375
376
|
echo -e " ${CYAN}6)${NC} Amp (prompt.md)"
|
|
376
377
|
echo -e " ${CYAN}7)${NC} Continue.dev (.continue/config/)"
|
|
377
378
|
echo -e " ${CYAN}8)${NC} OpenCode (.opencode/ + @doncheli)"
|
|
378
|
-
echo -e " ${CYAN}9)${NC}
|
|
379
|
+
echo -e " ${CYAN}9)${NC} Qwen (AGENTS.md + .opencode/)"
|
|
380
|
+
echo -e " ${CYAN}10)${NC} Todos"
|
|
379
381
|
echo ""
|
|
380
382
|
echo -ne " ${BOLD}▸ Elige (números separados por coma): ${NC}"
|
|
381
383
|
TOOLS_CHOICE=""
|
|
@@ -396,7 +398,8 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
396
398
|
6) TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}amp" ;;
|
|
397
399
|
7) TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}continue" ;;
|
|
398
400
|
8) TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}opencode" ;;
|
|
399
|
-
9
|
|
401
|
+
9) TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}qwen" ;;
|
|
402
|
+
10|all) TOOLS_FLAG="claude,codex,cursor,antigravity,windsurf,amp,continue,opencode,qwen" ;;
|
|
400
403
|
esac
|
|
401
404
|
done
|
|
402
405
|
fi
|
|
@@ -76,6 +76,9 @@ generar_configs() {
|
|
|
76
76
|
opencode)
|
|
77
77
|
_gen_opencode "$install_dir" "$framework_home" "$locale"
|
|
78
78
|
;;
|
|
79
|
+
qwen)
|
|
80
|
+
_gen_qwen "$install_dir" "$framework_home" "$locale"
|
|
81
|
+
;;
|
|
79
82
|
*)
|
|
80
83
|
echo -e " ${YELLOW}⚠${NC} Unknown tool: '$tool' — skipping" >&2
|
|
81
84
|
;;
|
|
@@ -255,7 +258,7 @@ _gen_continue() {
|
|
|
255
258
|
cat > "$project_root/.continue/config/don-cheli.json" 2>/dev/null << 'CONTEOF' || true
|
|
256
259
|
{
|
|
257
260
|
"name": "don-cheli-sdd",
|
|
258
|
-
"version": "1.
|
|
261
|
+
"version": "1.30.0",
|
|
259
262
|
"description": "Don Cheli SDD Framework",
|
|
260
263
|
"rules": [
|
|
261
264
|
"All production code requires tests (TDD: RED → GREEN → REFACTOR)",
|
|
@@ -344,3 +347,28 @@ OPENCODECONFIG
|
|
|
344
347
|
echo -e " ${YELLOW:-}⚠${NC:-} Failed to write config"
|
|
345
348
|
fi
|
|
346
349
|
}
|
|
350
|
+
|
|
351
|
+
# ─────────────────────────────────────────────
|
|
352
|
+
# Qwen → AGENTS.md + .opencode/ (at project root)
|
|
353
|
+
# ─────────────────────────────────────────────
|
|
354
|
+
_gen_qwen() {
|
|
355
|
+
local dir="$1" home="$2" locale="$3"
|
|
356
|
+
local project_root
|
|
357
|
+
project_root=$(_get_project_root "$dir")
|
|
358
|
+
|
|
359
|
+
echo -e " ${GREEN:-}✓${NC:-} Qwen → AGENTS.md + .opencode/ (en $project_root/)"
|
|
360
|
+
|
|
361
|
+
# Qwen uses AGENTS.md like Codex
|
|
362
|
+
if [ -f "$home/AGENTS.md" ]; then
|
|
363
|
+
cp "$home/AGENTS.md" "$project_root/" 2>/dev/null || true
|
|
364
|
+
fi
|
|
365
|
+
|
|
366
|
+
# Also copy OpenCode agent (Qwen can use opencode format)
|
|
367
|
+
if [ -d "$home/.opencode" ]; then
|
|
368
|
+
mkdir -p "$project_root/.opencode/agents" 2>/dev/null || true
|
|
369
|
+
cp -r "$home/.opencode/"* "$project_root/.opencode/" 2>/dev/null || true
|
|
370
|
+
fi
|
|
371
|
+
if [ -f "$home/opencode.json" ]; then
|
|
372
|
+
cp "$home/opencode.json" "$project_root/" 2>/dev/null || true
|
|
373
|
+
fi
|
|
374
|
+
}
|
package/scripts/instalar.sh
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
set -euo pipefail
|
|
6
6
|
|
|
7
|
-
VERSION="1.
|
|
7
|
+
VERSION="1.30.0"
|
|
8
8
|
REPO_URL="https://github.com/doncheli/don-cheli-sdd"
|
|
9
9
|
CLEANUP_TMPDIR=""
|
|
10
10
|
|
|
@@ -338,7 +338,7 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
338
338
|
if [ -z "$TOOLS_FLAG" ]; then
|
|
339
339
|
GUM_TOOLS_OK=false
|
|
340
340
|
if [ "$HAS_GUM" = true ]; then
|
|
341
|
-
TOOLS_RAW=$(printf "Claude Code\nCodex\nCursor\nAntigravity\nWindsurf\nAmp\nContinue.dev\nOpenCode\nTodos" | \
|
|
341
|
+
TOOLS_RAW=$(printf "Claude Code\nCodex\nCursor\nAntigravity\nWindsurf\nAmp\nContinue.dev\nOpenCode\nQwen\nTodos" | \
|
|
342
342
|
gum choose --no-limit \
|
|
343
343
|
--header "¿Dónde quieres instalar Don Cheli SDD?" \
|
|
344
344
|
--header.foreground="99" \
|
|
@@ -358,7 +358,8 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
358
358
|
"Amp") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}amp" ;;
|
|
359
359
|
"Continue.dev") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}continue" ;;
|
|
360
360
|
"OpenCode") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}opencode" ;;
|
|
361
|
-
"
|
|
361
|
+
"Qwen") TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}qwen" ;;
|
|
362
|
+
"Todos") TOOLS_FLAG="claude,codex,cursor,antigravity,windsurf,amp,continue,opencode,qwen" ;;
|
|
362
363
|
esac
|
|
363
364
|
done <<< "$TOOLS_RAW"
|
|
364
365
|
GUM_TOOLS_OK=true
|
|
@@ -375,7 +376,8 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
375
376
|
echo -e " ${CYAN}6)${NC} Amp (prompt.md)"
|
|
376
377
|
echo -e " ${CYAN}7)${NC} Continue.dev (.continue/config/)"
|
|
377
378
|
echo -e " ${CYAN}8)${NC} OpenCode (.opencode/ + @doncheli)"
|
|
378
|
-
echo -e " ${CYAN}9)${NC}
|
|
379
|
+
echo -e " ${CYAN}9)${NC} Qwen (AGENTS.md + .opencode/)"
|
|
380
|
+
echo -e " ${CYAN}10)${NC} Todos"
|
|
379
381
|
echo ""
|
|
380
382
|
echo -ne " ${BOLD}▸ Elige (números separados por coma): ${NC}"
|
|
381
383
|
TOOLS_CHOICE=""
|
|
@@ -396,7 +398,8 @@ if [ "$INTERACTIVE_MODE" = true ]; then
|
|
|
396
398
|
6) TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}amp" ;;
|
|
397
399
|
7) TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}continue" ;;
|
|
398
400
|
8) TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}opencode" ;;
|
|
399
|
-
9
|
|
401
|
+
9) TOOLS_FLAG="${TOOLS_FLAG:+$TOOLS_FLAG,}qwen" ;;
|
|
402
|
+
10|all) TOOLS_FLAG="claude,codex,cursor,antigravity,windsurf,amp,continue,opencode,qwen" ;;
|
|
400
403
|
esac
|
|
401
404
|
done
|
|
402
405
|
fi
|