aicodeman 0.2.8 → 0.3.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.
- package/README.md +91 -0
- package/dist/ai-idle-checker.d.ts.map +1 -1
- package/dist/ai-idle-checker.js +3 -2
- package/dist/ai-idle-checker.js.map +1 -1
- package/dist/ai-plan-checker.d.ts.map +1 -1
- package/dist/ai-plan-checker.js +3 -2
- package/dist/ai-plan-checker.js.map +1 -1
- package/dist/bash-tool-parser.d.ts +2 -3
- package/dist/bash-tool-parser.d.ts.map +1 -1
- package/dist/bash-tool-parser.js +14 -31
- package/dist/bash-tool-parser.js.map +1 -1
- package/dist/config/ai-defaults.d.ts +16 -0
- package/dist/config/ai-defaults.d.ts.map +1 -0
- package/dist/config/ai-defaults.js +16 -0
- package/dist/config/ai-defaults.js.map +1 -0
- package/dist/config/auth-config.d.ts +19 -0
- package/dist/config/auth-config.d.ts.map +1 -0
- package/dist/config/auth-config.js +28 -0
- package/dist/config/auth-config.js.map +1 -0
- package/dist/config/exec-timeout.d.ts +10 -0
- package/dist/config/exec-timeout.d.ts.map +1 -0
- package/dist/config/exec-timeout.js +10 -0
- package/dist/config/exec-timeout.js.map +1 -0
- package/dist/config/map-limits.d.ts +4 -0
- package/dist/config/map-limits.d.ts.map +1 -1
- package/dist/config/map-limits.js +7 -0
- package/dist/config/map-limits.js.map +1 -1
- package/dist/config/server-timing.d.ts +36 -0
- package/dist/config/server-timing.d.ts.map +1 -0
- package/dist/config/server-timing.js +51 -0
- package/dist/config/server-timing.js.map +1 -0
- package/dist/config/team-config.d.ts +16 -0
- package/dist/config/team-config.d.ts.map +1 -0
- package/dist/config/team-config.js +16 -0
- package/dist/config/team-config.js.map +1 -0
- package/dist/config/terminal-limits.d.ts +18 -0
- package/dist/config/terminal-limits.d.ts.map +1 -0
- package/dist/config/terminal-limits.js +18 -0
- package/dist/config/terminal-limits.js.map +1 -0
- package/dist/config/tunnel-config.d.ts +27 -0
- package/dist/config/tunnel-config.d.ts.map +1 -0
- package/dist/config/tunnel-config.js +36 -0
- package/dist/config/tunnel-config.js.map +1 -0
- package/dist/hooks-config.d.ts.map +1 -1
- package/dist/hooks-config.js +7 -6
- package/dist/hooks-config.js.map +1 -1
- package/dist/image-watcher.d.ts +4 -4
- package/dist/image-watcher.d.ts.map +1 -1
- package/dist/image-watcher.js +17 -30
- package/dist/image-watcher.js.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/plan-orchestrator.d.ts +2 -24
- package/dist/plan-orchestrator.d.ts.map +1 -1
- package/dist/plan-orchestrator.js.map +1 -1
- package/dist/push-store.d.ts +1 -1
- package/dist/push-store.d.ts.map +1 -1
- package/dist/push-store.js +4 -12
- package/dist/push-store.js.map +1 -1
- package/dist/ralph-fix-plan-watcher.d.ts +91 -0
- package/dist/ralph-fix-plan-watcher.d.ts.map +1 -0
- package/dist/ralph-fix-plan-watcher.js +326 -0
- package/dist/ralph-fix-plan-watcher.js.map +1 -0
- package/dist/ralph-plan-tracker.d.ts +201 -0
- package/dist/ralph-plan-tracker.d.ts.map +1 -0
- package/dist/ralph-plan-tracker.js +325 -0
- package/dist/ralph-plan-tracker.js.map +1 -0
- package/dist/ralph-stall-detector.d.ts +84 -0
- package/dist/ralph-stall-detector.d.ts.map +1 -0
- package/dist/ralph-stall-detector.js +139 -0
- package/dist/ralph-stall-detector.js.map +1 -0
- package/dist/ralph-status-parser.d.ts +141 -0
- package/dist/ralph-status-parser.d.ts.map +1 -0
- package/dist/ralph-status-parser.js +478 -0
- package/dist/ralph-status-parser.js.map +1 -0
- package/dist/ralph-tracker.d.ts +194 -685
- package/dist/ralph-tracker.d.ts.map +1 -1
- package/dist/ralph-tracker.js +349 -1713
- package/dist/ralph-tracker.js.map +1 -1
- package/dist/respawn-adaptive-timing.d.ts +61 -0
- package/dist/respawn-adaptive-timing.d.ts.map +1 -0
- package/dist/respawn-adaptive-timing.js +105 -0
- package/dist/respawn-adaptive-timing.js.map +1 -0
- package/dist/respawn-controller.d.ts +14 -101
- package/dist/respawn-controller.d.ts.map +1 -1
- package/dist/respawn-controller.js +155 -594
- package/dist/respawn-controller.js.map +1 -1
- package/dist/respawn-health.d.ts +54 -0
- package/dist/respawn-health.d.ts.map +1 -0
- package/dist/respawn-health.js +183 -0
- package/dist/respawn-health.js.map +1 -0
- package/dist/respawn-metrics.d.ts +81 -0
- package/dist/respawn-metrics.d.ts.map +1 -0
- package/dist/respawn-metrics.js +198 -0
- package/dist/respawn-metrics.js.map +1 -0
- package/dist/respawn-patterns.d.ts +45 -0
- package/dist/respawn-patterns.d.ts.map +1 -0
- package/dist/respawn-patterns.js +125 -0
- package/dist/respawn-patterns.js.map +1 -0
- package/dist/session-auto-ops.d.ts +89 -0
- package/dist/session-auto-ops.d.ts.map +1 -0
- package/dist/session-auto-ops.js +224 -0
- package/dist/session-auto-ops.js.map +1 -0
- package/dist/session-cli-builder.d.ts +62 -0
- package/dist/session-cli-builder.d.ts.map +1 -0
- package/dist/session-cli-builder.js +121 -0
- package/dist/session-cli-builder.js.map +1 -0
- package/dist/session-task-cache.d.ts +52 -0
- package/dist/session-task-cache.d.ts.map +1 -0
- package/dist/session-task-cache.js +90 -0
- package/dist/session-task-cache.js.map +1 -0
- package/dist/session.d.ts +2 -33
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +58 -309
- package/dist/session.js.map +1 -1
- package/dist/state-store.d.ts +9 -2
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +112 -39
- package/dist/state-store.js.map +1 -1
- package/dist/subagent-watcher.d.ts +16 -9
- package/dist/subagent-watcher.d.ts.map +1 -1
- package/dist/subagent-watcher.js +126 -147
- package/dist/subagent-watcher.js.map +1 -1
- package/dist/team-watcher.d.ts +3 -0
- package/dist/team-watcher.d.ts.map +1 -1
- package/dist/team-watcher.js +54 -5
- package/dist/team-watcher.js.map +1 -1
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +1 -2
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tunnel-manager.d.ts +26 -0
- package/dist/tunnel-manager.d.ts.map +1 -1
- package/dist/tunnel-manager.js +127 -7
- package/dist/tunnel-manager.js.map +1 -1
- package/dist/types/api.d.ts +93 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +83 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/app-state.d.ts +100 -0
- package/dist/types/app-state.d.ts.map +1 -0
- package/dist/types/app-state.js +59 -0
- package/dist/types/app-state.js.map +1 -0
- package/dist/types/common.d.ts +70 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +8 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lifecycle.d.ts +17 -0
- package/dist/types/lifecycle.d.ts.map +1 -0
- package/dist/types/lifecycle.js +5 -0
- package/dist/types/lifecycle.js.map +1 -0
- package/dist/types/plan.d.ts +32 -0
- package/dist/types/plan.d.ts.map +1 -0
- package/dist/types/plan.js +5 -0
- package/dist/types/plan.js.map +1 -0
- package/dist/types/push.d.ts +23 -0
- package/dist/types/push.d.ts.map +1 -0
- package/dist/types/push.js +5 -0
- package/dist/types/push.js.map +1 -0
- package/dist/types/ralph.d.ts +241 -0
- package/dist/types/ralph.d.ts.map +1 -0
- package/dist/types/ralph.js +49 -0
- package/dist/types/ralph.js.map +1 -0
- package/dist/types/respawn.d.ts +250 -0
- package/dist/types/respawn.d.ts.map +1 -0
- package/dist/types/respawn.js +5 -0
- package/dist/types/respawn.js.map +1 -0
- package/dist/types/run-summary.d.ts +81 -0
- package/dist/types/run-summary.d.ts.map +1 -0
- package/dist/types/run-summary.js +22 -0
- package/dist/types/run-summary.js.map +1 -0
- package/dist/types/session.d.ts +130 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +5 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/task.d.ts +58 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +5 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/teams.d.ts +55 -0
- package/dist/types/teams.d.ts.map +1 -0
- package/dist/types/teams.js +5 -0
- package/dist/types/teams.js.map +1 -0
- package/dist/types/tools.d.ts +46 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +5 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/types.d.ts +1 -1138
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -214
- package/dist/types.js.map +1 -1
- package/dist/utils/claude-cli-resolver.d.ts.map +1 -1
- package/dist/utils/claude-cli-resolver.js +1 -2
- package/dist/utils/claude-cli-resolver.js.map +1 -1
- package/dist/utils/debouncer.d.ts +111 -0
- package/dist/utils/debouncer.d.ts.map +1 -0
- package/dist/utils/debouncer.js +162 -0
- package/dist/utils/debouncer.js.map +1 -0
- package/dist/utils/index.d.ts +3 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/opencode-cli-resolver.d.ts.map +1 -1
- package/dist/utils/opencode-cli-resolver.js +1 -2
- package/dist/utils/opencode-cli-resolver.js.map +1 -1
- package/dist/utils/string-similarity.d.ts +0 -57
- package/dist/utils/string-similarity.d.ts.map +1 -1
- package/dist/utils/string-similarity.js +3 -18
- package/dist/utils/string-similarity.js.map +1 -1
- package/dist/web/middleware/auth.d.ts +31 -0
- package/dist/web/middleware/auth.d.ts.map +1 -0
- package/dist/web/middleware/auth.js +154 -0
- package/dist/web/middleware/auth.js.map +1 -0
- package/dist/web/ports/auth-port.d.ts +18 -0
- package/dist/web/ports/auth-port.d.ts.map +1 -0
- package/dist/web/ports/auth-port.js +6 -0
- package/dist/web/ports/auth-port.js.map +1 -0
- package/dist/web/ports/config-port.d.ts +28 -0
- package/dist/web/ports/config-port.d.ts.map +1 -0
- package/dist/web/ports/config-port.js +6 -0
- package/dist/web/ports/config-port.js.map +1 -0
- package/dist/web/ports/event-port.d.ts +13 -0
- package/dist/web/ports/event-port.d.ts.map +1 -0
- package/dist/web/ports/event-port.js +6 -0
- package/dist/web/ports/event-port.js.map +1 -0
- package/dist/web/ports/index.d.ts +14 -0
- package/dist/web/ports/index.d.ts.map +1 -0
- package/dist/web/ports/index.js +9 -0
- package/dist/web/ports/index.js.map +1 -0
- package/dist/web/ports/infra-port.d.ts +36 -0
- package/dist/web/ports/infra-port.d.ts.map +1 -0
- package/dist/web/ports/infra-port.js +6 -0
- package/dist/web/ports/infra-port.js.map +1 -0
- package/dist/web/ports/respawn-port.d.ts +20 -0
- package/dist/web/ports/respawn-port.d.ts.map +1 -0
- package/dist/web/ports/respawn-port.js +6 -0
- package/dist/web/ports/respawn-port.js.map +1 -0
- package/dist/web/ports/session-port.d.ts +15 -0
- package/dist/web/ports/session-port.d.ts.map +1 -0
- package/dist/web/ports/session-port.js +6 -0
- package/dist/web/ports/session-port.js.map +1 -0
- package/dist/web/public/api-client.js +70 -0
- package/dist/web/public/api-client.js.br +0 -0
- package/dist/web/public/api-client.js.gz +0 -0
- package/dist/web/public/app.js +152 -236
- package/dist/web/public/app.js.br +0 -0
- package/dist/web/public/app.js.gz +0 -0
- package/dist/web/public/constants.js +238 -0
- package/dist/web/public/constants.js.br +0 -0
- package/dist/web/public/constants.js.gz +0 -0
- package/dist/web/public/index.html +11 -3
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/keyboard-accessory.js +279 -0
- package/dist/web/public/keyboard-accessory.js.br +0 -0
- package/dist/web/public/keyboard-accessory.js.gz +0 -0
- package/dist/web/public/mobile-handlers.js +467 -0
- package/dist/web/public/mobile-handlers.js.br +0 -0
- package/dist/web/public/mobile-handlers.js.gz +0 -0
- package/dist/web/public/mobile.css.gz +0 -0
- package/dist/web/public/notification-manager.js +445 -0
- package/dist/web/public/notification-manager.js.br +0 -0
- package/dist/web/public/notification-manager.js.gz +0 -0
- package/dist/web/public/ralph-wizard.js +3 -3
- package/dist/web/public/ralph-wizard.js.br +0 -0
- package/dist/web/public/ralph-wizard.js.gz +0 -0
- package/dist/web/public/styles.css.gz +0 -0
- package/dist/web/public/subagent-windows.js +1115 -0
- package/dist/web/public/subagent-windows.js.br +0 -0
- package/dist/web/public/subagent-windows.js.gz +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.js +858 -0
- package/dist/web/public/voice-input.js.br +0 -0
- package/dist/web/public/voice-input.js.gz +0 -0
- package/dist/web/route-helpers.d.ts +38 -0
- package/dist/web/route-helpers.d.ts.map +1 -0
- package/dist/web/route-helpers.js +143 -0
- package/dist/web/route-helpers.js.map +1 -0
- package/dist/web/routes/case-routes.d.ts +9 -0
- package/dist/web/routes/case-routes.d.ts.map +1 -0
- package/dist/web/routes/case-routes.js +419 -0
- package/dist/web/routes/case-routes.js.map +1 -0
- package/dist/web/routes/file-routes.d.ts +8 -0
- package/dist/web/routes/file-routes.d.ts.map +1 -0
- package/dist/web/routes/file-routes.js +337 -0
- package/dist/web/routes/file-routes.js.map +1 -0
- package/dist/web/routes/hook-event-routes.d.ts +9 -0
- package/dist/web/routes/hook-event-routes.d.ts.map +1 -0
- package/dist/web/routes/hook-event-routes.js +57 -0
- package/dist/web/routes/hook-event-routes.js.map +1 -0
- package/dist/web/routes/index.d.ts +16 -0
- package/dist/web/routes/index.d.ts.map +1 -0
- package/dist/web/routes/index.js +16 -0
- package/dist/web/routes/index.js.map +1 -0
- package/dist/web/routes/mux-routes.d.ts +8 -0
- package/dist/web/routes/mux-routes.d.ts.map +1 -0
- package/dist/web/routes/mux-routes.js +32 -0
- package/dist/web/routes/mux-routes.js.map +1 -0
- package/dist/web/routes/plan-routes.d.ts +9 -0
- package/dist/web/routes/plan-routes.d.ts.map +1 -0
- package/dist/web/routes/plan-routes.js +381 -0
- package/dist/web/routes/plan-routes.js.map +1 -0
- package/dist/web/routes/push-routes.d.ts +8 -0
- package/dist/web/routes/push-routes.d.ts.map +1 -0
- package/dist/web/routes/push-routes.js +49 -0
- package/dist/web/routes/push-routes.js.map +1 -0
- package/dist/web/routes/ralph-routes.d.ts +9 -0
- package/dist/web/routes/ralph-routes.d.ts.map +1 -0
- package/dist/web/routes/ralph-routes.js +475 -0
- package/dist/web/routes/ralph-routes.js.map +1 -0
- package/dist/web/routes/respawn-routes.d.ts +8 -0
- package/dist/web/routes/respawn-routes.d.ts.map +1 -0
- package/dist/web/routes/respawn-routes.js +260 -0
- package/dist/web/routes/respawn-routes.js.map +1 -0
- package/dist/web/routes/scheduled-routes.d.ts +8 -0
- package/dist/web/routes/scheduled-routes.d.ts.map +1 -0
- package/dist/web/routes/scheduled-routes.js +51 -0
- package/dist/web/routes/scheduled-routes.js.map +1 -0
- package/dist/web/routes/session-routes.d.ts +9 -0
- package/dist/web/routes/session-routes.d.ts.map +1 -0
- package/dist/web/routes/session-routes.js +729 -0
- package/dist/web/routes/session-routes.js.map +1 -0
- package/dist/web/routes/system-routes.d.ts +9 -0
- package/dist/web/routes/system-routes.d.ts.map +1 -0
- package/dist/web/routes/system-routes.js +678 -0
- package/dist/web/routes/system-routes.js.map +1 -0
- package/dist/web/routes/team-routes.d.ts +8 -0
- package/dist/web/routes/team-routes.d.ts.map +1 -0
- package/dist/web/routes/team-routes.js +14 -0
- package/dist/web/routes/team-routes.js.map +1 -0
- package/dist/web/schemas.d.ts +43 -3
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +6 -2
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/server.d.ts +10 -9
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +342 -3829
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
package/dist/push-store.js
CHANGED
|
@@ -9,6 +9,7 @@ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
|
9
9
|
import { join } from 'node:path';
|
|
10
10
|
import { homedir } from 'node:os';
|
|
11
11
|
import webpush from 'web-push';
|
|
12
|
+
import { Debouncer } from './utils/index.js';
|
|
12
13
|
const DATA_DIR = join(homedir(), '.codeman');
|
|
13
14
|
const KEYS_FILE = join(DATA_DIR, 'push-keys.json');
|
|
14
15
|
const SUBS_FILE = join(DATA_DIR, 'push-subscriptions.json');
|
|
@@ -16,7 +17,7 @@ const SAVE_DEBOUNCE_MS = 500;
|
|
|
16
17
|
export class PushSubscriptionStore {
|
|
17
18
|
vapidKeys = null;
|
|
18
19
|
subscriptions = new Map();
|
|
19
|
-
|
|
20
|
+
saveDeb = new Debouncer(SAVE_DEBOUNCE_MS);
|
|
20
21
|
_disposed = false;
|
|
21
22
|
constructor() {
|
|
22
23
|
this.loadSubscriptions();
|
|
@@ -136,11 +137,7 @@ export class PushSubscriptionStore {
|
|
|
136
137
|
scheduleSave() {
|
|
137
138
|
if (this._disposed)
|
|
138
139
|
return;
|
|
139
|
-
|
|
140
|
-
clearTimeout(this.saveTimer);
|
|
141
|
-
this.saveTimer = setTimeout(() => {
|
|
142
|
-
this.flushSave();
|
|
143
|
-
}, SAVE_DEBOUNCE_MS);
|
|
140
|
+
this.saveDeb.schedule(() => this.flushSave());
|
|
144
141
|
}
|
|
145
142
|
/** Immediately persist subscriptions to disk */
|
|
146
143
|
flushSave() {
|
|
@@ -157,12 +154,7 @@ export class PushSubscriptionStore {
|
|
|
157
154
|
if (this._disposed)
|
|
158
155
|
return;
|
|
159
156
|
this._disposed = true;
|
|
160
|
-
|
|
161
|
-
clearTimeout(this.saveTimer);
|
|
162
|
-
this.saveTimer = null;
|
|
163
|
-
}
|
|
164
|
-
// Final flush
|
|
165
|
-
this.flushSave();
|
|
157
|
+
this.saveDeb.flush(() => this.flushSave());
|
|
166
158
|
}
|
|
167
159
|
}
|
|
168
160
|
//# sourceMappingURL=push-store.js.map
|
package/dist/push-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-store.js","sourceRoot":"","sources":["../src/push-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,OAAO,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"push-store.js","sourceRoot":"","sources":["../src/push-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview RalphFixPlanWatcher - Watches @fix_plan.md for changes
|
|
3
|
+
*
|
|
4
|
+
* Monitors the @fix_plan.md file in the session's working directory
|
|
5
|
+
* for changes, parsing todo items from the markdown format.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from ralph-tracker.ts as part of domain splitting.
|
|
8
|
+
*
|
|
9
|
+
* @module ralph-fix-plan-watcher
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'node:events';
|
|
12
|
+
import type { RalphTodoPriority, RalphTodoItem } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Generate @fix_plan.md content from todo items.
|
|
15
|
+
* Groups todos by priority and status.
|
|
16
|
+
*
|
|
17
|
+
* @param todos - Array of todo items
|
|
18
|
+
* @returns Markdown content for @fix_plan.md
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateFixPlanMarkdown(todos: RalphTodoItem[]): string;
|
|
21
|
+
/**
|
|
22
|
+
* Parse @fix_plan.md content and return parsed todo items.
|
|
23
|
+
*
|
|
24
|
+
* @param content - Markdown content from @fix_plan.md
|
|
25
|
+
* @param parsePriority - Function to parse priority from content text
|
|
26
|
+
* @param generateTodoId - Function to generate stable todo ID from content
|
|
27
|
+
* @returns Array of parsed todo items
|
|
28
|
+
*/
|
|
29
|
+
export declare function importFixPlanMarkdown(content: string, parsePriority: (content: string) => RalphTodoPriority, generateTodoId: (content: string) => string): RalphTodoItem[];
|
|
30
|
+
/**
|
|
31
|
+
* RalphFixPlanWatcher - Watches @fix_plan.md for changes.
|
|
32
|
+
*
|
|
33
|
+
* Events emitted:
|
|
34
|
+
* - `todosLoaded` - Emits parsed todo items when @fix_plan.md is loaded/changed
|
|
35
|
+
* - `enabled` - Emits when tracker should be auto-enabled (todos loaded from file)
|
|
36
|
+
*/
|
|
37
|
+
export declare class RalphFixPlanWatcher extends EventEmitter {
|
|
38
|
+
/** Working directory for @fix_plan.md watching */
|
|
39
|
+
private _workingDir;
|
|
40
|
+
/** Path to the @fix_plan.md file being watched */
|
|
41
|
+
private _fixPlanPath;
|
|
42
|
+
/** File watcher for @fix_plan.md */
|
|
43
|
+
private _fixPlanWatcher;
|
|
44
|
+
/** Error handler for FSWatcher (stored for cleanup to prevent memory leak) */
|
|
45
|
+
private _fixPlanWatcherErrorHandler;
|
|
46
|
+
/** Debounce timer for file change events */
|
|
47
|
+
private _fixPlanReloadTimer;
|
|
48
|
+
/** Priority parser injected from parent (for importFixPlanMarkdown) */
|
|
49
|
+
private _parsePriority;
|
|
50
|
+
/** Todo ID generator injected from parent */
|
|
51
|
+
private _generateTodoId;
|
|
52
|
+
constructor(parsePriority: (content: string) => RalphTodoPriority, generateTodoId: (content: string) => string);
|
|
53
|
+
/**
|
|
54
|
+
* When @fix_plan.md is active, treat it as the source of truth for todo status.
|
|
55
|
+
* This prevents output-based detection from overriding file-based status.
|
|
56
|
+
*/
|
|
57
|
+
get isFileAuthoritative(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Set the working directory and start watching @fix_plan.md.
|
|
60
|
+
* Automatically loads existing @fix_plan.md if present.
|
|
61
|
+
* @param workingDir - The session's working directory
|
|
62
|
+
*/
|
|
63
|
+
setWorkingDir(workingDir: string): void;
|
|
64
|
+
/**
|
|
65
|
+
* Load @fix_plan.md from disk if it exists.
|
|
66
|
+
* Called on initialization and when file changes are detected.
|
|
67
|
+
*/
|
|
68
|
+
loadFixPlanFromDisk(): Promise<number>;
|
|
69
|
+
/**
|
|
70
|
+
* Start watching @fix_plan.md for changes.
|
|
71
|
+
* Reloads todos when the file is modified.
|
|
72
|
+
*/
|
|
73
|
+
private startWatchingFixPlan;
|
|
74
|
+
/**
|
|
75
|
+
* Handle @fix_plan.md file change with debouncing.
|
|
76
|
+
*/
|
|
77
|
+
private handleFixPlanChange;
|
|
78
|
+
/**
|
|
79
|
+
* Stop watching @fix_plan.md.
|
|
80
|
+
*/
|
|
81
|
+
stopWatchingFixPlan(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Stop watching and clean up all resources.
|
|
84
|
+
*/
|
|
85
|
+
stop(): void;
|
|
86
|
+
/**
|
|
87
|
+
* Clean up all resources.
|
|
88
|
+
*/
|
|
89
|
+
destroy(): void;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=ralph-fix-plan-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralph-fix-plan-watcher.d.ts","sourceRoot":"","sources":["../src/ralph-fix-plan-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EAAmB,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIpF;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CA0EtE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,iBAAiB,EACrD,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAC1C,aAAa,EAAE,CA2EjB;AAED;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,kDAAkD;IAClD,OAAO,CAAC,WAAW,CAAuB;IAE1C,kDAAkD;IAClD,OAAO,CAAC,YAAY,CAAuB;IAE3C,oCAAoC;IACpC,OAAO,CAAC,eAAe,CAA0B;IAEjD,8EAA8E;IAC9E,OAAO,CAAC,2BAA2B,CAAuC;IAE1E,4CAA4C;IAC5C,OAAO,CAAC,mBAAmB,CAA+B;IAE1D,uEAAuE;IACvE,OAAO,CAAC,cAAc,CAAyC;IAE/D,6CAA6C;IAC7C,OAAO,CAAC,eAAe,CAA8B;gBAEzC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,iBAAiB,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM;IAM9G;;;OAGG;IACH,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED;;;;OAIG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAWvC;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAwB5C;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAmC5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAgB3B;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview RalphFixPlanWatcher - Watches @fix_plan.md for changes
|
|
3
|
+
*
|
|
4
|
+
* Monitors the @fix_plan.md file in the session's working directory
|
|
5
|
+
* for changes, parsing todo items from the markdown format.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from ralph-tracker.ts as part of domain splitting.
|
|
8
|
+
*
|
|
9
|
+
* @module ralph-fix-plan-watcher
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'node:events';
|
|
12
|
+
import { readFile } from 'node:fs/promises';
|
|
13
|
+
import { existsSync, watch as fsWatch } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
// ========== @fix_plan.md Generation & Import Utility Functions ==========
|
|
16
|
+
/**
|
|
17
|
+
* Generate @fix_plan.md content from todo items.
|
|
18
|
+
* Groups todos by priority and status.
|
|
19
|
+
*
|
|
20
|
+
* @param todos - Array of todo items
|
|
21
|
+
* @returns Markdown content for @fix_plan.md
|
|
22
|
+
*/
|
|
23
|
+
export function generateFixPlanMarkdown(todos) {
|
|
24
|
+
const lines = ['# Fix Plan', ''];
|
|
25
|
+
// Group by priority
|
|
26
|
+
const p0 = [];
|
|
27
|
+
const p1 = [];
|
|
28
|
+
const p2 = [];
|
|
29
|
+
const noPriority = [];
|
|
30
|
+
const completed = [];
|
|
31
|
+
for (const todo of todos) {
|
|
32
|
+
if (todo.status === 'completed') {
|
|
33
|
+
completed.push(todo);
|
|
34
|
+
}
|
|
35
|
+
else if (todo.priority === 'P0') {
|
|
36
|
+
p0.push(todo);
|
|
37
|
+
}
|
|
38
|
+
else if (todo.priority === 'P1') {
|
|
39
|
+
p1.push(todo);
|
|
40
|
+
}
|
|
41
|
+
else if (todo.priority === 'P2') {
|
|
42
|
+
p2.push(todo);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
noPriority.push(todo);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// High Priority (P0)
|
|
49
|
+
if (p0.length > 0) {
|
|
50
|
+
lines.push('## High Priority (P0)');
|
|
51
|
+
for (const todo of p0) {
|
|
52
|
+
const checkbox = todo.status === 'in_progress' ? '[-]' : '[ ]';
|
|
53
|
+
lines.push(`- ${checkbox} ${todo.content}`);
|
|
54
|
+
}
|
|
55
|
+
lines.push('');
|
|
56
|
+
}
|
|
57
|
+
// Standard (P1)
|
|
58
|
+
if (p1.length > 0) {
|
|
59
|
+
lines.push('## Standard (P1)');
|
|
60
|
+
for (const todo of p1) {
|
|
61
|
+
const checkbox = todo.status === 'in_progress' ? '[-]' : '[ ]';
|
|
62
|
+
lines.push(`- ${checkbox} ${todo.content}`);
|
|
63
|
+
}
|
|
64
|
+
lines.push('');
|
|
65
|
+
}
|
|
66
|
+
// Nice to Have (P2)
|
|
67
|
+
if (p2.length > 0) {
|
|
68
|
+
lines.push('## Nice to Have (P2)');
|
|
69
|
+
for (const todo of p2) {
|
|
70
|
+
const checkbox = todo.status === 'in_progress' ? '[-]' : '[ ]';
|
|
71
|
+
lines.push(`- ${checkbox} ${todo.content}`);
|
|
72
|
+
}
|
|
73
|
+
lines.push('');
|
|
74
|
+
}
|
|
75
|
+
// Tasks (no priority)
|
|
76
|
+
if (noPriority.length > 0) {
|
|
77
|
+
lines.push('## Tasks');
|
|
78
|
+
for (const todo of noPriority) {
|
|
79
|
+
const checkbox = todo.status === 'in_progress' ? '[-]' : '[ ]';
|
|
80
|
+
lines.push(`- ${checkbox} ${todo.content}`);
|
|
81
|
+
}
|
|
82
|
+
lines.push('');
|
|
83
|
+
}
|
|
84
|
+
// Completed
|
|
85
|
+
if (completed.length > 0) {
|
|
86
|
+
lines.push('## Completed');
|
|
87
|
+
for (const todo of completed) {
|
|
88
|
+
lines.push(`- [x] ${todo.content}`);
|
|
89
|
+
}
|
|
90
|
+
lines.push('');
|
|
91
|
+
}
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Parse @fix_plan.md content and return parsed todo items.
|
|
96
|
+
*
|
|
97
|
+
* @param content - Markdown content from @fix_plan.md
|
|
98
|
+
* @param parsePriority - Function to parse priority from content text
|
|
99
|
+
* @param generateTodoId - Function to generate stable todo ID from content
|
|
100
|
+
* @returns Array of parsed todo items
|
|
101
|
+
*/
|
|
102
|
+
export function importFixPlanMarkdown(content, parsePriority, generateTodoId) {
|
|
103
|
+
const lines = content.split('\n');
|
|
104
|
+
const newTodos = [];
|
|
105
|
+
let currentPriority = null;
|
|
106
|
+
// Patterns for section headers
|
|
107
|
+
const p0HeaderPattern = /^##\s*(High Priority|Critical|P0)/i;
|
|
108
|
+
const p1HeaderPattern = /^##\s*(Standard|P1|Medium Priority)/i;
|
|
109
|
+
const p2HeaderPattern = /^##\s*(Nice to Have|P2|Low Priority)/i;
|
|
110
|
+
const completedHeaderPattern = /^##\s*Completed/i;
|
|
111
|
+
const tasksHeaderPattern = /^##\s*Tasks/i;
|
|
112
|
+
// Pattern for todo items
|
|
113
|
+
const todoPattern = /^-\s*\[([ x-])\]\s*(.+)$/;
|
|
114
|
+
let inCompletedSection = false;
|
|
115
|
+
for (const line of lines) {
|
|
116
|
+
const trimmed = line.trim();
|
|
117
|
+
// Check for section headers
|
|
118
|
+
if (p0HeaderPattern.test(trimmed)) {
|
|
119
|
+
currentPriority = 'P0';
|
|
120
|
+
inCompletedSection = false;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (p1HeaderPattern.test(trimmed)) {
|
|
124
|
+
currentPriority = 'P1';
|
|
125
|
+
inCompletedSection = false;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (p2HeaderPattern.test(trimmed)) {
|
|
129
|
+
currentPriority = 'P2';
|
|
130
|
+
inCompletedSection = false;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (completedHeaderPattern.test(trimmed)) {
|
|
134
|
+
inCompletedSection = true;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (tasksHeaderPattern.test(trimmed)) {
|
|
138
|
+
currentPriority = null;
|
|
139
|
+
inCompletedSection = false;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
// Parse todo item
|
|
143
|
+
const match = trimmed.match(todoPattern);
|
|
144
|
+
if (match) {
|
|
145
|
+
const [, checkboxState, todoContent] = match;
|
|
146
|
+
let status;
|
|
147
|
+
if (inCompletedSection || checkboxState === 'x' || checkboxState === 'X') {
|
|
148
|
+
status = 'completed';
|
|
149
|
+
}
|
|
150
|
+
else if (checkboxState === '-') {
|
|
151
|
+
status = 'in_progress';
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
status = 'pending';
|
|
155
|
+
}
|
|
156
|
+
// Parse priority from content if not in a priority section
|
|
157
|
+
const parsedPriority = inCompletedSection ? null : currentPriority || parsePriority(todoContent);
|
|
158
|
+
const id = generateTodoId(todoContent);
|
|
159
|
+
newTodos.push({
|
|
160
|
+
id,
|
|
161
|
+
content: todoContent.trim(),
|
|
162
|
+
status,
|
|
163
|
+
detectedAt: Date.now(),
|
|
164
|
+
priority: parsedPriority,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return newTodos;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* RalphFixPlanWatcher - Watches @fix_plan.md for changes.
|
|
172
|
+
*
|
|
173
|
+
* Events emitted:
|
|
174
|
+
* - `todosLoaded` - Emits parsed todo items when @fix_plan.md is loaded/changed
|
|
175
|
+
* - `enabled` - Emits when tracker should be auto-enabled (todos loaded from file)
|
|
176
|
+
*/
|
|
177
|
+
export class RalphFixPlanWatcher extends EventEmitter {
|
|
178
|
+
/** Working directory for @fix_plan.md watching */
|
|
179
|
+
_workingDir = null;
|
|
180
|
+
/** Path to the @fix_plan.md file being watched */
|
|
181
|
+
_fixPlanPath = null;
|
|
182
|
+
/** File watcher for @fix_plan.md */
|
|
183
|
+
_fixPlanWatcher = null;
|
|
184
|
+
/** Error handler for FSWatcher (stored for cleanup to prevent memory leak) */
|
|
185
|
+
_fixPlanWatcherErrorHandler = null;
|
|
186
|
+
/** Debounce timer for file change events */
|
|
187
|
+
_fixPlanReloadTimer = null;
|
|
188
|
+
/** Priority parser injected from parent (for importFixPlanMarkdown) */
|
|
189
|
+
_parsePriority;
|
|
190
|
+
/** Todo ID generator injected from parent */
|
|
191
|
+
_generateTodoId;
|
|
192
|
+
constructor(parsePriority, generateTodoId) {
|
|
193
|
+
super();
|
|
194
|
+
this._parsePriority = parsePriority;
|
|
195
|
+
this._generateTodoId = generateTodoId;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* When @fix_plan.md is active, treat it as the source of truth for todo status.
|
|
199
|
+
* This prevents output-based detection from overriding file-based status.
|
|
200
|
+
*/
|
|
201
|
+
get isFileAuthoritative() {
|
|
202
|
+
return this._fixPlanPath !== null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Set the working directory and start watching @fix_plan.md.
|
|
206
|
+
* Automatically loads existing @fix_plan.md if present.
|
|
207
|
+
* @param workingDir - The session's working directory
|
|
208
|
+
*/
|
|
209
|
+
setWorkingDir(workingDir) {
|
|
210
|
+
this._workingDir = workingDir;
|
|
211
|
+
this._fixPlanPath = join(workingDir, '@fix_plan.md');
|
|
212
|
+
// Try to load existing @fix_plan.md
|
|
213
|
+
this.loadFixPlanFromDisk();
|
|
214
|
+
// Start watching for changes
|
|
215
|
+
this.startWatchingFixPlan();
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Load @fix_plan.md from disk if it exists.
|
|
219
|
+
* Called on initialization and when file changes are detected.
|
|
220
|
+
*/
|
|
221
|
+
async loadFixPlanFromDisk() {
|
|
222
|
+
if (!this._fixPlanPath)
|
|
223
|
+
return 0;
|
|
224
|
+
try {
|
|
225
|
+
if (!existsSync(this._fixPlanPath)) {
|
|
226
|
+
return 0;
|
|
227
|
+
}
|
|
228
|
+
const content = await readFile(this._fixPlanPath, 'utf-8');
|
|
229
|
+
const todos = importFixPlanMarkdown(content, this._parsePriority, this._generateTodoId);
|
|
230
|
+
if (todos.length > 0) {
|
|
231
|
+
this.emit('todosLoaded', todos);
|
|
232
|
+
console.log(`[RalphFixPlanWatcher] Loaded ${todos.length} todos from @fix_plan.md`);
|
|
233
|
+
}
|
|
234
|
+
return todos.length;
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
// File doesn't exist or can't be read - that's OK
|
|
238
|
+
console.log(`[RalphFixPlanWatcher] Could not load @fix_plan.md: ${err}`);
|
|
239
|
+
return 0;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Start watching @fix_plan.md for changes.
|
|
244
|
+
* Reloads todos when the file is modified.
|
|
245
|
+
*/
|
|
246
|
+
startWatchingFixPlan() {
|
|
247
|
+
if (!this._fixPlanPath || !this._workingDir)
|
|
248
|
+
return;
|
|
249
|
+
// Stop existing watcher if any
|
|
250
|
+
this.stopWatchingFixPlan();
|
|
251
|
+
try {
|
|
252
|
+
// Only watch if the file exists
|
|
253
|
+
if (!existsSync(this._fixPlanPath)) {
|
|
254
|
+
// Watch the directory instead for file creation
|
|
255
|
+
this._fixPlanWatcher = fsWatch(this._workingDir, (_eventType, filename) => {
|
|
256
|
+
if (filename === '@fix_plan.md') {
|
|
257
|
+
this.handleFixPlanChange();
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
// Watch the file directly
|
|
263
|
+
this._fixPlanWatcher = fsWatch(this._fixPlanPath, () => {
|
|
264
|
+
this.handleFixPlanChange();
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// Add error handler to prevent unhandled errors and clean up on failure
|
|
268
|
+
// Store handler reference for proper cleanup in stopWatchingFixPlan()
|
|
269
|
+
if (this._fixPlanWatcher) {
|
|
270
|
+
this._fixPlanWatcherErrorHandler = (err) => {
|
|
271
|
+
console.log(`[RalphFixPlanWatcher] FSWatcher error for @fix_plan.md: ${err.message}`);
|
|
272
|
+
this.stopWatchingFixPlan();
|
|
273
|
+
};
|
|
274
|
+
this._fixPlanWatcher.on('error', this._fixPlanWatcherErrorHandler);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
console.log(`[RalphFixPlanWatcher] Could not watch @fix_plan.md: ${err}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Handle @fix_plan.md file change with debouncing.
|
|
283
|
+
*/
|
|
284
|
+
handleFixPlanChange() {
|
|
285
|
+
// Debounce rapid changes (e.g., multiple writes)
|
|
286
|
+
if (this._fixPlanReloadTimer) {
|
|
287
|
+
clearTimeout(this._fixPlanReloadTimer);
|
|
288
|
+
}
|
|
289
|
+
this._fixPlanReloadTimer = setTimeout(() => {
|
|
290
|
+
this._fixPlanReloadTimer = null;
|
|
291
|
+
this.loadFixPlanFromDisk();
|
|
292
|
+
}, 500); // 500ms debounce
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Stop watching @fix_plan.md.
|
|
296
|
+
*/
|
|
297
|
+
stopWatchingFixPlan() {
|
|
298
|
+
if (this._fixPlanWatcher) {
|
|
299
|
+
// Remove error handler before closing to prevent memory leak
|
|
300
|
+
if (this._fixPlanWatcherErrorHandler) {
|
|
301
|
+
this._fixPlanWatcher.off('error', this._fixPlanWatcherErrorHandler);
|
|
302
|
+
this._fixPlanWatcherErrorHandler = null;
|
|
303
|
+
}
|
|
304
|
+
this._fixPlanWatcher.close();
|
|
305
|
+
this._fixPlanWatcher = null;
|
|
306
|
+
}
|
|
307
|
+
if (this._fixPlanReloadTimer) {
|
|
308
|
+
clearTimeout(this._fixPlanReloadTimer);
|
|
309
|
+
this._fixPlanReloadTimer = null;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Stop watching and clean up all resources.
|
|
314
|
+
*/
|
|
315
|
+
stop() {
|
|
316
|
+
this.stopWatchingFixPlan();
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Clean up all resources.
|
|
320
|
+
*/
|
|
321
|
+
destroy() {
|
|
322
|
+
this.stop();
|
|
323
|
+
this.removeAllListeners();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=ralph-fix-plan-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralph-fix-plan-watcher.js","sourceRoot":"","sources":["../src/ralph-fix-plan-watcher.ts"],"names":[],"mappings":"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"}
|