feat(skills): add QoderWork skill host#117
Conversation
Publish oo-managed skills into QoderWork's ~/.qoderwork/skills directory so users can reuse the bundled skill templates there. The QoderWork templates mirror the Claude-compatible skills while omitting the allowed-tools frontmatter that QoderWork does not support. Signed-off-by: Kevin Cui <bh@bugs.cc> # Conflicts: # src/application/commands/skills/embedded-assets.test.ts
Summary by CodeRabbitRelease Notes
WalkthroughThis PR adds support for QoderWork as a new bundled skill agent in the oo CLI. It introduces three main skills for QoderWork ( Possibly related PRs
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches✨ Simplify code
Review rate limit: 4/5 reviews remaining, refill in 12 minutes. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (8)
contrib/skills/qoderwork/oo/references/task-lifecycle.md (1)
3-3: Use consistent task identifier casing in prose.Prefer
taskIdhere to match the rest of the document and command examples.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@contrib/skills/qoderwork/oo/references/task-lifecycle.md` at line 3, Change the prose to use consistent camelCase task identifier naming: replace the occurrence of "taskID" in the sentence "Read this file only after `oo cloud-task run` returns a `taskID`." with "taskId" so it matches the rest of the document and command examples (look for the phrase containing `oo cloud-task run` and update the identifier token to `taskId`).src/application/commands/skills/check.test.ts (1)
77-109: Add a local preflight test factory to remove repeated setup.This test duplicates sandbox/store/canonical-root setup and assertions from the existing success-path test. A small helper (parameterized by agent/home resolver) would keep this file easier to maintain.
As per coding guidelines: "Extract repeated setup (mocks, stubs, setup objects) into local factory functions in test files; avoid copy-pasting test setup".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/application/commands/skills/check.test.ts` around lines 77 - 109, Extract the repeated sandbox and store/canonical-root setup in the "checks QoderWork as a requested agent" test into a local test factory function (e.g., createPreflightSandbox or buildPreflightTestContext) that accepts the agent name/home resolver (resolveQoderWorkHomeDirectory) and returns the prepared sandbox, canonicalRootDirectoryPath, and a cleanup function; refactor the test to call this factory instead of repeating createCliSandbox, resolveStorePaths, resolveLocalSkillCanonicalRootDirectoryPath, mkdir, and the post-run assertions (assert exitCode/stderr/stdout and readdir check), keeping sandbox.run(["skills","preflight","--agent", agent]) usage and ensuring the factory handles mkdir(sandboxHome, { recursive: true }) and sandbox.cleanup().src/application/commands/skills/list.ts (1)
29-34: Unify host order and host label mapping into one config object.
managedSkillHostOrderandreadManagedSkillHostLabelduplicate the same key set. Consider a singlemanagedSkillHostConfigsource to avoid drift when adding hosts.♻️ Proposed refactor
-const managedSkillHostOrder = { - codex: 0, - claude: 1, - openclaw: 2, - qoderwork: 3, -} as const satisfies Record<BundledSkillAgentName, number>; +const managedSkillHostConfig = { + codex: { order: 0, labelKey: "skills.list.host.codex" }, + claude: { order: 1, labelKey: "skills.list.host.claude" }, + openclaw: { order: 2, labelKey: "skills.list.host.openclaw" }, + qoderwork: { order: 3, labelKey: "skills.list.host.qoderwork" }, +} as const satisfies Record< + BundledSkillAgentName, + { order: number; labelKey: "skills.list.host.codex" | "skills.list.host.claude" | "skills.list.host.openclaw" | "skills.list.host.qoderwork" } +>; @@ function readManagedSkillHostLabel( hostName: BundledSkillAgentName, context: Pick<CliExecutionContext, "translator">, ): string { - switch (hostName) { - case "claude": - return context.translator.t("skills.list.host.claude"); - case "codex": - return context.translator.t("skills.list.host.codex"); - case "openclaw": - return context.translator.t("skills.list.host.openclaw"); - case "qoderwork": - return context.translator.t("skills.list.host.qoderwork"); - default: - return hostName satisfies never; - } + return context.translator.t(managedSkillHostConfig[hostName].labelKey); } @@ - const hostOrderDifference - = managedSkillHostOrder[left.hostName] - managedSkillHostOrder[right.hostName]; + const hostOrderDifference + = managedSkillHostConfig[left.hostName].order - managedSkillHostConfig[right.hostName].order;As per coding guidelines: "Consolidate multiple switch/map structures that share the same keys into a single configuration object (data-driven over parallel mappings)".
Also applies to: 317-332
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/application/commands/skills/list.ts` around lines 29 - 34, Replace the parallel mappings managedSkillHostOrder and readManagedSkillHostLabel with a single data-driven config object (e.g. managedSkillHostConfig) that maps each BundledSkillAgentName to its order and label, then update all consumers (including the readManagedSkillHostLabel function and any code paths referenced near the other similar block) to read order and label from managedSkillHostConfig; ensure the new config is typed to satisfy Record<BundledSkillAgentName, { order: number; label: string }> (or equivalent) so additions of new hosts only require a single edit.src/application/commands/skills/bundled-skill-observation.test.ts (1)
166-190: Coverage is good; extract repeated host-home assertions into a helper.This new test repeats the same create/expect/mkdir/re-expect/cleanup structure already used for other hosts. A local helper would reduce copy-paste and keep future host additions simpler.
As per coding guidelines: "Extract repeated setup (mocks, stubs, setup objects) into local factory functions in test files; avoid copy-pasting test setup".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/application/commands/skills/bundled-skill-observation.test.ts` around lines 166 - 190, The test duplicates a create/expect/mkdir/re-expect/cleanup pattern for verifying resolved host home directories; refactor by extracting a local helper (e.g., assertRequiresResolvedHome or withTemporaryResolvedHome) inside the test file that accepts the host key ("qoderwork") and performs: createTemporaryDirectory, build env with HOME, call requireBundledSkillHomeDirectory and assert rejection with exitCode/key, create the actual host directory with mkdir, assert the successful resolved path equals the created directory, then cleanup with rm; replace the repeated block in this test (and other similar tests) with calls to that helper to remove duplication and centralize setup/teardown while still using requireBundledSkillHomeDirectory, createTemporaryDirectory, mkdir, and rm.src/application/commands/skills/embedded-assets.test.ts (1)
176-183: Deduplicate SKILL.md lookup/guard into a local helper.Lines 176-183 repeat the same lookup + missing-file guard used earlier in this file. A helper keeps failure messaging and file selection logic consistent across tests.
As per coding guidelines: "`**/*.test.{ts,tsx}`: Extract repeated setup (mocks, stubs, setup objects) into local factory functions in test files; avoid copy-pasting test setup".♻️ Suggested refactor
+function requireBundledSkillMarkdownSourcePath( + skillName: (typeof availableBundledSkillNames)[number], + agentName: (typeof availableBundledSkillAgentNames)[number], +): string { + const skillFile = getBundledSkillFiles(skillName, agentName) + .find(file => file.relativePath === "SKILL.md"); + if (skillFile === undefined) { + throw new Error(`Missing ${agentName} SKILL.md for ${skillName}`); + } + return skillFile.sourcePath; +}Then reuse it in both tests instead of repeating
.find(...)+ guard blocks.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/application/commands/skills/embedded-assets.test.ts` around lines 176 - 183, Create a local helper function in this test file (e.g., findBundledSkillFile or getBundledSkillSkillMd) that encapsulates the repeated logic using availableBundledSkillNames and getBundledSkillFiles to locate the "SKILL.md" for a given skill and throw the same Error message when missing; then replace the duplicate `.find(...)` + guard blocks in both tests (including the "keeps QoderWork skill frontmatter free of Claude allowed tools" test) with calls to that helper so file selection and missing-file messaging are consistent.src/application/commands/skills/list.cli.test.ts (1)
124-165: Extract host-specific startup-sync test flow into a shared helper.Lines 124-165 duplicate the same flow already used by the OpenClaw case (setup → install → list → assert formatted block). Moving this to a local helper will reduce drift when output format or bundled skill set changes.
As per coding guidelines: "`**/*.test.{ts,tsx}`: Extract repeated setup (mocks, stubs, setup objects) into local factory functions in test files; avoid copy-pasting test setup".♻️ Suggested refactor
+async function expectStartupSynchronizedBundledInstalls(params: { + resolveHomeDirectory: (env: Record<string, string | undefined>) => string; + hostLabel: "OpenClaw" | "QoderWork"; +}): Promise<void> { + const sandbox = await createCliSandbox(); + const homeDirectory = params.resolveHomeDirectory(sandbox.env); + try { + await mkdir(homeDirectory, { recursive: true }); + await sandbox.run(["skills", "install", "oo"], { version: "9.9.9" }); + const result = await sandbox.run(["skills", "list"], { version: "9.9.9" }); + expect(result.exitCode).toBe(0); + expect(result.stderr).toBe(""); + expect(result.stdout).toBe([ + "✓ Found 3 oo-managed skills.", + "", + "oo", + ` Host: ${params.hostLabel}`, + " Source: bundled", + " Version: 9.9.9", + "", + "oo-find-skills", + ` Host: ${params.hostLabel}`, + " Source: bundled", + " Version: 9.9.9", + "", + "oo-create-skill", + ` Host: ${params.hostLabel}`, + " Source: bundled", + " Version: 9.9.9", + "", + ].join("\n")); + } + finally { + await sandbox.cleanup(); + } +}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/application/commands/skills/list.cli.test.ts` around lines 124 - 165, Extract the duplicated test flow into a local helper (e.g., runStartupSyncedSkillsCheck) that accepts the home-directory resolver (resolveQoderWorkHomeDirectory / resolveOpenClawHomeDirectory), the installed skill id(s) and expected version, and the expected formatted lines; inside the helper create the sandbox with createCliSandbox(), create the host home dir via mkdir(resolver(sandbox.env), { recursive: true }), perform sandbox.run(["skills","install", id], { version }), call sandbox.run(["skills","list"], { version }) and assert exitCode/stderr/stdout, then cleanup; replace the duplicated body in the test named "lists startup-synchronized QoderWork bundled installs when Codex is not installed" (and the OpenClaw test) with a single call to this helper to avoid copy-paste.src/application/commands/skills/index.test.ts (1)
1130-1214: Consider a host-matrix helper to reduce update drift in this test.Line 1130–Line 1214 now maintain QoderWork across multiple parallel structures (mkdir list, stdout expectations, realpath checks, and content loop). A local host matrix factory would make future host additions safer and shorter.
As per coding guidelines, "Extract repeated setup (mocks, stubs, setup objects) into local factory functions in test files; avoid copy-pasting test setup".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/application/commands/skills/index.test.ts` around lines 1130 - 1214, Extract the repeated host list into a local "host matrix" factory in the test (e.g., createHostsMatrix() or hosts = getHosts(sandbox.env)) that returns an array of host objects containing homeDirectory, skillDirectoryPath, and a flag for whether the install should be a symlink to canonical (true/false); then replace the mkdir(...) array, the stdout expectation lines, the realpath assertions, the isSymbolicLink() check, and the final content loop to iterate over that hosts array so every operation is driven from the single source of truth (use the existing symbols codexHomeDirectory, claudeHomeDirectory, openClawHomeDirectory, qoderWorkHomeDirectory, canonicalSkillDirectoryPath, and qoderWorkSkillDirectoryPath to construct the host objects).contrib/skills/qoderwork/oo-find-skills/SKILL.md (1)
95-97: Optional: normalize numbering style inside each step section.Using local numbering/bullets per subsection (instead of continuing at 6/7/8/9...) would make the workflow easier to scan and maintain.
Also applies to: 100-104, 151-158
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@contrib/skills/qoderwork/oo-find-skills/SKILL.md` around lines 95 - 97, Normalize the numbered lists so each subsection uses local numbering/bullets instead of continuing the global count: update the steps that currently read "6. Rank the installable JSON items..." and "7. Pick one primary skill..." and any other multi-step subsections (the blocks called out around the later sections) to start their own 1., 2., 3. or use bullets within that subsection, keeping numbering local and consistent for readability; adjust adjacent text so references to step numbers inside that subsection are updated to the new local numbering scheme.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@contrib/skills/qoderwork/oo-find-skills/references/oo-cli-contract.md`:
- Line 47: Update the wording of the sentence "Bundled skill names can be
installed directly by package name." to correctly state that bundled skills are
installed by bundled skill name (e.g., change to something like "Bundled skill
names can be installed directly by their skill name (for example, `oo skills
install oo`)") so the doc reflects that installs use the bundled skill name
rather than a package name; modify the line containing that sentence and ensure
the example `oo skills install oo` is present and consistent.
In `@contrib/skills/qoderwork/oo/SKILL.md`:
- Line 74: Replace the unhyphenated compound modifier "browse style" with the
hyphenated form "browse-style" in SKILL.md where the guideline reads "Expand
evidence gradually. For list, inbox, or browse style steps, start"; update that
phrase (refer to the line containing "Expand evidence gradually" / "list, inbox,
or browse style steps") so the compound adjective is hyphenated for readability.
In `@docs/commands.md`:
- Around line 449-450: Update the grammar in the "no-host" note sentence so the
plural subject agrees with the verb: change the phrase "when none of the
supported Codex, Claude Code, OpenClaw, or QoderWork home directories exists" to
use "exist" instead of "exists" (i.e., "...home directories exist").
---
Nitpick comments:
In `@contrib/skills/qoderwork/oo-find-skills/SKILL.md`:
- Around line 95-97: Normalize the numbered lists so each subsection uses local
numbering/bullets instead of continuing the global count: update the steps that
currently read "6. Rank the installable JSON items..." and "7. Pick one primary
skill..." and any other multi-step subsections (the blocks called out around the
later sections) to start their own 1., 2., 3. or use bullets within that
subsection, keeping numbering local and consistent for readability; adjust
adjacent text so references to step numbers inside that subsection are updated
to the new local numbering scheme.
In `@contrib/skills/qoderwork/oo/references/task-lifecycle.md`:
- Line 3: Change the prose to use consistent camelCase task identifier naming:
replace the occurrence of "taskID" in the sentence "Read this file only after
`oo cloud-task run` returns a `taskID`." with "taskId" so it matches the rest of
the document and command examples (look for the phrase containing `oo cloud-task
run` and update the identifier token to `taskId`).
In `@src/application/commands/skills/bundled-skill-observation.test.ts`:
- Around line 166-190: The test duplicates a
create/expect/mkdir/re-expect/cleanup pattern for verifying resolved host home
directories; refactor by extracting a local helper (e.g.,
assertRequiresResolvedHome or withTemporaryResolvedHome) inside the test file
that accepts the host key ("qoderwork") and performs: createTemporaryDirectory,
build env with HOME, call requireBundledSkillHomeDirectory and assert rejection
with exitCode/key, create the actual host directory with mkdir, assert the
successful resolved path equals the created directory, then cleanup with rm;
replace the repeated block in this test (and other similar tests) with calls to
that helper to remove duplication and centralize setup/teardown while still
using requireBundledSkillHomeDirectory, createTemporaryDirectory, mkdir, and rm.
In `@src/application/commands/skills/check.test.ts`:
- Around line 77-109: Extract the repeated sandbox and store/canonical-root
setup in the "checks QoderWork as a requested agent" test into a local test
factory function (e.g., createPreflightSandbox or buildPreflightTestContext)
that accepts the agent name/home resolver (resolveQoderWorkHomeDirectory) and
returns the prepared sandbox, canonicalRootDirectoryPath, and a cleanup
function; refactor the test to call this factory instead of repeating
createCliSandbox, resolveStorePaths,
resolveLocalSkillCanonicalRootDirectoryPath, mkdir, and the post-run assertions
(assert exitCode/stderr/stdout and readdir check), keeping
sandbox.run(["skills","preflight","--agent", agent]) usage and ensuring the
factory handles mkdir(sandboxHome, { recursive: true }) and sandbox.cleanup().
In `@src/application/commands/skills/embedded-assets.test.ts`:
- Around line 176-183: Create a local helper function in this test file (e.g.,
findBundledSkillFile or getBundledSkillSkillMd) that encapsulates the repeated
logic using availableBundledSkillNames and getBundledSkillFiles to locate the
"SKILL.md" for a given skill and throw the same Error message when missing; then
replace the duplicate `.find(...)` + guard blocks in both tests (including the
"keeps QoderWork skill frontmatter free of Claude allowed tools" test) with
calls to that helper so file selection and missing-file messaging are
consistent.
In `@src/application/commands/skills/index.test.ts`:
- Around line 1130-1214: Extract the repeated host list into a local "host
matrix" factory in the test (e.g., createHostsMatrix() or hosts =
getHosts(sandbox.env)) that returns an array of host objects containing
homeDirectory, skillDirectoryPath, and a flag for whether the install should be
a symlink to canonical (true/false); then replace the mkdir(...) array, the
stdout expectation lines, the realpath assertions, the isSymbolicLink() check,
and the final content loop to iterate over that hosts array so every operation
is driven from the single source of truth (use the existing symbols
codexHomeDirectory, claudeHomeDirectory, openClawHomeDirectory,
qoderWorkHomeDirectory, canonicalSkillDirectoryPath, and
qoderWorkSkillDirectoryPath to construct the host objects).
In `@src/application/commands/skills/list.cli.test.ts`:
- Around line 124-165: Extract the duplicated test flow into a local helper
(e.g., runStartupSyncedSkillsCheck) that accepts the home-directory resolver
(resolveQoderWorkHomeDirectory / resolveOpenClawHomeDirectory), the installed
skill id(s) and expected version, and the expected formatted lines; inside the
helper create the sandbox with createCliSandbox(), create the host home dir via
mkdir(resolver(sandbox.env), { recursive: true }), perform
sandbox.run(["skills","install", id], { version }), call
sandbox.run(["skills","list"], { version }) and assert exitCode/stderr/stdout,
then cleanup; replace the duplicated body in the test named "lists
startup-synchronized QoderWork bundled installs when Codex is not installed"
(and the OpenClaw test) with a single call to this helper to avoid copy-paste.
In `@src/application/commands/skills/list.ts`:
- Around line 29-34: Replace the parallel mappings managedSkillHostOrder and
readManagedSkillHostLabel with a single data-driven config object (e.g.
managedSkillHostConfig) that maps each BundledSkillAgentName to its order and
label, then update all consumers (including the readManagedSkillHostLabel
function and any code paths referenced near the other similar block) to read
order and label from managedSkillHostConfig; ensure the new config is typed to
satisfy Record<BundledSkillAgentName, { order: number; label: string }> (or
equivalent) so additions of new hosts only require a single edit.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: d0454036-a210-490b-bb8c-2a7e0d527bae
📒 Files selected for processing (24)
contrib/skills/qoderwork/oo-create-skill/SKILL.mdcontrib/skills/qoderwork/oo-find-skills/SKILL.mdcontrib/skills/qoderwork/oo-find-skills/references/oo-cli-contract.mdcontrib/skills/qoderwork/oo/SKILL.mdcontrib/skills/qoderwork/oo/references/auth-and-billing.mdcontrib/skills/qoderwork/oo/references/connector-execution.mdcontrib/skills/qoderwork/oo/references/file-transfer.mdcontrib/skills/qoderwork/oo/references/package-execution.mdcontrib/skills/qoderwork/oo/references/search-and-selection.mdcontrib/skills/qoderwork/oo/references/task-lifecycle.mddocs/commands.mddocs/commands.zh-CN.mdsrc/application/commands/skills/bundled-skill-observation.test.tssrc/application/commands/skills/bundled-skill-observation.tssrc/application/commands/skills/bundled-skill-paths.tssrc/application/commands/skills/check.test.tssrc/application/commands/skills/check.tssrc/application/commands/skills/embedded-assets.test.tssrc/application/commands/skills/embedded-assets.tssrc/application/commands/skills/index.test.tssrc/application/commands/skills/list.cli.test.tssrc/application/commands/skills/list.tssrc/application/commands/skills/managed-skill-host-errors.tssrc/i18n/catalog.ts
|
|
||
| Facts: | ||
|
|
||
| - Bundled skill names can be installed directly by package name. |
There was a problem hiding this comment.
Fix bundled install wording (skill name vs package name).
Line 47 is misleading: bundled installs are by bundled skill name, not package name (for example, oo skills install oo).
Suggested doc fix
-- Bundled skill names can be installed directly by package name.
+- Bundled skills are installed directly by bundled skill name (for example, `oo skills install oo`).📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - Bundled skill names can be installed directly by package name. | |
| - Bundled skills are installed directly by bundled skill name (for example, `oo skills install oo`). |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@contrib/skills/qoderwork/oo-find-skills/references/oo-cli-contract.md` at
line 47, Update the wording of the sentence "Bundled skill names can be
installed directly by package name." to correctly state that bundled skills are
installed by bundled skill name (e.g., change to something like "Bundled skill
names can be installed directly by their skill name (for example, `oo skills
install oo`)") so the doc reflects that installs use the bundled skill name
rather than a package name; modify the line containing that sentence and ensure
the example `oo skills install oo` is present and consistent.
| concrete user values over defaults, samples, and placeholders. Reuse a | ||
| user-provided remote URL when it already satisfies the input. Ask one | ||
| focused follow-up only when a required value is missing or risky to infer. | ||
| 6. Expand evidence gradually. For list, inbox, or browse style steps, start |
There was a problem hiding this comment.
Hyphenate compound modifier for readability.
Line 74 should use “browse-style” as a compound adjective.
Suggested wording tweak
-- 6. Expand evidence gradually. For list, inbox, or browse style steps, start
+- 6. Expand evidence gradually. For list, inbox, or browse-style steps, start📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| 6. Expand evidence gradually. For list, inbox, or browse style steps, start | |
| 6. Expand evidence gradually. For list, inbox, or browse-style steps, start |
🧰 Tools
🪛 LanguageTool
[grammar] ~74-~74: Use a hyphen to join words.
Context: ...ce gradually. For list, inbox, or browse style steps, start with the lightest ...
(QB_NEW_EN_HYPHEN)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@contrib/skills/qoderwork/oo/SKILL.md` at line 74, Replace the unhyphenated
compound modifier "browse style" with the hyphenated form "browse-style" in
SKILL.md where the guideline reads "Expand evidence gradually. For list, inbox,
or browse style steps, start"; update that phrase (refer to the line containing
"Expand evidence gradually" / "list, inbox, or browse style steps") so the
compound adjective is hyphenated for readability.
| - Notes: the command exits with an error when none of the supported Codex, | ||
| Claude Code, or OpenClaw home directories exists. | ||
| Claude Code, OpenClaw, or QoderWork home directories exists. |
There was a problem hiding this comment.
Fix grammar in the no-host note.
At Line 450, use “home directories exist” (not “exists”).
✏️ Suggested wording fix
-- Notes: the command exits with an error when none of the supported Codex,
- Claude Code, OpenClaw, or QoderWork home directories exists.
+- Notes: the command exits with an error when none of the supported Codex,
+ Claude Code, OpenClaw, or QoderWork home directories exist.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - Notes: the command exits with an error when none of the supported Codex, | |
| Claude Code, or OpenClaw home directories exists. | |
| Claude Code, OpenClaw, or QoderWork home directories exists. | |
| - Notes: the command exits with an error when none of the supported Codex, | |
| Claude Code, OpenClaw, or QoderWork home directories exist. |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/commands.md` around lines 449 - 450, Update the grammar in the "no-host"
note sentence so the plural subject agrees with the verb: change the phrase
"when none of the supported Codex, Claude Code, OpenClaw, or QoderWork home
directories exists" to use "exist" instead of "exists" (i.e., "...home
directories exist").
Publish oo-managed skills into QoderWork's ~/.qoderwork/skills directory so users can reuse the bundled skill templates there.
The QoderWork templates mirror the Claude-compatible skills while omitting the allowed-tools frontmatter that QoderWork does not support.