convene-cli 1.0.1 → 1.0.3

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.
@@ -296,8 +296,28 @@ async function init(opts) {
296
296
  else {
297
297
  log('· CONVENE_PROTOCOL.md (exists — left as-is)');
298
298
  }
299
- // 7. hook
299
+ // 7. hook (global, per-machine — fires in every repo, no-op outside convene repos)
300
300
  registerHook(skipHook);
301
+ // 7a. committed project hook — the repo CARRIES the same `convene fetch` hook in
302
+ // .claude/settings.json, so a teammate who opens it auto-connects (Claude Code
303
+ // applies project hooks after a one-time trust prompt; identical command de-dups
304
+ // against the global hook, so no double-fire).
305
+ if (skipHook) {
306
+ log('Skipped committed project hook (--no-hook).');
307
+ }
308
+ else {
309
+ const r = (0, hook_1.ensureProjectHookRegistered)(top);
310
+ if (r === 'manual') {
311
+ log('· .claude/settings.json left as-is (existing settings unparseable).');
312
+ }
313
+ else {
314
+ log(`${r === 'registered' ? '✓' : '·'} .claude/settings.json (committed \`convene fetch\` hook — teammates auto-connect on open)`);
315
+ if ((0, git_1.gitPathIsIgnored)(top, node_path_1.default.join('.claude', 'settings.json'))) {
316
+ log(' ⚠ .claude/settings.json is git-ignored — commit it (or drop the .claude ignore) so teammates inherit the hook;');
317
+ log(' otherwise they connect via `convene setup`.');
318
+ }
319
+ }
320
+ }
301
321
  // 7b. committed git pre-push hook — the tool-agnostic backstop that auto-posts a
302
322
  // [STATUS] when work is pushed (fires for Codex/Cowork/humans, not just Claude).
303
323
  installGitHookStep(top, skipGithook);
@@ -62,6 +62,13 @@ async function join(opts) {
62
62
  : hook === 'already'
63
63
  ? 'Hook already registered.'
64
64
  : 'Could not auto-register the hook — run `convene doctor --fix` or add it manually.');
65
+ // Ensure the repo carries the committed `convene fetch` hook (.claude/settings.json)
66
+ // so the next teammate auto-connects on open. Idempotent; de-dups with the global hook.
67
+ if (top) {
68
+ const pr = (0, hook_1.ensureProjectHookRegistered)(top);
69
+ if (pr === 'registered')
70
+ log('Wrote committed project hook (.claude/settings.json) — commit it so teammates auto-connect.');
71
+ }
65
72
  // The tool-agnostic backstop: auto-post a [STATUS] when you push (works even
66
73
  // for tools without a per-prompt hook).
67
74
  if (top) {
package/dist/hook.js CHANGED
@@ -10,6 +10,8 @@ exports.hookIsRegistered = hookIsRegistered;
10
10
  exports.withHook = withHook;
11
11
  exports.serializeSettings = serializeSettings;
12
12
  exports.ensureHookRegistered = ensureHookRegistered;
13
+ exports.projectSettingsPath = projectSettingsPath;
14
+ exports.ensureProjectHookRegistered = ensureProjectHookRegistered;
13
15
  /**
14
16
  * Claude Code UserPromptSubmit hook registration in ~/.claude/settings.json.
15
17
  *
@@ -81,3 +83,33 @@ function ensureHookRegistered() {
81
83
  return 'manual';
82
84
  }
83
85
  }
86
+ /** The repo's COMMITTED, shared project settings file (vs settings.local.json, which is personal/gitignored). */
87
+ function projectSettingsPath(toplevel) {
88
+ return node_path_1.default.join(toplevel, '.claude', 'settings.json');
89
+ }
90
+ /**
91
+ * Ensure the SAME `convene fetch` hook in the repo's committed `.claude/settings.json`,
92
+ * so a teammate who opens the repo gets it automatically (Claude Code applies
93
+ * project hooks after a one-time per-repo trust prompt). Identical to the global
94
+ * hook command, so Claude Code de-dups them — no double-fire if both are present.
95
+ * Idempotent + merge-safe: never clobbers other project settings.
96
+ */
97
+ function ensureProjectHookRegistered(toplevel) {
98
+ const p = projectSettingsPath(toplevel);
99
+ const raw = readSettingsRaw(p);
100
+ const settings = parseSettings(raw);
101
+ if (settings === null)
102
+ return 'manual'; // unparseable — don't clobber
103
+ if (hookIsRegistered(settings))
104
+ return 'already';
105
+ try {
106
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(p), { recursive: true });
107
+ if (raw !== null)
108
+ node_fs_1.default.writeFileSync(p + '.bak', raw);
109
+ node_fs_1.default.writeFileSync(p, serializeSettings(withHook(settings)));
110
+ return 'registered';
111
+ }
112
+ catch {
113
+ return 'manual';
114
+ }
115
+ }
package/dist/index.js CHANGED
@@ -35,6 +35,8 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  })();
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
37
  /** Convene CLI entrypoint. */
38
+ const fs_1 = require("fs");
39
+ const path_1 = require("path");
38
40
  const commander_1 = require("commander");
39
41
  const brand_1 = require("./brand");
40
42
  const fetch_1 = require("./commands/fetch");
@@ -48,7 +50,11 @@ const setup_1 = require("./commands/setup");
48
50
  const migrate_1 = require("./commands/migrate");
49
51
  const rotate_1 = require("./commands/rotate");
50
52
  const program = new commander_1.Command();
51
- program.name(brand_1.BRAND.bin).description('Convene AI development coordination bus').version('1.0.0');
53
+ // Read the version from package.json so `convene --version` always tracks the
54
+ // published version (npm includes package.json in the tarball). dist/index.js
55
+ // sits one level below package.json; in dev (tsx) src/index.ts does too.
56
+ const { version } = JSON.parse((0, fs_1.readFileSync)((0, path_1.resolve)(__dirname, '../package.json'), 'utf8'));
57
+ program.name(brand_1.BRAND.bin).description('Convene — AI development coordination bus').version(version);
52
58
  program
53
59
  .command('login')
54
60
  .description('authenticate and save config (0600)')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "convene-cli",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Convene CLI — AI development coordination bus client + UserPromptSubmit hook. Install: npm i -g convene-cli; then `convene setup`.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://dev.convene.live",