@su-record/vibe 4.2.34 → 4.2.36

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 (225) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/dist/cli/common.js +4 -1
  5. package/dist/cli/common.js.map +1 -1
  6. package/dist/cli/heldout.js +10 -4
  7. package/dist/cli/heldout.js.map +1 -1
  8. package/dist/cli/human.js +8 -4
  9. package/dist/cli/human.js.map +1 -1
  10. package/dist/cli/internal.js +37 -24
  11. package/dist/cli/internal.js.map +1 -1
  12. package/dist/cli/ledger.js +67 -0
  13. package/dist/cli/ledger.js.map +1 -0
  14. package/dist/cli/map.js +5 -3
  15. package/dist/cli/map.js.map +1 -1
  16. package/dist/cli/memory.js +104 -74
  17. package/dist/cli/memory.js.map +1 -1
  18. package/dist/cli/risks.js +20 -3
  19. package/dist/cli/risks.js.map +1 -1
  20. package/dist/cli/session.js +4 -2
  21. package/dist/cli/session.js.map +1 -1
  22. package/dist/cli/setup.js +44 -13
  23. package/dist/cli/setup.js.map +1 -1
  24. package/dist/cli/verification.js +1 -1
  25. package/dist/cli/verification.js.map +1 -1
  26. package/dist/cli/work.js +75 -22
  27. package/dist/cli/work.js.map +1 -1
  28. package/dist/cli.js +18 -6
  29. package/dist/cli.js.map +1 -1
  30. package/dist/core/analyze.js +21 -7
  31. package/dist/core/analyze.js.map +1 -1
  32. package/dist/core/artifact-paths.js +14 -3
  33. package/dist/core/artifact-paths.js.map +1 -1
  34. package/dist/core/capabilities.js +69 -15
  35. package/dist/core/capabilities.js.map +1 -1
  36. package/dist/core/check-authorization.js +37 -0
  37. package/dist/core/check-authorization.js.map +1 -0
  38. package/dist/core/check-process.js +12 -4
  39. package/dist/core/check-process.js.map +1 -1
  40. package/dist/core/check-report.js +66 -0
  41. package/dist/core/check-report.js.map +1 -0
  42. package/dist/core/check-selection.js +4 -2
  43. package/dist/core/check-selection.js.map +1 -1
  44. package/dist/core/check.js +66 -130
  45. package/dist/core/check.js.map +1 -1
  46. package/dist/core/checks/changed.js +20 -6
  47. package/dist/core/checks/changed.js.map +1 -1
  48. package/dist/core/checks/eval.js +35 -10
  49. package/dist/core/checks/eval.js.map +1 -1
  50. package/dist/core/checks/file.js +26 -23
  51. package/dist/core/checks/file.js.map +1 -1
  52. package/dist/core/checks/fileRules.js +42 -16
  53. package/dist/core/checks/fileRules.js.map +1 -1
  54. package/dist/core/checks/http.js +35 -34
  55. package/dist/core/checks/http.js.map +1 -1
  56. package/dist/core/checks/packs.js +1 -1
  57. package/dist/core/checks/packs.js.map +1 -1
  58. package/dist/core/checks/review.js +75 -40
  59. package/dist/core/checks/review.js.map +1 -1
  60. package/dist/core/checks/run.js +5 -2
  61. package/dist/core/checks/run.js.map +1 -1
  62. package/dist/core/checks/schema.js +25 -0
  63. package/dist/core/checks/schema.js.map +1 -0
  64. package/dist/core/checks/source.js +11 -6
  65. package/dist/core/checks/source.js.map +1 -1
  66. package/dist/core/config.js +9 -2
  67. package/dist/core/config.js.map +1 -1
  68. package/dist/core/consent.js +24 -16
  69. package/dist/core/consent.js.map +1 -1
  70. package/dist/core/context-notes.js +15 -7
  71. package/dist/core/context-notes.js.map +1 -1
  72. package/dist/core/context.js +24 -12
  73. package/dist/core/context.js.map +1 -1
  74. package/dist/core/conventions.js +22 -9
  75. package/dist/core/conventions.js.map +1 -1
  76. package/dist/core/docs/cfb.js +81 -45
  77. package/dist/core/docs/cfb.js.map +1 -1
  78. package/dist/core/docs/html.js +14 -3
  79. package/dist/core/docs/html.js.map +1 -1
  80. package/dist/core/docs/hwp.js +44 -22
  81. package/dist/core/docs/hwp.js.map +1 -1
  82. package/dist/core/docs/office.js +20 -10
  83. package/dist/core/docs/office.js.map +1 -1
  84. package/dist/core/docs/pdf.js +10 -4
  85. package/dist/core/docs/pdf.js.map +1 -1
  86. package/dist/core/docs/read.js +32 -24
  87. package/dist/core/docs/read.js.map +1 -1
  88. package/dist/core/docs/zip.js +32 -15
  89. package/dist/core/docs/zip.js.map +1 -1
  90. package/dist/core/evidence.js +17 -7
  91. package/dist/core/evidence.js.map +1 -1
  92. package/dist/core/failure-message.js +35 -13
  93. package/dist/core/failure-message.js.map +1 -1
  94. package/dist/core/failure.js +49 -14
  95. package/dist/core/failure.js.map +1 -1
  96. package/dist/core/github.js +3 -1
  97. package/dist/core/github.js.map +1 -1
  98. package/dist/core/handoff.js +20 -7
  99. package/dist/core/handoff.js.map +1 -1
  100. package/dist/core/heldout-run.js +6 -3
  101. package/dist/core/heldout-run.js.map +1 -1
  102. package/dist/core/heldout.js +24 -13
  103. package/dist/core/heldout.js.map +1 -1
  104. package/dist/core/inbox.js +3 -1
  105. package/dist/core/inbox.js.map +1 -1
  106. package/dist/core/inputs.js +76 -0
  107. package/dist/core/inputs.js.map +1 -0
  108. package/dist/core/inspect.js +61 -20
  109. package/dist/core/inspect.js.map +1 -1
  110. package/dist/core/intent.js +50 -12
  111. package/dist/core/intent.js.map +1 -1
  112. package/dist/core/knowledge-find.js +31 -12
  113. package/dist/core/knowledge-find.js.map +1 -1
  114. package/dist/core/knowledge.js +22 -12
  115. package/dist/core/knowledge.js.map +1 -1
  116. package/dist/core/lang.js +5 -2
  117. package/dist/core/lang.js.map +1 -1
  118. package/dist/core/ledger.js +44 -20
  119. package/dist/core/ledger.js.map +1 -1
  120. package/dist/core/locations.js +12 -0
  121. package/dist/core/locations.js.map +1 -0
  122. package/dist/core/map/imports.js +20 -9
  123. package/dist/core/map/imports.js.map +1 -1
  124. package/dist/core/map/index.js +28 -13
  125. package/dist/core/map/index.js.map +1 -1
  126. package/dist/core/map/symbols.js +27 -12
  127. package/dist/core/map/symbols.js.map +1 -1
  128. package/dist/core/output-capture.js +7 -4
  129. package/dist/core/output-capture.js.map +1 -1
  130. package/dist/core/paths.js +2 -1
  131. package/dist/core/paths.js.map +1 -1
  132. package/dist/core/performance.js +43 -17
  133. package/dist/core/performance.js.map +1 -1
  134. package/dist/core/profile.js +6 -3
  135. package/dist/core/profile.js.map +1 -1
  136. package/dist/core/reader.js +32 -16
  137. package/dist/core/reader.js.map +1 -1
  138. package/dist/core/readerSession.js +34 -14
  139. package/dist/core/readerSession.js.map +1 -1
  140. package/dist/core/recent.js +20 -6
  141. package/dist/core/recent.js.map +1 -1
  142. package/dist/core/regress.js +21 -12
  143. package/dist/core/regress.js.map +1 -1
  144. package/dist/core/repair.js +22 -4
  145. package/dist/core/repair.js.map +1 -1
  146. package/dist/core/research-queries.js +85 -0
  147. package/dist/core/research-queries.js.map +1 -0
  148. package/dist/core/research.js +89 -88
  149. package/dist/core/research.js.map +1 -1
  150. package/dist/core/results.js +89 -0
  151. package/dist/core/results.js.map +1 -0
  152. package/dist/core/risk-signals.js +55 -16
  153. package/dist/core/risk-signals.js.map +1 -1
  154. package/dist/core/run-id.js +10 -6
  155. package/dist/core/run-id.js.map +1 -1
  156. package/dist/core/scenarios.js +97 -57
  157. package/dist/core/scenarios.js.map +1 -1
  158. package/dist/core/session.js +3 -2
  159. package/dist/core/session.js.map +1 -1
  160. package/dist/core/size-gate.js +57 -0
  161. package/dist/core/size-gate.js.map +1 -0
  162. package/dist/core/size.js +32 -10
  163. package/dist/core/size.js.map +1 -1
  164. package/dist/core/skills.js +66 -28
  165. package/dist/core/skills.js.map +1 -1
  166. package/dist/core/skillsmp.js +26 -12
  167. package/dist/core/skillsmp.js.map +1 -1
  168. package/dist/core/source-basis.js +21 -9
  169. package/dist/core/source-basis.js.map +1 -1
  170. package/dist/core/status.js +26 -13
  171. package/dist/core/status.js.map +1 -1
  172. package/dist/core/table.js +8 -1
  173. package/dist/core/table.js.map +1 -1
  174. package/dist/core/tokens.js +20 -10
  175. package/dist/core/tokens.js.map +1 -1
  176. package/dist/core/tree.js +26 -16
  177. package/dist/core/tree.js.map +1 -1
  178. package/dist/core/verification-plan.js +26 -10
  179. package/dist/core/verification-plan.js.map +1 -1
  180. package/dist/core/verification.js +14 -7
  181. package/dist/core/verification.js.map +1 -1
  182. package/dist/core/view.js +93 -44
  183. package/dist/core/view.js.map +1 -1
  184. package/dist/install/global.js +37 -18
  185. package/dist/install/global.js.map +1 -1
  186. package/dist/install/hooks.js +17 -8
  187. package/dist/install/hooks.js.map +1 -1
  188. package/dist/install/manifest.js +11 -0
  189. package/dist/install/manifest.js.map +1 -0
  190. package/dist/install/mcpb.js +52 -23
  191. package/dist/install/mcpb.js.map +1 -1
  192. package/dist/install/plugin.js +73 -33
  193. package/dist/install/plugin.js.map +1 -1
  194. package/dist/install/project.js +8 -7
  195. package/dist/install/project.js.map +1 -1
  196. package/dist/install/register.js +83 -48
  197. package/dist/install/register.js.map +1 -1
  198. package/dist/install/tree.js +27 -11
  199. package/dist/install/tree.js.map +1 -1
  200. package/dist/install/update.js +46 -20
  201. package/dist/install/update.js.map +1 -1
  202. package/hooks/code-map.cjs +22 -9
  203. package/hooks/file-size.cjs +83 -0
  204. package/hooks/journal.cjs +28 -18
  205. package/hooks/knowledge-auto.cjs +55 -21
  206. package/hooks/knowledge-journal.cjs +47 -20
  207. package/hooks/knowledge-projects.cjs +50 -21
  208. package/hooks/knowledge-recall.cjs +16 -6
  209. package/hooks/knowledge-upkeep.cjs +22 -5
  210. package/hooks/locations.cjs +35 -0
  211. package/hooks/notify.js +52 -24
  212. package/hooks/obsidian.cjs +17 -7
  213. package/hooks/private-store.cjs +25 -10
  214. package/hooks/retest.cjs +39 -16
  215. package/hooks/session-context.cjs +30 -13
  216. package/hooks/session-files.cjs +44 -21
  217. package/hooks/session-repair.cjs +26 -11
  218. package/hooks/session-state.cjs +78 -38
  219. package/hooks/session.js +19 -8
  220. package/hooks/slice-command.cjs +38 -17
  221. package/hooks/slice-guard.cjs +20 -6
  222. package/hooks/slice-store.cjs +25 -12
  223. package/internal/guides/code.md +17 -0
  224. package/mcpb/server/index.js +40 -12
  225. package/package.json +1 -1
@@ -3,7 +3,10 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import { packageRoot } from '../core/paths.js';
5
5
  import { ensureDir, readJson, writeAtomic, writeJson } from '../core/store.js';
6
- import { pluginTree } from './tree.js';
6
+ import { packageVersion } from './manifest.js';
7
+ import { CODEX_HOOKS_FILE, CODEX_MANIFEST_FILE, MARKETPLACE_NAME, PLUGIN_NAME, pluginTree } from './tree.js';
8
+ export { MARKETPLACE_NAME };
9
+ import { vibeConfig, FOLDERS, AGENTS_DIR } from '../core/locations.js';
7
10
  /**
8
11
  * OpenAI plugin for Codex CLI and ChatGPT desktop — one tree, one personal marketplace.
9
12
  *
@@ -11,25 +14,55 @@ import { pluginTree } from './tree.js';
11
14
  * 300MB into the Codex cache because the whole package was the plugin; here the plugin is only the
12
15
  * manifest, the single entry skill and the notification hooks.
13
16
  */
14
- const SKILL_NAMES = ['vibe'];
15
- const HOOK_FILES = ['notify.js', 'session.js', 'code-map.cjs', 'private-store.cjs', 'session-files.cjs', 'session-state.cjs', 'session-context.cjs', 'session-repair.cjs', 'knowledge-auto.cjs', 'knowledge-projects.cjs', 'knowledge-lint.cjs', 'knowledge-upkeep.cjs', 'knowledge-journal.cjs', 'knowledge-recall.cjs', 'retest.cjs', 'journal.cjs', 'obsidian.cjs', 'slice-command.cjs', 'slice-store.cjs', 'slice-guard.cjs'];
16
- export const MARKETPLACE_NAME = 'vibe-local';
17
+ const MARKETPLACE_DISPLAY_NAME = 'Vibe (local)';
18
+ const SKILL_NAMES = [PLUGIN_NAME];
19
+ const SKILLS_DIR = 'skills';
20
+ const CARD_FILE = 'card.md';
21
+ const TREE_PACKAGE_JSON = 'package.json';
22
+ const README_FILE = 'README.md';
23
+ const LEGACY_STORE_DIR = '.vibe';
24
+ const TREE_DIR = 'vibe';
25
+ const LANGUAGE_PACK_PREFIX = 'antislop-';
26
+ const HOOK_FILES = [
27
+ 'notify.js',
28
+ 'session.js',
29
+ 'code-map.cjs',
30
+ 'private-store.cjs',
31
+ 'session-files.cjs',
32
+ 'session-state.cjs',
33
+ 'session-context.cjs',
34
+ 'session-repair.cjs',
35
+ 'knowledge-auto.cjs',
36
+ 'knowledge-projects.cjs',
37
+ 'knowledge-lint.cjs',
38
+ 'knowledge-upkeep.cjs',
39
+ 'knowledge-journal.cjs',
40
+ 'knowledge-recall.cjs',
41
+ 'file-size.cjs',
42
+ 'locations.cjs',
43
+ 'retest.cjs',
44
+ 'journal.cjs',
45
+ 'obsidian.cjs',
46
+ 'slice-command.cjs',
47
+ 'slice-store.cjs',
48
+ 'slice-guard.cjs',
49
+ ];
17
50
  /** The tree lives under ~/.config/vibe so that `.vibe/` keeps one meaning: a project's records. ≤ 4.1.7 put it at ~/.vibe/plugin. */
18
51
  export function pluginPaths(home = os.homedir()) {
19
52
  return {
20
53
  home,
21
- tree: path.join(home, '.config', 'vibe', 'plugin', 'vibe'),
22
- marketplace: path.join(home, '.agents', 'plugins', 'marketplace.json'),
54
+ tree: vibeConfig(home, FOLDERS.plugin, TREE_DIR),
55
+ marketplace: path.join(home, AGENTS_DIR, 'plugins', 'marketplace.json'),
23
56
  };
24
57
  }
25
58
  /** Remove the ≤ 4.1.7 store at ~/.vibe/plugin, and ~/.vibe itself once empty, so the home never looks like a project. */
26
59
  export function sweepLegacyPluginStore(home = os.homedir()) {
27
- const legacy = path.join(home, '.vibe', 'plugin');
60
+ const legacy = path.join(home, LEGACY_STORE_DIR, 'plugin');
28
61
  if (!fs.existsSync(legacy))
29
62
  return [];
30
63
  fs.rmSync(legacy, { recursive: true, force: true });
31
64
  const removed = [legacy];
32
- const dotVibe = path.join(home, '.vibe');
65
+ const dotVibe = path.join(home, LEGACY_STORE_DIR);
33
66
  if (fs.readdirSync(dotVibe).length === 0) {
34
67
  fs.rmSync(dotVibe, { recursive: true, force: true });
35
68
  removed.push(dotVibe);
@@ -39,18 +72,24 @@ export function sweepLegacyPluginStore(home = os.homedir()) {
39
72
  /** Internal legacy language packs: `skills/antislop-*`, each with `reviewers/<lang>/` prompts. */
40
73
  export function languagePacks() {
41
74
  const dir = path.join(packageRoot(), 'internal', 'skills');
42
- return fs.existsSync(dir) ? fs.readdirSync(dir).filter((n) => n.startsWith('antislop-')).sort() : [];
43
- }
44
- function packageVersion() {
45
- return readJson(path.join(packageRoot(), 'package.json'))?.version ?? '0.0.0';
75
+ return fs.existsSync(dir) ? fs.readdirSync(dir).filter((n) => n.startsWith(LANGUAGE_PACK_PREFIX)).sort() : [];
46
76
  }
47
77
  function copyHookAssets(tree) {
48
78
  const files = HOOK_FILES.map(file => `hooks/${file}`);
49
- files.push('card.md');
79
+ files.push(CARD_FILE);
50
80
  for (const file of files)
51
81
  fs.copyFileSync(path.join(packageRoot(), file), path.join(tree, file));
52
- writeJson(path.join(tree, 'package.json'), { private: true, type: 'module' });
53
- return [...files, 'package.json'];
82
+ writeJson(path.join(tree, TREE_PACKAGE_JSON), { private: true, type: 'module' });
83
+ return [...files, TREE_PACKAGE_JSON];
84
+ }
85
+ function treeReadme(version) {
86
+ return [
87
+ `# vibe ${version}`,
88
+ '',
89
+ 'Assembled by `vibe plugin install`. Do not edit — rerun the command instead.',
90
+ 'SessionStart and Stop use packaged status readers. Run `vibe session bind` in the intended worktree; completion requires an explicit `vibe check`.',
91
+ '',
92
+ ].join('\n');
54
93
  }
55
94
  /** Rebuild the tree from scratch — a stale file in the cache is worse than a slow install. */
56
95
  export function assemblePlugin(tree) {
@@ -59,35 +98,35 @@ export function assemblePlugin(tree) {
59
98
  const written = [];
60
99
  const version = packageVersion();
61
100
  const generated = pluginTree();
62
- writeAtomic(path.join(tree, '.codex-plugin', 'plugin.json'), generated['.codex-plugin/plugin.json']);
63
- written.push('.codex-plugin/plugin.json');
101
+ writeAtomic(path.join(tree, CODEX_MANIFEST_FILE), generated[CODEX_MANIFEST_FILE]);
102
+ written.push(CODEX_MANIFEST_FILE);
64
103
  for (const name of SKILL_NAMES) {
65
- const from = path.join(packageRoot(), 'skills', name);
104
+ const from = path.join(packageRoot(), SKILLS_DIR, name);
66
105
  if (!fs.existsSync(from))
67
106
  continue;
68
- fs.cpSync(from, path.join(tree, 'skills', name), { recursive: true });
69
- written.push(`skills/${name}`);
107
+ fs.cpSync(from, path.join(tree, SKILLS_DIR, name), { recursive: true });
108
+ written.push(`${SKILLS_DIR}/${name}`);
70
109
  }
71
- writeAtomic(path.join(tree, 'hooks', 'codex-hooks.json'), generated['hooks/codex-hooks.json']);
72
- written.push('hooks/codex-hooks.json');
110
+ writeAtomic(path.join(tree, CODEX_HOOKS_FILE), generated[CODEX_HOOKS_FILE]);
111
+ written.push(CODEX_HOOKS_FILE);
73
112
  written.push(...copyHookAssets(tree));
74
- fs.writeFileSync(path.join(tree, 'README.md'), `# vibe ${version}\n\nAssembled by \`vibe plugin install\`. Do not edit — rerun the command instead.\nSessionStart and Stop use packaged status readers. Run \`vibe session bind\` in the intended worktree; completion requires an explicit \`vibe check\`.\n`, 'utf-8');
75
- written.push('README.md');
113
+ fs.writeFileSync(path.join(tree, README_FILE), treeReadme(version), 'utf-8');
114
+ written.push(README_FILE);
76
115
  return written;
77
116
  }
78
117
  /** Register the tree in the personal marketplace Codex and ChatGPT desktop both read. Other plugins are kept. */
79
118
  export function writeMarketplace(paths) {
80
119
  const doc = readJson(paths.marketplace) ?? {};
81
120
  doc.name ??= MARKETPLACE_NAME;
82
- doc.interface ??= { displayName: 'Vibe (local)' };
121
+ doc.interface ??= { displayName: MARKETPLACE_DISPLAY_NAME };
83
122
  const plugins = Array.isArray(doc.plugins) ? doc.plugins : [];
84
123
  const entry = {
85
- name: 'vibe',
124
+ name: PLUGIN_NAME,
86
125
  source: { source: 'local', path: `./${path.relative(paths.home, paths.tree).replace(/\\/g, '/')}` },
87
126
  policy: { installation: 'AVAILABLE', authentication: 'ON_INSTALL' },
88
127
  category: 'Developer Tools',
89
128
  };
90
- const index = plugins.findIndex((p) => p?.name === 'vibe');
129
+ const index = plugins.findIndex((p) => p?.name === PLUGIN_NAME);
91
130
  if (index === -1)
92
131
  plugins.push(entry);
93
132
  else
@@ -109,7 +148,7 @@ export function installPlugin(home) {
109
148
  version: packageVersion(),
110
149
  next: [
111
150
  `codex plugin marketplace add ${paths.home}`,
112
- `codex plugin add vibe@${marketplaceName}`,
151
+ `codex plugin add ${PLUGIN_NAME}@${marketplaceName}`,
113
152
  'ChatGPT desktop reads the same marketplace file — restart the app to see the plugin',
114
153
  ],
115
154
  };
@@ -122,12 +161,13 @@ function marketplaceTarget(paths, entry) {
122
161
  export function pluginStatus(home) {
123
162
  const paths = pluginPaths(home);
124
163
  const exists = fs.existsSync(paths.tree);
125
- const manifestVersion = readJson(path.join(paths.tree, '.codex-plugin', 'plugin.json'))?.version ?? null;
164
+ const manifestVersion = readJson(path.join(paths.tree, CODEX_MANIFEST_FILE))?.version ?? null;
126
165
  const version = packageVersion();
127
- const skillsDir = path.join(paths.tree, 'skills');
128
- const skills = fs.existsSync(skillsDir) ? fs.readdirSync(skillsDir).filter((n) => n === 'vibe' || n.startsWith('vibe-')).length : 0;
129
- const hooks = ['codex-hooks.json', ...HOOK_FILES].every(file => fs.existsSync(path.join(paths.tree, 'hooks', file)));
130
- const entry = readJson(paths.marketplace)?.plugins?.find((p) => p?.name === 'vibe');
166
+ const skillsDir = path.join(paths.tree, SKILLS_DIR);
167
+ const isSkill = (n) => n === PLUGIN_NAME || n.startsWith(`${PLUGIN_NAME}-`);
168
+ const skills = fs.existsSync(skillsDir) ? fs.readdirSync(skillsDir).filter(isSkill).length : 0;
169
+ const hooks = [path.basename(CODEX_HOOKS_FILE), ...HOOK_FILES].every(file => fs.existsSync(path.join(paths.tree, 'hooks', file)));
170
+ const entry = readJson(paths.marketplace)?.plugins?.find((p) => p?.name === PLUGIN_NAME);
131
171
  const registered = entry !== undefined;
132
172
  const pointsAt = marketplaceTarget(paths, entry);
133
173
  const drift = [];
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/install/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/install/plugin.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,12 @@ import { record } from '../core/ledger.js';
8
8
  import { isProjectDir, projectBoundaries, vibePath } from '../core/paths.js';
9
9
  import { emptyState, readState, statePath } from '../core/state.js';
10
10
  import { ensureDir, writeAtomic, writeJson } from '../core/store.js';
11
+ const PROJECT_DIRS = ['', 'evidence', 'knowledge', 'knowledge/research', 'regressions'];
12
+ const PROJECT_SEEDS = [
13
+ ['intent.md', ''],
14
+ ['scenarios.yaml', '[]\n'],
15
+ ['results.json', '{}\n'],
16
+ ];
11
17
  /**
12
18
  * `.vibe/` is the only thing vibe puts inside a repository: the state that is also the handoff.
13
19
  * There is no init command — the first command that writes a record creates it.
@@ -23,19 +29,14 @@ export function ensureProject(root) {
23
29
  }
24
30
  const fresh = !hasProject(root);
25
31
  const created = [];
26
- for (const dir of ['', 'evidence', 'knowledge', 'knowledge/research', 'regressions']) {
32
+ for (const dir of PROJECT_DIRS) {
27
33
  const target = vibePath(root, dir);
28
34
  if (!fs.existsSync(target)) {
29
35
  ensureDir(target);
30
36
  created.push(path.relative(root, target));
31
37
  }
32
38
  }
33
- const seeds = [
34
- ['intent.md', ''],
35
- ['scenarios.yaml', '[]\n'],
36
- ['results.json', '{}\n'],
37
- ];
38
- for (const [name, body] of seeds) {
39
+ for (const [name, body] of PROJECT_SEEDS) {
39
40
  const target = vibePath(root, name);
40
41
  if (!fs.existsSync(target)) {
41
42
  writeAtomic(target, body);
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/install/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/install/project.ts"],"names":[],"mappings":"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"}
@@ -4,39 +4,59 @@ import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { packageRoot } from '../core/paths.js';
6
6
  import { readJson, writeJson } from '../core/store.js';
7
+ import { PACKAGE_MANIFEST, packageVersion } from './manifest.js';
7
8
  import { installPlugin, MARKETPLACE_NAME, pluginPaths, pluginStatus } from './plugin.js';
9
+ import { CODEX_HOOKS_FILE, CODEX_MANIFEST_FILE, PLUGIN_NAME } from './tree.js';
8
10
  import { newer } from './update.js';
11
+ import { claudeHome, codexHome, codexConfig, codexHooks } from '../core/locations.js';
9
12
  const MARKETPLACE = MARKETPLACE_NAME;
10
13
  const PLUGIN_ID = `vibe@${MARKETPLACE}`;
11
14
  const LEGACY_ID = 'vibe@vibe';
15
+ const LEGACY_MARKETPLACE = 'vibe';
16
+ const PLUGINS_DIR = 'plugins';
17
+ const PACKAGE_NAME = '@su-record/vibe';
18
+ const CLAUDE_CLI = 'claude';
19
+ const CODEX_CLI = 'codex';
20
+ const CLI_RUN_TIMEOUT_MS = 2 * 60 * 1000;
21
+ const CLI_PROBE_TIMEOUT_MS = 15 * 1000;
22
+ const ERROR_TAIL_CHARS = 200;
23
+ const VERSION_DIR = /^\d+\.\d+\.\d+/;
24
+ const INSTALLED_PLUGINS_FILE = 'installed_plugins.json';
25
+ const KNOWN_MARKETPLACES_FILE = 'known_marketplaces.json';
26
+ const CLAUDE_MANIFEST_DIR = '.claude-plugin';
27
+ const MARKETPLACE_FILE = 'marketplace.json';
28
+ const CODEX_HOOK_EVENTS = ['session_start', 'pre_tool_use', 'post_tool_use', 'stop'];
29
+ const CODEX_SNAPSHOT_PREFIX = 'vibe-codex-held-';
30
+ const CLAUDE_SNAPSHOT_PREFIX = 'vibe-claude-held-';
12
31
  function run(cmd, args, home) {
13
- const r = spawnSync(cmd, args, { encoding: 'utf-8', timeout: 120_000, env: { ...process.env, HOME: home, USERPROFILE: home }, shell: process.platform === 'win32' });
32
+ const env = { ...process.env, HOME: home, USERPROFILE: home };
33
+ const r = spawnSync(cmd, args, { encoding: 'utf-8', timeout: CLI_RUN_TIMEOUT_MS, env, shell: process.platform === 'win32' });
14
34
  return { ok: r.status === 0, out: `${r.stdout ?? ''}${r.stderr ?? ''}`.trim() };
15
35
  }
16
36
  export function cliAvailable(name) {
17
37
  if (process.env['VIBE_NO_PLUGIN'])
18
38
  return false;
19
- const r = spawnSync(name, ['--version'], { encoding: 'utf-8', timeout: 15_000, shell: process.platform === 'win32' });
39
+ const r = spawnSync(name, ['--version'], { encoding: 'utf-8', timeout: CLI_PROBE_TIMEOUT_MS, shell: process.platform === 'win32' });
20
40
  return r.status === 0;
21
41
  }
22
- function packageVersion() {
23
- return readJson(path.join(packageRoot(), 'package.json'))?.version ?? '0.0.0';
24
- }
25
42
  function claudeVersion(home, id) {
26
- const doc = readJson(path.join(home, '.claude', 'plugins', 'installed_plugins.json'));
43
+ const doc = readJson(claudeHome(home, PLUGINS_DIR, INSTALLED_PLUGINS_FILE));
27
44
  return doc?.plugins?.[id]?.[0]?.version ?? null;
28
45
  }
29
46
  export function claudePluginVersion(home) {
30
47
  return claudeVersion(home, PLUGIN_ID) ?? claudeVersion(home, LEGACY_ID);
31
48
  }
32
49
  export function claudeNeedsMigration(home) {
33
- const doc = readJson(path.join(home, '.claude', 'plugins', 'installed_plugins.json'));
50
+ const doc = readJson(claudeHome(home, PLUGINS_DIR, INSTALLED_PLUGINS_FILE));
34
51
  return doc?.plugins?.[LEGACY_ID]?.some(p => p.scope === 'user') ?? false;
35
52
  }
53
+ function isMarketplaceManifest(file) {
54
+ return path.basename(file) === MARKETPLACE_FILE && path.basename(path.dirname(file)) === CLAUDE_MANIFEST_DIR;
55
+ }
36
56
  function claudeMarketplacePath(home, name = MARKETPLACE) {
37
- const doc = readJson(path.join(home, '.claude', 'plugins', 'known_marketplaces.json'));
57
+ const doc = readJson(claudeHome(home, PLUGINS_DIR, KNOWN_MARKETPLACES_FILE));
38
58
  const source = doc?.[name]?.source;
39
- if (source?.source === 'file' && source.path && path.basename(source.path) === 'marketplace.json' && path.basename(path.dirname(source.path)) === '.claude-plugin')
59
+ if (source?.source === 'file' && source.path && isMarketplaceManifest(source.path))
40
60
  return path.dirname(path.dirname(source.path));
41
61
  return source?.path ?? null;
42
62
  }
@@ -44,8 +64,8 @@ function claudeMarketplacePath(home, name = MARKETPLACE) {
44
64
  function vibeVersionAt(dir) {
45
65
  if (!dir)
46
66
  return null;
47
- const pkg = readJson(path.join(dir, 'package.json'));
48
- return pkg?.name === '@su-record/vibe' && typeof pkg.version === 'string' ? pkg.version : null;
67
+ const pkg = readJson(path.join(dir, PACKAGE_MANIFEST));
68
+ return pkg?.name === PACKAGE_NAME && typeof pkg.version === 'string' ? pkg.version : null;
49
69
  }
50
70
  /**
51
71
  * Highest version wins: a marketplace that already points at another vibe install of a version
@@ -53,7 +73,7 @@ function vibeVersionAt(dir) {
53
73
  * checkout and a global install stop re-registering each other on every command.
54
74
  */
55
75
  export function claudeHeldElsewhere(home, root = packageRoot()) {
56
- const at = claudeMarketplacePath(home) ?? claudeMarketplacePath(home, 'vibe');
76
+ const at = claudeMarketplacePath(home) ?? claudeMarketplacePath(home, LEGACY_MARKETPLACE);
57
77
  if (!at || path.resolve(at) === path.resolve(root))
58
78
  return null;
59
79
  const theirs = vibeVersionAt(at);
@@ -63,6 +83,9 @@ export function claudeHeldElsewhere(home, root = packageRoot()) {
63
83
  return null;
64
84
  return claudePluginVersion(home) === theirs ? { at, version: theirs } : null;
65
85
  }
86
+ function claudeFailure(home, detail, version = claudePluginVersion(home)) {
87
+ return { ok: false, mode: claudePluginVersion(home) ? 'plugin' : 'home', version, detail };
88
+ }
66
89
  /** Point the `vibe-local` marketplace at this package and install/update the plugin. Idempotent: nothing runs when current. */
67
90
  export function registerClaude(home, root = packageRoot()) {
68
91
  const want = packageVersion();
@@ -71,39 +94,46 @@ export function registerClaude(home, root = packageRoot()) {
71
94
  if (installed === want && at === root && !claudeNeedsMigration(home))
72
95
  return { ok: true, mode: 'plugin', version: installed, detail: 'current' };
73
96
  const elsewhere = claudeHeldElsewhere(home, root);
74
- if (elsewhere && (!claudeNeedsMigration(home) || newer(elsewhere.version, want)))
97
+ if (elsewhere && (!claudeNeedsMigration(home) || newer(elsewhere.version, want))) {
75
98
  return { ok: true, mode: 'plugin', version: elsewhere.version, detail: `current — ${elsewhere.version} at ${elsewhere.at}` };
99
+ }
76
100
  if (at !== null && at !== root)
77
- run('claude', ['plugin', 'marketplace', 'remove', MARKETPLACE], home);
101
+ run(CLAUDE_CLI, ['plugin', 'marketplace', 'remove', MARKETPLACE], home);
78
102
  if (at !== root) {
79
103
  // Claude deduplicates directory sources by path, retaining the former marketplace name.
80
104
  // A manifest file is a distinct source; preserve the old registration and live caches.
81
- const source = claudeMarketplacePath(home, 'vibe') === root ? path.join(root, '.claude-plugin', 'marketplace.json') : root;
82
- const add = run('claude', ['plugin', 'marketplace', 'add', source, '--scope', 'user'], home);
105
+ const manifest = path.join(root, CLAUDE_MANIFEST_DIR, MARKETPLACE_FILE);
106
+ const source = claudeMarketplacePath(home, LEGACY_MARKETPLACE) === root ? manifest : root;
107
+ const add = run(CLAUDE_CLI, ['plugin', 'marketplace', 'add', source, '--scope', 'user'], home);
83
108
  if (!add.ok)
84
- return { ok: false, mode: claudePluginVersion(home) ? 'plugin' : 'home', version: claudePluginVersion(home), detail: `marketplace add failed: ${add.out.slice(-200)}` };
109
+ return claudeFailure(home, `marketplace add failed: ${add.out.slice(-ERROR_TAIL_CHARS)}`);
85
110
  }
86
- const step = installed === want && at === root ? { ok: true, out: '' } : installed ? run('claude', ['plugin', 'update', PLUGIN_ID], home) : run('claude', ['plugin', 'install', PLUGIN_ID, '--scope', 'user'], home);
111
+ const step = installed === want && at === root ? { ok: true, out: '' } : installClaudePlugin(home, installed);
87
112
  if (!step.ok)
88
- return { ok: false, mode: claudePluginVersion(home) ? 'plugin' : 'home', version: claudePluginVersion(home), detail: `plugin ${installed ? 'update' : 'install'} failed: ${step.out.slice(-200)}` };
113
+ return claudeFailure(home, `plugin ${installed ? 'update' : 'install'} failed: ${step.out.slice(-ERROR_TAIL_CHARS)}`);
89
114
  const now = claudeVersion(home, PLUGIN_ID);
90
115
  if (now !== want)
91
- return { ok: false, mode: claudePluginVersion(home) ? 'plugin' : 'home', version: now, detail: `plugin verification failed: expected ${want}, found ${now ?? 'none'}` };
116
+ return claudeFailure(home, `plugin verification failed: expected ${want}, found ${now ?? 'none'}`, now);
92
117
  const error = retireLegacyClaude(home);
93
118
  if (error)
94
119
  return { ok: false, mode: 'plugin', version: now, detail: error };
95
120
  return { ok: true, mode: 'plugin', version: now, detail: installed ? `updated ${installed} → ${now}` : `installed ${now}` };
96
121
  }
122
+ function installClaudePlugin(home, installed) {
123
+ return installed
124
+ ? run(CLAUDE_CLI, ['plugin', 'update', PLUGIN_ID], home)
125
+ : run(CLAUDE_CLI, ['plugin', 'install', PLUGIN_ID, '--scope', 'user'], home);
126
+ }
97
127
  /** Keep old cached hook paths alive for sessions that started before the namespace changed. */
98
128
  function retireLegacyClaude(home) {
99
129
  if (claudeNeedsMigration(home)) {
100
- const cache = path.join(home, '.claude', 'plugins', 'cache', 'vibe', 'vibe');
101
- const snapshot = fs.existsSync(cache) ? fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-claude-held-')) : null;
130
+ const cache = claudeHome(home, PLUGINS_DIR, 'cache', LEGACY_MARKETPLACE, PLUGIN_NAME);
131
+ const snapshot = fs.existsSync(cache) ? fs.mkdtempSync(path.join(os.tmpdir(), CLAUDE_SNAPSHOT_PREFIX)) : null;
102
132
  if (snapshot)
103
133
  fs.cpSync(cache, snapshot, { recursive: true });
104
134
  let result;
105
135
  try {
106
- result = run('claude', ['plugin', 'uninstall', LEGACY_ID, '--scope', 'user'], home);
136
+ result = run(CLAUDE_CLI, ['plugin', 'uninstall', LEGACY_ID, '--scope', 'user'], home);
107
137
  }
108
138
  finally {
109
139
  if (snapshot) {
@@ -112,7 +142,7 @@ function retireLegacyClaude(home) {
112
142
  }
113
143
  }
114
144
  if (!result.ok || claudeNeedsMigration(home))
115
- return `legacy plugin removal failed: ${result.out.slice(-200)}`;
145
+ return `legacy plugin removal failed: ${result.out.slice(-ERROR_TAIL_CHARS)}`;
116
146
  }
117
147
  // Leave the old marketplace registered: it may serve other plugins/scopes, and removing
118
148
  // it may delete cached hooks still used by running sessions. It exposes no uninstalled skill.
@@ -121,10 +151,12 @@ function retireLegacyClaude(home) {
121
151
  export function unregisterClaude(home) {
122
152
  const removed = [];
123
153
  for (const id of [PLUGIN_ID, LEGACY_ID]) {
124
- if (claudeVersion(home, id) !== null && run('claude', ['plugin', 'uninstall', id, '--scope', 'user'], home).ok)
154
+ const uninstalled = claudeVersion(home, id) !== null && run(CLAUDE_CLI, ['plugin', 'uninstall', id, '--scope', 'user'], home).ok;
155
+ if (uninstalled)
125
156
  removed.push(`claude plugin ${id}`);
126
157
  }
127
- if (claudeMarketplacePath(home) !== null && run('claude', ['plugin', 'marketplace', 'remove', MARKETPLACE], home).ok)
158
+ const unlisted = claudeMarketplacePath(home) !== null && run(CLAUDE_CLI, ['plugin', 'marketplace', 'remove', MARKETPLACE], home).ok;
159
+ if (unlisted)
128
160
  removed.push(`claude marketplace ${MARKETPLACE}`);
129
161
  return removed;
130
162
  }
@@ -137,16 +169,15 @@ function marketplaceName(home) {
137
169
  * the highest when several are present, null when Codex holds none — a reading, not the package version.
138
170
  */
139
171
  export function codexPluginVersion(home) {
140
- const dir = path.join(home, '.codex', 'plugins', 'cache', marketplaceName(home), 'vibe');
172
+ const dir = codexHome(home, PLUGINS_DIR, 'cache', marketplaceName(home), PLUGIN_NAME);
141
173
  if (!fs.existsSync(dir))
142
174
  return null;
143
175
  const versions = fs
144
176
  .readdirSync(dir)
145
- .filter((v) => /^\d+\.\d+\.\d+/.test(v) && fs.existsSync(path.join(dir, v, '.codex-plugin', 'plugin.json')))
177
+ .filter((v) => VERSION_DIR.test(v) && fs.existsSync(path.join(dir, v, CODEX_MANIFEST_FILE)))
146
178
  .sort((a, b) => (newer(a, b) ? -1 : newer(b, a) ? 1 : 0));
147
179
  return versions[0] ?? null;
148
180
  }
149
- /** An assembled tree alone does not prove Codex has installed it. */
150
181
  /** Highest version wins for Codex too: a tree assembled by a newer install, which Codex holds, is not torn down by an older binary. */
151
182
  export function codexHeldNewer(home) {
152
183
  const s = pluginStatus(home);
@@ -164,7 +195,7 @@ export function codexHeldNewer(home) {
164
195
  export function codexHooksTrusted(home) {
165
196
  let toml = '';
166
197
  try {
167
- toml = fs.readFileSync(path.join(home, '.codex', 'config.toml'), 'utf-8');
198
+ toml = fs.readFileSync(codexConfig(home), 'utf-8');
168
199
  }
169
200
  catch {
170
201
  return null;
@@ -172,9 +203,8 @@ export function codexHooksTrusted(home) {
172
203
  const keys = [...toml.matchAll(/^\[hooks\.state\."([^"]+)"\]/gm)].map((m) => m[1] ?? '');
173
204
  if (keys.length === 0)
174
205
  return null;
175
- const sources = [`vibe@${marketplaceName(home)}:hooks/codex-hooks.json`, path.join(home, '.codex', 'hooks.json')];
176
- const events = ['session_start', 'pre_tool_use', 'post_tool_use', 'stop'];
177
- return sources.some((src) => events.every((ev) => keys.some((k) => k.startsWith(`${src}:${ev}:`))));
206
+ const sources = [`${PLUGIN_NAME}@${marketplaceName(home)}:${CODEX_HOOKS_FILE}`, codexHooks(home)];
207
+ return sources.some((src) => CODEX_HOOK_EVENTS.every((ev) => keys.some((k) => k.startsWith(`${src}:${ev}:`))));
178
208
  }
179
209
  export function codexRegistered(home) {
180
210
  if (codexHeldNewer(home))
@@ -185,7 +215,7 @@ export function codexRegistered(home) {
185
215
  const held = codexPluginVersion(home);
186
216
  return held === packageVersion();
187
217
  }
188
- const codexCacheDir = (home) => path.join(home, '.codex', 'plugins', 'cache', marketplaceName(home), 'vibe');
218
+ const codexCacheDir = (home) => codexHome(home, PLUGINS_DIR, 'cache', marketplaceName(home), PLUGIN_NAME);
189
219
  /**
190
220
  * A Codex or ChatGPT session resolves `${PLUGIN_ROOT}` once, at start, to the cache directory of the version it
191
221
  * found; `codex plugin remove` deletes that directory, and every hook of a session still running under the old
@@ -204,9 +234,9 @@ function snapshotVersions(home) {
204
234
  const from = codexCacheDir(home);
205
235
  if (!fs.existsSync(from))
206
236
  return null;
207
- const to = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-codex-held-'));
237
+ const to = fs.mkdtempSync(path.join(os.tmpdir(), CODEX_SNAPSHOT_PREFIX));
208
238
  for (const version of fs.readdirSync(from)) {
209
- if (/^\d+\.\d+\.\d+/.test(version))
239
+ if (VERSION_DIR.test(version))
210
240
  fs.cpSync(path.join(from, version), path.join(to, version), { recursive: true });
211
241
  }
212
242
  return to;
@@ -225,17 +255,18 @@ export function registerCodex(home) {
225
255
  return { ok: true, mode: 'plugin', version: packageVersion(), detail: 'current' };
226
256
  const held = codexPluginVersion(home);
227
257
  const r = installPlugin(home);
228
- const id = `vibe@${r.marketplaceName}`;
229
- const add = run('codex', ['plugin', 'marketplace', 'add', home], home);
258
+ const id = `${PLUGIN_NAME}@${r.marketplaceName}`;
259
+ const codexFailure = (detail) => ({ ok: false, mode: 'home', version: held, detail });
260
+ const add = run(CODEX_CLI, ['plugin', 'marketplace', 'add', home], home);
230
261
  if (!add.ok && !/already/i.test(add.out))
231
- return { ok: false, mode: 'home', version: held, detail: `codex marketplace add failed: ${add.out.slice(-200)}` };
262
+ return codexFailure(`codex marketplace add failed: ${add.out.slice(-ERROR_TAIL_CHARS)}`);
232
263
  const snapshot = snapshotVersions(home);
233
264
  let plug;
234
265
  try {
235
266
  if (held !== null)
236
- run('codex', ['plugin', 'remove', id], home);
267
+ run(CODEX_CLI, ['plugin', 'remove', id], home);
237
268
  restoreVersions(home, snapshot);
238
- plug = run('codex', ['plugin', 'add', id], home);
269
+ plug = run(CODEX_CLI, ['plugin', 'add', id], home);
239
270
  }
240
271
  finally {
241
272
  restoreVersions(home, snapshot);
@@ -243,23 +274,27 @@ export function registerCodex(home) {
243
274
  fs.rmSync(snapshot, { recursive: true, force: true });
244
275
  }
245
276
  if (!plug.ok)
246
- return { ok: false, mode: 'home', version: held, detail: `codex plugin add failed: ${plug.out.slice(-200)}` };
277
+ return codexFailure(`codex plugin add failed: ${plug.out.slice(-ERROR_TAIL_CHARS)}`);
247
278
  const observed = codexPluginVersion(home);
248
- if (observed !== r.version)
249
- return { ok: false, mode: 'plugin', version: observed, detail: `codex verification incomplete: expected ${r.version}, observed ${observed ?? 'unknown'}; inspect the client installation before retrying setup` };
250
- return { ok: true, mode: 'plugin', version: r.version, detail: held ? `updated ${held} → ${r.version}; a session started under ${held} keeps its hooks until it restarts` : `registered ${id}` };
279
+ if (observed !== r.version) {
280
+ const detail = `codex verification incomplete: expected ${r.version}, observed ${observed ?? 'unknown'}; `
281
+ + 'inspect the client installation before retrying setup';
282
+ return { ok: false, mode: 'plugin', version: observed, detail };
283
+ }
284
+ const detail = held ? `updated ${held} → ${r.version}; a session started under ${held} keeps its hooks until it restarts` : `registered ${id}`;
285
+ return { ok: true, mode: 'plugin', version: r.version, detail };
251
286
  }
252
287
  export function unregisterCodex(home) {
253
288
  const removed = [];
254
289
  const paths = pluginPaths(home);
255
290
  if (fs.existsSync(paths.tree)) {
256
- run('codex', ['plugin', 'remove', `vibe@${marketplaceName(home)}`], home);
291
+ run(CODEX_CLI, ['plugin', 'remove', `${PLUGIN_NAME}@${marketplaceName(home)}`], home);
257
292
  fs.rmSync(paths.tree, { recursive: true, force: true });
258
293
  removed.push(paths.tree);
259
294
  }
260
295
  const doc = readJson(paths.marketplace);
261
- if (doc?.plugins?.some((p) => p?.name === 'vibe')) {
262
- writeJson(paths.marketplace, { ...doc, plugins: doc.plugins.filter((p) => p?.name !== 'vibe') });
296
+ if (doc?.plugins?.some((p) => p?.name === PLUGIN_NAME)) {
297
+ writeJson(paths.marketplace, { ...doc, plugins: doc.plugins.filter((p) => p?.name !== PLUGIN_NAME) });
263
298
  removed.push(`${paths.marketplace} vibe entry`);
264
299
  }
265
300
  return removed;