@rulemetric/cli 0.1.1 → 0.2.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 (251) hide show
  1. package/README.md +66 -0
  2. package/dist/base-command.d.ts.map +1 -1
  3. package/dist/base-command.js +15 -0
  4. package/dist/base-command.js.map +1 -1
  5. package/dist/commands/auth/login.d.ts.map +1 -1
  6. package/dist/commands/auth/login.js +7 -0
  7. package/dist/commands/auth/login.js.map +1 -1
  8. package/dist/commands/crons/list.d.ts +7 -0
  9. package/dist/commands/crons/list.d.ts.map +1 -0
  10. package/dist/commands/crons/list.js +24 -0
  11. package/dist/commands/crons/list.js.map +1 -0
  12. package/dist/commands/crons/run.d.ts +13 -0
  13. package/dist/commands/crons/run.d.ts.map +1 -0
  14. package/dist/commands/crons/run.js +48 -0
  15. package/dist/commands/crons/run.js.map +1 -0
  16. package/dist/commands/evals/listen.d.ts +28 -2
  17. package/dist/commands/evals/listen.d.ts.map +1 -1
  18. package/dist/commands/evals/listen.js +159 -25
  19. package/dist/commands/evals/listen.js.map +1 -1
  20. package/dist/commands/evals/listen.test.d.ts +2 -0
  21. package/dist/commands/evals/listen.test.d.ts.map +1 -0
  22. package/dist/commands/evals/listen.test.js +48 -0
  23. package/dist/commands/evals/listen.test.js.map +1 -0
  24. package/dist/commands/gateway/ensure.js +1 -1
  25. package/dist/commands/gateway/ensure.js.map +1 -1
  26. package/dist/commands/hooks/install.d.ts.map +1 -1
  27. package/dist/commands/hooks/install.js +40 -3
  28. package/dist/commands/hooks/install.js.map +1 -1
  29. package/dist/commands/hooks/run.js +1 -1
  30. package/dist/commands/hooks/run.js.map +1 -1
  31. package/dist/commands/hooks/uninstall.d.ts.map +1 -1
  32. package/dist/commands/hooks/uninstall.js +9 -1
  33. package/dist/commands/hooks/uninstall.js.map +1 -1
  34. package/dist/commands/org/current.d.ts +7 -0
  35. package/dist/commands/org/current.d.ts.map +1 -0
  36. package/dist/commands/org/current.js +70 -0
  37. package/dist/commands/org/current.js.map +1 -0
  38. package/dist/commands/org/list.d.ts +7 -0
  39. package/dist/commands/org/list.d.ts.map +1 -0
  40. package/dist/commands/org/list.js +37 -0
  41. package/dist/commands/org/list.js.map +1 -0
  42. package/dist/commands/org/switch.d.ts +13 -0
  43. package/dist/commands/org/switch.d.ts.map +1 -0
  44. package/dist/commands/org/switch.js +52 -0
  45. package/dist/commands/org/switch.js.map +1 -0
  46. package/dist/commands/proxy/restart.d.ts +11 -0
  47. package/dist/commands/proxy/restart.d.ts.map +1 -0
  48. package/dist/commands/proxy/restart.js +36 -0
  49. package/dist/commands/proxy/restart.js.map +1 -0
  50. package/dist/commands/proxy/start.d.ts.map +1 -1
  51. package/dist/commands/proxy/start.js +4 -0
  52. package/dist/commands/proxy/start.js.map +1 -1
  53. package/dist/commands/service/install.d.ts +16 -0
  54. package/dist/commands/service/install.d.ts.map +1 -1
  55. package/dist/commands/service/install.js +145 -6
  56. package/dist/commands/service/install.js.map +1 -1
  57. package/dist/commands/service/uninstall.d.ts.map +1 -1
  58. package/dist/commands/service/uninstall.js +28 -0
  59. package/dist/commands/service/uninstall.js.map +1 -1
  60. package/dist/commands/sessions/start.d.ts.map +1 -1
  61. package/dist/commands/sessions/start.js +5 -0
  62. package/dist/commands/sessions/start.js.map +1 -1
  63. package/dist/commands/signals/report.d.ts +10 -0
  64. package/dist/commands/signals/report.d.ts.map +1 -0
  65. package/dist/commands/signals/report.js +35 -0
  66. package/dist/commands/signals/report.js.map +1 -0
  67. package/dist/commands/signals/report.test.d.ts +2 -0
  68. package/dist/commands/signals/report.test.d.ts.map +1 -0
  69. package/dist/commands/signals/report.test.js +65 -0
  70. package/dist/commands/signals/report.test.js.map +1 -0
  71. package/dist/commands/skills/export-approved.d.ts +10 -0
  72. package/dist/commands/skills/export-approved.d.ts.map +1 -0
  73. package/dist/commands/skills/export-approved.js +31 -0
  74. package/dist/commands/skills/export-approved.js.map +1 -0
  75. package/dist/commands/skills/publish.d.ts +17 -0
  76. package/dist/commands/skills/publish.d.ts.map +1 -0
  77. package/dist/commands/skills/publish.js +80 -0
  78. package/dist/commands/skills/publish.js.map +1 -0
  79. package/dist/commands/skills/update.d.ts +3 -0
  80. package/dist/commands/skills/update.d.ts.map +1 -1
  81. package/dist/commands/skills/update.js +17 -6
  82. package/dist/commands/skills/update.js.map +1 -1
  83. package/dist/commands/suggestions/accept.d.ts +16 -0
  84. package/dist/commands/suggestions/accept.d.ts.map +1 -0
  85. package/dist/commands/suggestions/accept.js +61 -0
  86. package/dist/commands/suggestions/accept.js.map +1 -0
  87. package/dist/commands/suggestions/accept.test.d.ts +2 -0
  88. package/dist/commands/suggestions/accept.test.d.ts.map +1 -0
  89. package/dist/commands/suggestions/accept.test.js +52 -0
  90. package/dist/commands/suggestions/accept.test.js.map +1 -0
  91. package/dist/commands/suggestions/dismiss.d.ts +10 -0
  92. package/dist/commands/suggestions/dismiss.d.ts.map +1 -0
  93. package/dist/commands/suggestions/dismiss.js +26 -0
  94. package/dist/commands/suggestions/dismiss.js.map +1 -0
  95. package/dist/commands/suggestions/list.d.ts +10 -0
  96. package/dist/commands/suggestions/list.d.ts.map +1 -0
  97. package/dist/commands/suggestions/list.js +40 -0
  98. package/dist/commands/suggestions/list.js.map +1 -0
  99. package/dist/commands/suggestions/refresh.d.ts +7 -0
  100. package/dist/commands/suggestions/refresh.d.ts.map +1 -0
  101. package/dist/commands/suggestions/refresh.js +11 -0
  102. package/dist/commands/suggestions/refresh.js.map +1 -0
  103. package/dist/dashboard/Dashboard.d.ts.map +1 -1
  104. package/dist/dashboard/Dashboard.js +7 -1
  105. package/dist/dashboard/Dashboard.js.map +1 -1
  106. package/dist/lib/active-org-refresh.d.ts +22 -0
  107. package/dist/lib/active-org-refresh.d.ts.map +1 -0
  108. package/dist/lib/active-org-refresh.js +108 -0
  109. package/dist/lib/active-org-refresh.js.map +1 -0
  110. package/dist/lib/active-org-refresh.test.d.ts +2 -0
  111. package/dist/lib/active-org-refresh.test.d.ts.map +1 -0
  112. package/dist/lib/active-org-refresh.test.js +190 -0
  113. package/dist/lib/active-org-refresh.test.js.map +1 -0
  114. package/dist/lib/active-org.d.ts +43 -0
  115. package/dist/lib/active-org.d.ts.map +1 -0
  116. package/dist/lib/active-org.js +96 -0
  117. package/dist/lib/active-org.js.map +1 -0
  118. package/dist/lib/active-org.test.d.ts +2 -0
  119. package/dist/lib/active-org.test.d.ts.map +1 -0
  120. package/dist/lib/active-org.test.js +147 -0
  121. package/dist/lib/active-org.test.js.map +1 -0
  122. package/dist/lib/cron-registry.d.ts +47 -0
  123. package/dist/lib/cron-registry.d.ts.map +1 -0
  124. package/dist/lib/cron-registry.js +102 -0
  125. package/dist/lib/cron-registry.js.map +1 -0
  126. package/dist/lib/cron-registry.test.d.ts +2 -0
  127. package/dist/lib/cron-registry.test.d.ts.map +1 -0
  128. package/dist/lib/cron-registry.test.js +136 -0
  129. package/dist/lib/cron-registry.test.js.map +1 -0
  130. package/dist/lib/cron-runner.d.ts +16 -0
  131. package/dist/lib/cron-runner.d.ts.map +1 -0
  132. package/dist/lib/cron-runner.js +68 -0
  133. package/dist/lib/cron-runner.js.map +1 -0
  134. package/dist/lib/detect-languages.d.ts +7 -0
  135. package/dist/lib/detect-languages.d.ts.map +1 -0
  136. package/dist/lib/detect-languages.js +113 -0
  137. package/dist/lib/detect-languages.js.map +1 -0
  138. package/dist/lib/detect-languages.test.d.ts +2 -0
  139. package/dist/lib/detect-languages.test.d.ts.map +1 -0
  140. package/dist/lib/detect-languages.test.js +29 -0
  141. package/dist/lib/detect-languages.test.js.map +1 -0
  142. package/dist/lib/eval-executor.d.ts.map +1 -1
  143. package/dist/lib/eval-executor.js +5 -2
  144. package/dist/lib/eval-executor.js.map +1 -1
  145. package/dist/lib/gateway-entry.js +4 -1
  146. package/dist/lib/gateway-entry.js.map +1 -1
  147. package/dist/lib/gateway-lifecycle.d.ts +1 -1
  148. package/dist/lib/gateway-lifecycle.d.ts.map +1 -1
  149. package/dist/lib/gateway-lifecycle.js +13 -2
  150. package/dist/lib/gateway-lifecycle.js.map +1 -1
  151. package/dist/lib/gateway.d.ts +4 -5
  152. package/dist/lib/gateway.d.ts.map +1 -1
  153. package/dist/lib/gateway.js +68 -2
  154. package/dist/lib/gateway.js.map +1 -1
  155. package/dist/lib/graphile-worker-runner.d.ts +124 -0
  156. package/dist/lib/graphile-worker-runner.d.ts.map +1 -0
  157. package/dist/lib/graphile-worker-runner.js +526 -0
  158. package/dist/lib/graphile-worker-runner.js.map +1 -0
  159. package/dist/lib/graphile-worker-runner.test.d.ts +2 -0
  160. package/dist/lib/graphile-worker-runner.test.d.ts.map +1 -0
  161. package/dist/lib/graphile-worker-runner.test.js +153 -0
  162. package/dist/lib/graphile-worker-runner.test.js.map +1 -0
  163. package/dist/lib/handlers/cron-close-stale-sessions.d.ts +3 -0
  164. package/dist/lib/handlers/cron-close-stale-sessions.d.ts.map +1 -0
  165. package/dist/lib/handlers/cron-close-stale-sessions.js +8 -0
  166. package/dist/lib/handlers/cron-close-stale-sessions.js.map +1 -0
  167. package/dist/lib/handlers/cron-data-integrity-audit.d.ts +3 -0
  168. package/dist/lib/handlers/cron-data-integrity-audit.d.ts.map +1 -0
  169. package/dist/lib/handlers/cron-data-integrity-audit.js +16 -0
  170. package/dist/lib/handlers/cron-data-integrity-audit.js.map +1 -0
  171. package/dist/lib/handlers/cron-refresh-skills.d.ts +3 -0
  172. package/dist/lib/handlers/cron-refresh-skills.d.ts.map +1 -0
  173. package/dist/lib/handlers/cron-refresh-skills.js +91 -0
  174. package/dist/lib/handlers/cron-refresh-skills.js.map +1 -0
  175. package/dist/lib/handlers/cron-refresh-skills.test.d.ts +2 -0
  176. package/dist/lib/handlers/cron-refresh-skills.test.d.ts.map +1 -0
  177. package/dist/lib/handlers/cron-refresh-skills.test.js +114 -0
  178. package/dist/lib/handlers/cron-refresh-skills.test.js.map +1 -0
  179. package/dist/lib/handlers/cron-regenerate-insights.d.ts +3 -0
  180. package/dist/lib/handlers/cron-regenerate-insights.d.ts.map +1 -0
  181. package/dist/lib/handlers/cron-regenerate-insights.js +6 -0
  182. package/dist/lib/handlers/cron-regenerate-insights.js.map +1 -0
  183. package/dist/lib/handlers/cron-suggest-instructions.d.ts +3 -0
  184. package/dist/lib/handlers/cron-suggest-instructions.d.ts.map +1 -0
  185. package/dist/lib/handlers/cron-suggest-instructions.js +159 -0
  186. package/dist/lib/handlers/cron-suggest-instructions.js.map +1 -0
  187. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts +2 -0
  188. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts.map +1 -0
  189. package/dist/lib/handlers/cron-suggest-instructions.test.js +80 -0
  190. package/dist/lib/handlers/cron-suggest-instructions.test.js.map +1 -0
  191. package/dist/lib/handlers/process-conversation.d.ts +35 -0
  192. package/dist/lib/handlers/process-conversation.d.ts.map +1 -0
  193. package/dist/lib/handlers/process-conversation.js +35 -0
  194. package/dist/lib/handlers/process-conversation.js.map +1 -0
  195. package/dist/lib/handlers/process-eval.d.ts +32 -0
  196. package/dist/lib/handlers/process-eval.d.ts.map +1 -0
  197. package/dist/lib/handlers/process-eval.js +207 -0
  198. package/dist/lib/handlers/process-eval.js.map +1 -0
  199. package/dist/lib/handlers/process-insights.d.ts +39 -0
  200. package/dist/lib/handlers/process-insights.d.ts.map +1 -0
  201. package/dist/lib/handlers/process-insights.js +300 -0
  202. package/dist/lib/handlers/process-insights.js.map +1 -0
  203. package/dist/lib/handlers/process-launch.d.ts +29 -0
  204. package/dist/lib/handlers/process-launch.d.ts.map +1 -0
  205. package/dist/lib/handlers/process-launch.js +41 -0
  206. package/dist/lib/handlers/process-launch.js.map +1 -0
  207. package/dist/lib/hooks-config.d.ts +28 -4
  208. package/dist/lib/hooks-config.d.ts.map +1 -1
  209. package/dist/lib/hooks-config.js +138 -10
  210. package/dist/lib/hooks-config.js.map +1 -1
  211. package/dist/lib/llm-client.d.ts.map +1 -1
  212. package/dist/lib/llm-client.js +149 -16
  213. package/dist/lib/llm-client.js.map +1 -1
  214. package/dist/lib/mirror-writer-db.d.ts +12 -0
  215. package/dist/lib/mirror-writer-db.d.ts.map +1 -0
  216. package/dist/lib/mirror-writer-db.js +51 -0
  217. package/dist/lib/mirror-writer-db.js.map +1 -0
  218. package/dist/lib/mirror-writer.d.ts +35 -0
  219. package/dist/lib/mirror-writer.d.ts.map +1 -0
  220. package/dist/lib/mirror-writer.js +27 -0
  221. package/dist/lib/mirror-writer.js.map +1 -0
  222. package/dist/lib/mirror-writer.test.d.ts +2 -0
  223. package/dist/lib/mirror-writer.test.d.ts.map +1 -0
  224. package/dist/lib/mirror-writer.test.js +47 -0
  225. package/dist/lib/mirror-writer.test.js.map +1 -0
  226. package/dist/lib/permanent-job-error.d.ts +17 -0
  227. package/dist/lib/permanent-job-error.d.ts.map +1 -0
  228. package/dist/lib/permanent-job-error.js +23 -0
  229. package/dist/lib/permanent-job-error.js.map +1 -0
  230. package/dist/lib/permanent-job-error.test.d.ts +2 -0
  231. package/dist/lib/permanent-job-error.test.d.ts.map +1 -0
  232. package/dist/lib/permanent-job-error.test.js +29 -0
  233. package/dist/lib/permanent-job-error.test.js.map +1 -0
  234. package/dist/lib/version-check.d.ts +11 -0
  235. package/dist/lib/version-check.d.ts.map +1 -0
  236. package/dist/lib/version-check.js +106 -0
  237. package/dist/lib/version-check.js.map +1 -0
  238. package/oclif.manifest.json +611 -81
  239. package/package.json +19 -5
  240. package/dist/commands/insights/sync.d.ts +0 -17
  241. package/dist/commands/insights/sync.d.ts.map +0 -1
  242. package/dist/commands/insights/sync.js +0 -477
  243. package/dist/commands/insights/sync.js.map +0 -1
  244. package/dist/lib/eval-worker.d.ts +0 -12
  245. package/dist/lib/eval-worker.d.ts.map +0 -1
  246. package/dist/lib/eval-worker.js +0 -395
  247. package/dist/lib/eval-worker.js.map +0 -1
  248. package/dist/lib/insights-worker.d.ts +0 -10
  249. package/dist/lib/insights-worker.d.ts.map +0 -1
  250. package/dist/lib/insights-worker.js +0 -329
  251. package/dist/lib/insights-worker.js.map +0 -1
@@ -0,0 +1,80 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { Args, Flags } from '@oclif/core';
4
+ import { BaseCommand } from '../../base-command.js';
5
+ import { apiPost } from '../../lib/api-client.js';
6
+ export default class SkillsPublish extends BaseCommand {
7
+ static description = 'Submit a skill file to the RuleMetric skills registry';
8
+ static examples = [
9
+ '<%= config.bin %> skills publish ./my-skill.md',
10
+ '<%= config.bin %> skills publish ./my-skill.md --category workflow --tool claude_code',
11
+ ];
12
+ static args = {
13
+ file: Args.string({ description: 'Path to skill file (.md)', required: true }),
14
+ };
15
+ static flags = {
16
+ name: Flags.string({ description: 'Skill name (defaults to filename)' }),
17
+ description: Flags.string({ description: 'One-line description' }),
18
+ category: Flags.string({
19
+ description: 'Skill category',
20
+ options: [
21
+ 'workflow', 'language', 'framework', 'tool', 'security',
22
+ 'testing', 'architecture', 'devops', 'documentation',
23
+ 'performance', 'other',
24
+ ],
25
+ default: 'other',
26
+ }),
27
+ tool: Flags.string({
28
+ description: 'Primary tool this skill targets',
29
+ options: ['claude_code', 'cursor', 'copilot', 'windsurf', 'universal'],
30
+ default: 'universal',
31
+ }),
32
+ tags: Flags.string({ description: 'Comma-separated tags', default: '' }),
33
+ };
34
+ async run() {
35
+ const { args, flags } = await this.parse(SkillsPublish);
36
+ this.requireAuth();
37
+ const filePath = path.resolve(args.file);
38
+ if (!fs.existsSync(filePath)) {
39
+ this.error(`File not found: ${filePath}`);
40
+ }
41
+ const content = fs.readFileSync(filePath, 'utf-8');
42
+ if (content.trim().length < 20) {
43
+ this.error('Skill content is too short (minimum 20 characters)');
44
+ }
45
+ const basename = path.basename(filePath, path.extname(filePath));
46
+ const name = flags.name ?? basename
47
+ .replace(/[-_]+/g, ' ')
48
+ .replace(/\b\w/g, c => c.toUpperCase());
49
+ const id = basename.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
50
+ const tags = flags.tags
51
+ ? flags.tags.split(',').map(t => t.trim()).filter(Boolean)
52
+ : [];
53
+ this.log(`Publishing skill: ${name} (${id})`);
54
+ this.log(` Category: ${flags.category}`);
55
+ this.log(` Tool: ${flags.tool}`);
56
+ if (tags.length > 0)
57
+ this.log(` Tags: ${tags.join(', ')}`);
58
+ this.log(` Content: ${content.length} characters\n`);
59
+ const payload = {
60
+ id,
61
+ name,
62
+ description: flags.description ?? `Community skill: ${name}`,
63
+ category: flags.category,
64
+ tools: [flags.tool],
65
+ tags,
66
+ content,
67
+ };
68
+ try {
69
+ const result = await apiPost('/api/skills/publish', payload);
70
+ this.log(`Published! ${result.message ?? `Skill "${name}" submitted to the registry.`}`);
71
+ }
72
+ catch (err) {
73
+ if (err instanceof Error) {
74
+ this.error(`Failed to publish: ${err.message}`);
75
+ }
76
+ throw err;
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/commands/skills/publish.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,9 @@ import { BaseCommand } from '../../base-command.js';
2
2
  export default class SkillsUpdate extends BaseCommand {
3
3
  static description: string;
4
4
  static examples: string[];
5
+ static flags: {
6
+ all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
5
8
  run(): Promise<void>;
6
9
  }
7
10
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/update.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOpD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,WAAW;IACnD,OAAgB,WAAW,SAAuE;IAElG,OAAgB,QAAQ,WAEtB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoB3B"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/update.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOpD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,WAAW;IACnD,OAAgB,WAAW,SAAuE;IAElG,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA4B3B"}
@@ -1,30 +1,41 @@
1
1
  import * as fs from 'node:fs';
2
2
  import * as path from 'node:path';
3
3
  import * as os from 'node:os';
4
+ import { Flags } from '@oclif/core';
4
5
  import { BaseCommand } from '../../base-command.js';
5
- import { fetchAllSources, TIER_1_SOURCES } from '@rulemetric/skills-registry';
6
+ import { fetchAllSources, TIER_1_SOURCES, TIER_2_SOURCES } from '@rulemetric/skills-registry';
6
7
  const CACHE_DIR = path.join(os.homedir(), '.config', 'rulemetric');
7
8
  const REGISTRY_PATH = path.join(CACHE_DIR, 'skills-registry.json');
8
9
  export default class SkillsUpdate extends BaseCommand {
9
10
  static description = 'Fetch latest skills from GitHub sources and update local registry';
10
11
  static examples = [
11
12
  '<%= config.bin %> skills update',
13
+ '<%= config.bin %> skills update --all',
12
14
  ];
15
+ static flags = {
16
+ all: Flags.boolean({ description: 'Include Tier 2 (niche) sources', default: false }),
17
+ };
13
18
  async run() {
14
- this.log('Fetching skills from community sources...\n');
15
- const entries = await fetchAllSources(TIER_1_SOURCES, (source, count) => {
16
- this.log(` ${source}: ${count} skills`);
19
+ const { flags } = await this.parse(SkillsUpdate);
20
+ const sources = flags.all
21
+ ? [...TIER_1_SOURCES, ...TIER_2_SOURCES]
22
+ : TIER_1_SOURCES;
23
+ this.log(`Fetching skills from ${sources.length} sources${flags.all ? ' (Tier 1 + 2)' : ''}...\n`);
24
+ const result = await fetchAllSources(sources, {
25
+ onProgress: (source, count) => {
26
+ this.log(` ${source}: ${count} skills`);
27
+ },
17
28
  });
18
29
  const registry = {
19
30
  version: '1.0.0',
20
31
  generatedAt: new Date().toISOString(),
21
- skills: entries,
32
+ skills: result.entries,
22
33
  };
23
34
  if (!fs.existsSync(CACHE_DIR)) {
24
35
  fs.mkdirSync(CACHE_DIR, { recursive: true });
25
36
  }
26
37
  fs.writeFileSync(REGISTRY_PATH, JSON.stringify(registry));
27
- this.log(`\nUpdated registry: ${entries.length} skills cached at ${REGISTRY_PATH}`);
38
+ this.log(`\nUpdated registry: ${result.entries.length} skills cached at ${REGISTRY_PATH}`);
28
39
  }
29
40
  }
30
41
  //# sourceMappingURL=update.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/skills/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG9E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AACnE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;AAEnE,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,WAAW;IACnD,MAAM,CAAU,WAAW,GAAG,mEAAmE,CAAC;IAElG,MAAM,CAAU,QAAQ,GAAG;QACzB,iCAAiC;KAClC,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAExD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACtE,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,KAAK,SAAS,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAkB;YAC9B,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,MAAM,EAAE,OAAO;SAChB,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,MAAM,qBAAqB,aAAa,EAAE,CAAC,CAAC;IACtF,CAAC"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/skills/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG9F,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AACnE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;AAEnE,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,WAAW;IACnD,MAAM,CAAU,WAAW,GAAG,mEAAmE,CAAC;IAElG,MAAM,CAAU,QAAQ,GAAG;QACzB,iCAAiC;QACjC,uCAAuC;KACxC,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;KACtF,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG;YACvB,CAAC,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC;YACxC,CAAC,CAAC,cAAc,CAAC;QAEnB,IAAI,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,MAAM,WAAW,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAEnG,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE;YAC5C,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC5B,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,KAAK,SAAS,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAkB;YAC9B,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,MAAM,EAAE,MAAM,CAAC,OAAO;SACvB,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,OAAO,CAAC,MAAM,qBAAqB,aAAa,EAAE,CAAC,CAAC;IAC7F,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ /**
3
+ * Append an instruction block to CLAUDE.md in the given directory. Idempotent:
4
+ * skips if a block with the same instructionId already exists. Returns true if
5
+ * the file was modified, false if the block was already present.
6
+ */
7
+ export declare function appendToCLAUDEmd(dir: string, instructionId: string, content: string): boolean;
8
+ export default class SuggestionsAccept extends BaseCommand {
9
+ static description: string;
10
+ static examples: string[];
11
+ static args: {
12
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
13
+ };
14
+ run(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=accept.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.d.ts","sourceRoot":"","sources":["../../../src/commands/suggestions/accept.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAmBpD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAkB7F;AAED,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,WAAW;IACtD,OAAgB,WAAW,SAAiE;IAE5F,OAAgB,QAAQ,WAEtB;IAEF,OAAgB,IAAI;;MAElB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsC7B"}
@@ -0,0 +1,61 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { Args } from '@oclif/core';
4
+ import { normalizeProjectPath } from '@rulemetric/core/paths';
5
+ import { BaseCommand } from '../../base-command.js';
6
+ import { apiGet, apiPost } from '../../lib/api-client.js';
7
+ import { validateUuid } from '../../lib/types.js';
8
+ /**
9
+ * Append an instruction block to CLAUDE.md in the given directory. Idempotent:
10
+ * skips if a block with the same instructionId already exists. Returns true if
11
+ * the file was modified, false if the block was already present.
12
+ */
13
+ export function appendToCLAUDEmd(dir, instructionId, content) {
14
+ const filePath = path.join(dir, 'CLAUDE.md');
15
+ const startTag = `<!-- rulemetric:start ${instructionId} -->`;
16
+ const endTag = `<!-- rulemetric:end ${instructionId} -->`;
17
+ const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';
18
+ if (existing.includes(startTag)) {
19
+ return false;
20
+ }
21
+ const separator = existing.length > 0 && !existing.endsWith('\n')
22
+ ? '\n\n'
23
+ : existing.length > 0 ? '\n' : '';
24
+ const block = `${separator}\n${startTag}\n${content}\n${endTag}\n`;
25
+ fs.writeFileSync(filePath, existing + block, 'utf8');
26
+ return true;
27
+ }
28
+ export default class SuggestionsAccept extends BaseCommand {
29
+ static description = 'Accept a suggestion and append the instruction to CLAUDE.md';
30
+ static examples = [
31
+ '<%= config.bin %> suggestions accept <id>',
32
+ ];
33
+ static args = {
34
+ id: Args.string({ description: 'Suggestion UUID from `suggestions list`', required: true }),
35
+ };
36
+ async run() {
37
+ const { args } = await this.parse(SuggestionsAccept);
38
+ this.requireAuth();
39
+ validateUuid(args.id, 'suggestion ID');
40
+ const projectPath = normalizeProjectPath(process.cwd());
41
+ const suggestion = await apiGet(`/api/instruction-suggestions/${encodeURIComponent(args.id)}`);
42
+ let effectiveInstructionId = suggestion.instructionId;
43
+ if (suggestion.instructionScope === 'public') {
44
+ const promoted = await apiPost(`/api/instructions/${encodeURIComponent(suggestion.instructionId)}/promote-from-public`, { targetScope: 'personal' });
45
+ effectiveInstructionId = promoted.instructionId;
46
+ }
47
+ const instruction = await apiGet(`/api/instructions/${encodeURIComponent(effectiveInstructionId)}`);
48
+ const modified = appendToCLAUDEmd(process.cwd(), effectiveInstructionId, instruction.content);
49
+ if (!modified) {
50
+ this.log(`Already present: ${instruction.name} is already in CLAUDE.md (block id: ${effectiveInstructionId}).`);
51
+ }
52
+ else {
53
+ this.log(`Accepted: added ${instruction.name} to CLAUDE.md. It will be active starting in your next session.`);
54
+ }
55
+ await apiPost(`/api/instruction-suggestions/${encodeURIComponent(args.id)}/events`, {
56
+ eventType: 'accepted',
57
+ projectPath,
58
+ });
59
+ }
60
+ }
61
+ //# sourceMappingURL=accept.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.js","sourceRoot":"","sources":["../../../src/commands/suggestions/accept.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=accept.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.test.d.ts","sourceRoot":"","sources":["../../../src/commands/suggestions/accept.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import * as fs from 'node:fs';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
+ import { appendToCLAUDEmd } from './accept.js';
6
+ const INSTRUCTION_ID = '11111111-1111-1111-1111-111111111111';
7
+ const CONTENT = '## My Rule\nAlways write tests.';
8
+ describe('appendToCLAUDEmd', () => {
9
+ let tmpDir;
10
+ beforeEach(() => {
11
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'rulemetric-test-'));
12
+ });
13
+ afterEach(() => {
14
+ fs.rmSync(tmpDir, { recursive: true, force: true });
15
+ });
16
+ it('creates CLAUDE.md when the file does not exist', () => {
17
+ const claudePath = path.join(tmpDir, 'CLAUDE.md');
18
+ expect(fs.existsSync(claudePath)).toBe(false);
19
+ const modified = appendToCLAUDEmd(tmpDir, INSTRUCTION_ID, CONTENT);
20
+ expect(modified).toBe(true);
21
+ expect(fs.existsSync(claudePath)).toBe(true);
22
+ const written = fs.readFileSync(claudePath, 'utf8');
23
+ expect(written).toContain(`<!-- rulemetric:start ${INSTRUCTION_ID} -->`);
24
+ expect(written).toContain(CONTENT);
25
+ expect(written).toContain(`<!-- rulemetric:end ${INSTRUCTION_ID} -->`);
26
+ });
27
+ it('appends the block when CLAUDE.md exists but does not contain the block', () => {
28
+ const claudePath = path.join(tmpDir, 'CLAUDE.md');
29
+ const initial = '# My Project\n\nSome existing content.\n';
30
+ fs.writeFileSync(claudePath, initial, 'utf8');
31
+ const modified = appendToCLAUDEmd(tmpDir, INSTRUCTION_ID, CONTENT);
32
+ expect(modified).toBe(true);
33
+ const written = fs.readFileSync(claudePath, 'utf8');
34
+ expect(written).toContain('Some existing content.');
35
+ expect(written).toContain(`<!-- rulemetric:start ${INSTRUCTION_ID} -->`);
36
+ const startIdx = written.indexOf('Some existing content.');
37
+ const blockIdx = written.indexOf(`<!-- rulemetric:start ${INSTRUCTION_ID} -->`);
38
+ expect(blockIdx).toBeGreaterThan(startIdx);
39
+ });
40
+ it('skips the append when the block is already present (idempotent)', () => {
41
+ const claudePath = path.join(tmpDir, 'CLAUDE.md');
42
+ const startTag = `<!-- rulemetric:start ${INSTRUCTION_ID} -->`;
43
+ const endTag = `<!-- rulemetric:end ${INSTRUCTION_ID} -->`;
44
+ const existing = `# Existing\n\n${startTag}\n${CONTENT}\n${endTag}\n`;
45
+ fs.writeFileSync(claudePath, existing, 'utf8');
46
+ const modified = appendToCLAUDEmd(tmpDir, INSTRUCTION_ID, CONTENT);
47
+ expect(modified).toBe(false);
48
+ const written = fs.readFileSync(claudePath, 'utf8');
49
+ expect(written).toBe(existing);
50
+ });
51
+ });
52
+ //# sourceMappingURL=accept.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept.test.js","sourceRoot":"","sources":["../../../src/commands/suggestions/accept.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class SuggestionsDismiss extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=dismiss.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismiss.d.ts","sourceRoot":"","sources":["../../../src/commands/suggestions/dismiss.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,WAAW;IACvD,OAAgB,WAAW,SAAgE;IAE3F,OAAgB,QAAQ,WAEtB;IAEF,OAAgB,IAAI;;MAElB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAc7B"}
@@ -0,0 +1,26 @@
1
+ import { Args } from '@oclif/core';
2
+ import { normalizeProjectPath } from '@rulemetric/core/paths';
3
+ import { BaseCommand } from '../../base-command.js';
4
+ import { apiPost } from '../../lib/api-client.js';
5
+ import { validateUuid } from '../../lib/types.js';
6
+ export default class SuggestionsDismiss extends BaseCommand {
7
+ static description = 'Dismiss a suggestion so it will not re-surface for 30 days';
8
+ static examples = [
9
+ '<%= config.bin %> suggestions dismiss <id>',
10
+ ];
11
+ static args = {
12
+ id: Args.string({ description: 'Suggestion UUID from `suggestions list`', required: true }),
13
+ };
14
+ async run() {
15
+ const { args } = await this.parse(SuggestionsDismiss);
16
+ this.requireAuth();
17
+ validateUuid(args.id, 'suggestion ID');
18
+ const projectPath = normalizeProjectPath(process.cwd());
19
+ await apiPost(`/api/instruction-suggestions/${encodeURIComponent(args.id)}/events`, {
20
+ eventType: 'dismissed',
21
+ projectPath,
22
+ });
23
+ this.log("Dismissed. Won't re-surface for 30 days.");
24
+ }
25
+ }
26
+ //# sourceMappingURL=dismiss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismiss.js","sourceRoot":"","sources":["../../../src/commands/suggestions/dismiss.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,WAAW;IACvD,MAAM,CAAU,WAAW,GAAG,4DAA4D,CAAC;IAE3F,MAAM,CAAU,QAAQ,GAAG;QACvB,4CAA4C;KAC/C,CAAC;IAEF,MAAM,CAAU,IAAI,GAAG;QACnB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KAC9F,CAAC;IAEF,KAAK,CAAC,GAAG;QACL,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QAEvC,MAAM,WAAW,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAExD,MAAM,OAAO,CAAC,gCAAgC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE;YAChF,SAAS,EAAE,WAAW;YACtB,WAAW;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACzD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class SuggestionsList extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/suggestions/list.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAoBpD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACpD,OAAgB,WAAW,SAAgD;IAE3E,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;MAKnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA4B7B"}
@@ -0,0 +1,40 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { printTable } from '@oclif/table';
3
+ import { normalizeProjectPath } from '@rulemetric/core/paths';
4
+ import { BaseCommand } from '../../base-command.js';
5
+ import { apiGet } from '../../lib/api-client.js';
6
+ export default class SuggestionsList extends BaseCommand {
7
+ static description = 'List instruction suggestions for a project';
8
+ static examples = [
9
+ '<%= config.bin %> suggestions list',
10
+ '<%= config.bin %> suggestions list --project /path/to/project',
11
+ ];
12
+ static flags = {
13
+ project: Flags.string({
14
+ char: 'p',
15
+ description: 'Project path (defaults to current directory)',
16
+ }),
17
+ };
18
+ async run() {
19
+ const { flags } = await this.parse(SuggestionsList);
20
+ this.requireAuth();
21
+ const projectPath = normalizeProjectPath(flags.project ?? process.cwd());
22
+ const encoded = encodeURIComponent(projectPath);
23
+ const result = await apiGet(`/api/instruction-suggestions?projectPath=${encoded}&limit=10`);
24
+ if (result.suggestions.length === 0) {
25
+ this.log('No suggestions for this project. The cron runs daily at 04:30; trigger now with: rulemetric suggestions refresh');
26
+ return;
27
+ }
28
+ printTable({
29
+ data: result.suggestions.map((s) => ({
30
+ ID: s.id,
31
+ Scope: s.instructionScope,
32
+ Name: s.name,
33
+ Score: s.score.toFixed(2),
34
+ Reason: s.reason.length > 60 ? s.reason.slice(0, 59) + '…' : s.reason,
35
+ })),
36
+ columns: ['ID', 'Scope', 'Name', 'Score', 'Reason'],
37
+ });
38
+ }
39
+ }
40
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/suggestions/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAmBjD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACpD,MAAM,CAAU,WAAW,GAAG,4CAA4C,CAAC;IAE3E,MAAM,CAAU,QAAQ,GAAG;QACvB,oCAAoC;QACpC,+DAA+D;KAClE,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACpB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,8CAA8C;SAC9D,CAAC;KACL,CAAC;IAEF,KAAK,CAAC,GAAG;QACL,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,MAAM,CACvB,4CAA4C,OAAO,WAAW,CACjE,CAAC;QAEF,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,CACJ,iHAAiH,CACpH,CAAC;YACF,OAAO;QACX,CAAC;QAED,UAAU,CAAC;YACP,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,gBAAgB;gBACzB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;aACxE,CAAC,CAAC;YACH,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;SACtD,CAAC,CAAC;IACP,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class SuggestionsRefresh extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../src/commands/suggestions/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,WAAW;IACvD,OAAgB,WAAW,SAA0D;IAErF,OAAgB,QAAQ,WAEtB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
@@ -0,0 +1,11 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class SuggestionsRefresh extends BaseCommand {
3
+ static description = 'Information about refreshing instruction suggestions';
4
+ static examples = [
5
+ '<%= config.bin %> suggestions refresh',
6
+ ];
7
+ async run() {
8
+ this.log('The suggestion cron runs daily at 04:30. To force a recompute now, restart the worker (`rulemetric service restart`) and the cron will fire on its registered schedule.');
9
+ }
10
+ }
11
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../../src/commands/suggestions/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,WAAW;IACvD,MAAM,CAAU,WAAW,GAAG,sDAAsD,CAAC;IAErF,MAAM,CAAU,QAAQ,GAAG;QACvB,uCAAuC;KAC1C,CAAC;IAEF,KAAK,CAAC,GAAG;QACL,IAAI,CAAC,GAAG,CACJ,yKAAyK,CAC5K,CAAC;IACN,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Dashboard.d.ts","sourceRoot":"","sources":["../../src/dashboard/Dashboard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAA2B,MAAM,YAAY,CAAC;AAsJlE,wBAAsB,eAAe,CAAC,MAAM,GAAE,MAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC5E"}
1
+ {"version":3,"file":"Dashboard.d.ts","sourceRoot":"","sources":["../../src/dashboard/Dashboard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAA2B,MAAM,YAAY,CAAC;AA6JlE,wBAAsB,eAAe,CAAC,MAAM,GAAE,MAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC5E"}
@@ -21,7 +21,7 @@ function PeriodTabs({ active, providerName }) {
21
21
  return (_jsxs(Box, { justifyContent: "space-between", paddingX: 1, children: [_jsx(Box, { gap: 1, children: PERIODS.map(p => (_jsx(Text, { bold: active === p, color: active === p ? ORANGE : DIM, children: active === p ? `[ ${PERIOD_LABELS[p]} ]` : ` ${PERIOD_LABELS[p]} ` }, p))) }), providerName && (_jsx(Text, { color: ORANGE, bold: true, children: providerName }))] }));
22
22
  }
23
23
  function StatusBar({ width, insightsFocused = false }) {
24
- return (_jsx(Box, { borderStyle: "round", borderColor: DIM, width: width, justifyContent: "center", paddingX: 1, children: _jsxs(Text, { children: [_jsx(Text, { color: ORANGE, bold: true, children: '<' }), _jsx(Text, { color: ORANGE, children: '>' }), _jsx(Text, { dimColor: true, children: " switch " }), _jsx(Text, { color: ORANGE, bold: true, children: "q" }), _jsx(Text, { dimColor: true, children: " quit " }), _jsx(Text, { color: ORANGE, bold: true, children: "s" }), _jsxs(Text, { dimColor: true, children: [" ", insightsFocused ? 'back' : 'suggestions', " "] }), _jsx(Text, { color: ORANGE, bold: true, children: "1" }), _jsx(Text, { dimColor: true, children: "-" }), _jsx(Text, { color: ORANGE, bold: true, children: "5" }), _jsx(Text, { dimColor: true, children: " period " }), _jsx(Text, { color: ORANGE, bold: true, children: "r" }), _jsx(Text, { dimColor: true, children: " refresh" })] }) }));
24
+ return (_jsx(Box, { borderStyle: "round", borderColor: DIM, width: width, justifyContent: "center", paddingX: 1, children: _jsxs(Text, { children: [_jsx(Text, { color: ORANGE, bold: true, children: '<' }), _jsx(Text, { color: ORANGE, children: '>' }), _jsx(Text, { dimColor: true, children: " switch " }), _jsx(Text, { color: ORANGE, bold: true, children: "q" }), _jsx(Text, { dimColor: true, children: " quit " }), _jsx(Text, { color: ORANGE, bold: true, children: "s" }), _jsxs(Text, { dimColor: true, children: [" ", insightsFocused ? 'back' : 'suggestions', " "] }), _jsx(Text, { color: ORANGE, bold: true, children: "1" }), _jsx(Text, { dimColor: true, children: "-" }), _jsx(Text, { color: ORANGE, bold: true, children: "5" }), _jsx(Text, { dimColor: true, children: " period " }), _jsx(Text, { color: ORANGE, bold: true, children: "r" }), _jsx(Text, { dimColor: true, children: " refresh " }), _jsx(Text, { color: ORANGE, bold: true, children: "n" }), _jsx(Text, { dimColor: true, children: " new session" })] }) }));
25
25
  }
26
26
  function Row({ wide, width, children }) {
27
27
  if (wide)
@@ -87,6 +87,12 @@ function InteractiveDashboard({ initialLocal, initialApi, initialInstructions, i
87
87
  reload();
88
88
  return;
89
89
  }
90
+ if (input === 'n') {
91
+ import('@rulemetric/session').then(({ getLauncher }) => {
92
+ getLauncher('claude_code').launch({ projectPath: process.cwd(), mode: 'interactive' });
93
+ });
94
+ return;
95
+ }
90
96
  const idx = PERIODS.indexOf(period);
91
97
  if (key.leftArrow)
92
98
  switchPeriod(PERIODS[(idx - 1 + PERIODS.length) % PERIODS.length]);
@@ -1 +1 @@
1
- {"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../src/dashboard/Dashboard.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../src/dashboard/Dashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare function maybeRefreshActiveOrg(): Promise<void>;
2
+ /**
3
+ * Explicit, guard-bypassing version of the refresh. Use ONLY from commands
4
+ * where the user just took an action that changes auth/install state and we
5
+ * want the cache to reflect it before the command exits:
6
+ *
7
+ * - After `auth login`: BaseCommand.init fired the guarded refresh BEFORE
8
+ * credentials existed and got a 401; we need to retry post-login.
9
+ * - After `hooks install` / `service install`: belt-and-suspenders so the
10
+ * first Claude Code session after install has a populated cache, even
11
+ * if BaseCommand's earlier refresh hit a transient error.
12
+ *
13
+ * Marks `attempted = true` after running so a redundant `maybeRefreshActiveOrg`
14
+ * call later in the same process is a no-op.
15
+ */
16
+ export declare function bootstrapActiveOrg(): Promise<void>;
17
+ /**
18
+ * Test hook — reset the once-per-process guard so each test can exercise
19
+ * the refresh logic.
20
+ */
21
+ export declare function _resetRefreshAttempt(): void;
22
+ //# sourceMappingURL=active-org-refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-org-refresh.d.ts","sourceRoot":"","sources":["../../src/lib/active-org-refresh.ts"],"names":[],"mappings":"AAoGA,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}