sneakoscope 3.1.4 → 3.1.6
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/README.md +8 -36
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/crates/sks-core/src/main.rs +1 -1
- package/dist/.sks-build-stamp.json +4 -4
- package/dist/bin/sks.js +1 -1
- package/dist/cli/command-registry.js +1 -2
- package/dist/cli/install-helpers.js +56 -4
- package/dist/commands/codex-app.js +1 -11
- package/dist/commands/codex-lb.js +12 -9
- package/dist/commands/codex-native.js +68 -0
- package/dist/commands/doctor.js +64 -0
- package/dist/core/codex-app/codex-agent-role-sync.js +69 -11
- package/dist/core/codex-app/codex-agent-type-probe.js +202 -0
- package/dist/core/codex-app/codex-app-execution-profile.js +43 -14
- package/dist/core/codex-app/codex-app-fast-ui-repair.js +7 -4
- package/dist/core/codex-app/codex-app-harness-matrix.js +4 -65
- package/dist/core/codex-app/codex-app-types.js +21 -0
- package/dist/core/codex-app/codex-hook-approval-probe.js +188 -0
- package/dist/core/codex-app/codex-hook-lifecycle.js +34 -10
- package/dist/core/codex-app/codex-init-deep.js +154 -3
- package/dist/core/codex-app/codex-skill-sync.js +84 -9
- package/dist/core/codex-native/codex-native-capability-cache.js +21 -0
- package/dist/core/codex-native/codex-native-feature-broker.js +182 -0
- package/dist/core/codex-native/codex-native-feature-matrix.js +31 -0
- package/dist/core/codex-native/codex-native-harness-compat.js +54 -0
- package/dist/core/codex-native/codex-native-interop-policy.js +58 -0
- package/dist/core/codex-native/codex-native-invocation-router.js +112 -0
- package/dist/core/codex-native/codex-native-pattern-analysis.js +56 -0
- package/dist/core/codex-native/codex-native-reference-evidence.js +2 -0
- package/dist/core/codex-native/codex-native-reference-source.js +110 -0
- package/dist/core/codex-native/codex-native-rename-map.js +25 -0
- package/dist/core/commands/mad-sks-command.js +37 -2
- package/dist/core/commands/qa-loop-command.js +3 -2
- package/dist/core/commands/research-command.js +2 -2
- package/dist/core/doctor/doctor-zellij-repair.js +5 -1
- package/dist/core/feature-fixtures.js +3 -4
- package/dist/core/feature-registry.js +5 -2
- package/dist/core/fsx.js +1 -1
- package/dist/core/image/image-artifact-path-contract.js +18 -1
- package/dist/core/init.js +4 -1
- package/dist/core/loops/loop-continuation-enforcer.js +11 -3
- package/dist/core/loops/loop-owner-inference.js +3 -0
- package/dist/core/loops/loop-planner.js +28 -5
- package/dist/core/loops/loop-worker-runtime.js +52 -8
- package/dist/core/naruto/naruto-loop-worker-router.js +11 -2
- package/dist/core/qa-loop.js +62 -4
- package/dist/core/research/research-cycle-runner.js +1 -0
- package/dist/core/research/research-stage-runner.js +9 -2
- package/dist/core/research.js +68 -1
- package/dist/core/routes.js +2 -3
- package/dist/core/version.js +1 -1
- package/dist/core/zellij/homebrew-policy.js +0 -1
- package/dist/core/zellij/zellij-self-heal-types.js +45 -0
- package/dist/core/zellij/zellij-self-heal.js +69 -8
- package/dist/core/zellij/zellij-update.js +9 -1
- package/dist/scripts/sks-3-1-4-directive-check-lib.js +1 -30
- package/dist/scripts/sks-3-1-5-directive-check-lib.js +318 -0
- package/dist/scripts/sks-3-1-6-directive-check-lib.js +522 -0
- package/package.json +53 -9
- package/dist/cli/hermes-command.js +0 -99
- package/dist/cli/openclaw-command.js +0 -83
- package/dist/commands/hermes.js +0 -5
- package/dist/commands/openclaw.js +0 -3
- package/dist/core/codex-app/lazycodex-analysis.js +0 -51
- package/dist/core/codex-app/lazycodex-interop-policy.js +0 -49
- package/dist/core/hermes.js +0 -192
- package/dist/core/openclaw.js +0 -171
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { HERMES_SKILL_NAME, buildHermesSkillFiles, defaultHermesSkillDir, installHermesSkill } from '../core/hermes.js';
|
|
3
|
-
import { exists } from '../core/fsx.js';
|
|
4
|
-
const flag = (args, name) => args.includes(name);
|
|
5
|
-
function readFlagValue(args, name, fallback) {
|
|
6
|
-
const i = args.indexOf(name);
|
|
7
|
-
return i >= 0 && args[i + 1] ? args[i + 1] : fallback;
|
|
8
|
-
}
|
|
9
|
-
function positionalArgs(args = []) {
|
|
10
|
-
const out = [];
|
|
11
|
-
const valueFlags = new Set(['--dir']);
|
|
12
|
-
for (let i = 0; i < args.length; i++) {
|
|
13
|
-
const arg = String(args[i]);
|
|
14
|
-
if (valueFlags.has(arg)) {
|
|
15
|
-
i++;
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
if (!arg.startsWith('--'))
|
|
19
|
-
out.push(arg);
|
|
20
|
-
}
|
|
21
|
-
return out;
|
|
22
|
-
}
|
|
23
|
-
export async function hermesCommand(args = []) {
|
|
24
|
-
const action = args[0] || 'help';
|
|
25
|
-
const targetDir = readFlagValue(args, '--dir', defaultHermesSkillDir());
|
|
26
|
-
const resultOptions = {
|
|
27
|
-
targetDir,
|
|
28
|
-
force: flag(args, '--force'),
|
|
29
|
-
dryRun: flag(args, '--dry-run')
|
|
30
|
-
};
|
|
31
|
-
if (action === 'path') {
|
|
32
|
-
const result = { skill: HERMES_SKILL_NAME, target_dir: path.resolve(targetDir) };
|
|
33
|
-
if (flag(args, '--json'))
|
|
34
|
-
return console.log(JSON.stringify(result, null, 2));
|
|
35
|
-
console.log(result.target_dir);
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
if (action === 'status') {
|
|
39
|
-
const files = buildHermesSkillFiles();
|
|
40
|
-
const target = path.resolve(targetDir);
|
|
41
|
-
const installed = await exists(path.join(target, 'SKILL.md'));
|
|
42
|
-
const result = {
|
|
43
|
-
schema: 'sks.hermes-skill-status.v1',
|
|
44
|
-
ok: true,
|
|
45
|
-
skill: HERMES_SKILL_NAME,
|
|
46
|
-
target_dir: target,
|
|
47
|
-
installed,
|
|
48
|
-
expected_files: Object.keys(files),
|
|
49
|
-
env_mode: 'SKS_HERMES=1',
|
|
50
|
-
slash_command: `/${HERMES_SKILL_NAME}`
|
|
51
|
-
};
|
|
52
|
-
if (flag(args, '--json'))
|
|
53
|
-
return console.log(JSON.stringify(result, null, 2));
|
|
54
|
-
console.log(`Hermes skill: ${installed ? 'installed' : 'not installed'} ${target}`);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
if (action === 'print') {
|
|
58
|
-
const files = buildHermesSkillFiles();
|
|
59
|
-
const file = (positionalArgs(args.slice(1))[0] || 'SKILL.md');
|
|
60
|
-
if (!files[file]) {
|
|
61
|
-
console.error(`Unknown Hermes skill file: ${file}`);
|
|
62
|
-
console.error(`Files: ${Object.keys(files).join(', ')}`);
|
|
63
|
-
process.exitCode = 1;
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
console.log(files[file]);
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
if (action === 'install') {
|
|
70
|
-
const result = await installHermesSkill(resultOptions);
|
|
71
|
-
if (flag(args, '--json'))
|
|
72
|
-
return console.log(JSON.stringify(result, null, 2));
|
|
73
|
-
if (!result.ok) {
|
|
74
|
-
console.error(`Hermes skill install blocked: ${result.reason}`);
|
|
75
|
-
console.error(`Target: ${result.target_dir}`);
|
|
76
|
-
process.exitCode = 1;
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
console.log(`Hermes skill ${result.status}: ${result.target_dir}`);
|
|
80
|
-
console.log(`Use it in Hermes as /${HERMES_SKILL_NAME} and run SKS shell commands with SKS_HERMES=1.`);
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
console.log(`Hermes
|
|
84
|
-
|
|
85
|
-
Usage:
|
|
86
|
-
sks hermes install [--dir path] [--force] [--dry-run] [--json]
|
|
87
|
-
sks hermes status [--dir path] [--json]
|
|
88
|
-
sks hermes path [--dir path] [--json]
|
|
89
|
-
sks hermes print [SKILL.md|README.md|hermes-config.example.yaml|skill-bundle.example.yaml]
|
|
90
|
-
|
|
91
|
-
Default skill: ${HERMES_SKILL_NAME}
|
|
92
|
-
Default path: ${defaultHermesSkillDir()}
|
|
93
|
-
|
|
94
|
-
After install, open Hermes and invoke:
|
|
95
|
-
|
|
96
|
-
/${HERMES_SKILL_NAME} Use SKS in this repository.
|
|
97
|
-
`);
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=hermes-command.js.map
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { OPENCLAW_SKILL_NAME, buildOpenClawSkillFiles, defaultOpenClawSkillDir, installOpenClawSkill } from '../core/openclaw.js';
|
|
3
|
-
const flag = (args, name) => args.includes(name);
|
|
4
|
-
function readFlagValue(args, name, fallback) {
|
|
5
|
-
const i = args.indexOf(name);
|
|
6
|
-
return i >= 0 && args[i + 1] ? args[i + 1] : fallback;
|
|
7
|
-
}
|
|
8
|
-
function positionalArgs(args = []) {
|
|
9
|
-
const out = [];
|
|
10
|
-
const valueFlags = new Set(['--dir']);
|
|
11
|
-
for (let i = 0; i < args.length; i++) {
|
|
12
|
-
const arg = String(args[i]);
|
|
13
|
-
if (valueFlags.has(arg)) {
|
|
14
|
-
i++;
|
|
15
|
-
continue;
|
|
16
|
-
}
|
|
17
|
-
if (!arg.startsWith('--'))
|
|
18
|
-
out.push(arg);
|
|
19
|
-
}
|
|
20
|
-
return out;
|
|
21
|
-
}
|
|
22
|
-
export async function openClawCommand(args = []) {
|
|
23
|
-
const action = args[0] || 'help';
|
|
24
|
-
const targetDir = readFlagValue(args, '--dir', defaultOpenClawSkillDir());
|
|
25
|
-
const resultOptions = {
|
|
26
|
-
targetDir,
|
|
27
|
-
force: flag(args, '--force'),
|
|
28
|
-
dryRun: flag(args, '--dry-run')
|
|
29
|
-
};
|
|
30
|
-
if (action === 'path') {
|
|
31
|
-
const result = { skill: OPENCLAW_SKILL_NAME, target_dir: path.resolve(targetDir) };
|
|
32
|
-
if (flag(args, '--json'))
|
|
33
|
-
return console.log(JSON.stringify(result, null, 2));
|
|
34
|
-
console.log(result.target_dir);
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
if (action === 'print') {
|
|
38
|
-
const files = buildOpenClawSkillFiles();
|
|
39
|
-
const file = (positionalArgs(args.slice(1))[0] || 'SKILL.md');
|
|
40
|
-
if (!files[file]) {
|
|
41
|
-
console.error(`Unknown OpenClaw skill file: ${file}`);
|
|
42
|
-
console.error(`Files: ${Object.keys(files).join(', ')}`);
|
|
43
|
-
process.exitCode = 1;
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
console.log(files[file]);
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (action === 'install') {
|
|
50
|
-
const result = await installOpenClawSkill(resultOptions);
|
|
51
|
-
if (flag(args, '--json'))
|
|
52
|
-
return console.log(JSON.stringify(result, null, 2));
|
|
53
|
-
if (!result.ok) {
|
|
54
|
-
console.error(`OpenClaw skill install blocked: ${result.reason}`);
|
|
55
|
-
console.error(`Target: ${result.target_dir}`);
|
|
56
|
-
process.exitCode = 1;
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
console.log(`OpenClaw skill ${result.status}: ${result.target_dir}`);
|
|
60
|
-
console.log(`Attach it to an agent with skills: [${OPENCLAW_SKILL_NAME}] and tools: [shell].`);
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
console.log(`OpenClaw
|
|
64
|
-
|
|
65
|
-
Usage:
|
|
66
|
-
sks openclaw install [--dir path] [--force] [--dry-run] [--json]
|
|
67
|
-
sks openclaw path [--dir path] [--json]
|
|
68
|
-
sks openclaw print [SKILL.md|manifest.yaml|README.md|openclaw-agent-config.example.yaml]
|
|
69
|
-
|
|
70
|
-
Default skill: ${OPENCLAW_SKILL_NAME}
|
|
71
|
-
Default path: ${defaultOpenClawSkillDir()}
|
|
72
|
-
|
|
73
|
-
After install, add this to an OpenClaw agent config:
|
|
74
|
-
|
|
75
|
-
agents:
|
|
76
|
-
coding-agent:
|
|
77
|
-
tools:
|
|
78
|
-
- shell
|
|
79
|
-
skills:
|
|
80
|
-
- ${OPENCLAW_SKILL_NAME}
|
|
81
|
-
`);
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=openclaw-command.js.map
|
package/dist/commands/hermes.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { nowIso, writeJsonAtomic } from '../fsx.js';
|
|
4
|
-
export function buildLazyCodexPatternAnalysis() {
|
|
5
|
-
return {
|
|
6
|
-
schema: 'sks.lazycodex-pattern-analysis.v1',
|
|
7
|
-
source_repo: 'code-yeongyu/lazycodex',
|
|
8
|
-
analyzed_at: nowIso(),
|
|
9
|
-
patterns: [
|
|
10
|
-
pattern('npx-no-global-install', 'npx no-global install alias', ['Directive: npx lazycodex-ai install aliases npx --yes --package oh-my-openagent omo install --platform=codex.'], 'adapt', 'Keep optional tooling no-global by default and record repair transactions.', ['src/cli/install-helpers.ts', 'src/core/zellij/zellij-self-heal.ts']),
|
|
11
|
-
pattern('codex-marketplace-plugin', 'Codex marketplace plugin add/upgrade', ['Directive: codex plugin marketplace add and codex plugin add omo@sisyphuslabs.'], 'adapt', 'Track marketplace/plugin inventory without assuming hooks are approved.', ['src/core/codex-app/codex-app-harness-matrix.ts']),
|
|
12
|
-
pattern('startup-review-hooks', 'Startup review hook approval', ['Directive: hooks require Codex startup review approval and re-approval after modifications.'], 'adopt', 'Separate installed hook files from approval state; unknown remains unknown.', ['src/core/codex-app/codex-hook-lifecycle.ts']),
|
|
13
|
-
pattern('background-bootstrap', 'Background bootstrap and restart notice', ['Directive: first approved session performs background bootstrap and upgrade may require restart.'], 'adapt', 'Report bootstrap proof as warning/blocker instead of silently assuming completion.', ['src/core/codex-app/codex-app-harness-matrix.ts']),
|
|
14
|
-
pattern('doctor-health-report', 'Doctor health report for plugin cache/hooks/MCP/agents/config', ['Directive: LazyCodex doctor reports plugin cache, hooks, MCP servers, agents, config state.'], 'adopt', 'Add Codex App Harness section to SKS doctor.', ['src/commands/doctor.ts']),
|
|
15
|
-
pattern('dollar-skill-picker', '$ skill picker and $command invocation', ['Directive: Codex composer $ browses installed skills.'], 'adapt', 'Keep SKS route skills synced without clobbering user or LazyCodex skills.', ['src/core/codex-app/codex-skill-sync.ts']),
|
|
16
|
-
pattern('init-deep-agents', '$init-deep hierarchical AGENTS.md', ['Directive: init-deep creates hierarchical AGENTS.md context.'], 'adapt', 'Generate SKS memory under .sneakoscope/context by default and preserve user AGENTS.md.', ['src/core/codex-app/codex-init-deep.ts']),
|
|
17
|
-
pattern('plan-start-loop', '$ulw-plan, $start-work, $ulw-loop command pillars', ['Directive: separate planning, durable work, and evidence loop.'], 'adapt', 'Map onto sks loop plan/run/proof without replacing existing Loop Mesh.', ['src/core/commands/loop-command.ts']),
|
|
18
|
-
pattern('specialist-skills', 'Specialist skills', ['Directive: specialist skills include review-work, LSP, AST-grep, programming, frontend UI/UX.'], 'watch', 'Keep checker profile selection explicit and evidence-backed.', ['src/core/loops/loop-gate-selector.ts']),
|
|
19
|
-
pattern('native-agent-type', 'Native spawn_agent agent_type with message fallback', ['Directive: LazyCodex probes agent_type and falls back to role in message.'], 'adopt', 'Expose native agent_type capability in execution profile.', ['src/core/codex-app/codex-agent-role-sync.ts', 'src/core/codex-app/codex-app-execution-profile.ts']),
|
|
20
|
-
pattern('multi-model-routing', 'Multi-model routing', ['Directive: LazyCodex/OmO route multiple models.'], 'watch', 'SKS keeps provider/profile policy separate from harness matrix.', ['src/core/provider/provider-context.ts']),
|
|
21
|
-
pattern('hook-continuation', 'Hook lifecycle and continuation enforcer', ['Directive: UserPromptSubmit, PreToolUse, PostToolUse, Stop, Notification map to pipeline actions.'], 'adopt', 'Map lifecycle and add Loop continuation proof adapter.', ['src/core/codex-app/codex-hook-lifecycle.ts', 'src/core/loops/loop-continuation-enforcer.ts']),
|
|
22
|
-
pattern('skill-mcp-slashcommand', 'Skill MCP and slashcommand tool', ['Directive: OmO exposes skill MCP and slashcommand tools.'], 'adapt', 'Report MCP candidates and SKS route skill availability without assuming external plugin behavior.', ['src/core/codex-app/codex-app-harness-matrix.ts']),
|
|
23
|
-
pattern('lsp-ast-grep', 'LSP/AST-grep optional tooling', ['Directive: LSP/AST-grep are optional-but-first-class loop gates/tools.'], 'watch', 'Use as future specialist gates; do not add unrequested fallback tooling now.', ['src/core/loops/loop-gate-selector.ts'])
|
|
24
|
-
],
|
|
25
|
-
blockers: []
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
export async function writeLazyCodexPatternAnalysis(root) {
|
|
29
|
-
const report = buildLazyCodexPatternAnalysis();
|
|
30
|
-
await writeJsonAtomic(path.join(root, '.sneakoscope', 'reports', 'lazycodex-analysis.json'), report);
|
|
31
|
-
return report;
|
|
32
|
-
}
|
|
33
|
-
export function renderLazyCodexAnalysisMarkdown(report) {
|
|
34
|
-
const rows = report.patterns.map((p) => `| ${p.id} | ${p.sks_adoption} | ${p.rationale.replace(/\|/g, '\\|')} |`).join('\n');
|
|
35
|
-
return [
|
|
36
|
-
'# LazyCodex / OmO Pattern Analysis',
|
|
37
|
-
'',
|
|
38
|
-
`Source repo: \`${report.source_repo}\``,
|
|
39
|
-
`Analyzed at: \`${report.analyzed_at}\``,
|
|
40
|
-
'',
|
|
41
|
-
'| Pattern | Adoption | Rationale |',
|
|
42
|
-
'|---|---|---|',
|
|
43
|
-
rows,
|
|
44
|
-
'',
|
|
45
|
-
'This artifact is deterministic and based on the SKS 3.1.4 directive plus current SKS repository surfaces. Live LazyCodex runtime behavior remains a separate verification concern.'
|
|
46
|
-
].join('\n');
|
|
47
|
-
}
|
|
48
|
-
function pattern(id, title, evidence, sks_adoption, rationale, target_modules) {
|
|
49
|
-
return { id, title, evidence, sks_adoption, rationale, target_modules };
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=lazycodex-analysis.js.map
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
import fs from 'node:fs/promises';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import os from 'node:os';
|
|
5
|
-
import { nowIso, writeJsonAtomic } from '../fsx.js';
|
|
6
|
-
import { buildCodexPluginInventory } from '../codex-plugins/codex-plugin-json.js';
|
|
7
|
-
export async function buildLazyCodexInteropPolicy(input) {
|
|
8
|
-
const root = path.resolve(input.root);
|
|
9
|
-
const inventory = input.inventory || await buildCodexPluginInventory().catch((err) => ({ plugins: [], blockers: [err?.message || String(err)] }));
|
|
10
|
-
const codexHome = input.codexHome || process.env.CODEX_HOME || path.join(os.homedir(), '.codex');
|
|
11
|
-
const skillNames = await discoverSkillNames([path.join(root, '.agents', 'skills'), path.join(codexHome, 'skills')]);
|
|
12
|
-
const pluginIds = (inventory.plugins || []).map((plugin) => `${plugin.id || ''} ${plugin.name || ''}`.toLowerCase());
|
|
13
|
-
const lazycodexInstalled = pluginIds.some((id) => id.includes('omo') || id.includes('lazycodex'))
|
|
14
|
-
|| ['ulw-loop', 'ulw-plan', 'start-work'].some((name) => skillNames.includes(name));
|
|
15
|
-
const collisions = ['ulw-loop', 'ulw-plan', 'start-work'].filter((name) => skillNames.includes(name));
|
|
16
|
-
const report = {
|
|
17
|
-
schema: 'sks.lazycodex-interop-policy.v1',
|
|
18
|
-
generated_at: nowIso(),
|
|
19
|
-
ok: true,
|
|
20
|
-
mode: input.mode || 'coexist',
|
|
21
|
-
lazycodex_detected: lazycodexInstalled,
|
|
22
|
-
detection: {
|
|
23
|
-
plugin_inventory_ids: pluginIds,
|
|
24
|
-
skill_names: skillNames,
|
|
25
|
-
collisions
|
|
26
|
-
},
|
|
27
|
-
policy: {
|
|
28
|
-
clobber_lazycodex_skills: false,
|
|
29
|
-
clobber_user_skills: false,
|
|
30
|
-
default_mode: 'coexist',
|
|
31
|
-
explicit_handoff_required: true
|
|
32
|
-
},
|
|
33
|
-
actions: collisions.map((name) => `preserve_existing_skill:${name}`),
|
|
34
|
-
blockers: []
|
|
35
|
-
};
|
|
36
|
-
await writeJsonAtomic(path.join(root, '.sneakoscope', 'reports', 'lazycodex-interop-policy.json'), report).catch(() => undefined);
|
|
37
|
-
return report;
|
|
38
|
-
}
|
|
39
|
-
async function discoverSkillNames(roots) {
|
|
40
|
-
const names = new Set();
|
|
41
|
-
for (const root of roots) {
|
|
42
|
-
const entries = await fs.readdir(root, { withFileTypes: true }).catch(() => []);
|
|
43
|
-
for (const entry of entries)
|
|
44
|
-
if (entry.isDirectory())
|
|
45
|
-
names.add(entry.name);
|
|
46
|
-
}
|
|
47
|
-
return [...names].sort();
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=lazycodex-interop-policy.js.map
|
package/dist/core/hermes.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import { exists, readText, writeTextAtomic, PACKAGE_VERSION } from './fsx.js';
|
|
4
|
-
export const HERMES_SKILL_NAME = 'sneakoscope-codex';
|
|
5
|
-
export function defaultHermesHome(env = process.env) {
|
|
6
|
-
return path.resolve(env.HERMES_HOME || path.join(env.HOME || os.homedir(), '.hermes'));
|
|
7
|
-
}
|
|
8
|
-
export function defaultHermesSkillDir(env = process.env) {
|
|
9
|
-
return path.join(defaultHermesHome(env), 'skills', HERMES_SKILL_NAME);
|
|
10
|
-
}
|
|
11
|
-
export function buildHermesSkillFiles(options = {}) {
|
|
12
|
-
const sksCommand = options.sksCommand || 'sks';
|
|
13
|
-
const version = options.version || PACKAGE_VERSION;
|
|
14
|
-
const skillName = options.skillName || HERMES_SKILL_NAME;
|
|
15
|
-
return {
|
|
16
|
-
'SKILL.md': hermesSkillMarkdown({ sksCommand, skillName, version }),
|
|
17
|
-
'README.md': hermesSkillReadme({ sksCommand, skillName, version }),
|
|
18
|
-
'hermes-config.example.yaml': hermesConfigExample({ skillName }),
|
|
19
|
-
'skill-bundle.example.yaml': hermesSkillBundleExample({ skillName })
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
export async function installHermesSkill(options = {}) {
|
|
23
|
-
const targetDir = path.resolve(options.targetDir || defaultHermesSkillDir(options.env || process.env));
|
|
24
|
-
const files = buildHermesSkillFiles(options);
|
|
25
|
-
const existingSkill = path.join(targetDir, 'SKILL.md');
|
|
26
|
-
const existing = await exists(existingSkill);
|
|
27
|
-
if (existing && !options.force) {
|
|
28
|
-
const text = await readText(existingSkill, '');
|
|
29
|
-
if (!text.includes('generated_by: sneakoscope') && !text.includes('Generated by Sneakoscope')) {
|
|
30
|
-
return {
|
|
31
|
-
ok: false,
|
|
32
|
-
status: 'blocked_existing_skill',
|
|
33
|
-
target_dir: targetDir,
|
|
34
|
-
reason: 'Existing Hermes skill is not marked as generated by Sneakoscope. Re-run with --force to overwrite.'
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
if (options.dryRun) {
|
|
39
|
-
return { ok: true, status: existing ? 'would_update' : 'would_create', target_dir: targetDir, files: Object.keys(files) };
|
|
40
|
-
}
|
|
41
|
-
for (const [name, content] of Object.entries(files)) {
|
|
42
|
-
await writeTextAtomic(path.join(targetDir, name), content);
|
|
43
|
-
}
|
|
44
|
-
return { ok: true, status: existing ? 'updated' : 'created', target_dir: targetDir, files: Object.keys(files) };
|
|
45
|
-
}
|
|
46
|
-
function hermesSkillMarkdown({ sksCommand, skillName, version }) {
|
|
47
|
-
return `---
|
|
48
|
-
name: ${skillName}
|
|
49
|
-
description: Use Sneakoscope Codex (sks) routes, TriWiki, proof/trust, and safety gates from Hermes Agent.
|
|
50
|
-
version: ${version}
|
|
51
|
-
generated_by: sneakoscope
|
|
52
|
-
metadata:
|
|
53
|
-
hermes:
|
|
54
|
-
category: autonomous-ai-agents
|
|
55
|
-
tags: [sks, codex, coding-agent, orchestration, qa, safety]
|
|
56
|
-
requires_toolsets: [terminal]
|
|
57
|
-
config:
|
|
58
|
-
- key: sks.command
|
|
59
|
-
description: Local Sneakoscope Codex command to run from the active workspace.
|
|
60
|
-
default: ${sksCommand}
|
|
61
|
-
prompt: Path or command name for Sneakoscope Codex.
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
# Sneakoscope Codex For Hermes
|
|
65
|
-
|
|
66
|
-
## LLM Init Prompt For Hermes Agent Builders
|
|
67
|
-
|
|
68
|
-
\`\`\`text
|
|
69
|
-
Set up this Hermes agent project with Sneakoscope Codex. Use [[mandarange/Sneakoscope-Codex](https://github.com/mandarange/Sneakoscope-Codex)] as the repo reference and [npm i -g sneakoscope] as the recommended global install command, then run \`SKS_HERMES=1 ${sksCommand} root --json\`, setup/doctor, Codex App, and proof checks for this repo.
|
|
70
|
-
\`\`\`
|
|
71
|
-
|
|
72
|
-
## When to Use
|
|
73
|
-
|
|
74
|
-
Use this skill when a Hermes Agent is operating in a repository that mentions Sneakoscope Codex, SKS, \`sks\`, Team, QA-LOOP, TriWiki, Context7, DB safety, Completion Proof, Trust Kernel, Honest Mode, or \`$...\` SKS prompt routes.
|
|
75
|
-
|
|
76
|
-
Hermes exposes installed skills as slash commands, so users can run \`/${skillName} <task>\` from the CLI or any messaging gateway.
|
|
77
|
-
|
|
78
|
-
## Required Tool Access
|
|
79
|
-
|
|
80
|
-
The Hermes agent needs the \`terminal\` toolset or an equivalent shell/command tool. Prefer running commands in the target repository root.
|
|
81
|
-
|
|
82
|
-
Set \`SKS_HERMES=1\` for SKS shell commands. Hermes mode lets SKS treat dependency/update prompts as non-interactive agent prompts, matching the OpenClaw agent mode without changing database or destructive-operation safety rules.
|
|
83
|
-
|
|
84
|
-
## Procedure
|
|
85
|
-
|
|
86
|
-
1. Run \`SKS_HERMES=1 ${sksCommand} root --json\` from the target workspace.
|
|
87
|
-
2. Read \`AGENTS.md\` if present, then run \`SKS_HERMES=1 ${sksCommand} status --json\`.
|
|
88
|
-
3. Discover available surfaces with \`SKS_HERMES=1 ${sksCommand} commands --json\` and \`SKS_HERMES=1 ${sksCommand} dollar-commands --json\`.
|
|
89
|
-
4. For broad implementation, use the repo's selected SKS route. General code work normally belongs on Team; tiny direct edits may use DFix; UI/API dogfood belongs on QA-LOOP; DB/Supabase work belongs on DB safety routes.
|
|
90
|
-
5. Before coding, preserve existing user changes. Do not reset the worktree or overwrite unrelated files.
|
|
91
|
-
6. After edits, run the smallest relevant tests, then run \`${sksCommand} proof validate --json\` or \`${sksCommand} trust validate latest --json\` when a mission exists.
|
|
92
|
-
|
|
93
|
-
## Safety Rules
|
|
94
|
-
|
|
95
|
-
- Do not invent fallback implementation code when SKS reports that a requested path is blocked. Report the blocker and the source artifact instead.
|
|
96
|
-
- Database, migration, Supabase, and credential work stays read-only unless the user explicitly authorizes a scoped write path.
|
|
97
|
-
- \`$MAD-SKS\` or \`sks --mad\` is a temporary high-risk permission modifier only when the user explicitly invokes it. It does not remove catastrophic safeguards.
|
|
98
|
-
- Mock, fixture, or static evidence must be reported as partial verification, never as live runtime proof.
|
|
99
|
-
|
|
100
|
-
## Useful Commands
|
|
101
|
-
|
|
102
|
-
- \`${sksCommand} root --json\`
|
|
103
|
-
- \`${sksCommand} status --json\`
|
|
104
|
-
- \`${sksCommand} commands --json\`
|
|
105
|
-
- \`${sksCommand} dollar-commands --json\`
|
|
106
|
-
- \`${sksCommand} deps check --json\`
|
|
107
|
-
- \`${sksCommand} codex compatibility --json\`
|
|
108
|
-
- \`${sksCommand} proof-field scan --intent "<task>" --changed file1,file2 --json\`
|
|
109
|
-
- \`${sksCommand} proof validate --json\`
|
|
110
|
-
- \`${sksCommand} trust validate latest --json\`
|
|
111
|
-
|
|
112
|
-
## Pitfalls
|
|
113
|
-
|
|
114
|
-
- SKS prompt routes such as \`$Team\` are prompt commands in Codex App, not shell commands. In Hermes terminal workflows, prefer the corresponding \`sks team\`, \`sks qa-loop\`, \`sks dfix\`, \`sks db\`, or \`sks pipeline\` command.
|
|
115
|
-
- If Hermes runs in a sandbox, grant shell access only for trusted workspaces and keep SKS DB safety gates enabled.
|
|
116
|
-
- If \`latest\` moved to a fixture mission, pin the explicit mission id from \`${sksCommand} status --json\` before final proof/trust closeout.
|
|
117
|
-
|
|
118
|
-
## Verification
|
|
119
|
-
|
|
120
|
-
The minimum healthy check is:
|
|
121
|
-
|
|
122
|
-
\`\`\`sh
|
|
123
|
-
SKS_HERMES=1 ${sksCommand} root --json
|
|
124
|
-
SKS_HERMES=1 ${sksCommand} commands --json
|
|
125
|
-
SKS_HERMES=1 ${sksCommand} status --json
|
|
126
|
-
\`\`\`
|
|
127
|
-
|
|
128
|
-
For code changes, add the route-specific tests and proof/trust validation before claiming completion.
|
|
129
|
-
`;
|
|
130
|
-
}
|
|
131
|
-
function hermesSkillReadme({ sksCommand, skillName, version }) {
|
|
132
|
-
return `# ${skillName}
|
|
133
|
-
|
|
134
|
-
Version: ${version}
|
|
135
|
-
|
|
136
|
-
Generated by Sneakoscope Codex for Hermes Agent.
|
|
137
|
-
|
|
138
|
-
This Hermes skill lets Hermes discover and use Sneakoscope Codex through the local \`${sksCommand}\` command. It installs as \`/${skillName}\` and assumes the Hermes \`terminal\` toolset is available.
|
|
139
|
-
|
|
140
|
-
## LLM Init Prompt
|
|
141
|
-
|
|
142
|
-
\`\`\`text
|
|
143
|
-
Set up this Hermes agent project with Sneakoscope Codex. Use [[mandarange/Sneakoscope-Codex](https://github.com/mandarange/Sneakoscope-Codex)] as the repo reference and [npm i -g sneakoscope] as the recommended global install command, then run \`SKS_HERMES=1 ${sksCommand} root --json\`, setup/doctor, Codex App, and proof checks for this repo.
|
|
144
|
-
\`\`\`
|
|
145
|
-
|
|
146
|
-
## Install
|
|
147
|
-
|
|
148
|
-
\`\`\`sh
|
|
149
|
-
${sksCommand} hermes install
|
|
150
|
-
\`\`\`
|
|
151
|
-
|
|
152
|
-
The default target is \`~/.hermes/skills/${skillName}/\`.
|
|
153
|
-
|
|
154
|
-
## Verify From Hermes
|
|
155
|
-
|
|
156
|
-
\`\`\`sh
|
|
157
|
-
hermes skills list | grep ${skillName}
|
|
158
|
-
SKS_HERMES=1 ${sksCommand} root --json
|
|
159
|
-
SKS_HERMES=1 ${sksCommand} commands --json
|
|
160
|
-
\`\`\`
|
|
161
|
-
|
|
162
|
-
Then start a fresh Hermes session and invoke \`/${skillName} Use SKS in this repository.\`
|
|
163
|
-
|
|
164
|
-
## Optional External Skill Directory
|
|
165
|
-
|
|
166
|
-
If you keep SKS/Codex skills in a shared folder, add it under \`skills.external_dirs\` in \`~/.hermes/config.yaml\`. Hermes can update writable external skill directories, so use filesystem permissions when shared skills must remain read-only. See \`hermes-config.example.yaml\`.
|
|
167
|
-
`;
|
|
168
|
-
}
|
|
169
|
-
function hermesConfigExample({ skillName }) {
|
|
170
|
-
return `# Optional Hermes config snippet for Sneakoscope Codex.
|
|
171
|
-
# The installed skill under ~/.hermes/skills/${skillName}/ works without this.
|
|
172
|
-
|
|
173
|
-
skills:
|
|
174
|
-
external_dirs:
|
|
175
|
-
- ~/.agents/skills
|
|
176
|
-
|
|
177
|
-
# Hermes may update writable external skill directories. Use filesystem
|
|
178
|
-
# permissions if shared skills must remain read-only.
|
|
179
|
-
#
|
|
180
|
-
# For terminal sessions, run SKS commands with:
|
|
181
|
-
# SKS_HERMES=1 sks status --json
|
|
182
|
-
`;
|
|
183
|
-
}
|
|
184
|
-
function hermesSkillBundleExample({ skillName }) {
|
|
185
|
-
return `# Optional ~/.hermes/skill-bundles/sks.yaml
|
|
186
|
-
name: sks
|
|
187
|
-
description: Load Sneakoscope Codex operating rules for SKS-enabled repositories.
|
|
188
|
-
skills:
|
|
189
|
-
- ${skillName}
|
|
190
|
-
`;
|
|
191
|
-
}
|
|
192
|
-
//# sourceMappingURL=hermes.js.map
|
package/dist/core/openclaw.js
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import { exists, readText, writeTextAtomic, PACKAGE_VERSION } from './fsx.js';
|
|
4
|
-
export const OPENCLAW_SKILL_NAME = 'sneakoscope-codex';
|
|
5
|
-
export function defaultOpenClawHome(env = process.env) {
|
|
6
|
-
return path.resolve(env.OPENCLAW_HOME || path.join(env.HOME || os.homedir(), '.openclaw'));
|
|
7
|
-
}
|
|
8
|
-
export function defaultOpenClawSkillDir(env = process.env) {
|
|
9
|
-
return path.join(defaultOpenClawHome(env), 'skills', OPENCLAW_SKILL_NAME);
|
|
10
|
-
}
|
|
11
|
-
export function buildOpenClawSkillFiles(options = {}) {
|
|
12
|
-
const sksCommand = options.sksCommand || 'sks';
|
|
13
|
-
const version = options.version || PACKAGE_VERSION;
|
|
14
|
-
const skillName = options.skillName || OPENCLAW_SKILL_NAME;
|
|
15
|
-
return {
|
|
16
|
-
'manifest.yaml': openClawManifest({ skillName, version }),
|
|
17
|
-
'SKILL.md': openClawSkillMarkdown({ sksCommand, skillName, version }),
|
|
18
|
-
'README.md': openClawSkillReadme({ sksCommand, skillName, version }),
|
|
19
|
-
'openclaw-agent-config.example.yaml': openClawAgentConfigExample({ skillName })
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
export async function installOpenClawSkill(options = {}) {
|
|
23
|
-
const targetDir = path.resolve(options.targetDir || defaultOpenClawSkillDir(options.env || process.env));
|
|
24
|
-
const files = buildOpenClawSkillFiles(options);
|
|
25
|
-
const existingManifest = path.join(targetDir, 'manifest.yaml');
|
|
26
|
-
const existing = await exists(existingManifest);
|
|
27
|
-
if (existing && !options.force) {
|
|
28
|
-
const text = await readText(existingManifest, '');
|
|
29
|
-
if (!text.includes('generated_by: sneakoscope')) {
|
|
30
|
-
return {
|
|
31
|
-
ok: false,
|
|
32
|
-
status: 'blocked_existing_skill',
|
|
33
|
-
target_dir: targetDir,
|
|
34
|
-
reason: 'Existing OpenClaw skill is not marked as generated by Sneakoscope. Re-run with --force to overwrite.'
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
if (options.dryRun) {
|
|
39
|
-
return { ok: true, status: existing ? 'would_update' : 'would_create', target_dir: targetDir, files: Object.keys(files) };
|
|
40
|
-
}
|
|
41
|
-
for (const [name, content] of Object.entries(files)) {
|
|
42
|
-
await writeTextAtomic(path.join(targetDir, name), content);
|
|
43
|
-
}
|
|
44
|
-
return { ok: true, status: existing ? 'updated' : 'created', target_dir: targetDir, files: Object.keys(files) };
|
|
45
|
-
}
|
|
46
|
-
function openClawManifest({ skillName, version }) {
|
|
47
|
-
return `name: ${skillName}
|
|
48
|
-
version: ${version}
|
|
49
|
-
description: Expose Sneakoscope Codex (sks) workflows to OpenClaw agents.
|
|
50
|
-
author: mandarange
|
|
51
|
-
license: MIT
|
|
52
|
-
generated_by: sneakoscope
|
|
53
|
-
homepage: https://github.com/mandarange/Sneakoscope-Codex
|
|
54
|
-
entrypoint: SKILL.md
|
|
55
|
-
permissions:
|
|
56
|
-
shell: execute
|
|
57
|
-
filesystem: read_write_project
|
|
58
|
-
tags:
|
|
59
|
-
- codex
|
|
60
|
-
- coding-agent
|
|
61
|
-
- orchestration
|
|
62
|
-
- qa
|
|
63
|
-
- safety
|
|
64
|
-
`;
|
|
65
|
-
}
|
|
66
|
-
function openClawSkillMarkdown({ sksCommand, skillName, version }) {
|
|
67
|
-
return `---
|
|
68
|
-
name: ${skillName}
|
|
69
|
-
version: ${version}
|
|
70
|
-
description: Use Sneakoscope Codex routes, checks, and release gates from an OpenClaw agent.
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
# Sneakoscope Codex For OpenClaw
|
|
74
|
-
|
|
75
|
-
## LLM Init Prompt For OpenClaw Agent Builders
|
|
76
|
-
|
|
77
|
-
\`\`\`text
|
|
78
|
-
Set up this OpenClaw agent project with Sneakoscope Codex. Use [[mandarange/Sneakoscope-Codex](https://github.com/mandarange/Sneakoscope-Codex)] as the repo reference and [npm i -g sneakoscope] as the recommended global install command, then run \`SKS_OPENCLAW=1 ${sksCommand} root\`, setup/doctor, Codex App, and proof checks for this repo.
|
|
79
|
-
\`\`\`
|
|
80
|
-
|
|
81
|
-
Use this skill when the user asks an OpenClaw agent to work in a codebase that uses Sneakoscope Codex, SKS, Team, QA-LOOP, TriWiki, Context7, DB safety, Honest Mode, release gates, or \`$...\` prompt routes.
|
|
82
|
-
|
|
83
|
-
## Required Tool Access
|
|
84
|
-
|
|
85
|
-
The OpenClaw agent must have the built-in \`shell\` tool enabled. Prefer running commands in the target repository root.
|
|
86
|
-
|
|
87
|
-
Set \`SKS_OPENCLAW=1\` for SKS shell commands. In OpenClaw mode, SKS treats update/install prompts as automatically approved so \`sks\` can update \`sneakoscope\` or \`@openai/codex\` before launching Zellij without pausing for a human \`Y/n\` answer.
|
|
88
|
-
|
|
89
|
-
## Core Commands
|
|
90
|
-
|
|
91
|
-
- \`${sksCommand} root\` checks whether SKS is using a project root or the global runtime root.
|
|
92
|
-
- \`${sksCommand} bootstrap\` installs or repairs SKS project files, Codex App skills, hooks, and runtime state.
|
|
93
|
-
- \`${sksCommand} commands\` lists terminal commands the agent can call.
|
|
94
|
-
- \`${sksCommand} dollar-commands\` lists prompt routes such as \`$Team\`, \`$DFix\`, \`$QA-LOOP\`, \`$PPT\`, \`$Goal\`, \`$DB\`, \`$Wiki\`, and \`$Help\`.
|
|
95
|
-
- \`${sksCommand} deps check\` checks Node/npm path readiness; \`${sksCommand} doctor\` checks Codex, Context7, Zellij, and related local readiness.
|
|
96
|
-
- \`${sksCommand} proof-field scan --intent "<task>" --changed file1,file2\` checks whether a narrow change can stay on a lightweight proof path.
|
|
97
|
-
- \`${sksCommand} release:check\` is not a terminal command; use \`npm run release:check\` inside the Sneakoscope package repository.
|
|
98
|
-
|
|
99
|
-
## Agent Operating Rules
|
|
100
|
-
|
|
101
|
-
1. Before substantive work, run \`SKS_OPENCLAW=1 ${sksCommand} root\` and inspect the repository's \`AGENTS.md\` if present.
|
|
102
|
-
2. For implementation, prefer the repository's requested SKS route. General code work and broad implementation normally route to \`$Team\`; Direct Fix work, meaning tiny copy/config/docs/labels/spacing/translation/simple mechanical edits, can use \`$DFix\`; UI design specifics follow the repo's UI/design route rules; web UI/browser dogfood uses \`$QA-LOOP\` with the Codex Chrome Extension gate first; native Mac/non-web visual work uses \`$Computer-Use\`; database or Supabase work uses \`$DB\`.
|
|
103
|
-
3. Do not invent fallback implementation code when the requested SKS path is blocked. Report the blocker with command output and source paths.
|
|
104
|
-
4. For database, migration, and Supabase tasks, default to read-only inspection unless the user explicitly authorizes a write/migration scope.
|
|
105
|
-
5. Before claiming completion, run the most relevant verification command and summarize what passed, what was not verified, and any remaining blocker.
|
|
106
|
-
|
|
107
|
-
## Example Prompts For An OpenClaw Agent
|
|
108
|
-
|
|
109
|
-
- "In this repo, run \`${sksCommand} root\`, inspect \`AGENTS.md\`, then use the SKS Team route to implement the bug fix and verify it."
|
|
110
|
-
- "Use SKS QA-LOOP against localhost:3000. Do not run destructive tests."
|
|
111
|
-
- "Prepare this project for Codex App use: run \`${sksCommand} bootstrap\`, \`${sksCommand} codex-app check\`, and \`${sksCommand} dollar-commands\`."
|
|
112
|
-
`;
|
|
113
|
-
}
|
|
114
|
-
function openClawSkillReadme({ sksCommand, skillName, version }) {
|
|
115
|
-
return `# ${skillName}
|
|
116
|
-
|
|
117
|
-
Version: ${version}
|
|
118
|
-
|
|
119
|
-
This OpenClaw skill lets an OpenClaw agent discover and use Sneakoscope Codex through the local \`${sksCommand}\` command.
|
|
120
|
-
|
|
121
|
-
OpenClaw agents should set \`SKS_OPENCLAW=1\` when running SKS commands. That mode auto-approves SKS dependency/update prompts, including the Codex CLI update preflight before Zellij launch.
|
|
122
|
-
|
|
123
|
-
## LLM Init Prompt
|
|
124
|
-
|
|
125
|
-
\`\`\`text
|
|
126
|
-
Set up this OpenClaw agent project with Sneakoscope Codex. Use [[mandarange/Sneakoscope-Codex](https://github.com/mandarange/Sneakoscope-Codex)] as the repo reference and [npm i -g sneakoscope] as the recommended global install command, then run \`SKS_OPENCLAW=1 ${sksCommand} root\`, setup/doctor, Codex App, and proof checks for this repo.
|
|
127
|
-
\`\`\`
|
|
128
|
-
|
|
129
|
-
## Install
|
|
130
|
-
|
|
131
|
-
\`\`\`sh
|
|
132
|
-
${sksCommand} openclaw install
|
|
133
|
-
\`\`\`
|
|
134
|
-
|
|
135
|
-
Then attach the skill to an OpenClaw agent:
|
|
136
|
-
|
|
137
|
-
\`\`\`yaml
|
|
138
|
-
agents:
|
|
139
|
-
coding-agent:
|
|
140
|
-
tools:
|
|
141
|
-
- shell
|
|
142
|
-
skills:
|
|
143
|
-
- ${skillName}
|
|
144
|
-
\`\`\`
|
|
145
|
-
|
|
146
|
-
## Verify
|
|
147
|
-
|
|
148
|
-
\`\`\`sh
|
|
149
|
-
openclaw skill run ${skillName} --help
|
|
150
|
-
${sksCommand} root
|
|
151
|
-
${sksCommand} commands
|
|
152
|
-
\`\`\`
|
|
153
|
-
|
|
154
|
-
If OpenClaw runs skills in a sandbox, allow shell execution for this skill and run it from the target repository root so SKS can find \`.git\`, \`.sneakoscope\`, or \`.dcodex\`.
|
|
155
|
-
`;
|
|
156
|
-
}
|
|
157
|
-
function openClawAgentConfigExample({ skillName }) {
|
|
158
|
-
return `agents:
|
|
159
|
-
coding-agent:
|
|
160
|
-
model: openai/gpt-4o
|
|
161
|
-
channels:
|
|
162
|
-
- terminal
|
|
163
|
-
tools:
|
|
164
|
-
- shell
|
|
165
|
-
env:
|
|
166
|
-
SKS_OPENCLAW: "1"
|
|
167
|
-
skills:
|
|
168
|
-
- ${skillName}
|
|
169
|
-
`;
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=openclaw.js.map
|