@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.
Files changed (191) hide show
  1. package/dist/src/codex.js +9 -77
  2. package/dist/src/index.js +1 -1
  3. package/dist/test/installer.test.js +15 -28
  4. package/package.json +1 -1
  5. package/payload/manifest.json +404 -354
  6. package/payload/plugin/loom/skills/README.md +3 -1
  7. package/payload/plugin/loom/skills/README.zh-CN.md +3 -1
  8. package/payload/plugin/loom/skills/distribution-and-adapter-contract.md +2 -2
  9. package/payload/plugin/loom/skills/loom-adopt/SKILL.md +19 -4
  10. package/payload/plugin/loom/skills/loom-adopt/contract.json +16 -2
  11. package/payload/plugin/loom/skills/loom-adopt/references/input-signals.md +18 -3
  12. package/payload/plugin/loom/skills/loom-adopt/references/output-contract.md +16 -0
  13. package/payload/plugin/loom/skills/loom-resume/SKILL.md +10 -0
  14. package/payload/plugin/loom/skills/loom-resume/references/output-contract.md +6 -0
  15. package/payload/plugin/loom/skills/shared/references/adoption/deep-existing-repo-default.md +1 -0
  16. package/payload/plugin/loom/skills/shared/references/adoption/github-profile-upgrade.md +61 -6
  17. package/payload/plugin/loom/skills/shared/references/adoption/github-profile.md +2 -0
  18. package/payload/plugin/loom/skills/shared/references/adoption/lightweight-retrofit-default.md +3 -2
  19. package/payload/plugin/loom/skills/shared/references/adoption/routing-and-checkpoints.md +2 -0
  20. package/payload/plugin/loom/skills/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
  21. package/payload/plugin/loom/skills/shared/scripts/loom_check.py +241 -8
  22. package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +603 -65
  23. package/payload/plugin/loom/skills/shared/scripts/loom_init.py +119 -18
  24. package/payload/skills/loom-adopt/.loom-runtime/README.md +3 -1
  25. package/payload/skills/loom-adopt/.loom-runtime/README.zh-CN.md +3 -1
  26. package/payload/skills/loom-adopt/.loom-runtime/distribution-and-adapter-contract.md +2 -2
  27. package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/SKILL.md +19 -4
  28. package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/contract.json +16 -2
  29. package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
  30. package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
  31. package/payload/skills/loom-adopt/.loom-runtime/loom-resume/SKILL.md +10 -0
  32. package/payload/skills/loom-adopt/.loom-runtime/loom-resume/references/output-contract.md +6 -0
  33. package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
  34. package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
  35. package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
  36. package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
  37. package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
  38. package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
  39. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +241 -8
  40. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +603 -65
  41. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py +119 -18
  42. package/payload/skills/loom-adopt/SKILL.md +19 -4
  43. package/payload/skills/loom-adopt/contract.json +16 -2
  44. package/payload/skills/loom-adopt/references/input-signals.md +18 -3
  45. package/payload/skills/loom-adopt/references/output-contract.md +16 -0
  46. package/payload/skills/loom-handoff/.loom-runtime/README.md +3 -1
  47. package/payload/skills/loom-handoff/.loom-runtime/README.zh-CN.md +3 -1
  48. package/payload/skills/loom-handoff/.loom-runtime/distribution-and-adapter-contract.md +2 -2
  49. package/payload/skills/loom-handoff/.loom-runtime/loom-adopt/SKILL.md +19 -4
  50. package/payload/skills/loom-handoff/.loom-runtime/loom-adopt/contract.json +16 -2
  51. package/payload/skills/loom-handoff/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
  52. package/payload/skills/loom-handoff/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
  53. package/payload/skills/loom-handoff/.loom-runtime/loom-resume/SKILL.md +10 -0
  54. package/payload/skills/loom-handoff/.loom-runtime/loom-resume/references/output-contract.md +6 -0
  55. package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
  56. package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
  57. package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
  58. package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
  59. package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
  60. package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
  61. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +241 -8
  62. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +603 -65
  63. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py +119 -18
  64. package/payload/skills/loom-init/.loom-runtime/README.md +3 -1
  65. package/payload/skills/loom-init/.loom-runtime/README.zh-CN.md +3 -1
  66. package/payload/skills/loom-init/.loom-runtime/distribution-and-adapter-contract.md +2 -2
  67. package/payload/skills/loom-init/.loom-runtime/loom-adopt/SKILL.md +19 -4
  68. package/payload/skills/loom-init/.loom-runtime/loom-adopt/contract.json +16 -2
  69. package/payload/skills/loom-init/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
  70. package/payload/skills/loom-init/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
  71. package/payload/skills/loom-init/.loom-runtime/loom-resume/SKILL.md +10 -0
  72. package/payload/skills/loom-init/.loom-runtime/loom-resume/references/output-contract.md +6 -0
  73. package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
  74. package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
  75. package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
  76. package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
  77. package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
  78. package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
  79. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +241 -8
  80. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +603 -65
  81. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_init.py +119 -18
  82. package/payload/skills/loom-merge-ready/.loom-runtime/README.md +3 -1
  83. package/payload/skills/loom-merge-ready/.loom-runtime/README.zh-CN.md +3 -1
  84. package/payload/skills/loom-merge-ready/.loom-runtime/distribution-and-adapter-contract.md +2 -2
  85. package/payload/skills/loom-merge-ready/.loom-runtime/loom-adopt/SKILL.md +19 -4
  86. package/payload/skills/loom-merge-ready/.loom-runtime/loom-adopt/contract.json +16 -2
  87. package/payload/skills/loom-merge-ready/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
  88. package/payload/skills/loom-merge-ready/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
  89. package/payload/skills/loom-merge-ready/.loom-runtime/loom-resume/SKILL.md +10 -0
  90. package/payload/skills/loom-merge-ready/.loom-runtime/loom-resume/references/output-contract.md +6 -0
  91. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
  92. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
  93. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
  94. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
  95. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
  96. package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
  97. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +241 -8
  98. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +603 -65
  99. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py +119 -18
  100. package/payload/skills/loom-pre-review/.loom-runtime/README.md +3 -1
  101. package/payload/skills/loom-pre-review/.loom-runtime/README.zh-CN.md +3 -1
  102. package/payload/skills/loom-pre-review/.loom-runtime/distribution-and-adapter-contract.md +2 -2
  103. package/payload/skills/loom-pre-review/.loom-runtime/loom-adopt/SKILL.md +19 -4
  104. package/payload/skills/loom-pre-review/.loom-runtime/loom-adopt/contract.json +16 -2
  105. package/payload/skills/loom-pre-review/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
  106. package/payload/skills/loom-pre-review/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
  107. package/payload/skills/loom-pre-review/.loom-runtime/loom-resume/SKILL.md +10 -0
  108. package/payload/skills/loom-pre-review/.loom-runtime/loom-resume/references/output-contract.md +6 -0
  109. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
  110. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
  111. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
  112. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
  113. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
  114. package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
  115. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +241 -8
  116. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +603 -65
  117. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py +119 -18
  118. package/payload/skills/loom-resume/.loom-runtime/README.md +3 -1
  119. package/payload/skills/loom-resume/.loom-runtime/README.zh-CN.md +3 -1
  120. package/payload/skills/loom-resume/.loom-runtime/distribution-and-adapter-contract.md +2 -2
  121. package/payload/skills/loom-resume/.loom-runtime/loom-adopt/SKILL.md +19 -4
  122. package/payload/skills/loom-resume/.loom-runtime/loom-adopt/contract.json +16 -2
  123. package/payload/skills/loom-resume/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
  124. package/payload/skills/loom-resume/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
  125. package/payload/skills/loom-resume/.loom-runtime/loom-resume/SKILL.md +10 -0
  126. package/payload/skills/loom-resume/.loom-runtime/loom-resume/references/output-contract.md +6 -0
  127. package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
  128. package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
  129. package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
  130. package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
  131. package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
  132. package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
  133. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +241 -8
  134. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +603 -65
  135. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py +119 -18
  136. package/payload/skills/loom-resume/SKILL.md +10 -0
  137. package/payload/skills/loom-resume/references/output-contract.md +6 -0
  138. package/payload/skills/loom-retire/.loom-runtime/README.md +3 -1
  139. package/payload/skills/loom-retire/.loom-runtime/README.zh-CN.md +3 -1
  140. package/payload/skills/loom-retire/.loom-runtime/distribution-and-adapter-contract.md +2 -2
  141. package/payload/skills/loom-retire/.loom-runtime/loom-adopt/SKILL.md +19 -4
  142. package/payload/skills/loom-retire/.loom-runtime/loom-adopt/contract.json +16 -2
  143. package/payload/skills/loom-retire/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
  144. package/payload/skills/loom-retire/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
  145. package/payload/skills/loom-retire/.loom-runtime/loom-resume/SKILL.md +10 -0
  146. package/payload/skills/loom-retire/.loom-runtime/loom-resume/references/output-contract.md +6 -0
  147. package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
  148. package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
  149. package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
  150. package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
  151. package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
  152. package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
  153. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +241 -8
  154. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +603 -65
  155. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py +119 -18
  156. package/payload/skills/loom-review/.loom-runtime/README.md +3 -1
  157. package/payload/skills/loom-review/.loom-runtime/README.zh-CN.md +3 -1
  158. package/payload/skills/loom-review/.loom-runtime/distribution-and-adapter-contract.md +2 -2
  159. package/payload/skills/loom-review/.loom-runtime/loom-adopt/SKILL.md +19 -4
  160. package/payload/skills/loom-review/.loom-runtime/loom-adopt/contract.json +16 -2
  161. package/payload/skills/loom-review/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
  162. package/payload/skills/loom-review/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
  163. package/payload/skills/loom-review/.loom-runtime/loom-resume/SKILL.md +10 -0
  164. package/payload/skills/loom-review/.loom-runtime/loom-resume/references/output-contract.md +6 -0
  165. package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
  166. package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
  167. package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
  168. package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
  169. package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
  170. package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
  171. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +241 -8
  172. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +603 -65
  173. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_init.py +119 -18
  174. package/payload/skills/loom-spec-review/.loom-runtime/README.md +3 -1
  175. package/payload/skills/loom-spec-review/.loom-runtime/README.zh-CN.md +3 -1
  176. package/payload/skills/loom-spec-review/.loom-runtime/distribution-and-adapter-contract.md +2 -2
  177. package/payload/skills/loom-spec-review/.loom-runtime/loom-adopt/SKILL.md +19 -4
  178. package/payload/skills/loom-spec-review/.loom-runtime/loom-adopt/contract.json +16 -2
  179. package/payload/skills/loom-spec-review/.loom-runtime/loom-adopt/references/input-signals.md +18 -3
  180. package/payload/skills/loom-spec-review/.loom-runtime/loom-adopt/references/output-contract.md +16 -0
  181. package/payload/skills/loom-spec-review/.loom-runtime/loom-resume/SKILL.md +10 -0
  182. package/payload/skills/loom-spec-review/.loom-runtime/loom-resume/references/output-contract.md +6 -0
  183. package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +1 -0
  184. package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/github-profile-upgrade.md +61 -6
  185. package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/github-profile.md +2 -0
  186. package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +3 -2
  187. package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +2 -0
  188. package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/zero-friction-adoption-contract.md +7 -0
  189. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +241 -8
  190. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +603 -65
  191. 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(env, packageRoot, skill, force) {
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(env.codexHome, 'skills', skillDirName);
96
+ const targetDir = join(targetRoot, '.agents', 'skills', skillDirName);
162
97
  const skillMarkdownPath = join(targetDir, 'SKILL.md');
163
- const configPath = join(env.codexHome, 'config.toml');
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(`existing Codex skill directory is not Loom-managed: ${targetDir}`, `refusing to take over non-Loom Codex skill directory: ${targetDir}`);
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
- ensureDirectory(env.codexHome);
175
- upsertSkillBlock(configPath, skillMarkdownPath, skill.id, force);
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, configPath],
115
+ installed_paths: [targetDir],
184
116
  verification: [
185
117
  `verified skill payload at ${targetDir}`,
186
- `verified skills.config entry for ${skill.id}`,
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 skills.config entry', () => {
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 config = readFileSync(join(envSource.CODEX_HOME, 'config.toml'), 'utf8');
193
+ const skillPath = join(repoRoot, '.agents', 'skills', 'loom-review', 'SKILL.md');
195
194
  assert.equal(result.mode, 'skill');
196
- assert.match(config, /\[\[skills\.config\]\]/);
197
- assert.match(config, /loom-review\/SKILL\.md/);
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 skills.config entry without force', () => {
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
- writeFileSync(join(envSource.CODEX_HOME, 'config.toml'), [
207
- 'model = "gpt-5"',
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()), /already has loom-review from a different path/);
216
+ assert.throws(() => runInstaller(parsed, envSource, packageRoot()), /not a Loom skill/);
225
217
  });
226
- test('codex skill install lets --force take over conflicting skills.config entry', () => {
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
- writeFileSync(join(envSource.CODEX_HOME, 'config.toml'), [
233
- 'model = "gpt-5"',
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 config = readFileSync(join(envSource.CODEX_HOME, 'config.toml'), 'utf8');
237
+ const skillPath = join(repoRoot, '.agents', 'skills', 'loom-review', 'SKILL.md');
252
238
  assert.equal(result.mode, 'skill');
253
- assert.doesNotMatch(config, /\/tmp\/other\/loom-review\/SKILL\.md/);
254
- assert.match(config, /loom-review\/SKILL\.md/);
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
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mc-and-his-agents/loom-installer",
3
- "version": "0.1.53",
3
+ "version": "0.1.55",
4
4
  "description": "Node installer for Loom plugin and single-skill installation surfaces.",
5
5
  "type": "module",
6
6
  "bin": {