gipity 1.0.272 → 1.0.306

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 (87) hide show
  1. package/dist/__tests__/capture-transcript.test.d.ts +1 -0
  2. package/dist/__tests__/capture-transcript.test.js +92 -0
  3. package/dist/__tests__/capture-transcript.test.js.map +1 -0
  4. package/dist/__tests__/cli-smoke.test.js +5 -5
  5. package/dist/__tests__/cli-smoke.test.js.map +1 -1
  6. package/dist/__tests__/prompts.test.d.ts +1 -0
  7. package/dist/__tests__/prompts.test.js +129 -0
  8. package/dist/__tests__/prompts.test.js.map +1 -0
  9. package/dist/__tests__/push-cas.test.d.ts +1 -0
  10. package/dist/__tests__/push-cas.test.js +133 -0
  11. package/dist/__tests__/push-cas.test.js.map +1 -0
  12. package/dist/__tests__/sync-apply.test.d.ts +1 -0
  13. package/dist/__tests__/sync-apply.test.js +457 -0
  14. package/dist/__tests__/sync-apply.test.js.map +1 -0
  15. package/dist/__tests__/sync-lock.test.d.ts +1 -0
  16. package/dist/__tests__/sync-lock.test.js +105 -0
  17. package/dist/__tests__/sync-lock.test.js.map +1 -0
  18. package/dist/__tests__/sync.test.js +115 -151
  19. package/dist/__tests__/sync.test.js.map +1 -1
  20. package/dist/adopt-cwd.d.ts +66 -0
  21. package/dist/adopt-cwd.js +255 -0
  22. package/dist/adopt-cwd.js.map +1 -0
  23. package/dist/api.d.ts +11 -1
  24. package/dist/api.js +46 -3
  25. package/dist/api.js.map +1 -1
  26. package/dist/capture/sources/claude-code.d.ts +78 -0
  27. package/dist/capture/sources/claude-code.js +158 -0
  28. package/dist/capture/sources/claude-code.js.map +1 -0
  29. package/dist/commands/chat.js +8 -8
  30. package/dist/commands/chat.js.map +1 -1
  31. package/dist/commands/claude.js +257 -125
  32. package/dist/commands/claude.js.map +1 -1
  33. package/dist/commands/init.js +34 -47
  34. package/dist/commands/init.js.map +1 -1
  35. package/dist/commands/location.js +1 -1
  36. package/dist/commands/location.js.map +1 -1
  37. package/dist/commands/logout.js +1 -1
  38. package/dist/commands/logout.js.map +1 -1
  39. package/dist/commands/page-inspect.js +36 -25
  40. package/dist/commands/page-inspect.js.map +1 -1
  41. package/dist/commands/page-screenshot.d.ts +2 -0
  42. package/dist/commands/page-screenshot.js +212 -0
  43. package/dist/commands/page-screenshot.js.map +1 -0
  44. package/dist/commands/project.js +19 -11
  45. package/dist/commands/project.js.map +1 -1
  46. package/dist/commands/relay.js +1 -1
  47. package/dist/commands/relay.js.map +1 -1
  48. package/dist/commands/scaffold.js +19 -13
  49. package/dist/commands/scaffold.js.map +1 -1
  50. package/dist/commands/sync.js +15 -24
  51. package/dist/commands/sync.js.map +1 -1
  52. package/dist/commands/uninstall.js +1 -1
  53. package/dist/commands/uninstall.js.map +1 -1
  54. package/dist/commands/update.js +1 -1
  55. package/dist/commands/update.js.map +1 -1
  56. package/dist/config.d.ts +5 -0
  57. package/dist/config.js.map +1 -1
  58. package/dist/helpers/sync.d.ts +4 -2
  59. package/dist/helpers/sync.js +13 -7
  60. package/dist/helpers/sync.js.map +1 -1
  61. package/dist/hooks/capture-runner.d.ts +24 -0
  62. package/dist/hooks/capture-runner.js +233 -0
  63. package/dist/hooks/capture-runner.js.map +1 -0
  64. package/dist/index.js +17 -16
  65. package/dist/index.js.map +1 -1
  66. package/dist/project-setup.d.ts +3 -4
  67. package/dist/project-setup.js +7 -9
  68. package/dist/project-setup.js.map +1 -1
  69. package/dist/prompts.d.ts +7 -0
  70. package/dist/prompts.js +25 -2
  71. package/dist/prompts.js.map +1 -1
  72. package/dist/relay/daemon.d.ts +8 -8
  73. package/dist/relay/daemon.js +23 -61
  74. package/dist/relay/daemon.js.map +1 -1
  75. package/dist/relay/device-http.d.ts +9 -0
  76. package/dist/relay/device-http.js +58 -0
  77. package/dist/relay/device-http.js.map +1 -0
  78. package/dist/setup.d.ts +8 -0
  79. package/dist/setup.js +55 -16
  80. package/dist/setup.js.map +1 -1
  81. package/dist/sync.d.ts +55 -37
  82. package/dist/sync.js +628 -445
  83. package/dist/sync.js.map +1 -1
  84. package/dist/upload.d.ts +13 -2
  85. package/dist/upload.js +59 -6
  86. package/dist/upload.js.map +1 -1
  87. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Unit tests for the Claude Code transcript → ingest mapper used by the
3
+ * capture hook runner. Pure function tests, no file I/O, no network.
4
+ */
5
+ import { describe, it } from 'node:test';
6
+ import assert from 'node:assert/strict';
7
+ import { transcriptLineToEntries, parseTranscript, } from '../capture/sources/claude-code.js';
8
+ describe('transcriptLineToEntries', () => {
9
+ it('skips queue-operation, summary, sidechain, and envelope-only lines', () => {
10
+ assert.deepEqual(transcriptLineToEntries({ type: 'queue-operation', uuid: 'a' }), []);
11
+ assert.deepEqual(transcriptLineToEntries({ type: 'summary', uuid: 'b' }), []);
12
+ assert.deepEqual(transcriptLineToEntries({ type: 'user', uuid: 'c', isSidechain: true, message: { content: 'hi' } }), []);
13
+ assert.deepEqual(transcriptLineToEntries({ type: 'user', uuid: 'd', toolUseResult: { foo: 1 } }), []);
14
+ });
15
+ it('skips lines missing a uuid', () => {
16
+ assert.deepEqual(transcriptLineToEntries({ type: 'user', message: { content: 'hi' } }), []);
17
+ });
18
+ it('maps a string-content user message to a prompt entry tagged with uuid', () => {
19
+ const out = transcriptLineToEntries({ type: 'user', uuid: 'u1', message: { content: 'what is 2+2' } });
20
+ assert.deepEqual(out, [{ kind: 'prompt', prompt: 'what is 2+2', source_uuid: 'u1' }]);
21
+ });
22
+ it('maps a user message with tool_result blocks to one tool_result per block', () => {
23
+ const out = transcriptLineToEntries({
24
+ type: 'user',
25
+ uuid: 'u2',
26
+ message: {
27
+ content: [
28
+ { type: 'tool_result', tool_use_id: 'tool_a', content: 'ok' },
29
+ { type: 'tool_result', tool_use_id: 'tool_b', content: 'fail', is_error: true },
30
+ ],
31
+ },
32
+ });
33
+ assert.equal(out.length, 2);
34
+ assert.equal(out[0].kind, 'tool_result');
35
+ assert.equal(out[0].tool_use_id, 'tool_a');
36
+ assert.equal(out[0].source_uuid, 'u2');
37
+ assert.equal(out[1].is_error, true);
38
+ });
39
+ it('maps an assistant message with text + tool_use blocks', () => {
40
+ const out = transcriptLineToEntries({
41
+ type: 'assistant',
42
+ uuid: 'a1',
43
+ message: {
44
+ content: [
45
+ { type: 'text', text: 'running:' },
46
+ { type: 'tool_use', id: 'tool_a', name: 'Bash', input: { command: 'ls' } },
47
+ { type: 'text', text: 'done' },
48
+ ],
49
+ },
50
+ });
51
+ // One assistant entry (with joined text + full blocks) + one tool_use entry
52
+ assert.equal(out.length, 2);
53
+ assert.equal(out[0].kind, 'assistant');
54
+ assert.equal(out[0].text, 'running:\ndone');
55
+ assert.equal(out[0].source_uuid, 'a1');
56
+ assert.equal(out[1].kind, 'tool_use');
57
+ assert.equal(out[1].tool_name, 'Bash');
58
+ assert.equal(out[1].source_uuid, 'a1');
59
+ });
60
+ });
61
+ describe('parseTranscript', () => {
62
+ const user1 = JSON.stringify({ type: 'user', uuid: 'u1', message: { content: 'hello' } });
63
+ const asst1 = JSON.stringify({ type: 'assistant', uuid: 'a1', message: { content: [{ type: 'text', text: 'hi' }] } });
64
+ const user2 = JSON.stringify({ type: 'user', uuid: 'u2', message: { content: 'again' } });
65
+ const asst2 = JSON.stringify({ type: 'assistant', uuid: 'a2', message: { content: [{ type: 'text', text: 'yes' }] } });
66
+ const transcript = [user1, asst1, user2, asst2].join('\n');
67
+ it('emits every entry when watermark is null', () => {
68
+ const r = parseTranscript(transcript, null);
69
+ assert.equal(r.entries.length, 4);
70
+ assert.equal(r.lastUuid, 'a2');
71
+ assert.equal(r.foundWatermark, true);
72
+ });
73
+ it('skips up through the watermark and emits the rest', () => {
74
+ const r = parseTranscript(transcript, 'a1');
75
+ assert.equal(r.entries.length, 2);
76
+ assert.equal(r.entries[0].prompt, 'again');
77
+ assert.equal(r.lastUuid, 'a2');
78
+ assert.equal(r.foundWatermark, true);
79
+ });
80
+ it('reports foundWatermark=false when watermark isn\'t in the transcript', () => {
81
+ const r = parseTranscript(transcript, 'missing-uuid');
82
+ assert.equal(r.foundWatermark, false);
83
+ });
84
+ it('tolerates malformed JSONL lines', () => {
85
+ const junk = transcript + '\n{not json\n' + user2;
86
+ const r = parseTranscript(junk, null);
87
+ // Malformed lines are ignored; duplicate u2 appears twice (dedup is the
88
+ // server's job via source_uuid, not the parser's).
89
+ assert.equal(r.entries.length, 5);
90
+ });
91
+ });
92
+ //# sourceMappingURL=capture-transcript.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-transcript.test.js","sourceRoot":"","sources":["../../src/__tests__/capture-transcript.test.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ describe('cli-smoke: --version and --help', () => {
17
17
  assert.equal(r.status, 0);
18
18
  const out = r.stdout;
19
19
  assert.match(out, new RegExp(`Gipity CLI\\s+v${PKG_VERSION.replace(/\./g, '\\.')}`));
20
- const sections = ['Setup:', 'Project:', 'Resources:', 'Agent:', 'Maintenance:'];
20
+ const sections = ['Common:', 'Connect:', 'Project:', 'Files:', 'App building:', 'Utilities:', 'Agent:', 'Setup:'];
21
21
  let lastIdx = -1;
22
22
  for (const s of sections) {
23
23
  const idx = out.indexOf(s);
@@ -26,11 +26,11 @@ describe('cli-smoke: --version and --help', () => {
26
26
  lastIdx = idx;
27
27
  }
28
28
  });
29
- it('--help lists doctor and update under Maintenance', () => {
29
+ it('--help lists doctor and update under Setup', () => {
30
30
  const r = runCli(['--help']);
31
- const maint = r.stdout.split('Maintenance:')[1] ?? '';
32
- assert.match(maint, /\bdoctor\b/);
33
- assert.match(maint, /\bupdate\b/);
31
+ const setup = r.stdout.split('Setup:')[1] ?? '';
32
+ assert.match(setup, /\bdoctor\b/);
33
+ assert.match(setup, /\bupdate\b/);
34
34
  });
35
35
  });
36
36
  describe('cli-smoke: doctor', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"cli-smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-smoke.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-smoke.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Wrap-format contract for relay-dispatched `gipity claude -p` messages.
3
+ *
4
+ * The user's actual message must sit between the `USER_MSG_OPEN` /
5
+ * `USER_MSG_CLOSE` tags with no trailing instructions, and the client-side
6
+ * `stripPreamble` in `platform/client/src/ts/commands/claude-display.ts`
7
+ * must use identical tag strings — otherwise the web CLI renders the full
8
+ * wrap as a `claude>` turn (the historical bug: duplicate user turns
9
+ * rendered as walls of preamble text).
10
+ */
11
+ import { describe, it } from 'node:test';
12
+ import assert from 'node:assert/strict';
13
+ import { readFileSync } from 'fs';
14
+ import { fileURLToPath } from 'url';
15
+ import { dirname, resolve } from 'path';
16
+ import { USER_MSG_OPEN, USER_MSG_CLOSE, buildFreshWrap, buildResumeWrap, } from '../prompts.js';
17
+ const HERE = dirname(fileURLToPath(import.meta.url));
18
+ // dist/__tests__/ → repo root depends on build layout. These tests also run
19
+ // against the source tree via tsx in CI — handle both by walking up until we
20
+ // find the platform/ sibling.
21
+ function repoRoot() {
22
+ let p = HERE;
23
+ for (let i = 0; i < 8; i++) {
24
+ try {
25
+ const probe = resolve(p, 'platform/client/src/ts/commands/claude-display.ts');
26
+ readFileSync(probe, 'utf-8');
27
+ return p;
28
+ }
29
+ catch { /* keep walking */ }
30
+ p = resolve(p, '..');
31
+ }
32
+ throw new Error('could not locate repo root from test file');
33
+ }
34
+ describe('buildFreshWrap', () => {
35
+ it('wraps the user message between USER_MSG_OPEN / USER_MSG_CLOSE', () => {
36
+ const out = buildFreshWrap('## Project context\nstuff here', 'hello world');
37
+ assert.ok(out.includes(USER_MSG_OPEN), 'missing open tag');
38
+ assert.ok(out.includes(USER_MSG_CLOSE), 'missing close tag');
39
+ const open = out.indexOf(USER_MSG_OPEN) + USER_MSG_OPEN.length;
40
+ const close = out.lastIndexOf(USER_MSG_CLOSE);
41
+ assert.equal(out.slice(open, close).trim(), 'hello world');
42
+ });
43
+ it('places the response directive before the user message, not after', () => {
44
+ const out = buildFreshWrap('ctx', 'do a thing');
45
+ const directiveIdx = out.indexOf(`Don't greet`);
46
+ const openIdx = out.indexOf(USER_MSG_OPEN);
47
+ assert.ok(directiveIdx !== -1, 'directive should be present');
48
+ assert.ok(directiveIdx < openIdx, 'directive must come before user-message tag');
49
+ });
50
+ it('has nothing after the closing tag', () => {
51
+ const out = buildFreshWrap('ctx', 'msg');
52
+ assert.ok(out.trimEnd().endsWith(USER_MSG_CLOSE), `wrap should end with close tag, got tail: ${out.slice(-120)}`);
53
+ });
54
+ it('does not emit the legacy "Answer directly" trailer', () => {
55
+ const out = buildFreshWrap('ctx', 'msg');
56
+ assert.equal(out.includes('Answer directly'), false, 'legacy trailer leaked into new wrap');
57
+ });
58
+ });
59
+ describe('buildResumeWrap', () => {
60
+ const opts = {
61
+ projectName: 'proj',
62
+ projectSlug: 'proj',
63
+ projectGuid: 'p_abc',
64
+ accountSlug: 'acct',
65
+ cwd: '/tmp',
66
+ };
67
+ it('wraps the user message between tags', () => {
68
+ const out = buildResumeWrap(opts, 'whats 2+2');
69
+ const open = out.indexOf(USER_MSG_OPEN) + USER_MSG_OPEN.length;
70
+ const close = out.lastIndexOf(USER_MSG_CLOSE);
71
+ assert.ok(open > USER_MSG_OPEN.length - 1, 'open tag missing');
72
+ assert.ok(close > open, 'close tag missing or before open');
73
+ assert.equal(out.slice(open, close).trim(), 'whats 2+2');
74
+ });
75
+ it('has nothing after the closing tag', () => {
76
+ const out = buildResumeWrap(opts, 'x');
77
+ assert.ok(out.trimEnd().endsWith(USER_MSG_CLOSE));
78
+ });
79
+ });
80
+ describe('tag constant drift guard', () => {
81
+ it('client-side claude-display.ts uses identical tag strings', () => {
82
+ const root = repoRoot();
83
+ const clientSrc = readFileSync(resolve(root, 'platform/client/src/ts/commands/claude-display.ts'), 'utf-8');
84
+ const openMatch = clientSrc.match(/USER_MSG_OPEN\s*=\s*'([^']+)'/);
85
+ const closeMatch = clientSrc.match(/USER_MSG_CLOSE\s*=\s*'([^']+)'/);
86
+ assert.ok(openMatch, 'claude-display.ts must define USER_MSG_OPEN as a single-quoted string literal');
87
+ assert.ok(closeMatch, 'claude-display.ts must define USER_MSG_CLOSE as a single-quoted string literal');
88
+ assert.equal(openMatch[1], USER_MSG_OPEN, 'open tag drift');
89
+ assert.equal(closeMatch[1], USER_MSG_CLOSE, 'close tag drift');
90
+ });
91
+ });
92
+ // Local replica of the client-side stripPreamble. The client file can't be
93
+ // imported directly (different package, no DOM shim in node:test), so this
94
+ // replica + the drift-guard above (identical tag strings) gives equivalent
95
+ // coverage. If the algorithm shape changes in claude-display.ts, update
96
+ // both here and there.
97
+ function stripPreambleReplica(s) {
98
+ if (!s)
99
+ return s;
100
+ const m1 = s.match(/The user's first message:\s*"([\s\S]+?)"(?:\s*\n|\s*$)/);
101
+ if (m1)
102
+ return m1[1];
103
+ const open = s.indexOf(USER_MSG_OPEN);
104
+ const close = s.lastIndexOf(USER_MSG_CLOSE);
105
+ if (open !== -1 && close !== -1 && close > open) {
106
+ return s.slice(open + USER_MSG_OPEN.length, close).trim();
107
+ }
108
+ return s;
109
+ }
110
+ describe('stripPreamble round-trip', () => {
111
+ it('recovers the exact user message from buildFreshWrap output', () => {
112
+ const msg = 'hello world — whats 2+2 and also a newline\nplease';
113
+ const out = buildFreshWrap('## ctx\n- Name: foo\n- Files: empty', msg);
114
+ assert.equal(stripPreambleReplica(out), msg);
115
+ });
116
+ it('recovers the exact user message from buildResumeWrap output', () => {
117
+ const msg = 'resume test message';
118
+ const out = buildResumeWrap({ projectName: 'p', projectSlug: 'p', projectGuid: 'p_abc', accountSlug: 'a', cwd: '/' }, msg);
119
+ assert.equal(stripPreambleReplica(out), msg);
120
+ });
121
+ it('still handles the legacy first-message bootstrap form', () => {
122
+ const s = `Some context\n\nThe user's first message: "build a pacman game"\n\nGet started.`;
123
+ assert.equal(stripPreambleReplica(s), 'build a pacman game');
124
+ });
125
+ it('returns the input unchanged when no tags are present', () => {
126
+ assert.equal(stripPreambleReplica('plain message'), 'plain message');
127
+ });
128
+ });
129
+ //# sourceMappingURL=prompts.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../../src/__tests__/prompts.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EACL,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,4EAA4E;AAC5E,6EAA6E;AAC7E,8BAA8B;AAC9B,SAAS,QAAQ;IACf,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,mDAAmD,CAAC,CAAC;YAC9E,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7B,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC9B,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC/D,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,GAAG,GAAG,cAAc,CAAC,gCAAgC,EAAE,aAAa,CAAC,CAAC;QAC5E,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;QAC/D,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,CAAC,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,EAAE,6BAA6B,CAAC,CAAC;QAC9D,MAAM,CAAC,EAAE,CAAC,YAAY,GAAG,OAAO,EAAE,6CAA6C,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,6CAA6C,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,qCAAqC,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,IAAI,GAAG;QACX,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,MAAM;QACnB,GAAG,EAAE,MAAM;KACZ,CAAC;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;QAC/D,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC/D,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,kCAAkC,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,YAAY,CAC5B,OAAO,CAAC,IAAI,EAAE,mDAAmD,CAAC,EAClE,OAAO,CACR,CAAC;QACF,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACrE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,+EAA+E,CAAC,CAAC;QACtG,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,gFAAgF,CAAC,CAAC;QACxG,MAAM,CAAC,KAAK,CAAC,SAAU,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,UAAW,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,wEAAwE;AACxE,uBAAuB;AACvB,SAAS,oBAAoB,CAAC,CAAS;IACrC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC7E,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;QAChD,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,GAAG,GAAG,oDAAoD,CAAC;QACjE,MAAM,GAAG,GAAG,cAAc,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,GAAG,GAAG,qBAAqB,CAAC;QAClC,MAAM,GAAG,GAAG,eAAe,CACzB,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EACxF,GAAG,CACJ,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,iFAAiF,CAAC;QAC5F,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,133 @@
1
+ /**
2
+ * `gipity push` (pushFile) CAS behavior: when the local baseline is stale,
3
+ * the server returns 409 and we surface a clear error that tells the user
4
+ * to run `gipity sync`.
5
+ */
6
+ import { describe, it, before, after } from 'node:test';
7
+ import assert from 'node:assert/strict';
8
+ import { writeFileSync, mkdirSync, mkdtempSync, rmSync } from 'fs';
9
+ import { join } from 'path';
10
+ import { tmpdir } from 'os';
11
+ // Set HOME BEFORE importing the CLI so ~/.gipity/auth.json resolves to our tempdir.
12
+ let home;
13
+ let projectDir;
14
+ let origHome;
15
+ let origCwd;
16
+ let origFetch;
17
+ before(() => {
18
+ origHome = process.env.HOME;
19
+ origCwd = process.cwd();
20
+ origFetch = globalThis.fetch;
21
+ home = mkdtempSync(join(tmpdir(), 'gipity-pushcas-home-'));
22
+ process.env.HOME = home;
23
+ mkdirSync(join(home, '.gipity'), { recursive: true });
24
+ writeFileSync(join(home, '.gipity', 'auth.json'), JSON.stringify({
25
+ accessToken: 'fake-jwt',
26
+ refreshToken: 'fake-refresh',
27
+ email: 'ec-test@914-6.com',
28
+ expiresAt: new Date(Date.now() + 10 * 60_000).toISOString(),
29
+ }));
30
+ projectDir = mkdtempSync(join(tmpdir(), 'gipity-pushcas-proj-'));
31
+ writeFileSync(join(projectDir, '.gipity.json'), JSON.stringify({
32
+ projectGuid: 'proj_test',
33
+ projectSlug: 'p',
34
+ accountSlug: 'a',
35
+ agentGuid: 'agt_t',
36
+ conversationGuid: null,
37
+ apiBase: 'https://test.invalid',
38
+ ignore: [],
39
+ }));
40
+ mkdirSync(join(projectDir, '.gipity'), { recursive: true });
41
+ process.chdir(projectDir);
42
+ });
43
+ after(() => {
44
+ process.chdir(origCwd);
45
+ globalThis.fetch = origFetch;
46
+ if (origHome === undefined)
47
+ delete process.env.HOME;
48
+ else
49
+ process.env.HOME = origHome;
50
+ rmSync(home, { recursive: true, force: true });
51
+ rmSync(projectDir, { recursive: true, force: true });
52
+ });
53
+ function stubFetch(handler) {
54
+ globalThis.fetch = handler;
55
+ }
56
+ describe('pushFile CAS', () => {
57
+ it('surfaces a clear error when the remote has a newer version', async () => {
58
+ // Baseline says we last synced at serverVersion=5.
59
+ writeFileSync(join(projectDir, '.gipity', 'sync-state.json'), JSON.stringify({
60
+ projectGuid: 'proj_test',
61
+ files: {
62
+ 'hello.txt': {
63
+ size: 5, mtime: '2024-01-01T00:00:00.000Z',
64
+ sha256: 'fakesha-old',
65
+ serverVersion: 5,
66
+ },
67
+ },
68
+ lastFullSync: '2024-01-01T00:00:00.000Z',
69
+ }));
70
+ writeFileSync(join(projectDir, 'hello.txt'), 'world');
71
+ // Server returns 409: it's at version 7 now, client expected 5.
72
+ stubFetch(async (url) => {
73
+ if (url.includes('/files/upload-init')) {
74
+ return new Response(JSON.stringify({
75
+ error: { code: 'CONFLICT', message: 'Version mismatch' },
76
+ data: { current_server_version: 7 },
77
+ }), { status: 409, headers: { 'content-type': 'application/json' } });
78
+ }
79
+ throw new Error(`unexpected fetch to ${url}`);
80
+ });
81
+ // Force-evict the module cache so our stubbed fetch is picked up cleanly.
82
+ const { clearConfigCache } = await import('../config.js');
83
+ clearConfigCache();
84
+ const { pushFile } = await import('../sync.js');
85
+ await assert.rejects(() => pushFile(join(projectDir, 'hello.txt')), /newer version.*serverVersion=7.*gipity sync/is);
86
+ });
87
+ it('succeeds when baseline matches — pushFile updates serverVersion in baseline', async () => {
88
+ writeFileSync(join(projectDir, '.gipity', 'sync-state.json'), JSON.stringify({
89
+ projectGuid: 'proj_test',
90
+ files: {
91
+ 'greet.txt': {
92
+ size: 5, mtime: '2024-01-01T00:00:00.000Z',
93
+ sha256: 'fakesha-old',
94
+ serverVersion: 3,
95
+ },
96
+ },
97
+ lastFullSync: '2024-01-01T00:00:00.000Z',
98
+ }));
99
+ writeFileSync(join(projectDir, 'greet.txt'), 'hi-v4');
100
+ // Server: upload-init → presigned URL. PUT to presigned URL → etag.
101
+ // upload-complete → 200 with server_version=4.
102
+ stubFetch(async (url, init) => {
103
+ if (url.includes('/files/upload-init')) {
104
+ return new Response(JSON.stringify({
105
+ data: {
106
+ upload_guid: 'fl_abc',
107
+ method: 'PUT',
108
+ url: 'https://s3.example/stage',
109
+ expires_in: 3600,
110
+ },
111
+ }), { status: 200, headers: { 'content-type': 'application/json' } });
112
+ }
113
+ if (url.startsWith('https://s3.example')) {
114
+ // Presigned PUT — return an etag.
115
+ return new Response('', { status: 200, headers: { etag: '"fake-etag"' } });
116
+ }
117
+ if (url.includes('/files/upload-complete')) {
118
+ return new Response(JSON.stringify({
119
+ data: { size: 5, guid: 'fl_new', version: 1, server_version: 4 },
120
+ }), { status: 200, headers: { 'content-type': 'application/json' } });
121
+ }
122
+ throw new Error(`unexpected fetch to ${url}`);
123
+ });
124
+ const { clearConfigCache } = await import('../config.js');
125
+ clearConfigCache();
126
+ const { pushFile, readBaseline } = await import('../sync.js');
127
+ await pushFile(join(projectDir, 'greet.txt'));
128
+ const bl = readBaseline('proj_test');
129
+ assert.ok(bl.files['greet.txt'], 'greet.txt should be in baseline');
130
+ assert.equal(bl.files['greet.txt'].serverVersion, 4, 'baseline should reflect bumped server version');
131
+ });
132
+ });
133
+ //# sourceMappingURL=push-cas.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-cas.test.js","sourceRoot":"","sources":["../../src/__tests__/push-cas.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};