contextgit 0.0.11 → 0.0.13

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 (51) hide show
  1. package/dist/agent-id.d.ts +6 -0
  2. package/dist/agent-id.d.ts.map +1 -0
  3. package/dist/agent-id.js +15 -0
  4. package/dist/agent-id.js.map +1 -0
  5. package/dist/bootstrap.d.ts.map +1 -1
  6. package/dist/bootstrap.js +2 -3
  7. package/dist/bootstrap.js.map +1 -1
  8. package/dist/commands/claim.d.ts.map +1 -1
  9. package/dist/commands/claim.js +3 -1
  10. package/dist/commands/claim.js.map +1 -1
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +32 -0
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/doctor.test.d.ts +2 -0
  15. package/dist/commands/doctor.test.d.ts.map +1 -0
  16. package/dist/commands/doctor.test.js +29 -0
  17. package/dist/commands/doctor.test.js.map +1 -0
  18. package/dist/commands/pull.d.ts.map +1 -1
  19. package/dist/commands/pull.js +13 -9
  20. package/dist/commands/pull.js.map +1 -1
  21. package/dist/commands/push.d.ts.map +1 -1
  22. package/dist/commands/push.js +6 -8
  23. package/dist/commands/push.js.map +1 -1
  24. package/dist/commands/set-remote.d.ts +2 -1
  25. package/dist/commands/set-remote.d.ts.map +1 -1
  26. package/dist/commands/set-remote.js +32 -10
  27. package/dist/commands/set-remote.js.map +1 -1
  28. package/dist/commands/set-remote.test.d.ts +2 -0
  29. package/dist/commands/set-remote.test.d.ts.map +1 -0
  30. package/dist/commands/set-remote.test.js +37 -0
  31. package/dist/commands/set-remote.test.js.map +1 -0
  32. package/dist/commands/status.d.ts.map +1 -1
  33. package/dist/commands/status.js +16 -1
  34. package/dist/commands/status.js.map +1 -1
  35. package/dist/commands/unclaim.d.ts +1 -1
  36. package/dist/commands/unclaim.d.ts.map +1 -1
  37. package/dist/commands/unclaim.js +25 -5
  38. package/dist/commands/unclaim.js.map +1 -1
  39. package/dist/lib/init-helpers.d.ts +2 -2
  40. package/dist/lib/init-helpers.d.ts.map +1 -1
  41. package/dist/lib/init-helpers.js +53 -23
  42. package/dist/lib/init-helpers.js.map +1 -1
  43. package/dist/lib/remote-store.d.ts +4 -0
  44. package/dist/lib/remote-store.d.ts.map +1 -0
  45. package/dist/lib/remote-store.js +28 -0
  46. package/dist/lib/remote-store.js.map +1 -0
  47. package/dist/lib/remote-store.test.d.ts +2 -0
  48. package/dist/lib/remote-store.test.d.ts.map +1 -0
  49. package/dist/lib/remote-store.test.js +40 -0
  50. package/dist/lib/remote-store.test.js.map +1 -0
  51. package/package.json +4 -4
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Returns the agent ID for CLI commands.
3
+ * Priority: CONTEXTGIT_AGENT_ID env var > derived from hostname + username.
4
+ */
5
+ export declare function getCliAgentId(): string;
6
+ //# sourceMappingURL=agent-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-id.d.ts","sourceRoot":"","sources":["../src/agent-id.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAMtC"}
@@ -0,0 +1,15 @@
1
+ // agent-id.ts — single source of truth for CLI agent ID.
2
+ // Used by both claim.ts and bootstrap.ts so that claims and commits
3
+ // always use the same agent ID, enabling auto-release on commit.
4
+ /**
5
+ * Returns the agent ID for CLI commands.
6
+ * Priority: CONTEXTGIT_AGENT_ID env var > derived from hostname + username.
7
+ */
8
+ export function getCliAgentId() {
9
+ if (process.env.CONTEXTGIT_AGENT_ID) {
10
+ return process.env.CONTEXTGIT_AGENT_ID;
11
+ }
12
+ const user = process.env.USER ?? process.env.USERNAME ?? 'unknown';
13
+ return `cli-${user}`;
14
+ }
15
+ //# sourceMappingURL=agent-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-id.js","sourceRoot":"","sources":["../src/agent-id.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,oEAAoE;AACpE,iEAAiE;AAIjE;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAA;IACxC,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAA;IAClE,OAAO,OAAO,IAAI,EAAE,CAAA;AACtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,EAAE,YAAY,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AA4BD,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAwBrD"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIrD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,EAAE,YAAY,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AA4BD,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAuBrD"}
package/dist/bootstrap.js CHANGED
@@ -1,10 +1,10 @@
1
1
  // bootstrap.ts — shared setup for commit/context commands.
2
2
  // Loads config, opens LocalStore, detects git branch, initializes ContextEngine.
3
- import os from 'os';
4
3
  import { simpleGit } from 'simple-git';
5
4
  import { ContextEngine } from '@contextgit/core';
6
5
  import { LocalStore, RemoteStore } from '@contextgit/store';
7
6
  import { loadConfig } from './config.js';
7
+ import { getCliAgentId } from './agent-id.js';
8
8
  async function detectGitBranch() {
9
9
  try {
10
10
  const git = simpleGit(process.cwd());
@@ -34,8 +34,7 @@ export async function bootstrap() {
34
34
  : new LocalStore(projectId);
35
35
  const gitBranch = await detectGitBranch();
36
36
  const branchId = await resolveContextBranch(store, projectId, gitBranch);
37
- const hostname = os.hostname();
38
- const agentId = `${hostname}-cli-interactive`;
37
+ const agentId = getCliAgentId();
39
38
  const engine = new ContextEngine(store, agentId, config.agentRole ?? 'solo', 'contextgit-cli', config.workflowType ?? 'interactive');
40
39
  await engine.init(projectId, branchId);
41
40
  return { engine, store, projectId, branchId };
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,iFAAiF;AAEjF,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AASxC,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QACpC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAA;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,KAAmB,EACnB,SAAiB,EACjB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IACrE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,EAAE,CAAA;IAEhC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;QACvC,SAAS;QACT,IAAI,EAAE,YAAY,SAAS,EAAE;QAC7B,SAAS;KACV,CAAC,CAAA;IACF,OAAO,OAAO,CAAC,EAAE,CAAA;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAE5B,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO;QACtC,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/B,CAAC,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAA;IAC/B,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAA;IACzC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;IAExE,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;IAC9B,MAAM,OAAO,GAAG,GAAG,QAAQ,kBAAkB,CAAA;IAE7C,MAAM,MAAM,GAAG,IAAI,aAAa,CAC9B,KAAK,EACL,OAAO,EACP,MAAM,CAAC,SAAS,IAAI,MAAM,EAC1B,gBAAgB,EAChB,MAAM,CAAC,YAAY,IAAI,aAAa,CACrC,CAAA;IACD,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAEtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;AAC/C,CAAC"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,iFAAiF;AAEjF,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAS7C,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QACpC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAA;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,KAAmB,EACnB,SAAiB,EACjB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IACrE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,EAAE,CAAA;IAEhC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;QACvC,SAAS;QACT,IAAI,EAAE,YAAY,SAAS,EAAE;QAC7B,SAAS;KACV,CAAC,CAAA;IACF,OAAO,OAAO,CAAC,EAAE,CAAA;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAE5B,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO;QACtC,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/B,CAAC,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAA;IAC/B,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAA;IACzC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;IAExE,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;IAE/B,MAAM,MAAM,GAAG,IAAI,aAAa,CAC9B,KAAK,EACL,OAAO,EACP,MAAM,CAAC,SAAS,IAAI,MAAM,EAC1B,gBAAgB,EAChB,MAAM,CAAC,YAAY,IAAI,aAAa,CACrC,CAAA;IACD,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAEtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;AAC/C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAA;AAIlD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,MAAM,CAAC,WAAW,SAA2E;IAE7F,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;;;;MAkBX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgC3B"}
1
+ {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAA;AAKlD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,MAAM,CAAC,WAAW,SAA2E;IAE7F,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;;;;MAkBX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiC3B"}
@@ -2,6 +2,7 @@
2
2
  import { Command, Args, Flags } from '@oclif/core';
3
3
  import { LocalStore } from '@contextgit/store';
4
4
  import { loadConfig } from '../config.js';
5
+ import { getCliAgentId } from '../agent-id.js';
5
6
  export default class ClaimCmd extends Command {
6
7
  static description = 'Claim a task to prevent other agents from picking it up simultaneously';
7
8
  static args = {
@@ -38,7 +39,8 @@ export default class ClaimCmd extends Command {
38
39
  if (!activeBranch) {
39
40
  this.error('No branch found. Run contextgit init first.');
40
41
  }
41
- const agentId = flags['for-agent-id'] ?? `cli-${process.env.USER ?? 'unknown'}`;
42
+ // Use shared agent ID so claims match commits for auto-release
43
+ const agentId = flags['for-agent-id'] ?? getCliAgentId();
42
44
  const claim = await store.claimTask(config.projectId, activeBranch.id, {
43
45
  task: args.task,
44
46
  agentId,
@@ -1 +1 @@
1
- {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAMrC,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAA+C;IAE3D,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoF3B"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAMrC,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAA+C;IAE3D,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqH3B"}
@@ -74,6 +74,38 @@ export default class DoctorCmd extends Command {
74
74
  }
75
75
  catch { /* file missing */ }
76
76
  check('MCP server registered in ~/.claude.json', mcpRegistered, 'Add contextgit to mcpServers in ~/.claude.json');
77
+ // ── 6. Supabase remote ────────────────────────────────────────────────────
78
+ const supabaseUrl = config?.supabaseUrl;
79
+ if (!supabaseUrl) {
80
+ // Not an error — Supabase is optional
81
+ this.log(' [ ] Supabase: not configured (optional)');
82
+ }
83
+ else {
84
+ const serviceKey = process.env['SUPABASE_SERVICE_KEY'];
85
+ if (!serviceKey) {
86
+ check('Supabase: URL set but SUPABASE_SERVICE_KEY missing', false, 'Set SUPABASE_SERVICE_KEY in your shell or Claude Code env config');
87
+ }
88
+ else {
89
+ // Probe connectivity: any 2xx/3xx = connected, 401 = key rejected
90
+ try {
91
+ const res = await fetch(`${supabaseUrl}/rest/v1/projects?limit=1`, {
92
+ headers: { apikey: serviceKey, Authorization: `Bearer ${serviceKey}` },
93
+ });
94
+ if (res.status === 401) {
95
+ check('Supabase: reachable but SUPABASE_SERVICE_KEY rejected', false, 'Check SUPABASE_SERVICE_KEY — it may be the anon key instead of the service role key');
96
+ }
97
+ else if (res.status < 400) {
98
+ check('Supabase: connected', true);
99
+ }
100
+ else {
101
+ check(`Supabase: HTTP ${res.status}`, false, `Check ${supabaseUrl} is reachable`);
102
+ }
103
+ }
104
+ catch (err) {
105
+ check('Supabase: unreachable', false, `${err instanceof Error ? err.message : String(err)}`);
106
+ }
107
+ }
108
+ }
77
109
  // ── Summary ───────────────────────────────────────────────────────────────
78
110
  this.log('');
79
111
  this.log(`${passed} passed, ${failed} failed`);
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,QAAQ,GAAG,cAAc,CAAA;AAE/B,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,GAAG,4CAA4C,CAAA;IAEjE,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QAE/B,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,IAAI,MAAM,GAAG,CAAC,CAAA;QAEd,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAW,EAAE,IAAa,EAAE,EAAE;YAC1D,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;YAC3B,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,KAAK,EAAE,CAAC,CAAA;YAChC,IAAI,CAAC,EAAE,IAAI,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;YAC9C,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;QAC1B,CAAC,CAAA;QAED,6EAA6E;QAC7E,IAAI,UAAU,GAAkB,IAAI,CAAA;QACpC,IAAI,MAAM,GAAmC,IAAI,CAAA;QACjD,IAAI,CAAC;YACH,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YAC1C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAA4B,CAAA;YACjF,KAAK,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAA;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,kCAAkC,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAA;QAC1E,CAAC;QAED,6EAA6E;QAC7E,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,SAAmB,CAAC,CAAA;gBACxD,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,SAAmB,CAAC,CAAA;gBAClD,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAA;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,oBAAoB,EAAE,KAAK,EAAE,iDAAiD,CAAC,CAAA;YACvF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,oBAAoB,EAAE,KAAK,EAAE,+BAA+B,CAAC,CAAA;QACrE,CAAC;QAED,6EAA6E;QAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;QACvD,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC;YAC/C,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC1D,KAAK,CACH,qBAAqB,EACrB,cAAc,EACd,8BAA8B,CAC/B,CAAA;QAED,6EAA6E;QAC7E,MAAM,MAAM,GAAG,MAAM,EAAE,MAA4B,CAAA;QACnD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAA;YACtE,IAAI,MAAM,GAAG,KAAK,CAAA;YAClB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAA4B,CAAA;gBACvF,MAAM,GAAG,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YAC1E,CAAC;YAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;YAChC,KAAK,CACH,+BAA+B,MAAM,GAAG,EACxC,MAAM,EACN,+BAA+B,CAChC,CAAA;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,0CAA0C,EAAE,IAAI,CAAC,CAAA;QACzD,CAAC;QAED,6EAA6E;QAC7E,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAA;QACzD,IAAI,aAAa,GAAG,KAAK,CAAA;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;YACjD,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC5C,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC9B,KAAK,CACH,yCAAyC,EACzC,aAAa,EACb,gDAAgD,CACjD,CAAA;QAED,6EAA6E;QAC7E,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACZ,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,YAAY,MAAM,SAAS,CAAC,CAAA;QAC9C,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACtC,CAAC"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=doctor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ // Test the Supabase check states in isolation
3
+ async function checkSupabase(supabaseUrl, envKey, fetchStatus = 200) {
4
+ if (!supabaseUrl)
5
+ return '[ ] Supabase: not configured (optional)';
6
+ if (!envKey)
7
+ return '[!] Supabase: URL set but SUPABASE_SERVICE_KEY missing';
8
+ // Simulate fetch
9
+ if (fetchStatus === 401)
10
+ return '[!] Supabase: reachable but SUPABASE_SERVICE_KEY rejected';
11
+ if (fetchStatus < 400)
12
+ return '[✓] Supabase: connected';
13
+ return '[!] Supabase: unreachable';
14
+ }
15
+ describe('doctor Supabase check', () => {
16
+ it('reports not configured when supabaseUrl absent', async () => {
17
+ expect(await checkSupabase()).toBe('[ ] Supabase: not configured (optional)');
18
+ });
19
+ it('reports missing key when supabaseUrl set but env absent', async () => {
20
+ expect(await checkSupabase('https://x.supabase.co')).toBe('[!] Supabase: URL set but SUPABASE_SERVICE_KEY missing');
21
+ });
22
+ it('reports rejected key on 401', async () => {
23
+ expect(await checkSupabase('https://x.supabase.co', 'key', 401)).toBe('[!] Supabase: reachable but SUPABASE_SERVICE_KEY rejected');
24
+ });
25
+ it('reports connected on 2xx', async () => {
26
+ expect(await checkSupabase('https://x.supabase.co', 'key', 200)).toBe('[✓] Supabase: connected');
27
+ });
28
+ });
29
+ //# sourceMappingURL=doctor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../src/commands/doctor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,8CAA8C;AAC9C,KAAK,UAAU,aAAa,CAAC,WAAoB,EAAE,MAAe,EAAE,WAAW,GAAG,GAAG;IACnF,IAAI,CAAC,WAAW;QAAE,OAAO,yCAAyC,CAAA;IAClE,IAAI,CAAC,MAAM;QAAE,OAAO,wDAAwD,CAAA;IAC5E,iBAAiB;IACjB,IAAI,WAAW,KAAK,GAAG;QAAE,OAAO,2DAA2D,CAAA;IAC3F,IAAI,WAAW,GAAG,GAAG;QAAE,OAAO,yBAAyB,CAAA;IACvD,OAAO,2BAA2B,CAAA;AACpC,CAAC;AAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;IACF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,CAAC,MAAM,aAAa,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;IACrH,CAAC,CAAC,CAAA;IACF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,CAAC,MAAM,aAAa,CAAC,uBAAuB,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;IACpI,CAAC,CAAC,CAAA;IACF,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,CAAC,MAAM,aAAa,CAAC,uBAAuB,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IAClG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAwB5C,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAAsD;IAExE,MAAM,CAAC,KAAK;;;MAUX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiG3B"}
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AA0B5C,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAAsD;IAExE,MAAM,CAAC,KAAK;;;MAUX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAkG3B"}
@@ -6,8 +6,9 @@
6
6
  // 2. For each remote branch: ensure branch exists locally
7
7
  // 3. For each branch: collect remote commits not present locally, write them
8
8
  import { Command, Flags } from '@oclif/core';
9
- import { LocalStore, RemoteStore } from '@contextgit/store';
9
+ import { LocalStore } from '@contextgit/store';
10
10
  import { loadConfig } from '../config.js';
11
+ import { resolveRemoteStore } from '../lib/remote-store.js';
11
12
  const PAGE = 100;
12
13
  async function allCommits(store, branchId) {
13
14
  const acc = [];
@@ -39,17 +40,19 @@ export default class PullCmd extends Command {
39
40
  async run() {
40
41
  const { flags } = await this.parse(PullCmd);
41
42
  const config = loadConfig();
42
- const remoteUrl = flags.remote ?? config.remote;
43
- if (!remoteUrl) {
44
- this.error('No remote configured. Add "remote": "<url>" to .contextgit/config.json or pass --remote.');
45
- }
46
43
  const local = new LocalStore(config.projectId);
47
- const remote = new RemoteStore(remoteUrl);
44
+ const remote = resolveRemoteStore(config, flags.remote);
48
45
  const dryRun = flags['dry-run'];
49
46
  // Verify project exists on remote
50
47
  const remoteProject = await remote.getProject(config.projectId).catch(() => null);
51
48
  if (!remoteProject) {
52
- this.error(`Project ${config.projectId} not found on remote ${remoteUrl}. Push first.`);
49
+ this.error(`Project ${config.projectId} not found on remote. Push first.`);
50
+ }
51
+ // Ensure project exists locally before creating branches (FK requirement)
52
+ const localProject = await local.getProject(config.projectId).catch(() => null);
53
+ if (!localProject && !dryRun) {
54
+ await local.createProject({ id: config.projectId, name: config.project });
55
+ this.log(`[project] created locally: ${config.project}`);
53
56
  }
54
57
  // List all remote branches
55
58
  const remoteBranches = await remote.listBranches(config.projectId);
@@ -74,7 +77,8 @@ export default class PullCmd extends Command {
74
77
  const localCommitIds = new Set(localCommits.map(c => c.id));
75
78
  // Pull missing commits from remote
76
79
  const remoteCommits = await allCommits(remote, branch.id);
77
- const missing = remoteCommits.filter(c => !localCommitIds.has(c.id));
80
+ // Reverse to pull oldest-first — parent_id FK requires parent to exist before child
81
+ const missing = remoteCommits.filter(c => !localCommitIds.has(c.id)).reverse();
78
82
  if (missing.length === 0) {
79
83
  this.log(`[branch] ${branch.name}: up to date (${remoteCommits.length} commits)`);
80
84
  continue;
@@ -117,7 +121,7 @@ export default class PullCmd extends Command {
117
121
  this.log(` ${dryRun ? 'would pull' : 'pulled'}: ${thread.description}`);
118
122
  }
119
123
  }
120
- this.log(`\nDone. ${dryRun ? '(dry run) ' : ''}${totalPulled} commit(s), ${missingThreads.length} thread(s) pulled from ${remoteUrl}`);
124
+ this.log(`\nDone. ${dryRun ? '(dry run) ' : ''}${totalPulled} commit(s), ${missingThreads.length} thread(s) pulled.`);
121
125
  }
122
126
  }
123
127
  //# sourceMappingURL=pull.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAwB5C,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAA0D;IAE5E,MAAM,CAAC,KAAK;;;MAUX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8G3B"}
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AA0B5C,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAA0D;IAE5E,MAAM,CAAC,KAAK;;;MAUX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0G3B"}
@@ -6,8 +6,9 @@
6
6
  // 2. For each local branch: ensure branch exists on remote
7
7
  // 3. For each branch: collect local commits not present on remote, POST them
8
8
  import { Command, Flags } from '@oclif/core';
9
- import { LocalStore, RemoteStore } from '@contextgit/store';
9
+ import { LocalStore } from '@contextgit/store';
10
10
  import { loadConfig } from '../config.js';
11
+ import { resolveRemoteStore } from '../lib/remote-store.js';
11
12
  const PAGE = 100;
12
13
  async function allCommits(store, branchId) {
13
14
  const acc = [];
@@ -39,12 +40,8 @@ export default class PushCmd extends Command {
39
40
  async run() {
40
41
  const { flags } = await this.parse(PushCmd);
41
42
  const config = loadConfig();
42
- const remoteUrl = flags.remote ?? config.remote;
43
- if (!remoteUrl) {
44
- this.error('No remote configured. Use: contextgit set-remote <url>', { exit: 1 });
45
- }
46
43
  const local = new LocalStore(config.projectId);
47
- const remote = new RemoteStore(remoteUrl);
44
+ const remote = resolveRemoteStore(config, flags.remote);
48
45
  const dryRun = flags['dry-run'];
49
46
  // 1. Ensure project on remote
50
47
  const existingProject = await remote.getProject(config.projectId).catch(() => null);
@@ -86,7 +83,8 @@ export default class PushCmd extends Command {
86
83
  }
87
84
  // Push missing commits
88
85
  const localCommits = await allCommits(local, branch.id);
89
- const missing = localCommits.filter(c => !remoteCommitIds.has(c.id));
86
+ // Reverse to push oldest-first — parent_id FK requires parent to exist before child
87
+ const missing = localCommits.filter(c => !remoteCommitIds.has(c.id)).reverse();
90
88
  if (missing.length === 0) {
91
89
  this.log(`[branch] ${branch.name}: up to date (${localCommits.length} commits)`);
92
90
  continue;
@@ -135,7 +133,7 @@ export default class PushCmd extends Command {
135
133
  this.log(` ${dryRun ? 'would push' : 'pushed'}: ${thread.description}`);
136
134
  }
137
135
  }
138
- this.log(`\nDone. ${dryRun ? '(dry run) ' : ''}${totalPushed} commit(s), ${missingThreads.length} thread(s) pushed to ${remoteUrl}`);
136
+ this.log(`\nDone. ${dryRun ? '(dry run) ' : ''}${totalPushed} commit(s), ${missingThreads.length} thread(s) pushed.`);
139
137
  }
140
138
  }
141
139
  //# sourceMappingURL=push.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,8 @@ import { Command } from '@oclif/core';
2
2
  export default class SetRemoteCmd extends Command {
3
3
  static description: string;
4
4
  static args: {
5
- url: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
5
+ typeOrUrl: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
6
+ url: import("@oclif/core/lib/interfaces/parser.js").Arg<string | undefined, Record<string, unknown>>;
6
7
  };
7
8
  run(): Promise<void>;
8
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"set-remote.d.ts","sourceRoot":"","sources":["../../src/commands/set-remote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAQ,MAAM,aAAa,CAAA;AAG3C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IAC/C,MAAM,CAAC,WAAW,SAAgD;IAElE,MAAM,CAAC,IAAI;;MAKV;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAc3B"}
1
+ {"version":3,"file":"set-remote.d.ts","sourceRoot":"","sources":["../../src/commands/set-remote.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAQ,MAAM,aAAa,CAAA;AAG3C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IAC/C,MAAM,CAAC,WAAW,SAAkE;IAEpF,MAAM,CAAC,IAAI;;;MASV;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwB3B"}
@@ -1,26 +1,48 @@
1
- // set-remote — write a remote ContextGit API URL to config.json.
1
+ // set-remote — configure push/pull remote target.
2
+ //
3
+ // Usage:
4
+ // contextgit set-remote supabase https://xyzproject.supabase.co
5
+ // → writes supabaseUrl to config. Key via SUPABASE_SERVICE_KEY env var.
6
+ // contextgit set-remote https://api.example.com
7
+ // → writes remote (HTTP RemoteStore URL) to config. Existing behaviour.
2
8
  import { Command, Args } from '@oclif/core';
3
9
  import { loadConfig, saveConfig } from '../config.js';
4
10
  export default class SetRemoteCmd extends Command {
5
- static description = 'Set the remote ContextGit API URL in config';
11
+ static description = 'Set the remote push/pull target (Supabase or self-hosted API)';
6
12
  static args = {
7
- url: Args.string({
8
- description: 'Remote API URL (e.g. https://api.example.com)',
13
+ typeOrUrl: Args.string({
14
+ description: '"supabase" keyword, or an HTTP API URL',
9
15
  required: true,
10
16
  }),
17
+ url: Args.string({
18
+ description: 'Supabase project URL (required when first arg is "supabase")',
19
+ required: false,
20
+ }),
11
21
  };
12
22
  async run() {
13
23
  const { args } = await this.parse(SetRemoteCmd);
14
24
  const config = loadConfig();
15
- const previous = config.remote;
16
- saveConfig({ remote: args.url });
17
- if (previous) {
18
- this.log(`Remote updated: ${previous} → ${args.url}`);
25
+ if (args.typeOrUrl === 'supabase') {
26
+ if (!args.url) {
27
+ this.error('URL required: contextgit set-remote supabase <url>', { exit: 1 });
28
+ }
29
+ saveConfig({ supabaseUrl: args.url }); // saveConfig merges internally — spread not needed
30
+ this.log(`Supabase remote set: ${args.url}`);
31
+ this.log(`Set SUPABASE_SERVICE_KEY in your shell to authenticate.`);
32
+ this.log(`Run 'contextgit push' to sync commits to Supabase.`);
19
33
  }
20
34
  else {
21
- this.log(`Remote set: ${args.url}`);
35
+ const url = args.typeOrUrl;
36
+ const previous = config.remote;
37
+ saveConfig({ remote: url }); // saveConfig merges internally — spread not needed
38
+ if (previous) {
39
+ this.log(`Remote updated: ${previous} → ${url}`);
40
+ }
41
+ else {
42
+ this.log(`Remote set: ${url}`);
43
+ }
44
+ this.log(`Use 'contextgit push' to sync commits to this remote.`);
22
45
  }
23
- this.log(`Use 'contextgit push' to sync commits to this remote.`);
24
46
  }
25
47
  }
26
48
  //# sourceMappingURL=set-remote.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"set-remote.js","sourceRoot":"","sources":["../../src/commands/set-remote.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IAC/C,MAAM,CAAC,WAAW,GAAG,6CAA6C,CAAA;IAElE,MAAM,CAAC,IAAI,GAAG;QACZ,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;YACf,WAAW,EAAE,+CAA+C;YAC5D,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAE3B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAA;QAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAEhC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,mBAAmB,QAAQ,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QACvD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QACrC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;IACnE,CAAC"}
1
+ {"version":3,"file":"set-remote.js","sourceRoot":"","sources":["../../src/commands/set-remote.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,SAAS;AACT,kEAAkE;AAClE,4EAA4E;AAC5E,kDAAkD;AAClD,4EAA4E;AAE5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IAC/C,MAAM,CAAC,WAAW,GAAG,+DAA+D,CAAA;IAEpF,MAAM,CAAC,IAAI,GAAG;QACZ,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;YACrB,WAAW,EAAE,wCAAwC;YACrD,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;YACf,WAAW,EAAE,8DAA8D;YAC3E,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAE3B,IAAI,IAAI,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,CAAC,oDAAoD,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YAC/E,CAAC;YACD,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA,CAAG,mDAAmD;YAC3F,IAAI,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;YAC5C,IAAI,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAA;YACnE,IAAI,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAA;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAA;YAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAA;YAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA,CAAa,mDAAmD;YAC3F,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,mBAAmB,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAA;YAClD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC,CAAA;YAChC,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;QACnE,CAAC;IACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=set-remote.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-remote.test.d.ts","sourceRoot":"","sources":["../../src/commands/set-remote.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { loadConfig, saveConfig } from '../config.js';
3
+ vi.mock('../config.js', () => ({
4
+ loadConfig: vi.fn(() => ({ projectId: 'p1', project: 'test', remote: undefined, supabaseUrl: undefined })),
5
+ saveConfig: vi.fn(),
6
+ }));
7
+ // We test the dispatch logic directly since oclif commands are hard to unit-test.
8
+ // The key behaviors: 'supabase' keyword writes supabaseUrl; anything else writes remote.
9
+ describe('set-remote dispatch', () => {
10
+ beforeEach(() => { vi.clearAllMocks(); });
11
+ it('writes supabaseUrl when first arg is "supabase"', () => {
12
+ // Simulate the dispatch logic from the command
13
+ const typeOrUrl = 'supabase';
14
+ const url = 'https://xyz.supabase.co';
15
+ const config = loadConfig();
16
+ if (typeOrUrl === 'supabase') {
17
+ saveConfig({ ...config, supabaseUrl: url });
18
+ }
19
+ else {
20
+ saveConfig({ ...config, remote: typeOrUrl });
21
+ }
22
+ expect(saveConfig).toHaveBeenCalledWith(expect.objectContaining({ supabaseUrl: 'https://xyz.supabase.co' }));
23
+ });
24
+ it('writes remote (HTTP) when first arg is a URL', () => {
25
+ const typeOrUrl = 'https://api.example.com';
26
+ const config = loadConfig();
27
+ if (typeOrUrl === 'supabase') {
28
+ saveConfig({ ...config, supabaseUrl: 'irrelevant' });
29
+ }
30
+ else {
31
+ saveConfig({ ...config, remote: typeOrUrl });
32
+ }
33
+ expect(saveConfig).toHaveBeenCalledWith(expect.objectContaining({ remote: 'https://api.example.com' }));
34
+ expect(saveConfig).not.toHaveBeenCalledWith(expect.objectContaining({ supabaseUrl: expect.anything() }));
35
+ });
36
+ });
37
+ //# sourceMappingURL=set-remote.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-remote.test.js","sourceRoot":"","sources":["../../src/commands/set-remote.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAErD,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1G,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAA;AAEH,kFAAkF;AAClF,yFAAyF;AAEzF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;IAExC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,+CAA+C;QAC/C,MAAM,SAAS,GAAG,UAAU,CAAA;QAC5B,MAAM,GAAG,GAAG,yBAAyB,CAAA;QACrC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QAC9C,CAAC;QACD,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAA;IAC9G,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,SAAS,GAAW,yBAAyB,CAAA;QACnD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAA;QACtD,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QAC9C,CAAC;QACD,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAA;QACvG,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;IAC1G,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAKrC,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAAmC;IAE/C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmD3B"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAKrC,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAAmC;IAE/C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsE3B"}
@@ -25,6 +25,7 @@ export default class StatusCmd extends Command {
25
25
  const commits = await store.listCommits(branch.id, { limit: 5, offset: 0 });
26
26
  const agents = await store.listAgents(config.projectId);
27
27
  const allBranches = await store.listBranches(config.projectId);
28
+ const activeClaims = await store.listActiveClaims(config.projectId);
28
29
  this.log(`Project: ${config.project} (${config.projectId})`);
29
30
  this.log(`Branch: ${branch.name} [${branch.status}]`);
30
31
  this.log(`Git: ${gitBranch}`);
@@ -36,10 +37,23 @@ export default class StatusCmd extends Command {
36
37
  this.log(`Commits: ${commits.length} recent (showing last 5)`);
37
38
  this.log(`Threads: ${threads.length} open`);
38
39
  this.log(`Agents: ${agents.length} registered`);
40
+ this.log(`Claims: ${activeClaims.length} active`);
41
+ if (activeClaims.length > 0) {
42
+ this.log('\nActive claims:');
43
+ for (const c of activeClaims) {
44
+ const ttlHours = Math.round(c.ttl / 3_600_000);
45
+ this.log(` [${c.id.slice(0, 8)}] "${c.task}" by ${c.agentId} (${c.status}, ${ttlHours}h TTL)`);
46
+ }
47
+ }
39
48
  if (threads.length > 0) {
40
49
  this.log('\nOpen threads:');
41
50
  for (const t of threads) {
42
- this.log(` [${t.id.slice(0, 8)}] ${t.description}`);
51
+ // Show inline claim status on threads
52
+ const claim = activeClaims.find(c => c.threadId === t.id ||
53
+ t.description.toLowerCase().includes(c.task.toLowerCase()) ||
54
+ c.task.toLowerCase().includes(t.description.toLowerCase()));
55
+ const claimTag = claim ? ` [CLAIMED by ${claim.agentId}]` : ' [FREE]';
56
+ this.log(` [${t.id.slice(0, 8)}]${claimTag} ${t.description}`);
43
57
  }
44
58
  }
45
59
  if (commits.length > 0) {
@@ -49,6 +63,7 @@ export default class StatusCmd extends Command {
49
63
  this.log(` [${c.id.slice(0, 8)}] ${c.message} (${ts})`);
50
64
  }
51
65
  }
66
+ store.close();
52
67
  }
53
68
  }
54
69
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { Command } from '@oclif/core';
2
2
  export default class UnclaimCmd extends Command {
3
3
  static description: string;
4
4
  static args: {
5
- claimId: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
5
+ identifier: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
6
6
  };
7
7
  run(): Promise<void>;
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"unclaim.d.ts","sourceRoot":"","sources":["../../src/commands/unclaim.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAQ,MAAM,aAAa,CAAA;AAI3C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,SAAsC;IAExD,MAAM,CAAC,IAAI;;MAKV;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAW3B"}
1
+ {"version":3,"file":"unclaim.d.ts","sourceRoot":"","sources":["../../src/commands/unclaim.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAQ,MAAM,aAAa,CAAA;AAI3C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,SAAiE;IAEnF,MAAM,CAAC,IAAI;;MAKV;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoC3B"}
@@ -1,12 +1,14 @@
1
1
  // unclaim — manually release a task claim.
2
+ // Accepts either a claim ID (nanoid) or a task name string.
3
+ // When a task name is provided, finds the matching active claim and releases it.
2
4
  import { Command, Args } from '@oclif/core';
3
5
  import { LocalStore } from '@contextgit/store';
4
6
  import { loadConfig } from '../config.js';
5
7
  export default class UnclaimCmd extends Command {
6
- static description = 'Release a previously claimed task';
8
+ static description = 'Release a previously claimed task (by claim ID or task name)';
7
9
  static args = {
8
- claimId: Args.string({
9
- description: 'ID of the claim to release',
10
+ identifier: Args.string({
11
+ description: 'Claim ID or task name to release',
10
12
  required: true,
11
13
  }),
12
14
  };
@@ -14,9 +16,27 @@ export default class UnclaimCmd extends Command {
14
16
  const { args } = await this.parse(UnclaimCmd);
15
17
  const config = loadConfig();
16
18
  const store = new LocalStore(config.projectId);
17
- await store.unclaimTask(args.claimId);
18
- this.log(`Released: ${args.claimId}`);
19
+ const identifier = args.identifier;
20
+ // First try to release by exact claim ID
21
+ const activeClaims = await store.listActiveClaims(config.projectId);
22
+ const byId = activeClaims.find(c => c.id === identifier);
23
+ if (byId) {
24
+ await store.unclaimTask(byId.id);
25
+ this.log(`Released claim: ${byId.id} ("${byId.task}")`);
26
+ store.close();
27
+ return;
28
+ }
29
+ // Fall back to matching by task name (case-insensitive)
30
+ const byTask = activeClaims.find(c => c.task.toLowerCase() === identifier.toLowerCase());
31
+ if (byTask) {
32
+ await store.unclaimTask(byTask.id);
33
+ this.log(`Released claim: ${byTask.id} ("${byTask.task}")`);
34
+ store.close();
35
+ return;
36
+ }
19
37
  store.close();
38
+ this.error(`No active claim found matching "${identifier}". ` +
39
+ `Use 'contextgit status' to see active claims.`);
20
40
  }
21
41
  }
22
42
  //# sourceMappingURL=unclaim.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unclaim.js","sourceRoot":"","sources":["../../src/commands/unclaim.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,GAAG,mCAAmC,CAAA;IAExD,MAAM,CAAC,IAAI,GAAG;QACZ,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,4BAA4B;YACzC,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAE9C,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAErC,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QAErC,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC"}
1
+ {"version":3,"file":"unclaim.js","sourceRoot":"","sources":["../../src/commands/unclaim.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,4DAA4D;AAC5D,iFAAiF;AAEjF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,GAAG,8DAA8D,CAAA;IAEnF,MAAM,CAAC,IAAI,GAAG;QACZ,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,kCAAkC;YAC/C,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QAElC,yCAAyC;QACzC,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACnE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAA;QAExD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAChC,IAAI,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA;YACvD,KAAK,CAAC,KAAK,EAAE,CAAA;YACb,OAAM;QACR,CAAC;QAED,wDAAwD;QACxD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CACvD,CAAA;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAClC,IAAI,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,IAAI,IAAI,CAAC,CAAA;YAC3D,KAAK,CAAC,KAAK,EAAE,CAAA;YACb,OAAM;QACR,CAAC;QAED,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,IAAI,CAAC,KAAK,CACR,mCAAmC,UAAU,KAAK;YAClD,+CAA+C,CAChD,CAAA;IACH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export declare const CLAUDE_MD_SENTINEL_START = "<!-- contextgit:start -->";
2
2
  export declare const CLAUDE_MD_SENTINEL_END = "<!-- contextgit:end -->";
3
- export declare const CLAUDE_MD_FRAGMENT = "\n<!-- contextgit:start -->\n## ContextGit Memory\n\nThis project uses ContextGit for persistent AI memory across sessions.\n\n**Session start:** Call `project_memory_load` (or `context_get`) immediately \u2014 before reading files, before asking questions, before doing any work. This loads the full project state: what was built, what was decided, active tasks, and open questions.\n\n**After significant work:** Call `project_memory_save` (or `context_commit`) with a structured message:\n- One-line summary of what was done\n- What was decided and why\n- What was built (files changed, approach taken)\n- Open questions\n- Git branch and commit hash\n\n**Before risky exploration:** Call `project_memory_branch` (or `context_branch`) to create an isolated context workspace.\n\n**Before starting a task:** Call `project_task_claim` (or `context_claim`) to prevent other agents from duplicating your work.\n\nDo not skip these steps. The next session starts blind without them.\n<!-- contextgit:end -->\n";
3
+ export declare const CLAUDE_MD_FRAGMENT = "\n<!-- contextgit:start -->\n## ContextGit Memory\n\nThis project uses ContextGit for persistent AI memory across sessions.\n\n## Session Start (do this every time)\n\nCall `project_memory_load` immediately.\nDo not ask questions first. Read the snapshot, then start working.\nStart the next specific task from the snapshot \u2014 not an entire feature or milestone.\nOne task per session unless it is trivially small.\n\n## After EVERY completed task\n\nDo not wait to be asked. Every git commit = immediate context commit.\nDo not proceed to the next task until both are done.\n\n1. `git add . && git commit -m \"feat/fix: <what was done>\"`\n2. Call `project_memory_save` immediately after with:\n - One-line summary of what was done\n - What was decided and why\n - What was built (files changed, approach taken)\n - Open questions\n - Git branch and commit hash\n - The next concrete task\n\nThese two always go together. Never git commit without a context commit.\n\n## Session End (do this every time)\n\nBefore stopping work for any reason, call `project_memory_save` with:\n- What was built this session\n- Key decisions and why\n- Open threads and blockers\n- The first concrete task for the next session\n\nDo not end a session without a context commit. The next session starts blind without it.\n\n## Before risky exploration\n\nCall `project_memory_branch` to create an isolated context workspace before trying anything uncertain.\n\n## Before starting a task (multi-agent)\n\nCall `project_task_claim` to prevent other agents from duplicating your work.\n\n## When scope changes mid-session\n\nWrite a `project_memory_save` with replan: prefix BEFORE building new scope:\n`project_memory_save \"replan: <what changed and why>\"`\nThen build the new scope. Then write a normal context commit when done.\n<!-- contextgit:end -->\n";
4
4
  /**
5
5
  * Write the ContextGit CLAUDE.md fragment into the given directory.
6
6
  * Idempotent: skips if sentinel already present.
@@ -10,7 +10,7 @@ export declare function writeClaude(projectDir: string): {
10
10
  status: 'written' | 'already-present' | 'error';
11
11
  reason?: string;
12
12
  };
13
- export declare const CONTEXT_COMMIT_SKILL = "---\nname: context-commit\ndescription: \"Save project memory after completing work. Use this skill whenever you have just finished implementing a feature, resolved a bug or blocker, made an architectural decision, closed a thread, completed a code review, or are about to end the session. Also trigger when you see signals like 'that's working', 'task complete', 'let's move on', 'I'm done', or after completing a git commit. IMPORTANT: Always use this skill before ending a session or moving to the next task \u2014 skipping it means the next session starts blind.\"\n---\n\n# ContextGit \u2014 Context Commit Discipline\n\n## When to commit context\n\nCall `project_memory_save` (MCP tool) after:\n- Completing a feature or task (before moving to the next)\n- Making an architectural decision or choosing between options\n- Resolving a bug, blocker, or open question\n- Closing a thread\n- Before ending the session\n\n## What makes a good commit message\n\nA context commit message is a future-you briefing. Write it so the next agent session (or the next developer) can pick up exactly where this one left off.\n\nStructure:\n```\n<one-line summary of what was done>\n\nWhat was decided: <the decision and why>\nWhat was built: <files changed, approach taken>\nOpen questions: <anything unresolved>\nGit: <branch> | <commit hash if available>\n```\n\nExample:\n```\nImplemented optimistic locking via CAS on branches table\n\nWhat was decided: CAS with 3-attempt retry + jitter over queue-based serialization.\nQueue deferred until high-conflict multi-agent scale. COMMIT_CONFLICT error type added.\nWhat was built: store/src/local/queries.ts (version column), store/src/local/index.ts (retry logic), core/src/types.ts (COMMIT_CONFLICT)\nOpen questions: TTL behavior under high contention not yet load-tested.\nGit: feat/phase2-delta1 | a3f9c12\n```\n\n## How to call it\n\nUse the `project_memory_save` MCP tool (alias: `context_commit`). Pass the full message as the `message` argument.\n\nDo not skip this step when the work feels small. Small decisions compound. The next session starts blind without them.\n";
13
+ export declare const CONTEXT_COMMIT_SKILL = "---\nname: context-commit\ndescription: \"MANDATORY: Save project memory after completing ANY work. Use this skill after EVERY completed task and EVERY git commit \u2014 finished implementing a feature, resolved a bug, made a decision, closed a thread, completed a review, or ending a session. Every git commit must be followed immediately by a context commit. Do not wait to be asked. Do not proceed to the next task until both git commit and context commit are done. Triggers: git commit made, task complete, 'that's working', 'let's move on', 'I'm done', session ending. Skipping this means the next session starts completely blind.\"\n---\n\n# ContextGit \u2014 Context Commit Discipline\n\n## RULE: Every git commit = immediate context commit\n\nDo not wait to be asked. Do not batch. Do not skip.\nAfter every git commit, call `project_memory_save` immediately.\nDo not proceed to the next task until both git commit and context commit are done.\nThese two always go together. Never git commit without a context commit.\n\n## When to commit context\n\nCall `project_memory_save` (MCP tool) after:\n- Every git commit (mandatory \u2014 these always go together)\n- Completing a feature or task (before moving to the next)\n- Making an architectural decision or choosing between options\n- Resolving a bug, blocker, or open question\n- Closing a thread\n- Before ending the session for any reason\n\n## What makes a good commit message\n\nA context commit message is a future-you briefing. Write it so the next agent session (or the next developer) can pick up exactly where this one left off.\n\nStructure:\n```\n<one-line summary of what was done>\n\nWhat was decided: <the decision and why>\nWhat was built: <files changed, approach taken>\nOpen questions: <anything unresolved>\nNext task: <the first concrete thing the next session should do>\nGit: <branch> | <commit hash if available>\n```\n\n## How to call it\n\nUse the `project_memory_save` MCP tool (alias: `context_commit`). Pass the full message as the `message` argument.\n\nDo not skip this step when the work feels small. Small decisions compound. The next session starts blind without them.\n";
14
14
  export declare const CONTEXT_BRANCH_SKILL = "---\nname: context-branch\ndescription: \"Create an isolated context branch before risky or experimental work. Use this skill when the agent is about to explore something uncertain, experimental, or potentially breaking \u2014 trying an approach that might not work, refactoring something risky, exploring an architectural alternative, or doing anything that should be isolatable and reversible. Triggers on: 'let me try', 'what if we', 'I want to explore', 'let's experiment', 'alternative approach', or any phrasing that signals exploration rather than execution.\"\n---\n\n# ContextGit \u2014 Context Branch Discipline\n\n## When to branch context\n\nCall `project_memory_branch` (MCP tool) before:\n- Trying an approach you're not sure will work\n- Refactoring something that touches many files\n- Exploring an architectural alternative to the current plan\n- Doing anything you'd want to be able to roll back semantically (not just via git)\n\n## Why this matters\n\nA context branch creates an isolated snapshot workspace. If the exploration fails, you can return to the main branch context without polluting the session history with dead-end decisions.\n\nIt's cheap. It takes one tool call. The cost of not doing it is re-explaining to the next session why you abandoned the approach you just spent an hour on.\n\n## How to call it\n\nUse the `project_memory_branch` MCP tool (alias: `context_branch`). Pass a short descriptive name:\n\n```\nproject_memory_branch name=\"explore-queue-based-concurrency\"\n```\n\nWhen the exploration concludes:\n- If it worked: `project_memory_save` your findings and merge back\n- If it failed: `project_memory_save` a brief note (\"explored X, abandoned because Y\") and switch back to main branch\n\nThe failure note is as valuable as the success note. The next session needs to know not to try the same dead end.\n";
15
15
  /**
16
16
  * Write the context-commit and context-branch skills into <projectDir>/.claude/skills/.
@@ -1 +1 @@
1
- {"version":3,"file":"init-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/init-helpers.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,wBAAwB,8BAA8B,CAAA;AACnE,eAAO,MAAM,sBAAsB,4BAA4B,CAAA;AAE/D,eAAO,MAAM,kBAAkB,o/BAqB9B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,GACjB;IAAE,MAAM,EAAE,SAAS,GAAG,iBAAiB,GAAG,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAgBtE;AAID,eAAO,MAAM,oBAAoB,0kEA8ChC,CAAA;AAED,eAAO,MAAM,oBAAoB,y0DAkChC,CAAA;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,GACjB;IAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAYlD"}
1
+ {"version":3,"file":"init-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/init-helpers.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,wBAAwB,8BAA8B,CAAA;AACnE,eAAO,MAAM,sBAAsB,4BAA4B,CAAA;AAE/D,eAAO,MAAM,kBAAkB,m0DAqD9B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,GACjB;IAAE,MAAM,EAAE,SAAS,GAAG,iBAAiB,GAAG,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAgBtE;AAID,eAAO,MAAM,oBAAoB,wnEA4ChC,CAAA;AAED,eAAO,MAAM,oBAAoB,y0DAkChC,CAAA;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,GACjB;IAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAYlD"}
@@ -10,20 +10,52 @@ export const CLAUDE_MD_FRAGMENT = `
10
10
 
11
11
  This project uses ContextGit for persistent AI memory across sessions.
12
12
 
13
- **Session start:** Call \`project_memory_load\` (or \`context_get\`) immediately — before reading files, before asking questions, before doing any work. This loads the full project state: what was built, what was decided, active tasks, and open questions.
13
+ ## Session Start (do this every time)
14
14
 
15
- **After significant work:** Call \`project_memory_save\` (or \`context_commit\`) with a structured message:
16
- - One-line summary of what was done
17
- - What was decided and why
18
- - What was built (files changed, approach taken)
19
- - Open questions
20
- - Git branch and commit hash
15
+ Call \`project_memory_load\` immediately.
16
+ Do not ask questions first. Read the snapshot, then start working.
17
+ Start the next specific task from the snapshot — not an entire feature or milestone.
18
+ One task per session unless it is trivially small.
21
19
 
22
- **Before risky exploration:** Call \`project_memory_branch\` (or \`context_branch\`) to create an isolated context workspace.
20
+ ## After EVERY completed task
23
21
 
24
- **Before starting a task:** Call \`project_task_claim\` (or \`context_claim\`) to prevent other agents from duplicating your work.
22
+ Do not wait to be asked. Every git commit = immediate context commit.
23
+ Do not proceed to the next task until both are done.
25
24
 
26
- Do not skip these steps. The next session starts blind without them.
25
+ 1. \`git add . && git commit -m "feat/fix: <what was done>"\`
26
+ 2. Call \`project_memory_save\` immediately after with:
27
+ - One-line summary of what was done
28
+ - What was decided and why
29
+ - What was built (files changed, approach taken)
30
+ - Open questions
31
+ - Git branch and commit hash
32
+ - The next concrete task
33
+
34
+ These two always go together. Never git commit without a context commit.
35
+
36
+ ## Session End (do this every time)
37
+
38
+ Before stopping work for any reason, call \`project_memory_save\` with:
39
+ - What was built this session
40
+ - Key decisions and why
41
+ - Open threads and blockers
42
+ - The first concrete task for the next session
43
+
44
+ Do not end a session without a context commit. The next session starts blind without it.
45
+
46
+ ## Before risky exploration
47
+
48
+ Call \`project_memory_branch\` to create an isolated context workspace before trying anything uncertain.
49
+
50
+ ## Before starting a task (multi-agent)
51
+
52
+ Call \`project_task_claim\` to prevent other agents from duplicating your work.
53
+
54
+ ## When scope changes mid-session
55
+
56
+ Write a \`project_memory_save\` with replan: prefix BEFORE building new scope:
57
+ \`project_memory_save "replan: <what changed and why>"\`
58
+ Then build the new scope. Then write a normal context commit when done.
27
59
  <!-- contextgit:end -->
28
60
  `;
29
61
  /**
@@ -53,19 +85,27 @@ export function writeClaude(projectDir) {
53
85
  // ── Skills ────────────────────────────────────────────────────────────────────
54
86
  export const CONTEXT_COMMIT_SKILL = `---
55
87
  name: context-commit
56
- description: "Save project memory after completing work. Use this skill whenever you have just finished implementing a feature, resolved a bug or blocker, made an architectural decision, closed a thread, completed a code review, or are about to end the session. Also trigger when you see signals like 'that's working', 'task complete', 'let's move on', 'I'm done', or after completing a git commit. IMPORTANT: Always use this skill before ending a session or moving to the next task — skipping it means the next session starts blind."
88
+ description: "MANDATORY: Save project memory after completing ANY work. Use this skill after EVERY completed task and EVERY git commit — finished implementing a feature, resolved a bug, made a decision, closed a thread, completed a review, or ending a session. Every git commit must be followed immediately by a context commit. Do not wait to be asked. Do not proceed to the next task until both git commit and context commit are done. Triggers: git commit made, task complete, 'that's working', 'let's move on', 'I'm done', session ending. Skipping this means the next session starts completely blind."
57
89
  ---
58
90
 
59
91
  # ContextGit — Context Commit Discipline
60
92
 
93
+ ## RULE: Every git commit = immediate context commit
94
+
95
+ Do not wait to be asked. Do not batch. Do not skip.
96
+ After every git commit, call \`project_memory_save\` immediately.
97
+ Do not proceed to the next task until both git commit and context commit are done.
98
+ These two always go together. Never git commit without a context commit.
99
+
61
100
  ## When to commit context
62
101
 
63
102
  Call \`project_memory_save\` (MCP tool) after:
103
+ - Every git commit (mandatory — these always go together)
64
104
  - Completing a feature or task (before moving to the next)
65
105
  - Making an architectural decision or choosing between options
66
106
  - Resolving a bug, blocker, or open question
67
107
  - Closing a thread
68
- - Before ending the session
108
+ - Before ending the session for any reason
69
109
 
70
110
  ## What makes a good commit message
71
111
 
@@ -78,20 +118,10 @@ Structure:
78
118
  What was decided: <the decision and why>
79
119
  What was built: <files changed, approach taken>
80
120
  Open questions: <anything unresolved>
121
+ Next task: <the first concrete thing the next session should do>
81
122
  Git: <branch> | <commit hash if available>
82
123
  \`\`\`
83
124
 
84
- Example:
85
- \`\`\`
86
- Implemented optimistic locking via CAS on branches table
87
-
88
- What was decided: CAS with 3-attempt retry + jitter over queue-based serialization.
89
- Queue deferred until high-conflict multi-agent scale. COMMIT_CONFLICT error type added.
90
- What was built: store/src/local/queries.ts (version column), store/src/local/index.ts (retry logic), core/src/types.ts (COMMIT_CONFLICT)
91
- Open questions: TTL behavior under high contention not yet load-tested.
92
- Git: feat/phase2-delta1 | a3f9c12
93
- \`\`\`
94
-
95
125
  ## How to call it
96
126
 
97
127
  Use the \`project_memory_save\` MCP tool (alias: \`context_commit\`). Pass the full message as the \`message\` argument.
@@ -1 +1 @@
1
- {"version":3,"file":"init-helpers.js","sourceRoot":"","sources":["../../src/lib/init-helpers.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAEzD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,iFAAiF;AAEjF,MAAM,CAAC,MAAM,wBAAwB,GAAG,2BAA2B,CAAA;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAA;AAE/D,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBjC,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,UAAkB;IAElB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IAChD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;YAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBAC/C,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;YACtC,CAAC;YACD,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,kBAAkB,CAAC,CAAA;QACzD,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IACjD,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CnC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCnC,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAA;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAA;QACzE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,oBAAoB,CAAC,CAAA;QAChE,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,oBAAoB,CAAC,CAAA;QAChE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IACjD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"init-helpers.js","sourceRoot":"","sources":["../../src/lib/init-helpers.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAEzD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,iFAAiF;AAEjF,MAAM,CAAC,MAAM,wBAAwB,GAAG,2BAA2B,CAAA;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAA;AAE/D,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDjC,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,UAAkB;IAElB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IAChD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;YAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBAC/C,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;YACtC,CAAC;YACD,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,kBAAkB,CAAC,CAAA;QACzD,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IACjD,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CnC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCnC,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAA;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAA;QACzE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,oBAAoB,CAAC,CAAA;QAChE,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,oBAAoB,CAAC,CAAA;QAChE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IACjD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ContextStore } from '@contextgit/store';
2
+ import type { ContextGitConfig } from '@contextgit/core';
3
+ export declare function resolveRemoteStore(config: ContextGitConfig, remoteFlag?: string): ContextStore;
4
+ //# sourceMappingURL=remote-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-store.d.ts","sourceRoot":"","sources":["../../src/lib/remote-store.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB,YAAY,CAuBd"}
@@ -0,0 +1,28 @@
1
+ // remote-store.ts — resolve the correct remote ContextStore for push/pull.
2
+ //
3
+ // Priority:
4
+ // 1. --remote flag (always HTTP RemoteStore, bypasses everything)
5
+ // 2. config.supabaseUrl → SupabaseStore (requires SUPABASE_SERVICE_KEY env)
6
+ // 3. config.remote → RemoteStore (HTTP)
7
+ // 4. Neither → error
8
+ import { RemoteStore, SupabaseStore } from '@contextgit/store';
9
+ export function resolveRemoteStore(config, remoteFlag) {
10
+ // --remote flag always means HTTP RemoteStore, regardless of other config
11
+ if (remoteFlag)
12
+ return new RemoteStore(remoteFlag);
13
+ // Supabase takes precedence over HTTP remote when both configured
14
+ if (config.supabaseUrl) {
15
+ const key = process.env['SUPABASE_SERVICE_KEY'];
16
+ if (!key) {
17
+ throw new Error('SUPABASE_SERVICE_KEY env var is required when supabaseUrl is configured.\n' +
18
+ 'Set it in your shell or Claude Code env config.');
19
+ }
20
+ return new SupabaseStore(config.supabaseUrl, key);
21
+ }
22
+ if (config.remote)
23
+ return new RemoteStore(config.remote);
24
+ throw new Error('No remote configured.\n' +
25
+ 'Run: contextgit set-remote supabase <url> (Supabase)\n' +
26
+ ' or: contextgit set-remote <url> (self-hosted API)');
27
+ }
28
+ //# sourceMappingURL=remote-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-store.js","sourceRoot":"","sources":["../../src/lib/remote-store.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,EAAE;AACF,YAAY;AACZ,oEAAoE;AACpE,8EAA8E;AAC9E,0CAA0C;AAC1C,uBAAuB;AAEvB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAI9D,MAAM,UAAU,kBAAkB,CAChC,MAAwB,EACxB,UAAmB;IAEnB,0EAA0E;IAC1E,IAAI,UAAU;QAAE,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,CAAA;IAElD,kEAAkE;IAClE,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QAC/C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,4EAA4E;gBAC5E,iDAAiD,CAClD,CAAA;QACH,CAAC;QACD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;IACnD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAExD,MAAM,IAAI,KAAK,CACb,yBAAyB;QACzB,yDAAyD;QACzD,8DAA8D,CAC/D,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=remote-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-store.test.d.ts","sourceRoot":"","sources":["../../src/lib/remote-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { resolveRemoteStore } from './remote-store.js';
3
+ import { SupabaseStore } from '@contextgit/store';
4
+ import { RemoteStore } from '@contextgit/store';
5
+ vi.mock('@contextgit/store', () => ({
6
+ SupabaseStore: vi.fn(),
7
+ RemoteStore: vi.fn(),
8
+ LocalStore: vi.fn(),
9
+ }));
10
+ describe('resolveRemoteStore', () => {
11
+ const baseConfig = { projectId: 'p1', project: 'test', store: 'local',
12
+ agentRole: 'solo', workflowType: 'interactive',
13
+ autoSnapshot: false, snapshotInterval: 30,
14
+ embeddingModel: 'local' };
15
+ it('uses SupabaseStore when supabaseUrl is set and key is in env', () => {
16
+ process.env['SUPABASE_SERVICE_KEY'] = 'test-key';
17
+ resolveRemoteStore({ ...baseConfig, supabaseUrl: 'https://x.supabase.co' });
18
+ expect(SupabaseStore).toHaveBeenCalledWith('https://x.supabase.co', 'test-key');
19
+ delete process.env['SUPABASE_SERVICE_KEY'];
20
+ });
21
+ it('throws when supabaseUrl is set but SUPABASE_SERVICE_KEY is missing', () => {
22
+ delete process.env['SUPABASE_SERVICE_KEY'];
23
+ expect(() => resolveRemoteStore({ ...baseConfig, supabaseUrl: 'https://x.supabase.co' }))
24
+ .toThrow('SUPABASE_SERVICE_KEY');
25
+ });
26
+ it('uses RemoteStore when --remote flag is passed (always HTTP, regardless of supabaseUrl)', () => {
27
+ process.env['SUPABASE_SERVICE_KEY'] = 'key';
28
+ resolveRemoteStore({ ...baseConfig, supabaseUrl: 'https://x.supabase.co' }, 'https://api.example.com');
29
+ expect(RemoteStore).toHaveBeenCalledWith('https://api.example.com');
30
+ delete process.env['SUPABASE_SERVICE_KEY'];
31
+ });
32
+ it('uses RemoteStore when config.remote is set and supabaseUrl is absent', () => {
33
+ resolveRemoteStore({ ...baseConfig, remote: 'https://api.example.com' });
34
+ expect(RemoteStore).toHaveBeenCalledWith('https://api.example.com');
35
+ });
36
+ it('throws when no remote is configured at all', () => {
37
+ expect(() => resolveRemoteStore(baseConfig)).toThrow('No remote configured');
38
+ });
39
+ });
40
+ //# sourceMappingURL=remote-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-store.test.js","sourceRoot":"","sources":["../../src/lib/remote-store.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;IACtB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAA;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,MAAM,UAAU,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;QAChD,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa;QAC9C,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE;QACzC,cAAc,EAAE,OAAO,EAAW,CAAA;IAEvD,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,UAAU,CAAA;QAChD,kBAAkB,CAAC,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC,CAAA;QAC3E,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAA;QAC/E,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC;aACtF,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,KAAK,CAAA;QAC3C,kBAAkB,CAAC,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,uBAAuB,EAAE,EAAE,yBAAyB,CAAC,CAAA;QACtG,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;QACnE,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,kBAAkB,CAAC,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAA;QACxE,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "contextgit",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "contextgit": "./bin/run.js"
@@ -19,9 +19,9 @@
19
19
  "typecheck": "tsc --noEmit"
20
20
  },
21
21
  "dependencies": {
22
- "@contextgit/core": "0.0.11",
23
- "@contextgit/store": "0.0.11",
24
- "@contextgit/api": "0.0.11",
22
+ "@contextgit/core": "0.0.13",
23
+ "@contextgit/store": "0.0.13",
24
+ "@contextgit/api": "0.0.13",
25
25
  "@oclif/core": "^3.27.0",
26
26
  "nanoid": "^5.0.0",
27
27
  "simple-git": "^3.27.0"