claudito 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +500 -0
  3. package/dist/agents/agent-manager.d.ts +150 -0
  4. package/dist/agents/agent-manager.d.ts.map +1 -0
  5. package/dist/agents/agent-manager.js +560 -0
  6. package/dist/agents/agent-manager.js.map +1 -0
  7. package/dist/agents/claude-agent.d.ts +138 -0
  8. package/dist/agents/claude-agent.d.ts.map +1 -0
  9. package/dist/agents/claude-agent.js +608 -0
  10. package/dist/agents/claude-agent.js.map +1 -0
  11. package/dist/agents/index.d.ts +3 -0
  12. package/dist/agents/index.d.ts.map +1 -0
  13. package/dist/agents/index.js +21 -0
  14. package/dist/agents/index.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +115 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config/index.d.ts +18 -0
  20. package/dist/config/index.d.ts.map +1 -0
  21. package/dist/config/index.js +47 -0
  22. package/dist/config/index.js.map +1 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +35 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/repositories/conversation.d.ts +67 -0
  28. package/dist/repositories/conversation.d.ts.map +1 -0
  29. package/dist/repositories/conversation.js +233 -0
  30. package/dist/repositories/conversation.js.map +1 -0
  31. package/dist/repositories/index.d.ts +4 -0
  32. package/dist/repositories/index.d.ts.map +1 -0
  33. package/dist/repositories/index.js +20 -0
  34. package/dist/repositories/index.js.map +1 -0
  35. package/dist/repositories/project.d.ts +92 -0
  36. package/dist/repositories/project.d.ts.map +1 -0
  37. package/dist/repositories/project.js +279 -0
  38. package/dist/repositories/project.js.map +1 -0
  39. package/dist/repositories/settings.d.ts +44 -0
  40. package/dist/repositories/settings.d.ts.map +1 -0
  41. package/dist/repositories/settings.js +116 -0
  42. package/dist/repositories/settings.js.map +1 -0
  43. package/dist/routes/filesystem.d.ts +33 -0
  44. package/dist/routes/filesystem.d.ts.map +1 -0
  45. package/dist/routes/filesystem.js +211 -0
  46. package/dist/routes/filesystem.js.map +1 -0
  47. package/dist/routes/index.d.ts +11 -0
  48. package/dist/routes/index.d.ts.map +1 -0
  49. package/dist/routes/index.js +101 -0
  50. package/dist/routes/index.js.map +1 -0
  51. package/dist/routes/projects.d.ts +48 -0
  52. package/dist/routes/projects.d.ts.map +1 -0
  53. package/dist/routes/projects.js +578 -0
  54. package/dist/routes/projects.js.map +1 -0
  55. package/dist/routes/settings.d.ts +10 -0
  56. package/dist/routes/settings.d.ts.map +1 -0
  57. package/dist/routes/settings.js +30 -0
  58. package/dist/routes/settings.js.map +1 -0
  59. package/dist/server/index.d.ts +25 -0
  60. package/dist/server/index.d.ts.map +1 -0
  61. package/dist/server/index.js +104 -0
  62. package/dist/server/index.js.map +1 -0
  63. package/dist/services/index.d.ts +5 -0
  64. package/dist/services/index.d.ts.map +1 -0
  65. package/dist/services/index.js +21 -0
  66. package/dist/services/index.js.map +1 -0
  67. package/dist/services/instruction-generator.d.ts +47 -0
  68. package/dist/services/instruction-generator.d.ts.map +1 -0
  69. package/dist/services/instruction-generator.js +147 -0
  70. package/dist/services/instruction-generator.js.map +1 -0
  71. package/dist/services/project.d.ts +38 -0
  72. package/dist/services/project.d.ts.map +1 -0
  73. package/dist/services/project.js +80 -0
  74. package/dist/services/project.js.map +1 -0
  75. package/dist/services/roadmap-generator.d.ts +63 -0
  76. package/dist/services/roadmap-generator.d.ts.map +1 -0
  77. package/dist/services/roadmap-generator.js +290 -0
  78. package/dist/services/roadmap-generator.js.map +1 -0
  79. package/dist/services/roadmap.d.ts +72 -0
  80. package/dist/services/roadmap.d.ts.map +1 -0
  81. package/dist/services/roadmap.js +234 -0
  82. package/dist/services/roadmap.js.map +1 -0
  83. package/dist/utils/errors.d.ts +24 -0
  84. package/dist/utils/errors.d.ts.map +1 -0
  85. package/dist/utils/errors.js +80 -0
  86. package/dist/utils/errors.js.map +1 -0
  87. package/dist/utils/index.d.ts +6 -0
  88. package/dist/utils/index.d.ts.map +1 -0
  89. package/dist/utils/index.js +22 -0
  90. package/dist/utils/index.js.map +1 -0
  91. package/dist/utils/logger.d.ts +49 -0
  92. package/dist/utils/logger.d.ts.map +1 -0
  93. package/dist/utils/logger.js +172 -0
  94. package/dist/utils/logger.js.map +1 -0
  95. package/dist/utils/paths.d.ts +2 -0
  96. package/dist/utils/paths.d.ts.map +1 -0
  97. package/dist/utils/paths.js +19 -0
  98. package/dist/utils/paths.js.map +1 -0
  99. package/dist/utils/pid-tracker.d.ts +39 -0
  100. package/dist/utils/pid-tracker.d.ts.map +1 -0
  101. package/dist/utils/pid-tracker.js +171 -0
  102. package/dist/utils/pid-tracker.js.map +1 -0
  103. package/dist/utils/retry.d.ts +10 -0
  104. package/dist/utils/retry.d.ts.map +1 -0
  105. package/dist/utils/retry.js +65 -0
  106. package/dist/utils/retry.js.map +1 -0
  107. package/dist/websocket/index.d.ts +2 -0
  108. package/dist/websocket/index.d.ts.map +1 -0
  109. package/dist/websocket/index.js +18 -0
  110. package/dist/websocket/index.js.map +1 -0
  111. package/dist/websocket/websocket-server.d.ts +42 -0
  112. package/dist/websocket/websocket-server.d.ts.map +1 -0
  113. package/dist/websocket/websocket-server.js +140 -0
  114. package/dist/websocket/websocket-server.js.map +1 -0
  115. package/package.json +77 -0
  116. package/public/css/styles.css +1860 -0
  117. package/public/index.html +1004 -0
  118. package/public/js/app.js +5346 -0
  119. package/public/vendor/highlight-github-dark.min.css +10 -0
  120. package/public/vendor/highlight.min.js +1213 -0
  121. package/public/vendor/jquery.min.js +2 -0
  122. package/public/vendor/marked.min.js +69 -0
  123. package/public/vendor/tailwind.js +65 -0
@@ -0,0 +1,92 @@
1
+ export interface MilestoneItemRef {
2
+ phaseId: string;
3
+ milestoneId: string;
4
+ itemIndex: number;
5
+ taskTitle: string;
6
+ }
7
+ export interface ContextUsageData {
8
+ inputTokens: number;
9
+ outputTokens: number;
10
+ totalTokens: number;
11
+ cacheCreationInputTokens: number;
12
+ cacheReadInputTokens: number;
13
+ maxContextTokens: number;
14
+ percentUsed: number;
15
+ }
16
+ export interface ProjectStatus {
17
+ id: string;
18
+ name: string;
19
+ path: string;
20
+ status: 'stopped' | 'running' | 'error' | 'queued';
21
+ currentConversationId: string | null;
22
+ nextItem: MilestoneItemRef | null;
23
+ currentItem: MilestoneItemRef | null;
24
+ lastContextUsage: ContextUsageData | null;
25
+ createdAt: string;
26
+ updatedAt: string;
27
+ }
28
+ export interface ProjectIndexEntry {
29
+ id: string;
30
+ name: string;
31
+ }
32
+ export interface CreateProjectData {
33
+ name: string;
34
+ path: string;
35
+ }
36
+ export interface ProjectRepository {
37
+ findAll(): Promise<ProjectStatus[]>;
38
+ findById(id: string): Promise<ProjectStatus | null>;
39
+ findByPath(projectPath: string): Promise<ProjectStatus | null>;
40
+ create(data: CreateProjectData): Promise<ProjectStatus>;
41
+ updateStatus(id: string, status: ProjectStatus['status']): Promise<ProjectStatus | null>;
42
+ updateNextItem(id: string, nextItem: MilestoneItemRef | null): Promise<ProjectStatus | null>;
43
+ updateCurrentItem(id: string, currentItem: MilestoneItemRef | null): Promise<ProjectStatus | null>;
44
+ setCurrentConversation(id: string, conversationId: string | null): Promise<ProjectStatus | null>;
45
+ updateContextUsage(id: string, contextUsage: ContextUsageData | null): Promise<ProjectStatus | null>;
46
+ delete(id: string): Promise<boolean>;
47
+ }
48
+ export interface FileSystem {
49
+ readFileSync(filePath: string, encoding: BufferEncoding): string;
50
+ writeFileSync(filePath: string, data: string): void;
51
+ existsSync(filePath: string): boolean;
52
+ mkdirSync(dirPath: string, options: {
53
+ recursive: boolean;
54
+ }): void;
55
+ rmdirSync(dirPath: string, options: {
56
+ recursive: boolean;
57
+ }): void;
58
+ }
59
+ export declare function generateIdFromPath(projectPath: string): string;
60
+ export interface ProjectIndexEntryWithPath extends ProjectIndexEntry {
61
+ path: string;
62
+ }
63
+ export declare class FileProjectRepository implements ProjectRepository {
64
+ private readonly projectsDir;
65
+ private readonly indexPath;
66
+ private readonly fileSystem;
67
+ private index;
68
+ private statusCache;
69
+ constructor(dataDir: string, fileSystem?: FileSystem);
70
+ getProjectPath(id: string): string | null;
71
+ private ensureProjectsDir;
72
+ private loadIndex;
73
+ private saveIndex;
74
+ private getProjectDataDir;
75
+ private getStatusPath;
76
+ private loadStatus;
77
+ private migrateProjectData;
78
+ private copyDirectory;
79
+ private saveStatus;
80
+ findAll(): Promise<ProjectStatus[]>;
81
+ findById(id: string): Promise<ProjectStatus | null>;
82
+ findByPath(projectPath: string): Promise<ProjectStatus | null>;
83
+ create(data: CreateProjectData): Promise<ProjectStatus>;
84
+ updateStatus(id: string, newStatus: ProjectStatus['status']): Promise<ProjectStatus | null>;
85
+ updateNextItem(id: string, nextItem: MilestoneItemRef | null): Promise<ProjectStatus | null>;
86
+ updateCurrentItem(id: string, currentItem: MilestoneItemRef | null): Promise<ProjectStatus | null>;
87
+ setCurrentConversation(id: string, conversationId: string | null): Promise<ProjectStatus | null>;
88
+ updateContextUsage(id: string, contextUsage: ContextUsageData | null): Promise<ProjectStatus | null>;
89
+ delete(id: string): Promise<boolean>;
90
+ }
91
+ export type Project = ProjectStatus;
92
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/repositories/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FileProjectRepository = void 0;
7
+ exports.generateIdFromPath = generateIdFromPath;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const defaultFileSystem = {
11
+ readFileSync: (filePath, encoding) => fs_1.default.readFileSync(filePath, encoding),
12
+ writeFileSync: (filePath, data) => fs_1.default.writeFileSync(filePath, data),
13
+ existsSync: (filePath) => fs_1.default.existsSync(filePath),
14
+ mkdirSync: (dirPath, options) => fs_1.default.mkdirSync(dirPath, options),
15
+ rmdirSync: (dirPath, options) => fs_1.default.rmSync(dirPath, options),
16
+ };
17
+ function generateIdFromPath(projectPath) {
18
+ return projectPath.replace(/[^a-zA-Z0-9]/g, '_');
19
+ }
20
+ class FileProjectRepository {
21
+ projectsDir;
22
+ indexPath;
23
+ fileSystem;
24
+ index = new Map();
25
+ statusCache = new Map();
26
+ constructor(dataDir, fileSystem = defaultFileSystem) {
27
+ this.fileSystem = fileSystem;
28
+ this.projectsDir = path_1.default.join(dataDir, 'projects');
29
+ this.indexPath = path_1.default.join(this.projectsDir, 'index.json');
30
+ this.ensureProjectsDir();
31
+ this.loadIndex();
32
+ }
33
+ // Get the project path for a given project ID (used by other repositories)
34
+ getProjectPath(id) {
35
+ const entry = this.index.get(id);
36
+ return entry?.path || null;
37
+ }
38
+ ensureProjectsDir() {
39
+ if (!this.fileSystem.existsSync(this.projectsDir)) {
40
+ this.fileSystem.mkdirSync(this.projectsDir, { recursive: true });
41
+ }
42
+ }
43
+ loadIndex() {
44
+ if (!this.fileSystem.existsSync(this.indexPath)) {
45
+ return;
46
+ }
47
+ try {
48
+ const data = this.fileSystem.readFileSync(this.indexPath, 'utf-8');
49
+ const entries = JSON.parse(data);
50
+ entries.forEach((entry) => this.index.set(entry.id, entry));
51
+ }
52
+ catch {
53
+ // File corrupted or invalid, start fresh
54
+ }
55
+ }
56
+ saveIndex() {
57
+ const entries = Array.from(this.index.values());
58
+ const data = JSON.stringify(entries, null, 2);
59
+ this.fileSystem.writeFileSync(this.indexPath, data);
60
+ }
61
+ // Project data is now stored in {project-root}/.claudito/
62
+ getProjectDataDir(projectPath) {
63
+ return path_1.default.join(projectPath, '.claudito');
64
+ }
65
+ getStatusPath(projectPath) {
66
+ return path_1.default.join(this.getProjectDataDir(projectPath), 'status.json');
67
+ }
68
+ loadStatus(id) {
69
+ if (this.statusCache.has(id)) {
70
+ return { ...this.statusCache.get(id) };
71
+ }
72
+ const entry = this.index.get(id);
73
+ if (!entry) {
74
+ return null;
75
+ }
76
+ // Handle backward compatibility: old entries may not have path
77
+ if (!entry.path) {
78
+ // Try to load from old location and migrate
79
+ const oldStatusPath = path_1.default.join(this.projectsDir, id, 'status.json');
80
+ if (this.fileSystem.existsSync(oldStatusPath)) {
81
+ try {
82
+ const data = this.fileSystem.readFileSync(oldStatusPath, 'utf-8');
83
+ const status = JSON.parse(data);
84
+ // Update index with path from status
85
+ entry.path = status.path;
86
+ this.saveIndex();
87
+ // Migrate data to new location
88
+ this.migrateProjectData(id, status.path);
89
+ this.statusCache.set(id, status);
90
+ return { ...status };
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ }
96
+ return null;
97
+ }
98
+ const statusPath = this.getStatusPath(entry.path);
99
+ if (!this.fileSystem.existsSync(statusPath)) {
100
+ return null;
101
+ }
102
+ try {
103
+ const data = this.fileSystem.readFileSync(statusPath, 'utf-8');
104
+ const status = JSON.parse(data);
105
+ this.statusCache.set(id, status);
106
+ return { ...status };
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ migrateProjectData(id, projectPath) {
113
+ const oldDir = path_1.default.join(this.projectsDir, id);
114
+ const newDir = this.getProjectDataDir(projectPath);
115
+ if (!this.fileSystem.existsSync(oldDir)) {
116
+ return;
117
+ }
118
+ // Create new directory
119
+ if (!this.fileSystem.existsSync(newDir)) {
120
+ this.fileSystem.mkdirSync(newDir, { recursive: true });
121
+ }
122
+ // Copy status.json
123
+ const oldStatusPath = path_1.default.join(oldDir, 'status.json');
124
+ if (this.fileSystem.existsSync(oldStatusPath)) {
125
+ const statusData = this.fileSystem.readFileSync(oldStatusPath, 'utf-8');
126
+ this.fileSystem.writeFileSync(path_1.default.join(newDir, 'status.json'), statusData);
127
+ }
128
+ // Copy conversations directory if it exists
129
+ const oldConvDir = path_1.default.join(oldDir, 'conversations');
130
+ const newConvDir = path_1.default.join(newDir, 'conversations');
131
+ if (this.fileSystem.existsSync(oldConvDir)) {
132
+ this.copyDirectory(oldConvDir, newConvDir);
133
+ }
134
+ // Remove old directory after successful migration
135
+ try {
136
+ this.fileSystem.rmdirSync(oldDir, { recursive: true });
137
+ }
138
+ catch {
139
+ // Ignore cleanup errors
140
+ }
141
+ }
142
+ copyDirectory(src, dest) {
143
+ if (!this.fileSystem.existsSync(dest)) {
144
+ this.fileSystem.mkdirSync(dest, { recursive: true });
145
+ }
146
+ // Read directory contents using fs directly (sync)
147
+ const entries = fs_1.default.readdirSync(src, { withFileTypes: true });
148
+ for (const entry of entries) {
149
+ const srcPath = path_1.default.join(src, entry.name);
150
+ const destPath = path_1.default.join(dest, entry.name);
151
+ if (entry.isDirectory()) {
152
+ this.copyDirectory(srcPath, destPath);
153
+ }
154
+ else {
155
+ const content = this.fileSystem.readFileSync(srcPath, 'utf-8');
156
+ this.fileSystem.writeFileSync(destPath, content);
157
+ }
158
+ }
159
+ }
160
+ saveStatus(status) {
161
+ const dataDir = this.getProjectDataDir(status.path);
162
+ if (!this.fileSystem.existsSync(dataDir)) {
163
+ this.fileSystem.mkdirSync(dataDir, { recursive: true });
164
+ }
165
+ status.updatedAt = new Date().toISOString();
166
+ this.statusCache.set(status.id, status);
167
+ const statusPath = this.getStatusPath(status.path);
168
+ const data = JSON.stringify(status, null, 2);
169
+ this.fileSystem.writeFileSync(statusPath, data);
170
+ }
171
+ findAll() {
172
+ const projects = [];
173
+ for (const entry of this.index.values()) {
174
+ const status = this.loadStatus(entry.id);
175
+ if (status) {
176
+ projects.push(status);
177
+ }
178
+ }
179
+ return Promise.resolve(projects);
180
+ }
181
+ findById(id) {
182
+ if (!this.index.has(id)) {
183
+ return Promise.resolve(null);
184
+ }
185
+ return Promise.resolve(this.loadStatus(id));
186
+ }
187
+ async findByPath(projectPath) {
188
+ const id = generateIdFromPath(projectPath);
189
+ return this.findById(id);
190
+ }
191
+ async create(data) {
192
+ const id = generateIdFromPath(data.path);
193
+ const existingProject = await this.findById(id);
194
+ if (existingProject) {
195
+ throw new Error('Project with this path already exists');
196
+ }
197
+ const now = new Date().toISOString();
198
+ const status = {
199
+ id,
200
+ name: data.name,
201
+ path: data.path,
202
+ status: 'stopped',
203
+ currentConversationId: null,
204
+ nextItem: null,
205
+ currentItem: null,
206
+ lastContextUsage: null,
207
+ createdAt: now,
208
+ updatedAt: now,
209
+ };
210
+ // Store path in index so we can locate the .claudito folder
211
+ const indexEntry = { id, name: data.name, path: data.path };
212
+ this.index.set(id, indexEntry);
213
+ this.saveIndex();
214
+ this.saveStatus(status);
215
+ return status;
216
+ }
217
+ updateStatus(id, newStatus) {
218
+ const status = this.loadStatus(id);
219
+ if (!status) {
220
+ return Promise.resolve(null);
221
+ }
222
+ status.status = newStatus;
223
+ this.saveStatus(status);
224
+ return Promise.resolve({ ...status });
225
+ }
226
+ updateNextItem(id, nextItem) {
227
+ const status = this.loadStatus(id);
228
+ if (!status) {
229
+ return Promise.resolve(null);
230
+ }
231
+ status.nextItem = nextItem;
232
+ this.saveStatus(status);
233
+ return Promise.resolve({ ...status });
234
+ }
235
+ updateCurrentItem(id, currentItem) {
236
+ const status = this.loadStatus(id);
237
+ if (!status) {
238
+ return Promise.resolve(null);
239
+ }
240
+ status.currentItem = currentItem;
241
+ this.saveStatus(status);
242
+ return Promise.resolve({ ...status });
243
+ }
244
+ setCurrentConversation(id, conversationId) {
245
+ const status = this.loadStatus(id);
246
+ if (!status) {
247
+ return Promise.resolve(null);
248
+ }
249
+ status.currentConversationId = conversationId;
250
+ this.saveStatus(status);
251
+ return Promise.resolve({ ...status });
252
+ }
253
+ updateContextUsage(id, contextUsage) {
254
+ const status = this.loadStatus(id);
255
+ if (!status) {
256
+ return Promise.resolve(null);
257
+ }
258
+ status.lastContextUsage = contextUsage;
259
+ this.saveStatus(status);
260
+ return Promise.resolve({ ...status });
261
+ }
262
+ delete(id) {
263
+ const entry = this.index.get(id);
264
+ if (!entry) {
265
+ return Promise.resolve(false);
266
+ }
267
+ this.index.delete(id);
268
+ this.saveIndex();
269
+ this.statusCache.delete(id);
270
+ // Delete the .claudito folder in the project root
271
+ const dataDir = this.getProjectDataDir(entry.path);
272
+ if (this.fileSystem.existsSync(dataDir)) {
273
+ this.fileSystem.rmdirSync(dataDir, { recursive: true });
274
+ }
275
+ return Promise.resolve(true);
276
+ }
277
+ }
278
+ exports.FileProjectRepository = FileProjectRepository;
279
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/repositories/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export interface ClaudePermissions {
2
+ dangerouslySkipPermissions: boolean;
3
+ allowedTools: string[];
4
+ }
5
+ export declare const DEFAULT_AGENT_PROMPT_TEMPLATE = "You are working on the project \"${var:project-name}\".\n\nCurrent Phase: ${var:phase-title}\nCurrent Milestone: ${var:milestone-title}\n\nYour current task is:\n${var:milestone-item}\n\nInstructions:\n1. Work on this specific task until it is fully complete\n2. Write tests for the functionality and ensure they pass\n3. If you discover important context about the project, save it to CLAUDE.md\n4. Mark the task as completed in ROADMAP.md by changing [ ] to [x]\n5. Do NOT work on other tasks - focus only on this one\n\nWhen finished, you MUST return a JSON object with the following structure:\n{\n \"status\": \"COMPLETE\" or \"FAILED\",\n \"reason\": \"explanation of what was done or why it failed\"\n}";
6
+ export interface GlobalSettings {
7
+ maxConcurrentAgents: number;
8
+ claudePermissions: ClaudePermissions;
9
+ agentPromptTemplate: string;
10
+ sendWithCtrlEnter: boolean;
11
+ historyLimit: number;
12
+ }
13
+ export interface SettingsUpdate {
14
+ maxConcurrentAgents?: number;
15
+ claudePermissions?: Partial<ClaudePermissions>;
16
+ agentPromptTemplate?: string;
17
+ sendWithCtrlEnter?: boolean;
18
+ historyLimit?: number;
19
+ }
20
+ export interface SettingsRepository {
21
+ get(): Promise<GlobalSettings>;
22
+ update(settings: SettingsUpdate): Promise<GlobalSettings>;
23
+ }
24
+ export interface FileSystemAdapter {
25
+ readFileSync(filePath: string, encoding: BufferEncoding): string;
26
+ writeFileSync(filePath: string, data: string): void;
27
+ existsSync(filePath: string): boolean;
28
+ mkdirSync(dirPath: string, options: {
29
+ recursive: boolean;
30
+ }): void;
31
+ }
32
+ export declare class FileSettingsRepository implements SettingsRepository {
33
+ private settings;
34
+ private readonly filePath;
35
+ private readonly fileSystem;
36
+ constructor(dataDir: string, fileSystem?: FileSystemAdapter);
37
+ private ensureDataDir;
38
+ private loadFromFile;
39
+ private mergeWithDefaults;
40
+ private saveToFile;
41
+ get(): Promise<GlobalSettings>;
42
+ update(updates: SettingsUpdate): Promise<GlobalSettings>;
43
+ }
44
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/repositories/settings.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,0BAA0B,EAAE,OAAO,CAAC;IACpC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,6BAA6B,4sBAmBxC,CAAC;AAEH,MAAM,WAAW,cAAc;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;CACtB;AAcD,MAAM,WAAW,cAAc;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC;IACjE,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CACnE;AASD,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;gBAEnC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,iBAAqC;IAO9E,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,UAAU;IAKlB,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;IAI9B,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;CA2BzD"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FileSettingsRepository = exports.DEFAULT_AGENT_PROMPT_TEMPLATE = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ exports.DEFAULT_AGENT_PROMPT_TEMPLATE = `You are working on the project "\${var:project-name}".
10
+
11
+ Current Phase: \${var:phase-title}
12
+ Current Milestone: \${var:milestone-title}
13
+
14
+ Your current task is:
15
+ \${var:milestone-item}
16
+
17
+ Instructions:
18
+ 1. Work on this specific task until it is fully complete
19
+ 2. Write tests for the functionality and ensure they pass
20
+ 3. If you discover important context about the project, save it to CLAUDE.md
21
+ 4. Mark the task as completed in ROADMAP.md by changing [ ] to [x]
22
+ 5. Do NOT work on other tasks - focus only on this one
23
+
24
+ When finished, you MUST return a JSON object with the following structure:
25
+ {
26
+ "status": "COMPLETE" or "FAILED",
27
+ "reason": "explanation of what was done or why it failed"
28
+ }`;
29
+ const DEFAULT_SETTINGS = {
30
+ maxConcurrentAgents: 3,
31
+ claudePermissions: {
32
+ dangerouslySkipPermissions: true,
33
+ allowedTools: [],
34
+ },
35
+ agentPromptTemplate: exports.DEFAULT_AGENT_PROMPT_TEMPLATE,
36
+ sendWithCtrlEnter: true,
37
+ historyLimit: 25,
38
+ };
39
+ const defaultFileSystem = {
40
+ readFileSync: (filePath, encoding) => fs_1.default.readFileSync(filePath, encoding),
41
+ writeFileSync: (filePath, data) => fs_1.default.writeFileSync(filePath, data),
42
+ existsSync: (filePath) => fs_1.default.existsSync(filePath),
43
+ mkdirSync: (dirPath, options) => fs_1.default.mkdirSync(dirPath, options),
44
+ };
45
+ class FileSettingsRepository {
46
+ settings;
47
+ filePath;
48
+ fileSystem;
49
+ constructor(dataDir, fileSystem = defaultFileSystem) {
50
+ this.fileSystem = fileSystem;
51
+ this.ensureDataDir(dataDir);
52
+ this.filePath = path_1.default.join(dataDir, 'settings.json');
53
+ this.settings = this.loadFromFile();
54
+ }
55
+ ensureDataDir(dataDir) {
56
+ if (!this.fileSystem.existsSync(dataDir)) {
57
+ this.fileSystem.mkdirSync(dataDir, { recursive: true });
58
+ }
59
+ }
60
+ loadFromFile() {
61
+ if (!this.fileSystem.existsSync(this.filePath)) {
62
+ return { ...DEFAULT_SETTINGS };
63
+ }
64
+ try {
65
+ const data = this.fileSystem.readFileSync(this.filePath, 'utf-8');
66
+ const parsed = JSON.parse(data);
67
+ return this.mergeWithDefaults(parsed);
68
+ }
69
+ catch {
70
+ return { ...DEFAULT_SETTINGS };
71
+ }
72
+ }
73
+ mergeWithDefaults(parsed) {
74
+ return {
75
+ maxConcurrentAgents: parsed.maxConcurrentAgents ?? DEFAULT_SETTINGS.maxConcurrentAgents,
76
+ claudePermissions: {
77
+ ...DEFAULT_SETTINGS.claudePermissions,
78
+ ...parsed.claudePermissions,
79
+ },
80
+ agentPromptTemplate: parsed.agentPromptTemplate ?? DEFAULT_SETTINGS.agentPromptTemplate,
81
+ sendWithCtrlEnter: parsed.sendWithCtrlEnter ?? DEFAULT_SETTINGS.sendWithCtrlEnter,
82
+ historyLimit: parsed.historyLimit ?? DEFAULT_SETTINGS.historyLimit,
83
+ };
84
+ }
85
+ saveToFile() {
86
+ const data = JSON.stringify(this.settings, null, 2);
87
+ this.fileSystem.writeFileSync(this.filePath, data);
88
+ }
89
+ get() {
90
+ return Promise.resolve({ ...this.settings });
91
+ }
92
+ update(updates) {
93
+ if (updates.maxConcurrentAgents !== undefined) {
94
+ this.settings.maxConcurrentAgents = Math.max(1, updates.maxConcurrentAgents);
95
+ }
96
+ if (updates.claudePermissions) {
97
+ this.settings.claudePermissions = {
98
+ ...this.settings.claudePermissions,
99
+ ...updates.claudePermissions,
100
+ };
101
+ }
102
+ if (updates.agentPromptTemplate !== undefined) {
103
+ this.settings.agentPromptTemplate = updates.agentPromptTemplate;
104
+ }
105
+ if (updates.sendWithCtrlEnter !== undefined) {
106
+ this.settings.sendWithCtrlEnter = updates.sendWithCtrlEnter;
107
+ }
108
+ if (updates.historyLimit !== undefined) {
109
+ this.settings.historyLimit = Math.max(5, Math.min(100, updates.historyLimit));
110
+ }
111
+ this.saveToFile();
112
+ return Promise.resolve({ ...this.settings });
113
+ }
114
+ }
115
+ exports.FileSettingsRepository = FileSettingsRepository;
116
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/repositories/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Router } from 'express';
2
+ export interface FilesystemService {
3
+ listDrives(): Promise<DriveInfo[]>;
4
+ listDirectory(dirPath: string): Promise<DirectoryEntry[]>;
5
+ listDirectoryWithFiles(dirPath: string): Promise<DirectoryEntry[]>;
6
+ readFile(filePath: string): Promise<string>;
7
+ writeFile(filePath: string, content: string): Promise<void>;
8
+ deleteFile(filePath: string): Promise<void>;
9
+ deleteDirectory(dirPath: string): Promise<void>;
10
+ isTextFile(filePath: string): boolean;
11
+ }
12
+ export interface DriveInfo {
13
+ name: string;
14
+ path: string;
15
+ }
16
+ export interface DirectoryEntry {
17
+ name: string;
18
+ path: string;
19
+ isDirectory: boolean;
20
+ }
21
+ export declare class WindowsFilesystemService implements FilesystemService {
22
+ listDrives(): Promise<DriveInfo[]>;
23
+ private driveExists;
24
+ listDirectory(dirPath: string): Promise<DirectoryEntry[]>;
25
+ listDirectoryWithFiles(dirPath: string): Promise<DirectoryEntry[]>;
26
+ readFile(filePath: string): Promise<string>;
27
+ writeFile(filePath: string, content: string): Promise<void>;
28
+ deleteFile(filePath: string): Promise<void>;
29
+ deleteDirectory(dirPath: string): Promise<void>;
30
+ isTextFile(filePath: string): boolean;
31
+ }
32
+ export declare function createFilesystemRouter(service: FilesystemService): Router;
33
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/routes/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAIpD,MAAM,WAAW,iBAAiB;IAChC,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC1D,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,wBAAyB,YAAW,iBAAiB;IAC1D,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAe1B,WAAW;IASnB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAezD,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAmBlE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAItC;AA2FD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAwEzE"}