@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.
- package/AGENTS.md +4 -3
- package/CHANGELOG.md +13 -0
- package/README.md +5 -3
- package/analyse-app-logs/LICENSE +1 -1
- package/archive-specs/LICENSE +1 -1
- package/commit-and-push/LICENSE +1 -1
- package/develop-new-features/LICENSE +1 -1
- package/docs-to-voice/LICENSE +1 -1
- package/enhance-existing-features/LICENSE +1 -1
- package/feature-propose/LICENSE +1 -1
- package/generate-spec/LICENSE +1 -1
- package/learn-skill-from-conversations/LICENSE +1 -2
- package/lib/cli.js +4 -4
- package/lib/installer.js +6 -8
- package/novel-to-short-video/LICENSE +1 -1
- package/open-github-issue/LICENSE +1 -1
- package/open-github-issue/README.md +7 -1
- package/open-github-issue/SKILL.md +10 -3
- package/open-github-issue/scripts/open_github_issue.py +25 -0
- package/open-github-issue/tests/test_open_github_issue.py +49 -1
- package/open-source-pr-workflow/LICENSE +1 -1
- package/openai-text-to-image-storyboard/LICENSE +1 -1
- package/openclaw-configuration/SKILL.md +30 -2
- package/openclaw-configuration/references/best-practices.md +15 -0
- package/openclaw-configuration/references/config-reference-map.md +22 -0
- package/package.json +2 -2
- package/review-change-set/LICENSE +1 -1
- package/review-codebases/LICENSE +1 -1
- package/scheduled-runtime-health-check/README.md +26 -15
- package/scheduled-runtime-health-check/SKILL.md +70 -53
- package/scheduled-runtime-health-check/agents/openai.yaml +2 -2
- package/scripts/install_skills.ps1 +10 -17
- package/scripts/install_skills.sh +10 -10
- package/shadow-api-model-research/SKILL.md +114 -0
- package/shadow-api-model-research/agents/openai.yaml +4 -0
- package/shadow-api-model-research/references/fingerprinting-playbook.md +69 -0
- package/shadow-api-model-research/references/request-shape-checklist.md +44 -0
- package/systematic-debug/LICENSE +1 -1
- package/text-to-short-video/LICENSE +1 -1
- package/version-release/LICENSE +1 -1
- 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
|
|
8
|
-
- `scripts/install_skills.sh` and `scripts/install_skills.ps1` remain available for local/curl installs and mirror the managed-home
|
|
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
|
|
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
|
|
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
|
-
-
|
|
60
|
-
-
|
|
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
|
|
package/analyse-app-logs/LICENSE
CHANGED
package/archive-specs/LICENSE
CHANGED
package/commit-and-push/LICENSE
CHANGED
package/docs-to-voice/LICENSE
CHANGED
package/feature-propose/LICENSE
CHANGED
package/generate-spec/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2026
|
|
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)}
|
|
71
|
-
` ${color('*', '1;33', colorEnabled)} A clean install flow with target-aware
|
|
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
|
|
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(`
|
|
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
|
|
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
|
|
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
|
|
211
|
-
|
|
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
|
-
|
|
216
|
+
copiedPaths,
|
|
219
217
|
};
|
|
220
218
|
}
|
|
221
219
|
|
|
@@ -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
|
|
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
|
|
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,
|
|
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
|
|
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=
|
|
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,
|
|
@@ -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,
|
|
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.
|
|
4
|
-
"description": "Apollo Toolkit npm installer for managed skill
|
|
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",
|
package/review-codebases/LICENSE
CHANGED