claude-smart 0.2.30 → 0.2.32

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 (64) hide show
  1. package/README.md +2 -2
  2. package/bin/claude-smart.js +172 -18
  3. package/package.json +1 -1
  4. package/plugin/.claude-plugin/plugin.json +1 -1
  5. package/plugin/.codex-plugin/plugin.json +1 -1
  6. package/plugin/dashboard/app/api/config/route.ts +11 -2
  7. package/plugin/dashboard/app/api/health/route.ts +45 -6
  8. package/plugin/dashboard/app/api/reflexio/[...path]/route.ts +15 -7
  9. package/plugin/dashboard/app/api/rules/applied/route.ts +27 -0
  10. package/plugin/dashboard/app/configure/env/page.tsx +36 -31
  11. package/plugin/dashboard/app/configure/layout.tsx +1 -1
  12. package/plugin/dashboard/app/configure/server/page.tsx +8 -14
  13. package/plugin/dashboard/app/dashboard/page.tsx +311 -115
  14. package/plugin/dashboard/app/globals.css +80 -66
  15. package/plugin/dashboard/app/layout.tsx +13 -10
  16. package/plugin/dashboard/app/preferences/[id]/page.tsx +21 -32
  17. package/plugin/dashboard/app/preferences/page.tsx +154 -54
  18. package/plugin/dashboard/app/preferences/project/[id]/page.tsx +1 -0
  19. package/plugin/dashboard/app/rules/[id]/page.tsx +51 -0
  20. package/plugin/dashboard/app/sessions/[sessionId]/page.tsx +4 -4
  21. package/plugin/dashboard/app/sessions/page.tsx +14 -10
  22. package/plugin/dashboard/app/skills/page.tsx +175 -56
  23. package/plugin/dashboard/app/skills/project/[id]/page.tsx +22 -38
  24. package/plugin/dashboard/app/skills/shared/[id]/page.tsx +20 -37
  25. package/plugin/dashboard/components/common/delete-learning-danger-zone.tsx +166 -0
  26. package/plugin/dashboard/components/common/empty-state.tsx +4 -2
  27. package/plugin/dashboard/components/common/learnings-badge.tsx +1 -1
  28. package/plugin/dashboard/components/common/page-header.tsx +5 -3
  29. package/plugin/dashboard/components/common/page-tabs.tsx +4 -4
  30. package/plugin/dashboard/components/common/stat-card.tsx +9 -5
  31. package/plugin/dashboard/components/layout/sidebar.tsx +24 -9
  32. package/plugin/dashboard/components/layout/top-bar.tsx +37 -25
  33. package/plugin/dashboard/components/ui/input.tsx +1 -0
  34. package/plugin/dashboard/hooks/use-settings.tsx +30 -61
  35. package/plugin/dashboard/hooks/use-stall-state.ts +5 -9
  36. package/plugin/dashboard/lib/config-file.ts +2 -0
  37. package/plugin/dashboard/lib/reflexio-client.ts +23 -48
  38. package/plugin/dashboard/lib/session-reader.ts +222 -6
  39. package/plugin/dashboard/lib/types.ts +20 -1
  40. package/plugin/dashboard/package-lock.json +70 -95
  41. package/plugin/dashboard/package.json +5 -2
  42. package/plugin/hooks/hooks.json +1 -1
  43. package/plugin/pyproject.toml +1 -1
  44. package/plugin/scripts/_lib.sh +126 -0
  45. package/plugin/scripts/backend-service.sh +32 -7
  46. package/plugin/scripts/cli.sh +4 -2
  47. package/plugin/scripts/codex-hook.js +100 -3
  48. package/plugin/scripts/dashboard-service.sh +98 -19
  49. package/plugin/scripts/hook_entry.sh +32 -11
  50. package/plugin/scripts/smart-install.sh +27 -44
  51. package/plugin/src/claude_smart/cli.py +204 -20
  52. package/plugin/src/claude_smart/context_format.py +244 -6
  53. package/plugin/src/claude_smart/context_inject.py +8 -1
  54. package/plugin/src/claude_smart/cs_cite.py +186 -34
  55. package/plugin/src/claude_smart/env_config.py +102 -0
  56. package/plugin/src/claude_smart/events/session_end.py +171 -6
  57. package/plugin/src/claude_smart/events/session_start.py +26 -2
  58. package/plugin/src/claude_smart/events/stop.py +48 -9
  59. package/plugin/src/claude_smart/hook.py +62 -4
  60. package/plugin/src/claude_smart/hook_log.py +301 -0
  61. package/plugin/src/claude_smart/internal_call.py +30 -0
  62. package/plugin/src/claude_smart/publish.py +5 -0
  63. package/plugin/src/claude_smart/reflexio_adapter.py +102 -26
  64. package/plugin/uv.lock +1 -1
@@ -10,6 +10,7 @@ import path from "node:path";
10
10
  import os from "node:os";
11
11
  import type {
12
12
  CitedItem,
13
+ PlaybookApplicationStat,
13
14
  SessionDetail,
14
15
  SessionSummary,
15
16
  SessionTurn,
@@ -50,6 +51,24 @@ type RawRecord = {
50
51
  published_up_to?: number;
51
52
  };
52
53
 
54
+ type RawInjectedEntry = CitedItem & {
55
+ dashboard_url?: string;
56
+ rule_url?: string;
57
+ ts?: number;
58
+ };
59
+
60
+ export interface RuleResolution {
61
+ id: string;
62
+ href: string;
63
+ title: string;
64
+ kind: CitedItem["kind"];
65
+ }
66
+
67
+ interface AppliedRulesOptions {
68
+ daysBack?: number;
69
+ limit?: number;
70
+ }
71
+
53
72
  async function readJsonl(filePath: string): Promise<RawRecord[]> {
54
73
  const text = await fs.readFile(filePath, "utf-8");
55
74
  const out: RawRecord[] = [];
@@ -65,6 +84,195 @@ async function readJsonl(filePath: string): Promise<RawRecord[]> {
65
84
  return out;
66
85
  }
67
86
 
87
+ async function readInjectedJsonl(filePath: string): Promise<RawInjectedEntry[]> {
88
+ const text = await fs.readFile(filePath, "utf-8");
89
+ const out: RawInjectedEntry[] = [];
90
+ for (const line of text.split("\n")) {
91
+ const trimmed = line.trim();
92
+ if (!trimmed) continue;
93
+ try {
94
+ const rec = JSON.parse(trimmed);
95
+ if (
96
+ rec &&
97
+ typeof rec === "object" &&
98
+ typeof rec.id === "string" &&
99
+ rec.id.length > 0
100
+ ) {
101
+ out.push(rec);
102
+ }
103
+ } catch {
104
+ // skip malformed line, matches state.py behaviour
105
+ }
106
+ }
107
+ return out;
108
+ }
109
+
110
+ function hrefForInjectedEntry(entry: RawInjectedEntry): string | null {
111
+ const realId = entry.real_id;
112
+ if (typeof realId === "string" && realId.length > 0) {
113
+ if (entry.kind === "profile") {
114
+ return `/preferences/project/${encodeURIComponent(realId)}`;
115
+ }
116
+ if (entry.kind === "playbook") {
117
+ const scope = entry.source_kind === "agent_playbook" ? "shared" : "project";
118
+ return `/skills/${scope}/${encodeURIComponent(realId)}`;
119
+ }
120
+ }
121
+ if (typeof entry.dashboard_url === "string" && entry.dashboard_url.length > 0) {
122
+ try {
123
+ const parsed = new URL(entry.dashboard_url);
124
+ return `${parsed.pathname}${parsed.search}`;
125
+ } catch {
126
+ if (entry.dashboard_url.startsWith("/")) return entry.dashboard_url;
127
+ }
128
+ }
129
+ return null;
130
+ }
131
+
132
+ function canonicalHrefForCitedItem(item: CitedItem): string | null {
133
+ const realId = item.real_id;
134
+ if (typeof realId !== "string" || realId.length === 0) return null;
135
+ if (item.kind === "profile") {
136
+ return `/preferences/project/${encodeURIComponent(realId)}`;
137
+ }
138
+ const scope = item.source_kind === "agent_playbook" ? "shared" : "project";
139
+ return `/skills/${scope}/${encodeURIComponent(realId)}`;
140
+ }
141
+
142
+ function ruleHrefForCitedItem(item: CitedItem): string | null {
143
+ if (/^[ps]\d+(?:-[A-Za-z0-9]{1,8})?$/.test(item.id)) {
144
+ return `/rules/${encodeURIComponent(item.id)}`;
145
+ }
146
+ return canonicalHrefForCitedItem(item);
147
+ }
148
+
149
+ function statKeyForCitedItem(item: CitedItem): string {
150
+ const realId = item.real_id && item.real_id.length > 0 ? item.real_id : item.id;
151
+ const sourceKind =
152
+ item.kind === "profile" ? "profile" : item.source_kind ?? "user_playbook";
153
+ return `${item.kind}:${sourceKind}:${realId}`;
154
+ }
155
+
156
+ export async function resolveRuleLink(
157
+ citationId: string,
158
+ ): Promise<RuleResolution | null> {
159
+ if (!/^[ps]\d+(?:-[A-Za-z0-9]{1,8})?$/.test(citationId)) return null;
160
+ const dir = stateDir();
161
+ let entries: string[];
162
+ try {
163
+ entries = await fs.readdir(dir);
164
+ } catch {
165
+ return null;
166
+ }
167
+ const files = (
168
+ await Promise.all(
169
+ entries
170
+ .filter((entry) => entry.endsWith(".injected.jsonl"))
171
+ .map(async (entry) => {
172
+ const fullPath = path.join(dir, entry);
173
+ const stat = await fs.stat(fullPath).catch(() => null);
174
+ return stat?.isFile() ? { fullPath, mtimeMs: stat.mtimeMs } : null;
175
+ }),
176
+ )
177
+ )
178
+ .filter((entry): entry is { fullPath: string; mtimeMs: number } => !!entry)
179
+ .sort((a, b) => b.mtimeMs - a.mtimeMs);
180
+
181
+ for (const file of files) {
182
+ const records = await readInjectedJsonl(file.fullPath).catch(() => []);
183
+ for (let i = records.length - 1; i >= 0; i--) {
184
+ const entry = records[i];
185
+ if (entry.id !== citationId) continue;
186
+ const href = hrefForInjectedEntry(entry);
187
+ if (!href) continue;
188
+ return {
189
+ id: entry.id,
190
+ href,
191
+ title: entry.title || entry.id,
192
+ kind: entry.kind,
193
+ };
194
+ }
195
+ }
196
+ return null;
197
+ }
198
+
199
+ export async function listAppliedRules(
200
+ opts: AppliedRulesOptions = {},
201
+ ): Promise<PlaybookApplicationStat[]> {
202
+ const daysBack = opts.daysBack ?? 30;
203
+ const limit = opts.limit ?? 20;
204
+ const cutoff =
205
+ daysBack > 0 ? Math.floor(Date.now() / 1000) - daysBack * 24 * 60 * 60 : null;
206
+ const dir = stateDir();
207
+ let entries: string[];
208
+ try {
209
+ entries = await fs.readdir(dir);
210
+ } catch {
211
+ return [];
212
+ }
213
+
214
+ const stats = new Map<string, PlaybookApplicationStat>();
215
+ for (const entry of entries) {
216
+ if (!entry.endsWith(".jsonl") || entry.endsWith(".injected.jsonl")) continue;
217
+ const fullPath = path.join(dir, entry);
218
+ const records = await readJsonl(fullPath).catch(() => []);
219
+ for (let idx = 0; idx < records.length; idx++) {
220
+ const rec = records[idx];
221
+ if (
222
+ rec.role !== "Assistant" ||
223
+ !rec.cited_items ||
224
+ rec.cited_items.length === 0
225
+ ) {
226
+ continue;
227
+ }
228
+ const ts = typeof rec.ts === "number" ? rec.ts : null;
229
+ if (cutoff !== null && ts !== null && ts < cutoff) continue;
230
+
231
+ for (const item of rec.cited_items) {
232
+ const realId =
233
+ item.real_id && item.real_id.length > 0 ? item.real_id : item.id;
234
+ const key = statKeyForCitedItem(item);
235
+ const prev = stats.get(key);
236
+ const href = canonicalHrefForCitedItem(item) ?? ruleHrefForCitedItem(item);
237
+ if (prev) {
238
+ prev.applied_count += 1;
239
+ if ((ts ?? 0) >= (prev.last_applied_at ?? 0)) {
240
+ prev.citation_id = item.id;
241
+ prev.title = item.title || prev.title;
242
+ prev.href = href ?? prev.href;
243
+ prev.last_applied_at = ts;
244
+ prev.last_interaction_id = idx;
245
+ }
246
+ continue;
247
+ }
248
+ stats.set(key, {
249
+ real_id: realId,
250
+ citation_id: item.id,
251
+ kind: item.kind,
252
+ source_kind:
253
+ item.kind === "profile"
254
+ ? "profile"
255
+ : item.source_kind ?? "user_playbook",
256
+ title: item.title || item.id,
257
+ href: href ?? undefined,
258
+ applied_count: 1,
259
+ last_applied_at: ts,
260
+ last_interaction_id: idx,
261
+ });
262
+ }
263
+ }
264
+ }
265
+
266
+ return Array.from(stats.values())
267
+ .sort((a, b) => {
268
+ if (b.applied_count !== a.applied_count) {
269
+ return b.applied_count - a.applied_count;
270
+ }
271
+ return (b.last_applied_at ?? 0) - (a.last_applied_at ?? 0);
272
+ })
273
+ .slice(0, limit);
274
+ }
275
+
68
276
  function foldTurns(records: RawRecord[]): {
69
277
  turns: SessionTurn[];
70
278
  publishedUpTo: number;
@@ -200,13 +408,21 @@ export async function listSessions(): Promise<SessionSummary[]> {
200
408
  }
201
409
 
202
410
  export async function deleteSession(sessionId: string): Promise<boolean> {
203
- const file = path.join(stateDir(), `${sessionId}.jsonl`);
204
- try {
205
- await fs.unlink(file);
206
- return true;
207
- } catch {
208
- return false;
411
+ const dir = stateDir();
412
+ const files = [
413
+ path.join(dir, `${sessionId}.jsonl`),
414
+ path.join(dir, `${sessionId}.injected.jsonl`),
415
+ ];
416
+ let removedAny = false;
417
+ for (const file of files) {
418
+ try {
419
+ await fs.unlink(file);
420
+ removedAny = true;
421
+ } catch (error) {
422
+ if ((error as NodeJS.ErrnoException).code !== "ENOENT") return false;
423
+ }
209
424
  }
425
+ return removedAny;
210
426
  }
211
427
 
212
428
  export async function deleteAllSessions(): Promise<number> {
@@ -113,12 +113,14 @@ export interface SessionDetail {
113
113
 
114
114
  export interface ClaudeSmartConfig {
115
115
  REFLEXIO_URL: string;
116
+ REFLEXIO_API_KEY: string;
117
+ REFLEXIO_API_KEY_SET?: boolean;
116
118
  CLAUDE_SMART_USE_LOCAL_CLI: boolean;
117
119
  CLAUDE_SMART_USE_LOCAL_EMBEDDING: boolean;
118
120
  CLAUDE_SMART_CLI_PATH: string;
119
121
  CLAUDE_SMART_CLI_TIMEOUT: string;
120
122
  CLAUDE_SMART_STATE_DIR: string;
121
- [extra: string]: string | boolean;
123
+ [extra: string]: string | boolean | undefined;
122
124
  }
123
125
 
124
126
  export interface ClaudeCodeHookConfig {
@@ -143,3 +145,20 @@ export interface ReflexioConfig {
143
145
  user_playbook_extractor_configs?: ReflexioExtractorConfig[] | null;
144
146
  [k: string]: unknown;
145
147
  }
148
+
149
+ /**
150
+ * Per-rule citation counts aggregated from local session cited_items. Timestamps
151
+ * are unix epoch seconds, matching the int-epoch convention used elsewhere in
152
+ * the dashboard.
153
+ */
154
+ export interface PlaybookApplicationStat {
155
+ real_id: string;
156
+ citation_id?: string;
157
+ kind: "playbook" | "profile";
158
+ source_kind?: "user_playbook" | "agent_playbook" | "profile";
159
+ title: string;
160
+ href?: string;
161
+ applied_count: number;
162
+ last_applied_at: number | null;
163
+ last_interaction_id: number | null;
164
+ }
@@ -12,7 +12,7 @@
12
12
  "class-variance-authority": "^0.7.1",
13
13
  "clsx": "^2.1.1",
14
14
  "lucide-react": "^0.577.0",
15
- "next": "16.2.0",
15
+ "next": "16.2.6",
16
16
  "next-themes": "^0.4.6",
17
17
  "react": "19.2.4",
18
18
  "react-dom": "19.2.4",
@@ -25,10 +25,13 @@
25
25
  "@types/react": "^19",
26
26
  "@types/react-dom": "^19",
27
27
  "eslint": "^9",
28
- "eslint-config-next": "16.2.0",
28
+ "eslint-config-next": "16.2.6",
29
29
  "shadcn": "^4.0.8",
30
30
  "tailwindcss": "^4",
31
31
  "typescript": "^5"
32
+ },
33
+ "engines": {
34
+ "node": ">=20.9.0"
32
35
  }
33
36
  },
34
37
  "node_modules/@alloc/quick-lru": {
@@ -1808,15 +1811,15 @@
1808
1811
  }
1809
1812
  },
1810
1813
  "node_modules/@next/env": {
1811
- "version": "16.2.0",
1812
- "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.0.tgz",
1813
- "integrity": "sha512-OZIbODWWAi0epQRCRjNe1VO45LOFBzgiyqmTLzIqWq6u1wrxKnAyz1HH6tgY/Mc81YzIjRPoYsPAEr4QV4l9TA==",
1814
+ "version": "16.2.6",
1815
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz",
1816
+ "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==",
1814
1817
  "license": "MIT"
1815
1818
  },
1816
1819
  "node_modules/@next/eslint-plugin-next": {
1817
- "version": "16.2.0",
1818
- "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.0.tgz",
1819
- "integrity": "sha512-3D3pEMcGKfENC9Pzlkr67GOm+205+5hRdYPZvHuNIy5sr9k0ybSU8g+sxOO/R/RLEh/gWZ3UlY+5LmEyZ1xgXQ==",
1820
+ "version": "16.2.6",
1821
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.6.tgz",
1822
+ "integrity": "sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==",
1820
1823
  "dev": true,
1821
1824
  "license": "MIT",
1822
1825
  "dependencies": {
@@ -1824,9 +1827,9 @@
1824
1827
  }
1825
1828
  },
1826
1829
  "node_modules/@next/swc-darwin-arm64": {
1827
- "version": "16.2.0",
1828
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.0.tgz",
1829
- "integrity": "sha512-/JZsqKzKt01IFoiLLAzlNqys7qk2F3JkcUhj50zuRhKDQkZNOz9E5N6wAQWprXdsvjRP4lTFj+/+36NSv5AwhQ==",
1830
+ "version": "16.2.6",
1831
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz",
1832
+ "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==",
1830
1833
  "cpu": [
1831
1834
  "arm64"
1832
1835
  ],
@@ -1840,9 +1843,9 @@
1840
1843
  }
1841
1844
  },
1842
1845
  "node_modules/@next/swc-darwin-x64": {
1843
- "version": "16.2.0",
1844
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.0.tgz",
1845
- "integrity": "sha512-/hV8erWq4SNlVgglUiW5UmQ5Hwy5EW/AbbXlJCn6zkfKxTy/E/U3V8U1Ocm2YCTUoFgQdoMxRyRMOW5jYy4ygg==",
1846
+ "version": "16.2.6",
1847
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz",
1848
+ "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==",
1846
1849
  "cpu": [
1847
1850
  "x64"
1848
1851
  ],
@@ -1856,9 +1859,9 @@
1856
1859
  }
1857
1860
  },
1858
1861
  "node_modules/@next/swc-linux-arm64-gnu": {
1859
- "version": "16.2.0",
1860
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.0.tgz",
1861
- "integrity": "sha512-GkjL/Q7MWOwqWR9zoxu1TIHzkOI2l2BHCf7FzeQG87zPgs+6WDh+oC9Sw9ARuuL/FUk6JNCgKRkA6rEQYadUaw==",
1862
+ "version": "16.2.6",
1863
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz",
1864
+ "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==",
1862
1865
  "cpu": [
1863
1866
  "arm64"
1864
1867
  ],
@@ -1875,9 +1878,9 @@
1875
1878
  }
1876
1879
  },
1877
1880
  "node_modules/@next/swc-linux-arm64-musl": {
1878
- "version": "16.2.0",
1879
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.0.tgz",
1880
- "integrity": "sha512-1ffhC6KY5qWLg5miMlKJp3dZbXelEfjuXt1qcp5WzSCQy36CV3y+JT7OC1WSFKizGQCDOcQbfkH/IjZP3cdRNA==",
1881
+ "version": "16.2.6",
1882
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz",
1883
+ "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==",
1881
1884
  "cpu": [
1882
1885
  "arm64"
1883
1886
  ],
@@ -1894,9 +1897,9 @@
1894
1897
  }
1895
1898
  },
1896
1899
  "node_modules/@next/swc-linux-x64-gnu": {
1897
- "version": "16.2.0",
1898
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.0.tgz",
1899
- "integrity": "sha512-FmbDcZQ8yJRq93EJSL6xaE0KK/Rslraf8fj1uViGxg7K4CKBCRYSubILJPEhjSgZurpcPQq12QNOJQ0DRJl6Hg==",
1900
+ "version": "16.2.6",
1901
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz",
1902
+ "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==",
1900
1903
  "cpu": [
1901
1904
  "x64"
1902
1905
  ],
@@ -1913,9 +1916,9 @@
1913
1916
  }
1914
1917
  },
1915
1918
  "node_modules/@next/swc-linux-x64-musl": {
1916
- "version": "16.2.0",
1917
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.0.tgz",
1918
- "integrity": "sha512-HzjIHVkmGAwRbh/vzvoBWWEbb8BBZPxBvVbDQDvzHSf3D8RP/4vjw7MNLDXFF9Q1WEzeQyEj2zdxBtVAHu5Oyw==",
1919
+ "version": "16.2.6",
1920
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz",
1921
+ "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==",
1919
1922
  "cpu": [
1920
1923
  "x64"
1921
1924
  ],
@@ -1932,9 +1935,9 @@
1932
1935
  }
1933
1936
  },
1934
1937
  "node_modules/@next/swc-win32-arm64-msvc": {
1935
- "version": "16.2.0",
1936
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.0.tgz",
1937
- "integrity": "sha512-UMiFNQf5H7+1ZsZPxEsA064WEuFbRNq/kEXyepbCnSErp4f5iut75dBA8UeerFIG3vDaQNOfCpevnERPp2V+nA==",
1938
+ "version": "16.2.6",
1939
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz",
1940
+ "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==",
1938
1941
  "cpu": [
1939
1942
  "arm64"
1940
1943
  ],
@@ -1948,9 +1951,9 @@
1948
1951
  }
1949
1952
  },
1950
1953
  "node_modules/@next/swc-win32-x64-msvc": {
1951
- "version": "16.2.0",
1952
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.0.tgz",
1953
- "integrity": "sha512-DRrNJKW+/eimrZgdhVN1uvkN1OI4j6Lpefwr44jKQ0YQzztlmOBUUzHuV5GxOMPK3nmodAYElUVCY8ZXo/IWeA==",
1954
+ "version": "16.2.6",
1955
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz",
1956
+ "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==",
1954
1957
  "cpu": [
1955
1958
  "x64"
1956
1959
  ],
@@ -2420,9 +2423,9 @@
2420
2423
  }
2421
2424
  },
2422
2425
  "node_modules/@ts-morph/common/node_modules/brace-expansion": {
2423
- "version": "5.0.5",
2424
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
2425
- "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
2426
+ "version": "5.0.6",
2427
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
2428
+ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
2426
2429
  "dev": true,
2427
2430
  "license": "MIT",
2428
2431
  "dependencies": {
@@ -2763,9 +2766,9 @@
2763
2766
  }
2764
2767
  },
2765
2768
  "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
2766
- "version": "5.0.5",
2767
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
2768
- "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
2769
+ "version": "5.0.6",
2770
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
2771
+ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
2769
2772
  "dev": true,
2770
2773
  "license": "MIT",
2771
2774
  "dependencies": {
@@ -4678,13 +4681,13 @@
4678
4681
  }
4679
4682
  },
4680
4683
  "node_modules/eslint-config-next": {
4681
- "version": "16.2.0",
4682
- "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.0.tgz",
4683
- "integrity": "sha512-LlVJrWnjIkgQRECjIOELyAtrWFqzn326ARS5ap7swc1YKL4wkry6/gszn6wi5ZDWKxKe7fanxArvhqMoAzbL7w==",
4684
+ "version": "16.2.6",
4685
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.6.tgz",
4686
+ "integrity": "sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==",
4684
4687
  "dev": true,
4685
4688
  "license": "MIT",
4686
4689
  "dependencies": {
4687
- "@next/eslint-plugin-next": "16.2.0",
4690
+ "@next/eslint-plugin-next": "16.2.6",
4688
4691
  "eslint-import-resolver-node": "^0.3.6",
4689
4692
  "eslint-import-resolver-typescript": "^3.5.2",
4690
4693
  "eslint-plugin-import": "^2.32.0",
@@ -5142,13 +5145,13 @@
5142
5145
  }
5143
5146
  },
5144
5147
  "node_modules/express-rate-limit": {
5145
- "version": "8.3.2",
5146
- "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.2.tgz",
5147
- "integrity": "sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==",
5148
+ "version": "8.5.2",
5149
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz",
5150
+ "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==",
5148
5151
  "dev": true,
5149
5152
  "license": "MIT",
5150
5153
  "dependencies": {
5151
- "ip-address": "10.1.0"
5154
+ "ip-address": "^10.2.0"
5152
5155
  },
5153
5156
  "engines": {
5154
5157
  "node": ">= 16"
@@ -5229,9 +5232,9 @@
5229
5232
  }
5230
5233
  },
5231
5234
  "node_modules/fast-uri": {
5232
- "version": "3.1.0",
5233
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
5234
- "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
5235
+ "version": "3.1.2",
5236
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
5237
+ "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
5235
5238
  "dev": true,
5236
5239
  "funding": [
5237
5240
  {
@@ -5842,9 +5845,9 @@
5842
5845
  }
5843
5846
  },
5844
5847
  "node_modules/hono": {
5845
- "version": "4.12.14",
5846
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.14.tgz",
5847
- "integrity": "sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w==",
5848
+ "version": "4.12.21",
5849
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.21.tgz",
5850
+ "integrity": "sha512-uV63apnb0kyPtAUwoWgaGh9HyIFcv8lgmzPZSiTBQAFOFGIzka5EZ1dZocmGnn0XdX0+XTqJ6Tqv7selMuGLRQ==",
5848
5851
  "dev": true,
5849
5852
  "license": "MIT",
5850
5853
  "engines": {
@@ -5973,9 +5976,9 @@
5973
5976
  }
5974
5977
  },
5975
5978
  "node_modules/ip-address": {
5976
- "version": "10.1.0",
5977
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
5978
- "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
5979
+ "version": "10.2.0",
5980
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz",
5981
+ "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==",
5979
5982
  "dev": true,
5980
5983
  "license": "MIT",
5981
5984
  "engines": {
@@ -7449,12 +7452,12 @@
7449
7452
  }
7450
7453
  },
7451
7454
  "node_modules/next": {
7452
- "version": "16.2.0",
7453
- "resolved": "https://registry.npmjs.org/next/-/next-16.2.0.tgz",
7454
- "integrity": "sha512-NLBVrJy1pbV1Yn00L5sU4vFyAHt5XuSjzrNyFnxo6Com0M0KrL6hHM5B99dbqXb2bE9pm4Ow3Zl1xp6HVY9edQ==",
7455
+ "version": "16.2.6",
7456
+ "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz",
7457
+ "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==",
7455
7458
  "license": "MIT",
7456
7459
  "dependencies": {
7457
- "@next/env": "16.2.0",
7460
+ "@next/env": "16.2.6",
7458
7461
  "@swc/helpers": "0.5.15",
7459
7462
  "baseline-browser-mapping": "^2.9.19",
7460
7463
  "caniuse-lite": "^1.0.30001579",
@@ -7468,14 +7471,14 @@
7468
7471
  "node": ">=20.9.0"
7469
7472
  },
7470
7473
  "optionalDependencies": {
7471
- "@next/swc-darwin-arm64": "16.2.0",
7472
- "@next/swc-darwin-x64": "16.2.0",
7473
- "@next/swc-linux-arm64-gnu": "16.2.0",
7474
- "@next/swc-linux-arm64-musl": "16.2.0",
7475
- "@next/swc-linux-x64-gnu": "16.2.0",
7476
- "@next/swc-linux-x64-musl": "16.2.0",
7477
- "@next/swc-win32-arm64-msvc": "16.2.0",
7478
- "@next/swc-win32-x64-msvc": "16.2.0",
7474
+ "@next/swc-darwin-arm64": "16.2.6",
7475
+ "@next/swc-darwin-x64": "16.2.6",
7476
+ "@next/swc-linux-arm64-gnu": "16.2.6",
7477
+ "@next/swc-linux-arm64-musl": "16.2.6",
7478
+ "@next/swc-linux-x64-gnu": "16.2.6",
7479
+ "@next/swc-linux-x64-musl": "16.2.6",
7480
+ "@next/swc-win32-arm64-msvc": "16.2.6",
7481
+ "@next/swc-win32-x64-msvc": "16.2.6",
7479
7482
  "sharp": "^0.34.5"
7480
7483
  },
7481
7484
  "peerDependencies": {
@@ -7511,34 +7514,6 @@
7511
7514
  "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
7512
7515
  }
7513
7516
  },
7514
- "node_modules/next/node_modules/postcss": {
7515
- "version": "8.4.31",
7516
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
7517
- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
7518
- "funding": [
7519
- {
7520
- "type": "opencollective",
7521
- "url": "https://opencollective.com/postcss/"
7522
- },
7523
- {
7524
- "type": "tidelift",
7525
- "url": "https://tidelift.com/funding/github/npm/postcss"
7526
- },
7527
- {
7528
- "type": "github",
7529
- "url": "https://github.com/sponsors/ai"
7530
- }
7531
- ],
7532
- "license": "MIT",
7533
- "dependencies": {
7534
- "nanoid": "^3.3.6",
7535
- "picocolors": "^1.0.0",
7536
- "source-map-js": "^1.0.2"
7537
- },
7538
- "engines": {
7539
- "node": "^10 || ^12 || >=14"
7540
- }
7541
- },
7542
7517
  "node_modules/node-domexception": {
7543
7518
  "version": "1.0.0",
7544
7519
  "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
@@ -13,7 +13,7 @@
13
13
  "class-variance-authority": "^0.7.1",
14
14
  "clsx": "^2.1.1",
15
15
  "lucide-react": "^0.577.0",
16
- "next": "16.2.0",
16
+ "next": "16.2.6",
17
17
  "next-themes": "^0.4.6",
18
18
  "react": "19.2.4",
19
19
  "react-dom": "19.2.4",
@@ -26,11 +26,14 @@
26
26
  "@types/react": "^19",
27
27
  "@types/react-dom": "^19",
28
28
  "eslint": "^9",
29
- "eslint-config-next": "16.2.0",
29
+ "eslint-config-next": "16.2.6",
30
30
  "shadcn": "^4.0.8",
31
31
  "tailwindcss": "^4",
32
32
  "typescript": "^5"
33
33
  },
34
+ "overrides": {
35
+ "postcss": "8.5.10"
36
+ },
34
37
  "engines": {
35
38
  "node": ">=20.9.0"
36
39
  }
@@ -102,7 +102,7 @@
102
102
  {
103
103
  "type": "command",
104
104
  "command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/reflexioai/plugin\"; bash \"$_R/scripts/hook_entry.sh\" claude-code session-end",
105
- "timeout": 60
105
+ "timeout": 300
106
106
  },
107
107
  {
108
108
  "type": "command",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "claude-smart"
3
- version = "0.2.30"
3
+ version = "0.2.32"
4
4
  description = "Self-improving Claude Code plugin — learns from corrections via reflexio"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"