@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.
- package/CHANGELOG.md +75 -0
- package/LICENSE +22 -0
- package/README.md +258 -0
- package/SKILL.codex.md +250 -0
- package/SKILL.gemini.md +241 -0
- package/SKILL.md +940 -0
- package/SKILL.opencode.md +887 -0
- package/agents/council-ada.md +95 -0
- package/agents/council-aristotle.md +92 -0
- package/agents/council-aurelius.md +95 -0
- package/agents/council-feynman.md +95 -0
- package/agents/council-kahneman.md +95 -0
- package/agents/council-karpathy.md +95 -0
- package/agents/council-lao-tzu.md +95 -0
- package/agents/council-machiavelli.md +95 -0
- package/agents/council-meadows.md +95 -0
- package/agents/council-munger.md +95 -0
- package/agents/council-musashi.md +95 -0
- package/agents/council-rams.md +95 -0
- package/agents/council-socrates.md +93 -0
- package/agents/council-sun-tzu.md +95 -0
- package/agents/council-sutskever.md +95 -0
- package/agents/council-taleb.md +95 -0
- package/agents/council-torvalds.md +95 -0
- package/agents/council-watts.md +95 -0
- package/bin/council.js +42 -0
- package/configs/auto-route-defaults.yaml +44 -0
- package/configs/provider-model-slots.cursor.example.yaml +79 -0
- package/configs/provider-model-slots.example.yaml +51 -0
- package/configs/provider-model-slots.nim.example.yaml +83 -0
- package/install.sh +432 -0
- package/package.json +48 -0
- package/scripts/convert-agents-opencode.py +67 -0
- package/scripts/council-simulation-checklist.sh +313 -0
- package/scripts/detect-providers.sh +141 -0
- package/scripts/gen-star-history.py +155 -0
|
@@ -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()
|