@laitszkin/apollo-toolkit 2.12.6 → 2.12.8

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 (20) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/lib/installer.js +40 -8
  3. package/package.json +1 -1
  4. package/scripts/install_skills.ps1 +56 -17
  5. package/scripts/install_skills.sh +44 -16
  6. /package/{codex-memory-manager → codex/codex-memory-manager}/LICENSE +0 -0
  7. /package/{codex-memory-manager → codex/codex-memory-manager}/README.md +0 -0
  8. /package/{codex-memory-manager → codex/codex-memory-manager}/SKILL.md +0 -0
  9. /package/{codex-memory-manager → codex/codex-memory-manager}/agents/openai.yaml +0 -0
  10. /package/{codex-memory-manager → codex/codex-memory-manager}/scripts/extract_recent_conversations.py +0 -0
  11. /package/{codex-memory-manager → codex/codex-memory-manager}/scripts/sync_memory_index.py +0 -0
  12. /package/{codex-memory-manager → codex/codex-memory-manager}/tests/test_extract_recent_conversations.py +0 -0
  13. /package/{codex-memory-manager → codex/codex-memory-manager}/tests/test_sync_memory_index.py +0 -0
  14. /package/{learn-skill-from-conversations → codex/learn-skill-from-conversations}/CHANGELOG.md +0 -0
  15. /package/{learn-skill-from-conversations → codex/learn-skill-from-conversations}/LICENSE +0 -0
  16. /package/{learn-skill-from-conversations → codex/learn-skill-from-conversations}/README.md +0 -0
  17. /package/{learn-skill-from-conversations → codex/learn-skill-from-conversations}/SKILL.md +0 -0
  18. /package/{learn-skill-from-conversations → codex/learn-skill-from-conversations}/agents/openai.yaml +0 -0
  19. /package/{learn-skill-from-conversations → codex/learn-skill-from-conversations}/scripts/extract_recent_conversations.py +0 -0
  20. /package/{learn-skill-from-conversations → codex/learn-skill-from-conversations}/tests/test_extract_recent_conversations.py +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,15 @@ All notable changes to this repository are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [v2.12.7] - 2026-04-02
8
+
9
+ ### Added
10
+ - Add `claude-code` install mode for copying skills into `~/.claude/skills`, with `CLAUDE_CODE_SKILLS_DIR` environment override support.
11
+
12
+ ### Changed
13
+ - Move `codex-memory-manager` and `learn-skill-from-conversations` into `codex/` subdirectory to clarify agent-specific skill boundaries.
14
+ - Update codex install mode to include skills from both root directory and the `codex/` subdirectory.
15
+
7
16
  ## [v2.12.6] - 2026-04-02
8
17
 
9
18
  ### Added
package/lib/installer.js CHANGED
@@ -3,7 +3,7 @@ const fsp = require('node:fs/promises');
3
3
  const os = require('node:os');
4
4
  const path = require('node:path');
5
5
 
6
- const VALID_MODES = ['codex', 'openclaw', 'trae'];
6
+ const VALID_MODES = ['codex', 'openclaw', 'trae', 'claude-code'];
7
7
  const COPY_FILES = new Set(['AGENTS.md', 'CHANGELOG.md', 'LICENSE', 'README.md', 'package.json']);
8
8
  const COPY_DIRS = new Set(['scripts']);
9
9
 
@@ -61,7 +61,7 @@ function normalizeModes(inputModes) {
61
61
  return modes;
62
62
  }
63
63
 
64
- async function listSkillNames(rootDir) {
64
+ async function listSkillNames(rootDir, modes = []) {
65
65
  const entries = await fsp.readdir(rootDir, { withFileTypes: true });
66
66
  const skillNames = [];
67
67
 
@@ -75,6 +75,19 @@ async function listSkillNames(rootDir) {
75
75
  }
76
76
  }
77
77
 
78
+ // For codex mode, also include codex-specific skills
79
+ if (modes.includes('codex')) {
80
+ const codexDir = path.join(rootDir, 'codex');
81
+ if (fs.existsSync(codexDir)) {
82
+ const codexEntries = await fsp.readdir(codexDir, { withFileTypes: true });
83
+ for (const entry of codexEntries) {
84
+ if (entry.isDirectory() && fs.existsSync(path.join(codexDir, entry.name, 'SKILL.md'))) {
85
+ skillNames.push(entry.name);
86
+ }
87
+ }
88
+ }
89
+ }
90
+
78
91
  return skillNames.sort();
79
92
  }
80
93
 
@@ -125,10 +138,10 @@ async function stageToolkitContents({ sourceRoot, destinationRoot, version }) {
125
138
  return copiedEntries.sort();
126
139
  }
127
140
 
128
- async function syncToolkitHome({ sourceRoot, toolkitHome, version }) {
141
+ async function syncToolkitHome({ sourceRoot, toolkitHome, version, modes = [] }) {
129
142
  const parentDir = path.dirname(toolkitHome);
130
143
  const tempDir = path.join(parentDir, `.apollo-toolkit.tmp-${process.pid}-${Date.now()}`);
131
- const previousSkillNames = await listSkillNames(toolkitHome).catch(() => []);
144
+ const previousSkillNames = await listSkillNames(toolkitHome, modes).catch(() => []);
132
145
 
133
146
  await fsp.rm(tempDir, { recursive: true, force: true });
134
147
  await stageToolkitContents({ sourceRoot, destinationRoot: tempDir, version });
@@ -145,7 +158,7 @@ async function syncToolkitHome({ sourceRoot, toolkitHome, version }) {
145
158
  return {
146
159
  toolkitHome,
147
160
  previousSkillNames,
148
- skillNames: await listSkillNames(toolkitHome),
161
+ skillNames: await listSkillNames(toolkitHome, modes),
149
162
  };
150
163
  }
151
164
 
@@ -197,6 +210,18 @@ async function getTargetRoots(modes, env = process.env) {
197
210
  root: path.join(openclawHome, workspaceName, 'skills'),
198
211
  });
199
212
  }
213
+ continue;
214
+ }
215
+
216
+ if (mode === 'claude-code') {
217
+ targets.push({
218
+ mode,
219
+ label: 'Claude Code',
220
+ root: env.CLAUDE_CODE_SKILLS_DIR
221
+ ? path.resolve(expandUserPath(env.CLAUDE_CODE_SKILLS_DIR, env))
222
+ : path.join(homeDir, '.claude', 'skills'),
223
+ });
224
+ continue;
200
225
  }
201
226
  }
202
227
 
@@ -214,8 +239,9 @@ async function replaceWithCopy(sourcePath, targetPath) {
214
239
  }
215
240
 
216
241
  async function installLinks({ toolkitHome, modes, env = process.env, previousSkillNames = [] }) {
217
- const skillNames = await listSkillNames(toolkitHome);
218
- const targets = await getTargetRoots(modes, env);
242
+ const normalizedModes = normalizeModes(modes);
243
+ const skillNames = await listSkillNames(toolkitHome, normalizedModes);
244
+ const targets = await getTargetRoots(normalizedModes, env);
219
245
  const copiedPaths = [];
220
246
  const staleSkillNames = previousSkillNames.filter((skillName) => !skillNames.includes(skillName));
221
247
 
@@ -225,7 +251,13 @@ async function installLinks({ toolkitHome, modes, env = process.env, previousSki
225
251
  await fsp.rm(path.join(target.root, staleSkillName), { recursive: true, force: true });
226
252
  }
227
253
  for (const skillName of skillNames) {
228
- const sourcePath = path.join(toolkitHome, skillName);
254
+ // For codex skills, use the ./codex/ subdirectory as source
255
+ let sourcePath;
256
+ if (normalizedModes.includes('codex') && fs.existsSync(path.join(toolkitHome, 'codex', skillName))) {
257
+ sourcePath = path.join(toolkitHome, 'codex', skillName);
258
+ } else {
259
+ sourcePath = path.join(toolkitHome, skillName);
260
+ }
229
261
  const targetPath = path.join(target.root, skillName);
230
262
  await replaceWithCopy(sourcePath, targetPath);
231
263
  copiedPaths.push({ target: target.label, path: targetPath, skillName });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@laitszkin/apollo-toolkit",
3
- "version": "2.12.6",
3
+ "version": "2.12.8",
4
4
  "description": "Apollo Toolkit npm installer for managed skill copying across Codex, OpenClaw, and Trae.",
5
5
  "license": "MIT",
6
6
  "author": "LaiTszKin",
@@ -9,22 +9,24 @@ $ErrorActionPreference = "Stop"
9
9
  function Show-Usage {
10
10
  @"
11
11
  Usage:
12
- ./scripts/install_skills.ps1 [codex|openclaw|trae|agents|all]...
12
+ ./scripts/install_skills.ps1 [codex|openclaw|trae|agents|claude-code|all]...
13
13
 
14
14
  Modes:
15
- codex Copy skills into ~/.codex/skills
16
- openclaw Copy skills into ~/.openclaw/workspace*/skills
17
- trae Copy skills into ~/.trae/skills
18
- agents Copy skills into ~/.agents/skills (for agent-skill-compatible software)
19
- all Install all supported targets
15
+ codex Copy skills into ~/.codex/skills (includes ./codex/ agent-specific skills)
16
+ openclaw Copy skills into ~/.openclaw/workspace*/skills
17
+ trae Copy skills into ~/.trae/skills
18
+ agents Copy skills into ~/.agents/skills (for agent-skill-compatible software)
19
+ claude-code Copy skills into ~/.claude/skills
20
+ all Install all supported targets
20
21
 
21
22
  Optional environment overrides:
22
- CODEX_SKILLS_DIR Override codex skills destination path
23
- OPENCLAW_HOME Override openclaw home path
24
- TRAE_SKILLS_DIR Override trae skills destination path
25
- AGENTS_SKILLS_DIR Override agents skills destination path
26
- APOLLO_TOOLKIT_HOME Override local install path used when repo root is unavailable
27
- APOLLO_TOOLKIT_REPO_URL Override git repository URL used when repo root is unavailable
23
+ CODEX_SKILLS_DIR Override codex skills destination path
24
+ OPENCLAW_HOME Override openclaw home path
25
+ TRAE_SKILLS_DIR Override trae skills destination path
26
+ AGENTS_SKILLS_DIR Override agents skills destination path
27
+ CLAUDE_CODE_SKILLS_DIR Override claude-code skills destination path
28
+ APOLLO_TOOLKIT_HOME Override local install path used when repo root is unavailable
29
+ APOLLO_TOOLKIT_REPO_URL Override git repository URL used when repo root is unavailable
28
30
  "@
29
31
  }
30
32
 
@@ -109,6 +111,8 @@ else {
109
111
  }
110
112
 
111
113
  function Get-SkillPaths {
114
+ param([string[]]$SelectedModes)
115
+
112
116
  $dirs = Get-ChildItem -Path $RepoRoot -Directory | Sort-Object Name
113
117
  $skills = @()
114
118
 
@@ -118,6 +122,19 @@ function Get-SkillPaths {
118
122
  }
119
123
  }
120
124
 
125
+ # For codex mode, also include codex-specific skills
126
+ if ($SelectedModes -contains "codex") {
127
+ $codexDir = Join-Path $RepoRoot "codex"
128
+ if (Test-Path -LiteralPath $codexDir -PathType Container) {
129
+ $codexDirs = Get-ChildItem -Path $codexDir -Directory | Sort-Object Name
130
+ foreach ($dir in $codexDirs) {
131
+ if (Test-Path -LiteralPath (Join-Path $dir.FullName "SKILL.md") -PathType Leaf) {
132
+ $skills += $dir.FullName
133
+ }
134
+ }
135
+ }
136
+ }
137
+
121
138
  if ($skills.Count -eq 0) {
122
139
  throw "No skill folders found in: $RepoRoot"
123
140
  }
@@ -145,12 +162,13 @@ function Resolve-Modes {
145
162
  Show-Banner
146
163
  Write-Host ""
147
164
  Write-Host "Select install options (comma-separated):"
148
- Write-Host "1) codex (~/.codex/skills)"
165
+ Write-Host "1) codex (~/.codex/skills, includes ./codex/ agent-specific skills)"
149
166
  Write-Host "2) openclaw (~/.openclaw/workspace*/skills)"
150
167
  Write-Host "3) trae (~/.trae/skills)"
151
168
  Write-Host "4) agents (~/.agents/skills)"
152
- Write-Host "5) all"
153
- $inputValue = Read-Host "Enter choice(s) [1-5]"
169
+ Write-Host "5) claude-code (~/.claude/skills)"
170
+ Write-Host "6) all"
171
+ $inputValue = Read-Host "Enter choice(s) [1-6]"
154
172
 
155
173
  foreach ($rawChoice in ($inputValue -split ",")) {
156
174
  $choice = $rawChoice.Trim()
@@ -159,11 +177,13 @@ function Resolve-Modes {
159
177
  "2" { Add-ModeOnce -Selected $selected -Mode "openclaw" }
160
178
  "3" { Add-ModeOnce -Selected $selected -Mode "trae" }
161
179
  "4" { Add-ModeOnce -Selected $selected -Mode "agents" }
162
- "5" {
180
+ "5" { Add-ModeOnce -Selected $selected -Mode "claude-code" }
181
+ "6" {
163
182
  Add-ModeOnce -Selected $selected -Mode "codex"
164
183
  Add-ModeOnce -Selected $selected -Mode "openclaw"
165
184
  Add-ModeOnce -Selected $selected -Mode "trae"
166
185
  Add-ModeOnce -Selected $selected -Mode "agents"
186
+ Add-ModeOnce -Selected $selected -Mode "claude-code"
167
187
  }
168
188
  default {
169
189
  throw "Invalid choice: $choice"
@@ -178,11 +198,13 @@ function Resolve-Modes {
178
198
  "openclaw" { Add-ModeOnce -Selected $selected -Mode "openclaw" }
179
199
  "trae" { Add-ModeOnce -Selected $selected -Mode "trae" }
180
200
  "agents" { Add-ModeOnce -Selected $selected -Mode "agents" }
201
+ "claude-code" { Add-ModeOnce -Selected $selected -Mode "claude-code" }
181
202
  "all" {
182
203
  Add-ModeOnce -Selected $selected -Mode "codex"
183
204
  Add-ModeOnce -Selected $selected -Mode "openclaw"
184
205
  Add-ModeOnce -Selected $selected -Mode "trae"
185
206
  Add-ModeOnce -Selected $selected -Mode "agents"
207
+ Add-ModeOnce -Selected $selected -Mode "claude-code"
186
208
  }
187
209
  default {
188
210
  Show-Usage
@@ -299,13 +321,29 @@ function Install-Agents {
299
321
  }
300
322
  }
301
323
 
324
+ function Install-ClaudeCode {
325
+ param([string[]]$SkillPaths)
326
+
327
+ $target = if ($env:CLAUDE_CODE_SKILLS_DIR) {
328
+ Expand-UserPath $env:CLAUDE_CODE_SKILLS_DIR
329
+ }
330
+ else {
331
+ Join-Path $HOME ".claude/skills"
332
+ }
333
+
334
+ Write-Host "Installing to claude-code: $target"
335
+ foreach ($src in $SkillPaths) {
336
+ Copy-Skill -Source $src -TargetRoot $target
337
+ }
338
+ }
339
+
302
340
  if ($Modes.Count -gt 0 -and ($Modes[0] -eq "-h" -or $Modes[0] -eq "--help")) {
303
341
  Show-Usage
304
342
  exit 0
305
343
  }
306
344
 
307
345
  $selectedModes = Resolve-Modes -Requested $Modes
308
- $skillPaths = Get-SkillPaths
346
+ $skillPaths = Get-SkillPaths -SelectedModes $selectedModes
309
347
 
310
348
  foreach ($mode in $selectedModes) {
311
349
  switch ($mode) {
@@ -313,6 +351,7 @@ foreach ($mode in $selectedModes) {
313
351
  "openclaw" { Install-OpenClaw -SkillPaths $skillPaths }
314
352
  "trae" { Install-Trae -SkillPaths $skillPaths }
315
353
  "agents" { Install-Agents -SkillPaths $skillPaths }
354
+ "claude-code" { Install-ClaudeCode -SkillPaths $skillPaths }
316
355
  default { throw "Unknown mode: $mode" }
317
356
  }
318
357
  }
@@ -4,21 +4,23 @@ set -euo pipefail
4
4
  usage() {
5
5
  cat <<"USAGE"
6
6
  Usage:
7
- ./scripts/install_skills.sh [codex|openclaw|trae|agents|all]...
7
+ ./scripts/install_skills.sh [codex|openclaw|trae|agents|claude-code|all]...
8
8
 
9
9
  Modes:
10
- codex Copy skills into ~/.codex/skills
11
- openclaw Copy skills into ~/.openclaw/workspace*/skills
12
- trae Copy skills into ~/.trae/skills
13
- agents Copy skills into ~/.agents/skills (for agent-skill-compatible software)
14
- all Install all supported targets
10
+ codex Copy skills into ~/.codex/skills (includes ./codex/ agent-specific skills)
11
+ openclaw Copy skills into ~/.openclaw/workspace*/skills
12
+ trae Copy skills into ~/.trae/skills
13
+ agents Copy skills into ~/.agents/skills (for agent-skill-compatible software)
14
+ claude-code Copy skills into ~/.claude/skills
15
+ all Install all supported targets
15
16
 
16
17
  Optional environment overrides:
17
- CODEX_SKILLS_DIR Override codex skills destination path
18
- OPENCLAW_HOME Override openclaw home path
19
- TRAE_SKILLS_DIR Override trae skills destination path
20
- AGENTS_SKILLS_DIR Override agents skills destination path
21
- APOLLO_TOOLKIT_HOME Override local install path used in curl/pipe mode
18
+ CODEX_SKILLS_DIR Override codex skills destination path
19
+ OPENCLAW_HOME Override openclaw home path
20
+ TRAE_SKILLS_DIR Override trae skills destination path
21
+ AGENTS_SKILLS_DIR Override agents skills destination path
22
+ CLAUDE_CODE_SKILLS_DIR Override claude-code skills destination path
23
+ APOLLO_TOOLKIT_HOME Override local install path used in curl/pipe mode
22
24
  APOLLO_TOOLKIT_REPO_URL Override git repository URL used in curl/pipe mode
23
25
  USAGE
24
26
  }
@@ -87,6 +89,18 @@ collect_skills() {
87
89
  fi
88
90
  done < <(find "$REPO_ROOT" -mindepth 1 -maxdepth 1 -type d | sort)
89
91
 
92
+ # For codex mode, also include codex-specific skills
93
+ if [[ " ${SELECTED_MODES[*]} " =~ " codex " ]]; then
94
+ local codex_dir="$REPO_ROOT/codex"
95
+ if [[ -d "$codex_dir" ]]; then
96
+ while IFS= read -r dir; do
97
+ if [[ -f "$dir/SKILL.md" ]]; then
98
+ SKILL_PATHS+=("$dir")
99
+ fi
100
+ done < <(find "$codex_dir" -mindepth 1 -maxdepth 1 -type d | sort)
101
+ fi
102
+ fi
103
+
90
104
  if [[ ${#SKILL_PATHS[@]} -eq 0 ]]; then
91
105
  echo "No skill folders found in: $REPO_ROOT" >&2
92
106
  exit 1
@@ -164,6 +178,16 @@ install_agents() {
164
178
  done
165
179
  }
166
180
 
181
+ install_claude_code() {
182
+ local claude_code_skills_dir
183
+ claude_code_skills_dir="$(expand_user_path "${CLAUDE_CODE_SKILLS_DIR:-$HOME/.claude/skills}")"
184
+
185
+ echo "Installing to claude-code: $claude_code_skills_dir"
186
+ for src in "${SKILL_PATHS[@]}"; do
187
+ replace_with_copy "$src" "$claude_code_skills_dir"
188
+ done
189
+ }
190
+
167
191
  add_mode_once() {
168
192
  local mode="$1"
169
193
  local existing
@@ -182,7 +206,7 @@ parse_mode() {
182
206
  local mode="$1"
183
207
 
184
208
  case "$mode" in
185
- codex|openclaw|trae|agents)
209
+ codex|openclaw|trae|agents|claude-code)
186
210
  add_mode_once "$mode"
187
211
  ;;
188
212
  all)
@@ -190,6 +214,7 @@ parse_mode() {
190
214
  add_mode_once "openclaw"
191
215
  add_mode_once "trae"
192
216
  add_mode_once "agents"
217
+ add_mode_once "claude-code"
193
218
  ;;
194
219
  *)
195
220
  echo "Invalid mode: $mode" >&2
@@ -222,12 +247,13 @@ choose_modes_interactive() {
222
247
  show_banner
223
248
  echo
224
249
  echo "Select install options (comma-separated):"
225
- echo "1) codex (~/.codex/skills)"
250
+ echo "1) codex (~/.codex/skills, includes ./codex/ agent-specific skills)"
226
251
  echo "2) openclaw (~/.openclaw/workspace*/skills)"
227
252
  echo "3) trae (~/.trae/skills)"
228
253
  echo "4) agents (~/.agents/skills)"
229
- echo "5) all"
230
- choice="$(read_choice_from_user 'Enter choice(s) [1-5]: ')"
254
+ echo "5) claude-code (~/.claude/skills)"
255
+ echo "6) all"
256
+ choice="$(read_choice_from_user 'Enter choice(s) [1-6]: ')"
231
257
 
232
258
  IFS=',' read -r -a choices <<< "$choice"
233
259
  for raw_choice in "${choices[@]}"; do
@@ -237,7 +263,8 @@ choose_modes_interactive() {
237
263
  2) add_mode_once "openclaw" ;;
238
264
  3) add_mode_once "trae" ;;
239
265
  4) add_mode_once "agents" ;;
240
- 5) add_mode_once "codex"; add_mode_once "openclaw"; add_mode_once "trae"; add_mode_once "agents" ;;
266
+ 5) add_mode_once "claude-code" ;;
267
+ 6) add_mode_once "codex"; add_mode_once "openclaw"; add_mode_once "trae"; add_mode_once "claude-code" ;;
241
268
  *)
242
269
  echo "Invalid choice: $raw_choice" >&2
243
270
  exit 1
@@ -282,6 +309,7 @@ main() {
282
309
  openclaw) install_openclaw ;;
283
310
  trae) install_trae ;;
284
311
  agents) install_agents ;;
312
+ claude-code) install_claude_code ;;
285
313
  *)
286
314
  usage
287
315
  exit 1