mstro-app 0.4.3 → 0.4.4
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.
- package/dist/server/cli/headless/claude-invoker-process.d.ts +11 -0
- package/dist/server/cli/headless/claude-invoker-process.d.ts.map +1 -0
- package/dist/server/cli/headless/claude-invoker-process.js +140 -0
- package/dist/server/cli/headless/claude-invoker-process.js.map +1 -0
- package/dist/server/cli/headless/claude-invoker-stall.d.ts +40 -0
- package/dist/server/cli/headless/claude-invoker-stall.d.ts.map +1 -0
- package/dist/server/cli/headless/claude-invoker-stall.js +98 -0
- package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -0
- package/dist/server/cli/headless/claude-invoker-stream.d.ts +44 -0
- package/dist/server/cli/headless/claude-invoker-stream.d.ts.map +1 -0
- package/dist/server/cli/headless/claude-invoker-stream.js +276 -0
- package/dist/server/cli/headless/claude-invoker-stream.js.map +1 -0
- package/dist/server/cli/headless/claude-invoker-tools.d.ts +21 -0
- package/dist/server/cli/headless/claude-invoker-tools.d.ts.map +1 -0
- package/dist/server/cli/headless/claude-invoker-tools.js +137 -0
- package/dist/server/cli/headless/claude-invoker-tools.js.map +1 -0
- package/dist/server/cli/headless/claude-invoker.d.ts +6 -4
- package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker.js +10 -807
- package/dist/server/cli/headless/claude-invoker.js.map +1 -1
- package/dist/server/cli/headless/haiku-assessments.d.ts +62 -0
- package/dist/server/cli/headless/haiku-assessments.d.ts.map +1 -0
- package/dist/server/cli/headless/haiku-assessments.js +281 -0
- package/dist/server/cli/headless/haiku-assessments.js.map +1 -0
- package/dist/server/cli/headless/headless-logger.d.ts +3 -2
- package/dist/server/cli/headless/headless-logger.d.ts.map +1 -1
- package/dist/server/cli/headless/headless-logger.js +28 -5
- package/dist/server/cli/headless/headless-logger.js.map +1 -1
- package/dist/server/cli/headless/native-timeout-detector.d.ts +44 -0
- package/dist/server/cli/headless/native-timeout-detector.d.ts.map +1 -0
- package/dist/server/cli/headless/native-timeout-detector.js +99 -0
- package/dist/server/cli/headless/native-timeout-detector.js.map +1 -0
- package/dist/server/cli/headless/stall-assessor.d.ts +2 -110
- package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
- package/dist/server/cli/headless/stall-assessor.js +65 -457
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/improvisation-attachments.d.ts +21 -0
- package/dist/server/cli/improvisation-attachments.d.ts.map +1 -0
- package/dist/server/cli/improvisation-attachments.js +116 -0
- package/dist/server/cli/improvisation-attachments.js.map +1 -0
- package/dist/server/cli/improvisation-retry.d.ts +52 -0
- package/dist/server/cli/improvisation-retry.d.ts.map +1 -0
- package/dist/server/cli/improvisation-retry.js +434 -0
- package/dist/server/cli/improvisation-retry.js.map +1 -0
- package/dist/server/cli/improvisation-session-manager.d.ts +10 -266
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +117 -1079
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/cli/improvisation-types.d.ts +86 -0
- package/dist/server/cli/improvisation-types.d.ts.map +1 -0
- package/dist/server/cli/improvisation-types.js +10 -0
- package/dist/server/cli/improvisation-types.js.map +1 -0
- package/dist/server/cli/prompt-builders.d.ts +68 -0
- package/dist/server/cli/prompt-builders.d.ts.map +1 -0
- package/dist/server/cli/prompt-builders.js +312 -0
- package/dist/server/cli/prompt-builders.js.map +1 -0
- package/dist/server/index.js +33 -212
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/bouncer-haiku.d.ts +10 -0
- package/dist/server/mcp/bouncer-haiku.d.ts.map +1 -0
- package/dist/server/mcp/bouncer-haiku.js +152 -0
- package/dist/server/mcp/bouncer-haiku.js.map +1 -0
- package/dist/server/mcp/bouncer-integration.d.ts +3 -4
- package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-integration.js +50 -196
- package/dist/server/mcp/bouncer-integration.js.map +1 -1
- package/dist/server/mcp/security-analysis.d.ts +38 -0
- package/dist/server/mcp/security-analysis.d.ts.map +1 -0
- package/dist/server/mcp/security-analysis.js +183 -0
- package/dist/server/mcp/security-analysis.js.map +1 -0
- package/dist/server/mcp/security-audit.d.ts +1 -1
- package/dist/server/mcp/security-audit.d.ts.map +1 -1
- package/dist/server/mcp/security-patterns.d.ts +1 -25
- package/dist/server/mcp/security-patterns.d.ts.map +1 -1
- package/dist/server/mcp/security-patterns.js +55 -260
- package/dist/server/mcp/security-patterns.js.map +1 -1
- package/dist/server/server-setup.d.ts +22 -0
- package/dist/server/server-setup.d.ts.map +1 -0
- package/dist/server/server-setup.js +101 -0
- package/dist/server/server-setup.js.map +1 -0
- package/dist/server/services/file-explorer-ops.d.ts +24 -0
- package/dist/server/services/file-explorer-ops.d.ts.map +1 -0
- package/dist/server/services/file-explorer-ops.js +211 -0
- package/dist/server/services/file-explorer-ops.js.map +1 -0
- package/dist/server/services/files.d.ts +2 -85
- package/dist/server/services/files.d.ts.map +1 -1
- package/dist/server/services/files.js +7 -427
- package/dist/server/services/files.js.map +1 -1
- package/dist/server/services/plan/composer.d.ts.map +1 -1
- package/dist/server/services/plan/composer.js +2 -1
- package/dist/server/services/plan/composer.js.map +1 -1
- package/dist/server/services/plan/executor.d.ts.map +1 -1
- package/dist/server/services/plan/executor.js +3 -1
- package/dist/server/services/plan/executor.js.map +1 -1
- package/dist/server/services/plan/parser-core.d.ts +20 -0
- package/dist/server/services/plan/parser-core.d.ts.map +1 -0
- package/dist/server/services/plan/parser-core.js +350 -0
- package/dist/server/services/plan/parser-core.js.map +1 -0
- package/dist/server/services/plan/parser-migration.d.ts +5 -0
- package/dist/server/services/plan/parser-migration.d.ts.map +1 -0
- package/dist/server/services/plan/parser-migration.js +124 -0
- package/dist/server/services/plan/parser-migration.js.map +1 -0
- package/dist/server/services/plan/parser.d.ts +0 -8
- package/dist/server/services/plan/parser.d.ts.map +1 -1
- package/dist/server/services/plan/parser.js +50 -569
- package/dist/server/services/plan/parser.js.map +1 -1
- package/dist/server/services/plan/review-gate.d.ts +2 -0
- package/dist/server/services/plan/review-gate.d.ts.map +1 -1
- package/dist/server/services/plan/review-gate.js +2 -2
- package/dist/server/services/plan/review-gate.js.map +1 -1
- package/dist/server/services/plan/types.d.ts +2 -0
- package/dist/server/services/plan/types.d.ts.map +1 -1
- package/dist/server/services/platform-credentials.d.ts +24 -0
- package/dist/server/services/platform-credentials.d.ts.map +1 -0
- package/dist/server/services/platform-credentials.js +68 -0
- package/dist/server/services/platform-credentials.js.map +1 -0
- package/dist/server/services/platform.d.ts +1 -31
- package/dist/server/services/platform.d.ts.map +1 -1
- package/dist/server/services/platform.js +10 -119
- package/dist/server/services/platform.js.map +1 -1
- package/dist/server/services/terminal/pty-manager.d.ts +7 -97
- package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
- package/dist/server/services/terminal/pty-manager.js +53 -266
- package/dist/server/services/terminal/pty-manager.js.map +1 -1
- package/dist/server/services/terminal/pty-utils.d.ts +57 -0
- package/dist/server/services/terminal/pty-utils.d.ts.map +1 -0
- package/dist/server/services/terminal/pty-utils.js +141 -0
- package/dist/server/services/terminal/pty-utils.js.map +1 -0
- package/dist/server/services/websocket/file-definition-handlers.d.ts +4 -0
- package/dist/server/services/websocket/file-definition-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/file-definition-handlers.js +153 -0
- package/dist/server/services/websocket/file-definition-handlers.js.map +1 -0
- package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/file-explorer-handlers.js +52 -391
- package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
- package/dist/server/services/websocket/file-search-handlers.d.ts +5 -0
- package/dist/server/services/websocket/file-search-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/file-search-handlers.js +238 -0
- package/dist/server/services/websocket/file-search-handlers.js.map +1 -0
- package/dist/server/services/websocket/file-utils.js +3 -3
- package/dist/server/services/websocket/file-utils.js.map +1 -1
- package/dist/server/services/websocket/git-branch-handlers.d.ts +7 -0
- package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-branch-handlers.js +110 -0
- package/dist/server/services/websocket/git-branch-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-diff-handlers.d.ts +6 -0
- package/dist/server/services/websocket/git-diff-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-diff-handlers.js +123 -0
- package/dist/server/services/websocket/git-diff-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-handlers.d.ts +2 -31
- package/dist/server/services/websocket/git-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-handlers.js +35 -541
- package/dist/server/services/websocket/git-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-log-handlers.d.ts +6 -0
- package/dist/server/services/websocket/git-log-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-log-handlers.js +128 -0
- package/dist/server/services/websocket/git-log-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-pr-handlers.js +13 -53
- package/dist/server/services/websocket/git-pr-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-tag-handlers.d.ts +6 -0
- package/dist/server/services/websocket/git-tag-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-tag-handlers.js +76 -0
- package/dist/server/services/websocket/git-tag-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-utils.d.ts +43 -0
- package/dist/server/services/websocket/git-utils.d.ts.map +1 -0
- package/dist/server/services/websocket/git-utils.js +201 -0
- package/dist/server/services/websocket/git-utils.js.map +1 -0
- package/dist/server/services/websocket/handler.d.ts +2 -0
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +37 -126
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/plan-board-handlers.d.ts +11 -0
- package/dist/server/services/websocket/plan-board-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-board-handlers.js +218 -0
- package/dist/server/services/websocket/plan-board-handlers.js.map +1 -0
- package/dist/server/services/websocket/plan-execution-handlers.d.ts +9 -0
- package/dist/server/services/websocket/plan-execution-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-execution-handlers.js +142 -0
- package/dist/server/services/websocket/plan-execution-handlers.js.map +1 -0
- package/dist/server/services/websocket/plan-handlers.d.ts +7 -2
- package/dist/server/services/websocket/plan-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-handlers.js +6 -925
- package/dist/server/services/websocket/plan-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-helpers.d.ts +19 -0
- package/dist/server/services/websocket/plan-helpers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-helpers.js +199 -0
- package/dist/server/services/websocket/plan-helpers.js.map +1 -0
- package/dist/server/services/websocket/plan-issue-handlers.d.ts +12 -0
- package/dist/server/services/websocket/plan-issue-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-issue-handlers.js +162 -0
- package/dist/server/services/websocket/plan-issue-handlers.js.map +1 -0
- package/dist/server/services/websocket/plan-sprint-handlers.d.ts +7 -0
- package/dist/server/services/websocket/plan-sprint-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-sprint-handlers.js +206 -0
- package/dist/server/services/websocket/plan-sprint-handlers.js.map +1 -0
- package/dist/server/services/websocket/quality-complexity.d.ts +14 -0
- package/dist/server/services/websocket/quality-complexity.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-complexity.js +262 -0
- package/dist/server/services/websocket/quality-complexity.js.map +1 -0
- package/dist/server/services/websocket/quality-fix-agent.d.ts +16 -0
- package/dist/server/services/websocket/quality-fix-agent.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-fix-agent.js +140 -0
- package/dist/server/services/websocket/quality-fix-agent.js.map +1 -0
- package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-handlers.js +34 -346
- package/dist/server/services/websocket/quality-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-linting.d.ts +9 -0
- package/dist/server/services/websocket/quality-linting.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-linting.js +178 -0
- package/dist/server/services/websocket/quality-linting.js.map +1 -0
- package/dist/server/services/websocket/quality-review-agent.d.ts +19 -0
- package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-review-agent.js +206 -0
- package/dist/server/services/websocket/quality-review-agent.js.map +1 -0
- package/dist/server/services/websocket/quality-service.d.ts +3 -51
- package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-service.js +9 -651
- package/dist/server/services/websocket/quality-service.js.map +1 -1
- package/dist/server/services/websocket/quality-tools.d.ts +23 -0
- package/dist/server/services/websocket/quality-tools.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-tools.js +208 -0
- package/dist/server/services/websocket/quality-tools.js.map +1 -0
- package/dist/server/services/websocket/quality-types.d.ts +59 -0
- package/dist/server/services/websocket/quality-types.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-types.js +101 -0
- package/dist/server/services/websocket/quality-types.js.map +1 -0
- package/dist/server/services/websocket/session-handlers.d.ts +3 -4
- package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/session-handlers.js +3 -378
- package/dist/server/services/websocket/session-handlers.js.map +1 -1
- package/dist/server/services/websocket/session-history.d.ts +4 -0
- package/dist/server/services/websocket/session-history.d.ts.map +1 -0
- package/dist/server/services/websocket/session-history.js +208 -0
- package/dist/server/services/websocket/session-history.js.map +1 -0
- package/dist/server/services/websocket/session-initialization.d.ts +5 -0
- package/dist/server/services/websocket/session-initialization.d.ts.map +1 -0
- package/dist/server/services/websocket/session-initialization.js +163 -0
- package/dist/server/services/websocket/session-initialization.js.map +1 -0
- package/dist/server/services/websocket/types.d.ts +12 -2
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/server/cli/headless/claude-invoker-process.ts +204 -0
- package/server/cli/headless/claude-invoker-stall.ts +164 -0
- package/server/cli/headless/claude-invoker-stream.ts +353 -0
- package/server/cli/headless/claude-invoker-tools.ts +187 -0
- package/server/cli/headless/claude-invoker.ts +15 -1096
- package/server/cli/headless/haiku-assessments.ts +365 -0
- package/server/cli/headless/headless-logger.ts +26 -5
- package/server/cli/headless/native-timeout-detector.ts +117 -0
- package/server/cli/headless/stall-assessor.ts +65 -618
- package/server/cli/improvisation-attachments.ts +148 -0
- package/server/cli/improvisation-retry.ts +602 -0
- package/server/cli/improvisation-session-manager.ts +140 -1349
- package/server/cli/improvisation-types.ts +98 -0
- package/server/cli/prompt-builders.ts +370 -0
- package/server/index.ts +35 -246
- package/server/mcp/bouncer-haiku.ts +182 -0
- package/server/mcp/bouncer-integration.ts +87 -248
- package/server/mcp/security-analysis.ts +217 -0
- package/server/mcp/security-audit.ts +1 -1
- package/server/mcp/security-patterns.ts +60 -283
- package/server/server-setup.ts +114 -0
- package/server/services/file-explorer-ops.ts +293 -0
- package/server/services/files.ts +20 -532
- package/server/services/plan/composer.ts +2 -1
- package/server/services/plan/executor.ts +3 -1
- package/server/services/plan/parser-core.ts +406 -0
- package/server/services/plan/parser-migration.ts +128 -0
- package/server/services/plan/parser.ts +52 -620
- package/server/services/plan/review-gate.ts +4 -2
- package/server/services/plan/types.ts +2 -0
- package/server/services/platform-credentials.ts +83 -0
- package/server/services/platform.ts +15 -141
- package/server/services/terminal/pty-manager.ts +66 -313
- package/server/services/terminal/pty-utils.ts +176 -0
- package/server/services/websocket/file-definition-handlers.ts +165 -0
- package/server/services/websocket/file-explorer-handlers.ts +37 -452
- package/server/services/websocket/file-search-handlers.ts +291 -0
- package/server/services/websocket/file-utils.ts +3 -3
- package/server/services/websocket/git-branch-handlers.ts +130 -0
- package/server/services/websocket/git-diff-handlers.ts +140 -0
- package/server/services/websocket/git-handlers.ts +40 -625
- package/server/services/websocket/git-log-handlers.ts +149 -0
- package/server/services/websocket/git-pr-handlers.ts +17 -62
- package/server/services/websocket/git-tag-handlers.ts +91 -0
- package/server/services/websocket/git-utils.ts +230 -0
- package/server/services/websocket/handler.ts +39 -126
- package/server/services/websocket/plan-board-handlers.ts +277 -0
- package/server/services/websocket/plan-execution-handlers.ts +184 -0
- package/server/services/websocket/plan-handlers.ts +8 -1114
- package/server/services/websocket/plan-helpers.ts +215 -0
- package/server/services/websocket/plan-issue-handlers.ts +204 -0
- package/server/services/websocket/plan-sprint-handlers.ts +252 -0
- package/server/services/websocket/quality-complexity.ts +294 -0
- package/server/services/websocket/quality-fix-agent.ts +181 -0
- package/server/services/websocket/quality-handlers.ts +36 -404
- package/server/services/websocket/quality-linting.ts +187 -0
- package/server/services/websocket/quality-review-agent.ts +246 -0
- package/server/services/websocket/quality-service.ts +11 -762
- package/server/services/websocket/quality-tools.ts +209 -0
- package/server/services/websocket/quality-types.ts +169 -0
- package/server/services/websocket/session-handlers.ts +5 -437
- package/server/services/websocket/session-history.ts +222 -0
- package/server/services/websocket/session-initialization.ts +209 -0
- package/server/services/websocket/types.ts +17 -0
package/server/services/files.ts
CHANGED
|
@@ -2,27 +2,29 @@
|
|
|
2
2
|
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* File Service
|
|
5
|
+
* File Service — Autocomplete and file scoring for the working directory.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* Standalone file-explorer CRUD (listDirectory, writeFile, etc.) lives in
|
|
8
|
+
* file-explorer-ops.ts and is re-exported here for backward compatibility.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
11
|
+
import { readdirSync, statSync } from 'node:fs'
|
|
12
|
+
import { join } from 'node:path'
|
|
13
|
+
|
|
14
|
+
export type {
|
|
15
|
+
DirectoryEntry,
|
|
16
|
+
FileOperationResult,
|
|
17
|
+
ListDirectoryResult,
|
|
18
|
+
} from './file-explorer-ops.js'
|
|
19
|
+
// Re-export standalone file explorer functions & types
|
|
20
|
+
export {
|
|
21
|
+
createDirectory,
|
|
22
|
+
createFile,
|
|
23
|
+
deleteFile,
|
|
24
|
+
listDirectory,
|
|
25
|
+
renameFile,
|
|
26
|
+
writeFile,
|
|
27
|
+
} from './file-explorer-ops.js'
|
|
26
28
|
|
|
27
29
|
export interface FileItem {
|
|
28
30
|
name: string
|
|
@@ -41,35 +43,6 @@ interface ScoredFileItem {
|
|
|
41
43
|
score: number
|
|
42
44
|
}
|
|
43
45
|
|
|
44
|
-
/**
|
|
45
|
-
* Directory entry with metadata for file explorer
|
|
46
|
-
*/
|
|
47
|
-
export interface DirectoryEntry {
|
|
48
|
-
name: string
|
|
49
|
-
path: string
|
|
50
|
-
type: 'file' | 'directory'
|
|
51
|
-
size?: number
|
|
52
|
-
modifiedAt?: string
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Result type for file operations
|
|
57
|
-
*/
|
|
58
|
-
export interface FileOperationResult {
|
|
59
|
-
success: boolean
|
|
60
|
-
path?: string
|
|
61
|
-
error?: string
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Result type for list directory operation
|
|
66
|
-
*/
|
|
67
|
-
export interface ListDirectoryResult {
|
|
68
|
-
success: boolean
|
|
69
|
-
entries?: DirectoryEntry[]
|
|
70
|
-
error?: string
|
|
71
|
-
}
|
|
72
|
-
|
|
73
46
|
export class FileService {
|
|
74
47
|
private workingDirectory: string
|
|
75
48
|
private skipDirs = ['node_modules', '.git', '.mstro', 'dist', 'build', '.next', 'coverage', '.vscode', '.idea']
|
|
@@ -223,488 +196,3 @@ export class FileService {
|
|
|
223
196
|
}
|
|
224
197
|
}
|
|
225
198
|
}
|
|
226
|
-
|
|
227
|
-
// ============================================================================
|
|
228
|
-
// File Explorer Functions (standalone exports for WebSocket handler)
|
|
229
|
-
// ============================================================================
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* List immediate children of a directory.
|
|
233
|
-
* Returns entries sorted: directories first, then files, alphabetically.
|
|
234
|
-
*
|
|
235
|
-
* @param dirPath - Directory path (relative to workingDir or absolute)
|
|
236
|
-
* @param workingDir - Working directory boundary
|
|
237
|
-
* @param showHidden - Whether to show hidden files (starting with .)
|
|
238
|
-
* @returns ListDirectoryResult with entries array or error
|
|
239
|
-
*/
|
|
240
|
-
export function listDirectory(
|
|
241
|
-
dirPath: string,
|
|
242
|
-
workingDir: string,
|
|
243
|
-
showHidden: boolean = false
|
|
244
|
-
): ListDirectoryResult {
|
|
245
|
-
// Check for dangerous patterns first
|
|
246
|
-
if (containsDangerousPatterns(dirPath)) {
|
|
247
|
-
console.error(`[FileService] SECURITY: Dangerous pattern in path: "${dirPath}"`)
|
|
248
|
-
return {
|
|
249
|
-
success: false,
|
|
250
|
-
error: 'Invalid path: contains dangerous patterns'
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// Validate path is within working directory
|
|
255
|
-
const validation = validatePathWithinWorkingDir(dirPath, workingDir)
|
|
256
|
-
if (!validation.valid) {
|
|
257
|
-
return {
|
|
258
|
-
success: false,
|
|
259
|
-
error: validation.error
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
const resolvedPath = validation.resolvedPath
|
|
264
|
-
|
|
265
|
-
try {
|
|
266
|
-
// Check if path exists and is a directory
|
|
267
|
-
if (!existsSync(resolvedPath)) {
|
|
268
|
-
return {
|
|
269
|
-
success: false,
|
|
270
|
-
error: 'Directory not found'
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
const stats = statSync(resolvedPath)
|
|
275
|
-
if (!stats.isDirectory()) {
|
|
276
|
-
return {
|
|
277
|
-
success: false,
|
|
278
|
-
error: 'Path is not a directory'
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// Read directory entries
|
|
283
|
-
const entries = readdirSync(resolvedPath, { withFileTypes: true })
|
|
284
|
-
|
|
285
|
-
// Map to DirectoryEntry objects
|
|
286
|
-
const directoryEntries: DirectoryEntry[] = entries
|
|
287
|
-
.filter(entry => {
|
|
288
|
-
// Filter hidden files unless showHidden is true
|
|
289
|
-
if (!showHidden && entry.name.startsWith('.')) {
|
|
290
|
-
return false
|
|
291
|
-
}
|
|
292
|
-
return true
|
|
293
|
-
})
|
|
294
|
-
.map(entry => {
|
|
295
|
-
const entryPath = join(resolvedPath, entry.name)
|
|
296
|
-
const isDir = entry.isDirectory()
|
|
297
|
-
|
|
298
|
-
// Get stats for size and modification time
|
|
299
|
-
let size: number | undefined
|
|
300
|
-
let modifiedAt: string | undefined
|
|
301
|
-
|
|
302
|
-
try {
|
|
303
|
-
const entryStats = statSync(entryPath)
|
|
304
|
-
modifiedAt = entryStats.mtime.toISOString()
|
|
305
|
-
if (!isDir) {
|
|
306
|
-
size = entryStats.size
|
|
307
|
-
}
|
|
308
|
-
} catch {
|
|
309
|
-
// Skip stats if we can't read them
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// Return path relative to workingDir for consistency
|
|
313
|
-
const relativePath = entryPath.replace(`${workingDir}/`, '')
|
|
314
|
-
|
|
315
|
-
return {
|
|
316
|
-
name: entry.name,
|
|
317
|
-
path: relativePath,
|
|
318
|
-
type: isDir ? 'directory' : 'file',
|
|
319
|
-
size,
|
|
320
|
-
modifiedAt
|
|
321
|
-
} as DirectoryEntry
|
|
322
|
-
})
|
|
323
|
-
|
|
324
|
-
// Sort: directories first, then files, alphabetically within each group
|
|
325
|
-
directoryEntries.sort((a, b) => {
|
|
326
|
-
if (a.type === 'directory' && b.type === 'file') return -1
|
|
327
|
-
if (a.type === 'file' && b.type === 'directory') return 1
|
|
328
|
-
return a.name.localeCompare(b.name)
|
|
329
|
-
})
|
|
330
|
-
|
|
331
|
-
return {
|
|
332
|
-
success: true,
|
|
333
|
-
entries: directoryEntries
|
|
334
|
-
}
|
|
335
|
-
} catch (error: unknown) {
|
|
336
|
-
// Handle permission errors gracefully
|
|
337
|
-
if (error instanceof Error && 'code' in error && (error as NodeJS.ErrnoException).code === 'EACCES') {
|
|
338
|
-
return {
|
|
339
|
-
success: false,
|
|
340
|
-
error: 'Permission denied'
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
console.error('[FileService] Error listing directory:', error)
|
|
345
|
-
return {
|
|
346
|
-
success: false,
|
|
347
|
-
error: error instanceof Error ? error.message : 'Failed to list directory'
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Write content to a file.
|
|
354
|
-
* Creates parent directories if needed.
|
|
355
|
-
*
|
|
356
|
-
* @param filePath - File path (relative to workingDir or absolute)
|
|
357
|
-
* @param content - Content to write
|
|
358
|
-
* @param workingDir - Working directory boundary
|
|
359
|
-
* @returns FileOperationResult
|
|
360
|
-
*/
|
|
361
|
-
export function writeFile(
|
|
362
|
-
filePath: string,
|
|
363
|
-
content: string,
|
|
364
|
-
workingDir: string
|
|
365
|
-
): FileOperationResult {
|
|
366
|
-
// Check for dangerous patterns first
|
|
367
|
-
if (containsDangerousPatterns(filePath)) {
|
|
368
|
-
console.error(`[FileService] SECURITY: Dangerous pattern in path: "${filePath}"`)
|
|
369
|
-
return {
|
|
370
|
-
success: false,
|
|
371
|
-
error: 'Invalid path: contains dangerous patterns'
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// Validate path is within working directory
|
|
376
|
-
const validation = validatePathWithinWorkingDir(filePath, workingDir)
|
|
377
|
-
if (!validation.valid) {
|
|
378
|
-
return {
|
|
379
|
-
success: false,
|
|
380
|
-
error: validation.error
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
const resolvedPath = validation.resolvedPath
|
|
385
|
-
|
|
386
|
-
try {
|
|
387
|
-
// Create parent directories if they don't exist
|
|
388
|
-
const parentDir = dirname(resolvedPath)
|
|
389
|
-
if (!existsSync(parentDir)) {
|
|
390
|
-
mkdirSync(parentDir, { recursive: true })
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
// Check if target is a directory (can't write to directory)
|
|
394
|
-
if (existsSync(resolvedPath)) {
|
|
395
|
-
const stats = statSync(resolvedPath)
|
|
396
|
-
if (stats.isDirectory()) {
|
|
397
|
-
return {
|
|
398
|
-
success: false,
|
|
399
|
-
error: 'Cannot write to a directory'
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
// Write the file
|
|
405
|
-
writeFileSync(resolvedPath, content, 'utf-8')
|
|
406
|
-
|
|
407
|
-
return {
|
|
408
|
-
success: true,
|
|
409
|
-
path: resolvedPath.replace(`${workingDir}/`, '')
|
|
410
|
-
}
|
|
411
|
-
} catch (error: unknown) {
|
|
412
|
-
console.error('[FileService] Error writing file:', error)
|
|
413
|
-
return {
|
|
414
|
-
success: false,
|
|
415
|
-
error: error instanceof Error ? error.message : 'Failed to write file'
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
/**
|
|
421
|
-
* Create an empty file.
|
|
422
|
-
* Returns error if file already exists.
|
|
423
|
-
*
|
|
424
|
-
* @param filePath - File path (relative to workingDir or absolute)
|
|
425
|
-
* @param workingDir - Working directory boundary
|
|
426
|
-
* @returns FileOperationResult
|
|
427
|
-
*/
|
|
428
|
-
export function createFile(
|
|
429
|
-
filePath: string,
|
|
430
|
-
workingDir: string
|
|
431
|
-
): FileOperationResult {
|
|
432
|
-
// Check for dangerous patterns first
|
|
433
|
-
if (containsDangerousPatterns(filePath)) {
|
|
434
|
-
console.error(`[FileService] SECURITY: Dangerous pattern in path: "${filePath}"`)
|
|
435
|
-
return {
|
|
436
|
-
success: false,
|
|
437
|
-
error: 'Invalid path: contains dangerous patterns'
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
// Validate path is within working directory
|
|
442
|
-
const validation = validatePathWithinWorkingDir(filePath, workingDir)
|
|
443
|
-
if (!validation.valid) {
|
|
444
|
-
return {
|
|
445
|
-
success: false,
|
|
446
|
-
error: validation.error
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
const resolvedPath = validation.resolvedPath
|
|
451
|
-
|
|
452
|
-
try {
|
|
453
|
-
// Check if file already exists
|
|
454
|
-
if (existsSync(resolvedPath)) {
|
|
455
|
-
return {
|
|
456
|
-
success: false,
|
|
457
|
-
error: 'File already exists'
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
// Create parent directories if needed
|
|
462
|
-
const parentDir = dirname(resolvedPath)
|
|
463
|
-
if (!existsSync(parentDir)) {
|
|
464
|
-
mkdirSync(parentDir, { recursive: true })
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
// Create empty file
|
|
468
|
-
writeFileSync(resolvedPath, '', 'utf-8')
|
|
469
|
-
|
|
470
|
-
return {
|
|
471
|
-
success: true,
|
|
472
|
-
path: resolvedPath.replace(`${workingDir}/`, '')
|
|
473
|
-
}
|
|
474
|
-
} catch (error: unknown) {
|
|
475
|
-
console.error('[FileService] Error creating file:', error)
|
|
476
|
-
return {
|
|
477
|
-
success: false,
|
|
478
|
-
error: error instanceof Error ? error.message : 'Failed to create file'
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
/**
|
|
484
|
-
* Create a directory (recursively if needed).
|
|
485
|
-
* Returns error if directory already exists.
|
|
486
|
-
*
|
|
487
|
-
* @param dirPath - Directory path (relative to workingDir or absolute)
|
|
488
|
-
* @param workingDir - Working directory boundary
|
|
489
|
-
* @returns FileOperationResult
|
|
490
|
-
*/
|
|
491
|
-
export function createDirectory(
|
|
492
|
-
dirPath: string,
|
|
493
|
-
workingDir: string
|
|
494
|
-
): FileOperationResult {
|
|
495
|
-
// Check for dangerous patterns first
|
|
496
|
-
if (containsDangerousPatterns(dirPath)) {
|
|
497
|
-
console.error(`[FileService] SECURITY: Dangerous pattern in path: "${dirPath}"`)
|
|
498
|
-
return {
|
|
499
|
-
success: false,
|
|
500
|
-
error: 'Invalid path: contains dangerous patterns'
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
// Validate path is within working directory
|
|
505
|
-
const validation = validatePathWithinWorkingDir(dirPath, workingDir)
|
|
506
|
-
if (!validation.valid) {
|
|
507
|
-
return {
|
|
508
|
-
success: false,
|
|
509
|
-
error: validation.error
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
const resolvedPath = validation.resolvedPath
|
|
514
|
-
|
|
515
|
-
try {
|
|
516
|
-
// Check if path already exists
|
|
517
|
-
if (existsSync(resolvedPath)) {
|
|
518
|
-
const stats = statSync(resolvedPath)
|
|
519
|
-
if (stats.isDirectory()) {
|
|
520
|
-
return {
|
|
521
|
-
success: false,
|
|
522
|
-
error: 'Directory already exists'
|
|
523
|
-
}
|
|
524
|
-
} else {
|
|
525
|
-
return {
|
|
526
|
-
success: false,
|
|
527
|
-
error: 'A file with that name already exists'
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
// Create directory recursively
|
|
533
|
-
mkdirSync(resolvedPath, { recursive: true })
|
|
534
|
-
|
|
535
|
-
return {
|
|
536
|
-
success: true,
|
|
537
|
-
path: resolvedPath.replace(`${workingDir}/`, '')
|
|
538
|
-
}
|
|
539
|
-
} catch (error: unknown) {
|
|
540
|
-
console.error('[FileService] Error creating directory:', error)
|
|
541
|
-
return {
|
|
542
|
-
success: false,
|
|
543
|
-
error: error instanceof Error ? error.message : 'Failed to create directory'
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
/**
|
|
549
|
-
* Delete a file or EMPTY directory.
|
|
550
|
-
* For safety, only deletes empty directories.
|
|
551
|
-
*
|
|
552
|
-
* CRITICAL: Validates path is within workingDir to prevent path traversal.
|
|
553
|
-
*
|
|
554
|
-
* @param targetPath - Path to delete (relative to workingDir or absolute)
|
|
555
|
-
* @param workingDir - Working directory boundary
|
|
556
|
-
* @returns FileOperationResult
|
|
557
|
-
*/
|
|
558
|
-
export function deleteFile(
|
|
559
|
-
targetPath: string,
|
|
560
|
-
workingDir: string
|
|
561
|
-
): FileOperationResult {
|
|
562
|
-
// Check for dangerous patterns first
|
|
563
|
-
if (containsDangerousPatterns(targetPath)) {
|
|
564
|
-
console.error(`[FileService] SECURITY: Dangerous pattern in path: "${targetPath}"`)
|
|
565
|
-
return {
|
|
566
|
-
success: false,
|
|
567
|
-
error: 'Invalid path: contains dangerous patterns'
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
// Validate path is within working directory
|
|
572
|
-
const validation = validatePathWithinWorkingDir(targetPath, workingDir)
|
|
573
|
-
if (!validation.valid) {
|
|
574
|
-
return {
|
|
575
|
-
success: false,
|
|
576
|
-
error: validation.error
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
const resolvedPath = validation.resolvedPath
|
|
581
|
-
|
|
582
|
-
// Additional safety: prevent deleting the working directory itself
|
|
583
|
-
if (resolvedPath === workingDir || resolvedPath === `${workingDir}/`) {
|
|
584
|
-
console.error(`[FileService] SECURITY: Attempted to delete working directory: "${resolvedPath}"`)
|
|
585
|
-
return {
|
|
586
|
-
success: false,
|
|
587
|
-
error: 'Cannot delete the working directory'
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
try {
|
|
592
|
-
// Check if path exists
|
|
593
|
-
if (!existsSync(resolvedPath)) {
|
|
594
|
-
return {
|
|
595
|
-
success: false,
|
|
596
|
-
error: 'File or directory not found'
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
const stats = statSync(resolvedPath)
|
|
601
|
-
|
|
602
|
-
if (stats.isDirectory()) {
|
|
603
|
-
// Only delete empty directories for safety
|
|
604
|
-
const contents = readdirSync(resolvedPath)
|
|
605
|
-
if (contents.length > 0) {
|
|
606
|
-
return {
|
|
607
|
-
success: false,
|
|
608
|
-
error: 'Directory is not empty. Only empty directories can be deleted.'
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
rmdirSync(resolvedPath)
|
|
613
|
-
} else {
|
|
614
|
-
unlinkSync(resolvedPath)
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
return {
|
|
618
|
-
success: true,
|
|
619
|
-
path: resolvedPath.replace(`${workingDir}/`, '')
|
|
620
|
-
}
|
|
621
|
-
} catch (error: unknown) {
|
|
622
|
-
console.error('[FileService] Error deleting file:', error)
|
|
623
|
-
return {
|
|
624
|
-
success: false,
|
|
625
|
-
error: error instanceof Error ? error.message : 'Failed to delete'
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
/**
|
|
631
|
-
* Rename or move a file/directory.
|
|
632
|
-
* Both source and destination must be within workingDir.
|
|
633
|
-
*
|
|
634
|
-
* @param oldPath - Current path (relative to workingDir or absolute)
|
|
635
|
-
* @param newPath - New path (relative to workingDir or absolute)
|
|
636
|
-
* @param workingDir - Working directory boundary
|
|
637
|
-
* @returns FileOperationResult
|
|
638
|
-
*/
|
|
639
|
-
export function renameFile(
|
|
640
|
-
oldPath: string,
|
|
641
|
-
newPath: string,
|
|
642
|
-
workingDir: string
|
|
643
|
-
): FileOperationResult {
|
|
644
|
-
// Check for dangerous patterns in both paths
|
|
645
|
-
if (containsDangerousPatterns(oldPath)) {
|
|
646
|
-
console.error(`[FileService] SECURITY: Dangerous pattern in source path: "${oldPath}"`)
|
|
647
|
-
return {
|
|
648
|
-
success: false,
|
|
649
|
-
error: 'Invalid source path: contains dangerous patterns'
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
if (containsDangerousPatterns(newPath)) {
|
|
654
|
-
console.error(`[FileService] SECURITY: Dangerous pattern in destination path: "${newPath}"`)
|
|
655
|
-
return {
|
|
656
|
-
success: false,
|
|
657
|
-
error: 'Invalid destination path: contains dangerous patterns'
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
// Validate both paths are within working directory
|
|
662
|
-
const validation = validateBothPathsWithinWorkingDir(oldPath, newPath, workingDir)
|
|
663
|
-
if (!validation.valid) {
|
|
664
|
-
return {
|
|
665
|
-
success: false,
|
|
666
|
-
error: validation.error
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
const resolvedOldPath = validation.resolvedSourcePath
|
|
671
|
-
const resolvedNewPath = validation.resolvedDestPath
|
|
672
|
-
|
|
673
|
-
try {
|
|
674
|
-
// Check if source exists
|
|
675
|
-
if (!existsSync(resolvedOldPath)) {
|
|
676
|
-
return {
|
|
677
|
-
success: false,
|
|
678
|
-
error: 'Source file or directory not found'
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
// Check if destination already exists
|
|
683
|
-
if (existsSync(resolvedNewPath)) {
|
|
684
|
-
return {
|
|
685
|
-
success: false,
|
|
686
|
-
error: 'Destination already exists'
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
// Create parent directories for destination if needed
|
|
691
|
-
const parentDir = dirname(resolvedNewPath)
|
|
692
|
-
if (!existsSync(parentDir)) {
|
|
693
|
-
mkdirSync(parentDir, { recursive: true })
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
// Perform the rename
|
|
697
|
-
renameSync(resolvedOldPath, resolvedNewPath)
|
|
698
|
-
|
|
699
|
-
return {
|
|
700
|
-
success: true,
|
|
701
|
-
path: resolvedNewPath.replace(`${workingDir}/`, '')
|
|
702
|
-
}
|
|
703
|
-
} catch (error: unknown) {
|
|
704
|
-
console.error('[FileService] Error renaming file:', error)
|
|
705
|
-
return {
|
|
706
|
-
success: false,
|
|
707
|
-
error: error instanceof Error ? error.message : 'Failed to rename'
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
}
|
|
@@ -273,7 +273,8 @@ User request: ${userPrompt}`;
|
|
|
273
273
|
data: { message: 'Claude is planning your project...' },
|
|
274
274
|
});
|
|
275
275
|
|
|
276
|
-
const
|
|
276
|
+
const boardLogDir = cc.effectiveBoardId ? join(pmDir, 'boards', cc.effectiveBoardId, 'logs') : undefined;
|
|
277
|
+
const result = await runWithFileLogger('pm-compose', () => runner.run(), boardLogDir);
|
|
277
278
|
|
|
278
279
|
ctx.broadcastToAll({
|
|
279
280
|
type: 'planPromptProgress',
|
|
@@ -211,7 +211,8 @@ export class PlanExecutor extends EventEmitter {
|
|
|
211
211
|
},
|
|
212
212
|
});
|
|
213
213
|
|
|
214
|
-
const
|
|
214
|
+
const boardLogDir = this.boardDir ? join(this.boardDir, 'logs') : undefined;
|
|
215
|
+
const result = await runWithFileLogger('pm-execute-wave', () => runner.run(), boardLogDir);
|
|
215
216
|
|
|
216
217
|
if (!result.completed || result.error) {
|
|
217
218
|
this.emit('waveError', {
|
|
@@ -338,6 +339,7 @@ export class PlanExecutor extends EventEmitter {
|
|
|
338
339
|
pmDir,
|
|
339
340
|
outputPath,
|
|
340
341
|
onOutput: (text) => this.emit('output', { issueId: issue.id, text }),
|
|
342
|
+
logDir: this.boardDir ? join(this.boardDir, 'logs') : undefined,
|
|
341
343
|
});
|
|
342
344
|
persistReviewResult(reviewDir, issue, result);
|
|
343
345
|
|