@rulemetric/cli 0.5.0 → 0.5.2

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 (145) hide show
  1. package/dist/base-command.js +4 -4
  2. package/dist/{chunk-DUQGKWHJ.js → chunk-346TGPVR.js} +3 -3
  3. package/dist/{chunk-2AM54TUK.js → chunk-4UJATBTG.js} +2 -2
  4. package/dist/{chunk-RYMK7FQL.js → chunk-5ZOLDIZQ.js} +2 -2
  5. package/dist/{chunk-BD7CY42U.js → chunk-7DRLX3DN.js} +3 -3
  6. package/dist/{chunk-I4GHR6CY.js → chunk-7XDWLJJP.js} +2 -2
  7. package/dist/{chunk-E32IADV3.js → chunk-AOIY5RT6.js} +11 -11
  8. package/dist/{chunk-JX5UI6RW.js → chunk-AUUHXCJU.js} +2 -2
  9. package/dist/{chunk-7DIWBTB5.js → chunk-CB43W53J.js} +4 -4
  10. package/dist/{chunk-EHABPBGH.js → chunk-CCSR73HF.js} +2 -2
  11. package/dist/{chunk-EHZJ6OXD.js → chunk-CGUV6TUA.js} +2 -2
  12. package/dist/{chunk-EJOI2ZGU.js → chunk-CWFVBGX2.js} +8 -12
  13. package/dist/chunk-CWFVBGX2.js.map +7 -0
  14. package/dist/{chunk-VBOTWXJW.js → chunk-DUR54APY.js} +2 -2
  15. package/dist/{chunk-XMWHTOCC.js → chunk-IKEI4KNV.js} +2 -2
  16. package/dist/{chunk-OWUS3HMA.js → chunk-IVOCDHWA.js} +2 -2
  17. package/dist/{chunk-UF73WX2J.js → chunk-OAQG5WBV.js} +2 -2
  18. package/dist/{chunk-QJXAULRC.js → chunk-OKCFYPIQ.js} +2 -2
  19. package/dist/{chunk-YBNW7ARH.js → chunk-PHIAFGQ2.js} +2 -2
  20. package/dist/{chunk-IWYCRLEK.js → chunk-TDTHAOXO.js} +2 -2
  21. package/dist/{chunk-PQU7GZ7A.js → chunk-TJ2M5QVL.js} +2 -2
  22. package/dist/{chunk-KZRFUXGF.js → chunk-W2YERO7E.js} +27 -2
  23. package/dist/chunk-W2YERO7E.js.map +7 -0
  24. package/dist/{chunk-F5DPTXRC.js → chunk-YQFCUKNI.js} +31 -5
  25. package/dist/{chunk-F5DPTXRC.js.map → chunk-YQFCUKNI.js.map} +2 -2
  26. package/dist/commands/antigravity/backfill.js +5 -5
  27. package/dist/commands/auth/create-key.js +4 -4
  28. package/dist/commands/auth/login.js +4 -4
  29. package/dist/commands/auth/logout.js +4 -4
  30. package/dist/commands/auth/revoke-key.js +4 -4
  31. package/dist/commands/auth/status.js +4 -4
  32. package/dist/commands/catalog/index.js +4 -4
  33. package/dist/commands/catalog/recommend.js +4 -4
  34. package/dist/commands/convert.js +4 -4
  35. package/dist/commands/converters.js +4 -4
  36. package/dist/commands/crons/list.js +4 -4
  37. package/dist/commands/crons/run.js +4 -4
  38. package/dist/commands/dashboard.js +4 -4
  39. package/dist/commands/eval-targets/create.js +4 -4
  40. package/dist/commands/eval-targets/list.js +4 -4
  41. package/dist/commands/evals/agent.js +16 -16
  42. package/dist/commands/evals/benchmark.js +5 -5
  43. package/dist/commands/evals/compare.js +4 -4
  44. package/dist/commands/evals/create.js +4 -4
  45. package/dist/commands/evals/optimize-description.js +4 -4
  46. package/dist/commands/evals/optimize.js +4 -4
  47. package/dist/commands/evals/run.js +4 -4
  48. package/dist/commands/gateway/ensure.js +4 -4
  49. package/dist/commands/hooks/install.js +4 -4
  50. package/dist/commands/hooks/run.js +4 -4
  51. package/dist/commands/hooks/uninstall.js +4 -4
  52. package/dist/commands/import.js +4 -4
  53. package/dist/commands/instructions/create.js +4 -4
  54. package/dist/commands/instructions/delete.js +4 -4
  55. package/dist/commands/instructions/fork.js +4 -4
  56. package/dist/commands/instructions/get.js +4 -4
  57. package/dist/commands/instructions/list.js +4 -4
  58. package/dist/commands/instructions/promote.js +4 -4
  59. package/dist/commands/instructions/pull.js +4 -4
  60. package/dist/commands/instructions/upstream.js +4 -4
  61. package/dist/commands/instructions/versions.js +4 -4
  62. package/dist/commands/launcher.js +4 -4
  63. package/dist/commands/org/current.js +4 -4
  64. package/dist/commands/org/list.js +4 -4
  65. package/dist/commands/org/switch.js +4 -4
  66. package/dist/commands/packs/add-instruction.js +4 -4
  67. package/dist/commands/packs/apply.js +4 -4
  68. package/dist/commands/packs/create.js +4 -4
  69. package/dist/commands/packs/fork.js +4 -4
  70. package/dist/commands/packs/get.js +4 -4
  71. package/dist/commands/packs/list.js +4 -4
  72. package/dist/commands/packs/remove-instruction.js +4 -4
  73. package/dist/commands/proxy/env.js +4 -4
  74. package/dist/commands/proxy/logs.js +4 -4
  75. package/dist/commands/proxy/restart.js +4 -4
  76. package/dist/commands/proxy/setup.js +4 -4
  77. package/dist/commands/proxy/start.js +4 -4
  78. package/dist/commands/proxy/status.js +4 -4
  79. package/dist/commands/proxy/stop.js +4 -4
  80. package/dist/commands/research/backfill.js +5 -5
  81. package/dist/commands/research/tail-transcript.js +5 -5
  82. package/dist/commands/service/install.js +4 -4
  83. package/dist/commands/service/status.js +4 -4
  84. package/dist/commands/service/uninstall.js +4 -4
  85. package/dist/commands/sessions/analyze.js +4 -4
  86. package/dist/commands/sessions/end.js +4 -4
  87. package/dist/commands/sessions/import.js +4 -4
  88. package/dist/commands/sessions/list.js +4 -4
  89. package/dist/commands/sessions/start.js +4 -4
  90. package/dist/commands/setup.js +5 -5
  91. package/dist/commands/signals/report.js +4 -4
  92. package/dist/commands/skills/export-approved.js +4 -4
  93. package/dist/commands/skills/install.js +4 -4
  94. package/dist/commands/skills/list.js +4 -4
  95. package/dist/commands/skills/publish.js +4 -4
  96. package/dist/commands/skills/search.js +4 -4
  97. package/dist/commands/skills/update.js +4 -4
  98. package/dist/commands/suggestions/accept.js +4 -4
  99. package/dist/commands/suggestions/dismiss.js +4 -4
  100. package/dist/commands/suggestions/list.js +4 -4
  101. package/dist/commands/suggestions/refresh.js +4 -4
  102. package/dist/lib/active-org-refresh.js +3 -3
  103. package/dist/lib/agent-loop.js +14 -14
  104. package/dist/lib/antigravity-transcript.js +3 -3
  105. package/dist/lib/api-client.js +2 -2
  106. package/dist/lib/auth.js +5 -1
  107. package/dist/lib/eval-benchmark.js +3 -3
  108. package/dist/lib/eval-conversation-handler.js +3 -3
  109. package/dist/lib/handlers/cron-close-stale-sessions.js +2 -2
  110. package/dist/lib/handlers/cron-data-integrity-audit.js +2 -2
  111. package/dist/lib/handlers/cron-suggest-instructions.js +3 -3
  112. package/dist/lib/handlers/process-announcement.js +2 -2
  113. package/dist/lib/handlers/process-changelog.js +2 -2
  114. package/dist/lib/handlers/process-conversation.js +4 -4
  115. package/dist/lib/handlers/process-eval.js +3 -3
  116. package/dist/lib/handlers/process-insights.js +3 -3
  117. package/dist/lib/handlers/process-launch.js +3 -3
  118. package/dist/lib/handlers/process-run-cleanup.js +2 -2
  119. package/dist/lib/handlers/process-session-goal.js +2 -2
  120. package/dist/lib/manual-tasks.js +5 -5
  121. package/dist/lib/research-client.js +3 -3
  122. package/dist/lib/setup-steps.js +3 -3
  123. package/dist/lib/terminal-target-heartbeat.js +3 -3
  124. package/oclif.manifest.json +116 -116
  125. package/package.json +6 -6
  126. package/dist/chunk-EJOI2ZGU.js.map +0 -7
  127. package/dist/chunk-KZRFUXGF.js.map +0 -7
  128. /package/dist/{chunk-DUQGKWHJ.js.map → chunk-346TGPVR.js.map} +0 -0
  129. /package/dist/{chunk-2AM54TUK.js.map → chunk-4UJATBTG.js.map} +0 -0
  130. /package/dist/{chunk-RYMK7FQL.js.map → chunk-5ZOLDIZQ.js.map} +0 -0
  131. /package/dist/{chunk-BD7CY42U.js.map → chunk-7DRLX3DN.js.map} +0 -0
  132. /package/dist/{chunk-I4GHR6CY.js.map → chunk-7XDWLJJP.js.map} +0 -0
  133. /package/dist/{chunk-E32IADV3.js.map → chunk-AOIY5RT6.js.map} +0 -0
  134. /package/dist/{chunk-JX5UI6RW.js.map → chunk-AUUHXCJU.js.map} +0 -0
  135. /package/dist/{chunk-7DIWBTB5.js.map → chunk-CB43W53J.js.map} +0 -0
  136. /package/dist/{chunk-EHABPBGH.js.map → chunk-CCSR73HF.js.map} +0 -0
  137. /package/dist/{chunk-EHZJ6OXD.js.map → chunk-CGUV6TUA.js.map} +0 -0
  138. /package/dist/{chunk-VBOTWXJW.js.map → chunk-DUR54APY.js.map} +0 -0
  139. /package/dist/{chunk-XMWHTOCC.js.map → chunk-IKEI4KNV.js.map} +0 -0
  140. /package/dist/{chunk-OWUS3HMA.js.map → chunk-IVOCDHWA.js.map} +0 -0
  141. /package/dist/{chunk-UF73WX2J.js.map → chunk-OAQG5WBV.js.map} +0 -0
  142. /package/dist/{chunk-QJXAULRC.js.map → chunk-OKCFYPIQ.js.map} +0 -0
  143. /package/dist/{chunk-YBNW7ARH.js.map → chunk-PHIAFGQ2.js.map} +0 -0
  144. /package/dist/{chunk-IWYCRLEK.js.map → chunk-TDTHAOXO.js.map} +0 -0
  145. /package/dist/{chunk-PQU7GZ7A.js.map → chunk-TJ2M5QVL.js.map} +0 -0
@@ -2165,6 +2165,121 @@
2165
2165
  "versions.js"
2166
2166
  ]
2167
2167
  },
2168
+ "org:current": {
2169
+ "aliases": [],
2170
+ "args": {},
2171
+ "description": "Show the current active organization",
2172
+ "examples": [
2173
+ "<%= config.bin %> org current"
2174
+ ],
2175
+ "flags": {
2176
+ "api-url": {
2177
+ "description": "Override API base URL",
2178
+ "env": "RULEMETRIC_API_URL",
2179
+ "hidden": true,
2180
+ "name": "api-url",
2181
+ "hasDynamicHelp": false,
2182
+ "multiple": false,
2183
+ "type": "option"
2184
+ }
2185
+ },
2186
+ "hasDynamicHelp": false,
2187
+ "hiddenAliases": [],
2188
+ "id": "org:current",
2189
+ "pluginAlias": "@rulemetric/cli",
2190
+ "pluginName": "@rulemetric/cli",
2191
+ "pluginType": "core",
2192
+ "strict": true,
2193
+ "enableJsonFlag": false,
2194
+ "isESM": true,
2195
+ "relativePath": [
2196
+ "dist",
2197
+ "commands",
2198
+ "org",
2199
+ "current.js"
2200
+ ]
2201
+ },
2202
+ "org:list": {
2203
+ "aliases": [],
2204
+ "args": {},
2205
+ "description": "List organizations the current user is a member of",
2206
+ "examples": [
2207
+ "<%= config.bin %> org list"
2208
+ ],
2209
+ "flags": {
2210
+ "api-url": {
2211
+ "description": "Override API base URL",
2212
+ "env": "RULEMETRIC_API_URL",
2213
+ "hidden": true,
2214
+ "name": "api-url",
2215
+ "hasDynamicHelp": false,
2216
+ "multiple": false,
2217
+ "type": "option"
2218
+ }
2219
+ },
2220
+ "hasDynamicHelp": false,
2221
+ "hiddenAliases": [],
2222
+ "id": "org:list",
2223
+ "pluginAlias": "@rulemetric/cli",
2224
+ "pluginName": "@rulemetric/cli",
2225
+ "pluginType": "core",
2226
+ "strict": true,
2227
+ "enableJsonFlag": false,
2228
+ "isESM": true,
2229
+ "relativePath": [
2230
+ "dist",
2231
+ "commands",
2232
+ "org",
2233
+ "list.js"
2234
+ ]
2235
+ },
2236
+ "org:switch": {
2237
+ "aliases": [],
2238
+ "args": {
2239
+ "slug": {
2240
+ "description": "Organization slug to switch to",
2241
+ "name": "slug",
2242
+ "required": false
2243
+ }
2244
+ },
2245
+ "description": "Switch the active organization",
2246
+ "examples": [
2247
+ "<%= config.bin %> org switch acme",
2248
+ "<%= config.bin %> org switch --clear"
2249
+ ],
2250
+ "flags": {
2251
+ "api-url": {
2252
+ "description": "Override API base URL",
2253
+ "env": "RULEMETRIC_API_URL",
2254
+ "hidden": true,
2255
+ "name": "api-url",
2256
+ "hasDynamicHelp": false,
2257
+ "multiple": false,
2258
+ "type": "option"
2259
+ },
2260
+ "clear": {
2261
+ "description": "Clear the active organization (personal mode)",
2262
+ "name": "clear",
2263
+ "allowNo": false,
2264
+ "type": "boolean"
2265
+ }
2266
+ },
2267
+ "hasDynamicHelp": false,
2268
+ "hiddenAliases": [],
2269
+ "id": "org:switch",
2270
+ "pluginAlias": "@rulemetric/cli",
2271
+ "pluginName": "@rulemetric/cli",
2272
+ "pluginType": "core",
2273
+ "strict": true,
2274
+ "enableJsonFlag": false,
2275
+ "isESM": true,
2276
+ "relativePath": [
2277
+ "dist",
2278
+ "commands",
2279
+ "org",
2280
+ "switch.js"
2281
+ ]
2282
+ },
2168
2283
  "packs:add-instruction": {
2169
2284
  "aliases": [],
2170
2285
  "args": {
@@ -3937,122 +4052,7 @@
3937
4052
  "suggestions",
3938
4053
  "refresh.js"
3939
4054
  ]
3940
- },
3941
- "org:current": {
3942
- "aliases": [],
3943
- "args": {},
3944
- "description": "Show the current active organization",
3945
- "examples": [
3946
- "<%= config.bin %> org current"
3947
- ],
3948
- "flags": {
3949
- "api-url": {
3950
- "description": "Override API base URL",
3951
- "env": "RULEMETRIC_API_URL",
3952
- "hidden": true,
3953
- "name": "api-url",
3954
- "hasDynamicHelp": false,
3955
- "multiple": false,
3956
- "type": "option"
3957
- }
3958
- },
3959
- "hasDynamicHelp": false,
3960
- "hiddenAliases": [],
3961
- "id": "org:current",
3962
- "pluginAlias": "@rulemetric/cli",
3963
- "pluginName": "@rulemetric/cli",
3964
- "pluginType": "core",
3965
- "strict": true,
3966
- "enableJsonFlag": false,
3967
- "isESM": true,
3968
- "relativePath": [
3969
- "dist",
3970
- "commands",
3971
- "org",
3972
- "current.js"
3973
- ]
3974
- },
3975
- "org:list": {
3976
- "aliases": [],
3977
- "args": {},
3978
- "description": "List organizations the current user is a member of",
3979
- "examples": [
3980
- "<%= config.bin %> org list"
3981
- ],
3982
- "flags": {
3983
- "api-url": {
3984
- "description": "Override API base URL",
3985
- "env": "RULEMETRIC_API_URL",
3986
- "hidden": true,
3987
- "name": "api-url",
3988
- "hasDynamicHelp": false,
3989
- "multiple": false,
3990
- "type": "option"
3991
- }
3992
- },
3993
- "hasDynamicHelp": false,
3994
- "hiddenAliases": [],
3995
- "id": "org:list",
3996
- "pluginAlias": "@rulemetric/cli",
3997
- "pluginName": "@rulemetric/cli",
3998
- "pluginType": "core",
3999
- "strict": true,
4000
- "enableJsonFlag": false,
4001
- "isESM": true,
4002
- "relativePath": [
4003
- "dist",
4004
- "commands",
4005
- "org",
4006
- "list.js"
4007
- ]
4008
- },
4009
- "org:switch": {
4010
- "aliases": [],
4011
- "args": {
4012
- "slug": {
4013
- "description": "Organization slug to switch to",
4014
- "name": "slug",
4015
- "required": false
4016
- }
4017
- },
4018
- "description": "Switch the active organization",
4019
- "examples": [
4020
- "<%= config.bin %> org switch acme",
4021
- "<%= config.bin %> org switch --clear"
4022
- ],
4023
- "flags": {
4024
- "api-url": {
4025
- "description": "Override API base URL",
4026
- "env": "RULEMETRIC_API_URL",
4027
- "hidden": true,
4028
- "name": "api-url",
4029
- "hasDynamicHelp": false,
4030
- "multiple": false,
4031
- "type": "option"
4032
- },
4033
- "clear": {
4034
- "description": "Clear the active organization (personal mode)",
4035
- "name": "clear",
4036
- "allowNo": false,
4037
- "type": "boolean"
4038
- }
4039
- },
4040
- "hasDynamicHelp": false,
4041
- "hiddenAliases": [],
4042
- "id": "org:switch",
4043
- "pluginAlias": "@rulemetric/cli",
4044
- "pluginName": "@rulemetric/cli",
4045
- "pluginType": "core",
4046
- "strict": true,
4047
- "enableJsonFlag": false,
4048
- "isESM": true,
4049
- "relativePath": [
4050
- "dist",
4051
- "commands",
4052
- "org",
4053
- "switch.js"
4054
- ]
4055
4055
  }
4056
4056
  },
4057
- "version": "0.5.0"
4057
+ "version": "0.5.2"
4058
4058
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rulemetric/cli",
3
- "version": "0.5.0",
3
+ "version": "0.5.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -70,9 +70,9 @@
70
70
  "postgres": "^3.4.0",
71
71
  "react": "^19.0.0",
72
72
  "zod": "^3.24.0",
73
- "@rulemetric/proxy": "0.5.0",
74
- "@rulemetric/skills-registry": "0.5.0",
75
- "@rulemetric/hooks": "0.5.0"
73
+ "@rulemetric/hooks": "0.5.2",
74
+ "@rulemetric/proxy": "0.5.2",
75
+ "@rulemetric/skills-registry": "0.5.2"
76
76
  },
77
77
  "//deps": "Worker (`evals agent`) runtime deps: the @opentelemetry/* set, @sentry/node, and postgres are STATIC top-level imports loaded at worker startup (via bundled @rulemetric/{telemetry,db}) — they MUST be runtime deps or a clean `npm i -g` crashes with ModuleLoadError. `better-sqlite3` is optionalDependencies (below): it's a native module, lazy `require()`'d inside a try/catch (packages/session providers cursor/opencode) so a missing binary degrades gracefully — making it a hard dep would break `npm i -g` on platforms without prebuilt binaries. `resend` stays a devDep: lazy `await import('resend')` guarded by RESEND_API_KEY, which end-user workers never set (provider falls back to noop). Classification verified via import-graph scan of dist/commands/evals/agent.js + per-importer static/lazy check.",
78
78
  "optionalDependencies": {
@@ -91,10 +91,10 @@
91
91
  "typescript": "^5.9.0",
92
92
  "vitest": "^3.2.0",
93
93
  "@rulemetric/api": "0.0.1",
94
- "@rulemetric/db": "0.0.1",
94
+ "@rulemetric/core": "0.0.1",
95
95
  "@rulemetric/session": "0.2.1",
96
96
  "@rulemetric/telemetry": "0.0.1",
97
- "@rulemetric/core": "0.0.1",
97
+ "@rulemetric/db": "0.0.1",
98
98
  "@rulemetric/typescript-config": "0.0.0",
99
99
  "@rulemetric/email": "0.0.1"
100
100
  },
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/api-client.ts"],
4
- "sourcesContent": ["import { fileURLToPath } from 'node:url';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { loadToken } from './auth.js';\n\n/**\n * Read the CLI's own version. Walks up from this module's location to find\n * `@rulemetric/cli`'s package.json \u2014 robust whether running unbundled from\n * `src/lib/` (dev) or from a bundled chunk at a different `dist/` depth (prod),\n * where a fixed relative `../../package.json` would resolve to the wrong file.\n */\nfunction readCliVersion(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 8; i++) {\n const pj = join(dir, 'package.json');\n if (existsSync(pj)) {\n try {\n const parsed = JSON.parse(readFileSync(pj, 'utf8')) as { name?: string; version?: string };\n if (parsed.name === '@rulemetric/cli' && parsed.version) return parsed.version;\n } catch {\n /* unreadable/parse error \u2014 keep walking up */\n }\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return '0.0.0';\n}\n\nconst version = readCliVersion();\n\nexport class ApiError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\ninterface ApiOptions {\n method?: string;\n body?: unknown;\n headers?: Record<string, string>;\n}\n\nfunction getBaseUrl(): string {\n const url = process.env.RULEMETRIC_API_URL ?? 'http://localhost:3000';\n\n // Enforce HTTPS for non-localhost URLs\n const parsed = new URL(url);\n if (parsed.protocol === 'http:' && parsed.hostname !== 'localhost' && parsed.hostname !== '127.0.0.1') {\n throw new Error(`API URL must use HTTPS for non-localhost hosts: ${url}`);\n }\n\n return url;\n}\n\nexport async function api<T>(path: string, options: ApiOptions = {}): Promise<T> {\n const baseUrl = getBaseUrl();\n const url = `${baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': `rulemetric-cli/${version}`,\n ...options.headers,\n };\n\n // API key (preferred for CLI/hooks/proxy \u2014 long-lived)\n const apiKey = process.env.RULEMETRIC_API_KEY;\n if (apiKey) {\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n // Supabase JWT (fallback \u2014 used right after login before key is created)\n if (!apiKey) {\n const token = loadToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token.accessToken}`;\n }\n }\n\n // Bypass proxy for localhost API calls \u2014 HTTPS_PROXY is for Claude Code \u2192 Anthropic,\n // not for CLI \u2192 local API. Node.js fetch doesn't respect NO_PROXY reliably, so we\n // temporarily unset the proxy env vars for localhost calls.\n const parsed = new URL(url);\n const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';\n const savedProxy = process.env.HTTPS_PROXY;\n const savedHttpProxy = process.env.HTTP_PROXY;\n if (isLocalhost) {\n delete process.env.HTTPS_PROXY;\n delete process.env.HTTP_PROXY;\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: options.method ?? 'GET',\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n } finally {\n // Restore proxy vars so claude -p calls still route through the proxy\n if (isLocalhost) {\n if (savedProxy !== undefined) process.env.HTTPS_PROXY = savedProxy;\n if (savedHttpProxy !== undefined) process.env.HTTP_PROXY = savedHttpProxy;\n }\n }\n\n let responseBody: unknown;\n const contentType = response.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n if (!response.ok) {\n // Extract only the error message, not the full response body\n const message =\n responseBody && typeof responseBody === 'object' && 'error' in responseBody\n ? String((responseBody as { error: string }).error)\n : `HTTP ${response.status}`;\n throw new ApiError(response.status, message);\n }\n\n return responseBody as T;\n}\n\nexport const apiGet = <T>(path: string): Promise<T> => api<T>(path);\nexport const apiPost = <T>(path: string, body: unknown): Promise<T> => api<T>(path, { method: 'POST', body });\nexport const apiPut = <T>(path: string, body: unknown): Promise<T> => api<T>(path, { method: 'PUT', body });\nexport const apiPatch = <T>(path: string, body: unknown): Promise<T> => api<T>(path, { method: 'PATCH', body });\nexport const apiDelete = <T>(path: string): Promise<T> => api<T>(path, { method: 'DELETE' });\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/auth.ts"],
4
- "sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\nexport interface AuthToken {\n accessToken: string;\n refreshToken: string;\n expiresAt: string;\n email: string;\n}\n\nfunction getConfigDir(): string {\n return process.env.RULEMETRIC_CONFIG_DIR || path.join(os.homedir(), '.config', 'rulemetric');\n}\n\nexport function createAuthStore(configDir: string = getConfigDir()) {\n const authFile = path.join(configDir, 'auth.json');\n\n function saveToken(token: AuthToken): void {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n fs.writeFileSync(authFile, JSON.stringify(token, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n });\n }\n\n function loadToken(): AuthToken | null {\n try {\n const data = fs.readFileSync(authFile, 'utf-8');\n const parsed: unknown = JSON.parse(data);\n if (\n parsed &&\n typeof parsed === 'object' &&\n 'accessToken' in parsed &&\n 'expiresAt' in parsed &&\n 'email' in parsed &&\n typeof (parsed as AuthToken).accessToken === 'string' &&\n typeof (parsed as AuthToken).expiresAt === 'string'\n ) {\n return parsed as AuthToken;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n function clearToken(): void {\n try {\n fs.unlinkSync(authFile);\n } catch {\n // File doesn't exist, nothing to clear\n }\n }\n\n function isAuthenticated(): boolean {\n const token = loadToken();\n if (!token) return false;\n const expiresAt = new Date(token.expiresAt).getTime();\n if (Number.isNaN(expiresAt)) return false;\n return Date.now() < expiresAt;\n }\n\n function saveEnvFile(accessToken: string, apiUrl?: string): void {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n const envPath = path.join(configDir, 'env');\n\n // Preserve existing RULEMETRIC_API_KEY if present\n let existingApiKey = '';\n try {\n const existing = fs.readFileSync(envPath, 'utf-8');\n const match = existing.match(/^RULEMETRIC_API_KEY=(.+)$/m);\n if (match) existingApiKey = match[1];\n } catch { /* file doesn't exist */ }\n\n const lines = [\n `RULEMETRIC_ACCESS_TOKEN=${accessToken}`,\n ];\n if (existingApiKey) {\n lines.push(`RULEMETRIC_API_KEY=${existingApiKey}`);\n }\n if (apiUrl) {\n lines.push(`RULEMETRIC_API_URL=${apiUrl}`);\n }\n\n fs.writeFileSync(envPath, lines.join('\\n') + '\\n', {\n encoding: 'utf-8',\n mode: 0o600,\n });\n }\n\n function saveApiKeyToEnv(apiKey: string, apiUrl?: string): void {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n const envPath = path.join(configDir, 'env');\n\n // Preserve existing ACCESS_TOKEN if present\n let existingToken = '';\n let existingUrl = '';\n try {\n const existing = fs.readFileSync(envPath, 'utf-8');\n const tokenMatch = existing.match(/^RULEMETRIC_ACCESS_TOKEN=(.+)$/m);\n if (tokenMatch) existingToken = tokenMatch[1];\n const urlMatch = existing.match(/^RULEMETRIC_API_URL=(.+)$/m);\n if (urlMatch) existingUrl = urlMatch[1];\n } catch { /* file doesn't exist */ }\n\n const lines = [\n `RULEMETRIC_API_KEY=${apiKey}`,\n ];\n if (existingToken) {\n lines.push(`RULEMETRIC_ACCESS_TOKEN=${existingToken}`);\n }\n const url = apiUrl ?? existingUrl;\n if (url) {\n lines.push(`RULEMETRIC_API_URL=${url}`);\n }\n\n fs.writeFileSync(envPath, lines.join('\\n') + '\\n', {\n encoding: 'utf-8',\n mode: 0o600,\n });\n }\n\n function clearEnvFile(): void {\n const envPath = path.join(configDir, 'env');\n try { fs.unlinkSync(envPath); } catch { /* noop */ }\n }\n\n return { saveToken, loadToken, clearToken, isAuthenticated, saveEnvFile, saveApiKeyToEnv, clearEnvFile, configDir, authFile };\n}\n\n// Lazy accessors \u2014 re-evaluate config dir from env on each call\nfunction getStore() {\n return createAuthStore();\n}\n\nexport function saveToken(token: AuthToken): void { getStore().saveToken(token); }\nexport function loadToken(): AuthToken | null { return getStore().loadToken(); }\nexport function clearToken(): void { getStore().clearToken(); }\nexport function isAuthenticated(): boolean {\n // API key counts as authenticated\n if (process.env.RULEMETRIC_API_KEY) return true;\n return getStore().isAuthenticated();\n}\nexport function saveEnvFile(accessToken: string, apiUrl?: string): void { getStore().saveEnvFile(accessToken, apiUrl); }\nexport function saveApiKey(apiKey: string, apiUrl?: string): void { getStore().saveApiKeyToEnv(apiKey, apiUrl); }\nexport function clearEnvFile(): void { getStore().clearEnvFile(); }\nexport function getDefaultConfigDir(): string { return getConfigDir(); }\n// Re-exported for backward compat (evaluated at import time; prefer getDefaultConfigDir() for dynamic usage)\nexport const CONFIG_DIR = getConfigDir();\n"],
5
- "mappings": "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",
6
- "names": ["saveToken", "loadToken", "clearToken", "isAuthenticated", "saveEnvFile", "clearEnvFile"]
7
- }