@mc-and-his-agents/loom-installer 0.1.53 → 0.1.55
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/dist/src/codex.js +9 -77
- package/dist/src/index.js +1 -1
- package/dist/test/installer.test.js +15 -28
- package/package.json +1 -1
- package/payload/manifest.json +404 -354
- package/payload/plugin/loom/skills/README.md +3 -1
- package/payload/plugin/loom/skills/README.zh-CN.md +3 -1
- package/payload/plugin/loom/skills/distribution-and-adapter-contract.md +2 -2
- package/payload/plugin/loom/skills/loom-adopt/SKILL.md +19 -4
- package/payload/plugin/loom/skills/loom-adopt/contract.json +16 -2
- package/payload/plugin/loom/skills/loom-adopt/references/input-signals.md +18 -3
- package/payload/plugin/loom/skills/loom-adopt/references/output-contract.md +16 -0
- package/payload/plugin/loom/skills/loom-resume/SKILL.md +10 -0
- package/payload/plugin/loom/skills/loom-resume/references/output-contract.md +6 -0
- package/payload/plugin/loom/skills/shared/references/adoption/deep-existing-repo-default.md +1 -0
- package/payload/plugin/loom/skills/shared/references/adoption/github-profile-upgrade.md +61 -6
- package/payload/plugin/loom/skills/shared/references/adoption/github-profile.md +2 -0
- package/payload/plugin/loom/skills/shared/references/adoption/lightweight-retrofit-default.md +3 -2
- package/payload/plugin/loom/skills/shared/references/adoption/routing-and-checkpoints.md +2 -0
- package/payload/plugin/loom/skills/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
- package/payload/plugin/loom/skills/shared/scripts/loom_check.py +241 -8
- package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +603 -65
- package/payload/plugin/loom/skills/shared/scripts/loom_init.py +119 -18
- package/payload/skills/loom-adopt/.loom-runtime/README.md +3 -1
- package/payload/skills/loom-adopt/.loom-runtime/README.zh-CN.md +3 -1
- package/payload/skills/loom-adopt/.loom-runtime/distribution-and-adapter-contract.md +2 -2
- package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/SKILL.md +19 -4
- package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/contract.json +16 -2
- package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
- package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-resume/SKILL.md +10 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-resume/references/output-contract.md +6 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +241 -8
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +603 -65
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py +119 -18
- package/payload/skills/loom-adopt/SKILL.md +19 -4
- package/payload/skills/loom-adopt/contract.json +16 -2
- package/payload/skills/loom-adopt/references/input-signals.md +18 -3
- package/payload/skills/loom-adopt/references/output-contract.md +16 -0
- package/payload/skills/loom-handoff/.loom-runtime/README.md +3 -1
- package/payload/skills/loom-handoff/.loom-runtime/README.zh-CN.md +3 -1
- package/payload/skills/loom-handoff/.loom-runtime/distribution-and-adapter-contract.md +2 -2
- package/payload/skills/loom-handoff/.loom-runtime/loom-adopt/SKILL.md +19 -4
- package/payload/skills/loom-handoff/.loom-runtime/loom-adopt/contract.json +16 -2
- package/payload/skills/loom-handoff/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
- package/payload/skills/loom-handoff/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-resume/SKILL.md +10 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-resume/references/output-contract.md +6 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +241 -8
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +603 -65
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py +119 -18
- package/payload/skills/loom-init/.loom-runtime/README.md +3 -1
- package/payload/skills/loom-init/.loom-runtime/README.zh-CN.md +3 -1
- package/payload/skills/loom-init/.loom-runtime/distribution-and-adapter-contract.md +2 -2
- package/payload/skills/loom-init/.loom-runtime/loom-adopt/SKILL.md +19 -4
- package/payload/skills/loom-init/.loom-runtime/loom-adopt/contract.json +16 -2
- package/payload/skills/loom-init/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
- package/payload/skills/loom-init/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
- package/payload/skills/loom-init/.loom-runtime/loom-resume/SKILL.md +10 -0
- package/payload/skills/loom-init/.loom-runtime/loom-resume/references/output-contract.md +6 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +241 -8
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +603 -65
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_init.py +119 -18
- package/payload/skills/loom-merge-ready/.loom-runtime/README.md +3 -1
- package/payload/skills/loom-merge-ready/.loom-runtime/README.zh-CN.md +3 -1
- package/payload/skills/loom-merge-ready/.loom-runtime/distribution-and-adapter-contract.md +2 -2
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-adopt/SKILL.md +19 -4
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-adopt/contract.json +16 -2
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-resume/SKILL.md +10 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-resume/references/output-contract.md +6 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +241 -8
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +603 -65
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py +119 -18
- package/payload/skills/loom-pre-review/.loom-runtime/README.md +3 -1
- package/payload/skills/loom-pre-review/.loom-runtime/README.zh-CN.md +3 -1
- package/payload/skills/loom-pre-review/.loom-runtime/distribution-and-adapter-contract.md +2 -2
- package/payload/skills/loom-pre-review/.loom-runtime/loom-adopt/SKILL.md +19 -4
- package/payload/skills/loom-pre-review/.loom-runtime/loom-adopt/contract.json +16 -2
- package/payload/skills/loom-pre-review/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
- package/payload/skills/loom-pre-review/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-resume/SKILL.md +10 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-resume/references/output-contract.md +6 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +241 -8
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +603 -65
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py +119 -18
- package/payload/skills/loom-resume/.loom-runtime/README.md +3 -1
- package/payload/skills/loom-resume/.loom-runtime/README.zh-CN.md +3 -1
- package/payload/skills/loom-resume/.loom-runtime/distribution-and-adapter-contract.md +2 -2
- package/payload/skills/loom-resume/.loom-runtime/loom-adopt/SKILL.md +19 -4
- package/payload/skills/loom-resume/.loom-runtime/loom-adopt/contract.json +16 -2
- package/payload/skills/loom-resume/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
- package/payload/skills/loom-resume/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-resume/SKILL.md +10 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-resume/references/output-contract.md +6 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +241 -8
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +603 -65
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py +119 -18
- package/payload/skills/loom-resume/SKILL.md +10 -0
- package/payload/skills/loom-resume/references/output-contract.md +6 -0
- package/payload/skills/loom-retire/.loom-runtime/README.md +3 -1
- package/payload/skills/loom-retire/.loom-runtime/README.zh-CN.md +3 -1
- package/payload/skills/loom-retire/.loom-runtime/distribution-and-adapter-contract.md +2 -2
- package/payload/skills/loom-retire/.loom-runtime/loom-adopt/SKILL.md +19 -4
- package/payload/skills/loom-retire/.loom-runtime/loom-adopt/contract.json +16 -2
- package/payload/skills/loom-retire/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
- package/payload/skills/loom-retire/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-resume/SKILL.md +10 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-resume/references/output-contract.md +6 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +241 -8
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +603 -65
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py +119 -18
- package/payload/skills/loom-review/.loom-runtime/README.md +3 -1
- package/payload/skills/loom-review/.loom-runtime/README.zh-CN.md +3 -1
- package/payload/skills/loom-review/.loom-runtime/distribution-and-adapter-contract.md +2 -2
- package/payload/skills/loom-review/.loom-runtime/loom-adopt/SKILL.md +19 -4
- package/payload/skills/loom-review/.loom-runtime/loom-adopt/contract.json +16 -2
- package/payload/skills/loom-review/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
- package/payload/skills/loom-review/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
- package/payload/skills/loom-review/.loom-runtime/loom-resume/SKILL.md +10 -0
- package/payload/skills/loom-review/.loom-runtime/loom-resume/references/output-contract.md +6 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +241 -8
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +603 -65
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_init.py +119 -18
- package/payload/skills/loom-spec-review/.loom-runtime/README.md +3 -1
- package/payload/skills/loom-spec-review/.loom-runtime/README.zh-CN.md +3 -1
- package/payload/skills/loom-spec-review/.loom-runtime/distribution-and-adapter-contract.md +2 -2
- package/payload/skills/loom-spec-review/.loom-runtime/loom-adopt/SKILL.md +19 -4
- package/payload/skills/loom-spec-review/.loom-runtime/loom-adopt/contract.json +16 -2
- package/payload/skills/loom-spec-review/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
- package/payload/skills/loom-spec-review/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
- package/payload/skills/loom-spec-review/.loom-runtime/loom-resume/SKILL.md +10 -0
- package/payload/skills/loom-spec-review/.loom-runtime/loom-resume/references/output-contract.md +6 -0
- package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
- package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
- package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
- package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
- package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
- package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +241 -8
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +603 -65
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py +119 -18
package/dist/src/codex.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync } from 'node:fs';
|
|
2
1
|
import { join } from 'node:path';
|
|
3
2
|
import { InstallerError, copyTree, dirExists, ensureDirectory, fileExists, readJson, replaceTree, writeJson } from './utils.js';
|
|
4
3
|
function codexMarketplacePath(targetRoot) {
|
|
@@ -54,70 +53,6 @@ function ensureMarketplace(targetRoot, force) {
|
|
|
54
53
|
writeJson(marketplacePath, marketplace);
|
|
55
54
|
return [marketplacePath];
|
|
56
55
|
}
|
|
57
|
-
function parseSkillBlocks(content) {
|
|
58
|
-
const lines = content.split('\n');
|
|
59
|
-
const blocks = [];
|
|
60
|
-
for (let index = 0; index < lines.length; index += 1) {
|
|
61
|
-
if (lines[index].trim() !== '[[skills.config]]') {
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
const blockLines = [lines[index]];
|
|
65
|
-
index += 1;
|
|
66
|
-
while (index < lines.length && !lines[index].trim().startsWith('[[')) {
|
|
67
|
-
blockLines.push(lines[index]);
|
|
68
|
-
index += 1;
|
|
69
|
-
}
|
|
70
|
-
index -= 1;
|
|
71
|
-
const raw = blockLines.join('\n');
|
|
72
|
-
const pathMatch = raw.match(/^path\s*=\s*"([^"]+)"/m);
|
|
73
|
-
const enabledMatch = raw.match(/^enabled\s*=\s*(true|false)/m);
|
|
74
|
-
blocks.push({
|
|
75
|
-
raw,
|
|
76
|
-
path: pathMatch?.[1] ?? null,
|
|
77
|
-
enabled: enabledMatch ? enabledMatch[1] === 'true' : null,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
return blocks;
|
|
81
|
-
}
|
|
82
|
-
function upsertSkillBlock(configPath, desiredSkillPath, skillId, force) {
|
|
83
|
-
const content = fileExists(configPath) ? readFileSync(configPath, 'utf8') : '';
|
|
84
|
-
const blocks = parseSkillBlocks(content);
|
|
85
|
-
const skillDir = skillId.startsWith('loom-') ? skillId : `loom-${skillId}`;
|
|
86
|
-
const conflicting = blocks.filter((block) => {
|
|
87
|
-
if (!block.path) {
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
return block.path.endsWith(`/${skillDir}/SKILL.md`) && block.path !== desiredSkillPath;
|
|
91
|
-
});
|
|
92
|
-
if (conflicting.length > 0 && !force) {
|
|
93
|
-
throw new InstallerError(`Codex already has ${skillId} from a different path`, `Codex already has ${skillId} from a different path`);
|
|
94
|
-
}
|
|
95
|
-
let nextContent = content;
|
|
96
|
-
for (const block of conflicting) {
|
|
97
|
-
nextContent = nextContent.replace(`${block.raw}\n`, '').replace(block.raw, '');
|
|
98
|
-
}
|
|
99
|
-
const existingBlock = parseSkillBlocks(nextContent).find((block) => block.path === desiredSkillPath);
|
|
100
|
-
if (existingBlock) {
|
|
101
|
-
const enabledBlock = existingBlock.raw.match(/^enabled\s*=\s*false/m)
|
|
102
|
-
? existingBlock.raw.replace(/^enabled\s*=\s*false/m, 'enabled = true')
|
|
103
|
-
: existingBlock.enabled === null
|
|
104
|
-
? `${existingBlock.raw}\nenabled = true`
|
|
105
|
-
: existingBlock.raw;
|
|
106
|
-
nextContent = nextContent.replace(existingBlock.raw, enabledBlock);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
if (nextContent && !nextContent.endsWith('\n')) {
|
|
110
|
-
nextContent += '\n';
|
|
111
|
-
}
|
|
112
|
-
nextContent += `\n[[skills.config]]\npath = ${JSON.stringify(desiredSkillPath)}\nenabled = true\n`;
|
|
113
|
-
}
|
|
114
|
-
ensureDirectory(join(configPath, '..'));
|
|
115
|
-
writeFileSync(configPath, nextContent.replace(/^\n+/, ''), 'utf8');
|
|
116
|
-
}
|
|
117
|
-
function verifySkillEnabled(configPath, desiredSkillPath) {
|
|
118
|
-
const content = fileExists(configPath) ? readFileSync(configPath, 'utf8') : '';
|
|
119
|
-
return parseSkillBlocks(content).some((block) => block.path === desiredSkillPath && block.enabled !== false);
|
|
120
|
-
}
|
|
121
56
|
export function installCodexPlugin(targetRoot, packageRoot, manifest, force) {
|
|
122
57
|
const pluginSource = join(packageRoot, 'payload', manifest.plugin.relative_path);
|
|
123
58
|
const pluginTarget = join(targetRoot, 'plugins', 'loom');
|
|
@@ -155,37 +90,34 @@ export function installCodexPlugin(targetRoot, packageRoot, manifest, force) {
|
|
|
155
90
|
fail_closed_reason: null,
|
|
156
91
|
};
|
|
157
92
|
}
|
|
158
|
-
export function installCodexSkill(
|
|
93
|
+
export function installCodexSkill(_env, targetRoot, packageRoot, skill, force) {
|
|
159
94
|
const skillDirName = skill.id.startsWith('loom-') ? skill.id : `loom-${skill.id}`;
|
|
160
95
|
const sourceDir = join(packageRoot, 'payload', skill.relative_path);
|
|
161
|
-
const targetDir = join(
|
|
96
|
+
const targetDir = join(targetRoot, '.agents', 'skills', skillDirName);
|
|
162
97
|
const skillMarkdownPath = join(targetDir, 'SKILL.md');
|
|
163
|
-
|
|
164
|
-
ensureDirectory(join(env.codexHome, 'skills'));
|
|
98
|
+
ensureDirectory(join(targetRoot, '.agents', 'skills'));
|
|
165
99
|
if (dirExists(targetDir)) {
|
|
166
100
|
if (!force && !fileExists(skillMarkdownPath)) {
|
|
167
|
-
throw new InstallerError(`
|
|
101
|
+
throw new InstallerError(`target already contains .agents/skills/${skillDirName} but it is not a Loom skill: ${targetDir}`, `refusing to take over non-Loom repo skill directory: ${targetDir}`);
|
|
168
102
|
}
|
|
169
103
|
replaceTree(sourceDir, targetDir);
|
|
170
104
|
}
|
|
171
105
|
else {
|
|
172
106
|
copyTree(sourceDir, targetDir, true);
|
|
173
107
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
if (!verifySkillEnabled(configPath, skillMarkdownPath)) {
|
|
177
|
-
throw new InstallerError(`Codex config did not enable ${skill.id}`);
|
|
108
|
+
if (!fileExists(skillMarkdownPath)) {
|
|
109
|
+
throw new InstallerError(`Codex repo skill install is missing SKILL.md: ${skillMarkdownPath}`);
|
|
178
110
|
}
|
|
179
111
|
return {
|
|
180
112
|
mode: 'skill',
|
|
181
113
|
host: 'codex',
|
|
182
114
|
status: 'installed',
|
|
183
|
-
installed_paths: [targetDir
|
|
115
|
+
installed_paths: [targetDir],
|
|
184
116
|
verification: [
|
|
185
117
|
`verified skill payload at ${targetDir}`,
|
|
186
|
-
`verified
|
|
118
|
+
`verified repo skill discovery path at ${skillMarkdownPath}`,
|
|
187
119
|
],
|
|
188
|
-
warnings: ['Codex single-skill install exposes only the named skill, not the full Loom plugin surface.'],
|
|
120
|
+
warnings: ['Codex repo-scoped single-skill install exposes only the named skill, not the full Loom plugin surface.'],
|
|
189
121
|
fail_closed_reason: null,
|
|
190
122
|
};
|
|
191
123
|
}
|
package/dist/src/index.js
CHANGED
|
@@ -170,6 +170,6 @@ function installForHost(input) {
|
|
|
170
170
|
}
|
|
171
171
|
const skill = resolveSkillRecord(manifest, parsed.skillId ?? '');
|
|
172
172
|
return host === 'codex'
|
|
173
|
-
? installCodexSkill(env, packageRoot, skill, parsed.options.force)
|
|
173
|
+
? installCodexSkill(env, targetRoot, packageRoot, skill, parsed.options.force)
|
|
174
174
|
: installClaudeSkill(targetRoot, packageRoot, skill, parsed.options.force);
|
|
175
175
|
}
|
|
@@ -173,13 +173,12 @@ test('codex plugin install lets --force take over conflicting marketplace entry'
|
|
|
173
173
|
assert.equal(result.mode, 'plugin');
|
|
174
174
|
assert.equal(marketplace.plugins[0].source.path, './plugins/loom');
|
|
175
175
|
});
|
|
176
|
-
test('codex skill install writes
|
|
176
|
+
test('codex skill install writes repo-scoped .agents skill', () => {
|
|
177
177
|
const base = fixtureRoot();
|
|
178
178
|
const envSource = prepareEnv(base);
|
|
179
179
|
mkdirSync(envSource.CODEX_HOME, { recursive: true });
|
|
180
180
|
const repoRoot = join(base, 'repo');
|
|
181
181
|
mkdirSync(repoRoot, { recursive: true });
|
|
182
|
-
writeFileSync(join(envSource.CODEX_HOME, 'config.toml'), 'model = "gpt-5"\n', 'utf8');
|
|
183
182
|
const parsed = {
|
|
184
183
|
mode: 'skill',
|
|
185
184
|
skillId: 'loom-review',
|
|
@@ -191,26 +190,19 @@ test('codex skill install writes skills.config entry', () => {
|
|
|
191
190
|
},
|
|
192
191
|
};
|
|
193
192
|
const result = runInstaller(parsed, envSource, packageRoot());
|
|
194
|
-
const
|
|
193
|
+
const skillPath = join(repoRoot, '.agents', 'skills', 'loom-review', 'SKILL.md');
|
|
195
194
|
assert.equal(result.mode, 'skill');
|
|
196
|
-
assert.
|
|
197
|
-
assert.
|
|
198
|
-
assert.match(config, /enabled = true/);
|
|
195
|
+
assert.equal(existsSync(skillPath), true);
|
|
196
|
+
assert.equal(existsSync(join(envSource.CODEX_HOME, 'config.toml')), false);
|
|
199
197
|
});
|
|
200
|
-
test('codex skill install fails closed on conflicting
|
|
198
|
+
test('codex skill install fails closed on conflicting repo skill directory without force', () => {
|
|
201
199
|
const base = fixtureRoot();
|
|
202
200
|
const envSource = prepareEnv(base);
|
|
203
201
|
mkdirSync(envSource.CODEX_HOME, { recursive: true });
|
|
204
202
|
const repoRoot = join(base, 'repo');
|
|
205
203
|
mkdirSync(repoRoot, { recursive: true });
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
'',
|
|
209
|
-
'[[skills.config]]',
|
|
210
|
-
'path = "/tmp/other/loom-review/SKILL.md"',
|
|
211
|
-
'enabled = true',
|
|
212
|
-
'',
|
|
213
|
-
].join('\n'), 'utf8');
|
|
204
|
+
mkdirSync(join(repoRoot, '.agents', 'skills', 'loom-review'), { recursive: true });
|
|
205
|
+
writeFileSync(join(repoRoot, '.agents', 'skills', 'loom-review', 'README.md'), '# Not a Loom skill\n', 'utf8');
|
|
214
206
|
const parsed = {
|
|
215
207
|
mode: 'skill',
|
|
216
208
|
skillId: 'loom-review',
|
|
@@ -221,22 +213,16 @@ test('codex skill install fails closed on conflicting skills.config entry withou
|
|
|
221
213
|
json: false,
|
|
222
214
|
},
|
|
223
215
|
};
|
|
224
|
-
assert.throws(() => runInstaller(parsed, envSource, packageRoot()), /
|
|
216
|
+
assert.throws(() => runInstaller(parsed, envSource, packageRoot()), /not a Loom skill/);
|
|
225
217
|
});
|
|
226
|
-
test('codex skill install lets --force take over conflicting
|
|
218
|
+
test('codex skill install lets --force take over conflicting repo skill directory', () => {
|
|
227
219
|
const base = fixtureRoot();
|
|
228
220
|
const envSource = prepareEnv(base);
|
|
229
221
|
mkdirSync(envSource.CODEX_HOME, { recursive: true });
|
|
230
222
|
const repoRoot = join(base, 'repo');
|
|
231
223
|
mkdirSync(repoRoot, { recursive: true });
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
'',
|
|
235
|
-
'[[skills.config]]',
|
|
236
|
-
'path = "/tmp/other/loom-review/SKILL.md"',
|
|
237
|
-
'enabled = true',
|
|
238
|
-
'',
|
|
239
|
-
].join('\n'), 'utf8');
|
|
224
|
+
mkdirSync(join(repoRoot, '.agents', 'skills', 'loom-review'), { recursive: true });
|
|
225
|
+
writeFileSync(join(repoRoot, '.agents', 'skills', 'loom-review', 'README.md'), '# Not a Loom skill\n', 'utf8');
|
|
240
226
|
const parsed = {
|
|
241
227
|
mode: 'skill',
|
|
242
228
|
skillId: 'loom-review',
|
|
@@ -248,10 +234,10 @@ test('codex skill install lets --force take over conflicting skills.config entry
|
|
|
248
234
|
},
|
|
249
235
|
};
|
|
250
236
|
const result = runInstaller(parsed, envSource, packageRoot());
|
|
251
|
-
const
|
|
237
|
+
const skillPath = join(repoRoot, '.agents', 'skills', 'loom-review', 'SKILL.md');
|
|
252
238
|
assert.equal(result.mode, 'skill');
|
|
253
|
-
assert.
|
|
254
|
-
assert.
|
|
239
|
+
assert.equal(existsSync(skillPath), true);
|
|
240
|
+
assert.equal(existsSync(join(repoRoot, '.agents', 'skills', 'loom-review', 'README.md')), false);
|
|
255
241
|
});
|
|
256
242
|
test('single-skill installs stay scoped to the named skill for codex', () => {
|
|
257
243
|
const base = fixtureRoot();
|
|
@@ -272,6 +258,7 @@ test('single-skill installs stay scoped to the named skill for codex', () => {
|
|
|
272
258
|
const result = runInstaller(parsed, envSource, packageRoot());
|
|
273
259
|
assert.equal(result.mode, 'skill');
|
|
274
260
|
assert.match(result.warnings[0] ?? '', /only the named skill, not the full Loom plugin surface/);
|
|
261
|
+
assert.equal(existsSync(join(repoRoot, '.agents', 'skills', 'loom-init', 'SKILL.md')), true);
|
|
275
262
|
assert.equal(existsSync(join(repoRoot, 'plugins', 'loom')), false);
|
|
276
263
|
assert.equal(existsSync(join(repoRoot, '.agents', 'plugins', 'marketplace.json')), false);
|
|
277
264
|
});
|