@intutic/cli 0.1.1 → 1.0.4

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 (166) hide show
  1. package/dist/cli.js +376 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/benchmark.d.ts +31 -0
  4. package/dist/commands/benchmark.d.ts.map +1 -0
  5. package/dist/commands/benchmark.js +211 -0
  6. package/dist/commands/benchmark.js.map +1 -0
  7. package/dist/commands/connect.d.ts +8 -6
  8. package/dist/commands/connect.d.ts.map +1 -1
  9. package/dist/commands/connect.js +414 -80
  10. package/dist/commands/connect.js.map +1 -1
  11. package/dist/commands/enterprise-install.d.ts +36 -0
  12. package/dist/commands/enterprise-install.d.ts.map +1 -0
  13. package/dist/commands/enterprise-install.js +289 -0
  14. package/dist/commands/enterprise-install.js.map +1 -0
  15. package/dist/commands/eval.d.ts +13 -0
  16. package/dist/commands/eval.d.ts.map +1 -0
  17. package/dist/commands/eval.js +67 -0
  18. package/dist/commands/eval.js.map +1 -0
  19. package/dist/commands/exec.d.ts +34 -0
  20. package/dist/commands/exec.d.ts.map +1 -0
  21. package/dist/commands/exec.js +114 -0
  22. package/dist/commands/exec.js.map +1 -0
  23. package/dist/commands/exec.test.d.ts +2 -0
  24. package/dist/commands/exec.test.d.ts.map +1 -0
  25. package/dist/commands/exec.test.js +29 -0
  26. package/dist/commands/exec.test.js.map +1 -0
  27. package/dist/commands/export.d.ts +21 -0
  28. package/dist/commands/export.d.ts.map +1 -0
  29. package/dist/commands/export.js +116 -0
  30. package/dist/commands/export.js.map +1 -0
  31. package/dist/commands/init.d.ts.map +1 -1
  32. package/dist/commands/init.js +28 -2
  33. package/dist/commands/init.js.map +1 -1
  34. package/dist/commands/install-daemon.d.ts +61 -0
  35. package/dist/commands/install-daemon.d.ts.map +1 -0
  36. package/dist/commands/install-daemon.js +691 -0
  37. package/dist/commands/install-daemon.js.map +1 -0
  38. package/dist/commands/install-daemon.test.d.ts +2 -0
  39. package/dist/commands/install-daemon.test.d.ts.map +1 -0
  40. package/dist/commands/install-daemon.test.js +93 -0
  41. package/dist/commands/install-daemon.test.js.map +1 -0
  42. package/dist/commands/login.js +2 -2
  43. package/dist/commands/login.js.map +1 -1
  44. package/dist/commands/logout.js +1 -1
  45. package/dist/commands/logout.js.map +1 -1
  46. package/dist/commands/mdm.d.ts +23 -0
  47. package/dist/commands/mdm.d.ts.map +1 -0
  48. package/dist/commands/mdm.js +134 -0
  49. package/dist/commands/mdm.js.map +1 -0
  50. package/dist/commands/skill.d.ts +27 -0
  51. package/dist/commands/skill.d.ts.map +1 -0
  52. package/dist/commands/skill.js +289 -0
  53. package/dist/commands/skill.js.map +1 -0
  54. package/dist/commands/sop-audit.d.ts +17 -0
  55. package/dist/commands/sop-audit.d.ts.map +1 -0
  56. package/dist/commands/sop-audit.js +136 -0
  57. package/dist/commands/sop-audit.js.map +1 -0
  58. package/dist/commands/status.d.ts.map +1 -1
  59. package/dist/commands/status.js +53 -1
  60. package/dist/commands/status.js.map +1 -1
  61. package/dist/commands/syncContext.d.ts +18 -0
  62. package/dist/commands/syncContext.d.ts.map +1 -0
  63. package/dist/commands/syncContext.js +37 -0
  64. package/dist/commands/syncContext.js.map +1 -0
  65. package/dist/commands/traces.d.ts +13 -0
  66. package/dist/commands/traces.d.ts.map +1 -1
  67. package/dist/commands/traces.js +96 -2
  68. package/dist/commands/traces.js.map +1 -1
  69. package/dist/commands/whoami.js +1 -1
  70. package/dist/commands/whoami.js.map +1 -1
  71. package/dist/config/keychain.d.ts +28 -0
  72. package/dist/config/keychain.d.ts.map +1 -0
  73. package/dist/config/keychain.js +99 -0
  74. package/dist/config/keychain.js.map +1 -0
  75. package/dist/config/store.d.ts +3 -3
  76. package/dist/config/store.d.ts.map +1 -1
  77. package/dist/config/store.js +30 -6
  78. package/dist/config/store.js.map +1 -1
  79. package/dist/harness/aider.d.ts +4 -3
  80. package/dist/harness/aider.d.ts.map +1 -1
  81. package/dist/harness/aider.js +13 -27
  82. package/dist/harness/aider.js.map +1 -1
  83. package/dist/harness/claudeDesktop.d.ts +18 -0
  84. package/dist/harness/claudeDesktop.d.ts.map +1 -0
  85. package/dist/harness/claudeDesktop.js +69 -0
  86. package/dist/harness/claudeDesktop.js.map +1 -0
  87. package/dist/harness/cline.d.ts +13 -0
  88. package/dist/harness/cline.d.ts.map +1 -0
  89. package/dist/harness/cline.js +75 -0
  90. package/dist/harness/cline.js.map +1 -0
  91. package/dist/harness/codex.d.ts +4 -4
  92. package/dist/harness/codex.d.ts.map +1 -1
  93. package/dist/harness/codex.js +33 -21
  94. package/dist/harness/codex.js.map +1 -1
  95. package/dist/harness/continue.d.ts +14 -0
  96. package/dist/harness/continue.d.ts.map +1 -0
  97. package/dist/harness/continue.js +97 -0
  98. package/dist/harness/continue.js.map +1 -0
  99. package/dist/harness/cursor.d.ts +13 -1
  100. package/dist/harness/cursor.d.ts.map +1 -1
  101. package/dist/harness/cursor.js +59 -3
  102. package/dist/harness/cursor.js.map +1 -1
  103. package/dist/harness/detector.d.ts +1 -1
  104. package/dist/harness/detector.d.ts.map +1 -1
  105. package/dist/harness/detector.js +13 -1
  106. package/dist/harness/detector.js.map +1 -1
  107. package/dist/harness/goose.d.ts +13 -0
  108. package/dist/harness/goose.d.ts.map +1 -0
  109. package/dist/harness/goose.js +45 -0
  110. package/dist/harness/goose.js.map +1 -0
  111. package/dist/harness/n8n.d.ts +8 -4
  112. package/dist/harness/n8n.d.ts.map +1 -1
  113. package/dist/harness/n8n.js +108 -13
  114. package/dist/harness/n8n.js.map +1 -1
  115. package/dist/harness/openWebUI.d.ts +13 -0
  116. package/dist/harness/openWebUI.d.ts.map +1 -0
  117. package/dist/harness/openWebUI.js +25 -0
  118. package/dist/harness/openWebUI.js.map +1 -0
  119. package/dist/harness/openhands.d.ts +3 -3
  120. package/dist/harness/openhands.d.ts.map +1 -1
  121. package/dist/harness/openhands.js +13 -9
  122. package/dist/harness/openhands.js.map +1 -1
  123. package/dist/harness/rooCode.d.ts +14 -0
  124. package/dist/harness/rooCode.d.ts.map +1 -0
  125. package/dist/harness/rooCode.js +77 -0
  126. package/dist/harness/rooCode.js.map +1 -0
  127. package/dist/harness/types.d.ts.map +1 -1
  128. package/dist/harness/types.js +6 -0
  129. package/dist/harness/types.js.map +1 -1
  130. package/dist/harness/vscodeSettingsWriter.d.ts +40 -0
  131. package/dist/harness/vscodeSettingsWriter.d.ts.map +1 -0
  132. package/dist/harness/vscodeSettingsWriter.js +116 -0
  133. package/dist/harness/vscodeSettingsWriter.js.map +1 -0
  134. package/dist/harness/windsurf.d.ts +13 -1
  135. package/dist/harness/windsurf.d.ts.map +1 -1
  136. package/dist/harness/windsurf.js +58 -3
  137. package/dist/harness/windsurf.js.map +1 -1
  138. package/dist/lib/api.d.ts +2 -0
  139. package/dist/lib/api.d.ts.map +1 -1
  140. package/dist/lib/api.js +71 -1
  141. package/dist/lib/api.js.map +1 -1
  142. package/dist/lib/envInjector.d.ts +24 -0
  143. package/dist/lib/envInjector.d.ts.map +1 -0
  144. package/dist/lib/envInjector.js +146 -0
  145. package/dist/lib/envInjector.js.map +1 -0
  146. package/dist/lib/envInjector.test.d.ts +2 -0
  147. package/dist/lib/envInjector.test.d.ts.map +1 -0
  148. package/dist/lib/envInjector.test.js +32 -0
  149. package/dist/lib/envInjector.test.js.map +1 -0
  150. package/dist/lib/gitHooks.d.ts +19 -0
  151. package/dist/lib/gitHooks.d.ts.map +1 -0
  152. package/dist/lib/gitHooks.js +58 -0
  153. package/dist/lib/gitHooks.js.map +1 -0
  154. package/dist/lib/onboarding.d.ts +17 -0
  155. package/dist/lib/onboarding.d.ts.map +1 -0
  156. package/dist/lib/onboarding.js +164 -0
  157. package/dist/lib/onboarding.js.map +1 -0
  158. package/dist/lib/process.d.ts +53 -0
  159. package/dist/lib/process.d.ts.map +1 -0
  160. package/dist/lib/process.js +181 -0
  161. package/dist/lib/process.js.map +1 -0
  162. package/dist/lib/process.test.d.ts +2 -0
  163. package/dist/lib/process.test.d.ts.map +1 -0
  164. package/dist/lib/process.test.js +44 -0
  165. package/dist/lib/process.test.js.map +1 -0
  166. package/package.json +22 -33
@@ -1,9 +1,64 @@
1
1
  /**
2
- * Windsurf adapter .windsurfrules
2
+ * windsurf.ts — Windsurf adapter (full implementation with hooks + TLS MITM proxy config).
3
+ *
4
+ * Writes .windsurfrules governance text and injects Cascade hook scripts
5
+ * at user-level (~/.codeium/windsurf/hooks.json) and workspace-level
6
+ * (.windsurf/hooks.json). Also writes HTTP proxy settings so Windsurf
7
+ * routes its AI traffic through the Intutic TLS MITM proxy.
8
+ *
3
9
  * HLD §3.14 — Harness Onboarding Matrix
4
10
  * @module
5
11
  */
12
+ import { access } from 'node:fs/promises';
13
+ import { join } from 'node:path';
14
+ import { homedir } from 'node:os';
6
15
  import { HarnessType } from '@intutic/shared-types';
7
- import { createMarkdownAdapter } from './base.js';
8
- export const windsurfAdapter = createMarkdownAdapter(HarnessType.WINDSURF, '.windsurfrules');
16
+ import { hashFile } from '../lib/hash.js';
17
+ import { buildMarkdownContent } from './base.js';
18
+ import { writeWindsurfHooks } from '@intutic/sync-daemon/harness/windsurfHooks';
19
+ import { writeFile, rename, mkdir } from 'node:fs/promises';
20
+ import { dirname } from 'node:path';
21
+ const CONFIG_FILE = '.windsurfrules';
22
+ const WINDSURF_USER_DIR = join(homedir(), '.codeium', 'windsurf');
23
+ export const windsurfAdapter = {
24
+ type: HarnessType.WINDSURF,
25
+ configFileName: CONFIG_FILE,
26
+ async detect(workspaceRoot) {
27
+ for (const marker of [CONFIG_FILE, '.windsurf']) {
28
+ try {
29
+ await access(join(workspaceRoot, marker));
30
+ return true;
31
+ }
32
+ catch { /* fall through */ }
33
+ }
34
+ try {
35
+ await access(WINDSURF_USER_DIR);
36
+ return true;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ },
42
+ async writeConfig(workspaceRoot, sops, proxyUrl) {
43
+ // 1. Write .windsurfrules markdown governance text
44
+ const filePath = join(workspaceRoot, CONFIG_FILE);
45
+ const content = buildMarkdownContent(sops, proxyUrl);
46
+ await mkdir(dirname(filePath), { recursive: true });
47
+ const tmp = filePath + '.intutic-tmp';
48
+ await writeFile(tmp, content, 'utf-8');
49
+ await rename(tmp, filePath);
50
+ // 2. Write Cascade hooks.json at user + workspace level, configure TLS MITM proxy
51
+ const proxyPort = parseInt(process.env.INTUTIC_PROXY_PORT ?? '8877', 10);
52
+ await writeWindsurfHooks(workspaceRoot, proxyUrl, proxyPort);
53
+ return filePath;
54
+ },
55
+ async readCurrentHash(workspaceRoot) {
56
+ try {
57
+ return await hashFile(join(workspaceRoot, CONFIG_FILE));
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ },
63
+ };
9
64
  //# sourceMappingURL=windsurf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/harness/windsurf.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAG,qBAAqB,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA"}
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/harness/windsurf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,WAAW,GAAG,gBAAgB,CAAA;AACpC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,cAAc,EAAE,WAAW;IAE3B,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAAC,OAAO,IAAI,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,KAAK,CAAA;QAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,IAAoB,EAAE,QAAgB;QAC7E,mDAAmD;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QACjD,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QACpD,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,QAAQ,GAAG,cAAc,CAAA;QACrC,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACtC,MAAM,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QAE3B,kFAAkF;QAClF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAA;QACxE,MAAM,kBAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;QAE5D,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAqB;QACzC,IAAI,CAAC;YAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAA;QAAC,CAAC;IACvF,CAAC;CACF,CAAA"}
package/dist/lib/api.d.ts CHANGED
@@ -33,6 +33,8 @@ export interface ApiClient {
33
33
  }>;
34
34
  /** Generic GET request for arbitrary API paths. */
35
35
  get<T>(path: string): Promise<T>;
36
+ /** Generic POST request for arbitrary API paths. */
37
+ post<T>(path: string, body?: unknown): Promise<T>;
36
38
  }
37
39
  /**
38
40
  * Create an API client bound to a control plane URL and API key.
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACd,MAAM,uBAAuB,CAAA;AAE9B,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC5D,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpF,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpE,KAAK,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpJ,mDAAmD;IACnD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CA+ClF"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACd,MAAM,uBAAuB,CAAA;AAE9B,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC5D,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpF,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpE,KAAK,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpJ,mDAAmD;IACnD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAChC,oDAAoD;IACpD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAClD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAmElF"}
package/dist/lib/api.js CHANGED
@@ -29,7 +29,20 @@ export function createApiClient(controlPlaneUrl, apiKey) {
29
29
  const text = await res.text().catch(() => 'Unknown error');
30
30
  throw new Error(`API ${method} ${path} failed (${res.status}): ${text}`);
31
31
  }
32
- return res.json();
32
+ const data = await res.json();
33
+ if (data &&
34
+ typeof data === 'object' &&
35
+ 'format' in data &&
36
+ data.format === 'toon' &&
37
+ typeof data.data === 'string' &&
38
+ typeof data.listProperty === 'string') {
39
+ const decoded = toonDecode(data.data);
40
+ data[data.listProperty] = decoded;
41
+ delete data.format;
42
+ delete data.data;
43
+ delete data.listProperty;
44
+ }
45
+ return data;
33
46
  }
34
47
  return {
35
48
  async fetchConfig(workspaceId) {
@@ -50,6 +63,63 @@ export function createApiClient(controlPlaneUrl, apiKey) {
50
63
  async get(path) {
51
64
  return request('GET', path);
52
65
  },
66
+ async post(path, body) {
67
+ return request('POST', path, body);
68
+ },
53
69
  };
54
70
  }
71
+ function toonDecode(toon) {
72
+ const lines = toon.trimEnd().split('\n');
73
+ if (lines.length < 1)
74
+ return [];
75
+ const header = lines[0];
76
+ if (!header.startsWith('TOON|'))
77
+ return [];
78
+ const colsStr = header.slice(5); // 'TOON|'.length
79
+ if (colsStr === '(empty)')
80
+ return [];
81
+ const cols = colsStr.split(',');
82
+ const rows = [];
83
+ for (const line of lines.slice(1)) {
84
+ if (!line.trim())
85
+ continue;
86
+ const cells = line
87
+ .replace(/\\\|/g, '\x00')
88
+ .split('|')
89
+ .map((c) => c.split('\x00').join('|').replace(/\\n/g, '\n'));
90
+ const obj = {};
91
+ for (let i = 0; i < cols.length; i++) {
92
+ const raw = cells[i] ?? '-';
93
+ if (raw === '-') {
94
+ obj[cols[i]] = null;
95
+ continue;
96
+ }
97
+ if (raw === 't') {
98
+ obj[cols[i]] = true;
99
+ continue;
100
+ }
101
+ if (raw === 'f') {
102
+ obj[cols[i]] = false;
103
+ continue;
104
+ }
105
+ const num = Number(raw);
106
+ if (!isNaN(num) && raw !== '') {
107
+ obj[cols[i]] = num;
108
+ continue;
109
+ }
110
+ if (raw.startsWith('{') || raw.startsWith('[')) {
111
+ try {
112
+ obj[cols[i]] = JSON.parse(raw);
113
+ continue;
114
+ }
115
+ catch {
116
+ /* fall through */
117
+ }
118
+ }
119
+ obj[cols[i]] = raw;
120
+ }
121
+ rows.push(obj);
122
+ }
123
+ return rows;
124
+ }
55
125
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,eAAuB,EAAE,MAAc;IACrE,MAAM,OAAO,GAAG;QACd,cAAc,EAAE,kBAAkB;QAClC,eAAe,EAAE,UAAU,MAAM,EAAE;KACpC,CAAA;IAED,KAAK,UAAU,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QACpE,MAAM,GAAG,GAAG,GAAG,eAAe,GAAG,IAAI,EAAE,CAAA;QACvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAA;YAC1D,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,IAAI,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAA;QAC1E,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAA;IACjC,CAAC;IAED,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,WAAmB;YACnC,OAAO,OAAO,CAAoB,MAAM,EAAE,qBAAqB,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QACnF,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,MAAoB;YACrC,OAAO,OAAO,CAAC,MAAM,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAA;QACvD,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,MAAqB;YACtC,OAAO,OAAO,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAA;QACzD,CAAC;QAED,KAAK,CAAC,KAAK;YACT,OAAO,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;QAC1C,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,QAAgB;YACzC,OAAO,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACnE,CAAC;QAED,KAAK,CAAC,GAAG,CAAI,IAAY;YACvB,OAAO,OAAO,CAAI,KAAK,EAAE,IAAI,CAAC,CAAA;QAChC,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface InjectionResult {
2
+ platform: NodeJS.Platform;
3
+ scope: 'system' | 'user';
4
+ vars: string[];
5
+ method: string;
6
+ }
7
+ export declare class PlatformNotSupportedError extends Error {
8
+ constructor(platform: string);
9
+ }
10
+ export declare class ElevationRequiredError extends Error {
11
+ constructor(path: string);
12
+ }
13
+ /**
14
+ * Injects ANTHROPIC_BASE_URL and OPENAI_BASE_URL as persistent env vars.
15
+ *
16
+ * @param proxyUrl - The Intutic proxy URL (e.g. https://proxy.acme.intutic.ai)
17
+ * @returns InjectionResult describing what was done
18
+ */
19
+ export declare function injectBaseUrlEnvVars(proxyUrl: string): Promise<InjectionResult>;
20
+ /**
21
+ * Removes the injected base URL env vars.
22
+ */
23
+ export declare function removeBaseUrlEnvVars(): Promise<void>;
24
+ //# sourceMappingURL=envInjector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envInjector.d.ts","sourceRoot":"","sources":["../../src/lib/envInjector.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAG,MAAM,CAAC,QAAQ,CAAA;IAC1B,KAAK,EAAM,QAAQ,GAAG,MAAM,CAAA;IAC5B,IAAI,EAAO,MAAM,EAAE,CAAA;IACnB,MAAM,EAAK,MAAM,CAAA;CAClB;AAED,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,QAAQ,EAAE,MAAM;CAI7B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,IAAI,EAAE,MAAM;CAIzB;AA0CD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAwCrF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB1D"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Environment Variable Injector (TD-041 graduation)
3
+ *
4
+ * Injects ANTHROPIC_BASE_URL and OPENAI_BASE_URL as persistent
5
+ * system-level environment variables that survive terminal restarts.
6
+ *
7
+ * Platform support:
8
+ * macOS: launchctl setenv <KEY> <VALUE>
9
+ * Linux: ~/.bashrc append (user-level; system /etc/environment requires sudo)
10
+ * Windows: setx <KEY> <VALUE> (user-level, no /M)
11
+ *
12
+ * LLD #30: Multi-Region Preparation, WS-5MR (TD-041)
13
+ * @module
14
+ */
15
+ import { execSync } from 'node:child_process';
16
+ import fs from 'node:fs';
17
+ import path from 'node:path';
18
+ import os from 'node:os';
19
+ import { createLogger } from '@intutic/logger';
20
+ const logger = createLogger('envInjector');
21
+ const ENV_VARS = ['ANTHROPIC_BASE_URL', 'OPENAI_BASE_URL'];
22
+ export class PlatformNotSupportedError extends Error {
23
+ constructor(platform) {
24
+ super(`Platform not supported for env injection: ${platform}`);
25
+ this.name = 'PlatformNotSupportedError';
26
+ }
27
+ }
28
+ export class ElevationRequiredError extends Error {
29
+ constructor(path) {
30
+ super(`System-level write requires root access to ${path}. Falling back to user-level.`);
31
+ this.name = 'ElevationRequiredError';
32
+ }
33
+ }
34
+ function macosInject(key, value) {
35
+ execSync(`launchctl setenv ${key} "${value.replace(/"/g, '\\"')}"`, { stdio: 'pipe' });
36
+ }
37
+ function macosRemove(key) {
38
+ try {
39
+ execSync(`launchctl unsetenv ${key}`, { stdio: 'pipe' });
40
+ }
41
+ catch { }
42
+ }
43
+ function linuxInjectUser(key, value) {
44
+ const rcFile = path.join(os.homedir(), '.bashrc');
45
+ const marker = `# intutic-env-${key}`;
46
+ const line = `export ${key}="${value.replace(/"/g, '\\"')}" ${marker}`;
47
+ let content = '';
48
+ try {
49
+ content = fs.readFileSync(rcFile, 'utf8');
50
+ }
51
+ catch { }
52
+ // Remove existing entry for this key
53
+ const lines = content.split('\n').filter(l => !l.includes(marker));
54
+ lines.push(line);
55
+ fs.writeFileSync(rcFile, lines.join('\n') + '\n', { mode: 0o644 });
56
+ }
57
+ function linuxRemoveUser(key) {
58
+ const rcFile = path.join(os.homedir(), '.bashrc');
59
+ const marker = `# intutic-env-${key}`;
60
+ try {
61
+ const content = fs.readFileSync(rcFile, 'utf8');
62
+ const filtered = content.split('\n').filter(l => !l.includes(marker)).join('\n');
63
+ fs.writeFileSync(rcFile, filtered + '\n', { mode: 0o644 });
64
+ }
65
+ catch { }
66
+ }
67
+ function windowsInject(key, value) {
68
+ execSync(`setx ${key} "${value.replace(/"/g, '\\"')}"`, { stdio: 'pipe' });
69
+ }
70
+ function windowsRemove(key) {
71
+ try {
72
+ execSync(`reg delete HKCU\\Environment /v ${key} /f`, { stdio: 'pipe' });
73
+ }
74
+ catch { }
75
+ }
76
+ /**
77
+ * Injects ANTHROPIC_BASE_URL and OPENAI_BASE_URL as persistent env vars.
78
+ *
79
+ * @param proxyUrl - The Intutic proxy URL (e.g. https://proxy.acme.intutic.ai)
80
+ * @returns InjectionResult describing what was done
81
+ */
82
+ export async function injectBaseUrlEnvVars(proxyUrl) {
83
+ const platform = os.platform();
84
+ logger.info({ platform, proxyUrl }, 'envInjector.inject_start');
85
+ if (platform === 'darwin') {
86
+ for (const key of ENV_VARS)
87
+ macosInject(key, proxyUrl);
88
+ logger.info({ platform, vars: ENV_VARS }, 'envInjector.macos_launchctl_set');
89
+ return { platform, scope: 'system', vars: [...ENV_VARS], method: 'launchctl setenv' };
90
+ }
91
+ if (platform === 'linux') {
92
+ // Attempt system-level first; fall back to user-level
93
+ let scope = 'user';
94
+ try {
95
+ const etcEnv = '/etc/environment';
96
+ // Only attempt if writable (i.e., running as root)
97
+ fs.accessSync(etcEnv, fs.constants.W_OK);
98
+ for (const key of ENV_VARS) {
99
+ let content = fs.readFileSync(etcEnv, 'utf8');
100
+ content = content.split('\n').filter(l => !l.startsWith(`${key}=`)).join('\n');
101
+ content += `\n${key}="${proxyUrl.replace(/"/g, '\\"')}"`;
102
+ fs.writeFileSync(etcEnv, content.trim() + '\n', { mode: 0o644 });
103
+ }
104
+ scope = 'system';
105
+ logger.info({ platform, vars: ENV_VARS }, 'envInjector.linux_etc_environment_set');
106
+ }
107
+ catch {
108
+ // Not root \u2014 user-level fallback
109
+ for (const key of ENV_VARS)
110
+ linuxInjectUser(key, proxyUrl);
111
+ logger.info({ platform, vars: ENV_VARS }, 'envInjector.linux_bashrc_set');
112
+ }
113
+ return { platform, scope, vars: [...ENV_VARS], method: scope === 'system' ? '/etc/environment' : '~/.bashrc' };
114
+ }
115
+ if (platform === 'win32') {
116
+ for (const key of ENV_VARS)
117
+ windowsInject(key, proxyUrl);
118
+ logger.info({ platform, vars: ENV_VARS }, 'envInjector.windows_setx_set');
119
+ return { platform, scope: 'user', vars: [...ENV_VARS], method: 'setx' };
120
+ }
121
+ throw new PlatformNotSupportedError(platform);
122
+ }
123
+ /**
124
+ * Removes the injected base URL env vars.
125
+ */
126
+ export async function removeBaseUrlEnvVars() {
127
+ const platform = os.platform();
128
+ logger.info({ platform }, 'envInjector.remove_start');
129
+ if (platform === 'darwin') {
130
+ for (const key of ENV_VARS)
131
+ macosRemove(key);
132
+ return;
133
+ }
134
+ if (platform === 'linux') {
135
+ for (const key of ENV_VARS)
136
+ linuxRemoveUser(key);
137
+ return;
138
+ }
139
+ if (platform === 'win32') {
140
+ for (const key of ENV_VARS)
141
+ windowsRemove(key);
142
+ return;
143
+ }
144
+ throw new PlatformNotSupportedError(platform);
145
+ }
146
+ //# sourceMappingURL=envInjector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envInjector.js","sourceRoot":"","sources":["../../src/lib/envInjector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=envInjector.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envInjector.test.d.ts","sourceRoot":"","sources":["../../src/lib/envInjector.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { injectBaseUrlEnvVars, removeBaseUrlEnvVars } from './envInjector.js';
3
+ import os from 'node:os';
4
+ import { execSync } from 'node:child_process';
5
+ describe('Environment Variable Injector', () => {
6
+ it('correctly injects and removes env variables on the current platform', async () => {
7
+ const platform = os.platform();
8
+ const testProxyUrl = 'http://127.0.0.1:3001';
9
+ const result = await injectBaseUrlEnvVars(testProxyUrl);
10
+ expect(result.platform).toBe(platform);
11
+ expect(result.vars).toContain('ANTHROPIC_BASE_URL');
12
+ expect(result.vars).toContain('OPENAI_BASE_URL');
13
+ if (platform === 'darwin') {
14
+ expect(result.scope).toBe('system');
15
+ expect(result.method).toBe('launchctl setenv');
16
+ // Verify launchctl has it
17
+ const anthropicVal = execSync('launchctl getenv ANTHROPIC_BASE_URL').toString().trim();
18
+ expect(anthropicVal).toBe(testProxyUrl);
19
+ const openaiVal = execSync('launchctl getenv OPENAI_BASE_URL').toString().trim();
20
+ expect(openaiVal).toBe(testProxyUrl);
21
+ }
22
+ // Now clean up/remove
23
+ await removeBaseUrlEnvVars();
24
+ if (platform === 'darwin') {
25
+ const anthropicValAfter = execSync('launchctl getenv ANTHROPIC_BASE_URL').toString().trim();
26
+ expect(anthropicValAfter).toBe('');
27
+ const openaiValAfter = execSync('launchctl getenv OPENAI_BASE_URL').toString().trim();
28
+ expect(openaiValAfter).toBe('');
29
+ }
30
+ });
31
+ });
32
+ //# sourceMappingURL=envInjector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envInjector.test.js","sourceRoot":"","sources":["../../src/lib/envInjector.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC7E,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;QAC9B,MAAM,YAAY,GAAG,uBAAuB,CAAA;QAE5C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QAEhD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;YAE9C,0BAA0B;YAC1B,MAAM,YAAY,GAAG,QAAQ,CAAC,qCAAqC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;YACtF,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAEvC,MAAM,SAAS,GAAG,QAAQ,CAAC,kCAAkC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;YAChF,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC;QAED,sBAAsB;QACtB,MAAM,oBAAoB,EAAE,CAAA;QAE5B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,iBAAiB,GAAG,QAAQ,CAAC,qCAAqC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;YAC3F,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAClC,MAAM,cAAc,GAAG,QAAQ,CAAC,kCAAkC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;YACrF,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACjC,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * gitHooks.ts — Install and manage Git context hooks.
3
+ *
4
+ * Installs post-commit and post-checkout hooks into the workspace's
5
+ * `.git/hooks/` directory to trigger real-time branch/commit tracking.
6
+ *
7
+ * LLD #14 — gitHooks.ts
8
+ * HLD §3.14 — Real-Time State Mirroring (Git hooks context integration)
9
+ *
10
+ * @module
11
+ */
12
+ /**
13
+ * Installs post-commit and post-checkout hooks into `.git/hooks/`.
14
+ *
15
+ * @param workspaceRoot - Workspace root directory.
16
+ * @returns Promise<boolean> - True if successfully installed, false otherwise.
17
+ */
18
+ export declare function installGitHooks(workspaceRoot: string): Promise<boolean>;
19
+ //# sourceMappingURL=gitHooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitHooks.d.ts","sourceRoot":"","sources":["../../src/lib/gitHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiC7E"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * gitHooks.ts — Install and manage Git context hooks.
3
+ *
4
+ * Installs post-commit and post-checkout hooks into the workspace's
5
+ * `.git/hooks/` directory to trigger real-time branch/commit tracking.
6
+ *
7
+ * LLD #14 — gitHooks.ts
8
+ * HLD §3.14 — Real-Time State Mirroring (Git hooks context integration)
9
+ *
10
+ * @module
11
+ */
12
+ import * as node_fs from 'node:fs/promises';
13
+ import * as node_path from 'node:path';
14
+ import { log } from './logger.js';
15
+ const HOOK_CONTENT = `
16
+ #!/bin/sh
17
+ # Intutic Git Context Sync Hook
18
+ if command -v intutic >/dev/null 2>&1; then
19
+ intutic sync-context --git --branch "$(git branch --show-current)" --commit "$(git rev-parse HEAD)" >/dev/null 2>&1 &
20
+ fi
21
+ `.trim();
22
+ /**
23
+ * Installs post-commit and post-checkout hooks into `.git/hooks/`.
24
+ *
25
+ * @param workspaceRoot - Workspace root directory.
26
+ * @returns Promise<boolean> - True if successfully installed, false otherwise.
27
+ */
28
+ export async function installGitHooks(workspaceRoot) {
29
+ const gitDir = node_path.join(workspaceRoot, '.git');
30
+ try {
31
+ const stat = await node_fs.stat(gitDir);
32
+ if (!stat.isDirectory()) {
33
+ return false;
34
+ }
35
+ }
36
+ catch {
37
+ // Not a Git repository, skip hook installation
38
+ return false;
39
+ }
40
+ const hooksDir = node_path.join(gitDir, 'hooks');
41
+ try {
42
+ await node_fs.mkdir(hooksDir, { recursive: true });
43
+ const postCommitPath = node_path.join(hooksDir, 'post-commit');
44
+ const postCheckoutPath = node_path.join(hooksDir, 'post-checkout');
45
+ await node_fs.writeFile(postCommitPath, HOOK_CONTENT + '\n', { encoding: 'utf-8', mode: 0o755 });
46
+ await node_fs.writeFile(postCheckoutPath, HOOK_CONTENT + '\n', { encoding: 'utf-8', mode: 0o755 });
47
+ // Double check execute permissions
48
+ await node_fs.chmod(postCommitPath, 0o755);
49
+ await node_fs.chmod(postCheckoutPath, 0o755);
50
+ log.info('Successfully installed Git sync hooks (post-commit, post-checkout)');
51
+ return true;
52
+ }
53
+ catch (err) {
54
+ log.warn(`Failed to write Git hooks: ${err instanceof Error ? err.message : String(err)}`);
55
+ return false;
56
+ }
57
+ }
58
+ //# sourceMappingURL=gitHooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitHooks.js","sourceRoot":"","sources":["../../src/lib/gitHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,MAAM,YAAY,GAAG;;;;;;CAMpB,CAAC,IAAI,EAAE,CAAA;AAER;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,aAAqB;IACzD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IAEpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;QAC/C,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAElD,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;QAC9D,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;QAElE,MAAM,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAChG,MAAM,OAAO,CAAC,SAAS,CAAC,gBAAgB,EAAE,YAAY,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAElG,mCAAmC;QACnC,MAAM,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;QAC1C,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;QAE5C,GAAG,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;QAC9E,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC1F,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Onboarding setup guide generator.
3
+ *
4
+ * Prints tailored, step-by-step setup guides for each detected harness.
5
+ *
6
+ * LLD #8 — Sync Daemon / CLI
7
+ * @module
8
+ */
9
+ /**
10
+ * Print tailored setup instructions for a list of harnesses.
11
+ *
12
+ * @param harnesses - List of harness types (e.g. ['cursor', 'aider'])
13
+ * @param apiKey - Optional API key to display in the instructions
14
+ * @param devMode - If true, use localhost:4000; otherwise use remote proxy
15
+ */
16
+ export declare function printOnboardingGuide(harnesses: string[], apiKey?: string, devMode?: boolean): void;
17
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,IAAI,CAmKhG"}