cxgrd 0.1.0

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 (238) hide show
  1. package/README.md +221 -0
  2. package/dist/auth/audit-usage.d.ts +30 -0
  3. package/dist/auth/audit-usage.d.ts.map +1 -0
  4. package/dist/auth/audit-usage.js +104 -0
  5. package/dist/auth/audit-usage.js.map +1 -0
  6. package/dist/auth/auth-session.d.ts +17 -0
  7. package/dist/auth/auth-session.d.ts.map +1 -0
  8. package/dist/auth/auth-session.js +102 -0
  9. package/dist/auth/auth-session.js.map +1 -0
  10. package/dist/auth/auth-store.d.ts +17 -0
  11. package/dist/auth/auth-store.d.ts.map +1 -0
  12. package/dist/auth/auth-store.js +44 -0
  13. package/dist/auth/auth-store.js.map +1 -0
  14. package/dist/auth/entitlements.d.ts +14 -0
  15. package/dist/auth/entitlements.d.ts.map +1 -0
  16. package/dist/auth/entitlements.js +62 -0
  17. package/dist/auth/entitlements.js.map +1 -0
  18. package/dist/auth/open-browser.d.ts +2 -0
  19. package/dist/auth/open-browser.d.ts.map +1 -0
  20. package/dist/auth/open-browser.js +20 -0
  21. package/dist/auth/open-browser.js.map +1 -0
  22. package/dist/auth/plans.d.ts +10 -0
  23. package/dist/auth/plans.d.ts.map +1 -0
  24. package/dist/auth/plans.js +37 -0
  25. package/dist/auth/plans.js.map +1 -0
  26. package/dist/auth/plans.test.d.ts +2 -0
  27. package/dist/auth/plans.test.d.ts.map +1 -0
  28. package/dist/auth/plans.test.js +23 -0
  29. package/dist/auth/plans.test.js.map +1 -0
  30. package/dist/cg-directory.d.ts +37 -0
  31. package/dist/cg-directory.d.ts.map +1 -0
  32. package/dist/cg-directory.js +129 -0
  33. package/dist/cg-directory.js.map +1 -0
  34. package/dist/check/check-runner.d.ts +3 -0
  35. package/dist/check/check-runner.d.ts.map +1 -0
  36. package/dist/check/check-runner.js +48 -0
  37. package/dist/check/check-runner.js.map +1 -0
  38. package/dist/check/compiler-service.d.ts +6 -0
  39. package/dist/check/compiler-service.d.ts.map +1 -0
  40. package/dist/check/compiler-service.js +69 -0
  41. package/dist/check/compiler-service.js.map +1 -0
  42. package/dist/check/parsers/cargo.d.ts +3 -0
  43. package/dist/check/parsers/cargo.d.ts.map +1 -0
  44. package/dist/check/parsers/cargo.js +34 -0
  45. package/dist/check/parsers/cargo.js.map +1 -0
  46. package/dist/check/parsers/parsers.test.d.ts +2 -0
  47. package/dist/check/parsers/parsers.test.d.ts.map +1 -0
  48. package/dist/check/parsers/parsers.test.js +51 -0
  49. package/dist/check/parsers/parsers.test.js.map +1 -0
  50. package/dist/check/parsers/pyright.d.ts +3 -0
  51. package/dist/check/parsers/pyright.d.ts.map +1 -0
  52. package/dist/check/parsers/pyright.js +27 -0
  53. package/dist/check/parsers/pyright.js.map +1 -0
  54. package/dist/check/parsers/tsc-cli.d.ts +3 -0
  55. package/dist/check/parsers/tsc-cli.d.ts.map +1 -0
  56. package/dist/check/parsers/tsc-cli.js +22 -0
  57. package/dist/check/parsers/tsc-cli.js.map +1 -0
  58. package/dist/check/project-tooling.d.ts +18 -0
  59. package/dist/check/project-tooling.d.ts.map +1 -0
  60. package/dist/check/project-tooling.js +105 -0
  61. package/dist/check/project-tooling.js.map +1 -0
  62. package/dist/check/run-command.d.ts +8 -0
  63. package/dist/check/run-command.d.ts.map +1 -0
  64. package/dist/check/run-command.js +50 -0
  65. package/dist/check/run-command.js.map +1 -0
  66. package/dist/check/scope.d.ts +11 -0
  67. package/dist/check/scope.d.ts.map +1 -0
  68. package/dist/check/scope.js +46 -0
  69. package/dist/check/scope.js.map +1 -0
  70. package/dist/check/scope.test.d.ts +2 -0
  71. package/dist/check/scope.test.d.ts.map +1 -0
  72. package/dist/check/scope.test.js +15 -0
  73. package/dist/check/scope.test.js.map +1 -0
  74. package/dist/check/strict-mode.d.ts +5 -0
  75. package/dist/check/strict-mode.d.ts.map +1 -0
  76. package/dist/check/strict-mode.js +32 -0
  77. package/dist/check/strict-mode.js.map +1 -0
  78. package/dist/check/strict-mode.test.d.ts +2 -0
  79. package/dist/check/strict-mode.test.d.ts.map +1 -0
  80. package/dist/check/strict-mode.test.js +53 -0
  81. package/dist/check/strict-mode.test.js.map +1 -0
  82. package/dist/check/structural-checks.d.ts +3 -0
  83. package/dist/check/structural-checks.d.ts.map +1 -0
  84. package/dist/check/structural-checks.js +111 -0
  85. package/dist/check/structural-checks.js.map +1 -0
  86. package/dist/check/types.d.ts +40 -0
  87. package/dist/check/types.d.ts.map +1 -0
  88. package/dist/check/types.js +2 -0
  89. package/dist/check/types.js.map +1 -0
  90. package/dist/check/verifiers/python.d.ts +7 -0
  91. package/dist/check/verifiers/python.d.ts.map +1 -0
  92. package/dist/check/verifiers/python.js +43 -0
  93. package/dist/check/verifiers/python.js.map +1 -0
  94. package/dist/check/verifiers/rust.d.ts +7 -0
  95. package/dist/check/verifiers/rust.d.ts.map +1 -0
  96. package/dist/check/verifiers/rust.js +39 -0
  97. package/dist/check/verifiers/rust.js.map +1 -0
  98. package/dist/check/verifiers/typescript.d.ts +7 -0
  99. package/dist/check/verifiers/typescript.d.ts.map +1 -0
  100. package/dist/check/verifiers/typescript.js +108 -0
  101. package/dist/check/verifiers/typescript.js.map +1 -0
  102. package/dist/commands/auth.d.ts +4 -0
  103. package/dist/commands/auth.d.ts.map +1 -0
  104. package/dist/commands/auth.js +51 -0
  105. package/dist/commands/auth.js.map +1 -0
  106. package/dist/commands/check.d.ts +9 -0
  107. package/dist/commands/check.d.ts.map +1 -0
  108. package/dist/commands/check.js +145 -0
  109. package/dist/commands/check.js.map +1 -0
  110. package/dist/commands/doctor.d.ts +2 -0
  111. package/dist/commands/doctor.d.ts.map +1 -0
  112. package/dist/commands/doctor.js +76 -0
  113. package/dist/commands/doctor.js.map +1 -0
  114. package/dist/commands/init-hooks.d.ts +15 -0
  115. package/dist/commands/init-hooks.d.ts.map +1 -0
  116. package/dist/commands/init-hooks.js +102 -0
  117. package/dist/commands/init-hooks.js.map +1 -0
  118. package/dist/commands/input.d.ts +2 -0
  119. package/dist/commands/input.d.ts.map +1 -0
  120. package/dist/commands/input.js +139 -0
  121. package/dist/commands/input.js.map +1 -0
  122. package/dist/commands/prompt.d.ts +2 -0
  123. package/dist/commands/prompt.d.ts.map +1 -0
  124. package/dist/commands/prompt.js +70 -0
  125. package/dist/commands/prompt.js.map +1 -0
  126. package/dist/commands/scan.d.ts +5 -0
  127. package/dist/commands/scan.d.ts.map +1 -0
  128. package/dist/commands/scan.js +163 -0
  129. package/dist/commands/scan.js.map +1 -0
  130. package/dist/commands/watch.d.ts +11 -0
  131. package/dist/commands/watch.d.ts.map +1 -0
  132. package/dist/commands/watch.js +74 -0
  133. package/dist/commands/watch.js.map +1 -0
  134. package/dist/config/env.d.ts +5 -0
  135. package/dist/config/env.d.ts.map +1 -0
  136. package/dist/config/env.js +60 -0
  137. package/dist/config/env.js.map +1 -0
  138. package/dist/graph.d.ts +34 -0
  139. package/dist/graph.d.ts.map +1 -0
  140. package/dist/graph.js +123 -0
  141. package/dist/graph.js.map +1 -0
  142. package/dist/index.d.ts +3 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +176 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/memory/pattern-analyzer.d.ts +17 -0
  147. package/dist/memory/pattern-analyzer.d.ts.map +1 -0
  148. package/dist/memory/pattern-analyzer.js +56 -0
  149. package/dist/memory/pattern-analyzer.js.map +1 -0
  150. package/dist/memory/repo-memory.d.ts +14 -0
  151. package/dist/memory/repo-memory.d.ts.map +1 -0
  152. package/dist/memory/repo-memory.js +71 -0
  153. package/dist/memory/repo-memory.js.map +1 -0
  154. package/dist/memory/types.d.ts +32 -0
  155. package/dist/memory/types.d.ts.map +1 -0
  156. package/dist/memory/types.js +2 -0
  157. package/dist/memory/types.js.map +1 -0
  158. package/dist/prompt/llm-client.d.ts +8 -0
  159. package/dist/prompt/llm-client.d.ts.map +1 -0
  160. package/dist/prompt/llm-client.js +96 -0
  161. package/dist/prompt/llm-client.js.map +1 -0
  162. package/dist/prompt/subgraph.d.ts +26 -0
  163. package/dist/prompt/subgraph.d.ts.map +1 -0
  164. package/dist/prompt/subgraph.js +96 -0
  165. package/dist/prompt/subgraph.js.map +1 -0
  166. package/dist/scanner.d.ts +13 -0
  167. package/dist/scanner.d.ts.map +1 -0
  168. package/dist/scanner.js +92 -0
  169. package/dist/scanner.js.map +1 -0
  170. package/dist/team/audit.d.ts +4 -0
  171. package/dist/team/audit.d.ts.map +1 -0
  172. package/dist/team/audit.js +16 -0
  173. package/dist/team/audit.js.map +1 -0
  174. package/dist/team/cloud-client.d.ts +7 -0
  175. package/dist/team/cloud-client.d.ts.map +1 -0
  176. package/dist/team/cloud-client.js +106 -0
  177. package/dist/team/cloud-client.js.map +1 -0
  178. package/dist/team/dev-store.d.ts +9 -0
  179. package/dist/team/dev-store.d.ts.map +1 -0
  180. package/dist/team/dev-store.js +69 -0
  181. package/dist/team/dev-store.js.map +1 -0
  182. package/dist/team/graph-sync.d.ts +10 -0
  183. package/dist/team/graph-sync.d.ts.map +1 -0
  184. package/dist/team/graph-sync.js +78 -0
  185. package/dist/team/graph-sync.js.map +1 -0
  186. package/dist/team/policy-cache.d.ts +7 -0
  187. package/dist/team/policy-cache.d.ts.map +1 -0
  188. package/dist/team/policy-cache.js +31 -0
  189. package/dist/team/policy-cache.js.map +1 -0
  190. package/dist/team/policy-engine.d.ts +3 -0
  191. package/dist/team/policy-engine.d.ts.map +1 -0
  192. package/dist/team/policy-engine.js +35 -0
  193. package/dist/team/policy-engine.js.map +1 -0
  194. package/dist/team/policy-engine.test.d.ts +2 -0
  195. package/dist/team/policy-engine.test.d.ts.map +1 -0
  196. package/dist/team/policy-engine.test.js +29 -0
  197. package/dist/team/policy-engine.test.js.map +1 -0
  198. package/dist/team/repo-identity.d.ts +7 -0
  199. package/dist/team/repo-identity.d.ts.map +1 -0
  200. package/dist/team/repo-identity.js +41 -0
  201. package/dist/team/repo-identity.js.map +1 -0
  202. package/dist/team/types.d.ts +53 -0
  203. package/dist/team/types.d.ts.map +1 -0
  204. package/dist/team/types.js +2 -0
  205. package/dist/team/types.js.map +1 -0
  206. package/dist/toolchain/probe.d.ts +9 -0
  207. package/dist/toolchain/probe.d.ts.map +1 -0
  208. package/dist/toolchain/probe.js +123 -0
  209. package/dist/toolchain/probe.js.map +1 -0
  210. package/dist/toolchain/project-languages.d.ts +4 -0
  211. package/dist/toolchain/project-languages.d.ts.map +1 -0
  212. package/dist/toolchain/project-languages.js +41 -0
  213. package/dist/toolchain/project-languages.js.map +1 -0
  214. package/dist/toolchain/types.d.ts +32 -0
  215. package/dist/toolchain/types.d.ts.map +1 -0
  216. package/dist/toolchain/types.js +2 -0
  217. package/dist/toolchain/types.js.map +1 -0
  218. package/dist/utils/blast-radius-analyzer.d.ts +95 -0
  219. package/dist/utils/blast-radius-analyzer.d.ts.map +1 -0
  220. package/dist/utils/blast-radius-analyzer.js +277 -0
  221. package/dist/utils/blast-radius-analyzer.js.map +1 -0
  222. package/dist/utils/change-detector.d.ts +43 -0
  223. package/dist/utils/change-detector.d.ts.map +1 -0
  224. package/dist/utils/change-detector.js +190 -0
  225. package/dist/utils/change-detector.js.map +1 -0
  226. package/dist/utils/cli-formatter.d.ts +80 -0
  227. package/dist/utils/cli-formatter.d.ts.map +1 -0
  228. package/dist/utils/cli-formatter.js +205 -0
  229. package/dist/utils/cli-formatter.js.map +1 -0
  230. package/dist/utils/git-hook-manager.d.ts +81 -0
  231. package/dist/utils/git-hook-manager.d.ts.map +1 -0
  232. package/dist/utils/git-hook-manager.js +243 -0
  233. package/dist/utils/git-hook-manager.js.map +1 -0
  234. package/dist/utils/project-watcher.d.ts +91 -0
  235. package/dist/utils/project-watcher.d.ts.map +1 -0
  236. package/dist/utils/project-watcher.js +215 -0
  237. package/dist/utils/project-watcher.js.map +1 -0
  238. package/package.json +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,gBAAgB,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { ActiveSession } from '../auth/auth-session';
2
+ export interface LlmResult {
3
+ prompt: string;
4
+ provider: string;
5
+ model: string;
6
+ }
7
+ export declare function generatePromptWithLlm(contextPayload: string, session: ActiveSession): Promise<LlmResult>;
8
+ //# sourceMappingURL=llm-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../src/prompt/llm-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAc1D,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,SAAS,CAAC,CAuBpB"}
@@ -0,0 +1,96 @@
1
+ import { envString } from '../config/env';
2
+ const SYSTEM_PROMPT = `You are an expert software architect helping a developer write a precise prompt for their AI coding assistant (Cursor, Copilot, etc.).
3
+
4
+ Given dependency graph context, blast radius, symbols, and repo memory from the cxgrd tool, produce ONE markdown prompt the developer can paste into their AI assistant.
5
+
6
+ Requirements:
7
+ - Preserve the developer's original intent
8
+ - List concrete files/modules to touch and why
9
+ - Mention architectural layers and dependency constraints
10
+ - Include verification steps (tests, cxgrd check)
11
+ - Be actionable and concise (under 800 words)
12
+ - Do not invent files not mentioned in the context`;
13
+ export async function generatePromptWithLlm(contextPayload, session) {
14
+ const apiKey = envString('CXGRD_LLM_API_KEY');
15
+ const cloudUrl = envString('CXGRD_PROMPT_API_URL');
16
+ if (cloudUrl && session.source === 'auth_file') {
17
+ try {
18
+ return await callCloudPromptApi(cloudUrl, contextPayload, session.token);
19
+ }
20
+ catch (err) {
21
+ const message = err instanceof Error ? err.message : String(err);
22
+ if (apiKey && message.includes('not deployed')) {
23
+ return callDirectLlm(contextPayload, apiKey);
24
+ }
25
+ throw err;
26
+ }
27
+ }
28
+ if (apiKey) {
29
+ return callDirectLlm(contextPayload, apiKey);
30
+ }
31
+ throw new Error('No LLM configured. Set CXGRD_LLM_API_KEY in .env (see .env.example) or sign in and use the cloud API when available.');
32
+ }
33
+ async function callCloudPromptApi(url, context, token) {
34
+ const response = await fetch(url.replace(/\/$/, ''), {
35
+ method: 'POST',
36
+ headers: {
37
+ 'Content-Type': 'application/json',
38
+ Authorization: `Bearer ${token}`,
39
+ },
40
+ body: JSON.stringify({ context }),
41
+ });
42
+ if (response.status === 404 || response.status === 501) {
43
+ throw new Error('Cloud prompt API is not deployed yet. Use CXGRD_LLM_API_KEY in .env for direct LLM access during development.');
44
+ }
45
+ if (!response.ok) {
46
+ const body = await response.text().catch(() => '');
47
+ throw new Error(`Prompt API error (${response.status}): ${body || response.statusText}`);
48
+ }
49
+ const data = (await response.json());
50
+ if (!data.prompt) {
51
+ throw new Error('Prompt API returned an empty response');
52
+ }
53
+ return {
54
+ prompt: data.prompt,
55
+ provider: data.provider || 'cxgrd-cloud',
56
+ model: data.model || 'default',
57
+ };
58
+ }
59
+ async function callDirectLlm(context, apiKey) {
60
+ const provider = envString('CXGRD_LLM_PROVIDER', 'groq').toLowerCase();
61
+ const model = envString('CXGRD_LLM_MODEL', 'llama-3.3-70b-versatile');
62
+ const baseUrl = envString('CXGRD_LLM_BASE_URL') ||
63
+ (provider === 'openai'
64
+ ? 'https://api.openai.com/v1'
65
+ : 'https://api.groq.com/openai/v1');
66
+ const response = await fetch(`${baseUrl.replace(/\/$/, '')}/chat/completions`, {
67
+ method: 'POST',
68
+ headers: {
69
+ 'Content-Type': 'application/json',
70
+ Authorization: `Bearer ${apiKey}`,
71
+ },
72
+ body: JSON.stringify({
73
+ model,
74
+ temperature: 0.3,
75
+ max_tokens: 2048,
76
+ messages: [
77
+ { role: 'system', content: SYSTEM_PROMPT },
78
+ {
79
+ role: 'user',
80
+ content: `Generate the enriched AI coding prompt from this cxgrd context:\n\n${context}`,
81
+ },
82
+ ],
83
+ }),
84
+ });
85
+ if (!response.ok) {
86
+ const body = await response.text().catch(() => '');
87
+ throw new Error(`LLM request failed (${response.status}): ${body || response.statusText}`);
88
+ }
89
+ const data = (await response.json());
90
+ const content = data.choices?.[0]?.message?.content?.trim();
91
+ if (!content) {
92
+ throw new Error('LLM returned an empty response');
93
+ }
94
+ return { prompt: content, provider, model };
95
+ }
96
+ //# sourceMappingURL=llm-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../src/prompt/llm-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface PromptSubgraph {
2
+ changeDescription: string;
3
+ seedFiles: string[];
4
+ affectedFiles: Array<{
5
+ path: string;
6
+ severity: string;
7
+ reason: string;
8
+ distance: number;
9
+ }>;
10
+ dependencies: Array<{
11
+ from: string;
12
+ to: string;
13
+ type: string;
14
+ }>;
15
+ symbols: Record<string, string[]>;
16
+ architectureLayers: Record<string, string[]>;
17
+ riskLevel: string;
18
+ recommendations: string[];
19
+ }
20
+ export declare function buildPromptSubgraph(changeDescription: string, graph: {
21
+ files?: Record<string, unknown>;
22
+ }, symbols: Record<string, string[]>, arch: {
23
+ layers?: Record<string, string[]>;
24
+ } | null, projectRoot: string): PromptSubgraph;
25
+ export declare function serializeSubgraphForLlm(subgraph: PromptSubgraph, repoMemoryBlock: string): string;
26
+ //# sourceMappingURL=subgraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subgraph.d.ts","sourceRoot":"","sources":["../../src/prompt/subgraph.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3F,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CACjC,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAC1C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACjC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,GAAG,IAAI,EAClD,WAAW,EAAE,MAAM,GAClB,cAAc,CAuDhB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,cAAc,EACxB,eAAe,EAAE,MAAM,GACtB,MAAM,CAiDR"}
@@ -0,0 +1,96 @@
1
+ import { BlastRadiusAnalyzer } from '../utils/blast-radius-analyzer';
2
+ import { ChangeDetector } from '../utils/change-detector';
3
+ export function buildPromptSubgraph(changeDescription, graph, symbols, arch, projectRoot) {
4
+ const filePaths = Object.keys(graph.files || {});
5
+ const detector = new ChangeDetector(projectRoot);
6
+ const gitChanges = detector.getChangedFiles();
7
+ const descriptionMatch = detector.parseDescription(changeDescription, filePaths);
8
+ const seedFiles = [
9
+ ...new Set([...gitChanges.files, ...descriptionMatch.files]),
10
+ ].slice(0, 15);
11
+ const analyzer = new BlastRadiusAnalyzer(graph);
12
+ const blast = analyzer.analyze(seedFiles);
13
+ const affectedSet = new Set();
14
+ const dependencies = [];
15
+ for (const af of blast.affectedFiles.slice(0, 25)) {
16
+ affectedSet.add(af.path);
17
+ }
18
+ for (const seed of seedFiles) {
19
+ affectedSet.add(seed);
20
+ }
21
+ const relevantSymbols = {};
22
+ for (const path of affectedSet) {
23
+ if (symbols[path]?.length) {
24
+ relevantSymbols[path] = symbols[path].slice(0, 15);
25
+ }
26
+ const node = graph.files?.[path];
27
+ if (node?.dependencies) {
28
+ for (const dep of node.dependencies.slice(0, 8)) {
29
+ dependencies.push({
30
+ from: dep.from || path,
31
+ to: dep.to,
32
+ type: dep.type || 'import',
33
+ });
34
+ }
35
+ }
36
+ }
37
+ return {
38
+ changeDescription,
39
+ seedFiles,
40
+ affectedFiles: blast.affectedFiles.slice(0, 25).map((f) => ({
41
+ path: f.path,
42
+ severity: f.severity,
43
+ reason: f.reason,
44
+ distance: f.distance,
45
+ })),
46
+ dependencies: dependencies.slice(0, 40),
47
+ symbols: relevantSymbols,
48
+ architectureLayers: arch?.layers || {},
49
+ riskLevel: blast.riskLevel,
50
+ recommendations: blast.recommendations.slice(0, 6),
51
+ };
52
+ }
53
+ export function serializeSubgraphForLlm(subgraph, repoMemoryBlock) {
54
+ const parts = [
55
+ `# Change request\n${subgraph.changeDescription}`,
56
+ `\n## Blast radius (${subgraph.riskLevel} risk)`,
57
+ `Seed files: ${subgraph.seedFiles.length ? subgraph.seedFiles.join(', ') : '(inferred from description)'}`,
58
+ ];
59
+ if (subgraph.affectedFiles.length) {
60
+ parts.push('\n### Affected files');
61
+ for (const f of subgraph.affectedFiles) {
62
+ parts.push(`- [${f.severity}] ${f.path} — ${f.reason} (depth ${f.distance})`);
63
+ }
64
+ }
65
+ if (subgraph.dependencies.length) {
66
+ parts.push('\n### Dependency edges (subgraph)');
67
+ for (const d of subgraph.dependencies.slice(0, 25)) {
68
+ parts.push(`- ${d.from} → ${d.to} (${d.type})`);
69
+ }
70
+ }
71
+ const symbolEntries = Object.entries(subgraph.symbols);
72
+ if (symbolEntries.length) {
73
+ parts.push('\n### Symbols in affected modules');
74
+ for (const [file, syms] of symbolEntries.slice(0, 12)) {
75
+ parts.push(`- ${file}: ${syms.join(', ')}`);
76
+ }
77
+ }
78
+ const layers = Object.entries(subgraph.architectureLayers);
79
+ if (layers.length) {
80
+ parts.push('\n### Architecture layers');
81
+ for (const [layer, files] of layers) {
82
+ parts.push(`- ${layer}: ${files.length} files`);
83
+ }
84
+ }
85
+ if (subgraph.recommendations.length) {
86
+ parts.push('\n### Analyzer recommendations');
87
+ for (const r of subgraph.recommendations) {
88
+ parts.push(`- ${r}`);
89
+ }
90
+ }
91
+ if (repoMemoryBlock.trim()) {
92
+ parts.push('\n' + repoMemoryBlock);
93
+ }
94
+ return parts.join('\n');
95
+ }
96
+ //# sourceMappingURL=subgraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subgraph.js","sourceRoot":"","sources":["../../src/prompt/subgraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ interface FileInfo {
2
+ path: string;
3
+ content: string;
4
+ language: string;
5
+ }
6
+ export declare class FileScanner {
7
+ private ignorePatterns;
8
+ private languageMap;
9
+ private shouldIgnore;
10
+ scanDirectory(rootPath: string): Promise<FileInfo[]>;
11
+ }
12
+ export {};
13
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAGA,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAiBpB;IAEF,OAAO,CAAC,WAAW,CAoBjB;IAEF,OAAO,CAAC,YAAY;IAOd,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CA2C3D"}
@@ -0,0 +1,92 @@
1
+ import { readdir, readFile } from 'fs/promises';
2
+ import { join, relative, extname } from 'path';
3
+ export class FileScanner {
4
+ constructor() {
5
+ this.ignorePatterns = [
6
+ 'node_modules',
7
+ '.git',
8
+ 'dist',
9
+ 'build',
10
+ '.next',
11
+ '.venv',
12
+ '__pycache__',
13
+ 'target',
14
+ '.cg',
15
+ '.vscode',
16
+ '.idea',
17
+ 'coverage',
18
+ "venv",
19
+ ".env",
20
+ "env",
21
+ "site-packages",
22
+ ];
23
+ this.languageMap = {
24
+ '.ts': 'typescript',
25
+ '.tsx': 'typescript',
26
+ '.js': 'javascript',
27
+ '.jsx': 'javascript',
28
+ '.py': 'python',
29
+ '.java': 'java',
30
+ '.cpp': 'cpp',
31
+ '.cc': 'cpp',
32
+ '.cxx': 'cpp',
33
+ '.h': 'cpp',
34
+ '.hpp': 'cpp',
35
+ '.cs': 'csharp',
36
+ '.rb': 'ruby',
37
+ '.go': 'go',
38
+ '.rs': 'rust',
39
+ '.sql': 'sql',
40
+ '.json': 'json',
41
+ '.yaml': 'yaml',
42
+ '.yml': 'yaml',
43
+ };
44
+ }
45
+ shouldIgnore(filePath) {
46
+ return this.ignorePatterns.some(pattern => {
47
+ const parts = filePath.replace(/\\/g, '/').split('/');
48
+ return parts.includes(pattern);
49
+ });
50
+ }
51
+ async scanDirectory(rootPath) {
52
+ const files = [];
53
+ const walkDir = async (dir) => {
54
+ try {
55
+ const entries = await readdir(dir, { withFileTypes: true });
56
+ for (const entry of entries) {
57
+ const fullPath = join(dir, entry.name);
58
+ const relativePath = relative(rootPath, fullPath);
59
+ if (this.shouldIgnore(relativePath)) {
60
+ continue;
61
+ }
62
+ if (entry.isDirectory()) {
63
+ await walkDir(fullPath);
64
+ }
65
+ else if (entry.isFile()) {
66
+ const ext = extname(entry.name).toLowerCase();
67
+ const language = this.languageMap[ext];
68
+ if (language) {
69
+ try {
70
+ const content = await readFile(fullPath, 'utf-8');
71
+ files.push({
72
+ path: relativePath.replace(/\\/g, '/'),
73
+ content,
74
+ language,
75
+ });
76
+ }
77
+ catch (err) {
78
+ // Skip files that can't be read
79
+ }
80
+ }
81
+ }
82
+ }
83
+ }
84
+ catch (err) {
85
+ // Skip directories that can't be read
86
+ }
87
+ };
88
+ await walkDir(rootPath);
89
+ return files;
90
+ }
91
+ }
92
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ActiveSession } from '../auth/auth-session';
2
+ import type { AuditEventPayload } from './types';
3
+ export declare function recordAuditEventIfTeam(session: ActiveSession | null, projectRoot: string, partial: Omit<AuditEventPayload, 'repoId' | 'gitRef'>): Promise<void>;
4
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/team/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAIjD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,QAAQ,CAAC,GACpD,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -0,0 +1,16 @@
1
+ import { planIncludesFeature } from '../auth/plans';
2
+ import { postAuditEvent } from './cloud-client';
3
+ import { resolveRepoIdentity } from './repo-identity';
4
+ export async function recordAuditEventIfTeam(session, projectRoot, partial) {
5
+ if (!session?.orgId)
6
+ return;
7
+ if (!planIncludesFeature(session.plan, 'team_cloud'))
8
+ return;
9
+ const identity = resolveRepoIdentity(projectRoot);
10
+ await postAuditEvent(session, {
11
+ ...partial,
12
+ repoId: identity.repoId,
13
+ gitRef: identity.gitRef,
14
+ });
15
+ }
16
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/team/audit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAA6B,EAC7B,WAAmB,EACnB,OAAqD;IAErD,IAAI,CAAC,OAAO,EAAE,KAAK;QAAE,OAAO;IAC5B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;QAAE,OAAO;IAE7D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,cAAc,CAAC,OAAO,EAAE;QAC5B,GAAG,OAAO;QACV,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ActiveSession } from '../auth/auth-session';
2
+ import type { AuditEventPayload, GraphBundle, OrgPolicyDocument } from './types';
3
+ export declare function pushGraph(session: ActiveSession, bundle: GraphBundle): Promise<void>;
4
+ export declare function pullGraph(session: ActiveSession, repoId: string, gitRef: string): Promise<GraphBundle | null>;
5
+ export declare function fetchOrgPolicy(session: ActiveSession): Promise<OrgPolicyDocument>;
6
+ export declare function postAuditEvent(session: ActiveSession, payload: AuditEventPayload): Promise<void>;
7
+ //# sourceMappingURL=cloud-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-client.d.ts","sourceRoot":"","sources":["../../src/team/cloud-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAoCjF,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB1F;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA8B7B;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwBvF;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
@@ -0,0 +1,106 @@
1
+ import { envString } from '../config/env';
2
+ import { devAppendEvent, devGetGraph, devGetPolicy, devPutGraph, isDevCloudEnabled, } from './dev-store';
3
+ function apiBase() {
4
+ return envString('CXGRD_AUTH_BASE_URL', 'https://cxgrd.com').replace(/\/$/, '');
5
+ }
6
+ function authHeaders(token) {
7
+ return {
8
+ Accept: 'application/json',
9
+ 'Content-Type': 'application/json',
10
+ Authorization: `Bearer ${token}`,
11
+ };
12
+ }
13
+ async function apiFetch(path, token, init) {
14
+ return fetch(`${apiBase()}${path}`, {
15
+ ...init,
16
+ headers: { ...authHeaders(token), ...init?.headers },
17
+ });
18
+ }
19
+ function useDevStore(session) {
20
+ return isDevCloudEnabled() || session.source === 'dev_override';
21
+ }
22
+ export async function pushGraph(session, bundle) {
23
+ const orgId = session.orgId;
24
+ if (!orgId) {
25
+ throw new Error('No organization on this account. Team features require an org.');
26
+ }
27
+ if (useDevStore(session)) {
28
+ await devPutGraph(orgId, bundle);
29
+ return;
30
+ }
31
+ const res = await apiFetch(`/api/orgs/${orgId}/graphs`, session.token, {
32
+ method: 'PUT',
33
+ body: JSON.stringify(bundle),
34
+ });
35
+ if (res.status === 404 || res.status === 501) {
36
+ await devPutGraph(orgId, bundle);
37
+ return;
38
+ }
39
+ if (!res.ok) {
40
+ const body = await res.text().catch(() => '');
41
+ throw new Error(`Graph push failed (${res.status}): ${body || res.statusText}`);
42
+ }
43
+ }
44
+ export async function pullGraph(session, repoId, gitRef) {
45
+ const orgId = session.orgId;
46
+ if (!orgId) {
47
+ throw new Error('No organization on this account.');
48
+ }
49
+ if (useDevStore(session)) {
50
+ return devGetGraph(orgId, repoId, gitRef);
51
+ }
52
+ const res = await apiFetch(`/api/orgs/${orgId}/graphs?repoId=${encodeURIComponent(repoId)}&ref=${encodeURIComponent(gitRef)}`, session.token, { method: 'GET' });
53
+ if (res.status === 404) {
54
+ return devGetGraph(orgId, repoId, gitRef);
55
+ }
56
+ if (res.status === 501) {
57
+ return devGetGraph(orgId, repoId, gitRef);
58
+ }
59
+ if (!res.ok) {
60
+ const body = await res.text().catch(() => '');
61
+ throw new Error(`Graph pull failed (${res.status}): ${body || res.statusText}`);
62
+ }
63
+ return (await res.json());
64
+ }
65
+ export async function fetchOrgPolicy(session) {
66
+ const orgId = session.orgId;
67
+ if (!orgId) {
68
+ throw new Error('No organization on this account.');
69
+ }
70
+ if (useDevStore(session)) {
71
+ const policy = await devGetPolicy(orgId);
72
+ return policy;
73
+ }
74
+ const res = await apiFetch(`/api/orgs/${orgId}/policies`, session.token, { method: 'GET' });
75
+ if (res.status === 404 || res.status === 501) {
76
+ const policy = await devGetPolicy(orgId);
77
+ return policy;
78
+ }
79
+ if (!res.ok) {
80
+ const body = await res.text().catch(() => '');
81
+ throw new Error(`Policy fetch failed (${res.status}): ${body || res.statusText}`);
82
+ }
83
+ return (await res.json());
84
+ }
85
+ export async function postAuditEvent(session, payload) {
86
+ const orgId = session.orgId;
87
+ if (!orgId)
88
+ return;
89
+ if (useDevStore(session)) {
90
+ await devAppendEvent(orgId, payload);
91
+ return;
92
+ }
93
+ const res = await apiFetch(`/api/orgs/${orgId}/events`, session.token, {
94
+ method: 'POST',
95
+ body: JSON.stringify(payload),
96
+ });
97
+ if (res.status === 404 || res.status === 501) {
98
+ await devAppendEvent(orgId, payload);
99
+ return;
100
+ }
101
+ if (!res.ok) {
102
+ // Non-fatal for CLI UX
103
+ return;
104
+ }
105
+ }
106
+ //# sourceMappingURL=cloud-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-client.js","sourceRoot":"","sources":["../../src/team/cloud-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AuditEventPayload, GraphBundle, OrgPolicyDocument } from './types';
2
+ export declare function isDevCloudEnabled(): boolean;
3
+ export declare function devPutGraph(orgId: string, bundle: GraphBundle): Promise<void>;
4
+ export declare function devGetGraph(orgId: string, repoId: string, gitRef: string): Promise<GraphBundle | null>;
5
+ export declare function devGetPolicy(orgId: string): Promise<OrgPolicyDocument | null>;
6
+ export declare function devPutPolicy(orgId: string, policy: OrgPolicyDocument): Promise<void>;
7
+ export declare function devAppendEvent(orgId: string, payload: AuditEventPayload): Promise<void>;
8
+ export declare function getDevCloudRoot(): string;
9
+ //# sourceMappingURL=dev-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-store.d.ts","sourceRoot":"","sources":["../../src/team/dev-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAIjF,wBAAgB,iBAAiB,IAAI,OAAO,CAG3C;AAeD,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAInF;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAK7B;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAOnF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1F;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7F;AAmBD,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -0,0 +1,69 @@
1
+ import { mkdir, readFile, writeFile, appendFile } from 'fs/promises';
2
+ import { existsSync } from 'fs';
3
+ import { homedir } from 'os';
4
+ import { join } from 'path';
5
+ const DEV_ROOT = join(homedir(), '.cg', 'dev-cloud');
6
+ export function isDevCloudEnabled() {
7
+ const v = process.env.CXGRD_DEV_CLOUD?.trim().toLowerCase();
8
+ return v === '1' || v === 'true' || v === 'yes';
9
+ }
10
+ function graphPath(orgId, repoId, gitRef) {
11
+ const safeRef = gitRef.replace(/[^a-zA-Z0-9._-]/g, '_');
12
+ return join(DEV_ROOT, 'orgs', orgId, 'graphs', repoId, `${safeRef}.json`);
13
+ }
14
+ function policyPath(orgId) {
15
+ return join(DEV_ROOT, 'orgs', orgId, 'policy.json');
16
+ }
17
+ function eventsPath(orgId) {
18
+ return join(DEV_ROOT, 'orgs', orgId, 'events.jsonl');
19
+ }
20
+ export async function devPutGraph(orgId, bundle) {
21
+ const path = graphPath(orgId, bundle.repoId, bundle.gitRef);
22
+ await mkdir(join(path, '..'), { recursive: true });
23
+ await writeFile(path, JSON.stringify(bundle, null, 2), 'utf-8');
24
+ }
25
+ export async function devGetGraph(orgId, repoId, gitRef) {
26
+ const path = graphPath(orgId, repoId, gitRef);
27
+ if (!existsSync(path))
28
+ return null;
29
+ const raw = await readFile(path, 'utf-8');
30
+ return JSON.parse(raw);
31
+ }
32
+ export async function devGetPolicy(orgId) {
33
+ const path = policyPath(orgId);
34
+ if (!existsSync(path)) {
35
+ return defaultDevPolicy(orgId);
36
+ }
37
+ const raw = await readFile(path, 'utf-8');
38
+ return JSON.parse(raw);
39
+ }
40
+ export async function devPutPolicy(orgId, policy) {
41
+ const path = policyPath(orgId);
42
+ await mkdir(join(path, '..'), { recursive: true });
43
+ await writeFile(path, JSON.stringify(policy, null, 2), 'utf-8');
44
+ }
45
+ export async function devAppendEvent(orgId, payload) {
46
+ const path = eventsPath(orgId);
47
+ await mkdir(join(path, '..'), { recursive: true });
48
+ await appendFile(path, `${JSON.stringify({ ...payload, recordedAt: Date.now() })}\n`, 'utf-8');
49
+ }
50
+ function defaultDevPolicy(orgId) {
51
+ return {
52
+ version: 1,
53
+ orgId,
54
+ defaultMaxBlastRadius: 100,
55
+ roles: {
56
+ member: { maxBlastRadius: 85, blockOnRiskLevels: ['critical'] },
57
+ lead: { maxBlastRadius: 70, blockOnRiskLevels: ['critical', 'high'] },
58
+ admin: { maxBlastRadius: 100, blockOnRiskLevels: [] },
59
+ },
60
+ merge: {
61
+ blockIfBlastRadiusAbove: 80,
62
+ requireCheckPass: false,
63
+ },
64
+ };
65
+ }
66
+ export function getDevCloudRoot() {
67
+ return DEV_ROOT;
68
+ }
69
+ //# sourceMappingURL=dev-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-store.js","sourceRoot":"","sources":["../../src/team/dev-store.ts"],"names":[],"mappings":"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"}