@laitszkin/apollo-toolkit 2.7.0 → 2.9.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.
Files changed (41) hide show
  1. package/AGENTS.md +4 -3
  2. package/CHANGELOG.md +13 -0
  3. package/README.md +5 -3
  4. package/analyse-app-logs/LICENSE +1 -1
  5. package/archive-specs/LICENSE +1 -1
  6. package/commit-and-push/LICENSE +1 -1
  7. package/develop-new-features/LICENSE +1 -1
  8. package/docs-to-voice/LICENSE +1 -1
  9. package/enhance-existing-features/LICENSE +1 -1
  10. package/feature-propose/LICENSE +1 -1
  11. package/generate-spec/LICENSE +1 -1
  12. package/learn-skill-from-conversations/LICENSE +1 -2
  13. package/lib/cli.js +4 -4
  14. package/lib/installer.js +6 -8
  15. package/novel-to-short-video/LICENSE +1 -1
  16. package/open-github-issue/LICENSE +1 -1
  17. package/open-github-issue/README.md +7 -1
  18. package/open-github-issue/SKILL.md +10 -3
  19. package/open-github-issue/scripts/open_github_issue.py +25 -0
  20. package/open-github-issue/tests/test_open_github_issue.py +49 -1
  21. package/open-source-pr-workflow/LICENSE +1 -1
  22. package/openai-text-to-image-storyboard/LICENSE +1 -1
  23. package/openclaw-configuration/SKILL.md +30 -2
  24. package/openclaw-configuration/references/best-practices.md +15 -0
  25. package/openclaw-configuration/references/config-reference-map.md +22 -0
  26. package/package.json +2 -2
  27. package/review-change-set/LICENSE +1 -1
  28. package/review-codebases/LICENSE +1 -1
  29. package/scheduled-runtime-health-check/README.md +26 -15
  30. package/scheduled-runtime-health-check/SKILL.md +70 -53
  31. package/scheduled-runtime-health-check/agents/openai.yaml +2 -2
  32. package/scripts/install_skills.ps1 +10 -17
  33. package/scripts/install_skills.sh +10 -10
  34. package/shadow-api-model-research/SKILL.md +114 -0
  35. package/shadow-api-model-research/agents/openai.yaml +4 -0
  36. package/shadow-api-model-research/references/fingerprinting-playbook.md +69 -0
  37. package/shadow-api-model-research/references/request-shape-checklist.md +44 -0
  38. package/systematic-debug/LICENSE +1 -1
  39. package/text-to-short-video/LICENSE +1 -1
  40. package/version-release/LICENSE +1 -1
  41. package/video-production/LICENSE +16 -13
package/AGENTS.md CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  - This repository is a skill catalog: each top-level skill lives in its own directory and is installable when that directory contains `SKILL.md`.
6
6
  - Typical skill layout is lightweight and consistent: `SKILL.md`, `README.md`, `LICENSE`, plus optional `agents/`, `references/`, and `scripts/`.
7
- - The npm package exposes an `apollo-toolkit` CLI that stages a managed copy under `~/.apollo-toolkit` and links each skill folder into selected target directories.
8
- - `scripts/install_skills.sh` and `scripts/install_skills.ps1` remain available for local/curl installs and mirror the managed-home linking behavior.
7
+ - The npm package exposes an `apollo-toolkit` CLI that stages a managed copy under `~/.apollo-toolkit` and copies each skill folder into selected target directories.
8
+ - `scripts/install_skills.sh` and `scripts/install_skills.ps1` remain available for local/curl installs and mirror the managed-home copy behavior.
9
9
 
10
10
  ## Core Business Flow
11
11
 
@@ -20,7 +20,7 @@ This repository enables users to install and run a curated set of reusable agent
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.
23
- - Users can install Apollo Toolkit through npm or npx and interactively choose one or more target skill directories to link.
23
+ - Users can install Apollo Toolkit through npm or npx and interactively choose one or more target skill directories to populate with copied skills.
24
24
  - Users can design and implement new features through a spec-first workflow.
25
25
  - Users can generate shared feature spec, task, and checklist planning artifacts for approval-gated workflows.
26
26
  - Users can convert text or documents into audio files with subtitle timelines.
@@ -44,6 +44,7 @@ This repository enables users to install and run a curated set of reusable agent
44
44
  - Users can process GitHub pull request review comments and resolve addressed threads.
45
45
  - Users can perform repository-wide code reviews and publish confirmed findings as GitHub issues.
46
46
  - Users can schedule a bounded project runtime window, stop it automatically, and analyze module health from captured logs.
47
+ - Users can investigate gated or shadow LLM APIs by capturing real client request shapes, replaying verified traffic patterns, and attributing the likely underlying model through black-box fingerprinting.
47
48
  - Users can build and maintain Solana programs and Rust clients using official Solana development workflows.
48
49
  - Users can add focused observability to opaque workflows through targeted logs, metrics, traces, and tests.
49
50
  - Users can build against Jupiter's official Solana swap, token, price, lending, trigger, recurring, and portfolio APIs with an evidence-based development guide.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,19 @@ All notable changes to this repository are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [v2.9.0] - 2026-03-21
8
+
9
+ ### Changed
10
+ - Update `scheduled-runtime-health-check` to run requested commands in a background terminal immediately or within a requested time window, with optional pre-run safe updates and optional post-run log findings.
11
+ - Update `open-github-issue` to require explicit BDD-style expected behavior, current behavior, and behavior-gap content for problem issues, and enforce that contract in the bundled publisher script and docs.
12
+
13
+ ## [v2.8.0] - 2026-03-21
14
+
15
+ ### Changed
16
+ - Change the npm installer and local install scripts to copy managed skill directories into selected targets instead of creating symlinks.
17
+ - Replace legacy Apollo Toolkit symlink installs with real copied skill directories during reinstall, while still removing stale skills that no longer ship in the current version.
18
+ - Normalize every repository `LICENSE` file to the MIT template owned by `LaiTszKin`.
19
+
7
20
  ## [v2.7.0] - 2026-03-20
8
21
 
9
22
  ### 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 links each skill into the targets you choose.
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.
4
4
 
5
5
  ## Included skills
6
6
 
@@ -37,6 +37,7 @@ A curated skill catalog for Codex, OpenClaw, and Trae with a managed installer t
37
37
  - review-change-set
38
38
  - review-codebases
39
39
  - scheduled-runtime-health-check
40
+ - shadow-api-model-research
40
41
  - solana-development
41
42
  - systematic-debug
42
43
  - text-to-short-video
@@ -56,8 +57,9 @@ The interactive installer:
56
57
  - shows a branded `Apollo Toolkit` terminal welcome screen with a short staged reveal
57
58
  - installs a managed copy into `~/.apollo-toolkit`
58
59
  - lets you multi-select `codex`, `openclaw`, `trae`, or `all`
59
- - creates symlinks from `~/.apollo-toolkit/<skill>` into each selected target
60
- - in the same npm/npx install flow, removes stale linked skills that existed in the previous installed version but no longer exist in the current package skill list
60
+ - copies `~/.apollo-toolkit/<skill>` into each selected target
61
+ - removes stale previously installed skill directories that existed in the previous installed version but no longer exist in the current package skill list
62
+ - replaces legacy symlink-based installs created by older Apollo Toolkit installers with real copied directories
61
63
 
62
64
  ### Global install
63
65
 
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Lai Tsz Kin
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Lai Tsz Kin
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Lai Tsz Kin
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Lai Tsz Kin
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 tszkinlai
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Lai Tsz Kin
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 tszkinlai
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Lai Tsz Kin
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Yamiyorunoshura
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
22
-
package/lib/cli.js CHANGED
@@ -67,8 +67,8 @@ function buildWelcomeScreen({ version, colorEnabled, stage = 4 }) {
67
67
  '',
68
68
  'This setup will configure:',
69
69
  ` ${color('*', '1;33', colorEnabled)} A managed Apollo Toolkit home in ${color('~/.apollo-toolkit', '1', colorEnabled)}`,
70
- ` ${color('*', '1;33', colorEnabled)} Symlinked skill folders for your selected targets`,
71
- ` ${color('*', '1;33', colorEnabled)} A clean install flow with target-aware linking`,
70
+ ` ${color('*', '1;33', colorEnabled)} Copied skill folders for your selected targets`,
71
+ ` ${color('*', '1;33', colorEnabled)} A clean install flow with target-aware replacement`,
72
72
  );
73
73
  }
74
74
 
@@ -178,7 +178,7 @@ function renderSelectionScreen({ output, version, cursor, selected, message, env
178
178
 
179
179
  clearScreen(output);
180
180
  output.write(`${buildBanner({ version, colorEnabled })}\n\n`);
181
- output.write('Choose where Apollo Toolkit should create symlinked skills.\n');
181
+ output.write('Choose where Apollo Toolkit should copy managed skills.\n');
182
182
  output.write(`${color('Use Up/Down', '1;33', colorEnabled)} (or ${color('j/k', '1;33', colorEnabled)}) to move, ${color('Space', '1;33', colorEnabled)} to toggle, ${color('Enter', '1;33', colorEnabled)} to continue.\n`);
183
183
  output.write(`Press ${color('a', '1;33', colorEnabled)} to toggle all, ${color('q', '1;33', colorEnabled)} to cancel.\n\n`);
184
184
 
@@ -329,7 +329,7 @@ function printSummary({ stdout, version, toolkitHome, modes, installResult, env
329
329
  stdout.write(color('Installation complete.', '1;32', colorEnabled));
330
330
  stdout.write('\n');
331
331
  stdout.write(`Apollo Toolkit home: ${toolkitHome}\n`);
332
- stdout.write(`Linked skills: ${installResult.skillNames.length}\n`);
332
+ stdout.write(`Installed skills: ${installResult.skillNames.length}\n`);
333
333
  stdout.write(`Targets: ${modes.join(', ')}\n\n`);
334
334
 
335
335
  for (const target of installResult.targets) {
package/lib/installer.js CHANGED
@@ -185,18 +185,16 @@ async function ensureDirectory(dirPath) {
185
185
  await fsp.mkdir(dirPath, { recursive: true });
186
186
  }
187
187
 
188
- async function replaceWithSymlink(sourcePath, targetPath) {
188
+ async function replaceWithCopy(sourcePath, targetPath) {
189
189
  await fsp.rm(targetPath, { recursive: true, force: true });
190
190
  await ensureDirectory(path.dirname(targetPath));
191
-
192
- const type = process.platform === 'win32' ? 'junction' : 'dir';
193
- await fsp.symlink(sourcePath, targetPath, type);
191
+ await fsp.cp(sourcePath, targetPath, { recursive: true, force: true });
194
192
  }
195
193
 
196
194
  async function installLinks({ toolkitHome, modes, env = process.env, previousSkillNames = [] }) {
197
195
  const skillNames = await listSkillNames(toolkitHome);
198
196
  const targets = await getTargetRoots(modes, env);
199
- const linkedPaths = [];
197
+ const copiedPaths = [];
200
198
  const staleSkillNames = previousSkillNames.filter((skillName) => !skillNames.includes(skillName));
201
199
 
202
200
  for (const target of targets) {
@@ -207,15 +205,15 @@ async function installLinks({ toolkitHome, modes, env = process.env, previousSki
207
205
  for (const skillName of skillNames) {
208
206
  const sourcePath = path.join(toolkitHome, skillName);
209
207
  const targetPath = path.join(target.root, skillName);
210
- await replaceWithSymlink(sourcePath, targetPath);
211
- linkedPaths.push({ target: target.label, path: targetPath, skillName });
208
+ await replaceWithCopy(sourcePath, targetPath);
209
+ copiedPaths.push({ target: target.label, path: targetPath, skillName });
212
210
  }
213
211
  }
214
212
 
215
213
  return {
216
214
  skillNames,
217
215
  targets,
218
- linkedPaths,
216
+ copiedPaths,
219
217
  };
220
218
  }
221
219
 
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Yamiyorunoshura
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Tsz Kin Lai
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -42,7 +42,7 @@ The bundled script can also be called directly:
42
42
  python scripts/open_github_issue.py \
43
43
  --issue-type problem \
44
44
  --title "[Log] Payment timeout spike" \
45
- --problem-description "Repeated timeout warnings escalated into request failures during the incident window." \
45
+ --problem-description $'Expected Behavior (BDD)\nGiven the payment service sees transient upstream latency\nWhen the retry path runs\nThen requests should recover without user-visible failures\n\nCurrent Behavior (BDD)\nGiven the payment service sees transient upstream latency\nWhen the retry path runs\nThen repeated timeout warnings still escalate into request failures\n\nBehavior Gap\n- Expected: retries absorb transient upstream slowness.\n- Actual: retries still end in request failures.\n- Difference/Impact: customers receive failed payment attempts during the incident window.\n\nEvidence\n- symptom: repeated timeout warnings escalated into request failures.\n- impact: payment attempts failed for end users.\n- key evidence: logs from the incident window show retries without successful recovery.' \
46
46
  --suspected-cause "payment-api/handler.py:84 retries immediately against a slow upstream with no jitter; confidence high." \
47
47
  --reproduction "Not yet reliably reproducible; more runtime evidence is required." \
48
48
  --repo owner/repo
@@ -72,6 +72,12 @@ Problem issues always include exactly three sections:
72
72
  - `Suspected Cause`
73
73
  - `Reproduction Conditions (if available)`
74
74
 
75
+ Within `Problem Description`, include:
76
+
77
+ - `Expected Behavior (BDD)`
78
+ - `Current Behavior (BDD)`
79
+ - `Behavior Gap`
80
+
75
81
  For Chinese-language repositories, use translated section titles with the same meaning.
76
82
 
77
83
  Feature proposal issues always include:
@@ -14,9 +14,9 @@ description: Publish structured GitHub issues and feature proposals with determi
14
14
 
15
15
  ## Standards
16
16
 
17
- - Evidence: Require structured issue inputs and detect repository language from the target README instead of guessing.
17
+ - Evidence: Require structured issue inputs, detect repository language from the target README instead of guessing, and for `problem` issues capture BDD-style expected vs current behavior with an explicit delta.
18
18
  - Execution: Resolve the repo, normalize the issue body, publish with strict auth order, then return the publication result.
19
- - Quality: Preserve upstream evidence, localize only the structural parts, and keep publication deterministic and reproducible.
19
+ - Quality: Preserve upstream evidence, localize only the structural parts, keep publication deterministic and reproducible, and make behavioral mismatches easy for maintainers to verify.
20
20
  - Output: Return publication mode, issue URL when created, rendered body, and any publish error in the standardized JSON contract.
21
21
 
22
22
  ## Overview
@@ -37,6 +37,7 @@ It is designed to be reusable by other skills that already know the issue title
37
37
  - Detect repository issue language from the target remote README instead of guessing.
38
38
  - Preserve upstream evidence content; only localize section headers and default fallback text.
39
39
  - Make the issue type explicit: `problem` for defects/incidents, `feature` for proposals.
40
+ - For `problem` issues, describe the expected behavior and current behavior with BDD-style `Given / When / Then`, then state the behavioral difference explicitly.
40
41
 
41
42
  ## Workflow
42
43
 
@@ -49,6 +50,11 @@ It is designed to be reusable by other skills that already know the issue title
49
50
  - `problem-description`
50
51
  - `suspected-cause`
51
52
  - `reproduction` (optional)
53
+ - Within `problem-description`, require a precise behavior diff:
54
+ - `Expected Behavior (BDD)`: `Given / When / Then` for what the program should do.
55
+ - `Current Behavior (BDD)`: `Given / When / Then` for what the program does now.
56
+ - `Behavior Gap`: a short explicit comparison of the observable difference and impact.
57
+ - Include the symptom, impact, and key evidence alongside the behavior diff; do not leave the mismatch implicit.
52
58
  - For `feature` issues, require these structured sections:
53
59
  - `proposal` (optional; defaults to title when omitted)
54
60
  - `reason`
@@ -74,7 +80,7 @@ Problem issue:
74
80
  python scripts/open_github_issue.py \
75
81
  --issue-type problem \
76
82
  --title "[Log] <short symptom>" \
77
- --problem-description "<symptom + impact + key evidence>" \
83
+ --problem-description $'Expected Behavior (BDD)\nGiven ...\nWhen ...\nThen ...\n\nCurrent Behavior (BDD)\nGiven ...\nWhen ...\nThen ...\n\nBehavior Gap\n- Expected: ...\n- Actual: ...\n- Difference/Impact: ...\n\nEvidence\n- symptom: ...\n- impact: ...\n- key evidence: ...' \
78
84
  --suspected-cause "<path:line + causal chain + confidence>" \
79
85
  --reproduction "<steps/conditions or leave empty>" \
80
86
  --repo <owner/repo>
@@ -111,6 +117,7 @@ When another skill depends on `open-github-issue`:
111
117
 
112
118
  - Pass exactly one confirmed problem or one accepted feature proposal per invocation.
113
119
  - Prepare evidence or proposal details before calling this skill; do not ask this skill to infer root cause or architecture.
120
+ - For `problem` issues, pass a `problem-description` that contains `Expected Behavior (BDD)`, `Current Behavior (BDD)`, and `Behavior Gap`; the difference must be explicit, not implied.
114
121
  - Reuse the returned `mode`, `issue_url`, and `publish_error` in the parent skill response.
115
122
  - For accepted feature proposals, pass `--issue-type feature` plus `--proposal`, `--reason`, and `--suggested-architecture`.
116
123
 
@@ -19,6 +19,18 @@ DEFAULT_REPRO_ZH = "尚未穩定重現;需補充更多執行期資料。"
19
19
  DEFAULT_REPRO_EN = "Not yet reliably reproducible; more runtime evidence is required."
20
20
  ISSUE_TYPE_PROBLEM = "problem"
21
21
  ISSUE_TYPE_FEATURE = "feature"
22
+ PROBLEM_BDD_MARKER_GROUPS = (
23
+ (
24
+ r"Expected Behavior\s*\(BDD\)",
25
+ r"Current Behavior\s*\(BDD\)",
26
+ r"Behavior Gap",
27
+ ),
28
+ (
29
+ r"預期行為\s*[((]BDD[))]",
30
+ r"(?:目前|當前)行為\s*[((]BDD[))]",
31
+ r"行為(?:落差|差異)",
32
+ ),
33
+ )
22
34
 
23
35
 
24
36
  def parse_args() -> argparse.Namespace:
@@ -83,6 +95,19 @@ def validate_issue_content_args(args: argparse.Namespace) -> None:
83
95
  raise SystemExit("Problem issues require --problem-description.")
84
96
  if not (args.suspected_cause or "").strip():
85
97
  raise SystemExit("Problem issues require --suspected-cause.")
98
+ if not has_required_problem_bdd_sections(args.problem_description or ""):
99
+ raise SystemExit(
100
+ "Problem issues require --problem-description to include "
101
+ "Expected Behavior (BDD), Current Behavior (BDD), and Behavior Gap sections."
102
+ )
103
+
104
+
105
+ def has_required_problem_bdd_sections(problem_description: str) -> bool:
106
+ normalized = problem_description.strip()
107
+ return any(
108
+ all(re.search(pattern, normalized, flags=re.IGNORECASE) for pattern in marker_group)
109
+ for marker_group in PROBLEM_BDD_MARKER_GROUPS
110
+ )
86
111
 
87
112
 
88
113
  def run_command(args: list[str]) -> subprocess.CompletedProcess[str]:
@@ -121,11 +121,59 @@ class OpenGitHubIssueTests(unittest.TestCase):
121
121
  )
122
122
  )
123
123
 
124
+ def test_validate_issue_content_args_requires_problem_bdd_sections(self) -> None:
125
+ with self.assertRaises(SystemExit):
126
+ MODULE.validate_issue_content_args(
127
+ Namespace(
128
+ issue_type=MODULE.ISSUE_TYPE_PROBLEM,
129
+ reason=None,
130
+ suggested_architecture=None,
131
+ problem_description="Repeated timeout warnings escalated into request failures.",
132
+ suspected_cause="handler.py:12",
133
+ )
134
+ )
135
+
136
+ MODULE.validate_issue_content_args(
137
+ Namespace(
138
+ issue_type=MODULE.ISSUE_TYPE_PROBLEM,
139
+ reason=None,
140
+ suggested_architecture=None,
141
+ problem_description=(
142
+ "Expected Behavior (BDD)\n"
143
+ "Given requests arrive during transient upstream latency\n"
144
+ "When the retry path runs\n"
145
+ "Then the request should recover without user-visible failure\n\n"
146
+ "Current Behavior (BDD)\n"
147
+ "Given requests arrive during transient upstream latency\n"
148
+ "When the retry path runs\n"
149
+ "Then the request still fails after immediate retries\n\n"
150
+ "Behavior Gap\n"
151
+ "- Expected: retries absorb transient slowness.\n"
152
+ "- Actual: retries amplify failures.\n"
153
+ "- Difference/Impact: users still receive errors.\n"
154
+ ),
155
+ suspected_cause="handler.py:12",
156
+ )
157
+ )
158
+
124
159
  def test_main_dry_run_returns_structured_json_without_publish_attempt(self) -> None:
125
160
  args = Namespace(
126
161
  title="[Log] sample",
127
162
  issue_type=MODULE.ISSUE_TYPE_PROBLEM,
128
- problem_description="problem",
163
+ problem_description=(
164
+ "Expected Behavior (BDD)\n"
165
+ "Given the issue is confirmed\n"
166
+ "When the issue body is rendered\n"
167
+ "Then the expected path should be explicit\n\n"
168
+ "Current Behavior (BDD)\n"
169
+ "Given the issue is confirmed\n"
170
+ "When the issue body is rendered\n"
171
+ "Then the current path should be explicit\n\n"
172
+ "Behavior Gap\n"
173
+ "- Expected: clear behavior diff.\n"
174
+ "- Actual: sample payload for dry run.\n"
175
+ "- Difference/Impact: contract stays structured.\n"
176
+ ),
129
177
  suspected_cause="handler.py:12",
130
178
  reproduction=None,
131
179
  proposal=None,
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 LTKSunny
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 tszkinlai
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -9,6 +9,7 @@ description: Build, audit, and explain OpenClaw configuration from official docu
9
9
 
10
10
  - Required: none.
11
11
  - Conditional: `answering-questions-with-research` when a request depends on newer OpenClaw docs than the bundled references cover.
12
+ - Conditional: `commit-and-push` when the user explicitly wants OpenClaw workspace changes committed and pushed after validation.
12
13
  - Optional: none.
13
14
  - Fallback: If the local CLI is unavailable, work from the bundled references and clearly mark any runtime behavior that was not verified on the machine.
14
15
 
@@ -33,6 +34,8 @@ Decide whether the user needs:
33
34
  - a new starter config
34
35
  - a targeted key update
35
36
  - skills loading or per-skill env setup
37
+ - workspace persona or memory customization under `~/.openclaw/workspace`
38
+ - browser, exec, or sandbox permission changes
36
39
  - secrets or provider wiring
37
40
  - validation or repair of a broken config
38
41
 
@@ -55,7 +58,9 @@ Assume the canonical config file is `~/.openclaw/openclaw.json` unless the envir
55
58
 
56
59
  - Prefer `openclaw config set` for one-path edits.
57
60
  - Prefer SecretRefs or env substitution over plaintext credentials.
58
- - For skill-specific setup, use `skills.load.extraDirs`, `skills.entries.<skillKey>`, and per-skill `env` or `apiKey`.
61
+ - For skill-specific setup, prefer the workspace convention `~/.openclaw/workspace/skills`, then wire it through `skills.load.extraDirs`, `skills.entries.<skillKey>`, and per-skill `env` or `apiKey`.
62
+ - When the user is customizing the assistant persona or standing instructions, inspect and edit the matching workspace files such as `AGENTS.md`, `TOOLS.md`, `SOUL.md`, `USER.md`, and `memory/*.md` instead of stuffing everything into `openclaw.json`.
63
+ - When enabling automation or browser workflows, verify the actual permission path for `browser`, `exec`, and sandbox behavior rather than assuming the profile already grants them.
59
64
  - Do not invent unknown root keys; OpenClaw rejects schema-invalid config.
60
65
 
61
66
  ### 5. Validate before finishing
@@ -87,7 +92,30 @@ Summarize the relevant branch and point back to the matching official page rathe
87
92
 
88
93
  ### Configure skills
89
94
 
90
- Use `skills.load.extraDirs` for additional skill folders and `skills.entries.<skillKey>` for per-skill enablement, env vars, or `apiKey`.
95
+ Use `skills.load.extraDirs` for additional skill folders and `skills.entries.<skillKey>` for per-skill enablement, env vars, or `apiKey`. When the user asks for OpenClaw workspace-local skills, default to `~/.openclaw/workspace/skills` unless the environment proves another convention.
96
+
97
+ ### Customize workspace instructions and persona
98
+
99
+ When the request is about how the assistant should behave inside OpenClaw, inspect the workspace instruction files first and keep each edit in the narrowest home:
100
+
101
+ - `AGENTS.md` for workflow rules, completion criteria, and memory discipline
102
+ - `TOOLS.md` for tool usage instructions
103
+ - `SOUL.md` for persona or relationship framing
104
+ - `USER.md` for the user's profile and durable identity details
105
+ - `memory/*.md` for durable corrections, failures, and learned preferences
106
+
107
+ If the workspace is a git repo and the user explicitly asks to persist those changes remotely, validate first and then hand off to `commit-and-push`.
108
+
109
+ ### Verify tool permissions
110
+
111
+ When the user says "make sure OpenClaw can use this tool," confirm the exact config path and runtime status for:
112
+
113
+ - `tools.*` policy entries
114
+ - sandbox mode and workspace access
115
+ - `browser.enabled` and any browser profile settings
116
+ - any profile-level defaults that may still block the tool
117
+
118
+ Report both the config edit and the runtime verification command; do not assume that a schema-valid config means the tool is actually usable.
91
119
 
92
120
  ### Wire secrets
93
121
 
@@ -30,6 +30,7 @@ These rules are distilled from the official OpenClaw docs and adapted into a pra
30
30
 
31
31
  ## Skills rules
32
32
 
33
+ - For OpenClaw workspace-local skills, prefer `~/.openclaw/workspace/skills` as the first extra skill root unless the machine already uses a different proven convention.
33
34
  - Put extra skill roots in `skills.load.extraDirs` instead of hard-coding ad hoc discovery logic elsewhere.
34
35
  - Use `skills.entries.<skillKey>.enabled` for explicit enable or disable state.
35
36
  - Use `skills.entries.<skillKey>.env` for skill-local environment variables.
@@ -37,6 +38,20 @@ These rules are distilled from the official OpenClaw docs and adapted into a pra
37
38
  - Leave `skills.load.watch` enabled while iterating on local skills unless file-watch churn becomes a confirmed problem.
38
39
  - If you set `skills.install.nodeManager`, remember the official docs still recommend Node as the runtime for the gateway itself.
39
40
 
41
+ ## Workspace customization rules
42
+
43
+ - Do not force persona, memory, and workflow instructions into `openclaw.json` when the workspace already has dedicated files.
44
+ - Use `AGENTS.md` for task-completion and memory-management instructions.
45
+ - Use `TOOLS.md` for browser, Playwright, or wrapper command guidance.
46
+ - Use `SOUL.md` for persona framing and `USER.md` for durable user profile facts.
47
+ - When the user asks OpenClaw to remember valuable failures or corrections, store them in the workspace memory files that the current workspace already uses rather than inventing a second memory system.
48
+
49
+ ## Tool permission rules
50
+
51
+ - Treat browser and sandbox enablement as a two-part check: config policy plus runtime verification.
52
+ - After changing tool policy, verify the effective runtime state with the relevant OpenClaw command instead of trusting config shape alone.
53
+ - If a tool still fails after config edits, inspect whether profile defaults or sandbox policy override the leaf setting.
54
+
40
55
  ## Troubleshooting rules
41
56
 
42
57
  - If the gateway stops booting after a config change, assume schema breakage first and validate before changing unrelated systems.
@@ -148,6 +148,28 @@ Notes confirmed by the docs:
148
148
  - `skills.entries` keys default to the skill name
149
149
  - if a skill defines `metadata.openclaw.skillKey`, use that key instead
150
150
  - watcher-driven skill changes are picked up on the next agent turn when watching is enabled
151
+ - for workspace-scoped customization, `~/.openclaw/workspace/skills` is a practical local skill root to wire through `skills.load.extraDirs`
152
+
153
+ ## Workspace files often edited alongside config
154
+
155
+ These are not all part of the OpenClaw JSON schema, but they are common neighboring files when users ask to customize behavior:
156
+
157
+ - `~/.openclaw/workspace/AGENTS.md`
158
+ - `~/.openclaw/workspace/TOOLS.md`
159
+ - `~/.openclaw/workspace/SOUL.md`
160
+ - `~/.openclaw/workspace/USER.md`
161
+ - `~/.openclaw/workspace/memory/*.md`
162
+
163
+ Use them for persona, tool instructions, durable user profile details, and memory-management rules instead of overloading `openclaw.json`.
164
+
165
+ ## Tool and sandbox checks worth remembering
166
+
167
+ - A valid config does not prove the tool is usable at runtime.
168
+ - When enabling browser automation or sandboxed command execution, verify the effective state after editing:
169
+ - tool policy
170
+ - sandbox mode and workspace access
171
+ - browser enablement and profile selection
172
+ - Profile defaults can still block a tool even when a nearby leaf branch looks permissive, so check the effective runtime path, not only the edited key.
151
173
 
152
174
  ## Example snippets to adapt
153
175
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@laitszkin/apollo-toolkit",
3
- "version": "2.7.0",
4
- "description": "Apollo Toolkit npm installer for managed skill linking across Codex, OpenClaw, and Trae.",
3
+ "version": "2.9.0",
4
+ "description": "Apollo Toolkit npm installer for managed skill copying across Codex, OpenClaw, and Trae.",
5
5
  "license": "MIT",
6
6
  "author": "LaiTszKin",
7
7
  "homepage": "https://github.com/LaiTszKin/apollo-toolkit#readme",
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Lai Tsz Kin
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Yamiyorunoshura
3
+ Copyright (c) 2026 LaiTszKin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal