@neocage/council 1.3.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.
@@ -0,0 +1,83 @@
1
+ # NVIDIA NIM provider example for Council of Cognitive Excellence.
2
+ # Use with: /council --profile exploration-orthogonal --models configs/provider-model-slots.nim.example.yaml "..."
3
+ #
4
+ # NVIDIA NIM (build.nvidia.com) exposes ~130 open-weight models via an
5
+ # OpenAI-compatible endpoint at https://integrate.api.nvidia.com/v1.
6
+ # Free tier: 1,000 inference credits on signup, 40 RPM rate limit.
7
+ #
8
+ # Setup:
9
+ # 1. Get key at https://build.nvidia.com (key prefix: nvapi-)
10
+ # 2. export NVIDIA_API_KEY=nvapi-...
11
+ # 3. Verify live model IDs: curl -H "Authorization: Bearer $NVIDIA_API_KEY" \
12
+ # https://integrate.api.nvidia.com/v1/models | jq '.data[].id'
13
+ #
14
+ # Why mix providers: spreading seats across model families reduces shared
15
+ # training-data bias and amplifies dissent. NIM gives access to non-Anthropic,
16
+ # non-OpenAI, non-Google open-weight models (DeepSeek, Kimi, MiniMax, GLM, Qwen)
17
+ # without separate provider accounts.
18
+
19
+ profile: exploration-orthogonal
20
+ strategy:
21
+ provider_spread_first: true
22
+ avoid_pair_collocation: true
23
+ force_counterfactual_if_consensus_gt: 0.70
24
+ require_dissenting_members: 2
25
+
26
+ seats:
27
+ # Anthropic seats kept for high-stakes reasoning roles
28
+ socrates:
29
+ provider: anthropic
30
+ model: claude-sonnet-4
31
+ reasoning_mode: analytical
32
+ aurelius:
33
+ provider: anthropic
34
+ model: claude-opus-4
35
+ reasoning_mode: normative
36
+
37
+ # NIM seats — open-weight models via OpenAI-compatible API
38
+ feynman:
39
+ provider: nvidia_nim
40
+ model: deepseek-ai/deepseek-v4-pro
41
+ base_url: https://integrate.api.nvidia.com/v1
42
+ api_key_env: NVIDIA_API_KEY
43
+ reasoning_mode: mechanistic
44
+
45
+ sun-tzu:
46
+ provider: nvidia_nim
47
+ model: moonshotai/kimi-k2.6
48
+ base_url: https://integrate.api.nvidia.com/v1
49
+ api_key_env: NVIDIA_API_KEY
50
+ reasoning_mode: strategic
51
+
52
+ ada:
53
+ provider: nvidia_nim
54
+ model: qwen/qwen3.5-397b-a17b
55
+ base_url: https://integrate.api.nvidia.com/v1
56
+ api_key_env: NVIDIA_API_KEY
57
+ reasoning_mode: formal
58
+
59
+ machiavelli:
60
+ provider: nvidia_nim
61
+ model: z-ai/glm-5.1
62
+ base_url: https://integrate.api.nvidia.com/v1
63
+ api_key_env: NVIDIA_API_KEY
64
+ reasoning_mode: adversarial
65
+
66
+ lao-tzu:
67
+ provider: nvidia_nim
68
+ model: minimaxai/minimax-m2.7
69
+ base_url: https://integrate.api.nvidia.com/v1
70
+ api_key_env: NVIDIA_API_KEY
71
+ reasoning_mode: emergent
72
+
73
+ # Google for breadth on a third axis
74
+ torvalds:
75
+ provider: google
76
+ model: gemini-3-pro
77
+ reasoning_mode: pragmatic
78
+
79
+ fallback:
80
+ provider: nvidia_nim
81
+ model: deepseek-ai/deepseek-v4-pro
82
+ base_url: https://integrate.api.nvidia.com/v1
83
+ api_key_env: NVIDIA_API_KEY
package/install.sh ADDED
@@ -0,0 +1,432 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ # Project version — derived from the latest released entry in CHANGELOG.md so
6
+ # generated manifests never carry a stale hardcoded version.
7
+ PROJECT_VERSION="$(sed -nE 's/^## \[([0-9]+\.[0-9]+\.[0-9]+)\].*/\1/p' "${SCRIPT_DIR}/CHANGELOG.md" 2>/dev/null | head -1)"
8
+ PROJECT_VERSION="${PROJECT_VERSION:-0.0.0}"
9
+ CLAUDE_DIR="${HOME}/.claude"
10
+ CODEX_DIR="${HOME}/.codex"
11
+ GEMINI_DIR="${HOME}/.gemini"
12
+ OPENCODE_DIR="${HOME}/.config/opencode"
13
+ DRY_RUN=false
14
+ COPY_CONFIGS=false
15
+ INSTALL_CLAUDE=true
16
+ INSTALL_CODEX=false
17
+ INSTALL_GEMINI=false
18
+ INSTALL_OPENCODE=false
19
+
20
+ usage() {
21
+ cat <<'EOF'
22
+ Usage: ./install.sh [--claude-dir PATH] [--codex-dir PATH] [--gemini-dir PATH] [--opencode-dir PATH] [--codex] [--codex-only] [--gemini] [--gemini-only] [--opencode] [--opencode-only] [--copy-configs] [--dry-run] [--help]
23
+
24
+ Install Council of Cognitive Excellence into Claude Code, Codex, Gemini CLI, and/or opencode skill directories.
25
+
26
+ Options:
27
+ --claude-dir PATH Target Claude config directory (default: ~/.claude)
28
+ --codex-dir PATH Target Codex config directory (default: ~/.codex)
29
+ --gemini-dir PATH Target Gemini config directory (default: ~/.gemini)
30
+ --opencode-dir PATH Target opencode config directory (default: ~/.config/opencode)
31
+ --codex Also install a Codex-compatible council skill
32
+ --codex-only Install only the Codex skill
33
+ --gemini Also install a Gemini-compatible council skill
34
+ --gemini-only Install only the Gemini skill
35
+ --opencode Also install an opencode-compatible council skill and native subagents
36
+ --opencode-only Install only the opencode skill and subagents
37
+ --copy-configs Also install repo configs/ into skill config folders
38
+ --dry-run Print actions without writing files
39
+ --help Show this help message
40
+ EOF
41
+ }
42
+
43
+ while [[ $# -gt 0 ]]; do
44
+ case "$1" in
45
+ --claude-dir)
46
+ if [[ $# -lt 2 ]]; then
47
+ echo "Error: --claude-dir requires a path argument" >&2
48
+ usage
49
+ exit 1
50
+ fi
51
+ CLAUDE_DIR="$2"
52
+ shift 2
53
+ ;;
54
+ --codex-dir)
55
+ if [[ $# -lt 2 ]]; then
56
+ echo "Error: --codex-dir requires a path argument" >&2
57
+ usage
58
+ exit 1
59
+ fi
60
+ CODEX_DIR="$2"
61
+ shift 2
62
+ ;;
63
+ --gemini-dir)
64
+ if [[ $# -lt 2 ]]; then
65
+ echo "Error: --gemini-dir requires a path argument" >&2
66
+ usage
67
+ exit 1
68
+ fi
69
+ GEMINI_DIR="$2"
70
+ shift 2
71
+ ;;
72
+ --opencode-dir)
73
+ if [[ $# -lt 2 ]]; then
74
+ echo "Error: --opencode-dir requires a path argument" >&2
75
+ usage
76
+ exit 1
77
+ fi
78
+ OPENCODE_DIR="$2"
79
+ shift 2
80
+ ;;
81
+ --codex)
82
+ INSTALL_CODEX=true
83
+ shift
84
+ ;;
85
+ --codex-only)
86
+ INSTALL_CLAUDE=false
87
+ INSTALL_CODEX=true
88
+ shift
89
+ ;;
90
+ --gemini)
91
+ INSTALL_GEMINI=true
92
+ shift
93
+ ;;
94
+ --gemini-only)
95
+ INSTALL_CLAUDE=false
96
+ INSTALL_GEMINI=true
97
+ shift
98
+ ;;
99
+ --opencode)
100
+ INSTALL_OPENCODE=true
101
+ shift
102
+ ;;
103
+ --opencode-only)
104
+ INSTALL_CLAUDE=false
105
+ INSTALL_OPENCODE=true
106
+ shift
107
+ ;;
108
+ --copy-configs)
109
+ COPY_CONFIGS=true
110
+ shift
111
+ ;;
112
+ --dry-run)
113
+ DRY_RUN=true
114
+ shift
115
+ ;;
116
+ --help|-h)
117
+ usage
118
+ exit 0
119
+ ;;
120
+ *)
121
+ echo "Error: unknown argument '$1'" >&2
122
+ usage
123
+ exit 1
124
+ ;;
125
+ esac
126
+ done
127
+
128
+ if [[ "${INSTALL_CLAUDE}" == false ]] && [[ "${INSTALL_CODEX}" == false ]] && [[ "${INSTALL_GEMINI}" == false ]] && [[ "${INSTALL_OPENCODE}" == false ]]; then
129
+ echo "Error: no install target selected" >&2
130
+ usage
131
+ exit 1
132
+ fi
133
+
134
+ run_cmd() {
135
+ if [[ "$DRY_RUN" == true ]]; then
136
+ echo "[dry-run] $*"
137
+ else
138
+ "$@"
139
+ fi
140
+ }
141
+
142
+ if [[ ! -d "${SCRIPT_DIR}/agents" ]]; then
143
+ echo "Error: agents directory not found at ${SCRIPT_DIR}/agents" >&2
144
+ exit 1
145
+ fi
146
+
147
+ if [[ "${INSTALL_CLAUDE}" == true ]] && [[ ! -f "${SCRIPT_DIR}/SKILL.md" ]]; then
148
+ echo "Error: SKILL.md not found at ${SCRIPT_DIR}/SKILL.md" >&2
149
+ exit 1
150
+ fi
151
+
152
+ if [[ "${INSTALL_CODEX}" == true ]] && [[ ! -f "${SCRIPT_DIR}/SKILL.codex.md" ]]; then
153
+ echo "Error: SKILL.codex.md not found at ${SCRIPT_DIR}/SKILL.codex.md" >&2
154
+ exit 1
155
+ fi
156
+
157
+ if [[ "${INSTALL_GEMINI}" == true ]] && [[ ! -f "${SCRIPT_DIR}/SKILL.gemini.md" ]]; then
158
+ echo "Error: SKILL.gemini.md not found at ${SCRIPT_DIR}/SKILL.gemini.md" >&2
159
+ exit 1
160
+ fi
161
+
162
+ if [[ "${INSTALL_OPENCODE}" == true ]] && [[ ! -f "${SCRIPT_DIR}/SKILL.opencode.md" ]]; then
163
+ echo "Error: SKILL.opencode.md not found at ${SCRIPT_DIR}/SKILL.opencode.md" >&2
164
+ exit 1
165
+ fi
166
+
167
+ shopt -s nullglob
168
+ agent_files=("${SCRIPT_DIR}"/agents/council-*.md)
169
+ shopt -u nullglob
170
+
171
+ if [[ ${#agent_files[@]} -eq 0 ]]; then
172
+ echo "Error: no council agent files found under ${SCRIPT_DIR}/agents" >&2
173
+ exit 1
174
+ fi
175
+
176
+ CONFIGS_SRC_DIR="${SCRIPT_DIR}/configs"
177
+
178
+ echo "Installing Council of Cognitive Excellence..."
179
+ if [[ "${INSTALL_CLAUDE}" == true ]]; then
180
+ AGENTS_DEST="${CLAUDE_DIR}/agents"
181
+ CLAUDE_SKILL_DEST_DIR="${CLAUDE_DIR}/skills/council"
182
+ CLAUDE_SKILL_DEST="${CLAUDE_SKILL_DEST_DIR}/SKILL.md"
183
+ CLAUDE_CONFIGS_DEST_DIR="${CLAUDE_SKILL_DEST_DIR}/configs"
184
+ CLAUDE_SCRIPTS_DEST_DIR="${CLAUDE_SKILL_DEST_DIR}/scripts"
185
+
186
+ echo "Claude target directory: ${CLAUDE_DIR}"
187
+ echo "Creating Claude destination directories..."
188
+ run_cmd mkdir -p "${AGENTS_DEST}" "${CLAUDE_SKILL_DEST_DIR}"
189
+
190
+ echo "Installing Claude council agents..."
191
+ installed_count=0
192
+ for agent_file in "${agent_files[@]}"; do
193
+ run_cmd install -m 0644 "${agent_file}" "${AGENTS_DEST}/"
194
+ ((installed_count+=1))
195
+ done
196
+
197
+ echo "Installing Claude council skill..."
198
+ run_cmd install -m 0644 "${SCRIPT_DIR}/SKILL.md" "${CLAUDE_SKILL_DEST}"
199
+
200
+ echo "Installing Claude council scripts..."
201
+ run_cmd mkdir -p "${CLAUDE_SCRIPTS_DEST_DIR}"
202
+ scripts_installed=0
203
+ shopt -s nullglob
204
+ script_files=("${SCRIPT_DIR}"/scripts/detect-*.sh)
205
+ shopt -u nullglob
206
+ for script_file in "${script_files[@]}"; do
207
+ run_cmd install -m 0755 "${script_file}" "${CLAUDE_SCRIPTS_DEST_DIR}/"
208
+ ((scripts_installed+=1))
209
+ done
210
+
211
+ claude_configs_installed=0
212
+ if [[ "$COPY_CONFIGS" == true ]]; then
213
+ if [[ -d "${CONFIGS_SRC_DIR}" ]]; then
214
+ run_cmd mkdir -p "${CLAUDE_CONFIGS_DEST_DIR}"
215
+ shopt -s nullglob
216
+ config_files=("${CONFIGS_SRC_DIR}"/*)
217
+ shopt -u nullglob
218
+ for config_file in "${config_files[@]}"; do
219
+ if [[ -f "${config_file}" ]]; then
220
+ run_cmd install -m 0644 "${config_file}" "${CLAUDE_CONFIGS_DEST_DIR}/"
221
+ ((claude_configs_installed+=1))
222
+ fi
223
+ done
224
+ else
225
+ echo "Warning: --copy-configs was set but ${CONFIGS_SRC_DIR} does not exist."
226
+ fi
227
+ fi
228
+ fi
229
+
230
+ if [[ "${INSTALL_CODEX}" == true ]]; then
231
+ CODEX_SKILL_DEST_DIR="${CODEX_DIR}/skills/council"
232
+ CODEX_SKILL_DEST="${CODEX_SKILL_DEST_DIR}/SKILL.md"
233
+ CODEX_AGENTS_DEST_DIR="${CODEX_SKILL_DEST_DIR}/agents"
234
+ CODEX_SCRIPTS_DEST_DIR="${CODEX_SKILL_DEST_DIR}/scripts"
235
+ CODEX_CONFIGS_DEST_DIR="${CODEX_SKILL_DEST_DIR}/configs"
236
+
237
+ echo "Codex target directory: ${CODEX_DIR}"
238
+ echo "Creating Codex destination directories..."
239
+ run_cmd mkdir -p "${CODEX_SKILL_DEST_DIR}" "${CODEX_AGENTS_DEST_DIR}" "${CODEX_SCRIPTS_DEST_DIR}"
240
+
241
+ echo "Installing Codex council skill..."
242
+ run_cmd install -m 0644 "${SCRIPT_DIR}/SKILL.codex.md" "${CODEX_SKILL_DEST}"
243
+
244
+ echo "Installing Codex council agents..."
245
+ codex_agents_installed=0
246
+ for agent_file in "${agent_files[@]}"; do
247
+ run_cmd install -m 0644 "${agent_file}" "${CODEX_AGENTS_DEST_DIR}/"
248
+ ((codex_agents_installed+=1))
249
+ done
250
+
251
+ echo "Installing Codex council scripts..."
252
+ codex_scripts_installed=0
253
+ shopt -s nullglob
254
+ codex_script_files=("${SCRIPT_DIR}"/scripts/detect-*.sh)
255
+ shopt -u nullglob
256
+ for script_file in "${codex_script_files[@]}"; do
257
+ run_cmd install -m 0755 "${script_file}" "${CODEX_SCRIPTS_DEST_DIR}/"
258
+ ((codex_scripts_installed+=1))
259
+ done
260
+
261
+ codex_configs_installed=0
262
+ if [[ "$COPY_CONFIGS" == true ]]; then
263
+ if [[ -d "${CONFIGS_SRC_DIR}" ]]; then
264
+ run_cmd mkdir -p "${CODEX_CONFIGS_DEST_DIR}"
265
+ shopt -s nullglob
266
+ codex_config_files=("${CONFIGS_SRC_DIR}"/*)
267
+ shopt -u nullglob
268
+ for config_file in "${codex_config_files[@]}"; do
269
+ if [[ -f "${config_file}" ]]; then
270
+ run_cmd install -m 0644 "${config_file}" "${CODEX_CONFIGS_DEST_DIR}/"
271
+ ((codex_configs_installed+=1))
272
+ fi
273
+ done
274
+ else
275
+ echo "Warning: --copy-configs was set but ${CONFIGS_SRC_DIR} does not exist."
276
+ fi
277
+ fi
278
+ fi
279
+
280
+ if [[ "${INSTALL_GEMINI}" == true ]]; then
281
+ echo
282
+ GEMINI_EXT_ROOT="${GEMINI_DIR}/extensions/council-of-cognitive-excellence"
283
+ GEMINI_EXT_DEST_DIR="${GEMINI_EXT_ROOT}/skills/council"
284
+ GEMINI_SKILL_DEST="${GEMINI_EXT_DEST_DIR}/SKILL.md"
285
+ GEMINI_AGENTS_DEST_DIR="${GEMINI_EXT_DEST_DIR}/agents"
286
+ GEMINI_SCRIPTS_DEST_DIR="${GEMINI_EXT_DEST_DIR}/scripts"
287
+ GEMINI_CONFIGS_DEST_DIR="${GEMINI_EXT_DEST_DIR}/configs"
288
+
289
+ echo "Gemini target directory: ${GEMINI_DIR}"
290
+ echo "Creating Gemini destination directories..."
291
+ run_cmd mkdir -p "${GEMINI_EXT_DEST_DIR}" "${GEMINI_AGENTS_DEST_DIR}" "${GEMINI_SCRIPTS_DEST_DIR}"
292
+
293
+ echo "Writing gemini-extension.json manifest..."
294
+ if [[ "$DRY_RUN" == false ]]; then
295
+ cat <<EOF > "${GEMINI_EXT_ROOT}/gemini-extension.json"
296
+ {
297
+ "name": "council-of-cognitive-excellence",
298
+ "version": "${PROJECT_VERSION}",
299
+ "description": "Council of Cognitive Excellence multiple persona deliberation system"
300
+ }
301
+ EOF
302
+ else
303
+ echo "[dry-run] Create ${GEMINI_EXT_ROOT}/gemini-extension.json"
304
+ fi
305
+
306
+ echo "Installing Gemini council skill..."
307
+ run_cmd install -m 0644 "${SCRIPT_DIR}/SKILL.gemini.md" "${GEMINI_SKILL_DEST}"
308
+
309
+ echo "Installing Gemini council agents..."
310
+ gemini_agents_installed=0
311
+ for agent_file in "${agent_files[@]}"; do
312
+ run_cmd install -m 0644 "${agent_file}" "${GEMINI_AGENTS_DEST_DIR}/"
313
+ ((gemini_agents_installed+=1))
314
+ done
315
+
316
+ echo "Installing Gemini council scripts..."
317
+ gemini_scripts_installed=0
318
+ shopt -s nullglob
319
+ gemini_script_files=("${SCRIPT_DIR}"/scripts/detect-*.sh)
320
+ shopt -u nullglob
321
+ for script_file in "${gemini_script_files[@]}"; do
322
+ run_cmd install -m 0755 "${script_file}" "${GEMINI_SCRIPTS_DEST_DIR}/"
323
+ ((gemini_scripts_installed+=1))
324
+ done
325
+
326
+ gemini_configs_installed=0
327
+ if [[ "$COPY_CONFIGS" == true ]]; then
328
+ if [[ -d "${CONFIGS_SRC_DIR}" ]]; then
329
+ run_cmd mkdir -p "${GEMINI_CONFIGS_DEST_DIR}"
330
+ shopt -s nullglob
331
+ gemini_config_files=("${CONFIGS_SRC_DIR}"/*)
332
+ shopt -u nullglob
333
+ for config_file in "${gemini_config_files[@]}"; do
334
+ if [[ -f "${config_file}" ]]; then
335
+ run_cmd install -m 0644 "${config_file}" "${GEMINI_CONFIGS_DEST_DIR}/"
336
+ ((gemini_configs_installed+=1))
337
+ fi
338
+ done
339
+ else
340
+ echo "Warning: --copy-configs was set but ${CONFIGS_SRC_DIR} does not exist."
341
+ fi
342
+ fi
343
+ fi
344
+
345
+ if [[ "${INSTALL_OPENCODE}" == true ]]; then
346
+ echo
347
+ OPENCODE_SKILL_DEST_DIR="${OPENCODE_DIR}/skills/council"
348
+ OPENCODE_SKILL_DEST="${OPENCODE_SKILL_DEST_DIR}/SKILL.md"
349
+ OPENCODE_AGENTS_DEST_DIR="${OPENCODE_DIR}/agent"
350
+ OPENCODE_SCRIPTS_DEST_DIR="${OPENCODE_SKILL_DEST_DIR}/scripts"
351
+ OPENCODE_CONFIGS_DEST_DIR="${OPENCODE_SKILL_DEST_DIR}/configs"
352
+
353
+ echo "opencode target directory: ${OPENCODE_DIR}"
354
+ echo "Creating opencode destination directories..."
355
+ run_cmd mkdir -p "${OPENCODE_SKILL_DEST_DIR}" "${OPENCODE_AGENTS_DEST_DIR}" "${OPENCODE_SCRIPTS_DEST_DIR}"
356
+
357
+ echo "Installing opencode council skill..."
358
+ run_cmd install -m 0644 "${SCRIPT_DIR}/SKILL.opencode.md" "${OPENCODE_SKILL_DEST}"
359
+
360
+ echo "Converting and installing opencode council subagents..."
361
+ if [[ "$DRY_RUN" == true ]]; then
362
+ echo "[dry-run] python3 ${SCRIPT_DIR}/scripts/convert-agents-opencode.py ${SCRIPT_DIR}/agents ${OPENCODE_AGENTS_DEST_DIR}"
363
+ opencode_agents_installed=${#agent_files[@]}
364
+ else
365
+ opencode_agents_installed="$(python3 "${SCRIPT_DIR}/scripts/convert-agents-opencode.py" "${SCRIPT_DIR}/agents" "${OPENCODE_AGENTS_DEST_DIR}")"
366
+ fi
367
+
368
+ echo "Installing opencode council scripts..."
369
+ opencode_scripts_installed=0
370
+ shopt -s nullglob
371
+ opencode_script_files=("${SCRIPT_DIR}"/scripts/detect-*.sh)
372
+ shopt -u nullglob
373
+ for script_file in "${opencode_script_files[@]}"; do
374
+ run_cmd install -m 0755 "${script_file}" "${OPENCODE_SCRIPTS_DEST_DIR}/"
375
+ ((opencode_scripts_installed+=1))
376
+ done
377
+
378
+ opencode_configs_installed=0
379
+ if [[ "$COPY_CONFIGS" == true ]]; then
380
+ if [[ -d "${CONFIGS_SRC_DIR}" ]]; then
381
+ run_cmd mkdir -p "${OPENCODE_CONFIGS_DEST_DIR}"
382
+ shopt -s nullglob
383
+ opencode_config_files=("${CONFIGS_SRC_DIR}"/*)
384
+ shopt -u nullglob
385
+ for config_file in "${opencode_config_files[@]}"; do
386
+ if [[ -f "${config_file}" ]]; then
387
+ run_cmd install -m 0644 "${config_file}" "${OPENCODE_CONFIGS_DEST_DIR}/"
388
+ ((opencode_configs_installed+=1))
389
+ fi
390
+ done
391
+ else
392
+ echo "Warning: --copy-configs was set but ${CONFIGS_SRC_DIR} does not exist."
393
+ fi
394
+ fi
395
+ fi
396
+
397
+ echo
398
+ echo "Done."
399
+ if [[ "${INSTALL_CLAUDE}" == true ]]; then
400
+ echo " Installed ${installed_count} council agents to ${AGENTS_DEST}"
401
+ echo " Installed skill to ${CLAUDE_SKILL_DEST}"
402
+ echo " Installed ${scripts_installed} scripts to ${CLAUDE_SCRIPTS_DEST_DIR}"
403
+ if [[ "$COPY_CONFIGS" == true ]]; then
404
+ echo " Installed ${claude_configs_installed} config files to ${CLAUDE_CONFIGS_DEST_DIR}"
405
+ fi
406
+ fi
407
+ if [[ "${INSTALL_CODEX}" == true ]]; then
408
+ echo " Installed Codex skill to ${CODEX_SKILL_DEST}"
409
+ echo " Installed ${codex_agents_installed} Codex council agents to ${CODEX_AGENTS_DEST_DIR}"
410
+ echo " Installed ${codex_scripts_installed} Codex scripts to ${CODEX_SCRIPTS_DEST_DIR}"
411
+ if [[ "$COPY_CONFIGS" == true ]]; then
412
+ echo " Installed ${codex_configs_installed} Codex config files to ${CODEX_CONFIGS_DEST_DIR}"
413
+ fi
414
+ fi
415
+ if [[ "${INSTALL_GEMINI}" == true ]]; then
416
+ echo " Installed Gemini skill to ${GEMINI_SKILL_DEST}"
417
+ echo " Installed ${gemini_agents_installed} Gemini council agents to ${GEMINI_AGENTS_DEST_DIR}"
418
+ echo " Installed ${gemini_scripts_installed} Gemini scripts to ${GEMINI_SCRIPTS_DEST_DIR}"
419
+ if [[ "$COPY_CONFIGS" == true ]]; then
420
+ echo " Installed ${gemini_configs_installed} Gemini config files to ${GEMINI_CONFIGS_DEST_DIR}"
421
+ fi
422
+ fi
423
+ if [[ "${INSTALL_OPENCODE}" == true ]]; then
424
+ echo " Installed opencode skill to ${OPENCODE_SKILL_DEST}"
425
+ echo " Installed ${opencode_agents_installed} opencode council subagents to ${OPENCODE_AGENTS_DEST_DIR}"
426
+ echo " Installed ${opencode_scripts_installed} opencode scripts to ${OPENCODE_SCRIPTS_DEST_DIR}"
427
+ if [[ "$COPY_CONFIGS" == true ]]; then
428
+ echo " Installed ${opencode_configs_installed} opencode config files to ${OPENCODE_CONFIGS_DEST_DIR}"
429
+ fi
430
+ fi
431
+
432
+ echo "Restart your CLI client(s) and use /council to convene the council."
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@neocage/council",
3
+ "version": "1.3.0",
4
+ "description": "18 AI personas deliberate your hardest decisions — structured multi-round deliberation with model diversity across providers.",
5
+ "keywords": [
6
+ "deliberation",
7
+ "multi-agent",
8
+ "decision-making",
9
+ "debate",
10
+ "personas",
11
+ "multi-llm",
12
+ "claude-code",
13
+ "codex",
14
+ "gemini-cli",
15
+ "opencode"
16
+ ],
17
+ "homepage": "https://github.com/NeoCage/Council-of-Cognitive-Excellence",
18
+ "bugs": "https://github.com/NeoCage/Council-of-Cognitive-Excellence/issues",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/NeoCage/Council-of-Cognitive-Excellence.git"
22
+ },
23
+ "license": "MIT",
24
+ "author": "NeoCage (https://github.com/NeoCage)",
25
+ "type": "commonjs",
26
+ "bin": {
27
+ "council": "bin/council.js"
28
+ },
29
+ "files": [
30
+ "bin/",
31
+ "agents/",
32
+ "scripts/",
33
+ "configs/",
34
+ "skills/",
35
+ "SKILL.md",
36
+ "SKILL.codex.md",
37
+ "SKILL.gemini.md",
38
+ "SKILL.opencode.md",
39
+ "install.sh",
40
+ "CHANGELOG.md"
41
+ ],
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ }
48
+ }
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env python3
2
+ """Convert council-*.md Claude subagent files into opencode-compatible subagent files.
3
+
4
+ opencode's agent frontmatter schema is stricter than Claude's: it rejects the
5
+ `tools: [...]` array (deprecated in opencode, replaced by `permission`), rejects
6
+ free-form `color` names (must be a hex code or a fixed theme keyword), and has
7
+ no notion of Claude's `opus`/`sonnet` model aliases. This script re-shapes each
8
+ agent's frontmatter to fit while preserving the original routing metadata
9
+ (`council:` block, including the Claude tier) for the coordinator skill to
10
+ reference.
11
+
12
+ Usage: convert-agents-opencode.py <src_agents_dir> <dst_agents_dir>
13
+ """
14
+ import re
15
+ import sys
16
+ from pathlib import Path
17
+
18
+ try:
19
+ import yaml
20
+ except ImportError:
21
+ sys.exit(
22
+ "Error: PyYAML is required. Install it with: pip3 install --user pyyaml"
23
+ )
24
+
25
+ FRONTMATTER_RE = re.compile(r"^---\n(.*?)\n---\n", re.DOTALL)
26
+
27
+
28
+ def convert(src_path: Path) -> str:
29
+ text = src_path.read_text()
30
+ m = FRONTMATTER_RE.match(text)
31
+ if not m:
32
+ raise ValueError(f"no frontmatter in {src_path}")
33
+ fm = yaml.safe_load(m.group(1))
34
+ body = text[m.end():]
35
+
36
+ council = fm.get("council", {}) or {}
37
+ council["claude_tier"] = fm.get("model")
38
+
39
+ new_fm = {
40
+ "description": fm["description"],
41
+ "mode": "subagent",
42
+ "permission": {"edit": "deny", "write": "deny"},
43
+ "council": council,
44
+ }
45
+
46
+ new_frontmatter = yaml.safe_dump(
47
+ new_fm, sort_keys=False, default_flow_style=False, allow_unicode=True
48
+ )
49
+ return f"---\n{new_frontmatter}---\n{body}"
50
+
51
+
52
+ def main():
53
+ if len(sys.argv) != 3:
54
+ sys.exit(f"Usage: {sys.argv[0]} <src_agents_dir> <dst_agents_dir>")
55
+ src_dir, dst_dir = Path(sys.argv[1]), Path(sys.argv[2])
56
+ dst_dir.mkdir(parents=True, exist_ok=True)
57
+
58
+ converted = 0
59
+ for src in sorted(src_dir.glob("council-*.md")):
60
+ (dst_dir / src.name).write_text(convert(src))
61
+ converted += 1
62
+
63
+ print(converted)
64
+
65
+
66
+ if __name__ == "__main__":
67
+ main()