@laitszkin/apollo-toolkit 2.13.0 → 2.13.2

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/AGENTS.md CHANGED
@@ -16,7 +16,7 @@ This repository enables users to install and run a curated set of reusable agent
16
16
  - Users can investigate application logs, slice them to precise time windows, search by keyword or regex, and produce evidence-backed root-cause findings.
17
17
  - Users can answer repository-backed questions with additional web research when needed.
18
18
  - Users can commit and push local changes without performing version or release work.
19
- - Users can manage Codex user-preference memory by reviewing the last 24 hours of chats, storing categorized memory documents under `~/.codex/memory`, and syncing a memory index into `~/.codex/AGENTS.md`.
19
+ - Users can manage Codex user-preference memory by reviewing the last 24 hours of chats, storing reusable preference-first memory documents under `~/.codex/memory`, and syncing a memory index into `~/.codex/AGENTS.md`.
20
20
  - Users can research a topic deeply and produce evidence-based deliverables.
21
21
  - Users can research the latest completed market week and produce a PDF watchlist of tradeable instruments for the coming week.
22
22
  - Users can turn a marked weekly finance PDF into a concise evidence-based financial event report.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,21 @@ All notable changes to this repository are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [v2.13.2] - 2026-04-05
8
+
9
+ ### Changed
10
+ - Update `codex-memory-manager` to require reusable, preference-first memory files built around a normalized `Scope / Preferences / Maintenance / Evidence notes` template instead of project- or incident-specific memory logs.
11
+ - Add a bundled memory-file template reference plus focused template-structure tests so future updates keep the new memory format and de-projectification rules aligned.
12
+
13
+ ## [v2.13.1] - 2026-04-05
14
+
15
+ ### Fixed
16
+ - Fix the npm / `apltk` installer so selecting `codex` now copies agent-specific skills from the repository `codex/` subdirectory into the managed toolkit home and the final Codex skills target.
17
+ - Fix the npm / `apltk` interactive installer and help output so `claude-code` appears as a supported target and can be installed through the same CLI flow as the other modes.
18
+
19
+ ### Changed
20
+ - Refresh installer banner and README wording so Claude Code support is described consistently in the npm-based installation flow.
21
+
7
22
  ## [v2.13.0] - 2026-04-05
8
23
 
9
24
  ### Added
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Apollo Toolkit Skills
2
2
 
3
- A curated skill catalog for Codex, OpenClaw, and Trae with a managed installer that keeps the toolkit in `~/.apollo-toolkit` and copies each skill into the targets you choose.
3
+ A curated skill catalog for Codex, OpenClaw, Trae, and Claude Code with a managed installer that keeps the toolkit in `~/.apollo-toolkit` and copies each skill into the targets you choose.
4
4
 
5
5
  ## Included skills
6
6
 
@@ -62,7 +62,7 @@ npx @laitszkin/apollo-toolkit
62
62
  The interactive installer:
63
63
  - shows a branded `Apollo Toolkit` terminal welcome screen with a short staged reveal
64
64
  - installs a managed copy into `~/.apollo-toolkit`
65
- - lets you multi-select `codex`, `openclaw`, `trae`, or `all`
65
+ - lets you multi-select `codex`, `openclaw`, `trae`, `claude-code`, or `all`
66
66
  - copies `~/.apollo-toolkit/<skill>` into each selected target
67
67
  - removes stale previously installed skill directories that existed in the previous installed version but no longer exist in the current package skill list
68
68
  - replaces legacy symlink-based installs created by older Apollo Toolkit installers with real copied directories
@@ -81,6 +81,7 @@ Global install 後,`apltk` 與 `apollo-toolkit` 都會啟動同一個 Apollo T
81
81
 
82
82
  ```bash
83
83
  npx @laitszkin/apollo-toolkit codex
84
+ npx @laitszkin/apollo-toolkit claude-code
84
85
  npx @laitszkin/apollo-toolkit codex openclaw
85
86
  npx @laitszkin/apollo-toolkit all
86
87
  ```
@@ -92,6 +93,7 @@ APOLLO_TOOLKIT_HOME=~/custom-toolkit npx @laitszkin/apollo-toolkit codex
92
93
  CODEX_SKILLS_DIR=~/custom-codex-skills npx @laitszkin/apollo-toolkit codex
93
94
  OPENCLAW_HOME=~/.openclaw npx @laitszkin/apollo-toolkit openclaw
94
95
  TRAE_SKILLS_DIR=~/.trae/skills npx @laitszkin/apollo-toolkit trae
96
+ CLAUDE_CODE_SKILLS_DIR=~/.claude/skills npx @laitszkin/apollo-toolkit claude-code
95
97
  ```
96
98
 
97
99
  ## Local installer scripts
@@ -1,11 +1,12 @@
1
1
  # codex-memory-manager
2
2
 
3
- Persist durable user preferences from recent Codex conversations into categorized memory files and a synchronized AGENTS index.
3
+ Persist durable user preferences from recent Codex conversations into reusable, preference-first memory files and a synchronized AGENTS index.
4
4
 
5
5
  ## Highlights
6
6
 
7
7
  - Reads the last 24 hours of `~/.codex/sessions` and `~/.codex/archived_sessions`
8
8
  - Stores categorized preference memory under `~/.codex/memory/*.md`
9
+ - Uses a normalized `Scope / Preferences / Maintenance / Evidence notes` memory template
9
10
  - Keeps a normalized memory index at the end of `~/.codex/AGENTS.md`
10
11
  - Adds new index entries automatically when new preference categories appear
11
12
  - Preserves the existing language already used in `~/.codex/AGENTS.md`
@@ -19,10 +20,14 @@ Persist durable user preferences from recent Codex conversations into categorize
19
20
  ├── LICENSE
20
21
  ├── agents/
21
22
  │ └── openai.yaml
23
+ ├── references/
24
+ │ └── templates/
25
+ │ └── memory-file.md
22
26
  ├── scripts/
23
27
  │ ├── extract_recent_conversations.py
24
28
  │ └── sync_memory_index.py
25
29
  └── tests/
30
+ ├── test_memory_template.py
26
31
  ├── test_extract_recent_conversations.py
27
32
  └── test_sync_memory_index.py
28
33
  ```
@@ -49,6 +54,12 @@ Refresh the AGENTS memory index after updating the memory files:
49
54
  python3 scripts/sync_memory_index.py --agents-file ~/.codex/AGENTS.md --memory-dir ~/.codex/memory
50
55
  ```
51
56
 
57
+ Use the bundled memory template when creating or refactoring category files:
58
+
59
+ ```bash
60
+ sed -n '1,200p' references/templates/memory-file.md
61
+ ```
62
+
52
63
  ## License
53
64
 
54
65
  MIT. See `LICENSE` for details.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: codex-memory-manager
3
- description: Manage persistent Codex user-preference memory from recent conversation history. Use when users ask to learn from the last 24 hours of chats, update `~/.codex/AGENTS.md`, maintain `~/.codex/memory/*.md`, or sync new preference categories discovered in `~/.codex/sessions` and `~/.codex/archived_sessions`.
3
+ description: Manage persistent Codex user-preference memory from recent conversation history. Use when users ask to learn from the last 24 hours of chats, update `~/.codex/AGENTS.md`, maintain reusable preference-first memory under `~/.codex/memory/*.md`, or sync new preference categories discovered in `~/.codex/sessions` and `~/.codex/archived_sessions`.
4
4
  ---
5
5
 
6
6
  # Codex Memory Manager
@@ -16,7 +16,7 @@ description: Manage persistent Codex user-preference memory from recent conversa
16
16
 
17
17
  - Evidence: Derive memory only from actual recent Codex conversations, and keep each stored preference tied to concrete chat evidence.
18
18
  - Execution: Extract the last 24 hours first, classify durable user preferences into memory files, then refresh the AGENTS index section.
19
- - Quality: Ignore one-off instructions, avoid duplicating categories, and preserve the existing language and tone already used in `~/.codex/AGENTS.md`.
19
+ - Quality: Ignore one-off instructions, avoid duplicating categories, preserve the existing language and tone already used in `~/.codex/AGENTS.md`, and keep memory entries cross-project reusable, preference-heavy, and light on repository- or incident-specific detail.
20
20
  - Output: Report which sessions were reviewed, which memory categories were created or updated, and whether the AGENTS index changed.
21
21
 
22
22
  ## Goal
@@ -59,31 +59,38 @@ python3 ~/.codex/skills/codex-memory-manager/scripts/extract_recent_conversation
59
59
 
60
60
  - Store memory files under `~/.codex/memory/*.md`.
61
61
  - Reuse an existing category file when the new preference clearly belongs there.
62
- - Create a new category file when the recent chats introduce a distinct new class of preferences. Example: if the existing files are Rust-focused and recent chats introduce stable Java preferences, add a new Java-oriented category file and index it.
62
+ - Create a new category file only when recent chats introduce a distinct reusable preference class that does not fit an existing file.
63
63
  - Keep filenames in kebab-case and scoped to a real category, for example:
64
- - `architecture-preferences.md`
65
- - `workflow-preferences.md`
66
- - `java-preferences.md`
67
- - Use this normalized structure inside each memory file:
64
+ - `engineering-workflow.md`
65
+ - `assistant-style.md`
66
+ - `integration-and-deployment-preferences.md`
67
+ - Keep categories organized by reusable preference type, not by repository, issue, feature name, or one-off incident.
68
+ - When a file mixes too many unrelated preference types, split it by decision domain rather than by project.
69
+ - Prefer wording that captures a reusable choice pattern such as `Prefer X when Y` or `Do not do Z when Q`.
70
+ - Strip or generalize project-specific nouns, module names, branch names, issue numbers, and niche scenario labels unless they are required to explain the durable preference.
71
+ - Keep evidence notes concise and factual; they should justify the preference without turning the memory file into a project log.
72
+ - Use the normalized structure from `references/templates/memory-file.md` inside each memory file:
68
73
 
69
74
  ```md
70
- # Architecture Preferences
75
+ # User Memory - Engineering Workflow
76
+
77
+ Last curated: 2026-04-05 09:20 HKT
71
78
 
72
79
  ## Scope
73
- User preferences about system design, reuse, abstractions, and code organization.
80
+ User preferences about how engineering tasks should be investigated, planned, implemented, verified, merged, and documented across repositories.
74
81
 
75
82
  ## Preferences
76
- - Prefer extending existing modules over parallel implementations.
77
- - Applies when: adding adjacent behavior in an existing codebase.
78
- - Evidence: repeated direction from recent Codex conversations reviewed on 2026-03-18.
79
- - Avoid speculative abstractions and over-engineering.
80
- - Applies when: choosing between a focused edit and a broader refactor.
81
- - Evidence: explicit repeated user guidance in recent sessions.
83
+ - Prefer modular abstractions over duplicated logic.
84
+ - Applies when: designing or refactoring implementation structure.
85
+ - Skip planning artifacts for clearly small, localized, low-risk changes.
86
+ - Applies when: assessing whether a task needs formal spec documents.
82
87
 
83
88
  ## Maintenance
84
- - Keep entries concrete and action-guiding.
85
- - Merge duplicates instead of restating the same preference.
86
- - Replace older statements when newer evidence clearly supersedes them.
89
+ - Keep entries concrete, action-guiding, and reusable across repositories.
90
+ - Move overlapping preferences to a better-matched memory file instead of keeping mixed categories.
91
+
92
+ ## Evidence notes
93
+ - 2026-03-22 through 2026-04-04 repeated workflow corrections consistently reinforced scoped planning, approval gating, and architecture-aware implementation.
87
94
  ```
88
95
 
89
96
  ### 4) Refresh the AGENTS memory index at the end of `~/.codex/AGENTS.md`
@@ -123,4 +130,12 @@ python3 ~/.codex/skills/codex-memory-manager/scripts/sync_memory_index.py \
123
130
  - Do not store secrets, tokens, credentials, or personal data that should not persist.
124
131
  - Do not invent preferences when the evidence is weak or ambiguous.
125
132
  - Do not create duplicate categories when a current memory document already covers the same theme.
133
+ - Do not create memory files organized around a specific repository, issue number, feature branch, or single operational incident unless the user explicitly wants that narrower scope.
134
+ - Do not preserve project-specific wording when a more general preference statement would retain the useful lesson.
126
135
  - Do not rewrite unrelated parts of `~/.codex/AGENTS.md`; only manage the memory index block at the end.
136
+
137
+ ## References
138
+
139
+ Load only when needed:
140
+
141
+ - `references/templates/memory-file.md`
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "Codex Memory Manager"
3
3
  short_description: "Persist user preferences from recent Codex chats"
4
- default_prompt: "Use $codex-memory-manager to review the last 24 hours of Codex sessions, update ~/.codex/memory/*.md, and refresh the memory index at the end of ~/.codex/AGENTS.md."
4
+ default_prompt: "Use $codex-memory-manager to review the last 24 hours of Codex sessions, keep ~/.codex/memory/*.md reusable and preference-first with the normalized memory template, and refresh the memory index at the end of ~/.codex/AGENTS.md."
@@ -0,0 +1,21 @@
1
+ # User Memory - [Category Name]
2
+
3
+ Last curated: [YYYY-MM-DD HH:MM TZ]
4
+
5
+ ## Scope
6
+ User preferences about [decision domain] across repositories and workflows.
7
+
8
+ ## Preferences
9
+ - Prefer [reusable choice or behavior].
10
+ - Applies when: [general condition, not a single incident].
11
+ - Avoid [reusable anti-pattern].
12
+ - Applies when: [general condition].
13
+
14
+ ## Maintenance
15
+ - Keep entries preference-heavy and reusable across projects.
16
+ - Remove or rewrite project names, issue numbers, branch names, and niche module details unless they are necessary to explain the preference.
17
+ - Split the file when it starts mixing unrelated decision domains.
18
+ - Replace stale or conflicting entries instead of keeping both.
19
+
20
+ ## Evidence notes
21
+ - [YYYY-MM-DD through YYYY-MM-DD concise summary of the repeated conversation evidence that justified the preference.]
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env python3
2
+ """Tests for the codex-memory-manager memory template reference."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import unittest
7
+ from pathlib import Path
8
+
9
+
10
+ TEMPLATE_PATH = (
11
+ Path(__file__).resolve().parents[1]
12
+ / "references"
13
+ / "templates"
14
+ / "memory-file.md"
15
+ )
16
+
17
+
18
+ class MemoryTemplateTests(unittest.TestCase):
19
+ def test_template_contains_required_sections(self) -> None:
20
+ content = TEMPLATE_PATH.read_text(encoding="utf-8")
21
+
22
+ self.assertIn("# User Memory - [Category Name]", content)
23
+ self.assertIn("## Scope", content)
24
+ self.assertIn("## Preferences", content)
25
+ self.assertIn("## Maintenance", content)
26
+ self.assertIn("## Evidence notes", content)
27
+
28
+ def test_template_enforces_preference_first_generalization_rules(self) -> None:
29
+ content = TEMPLATE_PATH.read_text(encoding="utf-8")
30
+
31
+ self.assertIn("preference-heavy and reusable across projects", content)
32
+ self.assertIn("Remove or rewrite project names, issue numbers, branch names", content)
33
+ self.assertIn("Split the file when it starts mixing unrelated decision domains", content)
34
+
35
+
36
+ if __name__ == "__main__":
37
+ unittest.main()
package/lib/cli.js CHANGED
@@ -17,6 +17,7 @@ const TARGET_OPTIONS = [
17
17
  { id: 'codex', label: 'Codex', description: '~/.codex/skills' },
18
18
  { id: 'openclaw', label: 'OpenClaw', description: '~/.openclaw/workspace*/skills' },
19
19
  { id: 'trae', label: 'Trae', description: '~/.trae/skills' },
20
+ { id: 'claude-code', label: 'Claude Code', description: '~/.claude/skills' },
20
21
  ];
21
22
 
22
23
  const WORDMARK_LINES = [
@@ -56,7 +57,7 @@ function buildBanner({ version, colorEnabled }) {
56
57
  return [
57
58
  buildWordmark({ colorEnabled }),
58
59
  color('Apollo Toolkit', '1', colorEnabled),
59
- color('Install curated skills for Codex, OpenClaw, and Trae', '2', colorEnabled),
60
+ color('Install curated skills for Codex, OpenClaw, Trae, and Claude Code', '2', colorEnabled),
60
61
  color(`Version ${version}`, '1;33', colorEnabled),
61
62
  ].join('\n');
62
63
  }
@@ -90,6 +91,7 @@ function buildWelcomeScreen({ version, colorEnabled, stage = 4 }) {
90
91
  ` ${color('Codex', '1', colorEnabled)} ~/.codex/skills`,
91
92
  ` ${color('OpenClaw', '1', colorEnabled)} ~/.openclaw/workspace*/skills`,
92
93
  ` ${color('Trae', '1', colorEnabled)} ~/.trae/skills`,
94
+ ` ${color('Claude Code', '1', colorEnabled)} ~/.claude/skills`,
93
95
  );
94
96
  }
95
97
 
@@ -118,8 +120,8 @@ function buildHelpText({ version, colorEnabled }) {
118
120
  buildBanner({ version, colorEnabled }),
119
121
  '',
120
122
  'Usage:',
121
- ' apltk [install] [codex|openclaw|trae|all]...',
122
- ' apollo-toolkit [install] [codex|openclaw|trae|all]...',
123
+ ' apltk [install] [codex|openclaw|trae|claude-code|all]...',
124
+ ' apollo-toolkit [install] [codex|openclaw|trae|claude-code|all]...',
123
125
  ' apltk --help',
124
126
  ' apollo-toolkit --help',
125
127
  '',
@@ -129,6 +131,7 @@ function buildHelpText({ version, colorEnabled }) {
129
131
  ' npx @laitszkin/apollo-toolkit',
130
132
  ' npx @laitszkin/apollo-toolkit codex openclaw',
131
133
  ' npm i -g @laitszkin/apollo-toolkit',
134
+ ' apltk claude-code',
132
135
  ' apltk all',
133
136
  ' apollo-toolkit all',
134
137
  '',
@@ -212,7 +215,7 @@ function renderSelectionScreen({ output, version, cursor, selected, message, env
212
215
 
213
216
  async function promptForModes({ stdin, stdout, version, env }) {
214
217
  if (!stdin.isTTY || !stdout.isTTY) {
215
- throw new Error('Interactive install requires a TTY. Re-run with targets like `codex`, `openclaw`, `trae`, or `all`.');
218
+ throw new Error('Interactive install requires a TTY. Re-run with targets like `codex`, `openclaw`, `trae`, `claude-code`, or `all`.');
216
219
  }
217
220
 
218
221
  await animateWelcomeScreen({ output: stdout, version, env });
@@ -401,6 +404,7 @@ async function run(argv, context = {}) {
401
404
  sourceRoot,
402
405
  toolkitHome,
403
406
  version: packageJson.version,
407
+ modes,
404
408
  });
405
409
 
406
410
  const installResult = await installLinks({
package/lib/installer.js CHANGED
@@ -107,14 +107,28 @@ function shouldCopyEntry(sourceRoot, entry) {
107
107
  return fs.existsSync(path.join(sourceRoot, entry.name, 'SKILL.md'));
108
108
  }
109
109
 
110
- async function stageToolkitContents({ sourceRoot, destinationRoot, version }) {
110
+ function shouldCopyCodexContainer({ sourceRoot, entry, modes = [] }) {
111
+ if (entry.name !== 'codex' || !entry.isDirectory() || !modes.includes('codex')) {
112
+ return false;
113
+ }
114
+
115
+ const codexDir = path.join(sourceRoot, entry.name);
116
+ if (!fs.existsSync(codexDir)) {
117
+ return false;
118
+ }
119
+
120
+ const childNames = fs.readdirSync(codexDir);
121
+ return childNames.some((childName) => fs.existsSync(path.join(codexDir, childName, 'SKILL.md')));
122
+ }
123
+
124
+ async function stageToolkitContents({ sourceRoot, destinationRoot, version, modes = [] }) {
111
125
  const entries = await fsp.readdir(sourceRoot, { withFileTypes: true });
112
126
  const copiedEntries = [];
113
127
 
114
128
  await fsp.mkdir(destinationRoot, { recursive: true });
115
129
 
116
130
  for (const entry of entries) {
117
- if (!shouldCopyEntry(sourceRoot, entry)) {
131
+ if (!shouldCopyEntry(sourceRoot, entry) && !shouldCopyCodexContainer({ sourceRoot, entry, modes })) {
118
132
  continue;
119
133
  }
120
134
 
@@ -144,7 +158,7 @@ async function syncToolkitHome({ sourceRoot, toolkitHome, version, modes = [] })
144
158
  const previousSkillNames = await listSkillNames(toolkitHome, modes).catch(() => []);
145
159
 
146
160
  await fsp.rm(tempDir, { recursive: true, force: true });
147
- await stageToolkitContents({ sourceRoot, destinationRoot: tempDir, version });
161
+ await stageToolkitContents({ sourceRoot, destinationRoot: tempDir, version, modes });
148
162
 
149
163
  const stat = await fsp.lstat(toolkitHome).catch(() => null);
150
164
  if (stat && !stat.isDirectory()) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@laitszkin/apollo-toolkit",
3
- "version": "2.13.0",
3
+ "version": "2.13.2",
4
4
  "description": "Apollo Toolkit npm installer for managed skill copying across Codex, OpenClaw, and Trae.",
5
5
  "license": "MIT",
6
6
  "author": "LaiTszKin",