specweave 1.0.259 → 1.0.260

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 (63) hide show
  1. package/CLAUDE.md +39 -25
  2. package/bin/specweave.js +11 -0
  3. package/dist/dashboard/assets/index-DdtF4K1G.css +1 -0
  4. package/dist/dashboard/assets/index-cZA6rz8s.js +11 -0
  5. package/dist/dashboard/index.html +14 -0
  6. package/dist/src/cli/commands/dashboard.d.ts +18 -0
  7. package/dist/src/cli/commands/dashboard.d.ts.map +1 -0
  8. package/dist/src/cli/commands/dashboard.js +142 -0
  9. package/dist/src/cli/commands/dashboard.js.map +1 -0
  10. package/dist/src/core/lazy-loading/llm-plugin-detector.d.ts +9 -4
  11. package/dist/src/core/lazy-loading/llm-plugin-detector.d.ts.map +1 -1
  12. package/dist/src/core/lazy-loading/llm-plugin-detector.js +9 -4
  13. package/dist/src/core/lazy-loading/llm-plugin-detector.js.map +1 -1
  14. package/dist/src/dashboard/server/command-runner.d.ts +21 -0
  15. package/dist/src/dashboard/server/command-runner.d.ts.map +1 -0
  16. package/dist/src/dashboard/server/command-runner.js +92 -0
  17. package/dist/src/dashboard/server/command-runner.js.map +1 -0
  18. package/dist/src/dashboard/server/dashboard-server.d.ts +33 -0
  19. package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -0
  20. package/dist/src/dashboard/server/dashboard-server.js +812 -0
  21. package/dist/src/dashboard/server/dashboard-server.js.map +1 -0
  22. package/dist/src/dashboard/server/data/activity-stream.d.ts +27 -0
  23. package/dist/src/dashboard/server/data/activity-stream.d.ts.map +1 -0
  24. package/dist/src/dashboard/server/data/activity-stream.js +142 -0
  25. package/dist/src/dashboard/server/data/activity-stream.js.map +1 -0
  26. package/dist/src/dashboard/server/data/claude-log-parser.d.ts +34 -0
  27. package/dist/src/dashboard/server/data/claude-log-parser.d.ts.map +1 -0
  28. package/dist/src/dashboard/server/data/claude-log-parser.js +218 -0
  29. package/dist/src/dashboard/server/data/claude-log-parser.js.map +1 -0
  30. package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts +35 -0
  31. package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts.map +1 -0
  32. package/dist/src/dashboard/server/data/dashboard-data-aggregator.js +219 -0
  33. package/dist/src/dashboard/server/data/dashboard-data-aggregator.js.map +1 -0
  34. package/dist/src/dashboard/server/data/plugin-scanner.d.ts +35 -0
  35. package/dist/src/dashboard/server/data/plugin-scanner.d.ts.map +1 -0
  36. package/dist/src/dashboard/server/data/plugin-scanner.js +96 -0
  37. package/dist/src/dashboard/server/data/plugin-scanner.js.map +1 -0
  38. package/dist/src/dashboard/server/data/sync-audit-reader.d.ts +38 -0
  39. package/dist/src/dashboard/server/data/sync-audit-reader.d.ts.map +1 -0
  40. package/dist/src/dashboard/server/data/sync-audit-reader.js +94 -0
  41. package/dist/src/dashboard/server/data/sync-audit-reader.js.map +1 -0
  42. package/dist/src/dashboard/server/file-watcher.d.ts +19 -0
  43. package/dist/src/dashboard/server/file-watcher.d.ts.map +1 -0
  44. package/dist/src/dashboard/server/file-watcher.js +104 -0
  45. package/dist/src/dashboard/server/file-watcher.js.map +1 -0
  46. package/dist/src/dashboard/server/router.d.ts +16 -0
  47. package/dist/src/dashboard/server/router.d.ts.map +1 -0
  48. package/dist/src/dashboard/server/router.js +110 -0
  49. package/dist/src/dashboard/server/router.js.map +1 -0
  50. package/dist/src/dashboard/server/sse-manager.d.ts +25 -0
  51. package/dist/src/dashboard/server/sse-manager.d.ts.map +1 -0
  52. package/dist/src/dashboard/server/sse-manager.js +75 -0
  53. package/dist/src/dashboard/server/sse-manager.js.map +1 -0
  54. package/dist/src/dashboard/types.d.ts +183 -0
  55. package/dist/src/dashboard/types.d.ts.map +1 -0
  56. package/dist/src/dashboard/types.js +2 -0
  57. package/dist/src/dashboard/types.js.map +1 -0
  58. package/package.json +12 -2
  59. package/plugins/specweave/hooks/user-prompt-submit.sh +79 -154
  60. package/plugins/specweave/skills/do/SKILL.md +31 -1
  61. package/plugins/specweave/skills/increment/SKILL.md +1 -1
  62. package/plugins/specweave/skills/increment-planner/SKILL.md +26 -0
  63. package/plugins/specweave/skills/increment-work-router/SKILL.md +37 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../../../src/dashboard/server/file-watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import * as http from 'http';
2
+ import type { RouteHandler } from '../types.js';
3
+ export declare class Router {
4
+ private routes;
5
+ get(path: string, handler: RouteHandler): void;
6
+ post(path: string, handler: RouteHandler): void;
7
+ put(path: string, handler: RouteHandler): void;
8
+ delete(path: string, handler: RouteHandler): void;
9
+ private addRoute;
10
+ handle(req: http.IncomingMessage, res: http.ServerResponse): Promise<boolean>;
11
+ }
12
+ /** Helper: send JSON response. Restricts CORS to localhost origins only. */
13
+ export declare function sendJson(res: http.ServerResponse, data: unknown, status?: number, req?: http.IncomingMessage): void;
14
+ /** Helper: read JSON body from request (1MB limit, 10s timeout) */
15
+ export declare function readBody(req: http.IncomingMessage): Promise<unknown>;
16
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/server/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAe;IAE7B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAI9C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAI/C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAI9C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAIjD,OAAO,CAAC,QAAQ;IAcV,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;CA8BpF;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,SAAM,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAWhH;AAED,mEAAmE;AACnE,wBAAsB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAiC1E"}
@@ -0,0 +1,110 @@
1
+ export class Router {
2
+ constructor() {
3
+ this.routes = [];
4
+ }
5
+ get(path, handler) {
6
+ this.addRoute('GET', path, handler);
7
+ }
8
+ post(path, handler) {
9
+ this.addRoute('POST', path, handler);
10
+ }
11
+ put(path, handler) {
12
+ this.addRoute('PUT', path, handler);
13
+ }
14
+ delete(path, handler) {
15
+ this.addRoute('DELETE', path, handler);
16
+ }
17
+ addRoute(method, path, handler) {
18
+ const paramNames = [];
19
+ const pattern = path.replace(/:([^/]+)/g, (_, name) => {
20
+ paramNames.push(name);
21
+ return '([^/]+)';
22
+ });
23
+ this.routes.push({
24
+ method,
25
+ pattern: new RegExp(`^${pattern}$`),
26
+ paramNames,
27
+ handler,
28
+ });
29
+ }
30
+ async handle(req, res) {
31
+ const method = req.method || 'GET';
32
+ const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
33
+ const pathname = url.pathname;
34
+ for (const route of this.routes) {
35
+ if (route.method !== method)
36
+ continue;
37
+ const match = pathname.match(route.pattern);
38
+ if (!match)
39
+ continue;
40
+ const params = {};
41
+ route.paramNames.forEach((name, i) => {
42
+ params[name] = decodeURIComponent(match[i + 1]);
43
+ });
44
+ try {
45
+ await route.handler(req, res, params);
46
+ }
47
+ catch (err) {
48
+ if (!res.headersSent) {
49
+ // Sanitize: don't leak internal paths or stack traces
50
+ const message = err instanceof Error ? err.message : 'Internal server error';
51
+ const sanitized = message.replace(/\/[^\s:]+/g, '<path>');
52
+ res.writeHead(500, { 'Content-Type': 'application/json' });
53
+ res.end(JSON.stringify({ ok: false, error: sanitized }));
54
+ }
55
+ }
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+ }
61
+ /** Helper: send JSON response. Restricts CORS to localhost origins only. */
62
+ export function sendJson(res, data, status = 200, req) {
63
+ const headers = {
64
+ 'Content-Type': 'application/json',
65
+ 'Vary': 'Origin',
66
+ };
67
+ const origin = req?.headers?.origin;
68
+ if (origin && /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin)) {
69
+ headers['Access-Control-Allow-Origin'] = origin;
70
+ }
71
+ res.writeHead(status, headers);
72
+ res.end(JSON.stringify(data));
73
+ }
74
+ /** Helper: read JSON body from request (1MB limit, 10s timeout) */
75
+ export async function readBody(req) {
76
+ const MAX_BODY_SIZE = 1024 * 1024; // 1MB
77
+ const TIMEOUT_MS = 10000;
78
+ return new Promise((resolve, reject) => {
79
+ const chunks = [];
80
+ let size = 0;
81
+ const timer = setTimeout(() => {
82
+ req.destroy();
83
+ reject(new Error('Request body timeout'));
84
+ }, TIMEOUT_MS);
85
+ req.on('data', (chunk) => {
86
+ size += chunk.length;
87
+ if (size > MAX_BODY_SIZE) {
88
+ clearTimeout(timer);
89
+ req.destroy();
90
+ reject(new Error('Request body too large'));
91
+ return;
92
+ }
93
+ chunks.push(chunk);
94
+ });
95
+ req.on('end', () => {
96
+ clearTimeout(timer);
97
+ try {
98
+ resolve(JSON.parse(Buffer.concat(chunks).toString()));
99
+ }
100
+ catch {
101
+ reject(new Error('Invalid JSON body'));
102
+ }
103
+ });
104
+ req.on('error', (err) => {
105
+ clearTimeout(timer);
106
+ reject(err);
107
+ });
108
+ });
109
+ }
110
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/dashboard/server/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import * as http from 'http';
2
+ import type { SSEEventType } from '../types.js';
3
+ export declare class SSEManager {
4
+ private heartbeatMs;
5
+ private connections;
6
+ private heartbeatInterval;
7
+ constructor(heartbeatMs?: number);
8
+ /** Add a new SSE connection */
9
+ addConnection(res: http.ServerResponse): void;
10
+ /** Broadcast event to all connected clients */
11
+ broadcast(type: SSEEventType, data: unknown): void;
12
+ /** Send event to a single connection */
13
+ private send;
14
+ /** Format SSE message */
15
+ private formatMessage;
16
+ /** Start heartbeat timer */
17
+ private startHeartbeat;
18
+ /** Stop heartbeat timer */
19
+ private stopHeartbeat;
20
+ /** Get number of active connections */
21
+ get connectionCount(): number;
22
+ /** Close all connections and stop heartbeat */
23
+ closeAll(): void;
24
+ }
25
+ //# sourceMappingURL=sse-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-manager.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/server/sse-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,qBAAa,UAAU;IAIT,OAAO,CAAC,WAAW;IAH/B,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,iBAAiB,CAA+C;gBAEpD,WAAW,SAAS;IAExC,+BAA+B;IAC/B,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI;IAoB7C,+CAA+C;IAC/C,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IASlD,wCAAwC;IACxC,OAAO,CAAC,IAAI;IAMZ,yBAAyB;IACzB,OAAO,CAAC,aAAa;IAIrB,4BAA4B;IAC5B,OAAO,CAAC,cAAc;IAUtB,2BAA2B;IAC3B,OAAO,CAAC,aAAa;IAOrB,uCAAuC;IACvC,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,+CAA+C;IAC/C,QAAQ,IAAI,IAAI;CASjB"}
@@ -0,0 +1,75 @@
1
+ export class SSEManager {
2
+ constructor(heartbeatMs = 30000) {
3
+ this.heartbeatMs = heartbeatMs;
4
+ this.connections = new Set();
5
+ this.heartbeatInterval = null;
6
+ }
7
+ /** Add a new SSE connection */
8
+ addConnection(res) {
9
+ res.writeHead(200, {
10
+ 'Content-Type': 'text/event-stream',
11
+ 'Cache-Control': 'no-cache',
12
+ 'Connection': 'keep-alive',
13
+ 'Access-Control-Allow-Origin': '*',
14
+ });
15
+ // Send initial connected event
16
+ this.send(res, 'heartbeat', { timestamp: new Date().toISOString(), connected: true });
17
+ this.connections.add(res);
18
+ res.on('close', () => this.connections.delete(res));
19
+ // Start heartbeat if this is the first connection
20
+ if (!this.heartbeatInterval && this.connections.size === 1) {
21
+ this.startHeartbeat();
22
+ }
23
+ }
24
+ /** Broadcast event to all connected clients */
25
+ broadcast(type, data) {
26
+ const message = this.formatMessage(type, data);
27
+ for (const conn of this.connections) {
28
+ if (!conn.destroyed) {
29
+ conn.write(message);
30
+ }
31
+ }
32
+ }
33
+ /** Send event to a single connection */
34
+ send(res, type, data) {
35
+ if (!res.destroyed) {
36
+ res.write(this.formatMessage(type, data));
37
+ }
38
+ }
39
+ /** Format SSE message */
40
+ formatMessage(type, data) {
41
+ return `event: ${type}\ndata: ${JSON.stringify(data)}\n\n`;
42
+ }
43
+ /** Start heartbeat timer */
44
+ startHeartbeat() {
45
+ this.heartbeatInterval = setInterval(() => {
46
+ if (this.connections.size === 0) {
47
+ this.stopHeartbeat();
48
+ return;
49
+ }
50
+ this.broadcast('heartbeat', { timestamp: new Date().toISOString() });
51
+ }, this.heartbeatMs);
52
+ }
53
+ /** Stop heartbeat timer */
54
+ stopHeartbeat() {
55
+ if (this.heartbeatInterval) {
56
+ clearInterval(this.heartbeatInterval);
57
+ this.heartbeatInterval = null;
58
+ }
59
+ }
60
+ /** Get number of active connections */
61
+ get connectionCount() {
62
+ return this.connections.size;
63
+ }
64
+ /** Close all connections and stop heartbeat */
65
+ closeAll() {
66
+ this.stopHeartbeat();
67
+ for (const conn of this.connections) {
68
+ if (!conn.destroyed) {
69
+ conn.end();
70
+ }
71
+ }
72
+ this.connections.clear();
73
+ }
74
+ }
75
+ //# sourceMappingURL=sse-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-manager.js","sourceRoot":"","sources":["../../../../src/dashboard/server/sse-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ export type SSEEventType = 'heartbeat' | 'increment-update' | 'analytics-event' | 'cost-update' | 'notification' | 'sync-update' | 'sync-audit' | 'error-detected' | 'config-changed' | 'activity' | 'command-output' | 'command-complete' | 'job-progress';
2
+ export interface SSEMessage {
3
+ type: SSEEventType;
4
+ data: unknown;
5
+ timestamp: string;
6
+ }
7
+ export interface OverviewPayload {
8
+ project: {
9
+ name?: string;
10
+ totalIncrements: number;
11
+ activeIncrements: number;
12
+ completedIncrements: number;
13
+ statusBreakdown: Record<string, number>;
14
+ typeBreakdown: Record<string, number>;
15
+ priorityBreakdown: Record<string, number>;
16
+ };
17
+ analytics: {
18
+ totalEvents: number;
19
+ successRate: number;
20
+ last24hEvents: number;
21
+ };
22
+ costs: {
23
+ totalCost: number;
24
+ totalSavings: number;
25
+ totalTokens: number;
26
+ sessionCount: number;
27
+ };
28
+ notifications: {
29
+ pendingCount: number;
30
+ criticalCount: number;
31
+ };
32
+ sync: {
33
+ platforms: Record<string, {
34
+ lastImport: string;
35
+ lastSyncResult: string;
36
+ }>;
37
+ };
38
+ generatedAt: string;
39
+ }
40
+ export interface IncrementSummary {
41
+ id: string;
42
+ title: string;
43
+ status: string;
44
+ type: string;
45
+ priority: string;
46
+ project?: string;
47
+ tasks: {
48
+ total: number;
49
+ completed: number;
50
+ };
51
+ acs: {
52
+ total: number;
53
+ completed: number;
54
+ };
55
+ createdAt: string;
56
+ lastActivity: string;
57
+ }
58
+ export interface IncrementListPayload {
59
+ increments: IncrementSummary[];
60
+ summary: Record<string, number>;
61
+ }
62
+ export interface IncrementDetailPayload {
63
+ id: string;
64
+ metadata: Record<string, unknown>;
65
+ tasks: Array<{
66
+ id: string;
67
+ title: string;
68
+ status: string;
69
+ userStory?: string;
70
+ satisfiesACs?: string[];
71
+ }>;
72
+ taskSummary: {
73
+ total: number;
74
+ completed: number;
75
+ pending: number;
76
+ inProgress: number;
77
+ };
78
+ costs?: {
79
+ totalCost: number;
80
+ totalTokens: number;
81
+ sessionCount: number;
82
+ };
83
+ }
84
+ export interface SyncStatusPayload {
85
+ platforms: Record<string, {
86
+ lastImport: string;
87
+ lastImportCount?: number;
88
+ lastSkippedCount?: number;
89
+ lastSyncResult?: string;
90
+ }>;
91
+ lastUpdated?: string;
92
+ }
93
+ export interface ActivityEvent {
94
+ timestamp: string;
95
+ category: 'command' | 'sync' | 'hook' | 'error' | 'cost' | 'notification';
96
+ severity: 'info' | 'warning' | 'error';
97
+ title: string;
98
+ detail?: string;
99
+ source: string;
100
+ metadata?: Record<string, unknown>;
101
+ }
102
+ export interface CommandExecution {
103
+ id: string;
104
+ command: string;
105
+ args: string[];
106
+ status: 'running' | 'completed' | 'failed';
107
+ startedAt: string;
108
+ output: string[];
109
+ exitCode?: number;
110
+ }
111
+ export interface SessionSummary {
112
+ sessionId: string;
113
+ startTime: string;
114
+ endTime?: string;
115
+ messageCount: number;
116
+ toolCallCount: number;
117
+ errors: SessionError[];
118
+ version: string;
119
+ gitBranch: string;
120
+ }
121
+ export interface SessionError {
122
+ timestamp: string;
123
+ sessionId: string;
124
+ type: 'prompt_too_long' | 'api_error' | 'tool_failure' | 'hook_error' | 'rate_limit' | 'unknown';
125
+ message: string;
126
+ context?: {
127
+ lastToolCall?: string;
128
+ messageIndex?: number;
129
+ };
130
+ }
131
+ export interface PluginInfo {
132
+ name: string;
133
+ version: string;
134
+ skillCount: number;
135
+ commandCount: number;
136
+ }
137
+ export interface SkillUsage {
138
+ name: string;
139
+ plugin: string;
140
+ count: number;
141
+ successCount: number;
142
+ failureCount: number;
143
+ avgDuration?: number;
144
+ lastUsed: string;
145
+ }
146
+ export interface LspStatus {
147
+ checked: string;
148
+ status: string;
149
+ missing: Array<{
150
+ language: string;
151
+ type: string;
152
+ binaryInstall: string;
153
+ pluginInstall: string;
154
+ plugin: string;
155
+ message: string;
156
+ }>;
157
+ stats: {
158
+ totalLanguages: number;
159
+ checkedLanguages: number;
160
+ binaryMissing: number;
161
+ pluginMissing: number;
162
+ };
163
+ }
164
+ export type ConfigPayload = Record<string, unknown>;
165
+ export interface ProjectInfo {
166
+ id: string;
167
+ path: string;
168
+ name: string;
169
+ hasSpecweave: boolean;
170
+ }
171
+ export interface DashboardLockFile {
172
+ port: number;
173
+ pid: number;
174
+ startedAt: string;
175
+ projects: string[];
176
+ }
177
+ export interface ApiResponse<T> {
178
+ ok: boolean;
179
+ data?: T;
180
+ error?: string;
181
+ }
182
+ export type RouteHandler = (req: import('http').IncomingMessage, res: import('http').ServerResponse, params: Record<string, string>) => Promise<void>;
183
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/dashboard/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/dashboard/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specweave",
3
- "version": "1.0.259",
3
+ "version": "1.0.260",
4
4
  "description": "Spec-driven development framework for AI coding agents. First-class support for Claude Code — compatible with any LLM-powered coding tool. Living documentation, autonomous execution, quality gates, and multilingual support (9 languages).",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -10,7 +10,8 @@
10
10
  "scripts": {
11
11
  "preinstall": "node scripts/check-node-version.js || exit 0",
12
12
  "clean": "rm -rf dist/",
13
- "build": "tsc && npm run copy:locales && npm run copy:plugins && npm run copy:hook-deps && npm run copy:adapters",
13
+ "build": "tsc && npm run build:dashboard && npm run copy:locales && npm run copy:plugins && npm run copy:hook-deps && npm run copy:adapters",
14
+ "build:dashboard": "npx vite build --config src/dashboard/client/vite.config.ts",
14
15
  "copy:adapters": "node scripts/build/copy-adapters.js",
15
16
  "rebuild": "npm run clean && npm run build",
16
17
  "copy:locales": "node scripts/build/copy-locales.js",
@@ -109,16 +110,25 @@
109
110
  },
110
111
  "devDependencies": {
111
112
  "@mermaid-js/mermaid-cli": "^11.12.0",
113
+ "@tailwindcss/vite": "^4.1.18",
112
114
  "@types/js-yaml": "^4.0.9",
113
115
  "@types/node": "^25.0.3",
114
116
  "@types/open": "^6.1.0",
117
+ "@types/react": "^19.2.14",
118
+ "@types/react-dom": "^19.2.3",
119
+ "@vitejs/plugin-react": "^5.1.4",
115
120
  "@vitest/coverage-v8": "^4.0.17",
116
121
  "@vitest/ui": "^4.0.17",
117
122
  "ajv": "^8.17.1",
118
123
  "ajv-formats": "^3.0.1",
119
124
  "dotenv": "^17.2.3",
120
125
  "memfs": "^4.51.0",
126
+ "react": "^19.2.4",
127
+ "react-dom": "^19.2.4",
128
+ "react-router-dom": "^7.13.0",
129
+ "tailwindcss": "^4.1.18",
121
130
  "typescript": "^5.3.0",
131
+ "vite": "^7.3.1",
122
132
  "vitest": "^4.0.17"
123
133
  }
124
134
  }