sudocode 1.1.17 → 1.1.18-dev.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/node_modules/@sudocode-ai/cli/README.md +330 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/feedback-commands.d.ts +53 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/feedback-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/feedback-commands.js +339 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/feedback-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/init-commands.d.ts +20 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/init-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/init-commands.js +145 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/init-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/issue-commands.d.ts +46 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/issue-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/issue-commands.js +353 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/issue-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/merge-commands.d.ts +42 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/merge-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/merge-commands.js +405 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/merge-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/plugin-commands.d.ts +62 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/plugin-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/plugin-commands.js +595 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/plugin-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/query-commands.d.ts +18 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/query-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/query-commands.js +61 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/query-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/reference-commands.d.ts +22 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/reference-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/reference-commands.js +136 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/reference-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/relationship-commands.d.ts +14 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/relationship-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/relationship-commands.js +83 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/relationship-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/server-commands.d.ts +17 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/server-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/server-commands.js +123 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/server-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/spec-commands.d.ts +38 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/spec-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/spec-commands.js +326 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/spec-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/status-commands.d.ts +17 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/status-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/status-commands.js +131 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/status-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/sync-commands.d.ts +24 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/sync-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/sync-commands.js +429 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/sync-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/update-commands.d.ts +16 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/update-commands.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/update-commands.js +160 -0
- package/node_modules/@sudocode-ai/cli/dist/cli/update-commands.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli.d.ts +6 -0
- package/node_modules/@sudocode-ai/cli/dist/cli.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/cli.js +543 -0
- package/node_modules/@sudocode-ai/cli/dist/cli.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/config.d.ts +50 -0
- package/node_modules/@sudocode-ai/cli/dist/config.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/config.js +76 -0
- package/node_modules/@sudocode-ai/cli/dist/config.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/db.d.ts +21 -0
- package/node_modules/@sudocode-ai/cli/dist/db.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/db.js +55 -0
- package/node_modules/@sudocode-ai/cli/dist/db.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/export.d.ts +84 -0
- package/node_modules/@sudocode-ai/cli/dist/export.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/export.js +265 -0
- package/node_modules/@sudocode-ai/cli/dist/export.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/filename-generator.d.ts +31 -0
- package/node_modules/@sudocode-ai/cli/dist/filename-generator.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/filename-generator.js +103 -0
- package/node_modules/@sudocode-ai/cli/dist/filename-generator.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/id-generator.d.ts +63 -0
- package/node_modules/@sudocode-ai/cli/dist/id-generator.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/id-generator.js +196 -0
- package/node_modules/@sudocode-ai/cli/dist/id-generator.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/import.d.ts +134 -0
- package/node_modules/@sudocode-ai/cli/dist/import.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/import.js +751 -0
- package/node_modules/@sudocode-ai/cli/dist/import.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/index.d.ts +15 -0
- package/node_modules/@sudocode-ai/cli/dist/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/index.js +15 -0
- package/node_modules/@sudocode-ai/cli/dist/index.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/base-provider.d.ts +108 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/base-provider.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/base-provider.js +80 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/base-provider.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/config-resolver.d.ts +62 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/config-resolver.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/config-resolver.js +69 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/config-resolver.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/config-validator.d.ts +75 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/config-validator.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/config-validator.js +129 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/config-validator.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/index.d.ts +14 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/index.js +20 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/index.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/plugin-loader.d.ts +77 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/plugin-loader.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/plugin-loader.js +265 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/plugin-loader.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/registry.d.ts +67 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/registry.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/registry.js +77 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/registry.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/sync-coordinator.d.ts +191 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/sync-coordinator.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/sync-coordinator.js +798 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/sync-coordinator.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/types.d.ts +142 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/types.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/types.js +6 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/types.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/utils/conflict-resolver.d.ts +79 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/utils/conflict-resolver.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/utils/conflict-resolver.js +106 -0
- package/node_modules/@sudocode-ai/cli/dist/integrations/utils/conflict-resolver.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/jsonl.d.ts +69 -0
- package/node_modules/@sudocode-ai/cli/dist/jsonl.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/jsonl.js +333 -0
- package/node_modules/@sudocode-ai/cli/dist/jsonl.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/markdown.d.ts +146 -0
- package/node_modules/@sudocode-ai/cli/dist/markdown.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/markdown.js +329 -0
- package/node_modules/@sudocode-ai/cli/dist/markdown.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/merge-resolver.d.ts +85 -0
- package/node_modules/@sudocode-ai/cli/dist/merge-resolver.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/merge-resolver.js +301 -0
- package/node_modules/@sudocode-ai/cli/dist/merge-resolver.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/events.d.ts +53 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/events.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/events.js +108 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/events.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/external-links.d.ts +147 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/external-links.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/external-links.js +411 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/external-links.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/feedback-anchors.d.ts +92 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/feedback-anchors.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/feedback-anchors.js +444 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/feedback-anchors.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/feedback.d.ts +94 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/feedback.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/feedback.js +278 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/feedback.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/index.d.ts +11 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/index.js +11 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/index.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/issues.d.ts +88 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/issues.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/issues.js +474 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/issues.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/references.d.ts +34 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/references.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/references.js +117 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/references.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/relationships.d.ts +64 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/relationships.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/relationships.js +281 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/relationships.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/specs.d.ts +69 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/specs.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/specs.js +330 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/specs.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/tags.d.ts +42 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/tags.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/tags.js +127 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/tags.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/transactions.d.ts +41 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/transactions.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/transactions.js +111 -0
- package/node_modules/@sudocode-ai/cli/dist/operations/transactions.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/sync.d.ts +47 -0
- package/node_modules/@sudocode-ai/cli/dist/sync.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/sync.js +464 -0
- package/node_modules/@sudocode-ai/cli/dist/sync.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/test-schema.d.ts +5 -0
- package/node_modules/@sudocode-ai/cli/dist/test-schema.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/test-schema.js +46 -0
- package/node_modules/@sudocode-ai/cli/dist/test-schema.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/types.d.ts +7 -0
- package/node_modules/@sudocode-ai/cli/dist/types.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/types.js +7 -0
- package/node_modules/@sudocode-ai/cli/dist/types.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/update-checker.d.ts +33 -0
- package/node_modules/@sudocode-ai/cli/dist/update-checker.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/update-checker.js +193 -0
- package/node_modules/@sudocode-ai/cli/dist/update-checker.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/validation.d.ts +11 -0
- package/node_modules/@sudocode-ai/cli/dist/validation.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/validation.js +58 -0
- package/node_modules/@sudocode-ai/cli/dist/validation.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/version.d.ts +12 -0
- package/node_modules/@sudocode-ai/cli/dist/version.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/version.js +23 -0
- package/node_modules/@sudocode-ai/cli/dist/version.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/watcher.d.ts +69 -0
- package/node_modules/@sudocode-ai/cli/dist/watcher.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/cli/dist/watcher.js +783 -0
- package/node_modules/@sudocode-ai/cli/dist/watcher.js.map +1 -0
- package/node_modules/@sudocode-ai/cli/package.json +73 -0
- package/node_modules/@sudocode-ai/integration-beads/package.json +44 -0
- package/node_modules/@sudocode-ai/integration-github/package.json +41 -0
- package/node_modules/@sudocode-ai/integration-openspec/package.json +43 -0
- package/node_modules/@sudocode-ai/integration-speckit/package.json +42 -0
- package/node_modules/@sudocode-ai/local-server/README.md +25 -0
- package/node_modules/@sudocode-ai/local-server/dist/cli.d.ts +7 -0
- package/node_modules/@sudocode-ai/local-server/dist/cli.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/cli.js +7 -0
- package/node_modules/@sudocode-ai/local-server/dist/cli.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/errors/agent-errors.d.ts +43 -0
- package/node_modules/@sudocode-ai/local-server/dist/errors/agent-errors.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/errors/agent-errors.js +69 -0
- package/node_modules/@sudocode-ai/local-server/dist/errors/agent-errors.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/claude-adapter.d.ts +63 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/claude-adapter.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/claude-adapter.js +83 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/claude-adapter.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/codex-adapter.d.ts +67 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/codex-adapter.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/codex-adapter.js +183 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/codex-adapter.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/codex-config-builder.d.ts +30 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/codex-config-builder.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/codex-config-builder.js +110 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/codex-config-builder.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/copilot-adapter.d.ts +94 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/copilot-adapter.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/copilot-adapter.js +163 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/copilot-adapter.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/copilot-config-builder.d.ts +48 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/copilot-config-builder.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/copilot-config-builder.js +125 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/copilot-config-builder.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/cursor-adapter.d.ts +66 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/cursor-adapter.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/cursor-adapter.js +121 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/cursor-adapter.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/cursor-config-builder.d.ts +29 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/cursor-config-builder.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/cursor-config-builder.js +49 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/cursor-config-builder.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/config-presets.d.ts +102 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/config-presets.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/config-presets.js +205 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/config-presets.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/config-utils.d.ts +95 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/config-utils.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/config-utils.js +163 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/config-utils.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/index.d.ts +8 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/index.js +8 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/adapters/shared/index.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/executors/agent-executor-wrapper.d.ts +154 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/executors/agent-executor-wrapper.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/executors/agent-executor-wrapper.js +725 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/executors/agent-executor-wrapper.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/executors/executor-factory.d.ts +95 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/executors/executor-factory.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/executors/executor-factory.js +128 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/executors/executor-factory.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/ag-ui-adapter.d.ts +174 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/ag-ui-adapter.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/ag-ui-adapter.js +436 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/ag-ui-adapter.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/claude-to-ag-ui.d.ts +90 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/claude-to-ag-ui.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/claude-to-ag-ui.js +153 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/claude-to-ag-ui.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/index.d.ts +15 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/index.js +13 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/index.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/normalized-to-ag-ui-adapter.d.ts +108 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/normalized-to-ag-ui-adapter.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/normalized-to-ag-ui-adapter.js +321 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/normalized-to-ag-ui-adapter.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/types.d.ts +421 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/types.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/types.js +22 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/output/types.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/process/builders/claude.d.ts +53 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/process/builders/claude.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/process/builders/claude.js +225 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/process/builders/claude.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/event-buffer.d.ts +119 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/event-buffer.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/event-buffer.js +208 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/event-buffer.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/index.d.ts +10 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/index.js +10 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/index.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/ipc-transport-manager.d.ts +74 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/ipc-transport-manager.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/ipc-transport-manager.js +104 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/ipc-transport-manager.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/sse-transport.d.ts +146 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/sse-transport.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/sse-transport.js +282 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/sse-transport.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/transport-manager.d.ts +176 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/transport-manager.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/transport-manager.js +234 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/transport/transport-manager.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/config.d.ts +74 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/config.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/config.js +280 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/config.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/conflict-detector.d.ts +85 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/conflict-detector.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/conflict-detector.js +129 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/conflict-detector.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/git-cli.d.ts +208 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/git-cli.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/git-cli.js +280 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/git-cli.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/git-sync-cli.d.ts +225 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/git-sync-cli.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/git-sync-cli.js +464 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/git-sync-cli.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/index.d.ts +16 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/index.js +15 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/index.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/manager.d.ts +221 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/manager.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/manager.js +508 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/manager.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/types.d.ts +90 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/types.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/types.js +42 -0
- package/node_modules/@sudocode-ai/local-server/dist/execution/worktree/types.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/index.d.ts +6 -0
- package/node_modules/@sudocode-ai/local-server/dist/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/index.js +371 -0
- package/node_modules/@sudocode-ai/local-server/dist/index.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/middleware/project-context.d.ts +37 -0
- package/node_modules/@sudocode-ai/local-server/dist/middleware/project-context.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/middleware/project-context.js +91 -0
- package/node_modules/@sudocode-ai/local-server/dist/middleware/project-context.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/public/assets/index-D4AKx6EO.css +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/public/assets/index-DorQqwGV.js +927 -0
- package/node_modules/@sudocode-ai/local-server/dist/public/assets/index-DorQqwGV.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/public/assets/react-vendor-DoNwlLhy.js +60 -0
- package/node_modules/@sudocode-ai/local-server/dist/public/assets/react-vendor-DoNwlLhy.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/public/assets/ui-vendor-DlxvBun1.js +54 -0
- package/node_modules/@sudocode-ai/local-server/dist/public/assets/ui-vendor-DlxvBun1.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/public/favicon.ico +0 -0
- package/node_modules/@sudocode-ai/local-server/dist/public/index.html +16 -0
- package/node_modules/@sudocode-ai/local-server/dist/public/logo.png +0 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/agents.d.ts +3 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/agents.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/agents.js +62 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/agents.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/config.d.ts +3 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/config.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/config.js +116 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/config.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/editors.d.ts +15 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/editors.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/editors.js +98 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/editors.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/executions-stream.d.ts +27 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/executions-stream.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/executions-stream.js +59 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/executions-stream.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/executions.d.ts +18 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/executions.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/executions.js +1169 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/executions.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/feedback.d.ts +8 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/feedback.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/feedback.js +340 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/feedback.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/files.d.ts +18 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/files.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/files.js +89 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/files.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/import.d.ts +142 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/import.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/import.js +896 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/import.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/issues.d.ts +8 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/issues.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/issues.js +419 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/issues.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/plugins.d.ts +34 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/plugins.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/plugins.js +602 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/plugins.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/projects.d.ts +11 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/projects.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/projects.js +536 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/projects.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/relationships.d.ts +8 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/relationships.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/relationships.js +310 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/relationships.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/repo-info.d.ts +3 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/repo-info.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/repo-info.js +203 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/repo-info.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/specs.d.ts +8 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/specs.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/specs.js +414 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/specs.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/update.d.ts +7 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/update.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/update.js +194 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/update.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/version.d.ts +3 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/version.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/version.js +25 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/version.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/workflows.d.ts +8 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/workflows.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/workflows.js +1729 -0
- package/node_modules/@sudocode-ai/local-server/dist/routes/workflows.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/agent-registry.d.ts +140 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/agent-registry.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/agent-registry.js +272 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/agent-registry.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/db.d.ts +33 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/db.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/db.js +90 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/db.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/editor-service.d.ts +57 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/editor-service.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/editor-service.js +204 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/editor-service.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-changes-service.d.ts +110 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-changes-service.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-changes-service.js +710 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-changes-service.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-event-callbacks.d.ts +73 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-event-callbacks.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-event-callbacks.js +82 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-event-callbacks.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-lifecycle.d.ts +145 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-lifecycle.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-lifecycle.js +392 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-lifecycle.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-logs-cleanup.d.ts +88 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-logs-cleanup.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-logs-cleanup.js +137 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-logs-cleanup.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-logs-store.d.ts +252 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-logs-store.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-logs-store.js +379 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-logs-store.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-service.d.ts +280 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-service.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-service.js +1240 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-service.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-worker-pool.d.ts +116 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-worker-pool.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-worker-pool.js +326 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/execution-worker-pool.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/executions.d.ts +63 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/executions.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/executions.js +177 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/executions.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/export.d.ts +32 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/export.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/export.js +114 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/export.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/external-refresh-service.d.ts +104 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/external-refresh-service.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/external-refresh-service.js +520 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/external-refresh-service.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/feedback.d.ts +56 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/feedback.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/feedback.js +78 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/feedback.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/git-ls-files-strategy.d.ts +72 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/git-ls-files-strategy.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/git-ls-files-strategy.js +176 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/git-ls-files-strategy.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/index.d.ts +9 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/index.js +10 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/index.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/registry.d.ts +97 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/registry.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/registry.js +140 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/registry.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/strategy.d.ts +58 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/strategy.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/strategy.js +8 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/file-search/strategy.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/integration-sync-service.d.ts +185 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/integration-sync-service.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/integration-sync-service.js +428 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/integration-sync-service.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/issues.d.ts +27 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/issues.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/issues.js +35 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/issues.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-context.d.ts +97 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-context.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-context.js +170 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-context.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-manager.d.ts +102 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-manager.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-manager.js +502 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-manager.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-registry.d.ts +98 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-registry.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-registry.js +289 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/project-registry.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-resolver.d.ts +97 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-resolver.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-resolver.js +377 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-resolver.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-template-engine.d.ts +108 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-template-engine.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-template-engine.js +212 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-template-engine.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-templates.d.ts +97 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-templates.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-templates.js +236 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/prompt-templates.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/relationships.d.ts +35 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/relationships.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/relationships.js +42 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/relationships.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/repo-info.d.ts +33 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/repo-info.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/repo-info.js +136 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/repo-info.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/specs.d.ts +27 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/specs.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/specs.js +35 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/specs.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/version-service.d.ts +14 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/version-service.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/version-service.js +57 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/version-service.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/watcher.d.ts +49 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/watcher.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/watcher.js +52 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/watcher.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/websocket.d.ts +179 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/websocket.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/websocket.js +543 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/websocket.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/workflow-broadcast-service.d.ts +43 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/workflow-broadcast-service.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/workflow-broadcast-service.js +155 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/workflow-broadcast-service.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/worktree-sync-service.d.ts +437 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/worktree-sync-service.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/worktree-sync-service.js +1505 -0
- package/node_modules/@sudocode-ai/local-server/dist/services/worktree-sync-service.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/types/editor.d.ts +49 -0
- package/node_modules/@sudocode-ai/local-server/dist/types/editor.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/types/editor.js +50 -0
- package/node_modules/@sudocode-ai/local-server/dist/types/editor.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/types/project.d.ts +58 -0
- package/node_modules/@sudocode-ai/local-server/dist/types/project.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/types/project.js +10 -0
- package/node_modules/@sudocode-ai/local-server/dist/types/project.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/execFileNoThrow.d.ts +43 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/execFileNoThrow.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/execFileNoThrow.js +53 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/execFileNoThrow.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/executable-check.d.ts +36 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/executable-check.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/executable-check.js +79 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/executable-check.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/sudocode-dir.d.ts +6 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/sudocode-dir.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/sudocode-dir.js +9 -0
- package/node_modules/@sudocode-ai/local-server/dist/utils/sudocode-dir.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workers/execution-worker.d.ts +18 -0
- package/node_modules/@sudocode-ai/local-server/dist/workers/execution-worker.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workers/execution-worker.js +340 -0
- package/node_modules/@sudocode-ai/local-server/dist/workers/execution-worker.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workers/worker-ipc.d.ts +84 -0
- package/node_modules/@sudocode-ai/local-server/dist/workers/worker-ipc.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workers/worker-ipc.js +29 -0
- package/node_modules/@sudocode-ai/local-server/dist/workers/worker-ipc.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/base-workflow-engine.d.ts +186 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/base-workflow-engine.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/base-workflow-engine.js +557 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/base-workflow-engine.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/dependency-analyzer.d.ts +78 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/dependency-analyzer.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/dependency-analyzer.js +264 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/dependency-analyzer.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/engines/orchestrator-engine.d.ts +237 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/engines/orchestrator-engine.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/engines/orchestrator-engine.js +749 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/engines/orchestrator-engine.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/engines/sequential-engine.d.ts +276 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/engines/sequential-engine.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/engines/sequential-engine.js +1110 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/engines/sequential-engine.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/index.d.ts +15 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/index.js +22 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/index.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/api-client.d.ts +103 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/api-client.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/api-client.js +193 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/api-client.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/index.d.ts +16 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/index.js +114 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/index.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/server.d.ts +85 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/server.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/server.js +520 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/server.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/escalation.d.ts +36 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/escalation.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/escalation.js +47 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/escalation.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/execution.d.ts +59 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/execution.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/execution.js +67 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/execution.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/inspection.d.ts +82 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/inspection.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/inspection.js +57 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/inspection.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/workflow.d.ts +59 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/workflow.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/workflow.js +40 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/tools/workflow.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/types.d.ts +345 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/types.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/types.js +7 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/mcp/types.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/services/prompt-builder.d.ts +36 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/services/prompt-builder.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/services/prompt-builder.js +329 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/services/prompt-builder.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/services/wakeup-service.d.ts +262 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/services/wakeup-service.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/services/wakeup-service.js +809 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/services/wakeup-service.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/workflow-engine.d.ts +221 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/workflow-engine.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/workflow-engine.js +94 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/workflow-engine.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/workflow-event-emitter.d.ts +278 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/workflow-event-emitter.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/workflow-event-emitter.js +259 -0
- package/node_modules/@sudocode-ai/local-server/dist/workflow/workflow-event-emitter.js.map +1 -0
- package/node_modules/@sudocode-ai/local-server/package.json +78 -0
- package/node_modules/@sudocode-ai/mcp/README.md +226 -0
- package/node_modules/@sudocode-ai/mcp/dist/client.d.ts +33 -0
- package/node_modules/@sudocode-ai/mcp/dist/client.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/client.js +166 -0
- package/node_modules/@sudocode-ai/mcp/dist/client.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/index.d.ts +6 -0
- package/node_modules/@sudocode-ai/mcp/dist/index.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/index.js +64 -0
- package/node_modules/@sudocode-ai/mcp/dist/index.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/server.d.ts +26 -0
- package/node_modules/@sudocode-ai/mcp/dist/server.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/server.js +577 -0
- package/node_modules/@sudocode-ai/mcp/dist/server.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/analytics.d.ts +41 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/analytics.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/analytics.js +21 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/analytics.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/feedback.d.ts +21 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/feedback.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/feedback.js +30 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/feedback.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/init.d.ts +17 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/init.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/init.js +15 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/init.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/issues.d.ts +44 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/issues.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/issues.js +109 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/issues.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/references.d.ts +21 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/references.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/references.js +49 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/references.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/relationships.d.ts +15 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/relationships.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/relationships.js +18 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/relationships.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/specs.d.ts +35 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/specs.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/specs.js +85 -0
- package/node_modules/@sudocode-ai/mcp/dist/tools/specs.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/types.d.ts +35 -0
- package/node_modules/@sudocode-ai/mcp/dist/types.d.ts.map +1 -0
- package/node_modules/@sudocode-ai/mcp/dist/types.js +21 -0
- package/node_modules/@sudocode-ai/mcp/dist/types.js.map +1 -0
- package/node_modules/@sudocode-ai/mcp/package.json +67 -0
- package/node_modules/@sudocode-ai/types/README.md +7 -0
- package/node_modules/@sudocode-ai/types/package.json +76 -0
- package/node_modules/@sudocode-ai/types/src/agents.d.ts +278 -0
- package/node_modules/@sudocode-ai/types/src/artifacts.d.ts +66 -0
- package/node_modules/@sudocode-ai/types/src/events.d.ts +70 -0
- package/node_modules/@sudocode-ai/types/src/index.d.ts +452 -0
- package/node_modules/@sudocode-ai/types/src/integrations.d.ts +454 -0
- package/node_modules/@sudocode-ai/types/src/workflows.d.ts +501 -0
- package/node_modules/commander/LICENSE +22 -0
- package/node_modules/commander/Readme.md +1149 -0
- package/node_modules/commander/esm.mjs +16 -0
- package/node_modules/commander/index.js +24 -0
- package/node_modules/commander/lib/argument.js +149 -0
- package/node_modules/commander/lib/command.js +2662 -0
- package/node_modules/commander/lib/error.js +39 -0
- package/node_modules/commander/lib/help.js +709 -0
- package/node_modules/commander/lib/option.js +367 -0
- package/node_modules/commander/lib/suggestSimilar.js +101 -0
- package/node_modules/commander/package-support.json +16 -0
- package/node_modules/commander/package.json +82 -0
- package/node_modules/commander/typings/esm.d.mts +3 -0
- package/node_modules/commander/typings/index.d.ts +1045 -0
- package/node_modules/glob/LICENSE +15 -0
- package/node_modules/glob/README.md +1265 -0
- package/node_modules/glob/package.json +99 -0
- package/node_modules/isexe/LICENSE +15 -0
- package/node_modules/isexe/README.md +74 -0
- package/node_modules/isexe/package.json +96 -0
- package/node_modules/which/LICENSE +15 -0
- package/node_modules/which/README.md +51 -0
- package/node_modules/which/bin/which.js +52 -0
- package/node_modules/which/lib/index.js +111 -0
- package/node_modules/which/package.json +52 -0
- package/package.json +9 -9
|
@@ -0,0 +1,783 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File watcher for automatic synchronization
|
|
3
|
+
* Watches .sudocode directory for changes and triggers sync operations
|
|
4
|
+
*/
|
|
5
|
+
import chokidar from "chokidar";
|
|
6
|
+
import * as path from "path";
|
|
7
|
+
import * as fs from "fs";
|
|
8
|
+
import { syncMarkdownToJSONL, syncJSONLToMarkdown } from "./sync.js";
|
|
9
|
+
import { importFromJSONL } from "./import.js";
|
|
10
|
+
import { listSpecs, getSpec, } from "./operations/specs.js";
|
|
11
|
+
import { listIssues, getIssue } from "./operations/issues.js";
|
|
12
|
+
import { parseMarkdownFile } from "./markdown.js";
|
|
13
|
+
import { listFeedback } from "./operations/feedback.js";
|
|
14
|
+
import { getTags } from "./operations/tags.js";
|
|
15
|
+
import { findExistingEntityFile, generateUniqueFilename, } from "./filename-generator.js";
|
|
16
|
+
import { getOutgoingRelationships } from "./operations/relationships.js";
|
|
17
|
+
import * as crypto from "crypto";
|
|
18
|
+
// Guard against processing our own file writes (oscillation prevention)
|
|
19
|
+
// Track files currently being processed to prevent same-file oscillation
|
|
20
|
+
const filesBeingProcessed = new Set();
|
|
21
|
+
// Content hash cache for detecting actual content changes (oscillation prevention)
|
|
22
|
+
const contentHashCache = new Map();
|
|
23
|
+
// Simple async mutex to serialize file processing (prevents race conditions)
|
|
24
|
+
// When markdown sync triggers JSONL export, we need to ensure the JSONL import
|
|
25
|
+
// doesn't run until the export is complete
|
|
26
|
+
class AsyncMutex {
|
|
27
|
+
locked = false;
|
|
28
|
+
waiting = [];
|
|
29
|
+
async acquire() {
|
|
30
|
+
if (!this.locked) {
|
|
31
|
+
this.locked = true;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
this.waiting.push(resolve);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
release() {
|
|
39
|
+
if (this.waiting.length > 0) {
|
|
40
|
+
const next = this.waiting.shift();
|
|
41
|
+
next();
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.locked = false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const processingMutex = new AsyncMutex();
|
|
49
|
+
/**
|
|
50
|
+
* Compute SHA256 hash of file content for change detection
|
|
51
|
+
*/
|
|
52
|
+
function computeContentHash(filePath) {
|
|
53
|
+
try {
|
|
54
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
55
|
+
return crypto.createHash("sha256").update(content).digest("hex");
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
// File doesn't exist or can't be read
|
|
59
|
+
return "";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if file content has actually changed since last processing
|
|
64
|
+
* Returns true if content changed, false if unchanged
|
|
65
|
+
*/
|
|
66
|
+
function hasContentChanged(filePath) {
|
|
67
|
+
const currentHash = computeContentHash(filePath);
|
|
68
|
+
const cachedHash = contentHashCache.get(filePath);
|
|
69
|
+
if (cachedHash && cachedHash === currentHash) {
|
|
70
|
+
// Content unchanged - skip processing
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// Update cache with new hash
|
|
74
|
+
contentHashCache.set(filePath, currentHash);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Start watching files for changes
|
|
79
|
+
* Returns a control object to stop the watcher
|
|
80
|
+
*/
|
|
81
|
+
export function startWatcher(options) {
|
|
82
|
+
const { db, baseDir, onLog = console.log, onError = console.error, ignoreInitial = true, syncJSONLToMarkdown: enableReverseSync = false, onEntitySync, onFileChange, } = options;
|
|
83
|
+
const stats = {
|
|
84
|
+
filesWatched: 0,
|
|
85
|
+
changesProcessed: 0,
|
|
86
|
+
errors: 0,
|
|
87
|
+
};
|
|
88
|
+
// Cache of previous JSONL state (entity ID -> timestamp)
|
|
89
|
+
// This allows us to detect changes by comparing new JSONL against cached state
|
|
90
|
+
const jsonlStateCache = new Map(); // jsonlPath -> (entityId -> content_hash)
|
|
91
|
+
/**
|
|
92
|
+
* Compute a canonical content hash for an entity that's invariant to key ordering
|
|
93
|
+
* and array element ordering. This ensures consistent hashes regardless of:
|
|
94
|
+
* - Object key order: {"id":"x","title":"y"} vs {"title":"y","id":"x"}
|
|
95
|
+
* - Array element order: [{to:"A"},{to:"B"}] vs [{to:"B"},{to:"A"}]
|
|
96
|
+
*/
|
|
97
|
+
function computeCanonicalHash(entity) {
|
|
98
|
+
// Recursively sort keys and array elements for consistent ordering
|
|
99
|
+
const canonicalize = (obj) => {
|
|
100
|
+
if (obj === null || typeof obj !== "object") {
|
|
101
|
+
return obj;
|
|
102
|
+
}
|
|
103
|
+
if (Array.isArray(obj)) {
|
|
104
|
+
// Sort array elements by their JSON representation for deterministic ordering
|
|
105
|
+
return obj
|
|
106
|
+
.map(canonicalize)
|
|
107
|
+
.sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b)));
|
|
108
|
+
}
|
|
109
|
+
const sorted = {};
|
|
110
|
+
Object.keys(obj)
|
|
111
|
+
.sort()
|
|
112
|
+
.forEach((key) => {
|
|
113
|
+
sorted[key] = canonicalize(obj[key]);
|
|
114
|
+
});
|
|
115
|
+
return sorted;
|
|
116
|
+
};
|
|
117
|
+
const canonical = canonicalize(entity);
|
|
118
|
+
return crypto
|
|
119
|
+
.createHash("sha256")
|
|
120
|
+
.update(JSON.stringify(canonical))
|
|
121
|
+
.digest("hex");
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check if markdown file content matches database content
|
|
125
|
+
* Returns true if they match (no sync needed)
|
|
126
|
+
*/
|
|
127
|
+
function contentMatches(mdPath, entityId, entityType) {
|
|
128
|
+
try {
|
|
129
|
+
// Check if file exists
|
|
130
|
+
if (!fs.existsSync(mdPath)) {
|
|
131
|
+
return false; // File doesn't exist, needs to be created
|
|
132
|
+
}
|
|
133
|
+
// Parse markdown file
|
|
134
|
+
const parsed = parseMarkdownFile(mdPath, db, baseDir);
|
|
135
|
+
const { data: frontmatter, content: mdContent } = parsed;
|
|
136
|
+
// Get entity from database
|
|
137
|
+
const dbEntity = entityType === "spec" ? getSpec(db, entityId) : getIssue(db, entityId);
|
|
138
|
+
if (!dbEntity) {
|
|
139
|
+
return false; // Entity not in DB, shouldn't happen
|
|
140
|
+
}
|
|
141
|
+
// Compare title
|
|
142
|
+
if (frontmatter.title !== dbEntity.title) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
// Compare content (trim to ignore whitespace differences)
|
|
146
|
+
if (mdContent.trim() !== (dbEntity.content || "").trim()) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
// Compare other key fields
|
|
150
|
+
if (entityType === "spec") {
|
|
151
|
+
if (frontmatter.priority !== dbEntity.priority)
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
const issue = dbEntity;
|
|
156
|
+
if (frontmatter.status !== issue.status)
|
|
157
|
+
return false;
|
|
158
|
+
if (frontmatter.priority !== issue.priority)
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
return true; // Content matches
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
// If there's an error parsing, assume they don't match
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Check if JSONL file needs to be imported to database
|
|
170
|
+
* Returns true if import is needed (JSONL has changes not in DB)
|
|
171
|
+
*/
|
|
172
|
+
function jsonlNeedsImport(jsonlPath) {
|
|
173
|
+
try {
|
|
174
|
+
if (!fs.existsSync(jsonlPath)) {
|
|
175
|
+
return false; // File doesn't exist
|
|
176
|
+
}
|
|
177
|
+
// Read JSONL file
|
|
178
|
+
const content = fs.readFileSync(jsonlPath, "utf8");
|
|
179
|
+
const lines = content
|
|
180
|
+
.trim()
|
|
181
|
+
.split("\n")
|
|
182
|
+
.filter((line) => line.trim());
|
|
183
|
+
// Parse each line and check if it differs from database
|
|
184
|
+
for (const line of lines) {
|
|
185
|
+
const jsonlEntity = JSON.parse(line);
|
|
186
|
+
const entityId = jsonlEntity.id;
|
|
187
|
+
const entityType = jsonlPath.includes("specs.jsonl") ? "spec" : "issue";
|
|
188
|
+
// Get entity from database
|
|
189
|
+
const dbEntity = entityType === "spec"
|
|
190
|
+
? getSpec(db, entityId)
|
|
191
|
+
: getIssue(db, entityId);
|
|
192
|
+
// If entity doesn't exist in DB, import is needed
|
|
193
|
+
if (!dbEntity) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
// Compare all substantial fields
|
|
197
|
+
if (jsonlEntity.title !== dbEntity.title)
|
|
198
|
+
return true;
|
|
199
|
+
if ((jsonlEntity.content || "").trim() !== (dbEntity.content || "").trim())
|
|
200
|
+
return true;
|
|
201
|
+
if (jsonlEntity.priority !== dbEntity.priority)
|
|
202
|
+
return true;
|
|
203
|
+
if (jsonlEntity.parent_id !== dbEntity.parent_id)
|
|
204
|
+
return true;
|
|
205
|
+
if (jsonlEntity.archived !== dbEntity.archived)
|
|
206
|
+
return true;
|
|
207
|
+
if (jsonlEntity.archived_at !== dbEntity.archived_at)
|
|
208
|
+
return true;
|
|
209
|
+
if (entityType === "spec") {
|
|
210
|
+
const dbSpec = dbEntity;
|
|
211
|
+
// Compare spec-specific fields
|
|
212
|
+
if (jsonlEntity.file_path !== dbSpec.file_path)
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
else if (entityType === "issue") {
|
|
216
|
+
const dbIssue = dbEntity;
|
|
217
|
+
if (jsonlEntity.status !== dbIssue.status)
|
|
218
|
+
return true;
|
|
219
|
+
if (jsonlEntity.assignee !== dbIssue.assignee)
|
|
220
|
+
return true;
|
|
221
|
+
if (jsonlEntity.closed_at !== dbIssue.closed_at)
|
|
222
|
+
return true;
|
|
223
|
+
// Compare feedback
|
|
224
|
+
const dbFeedback = listFeedback(db, { from_id: entityId });
|
|
225
|
+
const jsonlFeedback = jsonlEntity.feedback || [];
|
|
226
|
+
if (jsonlFeedback.length !== dbFeedback.length)
|
|
227
|
+
return true;
|
|
228
|
+
// Compare feedback content
|
|
229
|
+
for (const jf of jsonlFeedback) {
|
|
230
|
+
const dbf = dbFeedback.find((f) => f.id === jf.id);
|
|
231
|
+
if (!dbf)
|
|
232
|
+
return true;
|
|
233
|
+
if (jf.content !== dbf.content)
|
|
234
|
+
return true;
|
|
235
|
+
if (jf.feedback_type !== dbf.feedback_type)
|
|
236
|
+
return true;
|
|
237
|
+
if (jf.to_id !== dbf.to_id)
|
|
238
|
+
return true;
|
|
239
|
+
if (jf.dismissed !== dbf.dismissed)
|
|
240
|
+
return true;
|
|
241
|
+
// Compare anchor (stringified for comparison)
|
|
242
|
+
const jfAnchor = JSON.stringify(jf.anchor || null);
|
|
243
|
+
const dbfAnchor = JSON.stringify(dbf.anchor && typeof dbf.anchor === "string"
|
|
244
|
+
? JSON.parse(dbf.anchor)
|
|
245
|
+
: dbf.anchor || null);
|
|
246
|
+
if (jfAnchor !== dbfAnchor)
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Compare tags
|
|
251
|
+
const dbTags = getTags(db, entityId, entityType);
|
|
252
|
+
const jsonlTags = jsonlEntity.tags || [];
|
|
253
|
+
if (jsonlTags.length !== dbTags.length)
|
|
254
|
+
return true;
|
|
255
|
+
const dbTagsSet = new Set(dbTags);
|
|
256
|
+
if (jsonlTags.some((tag) => !dbTagsSet.has(tag)))
|
|
257
|
+
return true;
|
|
258
|
+
// Compare relationships;
|
|
259
|
+
const dbRels = getOutgoingRelationships(db, entityId, entityType);
|
|
260
|
+
const jsonlRels = jsonlEntity.relationships || [];
|
|
261
|
+
if (jsonlRels.length !== dbRels.length)
|
|
262
|
+
return true;
|
|
263
|
+
// Compare relationship content
|
|
264
|
+
for (const jr of jsonlRels) {
|
|
265
|
+
const dr = dbRels.find((r) => r.to_id === jr.to &&
|
|
266
|
+
r.to_type === jr.to_type &&
|
|
267
|
+
r.relationship_type === jr.type);
|
|
268
|
+
if (!dr)
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
// Compare updated_at timestamp - if JSONL is newer, import is needed
|
|
272
|
+
if (jsonlEntity.updated_at &&
|
|
273
|
+
new Date(jsonlEntity.updated_at).getTime() >
|
|
274
|
+
new Date(dbEntity.updated_at).getTime()) {
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return false; // All entities match
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
// If there's an error, assume import is needed
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Paths to watch
|
|
286
|
+
const specsDir = path.join(baseDir, "specs");
|
|
287
|
+
const issuesDir = path.join(baseDir, "issues");
|
|
288
|
+
const specsJSONL = path.join(baseDir, "specs.jsonl");
|
|
289
|
+
const issuesJSONL = path.join(baseDir, "issues.jsonl");
|
|
290
|
+
// Watch directories and JSONL files - chokidar will recursively watch all files inside
|
|
291
|
+
const watcher = chokidar.watch([specsDir, issuesDir, specsJSONL, issuesJSONL], {
|
|
292
|
+
persistent: true,
|
|
293
|
+
ignoreInitial,
|
|
294
|
+
awaitWriteFinish: {
|
|
295
|
+
stabilityThreshold: 100, // Reduced for faster detection in tests
|
|
296
|
+
pollInterval: 50,
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
// Log watch patterns for debugging
|
|
300
|
+
onLog(`[watch] Watching directories: ${specsDir}, ${issuesDir} and JSONL files`);
|
|
301
|
+
/**
|
|
302
|
+
* Process a file change
|
|
303
|
+
* Uses mutex to serialize processing and prevent race conditions
|
|
304
|
+
* (e.g., markdown sync triggers JSONL export, which triggers JSONL import)
|
|
305
|
+
*/
|
|
306
|
+
async function processChange(filePath, event) {
|
|
307
|
+
// Acquire mutex to serialize processing
|
|
308
|
+
await processingMutex.acquire();
|
|
309
|
+
try {
|
|
310
|
+
// Set re-entry guard for this specific file to prevent oscillation
|
|
311
|
+
filesBeingProcessed.add(filePath);
|
|
312
|
+
try {
|
|
313
|
+
const ext = path.extname(filePath);
|
|
314
|
+
const basename = path.basename(filePath);
|
|
315
|
+
if (ext === ".md") {
|
|
316
|
+
// Markdown file changed - sync to database and JSONL
|
|
317
|
+
onLog(`[watch] ${event} ${path.relative(baseDir, filePath)}`);
|
|
318
|
+
if (event === "unlink") {
|
|
319
|
+
// File was deleted - DB/JSONL is source of truth, so we don't delete entities
|
|
320
|
+
// The file was likely deleted because the entity was deleted via API or JSONL
|
|
321
|
+
const relPath = path.relative(baseDir, filePath);
|
|
322
|
+
onLog(`[watch] Markdown file deleted: ${relPath} (DB/JSONL is source of truth)`);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
// Parse markdown to determine entity and sync direction
|
|
326
|
+
// DB/JSONL is source of truth for entity existence - only sync content updates
|
|
327
|
+
let entityId;
|
|
328
|
+
let entityType = "spec";
|
|
329
|
+
let syncDirection = "skip";
|
|
330
|
+
// Determine entity type based on file location
|
|
331
|
+
const relPath = path.relative(baseDir, filePath);
|
|
332
|
+
entityType =
|
|
333
|
+
relPath.startsWith("specs/") || relPath.startsWith("specs\\")
|
|
334
|
+
? "spec"
|
|
335
|
+
: "issue";
|
|
336
|
+
try {
|
|
337
|
+
const parsed = parseMarkdownFile(filePath, db, baseDir);
|
|
338
|
+
const { data: frontmatter } = parsed;
|
|
339
|
+
entityId = frontmatter.id;
|
|
340
|
+
// Check if entity exists in DB
|
|
341
|
+
const dbEntity = entityId
|
|
342
|
+
? entityType === "spec"
|
|
343
|
+
? getSpec(db, entityId)
|
|
344
|
+
: getIssue(db, entityId)
|
|
345
|
+
: null;
|
|
346
|
+
if (!entityId || !dbEntity) {
|
|
347
|
+
// No entity ID in frontmatter or entity doesn't exist in DB = orphaned file
|
|
348
|
+
syncDirection = "orphaned";
|
|
349
|
+
}
|
|
350
|
+
// Skip if content already matches DB (prevents oscillation)
|
|
351
|
+
else if (contentMatches(filePath, entityId, entityType)) {
|
|
352
|
+
syncDirection = "skip";
|
|
353
|
+
}
|
|
354
|
+
// Skip if file content hasn't changed since last sync (hash-based detection)
|
|
355
|
+
// This prevents oscillation from our own writes
|
|
356
|
+
else if (!hasContentChanged(filePath)) {
|
|
357
|
+
onLog(`[watch] Skipping sync for ${entityType} ${entityId} (file content unchanged)`);
|
|
358
|
+
syncDirection = "skip";
|
|
359
|
+
}
|
|
360
|
+
// Content differs - determine sync direction based on timestamps
|
|
361
|
+
else {
|
|
362
|
+
const fileStat = fs.statSync(filePath);
|
|
363
|
+
const fileTime = fileStat.mtimeMs;
|
|
364
|
+
const dbTime = new Date(dbEntity.updated_at).getTime();
|
|
365
|
+
if (dbTime > fileTime) {
|
|
366
|
+
// DB is newer than file - sync DB → markdown
|
|
367
|
+
syncDirection = "db-to-markdown";
|
|
368
|
+
onLog(`[watch] DB is newer for ${entityType} ${entityId}, syncing DB → markdown`);
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
// File is newer than DB - sync markdown → DB (content update only)
|
|
372
|
+
syncDirection = "markdown-to-db";
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
// If parsing fails, treat as orphaned file
|
|
378
|
+
syncDirection = "orphaned";
|
|
379
|
+
}
|
|
380
|
+
// Handle orphaned files (no corresponding DB entry)
|
|
381
|
+
if (syncDirection === "orphaned") {
|
|
382
|
+
onLog(`[watch] Orphaned file detected: ${relPath} (no corresponding DB entry)`);
|
|
383
|
+
// Delete orphaned file to maintain 1:1 mapping
|
|
384
|
+
try {
|
|
385
|
+
fs.unlinkSync(filePath);
|
|
386
|
+
onLog(`[watch] Deleted orphaned file: ${relPath}`);
|
|
387
|
+
}
|
|
388
|
+
catch (err) {
|
|
389
|
+
onError(new Error(`Failed to delete orphaned file ${relPath}: ${err}`));
|
|
390
|
+
}
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
if (syncDirection === "skip") {
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
if (syncDirection === "db-to-markdown" && entityId) {
|
|
397
|
+
// Sync DB → markdown (DB is newer)
|
|
398
|
+
const syncResult = await syncJSONLToMarkdown(db, entityId, entityType, filePath);
|
|
399
|
+
if (syncResult.success) {
|
|
400
|
+
onLog(`[watch] Updated markdown for ${entityType} ${entityId} from DB`);
|
|
401
|
+
// Update content hash cache after writing to prevent re-triggering
|
|
402
|
+
hasContentChanged(filePath);
|
|
403
|
+
// Emit event
|
|
404
|
+
if (onEntitySync) {
|
|
405
|
+
const entity = entityType === "spec"
|
|
406
|
+
? getSpec(db, entityId)
|
|
407
|
+
: getIssue(db, entityId);
|
|
408
|
+
await onEntitySync({
|
|
409
|
+
entityType,
|
|
410
|
+
entityId,
|
|
411
|
+
action: "updated",
|
|
412
|
+
filePath,
|
|
413
|
+
baseDir,
|
|
414
|
+
source: "database",
|
|
415
|
+
timestamp: new Date(),
|
|
416
|
+
entity: entity ?? undefined,
|
|
417
|
+
version: 1,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
// Sync markdown → DB (file is newer or new file)
|
|
424
|
+
const result = await syncMarkdownToJSONL(db, filePath, {
|
|
425
|
+
outputDir: baseDir,
|
|
426
|
+
autoExport: true,
|
|
427
|
+
autoInitialize: true,
|
|
428
|
+
writeBackFrontmatter: true,
|
|
429
|
+
});
|
|
430
|
+
if (result.success) {
|
|
431
|
+
onLog(`[watch] Synced ${result.entityType} ${result.entityId} (${result.action})`);
|
|
432
|
+
// Emit typed callback event for markdown sync
|
|
433
|
+
if (onEntitySync) {
|
|
434
|
+
// Get full entity data to include in event
|
|
435
|
+
const entity = result.entityType === "spec"
|
|
436
|
+
? getSpec(db, result.entityId)
|
|
437
|
+
: getIssue(db, result.entityId);
|
|
438
|
+
await onEntitySync({
|
|
439
|
+
entityType: result.entityType,
|
|
440
|
+
entityId: result.entityId,
|
|
441
|
+
action: result.action,
|
|
442
|
+
filePath,
|
|
443
|
+
baseDir,
|
|
444
|
+
source: "markdown",
|
|
445
|
+
timestamp: new Date(),
|
|
446
|
+
entity: entity ?? undefined,
|
|
447
|
+
version: 1,
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
onError(new Error(`Failed to sync ${filePath}: ${result.error}`));
|
|
453
|
+
stats.errors++;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
else if (basename === "specs.jsonl" || basename === "issues.jsonl") {
|
|
458
|
+
// JSONL file changed (e.g., from CLI update or git pull)
|
|
459
|
+
onLog(`[watch] ${event} ${path.relative(baseDir, filePath)}`);
|
|
460
|
+
if (event !== "unlink") {
|
|
461
|
+
const entityType = basename === "specs.jsonl" ? "spec" : "issue";
|
|
462
|
+
// Read JSONL file
|
|
463
|
+
const jsonlContent = fs.readFileSync(filePath, "utf8");
|
|
464
|
+
const jsonlLines = jsonlContent
|
|
465
|
+
.trim()
|
|
466
|
+
.split("\n")
|
|
467
|
+
.filter((line) => line.trim());
|
|
468
|
+
// Parse JSONL entities and build new state map
|
|
469
|
+
const jsonlEntities = jsonlLines.map((line) => JSON.parse(line));
|
|
470
|
+
const newStateMap = new Map();
|
|
471
|
+
for (const entity of jsonlEntities) {
|
|
472
|
+
// Use canonical content hash to detect any content changes
|
|
473
|
+
// Canonical hash is invariant to JSON key ordering
|
|
474
|
+
const contentHash = computeCanonicalHash(entity);
|
|
475
|
+
newStateMap.set(entity.id, contentHash);
|
|
476
|
+
}
|
|
477
|
+
// Get cached state (previous JSONL state)
|
|
478
|
+
const cachedStateMap = jsonlStateCache.get(filePath) || new Map();
|
|
479
|
+
// Detect changed entities by comparing new state with cached state
|
|
480
|
+
const changedEntities = [];
|
|
481
|
+
for (const jsonlEntity of jsonlEntities) {
|
|
482
|
+
const entityId = jsonlEntity.id;
|
|
483
|
+
const newHash = newStateMap.get(entityId);
|
|
484
|
+
const cachedHash = cachedStateMap.get(entityId);
|
|
485
|
+
if (!cachedHash) {
|
|
486
|
+
// Entity not in cache = created
|
|
487
|
+
changedEntities.push({ entityId, action: "created" });
|
|
488
|
+
}
|
|
489
|
+
else if (newHash !== cachedHash) {
|
|
490
|
+
// Content hash differs = entity changed
|
|
491
|
+
changedEntities.push({ entityId, action: "updated" });
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
// Update cache with new state
|
|
495
|
+
jsonlStateCache.set(filePath, newStateMap);
|
|
496
|
+
if (changedEntities.length > 0) {
|
|
497
|
+
onLog(`[watch] Detected ${changedEntities.length} changed ${entityType}(s) in JSONL`);
|
|
498
|
+
// Import from JSONL to sync database
|
|
499
|
+
// Pass changed entity IDs to force update even if timestamp hasn't changed
|
|
500
|
+
// (user may have manually edited JSONL content without updating timestamp)
|
|
501
|
+
const changedIds = changedEntities.map((e) => e.entityId);
|
|
502
|
+
await importFromJSONL(db, {
|
|
503
|
+
inputDir: baseDir,
|
|
504
|
+
forceUpdateIds: changedIds,
|
|
505
|
+
});
|
|
506
|
+
onLog(`[watch] Imported JSONL changes to database`);
|
|
507
|
+
// Emit events for changed entities (after import, so we have fresh data)
|
|
508
|
+
for (const { entityId, action } of changedEntities) {
|
|
509
|
+
onLog(`[watch] Synced ${entityType} ${entityId} (${action})`);
|
|
510
|
+
if (onEntitySync) {
|
|
511
|
+
// Get fresh entity data from database (after import)
|
|
512
|
+
const entity = entityType === "spec"
|
|
513
|
+
? getSpec(db, entityId)
|
|
514
|
+
: getIssue(db, entityId);
|
|
515
|
+
// Find markdown file path
|
|
516
|
+
let entityFilePath;
|
|
517
|
+
if (entityType === "spec" && entity && "file_path" in entity) {
|
|
518
|
+
entityFilePath = path.join(baseDir, entity.file_path);
|
|
519
|
+
}
|
|
520
|
+
else if (entityType === "issue" &&
|
|
521
|
+
entity &&
|
|
522
|
+
"file_path" in entity) {
|
|
523
|
+
entityFilePath = path.join(baseDir, entity.file_path);
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
// Fallback to default path
|
|
527
|
+
entityFilePath = path.join(baseDir, entityType === "spec" ? "specs" : "issues", `${entityId}.md`);
|
|
528
|
+
}
|
|
529
|
+
await onEntitySync({
|
|
530
|
+
entityType,
|
|
531
|
+
entityId: entityId,
|
|
532
|
+
action,
|
|
533
|
+
filePath: entityFilePath,
|
|
534
|
+
baseDir,
|
|
535
|
+
source: "jsonl",
|
|
536
|
+
timestamp: new Date(),
|
|
537
|
+
entity: entity ?? undefined,
|
|
538
|
+
version: 1,
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
else {
|
|
544
|
+
onLog(`[watch] No entity changes detected in ${basename}`);
|
|
545
|
+
}
|
|
546
|
+
// Optionally sync database changes back to markdown files
|
|
547
|
+
// Only sync entities where content actually differs (contentMatches check)
|
|
548
|
+
if (enableReverseSync) {
|
|
549
|
+
onLog(`[watch] Checking for entities that need markdown updates...`);
|
|
550
|
+
let syncedCount = 0;
|
|
551
|
+
// Get all specs and sync to markdown
|
|
552
|
+
const specs = listSpecs(db);
|
|
553
|
+
for (const spec of specs) {
|
|
554
|
+
if (spec.file_path) {
|
|
555
|
+
const mdPath = path.join(baseDir, spec.file_path);
|
|
556
|
+
// Skip if content already matches (prevents oscillation)
|
|
557
|
+
if (contentMatches(mdPath, spec.id, "spec")) {
|
|
558
|
+
continue;
|
|
559
|
+
}
|
|
560
|
+
const result = await syncJSONLToMarkdown(db, spec.id, "spec", mdPath);
|
|
561
|
+
if (result.success) {
|
|
562
|
+
syncedCount++;
|
|
563
|
+
onLog(`[watch] Synced spec ${spec.id} to ${spec.file_path} (${result.action})`);
|
|
564
|
+
}
|
|
565
|
+
else if (result.error) {
|
|
566
|
+
onError(new Error(`Failed to sync spec ${spec.id}: ${result.error}`));
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
// Get all issues and check if any need syncing
|
|
571
|
+
const issues = listIssues(db);
|
|
572
|
+
const issuesDir = path.join(baseDir, "issues");
|
|
573
|
+
for (const issue of issues) {
|
|
574
|
+
// Find existing file or generate new filename using unified scheme
|
|
575
|
+
let mdPath = findExistingEntityFile(issue.id, issuesDir, issue.title);
|
|
576
|
+
if (!mdPath) {
|
|
577
|
+
// File doesn't exist, generate new filename
|
|
578
|
+
const fileName = generateUniqueFilename(issue.title, issue.id);
|
|
579
|
+
mdPath = path.join(issuesDir, fileName);
|
|
580
|
+
}
|
|
581
|
+
// Skip if content already matches (prevents unnecessary writes and oscillation)
|
|
582
|
+
if (contentMatches(mdPath, issue.id, "issue")) {
|
|
583
|
+
continue;
|
|
584
|
+
}
|
|
585
|
+
const result = await syncJSONLToMarkdown(db, issue.id, "issue", mdPath);
|
|
586
|
+
if (result.success) {
|
|
587
|
+
syncedCount++;
|
|
588
|
+
onLog(`[watch] Synced issue ${issue.id} to markdown (${result.action})`);
|
|
589
|
+
}
|
|
590
|
+
else if (result.error) {
|
|
591
|
+
onError(new Error(`Failed to sync issue ${issue.id}: ${result.error}`));
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
if (syncedCount > 0) {
|
|
595
|
+
onLog(`[watch] Synced ${syncedCount} entities to markdown`);
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
onLog(`[watch] All markdown files are up to date`);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
stats.changesProcessed++;
|
|
604
|
+
}
|
|
605
|
+
catch (error) {
|
|
606
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
607
|
+
onError(new Error(`Error processing ${filePath}: ${message}`));
|
|
608
|
+
stats.errors++;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
finally {
|
|
612
|
+
// Always clear re-entry guard for this file, even on errors
|
|
613
|
+
filesBeingProcessed.delete(filePath);
|
|
614
|
+
// Release mutex to allow next file to be processed
|
|
615
|
+
processingMutex.release();
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
/**
|
|
619
|
+
* File change handler with oscillation guards
|
|
620
|
+
* Processes changes immediately (no debounce)
|
|
621
|
+
*/
|
|
622
|
+
function handleFileChange(filePath, event) {
|
|
623
|
+
// Guard: Skip if we're currently processing this specific file (prevents oscillation)
|
|
624
|
+
// This is the primary defense against the oscillation loop
|
|
625
|
+
if (filesBeingProcessed.has(filePath)) {
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
// Process change immediately
|
|
629
|
+
processChange(filePath, event);
|
|
630
|
+
}
|
|
631
|
+
// Set up event handlers
|
|
632
|
+
watcher.on("add", (filePath) => handleFileChange(filePath, "add"));
|
|
633
|
+
watcher.on("change", (filePath) => handleFileChange(filePath, "change"));
|
|
634
|
+
watcher.on("unlink", (filePath) => handleFileChange(filePath, "unlink"));
|
|
635
|
+
watcher.on("ready", () => {
|
|
636
|
+
const watched = watcher.getWatched();
|
|
637
|
+
stats.filesWatched = Object.keys(watched).reduce((total, dir) => total + watched[dir].length, 0);
|
|
638
|
+
onLog(`[watch] Watching ${stats.filesWatched} files in ${baseDir}`);
|
|
639
|
+
// Initialize JSONL state cache on startup to avoid broadcasting all entities on first change
|
|
640
|
+
try {
|
|
641
|
+
// Initialize specs.jsonl cache
|
|
642
|
+
const specsJsonlPath = path.join(baseDir, "specs.jsonl");
|
|
643
|
+
if (fs.existsSync(specsJsonlPath)) {
|
|
644
|
+
const content = fs.readFileSync(specsJsonlPath, "utf8");
|
|
645
|
+
const lines = content.trim().split("\n").filter((line) => line.trim());
|
|
646
|
+
const stateMap = new Map();
|
|
647
|
+
for (const line of lines) {
|
|
648
|
+
const entity = JSON.parse(line);
|
|
649
|
+
// Use canonical content hash to match the change detection logic
|
|
650
|
+
const contentHash = computeCanonicalHash(entity);
|
|
651
|
+
stateMap.set(entity.id, contentHash);
|
|
652
|
+
}
|
|
653
|
+
jsonlStateCache.set(specsJsonlPath, stateMap);
|
|
654
|
+
onLog(`[watch] Initialized cache for specs.jsonl (${stateMap.size} entities)`);
|
|
655
|
+
}
|
|
656
|
+
// Initialize issues.jsonl cache
|
|
657
|
+
const issuesJsonlPath = path.join(baseDir, "issues.jsonl");
|
|
658
|
+
if (fs.existsSync(issuesJsonlPath)) {
|
|
659
|
+
const content = fs.readFileSync(issuesJsonlPath, "utf8");
|
|
660
|
+
const lines = content.trim().split("\n").filter((line) => line.trim());
|
|
661
|
+
const stateMap = new Map();
|
|
662
|
+
for (const line of lines) {
|
|
663
|
+
const entity = JSON.parse(line);
|
|
664
|
+
// Use canonical content hash to match the change detection logic
|
|
665
|
+
const contentHash = computeCanonicalHash(entity);
|
|
666
|
+
stateMap.set(entity.id, contentHash);
|
|
667
|
+
}
|
|
668
|
+
jsonlStateCache.set(issuesJsonlPath, stateMap);
|
|
669
|
+
onLog(`[watch] Initialized cache for issues.jsonl (${stateMap.size} entities)`);
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
catch (error) {
|
|
673
|
+
onLog(`[watch] Warning: Failed to initialize JSONL cache: ${error instanceof Error ? error.message : String(error)}`);
|
|
674
|
+
// Continue anyway - cache will be populated on first change
|
|
675
|
+
}
|
|
676
|
+
// Clean up orphaned markdown files on startup (files without corresponding DB entries)
|
|
677
|
+
// This ensures 1:1 mapping between DB and markdown files
|
|
678
|
+
try {
|
|
679
|
+
let orphanedCount = 0;
|
|
680
|
+
// Build set of valid entity IDs from database
|
|
681
|
+
const validSpecIds = new Set(listSpecs(db).map((s) => s.id));
|
|
682
|
+
const validIssueIds = new Set(listIssues(db).map((i) => i.id));
|
|
683
|
+
// Check specs directory
|
|
684
|
+
const specsPath = path.join(baseDir, "specs");
|
|
685
|
+
if (fs.existsSync(specsPath)) {
|
|
686
|
+
const specFiles = fs
|
|
687
|
+
.readdirSync(specsPath)
|
|
688
|
+
.filter((f) => f.endsWith(".md"));
|
|
689
|
+
for (const file of specFiles) {
|
|
690
|
+
const filePath = path.join(specsPath, file);
|
|
691
|
+
try {
|
|
692
|
+
const parsed = parseMarkdownFile(filePath, db, baseDir);
|
|
693
|
+
const entityId = parsed.data.id;
|
|
694
|
+
if (!entityId || !validSpecIds.has(entityId)) {
|
|
695
|
+
fs.unlinkSync(filePath);
|
|
696
|
+
orphanedCount++;
|
|
697
|
+
onLog(`[watch] Deleted orphaned spec file: specs/${file}`);
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
catch {
|
|
701
|
+
// If parsing fails, treat as orphaned
|
|
702
|
+
fs.unlinkSync(filePath);
|
|
703
|
+
orphanedCount++;
|
|
704
|
+
onLog(`[watch] Deleted orphaned spec file (invalid): specs/${file}`);
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
// Check issues directory
|
|
709
|
+
const issuesPath = path.join(baseDir, "issues");
|
|
710
|
+
if (fs.existsSync(issuesPath)) {
|
|
711
|
+
const issueFiles = fs
|
|
712
|
+
.readdirSync(issuesPath)
|
|
713
|
+
.filter((f) => f.endsWith(".md"));
|
|
714
|
+
for (const file of issueFiles) {
|
|
715
|
+
const filePath = path.join(issuesPath, file);
|
|
716
|
+
try {
|
|
717
|
+
const parsed = parseMarkdownFile(filePath, db, baseDir);
|
|
718
|
+
const entityId = parsed.data.id;
|
|
719
|
+
if (!entityId || !validIssueIds.has(entityId)) {
|
|
720
|
+
fs.unlinkSync(filePath);
|
|
721
|
+
orphanedCount++;
|
|
722
|
+
onLog(`[watch] Deleted orphaned issue file: issues/${file}`);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
catch {
|
|
726
|
+
// If parsing fails, treat as orphaned
|
|
727
|
+
fs.unlinkSync(filePath);
|
|
728
|
+
orphanedCount++;
|
|
729
|
+
onLog(`[watch] Deleted orphaned issue file (invalid): issues/${file}`);
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
if (orphanedCount > 0) {
|
|
734
|
+
onLog(`[watch] Cleaned up ${orphanedCount} orphaned markdown file(s)`);
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
catch (error) {
|
|
738
|
+
onLog(`[watch] Warning: Failed to clean up orphaned files: ${error instanceof Error ? error.message : String(error)}`);
|
|
739
|
+
}
|
|
740
|
+
});
|
|
741
|
+
watcher.on("error", (error) => {
|
|
742
|
+
onError(error);
|
|
743
|
+
stats.errors++;
|
|
744
|
+
});
|
|
745
|
+
// Return control object
|
|
746
|
+
return {
|
|
747
|
+
stop: async () => {
|
|
748
|
+
onLog("[watch] Stopping watcher...");
|
|
749
|
+
// Close watcher
|
|
750
|
+
await watcher.close();
|
|
751
|
+
onLog("[watch] Watcher stopped");
|
|
752
|
+
},
|
|
753
|
+
getStats: () => ({ ...stats }),
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
/**
|
|
757
|
+
* Wait for termination signal and stop watcher gracefully
|
|
758
|
+
*/
|
|
759
|
+
export function setupGracefulShutdown(control) {
|
|
760
|
+
let isShuttingDown = false;
|
|
761
|
+
const shutdown = async (signal) => {
|
|
762
|
+
if (isShuttingDown)
|
|
763
|
+
return;
|
|
764
|
+
isShuttingDown = true;
|
|
765
|
+
console.log(`\n[watch] Received ${signal}, shutting down gracefully...`);
|
|
766
|
+
try {
|
|
767
|
+
await control.stop();
|
|
768
|
+
process.exit(0);
|
|
769
|
+
}
|
|
770
|
+
catch (error) {
|
|
771
|
+
console.error("[watch] Error during shutdown:", error);
|
|
772
|
+
process.exit(1);
|
|
773
|
+
}
|
|
774
|
+
};
|
|
775
|
+
// Handle termination signals
|
|
776
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
777
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
778
|
+
// Handle unhandled promise rejections
|
|
779
|
+
process.on("unhandledRejection", (reason, promise) => {
|
|
780
|
+
console.error("[watch] Unhandled Rejection at:", promise, "reason:", reason);
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
//# sourceMappingURL=watcher.js.map
|