mewkit 1.7.1 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -0
- package/dist/commands/budget.d.ts +6 -0
- package/dist/commands/budget.d.ts.map +1 -0
- package/dist/commands/budget.js +95 -0
- package/dist/commands/budget.js.map +1 -0
- package/dist/commands/doctor.d.ts +4 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +365 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +354 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/memory.d.ts +9 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +217 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/migrate.d.ts +21 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +42 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/orchviz.d.ts +12 -0
- package/dist/commands/orchviz.d.ts.map +1 -0
- package/dist/commands/orchviz.js +160 -0
- package/dist/commands/orchviz.js.map +1 -0
- package/dist/commands/setup.d.ts +16 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +415 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/task.d.ts +10 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +313 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/upgrade.d.ts +7 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +143 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +139 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/compute-checksums.d.ts +25 -0
- package/dist/core/compute-checksums.d.ts.map +1 -0
- package/dist/core/compute-checksums.js +105 -0
- package/dist/core/compute-checksums.js.map +1 -0
- package/dist/core/core-logger.d.ts +9 -0
- package/dist/core/core-logger.d.ts.map +1 -0
- package/dist/core/core-logger.js +31 -0
- package/dist/core/core-logger.js.map +1 -0
- package/dist/core/dependency-installer.d.ts +29 -0
- package/dist/core/dependency-installer.d.ts.map +1 -0
- package/dist/core/dependency-installer.js +150 -0
- package/dist/core/dependency-installer.js.map +1 -0
- package/dist/core/github-releases.d.ts +32 -0
- package/dist/core/github-releases.d.ts.map +1 -0
- package/dist/core/github-releases.js +96 -0
- package/dist/core/github-releases.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/merge-settings.d.ts +7 -0
- package/dist/core/merge-settings.d.ts.map +1 -0
- package/dist/core/merge-settings.js +131 -0
- package/dist/core/merge-settings.js.map +1 -0
- package/dist/core/skills-dependencies.d.ts +25 -0
- package/dist/core/skills-dependencies.d.ts.map +1 -0
- package/dist/core/skills-dependencies.js +100 -0
- package/dist/core/skills-dependencies.js.map +1 -0
- package/dist/core/smart-update-utils.d.ts +10 -0
- package/dist/core/smart-update-utils.d.ts.map +1 -0
- package/dist/core/smart-update-utils.js +61 -0
- package/dist/core/smart-update-utils.js.map +1 -0
- package/dist/core/smart-update.d.ts +18 -0
- package/dist/core/smart-update.d.ts.map +1 -0
- package/dist/core/smart-update.js +177 -0
- package/dist/core/smart-update.js.map +1 -0
- package/dist/core/substitute-placeholders.d.ts +11 -0
- package/dist/core/substitute-placeholders.d.ts.map +1 -0
- package/dist/core/substitute-placeholders.js +28 -0
- package/dist/core/substitute-placeholders.js.map +1 -0
- package/dist/core/validate-install.d.ts +6 -0
- package/dist/core/validate-install.d.ts.map +1 -0
- package/dist/core/validate-install.js +97 -0
- package/dist/core/validate-install.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +248 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/system-deps-registry.d.ts +117 -0
- package/dist/lib/system-deps-registry.d.ts.map +1 -0
- package/dist/lib/system-deps-registry.js +234 -0
- package/dist/lib/system-deps-registry.js.map +1 -0
- package/dist/migrate/__tests__/frontmatter-parser.test.d.ts +2 -0
- package/dist/migrate/__tests__/frontmatter-parser.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/frontmatter-parser.test.js +73 -0
- package/dist/migrate/__tests__/frontmatter-parser.test.js.map +1 -0
- package/dist/migrate/__tests__/md-strip-mewkit.test.d.ts +2 -0
- package/dist/migrate/__tests__/md-strip-mewkit.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/md-strip-mewkit.test.js +55 -0
- package/dist/migrate/__tests__/md-strip-mewkit.test.js.map +1 -0
- package/dist/migrate/__tests__/migrate-scope-resolver.test.d.ts +2 -0
- package/dist/migrate/__tests__/migrate-scope-resolver.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/migrate-scope-resolver.test.js +53 -0
- package/dist/migrate/__tests__/migrate-scope-resolver.test.js.map +1 -0
- package/dist/migrate/__tests__/process-lock.test.d.ts +2 -0
- package/dist/migrate/__tests__/process-lock.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/process-lock.test.js +63 -0
- package/dist/migrate/__tests__/process-lock.test.js.map +1 -0
- package/dist/migrate/__tests__/provider-registry.test.d.ts +2 -0
- package/dist/migrate/__tests__/provider-registry.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/provider-registry.test.js +53 -0
- package/dist/migrate/__tests__/provider-registry.test.js.map +1 -0
- package/dist/migrate/__tests__/reconciler.test.d.ts +2 -0
- package/dist/migrate/__tests__/reconciler.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/reconciler.test.js +180 -0
- package/dist/migrate/__tests__/reconciler.test.js.map +1 -0
- package/dist/migrate/__tests__/skill-id-utils.test.d.ts +2 -0
- package/dist/migrate/__tests__/skill-id-utils.test.d.ts.map +1 -0
- package/dist/migrate/__tests__/skill-id-utils.test.js +78 -0
- package/dist/migrate/__tests__/skill-id-utils.test.js.map +1 -0
- package/dist/migrate/codex-capabilities.d.ts +17 -0
- package/dist/migrate/codex-capabilities.d.ts.map +1 -0
- package/dist/migrate/codex-capabilities.js +95 -0
- package/dist/migrate/codex-capabilities.js.map +1 -0
- package/dist/migrate/config-merger/merge-single-sections.d.ts +20 -0
- package/dist/migrate/config-merger/merge-single-sections.d.ts.map +1 -0
- package/dist/migrate/config-merger/merge-single-sections.js +169 -0
- package/dist/migrate/config-merger/merge-single-sections.js.map +1 -0
- package/dist/migrate/converters/claude-to-codex-hooks.d.ts +23 -0
- package/dist/migrate/converters/claude-to-codex-hooks.d.ts.map +1 -0
- package/dist/migrate/converters/claude-to-codex-hooks.js +80 -0
- package/dist/migrate/converters/claude-to-codex-hooks.js.map +1 -0
- package/dist/migrate/converters/direct-copy.d.ts +3 -0
- package/dist/migrate/converters/direct-copy.d.ts.map +1 -0
- package/dist/migrate/converters/direct-copy.js +52 -0
- package/dist/migrate/converters/direct-copy.js.map +1 -0
- package/dist/migrate/converters/fm-strip.d.ts +4 -0
- package/dist/migrate/converters/fm-strip.d.ts.map +1 -0
- package/dist/migrate/converters/fm-strip.js +36 -0
- package/dist/migrate/converters/fm-strip.js.map +1 -0
- package/dist/migrate/converters/fm-to-codex-toml.d.ts +19 -0
- package/dist/migrate/converters/fm-to-codex-toml.d.ts.map +1 -0
- package/dist/migrate/converters/fm-to-codex-toml.js +93 -0
- package/dist/migrate/converters/fm-to-codex-toml.js.map +1 -0
- package/dist/migrate/converters/fm-to-fm.d.ts +3 -0
- package/dist/migrate/converters/fm-to-fm.d.ts.map +1 -0
- package/dist/migrate/converters/fm-to-fm.js +142 -0
- package/dist/migrate/converters/fm-to-fm.js.map +1 -0
- package/dist/migrate/converters/fm-to-json.d.ts +12 -0
- package/dist/migrate/converters/fm-to-json.d.ts.map +1 -0
- package/dist/migrate/converters/fm-to-json.js +55 -0
- package/dist/migrate/converters/fm-to-json.js.map +1 -0
- package/dist/migrate/converters/fm-to-yaml.d.ts +4 -0
- package/dist/migrate/converters/fm-to-yaml.d.ts.map +1 -0
- package/dist/migrate/converters/fm-to-yaml.js +62 -0
- package/dist/migrate/converters/fm-to-yaml.js.map +1 -0
- package/dist/migrate/converters/gemini-hook-event-map.d.ts +6 -0
- package/dist/migrate/converters/gemini-hook-event-map.d.ts.map +1 -0
- package/dist/migrate/converters/gemini-hook-event-map.js +41 -0
- package/dist/migrate/converters/gemini-hook-event-map.js.map +1 -0
- package/dist/migrate/converters/index.d.ts +12 -0
- package/dist/migrate/converters/index.d.ts.map +1 -0
- package/dist/migrate/converters/index.js +66 -0
- package/dist/migrate/converters/index.js.map +1 -0
- package/dist/migrate/converters/md-strip.d.ts +19 -0
- package/dist/migrate/converters/md-strip.d.ts.map +1 -0
- package/dist/migrate/converters/md-strip.js +290 -0
- package/dist/migrate/converters/md-strip.js.map +1 -0
- package/dist/migrate/converters/md-to-kiro-steering.d.ts +3 -0
- package/dist/migrate/converters/md-to-kiro-steering.d.ts.map +1 -0
- package/dist/migrate/converters/md-to-kiro-steering.js +90 -0
- package/dist/migrate/converters/md-to-kiro-steering.js.map +1 -0
- package/dist/migrate/converters/md-to-mdc.d.ts +3 -0
- package/dist/migrate/converters/md-to-mdc.d.ts.map +1 -0
- package/dist/migrate/converters/md-to-mdc.js +19 -0
- package/dist/migrate/converters/md-to-mdc.js.map +1 -0
- package/dist/migrate/converters/md-to-toml.d.ts +4 -0
- package/dist/migrate/converters/md-to-toml.d.ts.map +1 -0
- package/dist/migrate/converters/md-to-toml.js +25 -0
- package/dist/migrate/converters/md-to-toml.js.map +1 -0
- package/dist/migrate/converters/skill-md.d.ts +3 -0
- package/dist/migrate/converters/skill-md.d.ts.map +1 -0
- package/dist/migrate/converters/skill-md.js +18 -0
- package/dist/migrate/converters/skill-md.js.map +1 -0
- package/dist/migrate/discovery/agents-discovery.d.ts +3 -0
- package/dist/migrate/discovery/agents-discovery.d.ts.map +1 -0
- package/dist/migrate/discovery/agents-discovery.js +42 -0
- package/dist/migrate/discovery/agents-discovery.js.map +1 -0
- package/dist/migrate/discovery/commands-discovery.d.ts +3 -0
- package/dist/migrate/discovery/commands-discovery.d.ts.map +1 -0
- package/dist/migrate/discovery/commands-discovery.js +60 -0
- package/dist/migrate/discovery/commands-discovery.js.map +1 -0
- package/dist/migrate/discovery/config-discovery.d.ts +3 -0
- package/dist/migrate/discovery/config-discovery.d.ts.map +1 -0
- package/dist/migrate/discovery/config-discovery.js +17 -0
- package/dist/migrate/discovery/config-discovery.js.map +1 -0
- package/dist/migrate/discovery/exclusions.d.ts +5 -0
- package/dist/migrate/discovery/exclusions.d.ts.map +1 -0
- package/dist/migrate/discovery/exclusions.js +31 -0
- package/dist/migrate/discovery/exclusions.js.map +1 -0
- package/dist/migrate/discovery/handlers-json-filter.d.ts +17 -0
- package/dist/migrate/discovery/handlers-json-filter.d.ts.map +1 -0
- package/dist/migrate/discovery/handlers-json-filter.js +48 -0
- package/dist/migrate/discovery/handlers-json-filter.js.map +1 -0
- package/dist/migrate/discovery/hooks-discovery.d.ts +7 -0
- package/dist/migrate/discovery/hooks-discovery.d.ts.map +1 -0
- package/dist/migrate/discovery/hooks-discovery.js +45 -0
- package/dist/migrate/discovery/hooks-discovery.js.map +1 -0
- package/dist/migrate/discovery/index.d.ts +10 -0
- package/dist/migrate/discovery/index.d.ts.map +1 -0
- package/dist/migrate/discovery/index.js +10 -0
- package/dist/migrate/discovery/index.js.map +1 -0
- package/dist/migrate/discovery/rules-discovery.d.ts +3 -0
- package/dist/migrate/discovery/rules-discovery.d.ts.map +1 -0
- package/dist/migrate/discovery/rules-discovery.js +53 -0
- package/dist/migrate/discovery/rules-discovery.js.map +1 -0
- package/dist/migrate/discovery/skill-id-utils.d.ts +18 -0
- package/dist/migrate/discovery/skill-id-utils.d.ts.map +1 -0
- package/dist/migrate/discovery/skill-id-utils.js +45 -0
- package/dist/migrate/discovery/skill-id-utils.js.map +1 -0
- package/dist/migrate/discovery/skills-discovery.d.ts +5 -0
- package/dist/migrate/discovery/skills-discovery.d.ts.map +1 -0
- package/dist/migrate/discovery/skills-discovery.js +77 -0
- package/dist/migrate/discovery/skills-discovery.js.map +1 -0
- package/dist/migrate/discovery/source-paths.d.ts +13 -0
- package/dist/migrate/discovery/source-paths.d.ts.map +1 -0
- package/dist/migrate/discovery/source-paths.js +63 -0
- package/dist/migrate/discovery/source-paths.js.map +1 -0
- package/dist/migrate/frontmatter-parser.d.ts +4 -0
- package/dist/migrate/frontmatter-parser.d.ts.map +1 -0
- package/dist/migrate/frontmatter-parser.js +99 -0
- package/dist/migrate/frontmatter-parser.js.map +1 -0
- package/dist/migrate/hooks/codex-features-flag.d.ts +8 -0
- package/dist/migrate/hooks/codex-features-flag.d.ts.map +1 -0
- package/dist/migrate/hooks/codex-features-flag.js +146 -0
- package/dist/migrate/hooks/codex-features-flag.js.map +1 -0
- package/dist/migrate/hooks/codex-hook-wrapper.d.ts +10 -0
- package/dist/migrate/hooks/codex-hook-wrapper.d.ts.map +1 -0
- package/dist/migrate/hooks/codex-hook-wrapper.js +166 -0
- package/dist/migrate/hooks/codex-hook-wrapper.js.map +1 -0
- package/dist/migrate/hooks/codex-path-safety.d.ts +5 -0
- package/dist/migrate/hooks/codex-path-safety.d.ts.map +1 -0
- package/dist/migrate/hooks/codex-path-safety.js +99 -0
- package/dist/migrate/hooks/codex-path-safety.js.map +1 -0
- package/dist/migrate/hooks/codex-toml-installer.d.ts +15 -0
- package/dist/migrate/hooks/codex-toml-installer.d.ts.map +1 -0
- package/dist/migrate/hooks/codex-toml-installer.js +124 -0
- package/dist/migrate/hooks/codex-toml-installer.js.map +1 -0
- package/dist/migrate/hooks/hooks-settings-merger.d.ts +20 -0
- package/dist/migrate/hooks/hooks-settings-merger.d.ts.map +1 -0
- package/dist/migrate/hooks/hooks-settings-merger.js +273 -0
- package/dist/migrate/hooks/hooks-settings-merger.js.map +1 -0
- package/dist/migrate/hooks/index.d.ts +7 -0
- package/dist/migrate/hooks/index.d.ts.map +1 -0
- package/dist/migrate/hooks/index.js +7 -0
- package/dist/migrate/hooks/index.js.map +1 -0
- package/dist/migrate/hooks/opencode-config-installer.d.ts +31 -0
- package/dist/migrate/hooks/opencode-config-installer.d.ts.map +1 -0
- package/dist/migrate/hooks/opencode-config-installer.js +116 -0
- package/dist/migrate/hooks/opencode-config-installer.js.map +1 -0
- package/dist/migrate/index.d.ts +15 -0
- package/dist/migrate/index.d.ts.map +1 -0
- package/dist/migrate/index.js +15 -0
- package/dist/migrate/index.js.map +1 -0
- package/dist/migrate/migrate-discover.d.ts +28 -0
- package/dist/migrate/migrate-discover.d.ts.map +1 -0
- package/dist/migrate/migrate-discover.js +52 -0
- package/dist/migrate/migrate-discover.js.map +1 -0
- package/dist/migrate/migrate-mode-resolver.d.ts +10 -0
- package/dist/migrate/migrate-mode-resolver.d.ts.map +1 -0
- package/dist/migrate/migrate-mode-resolver.js +123 -0
- package/dist/migrate/migrate-mode-resolver.js.map +1 -0
- package/dist/migrate/migrate-orchestrator.d.ts +9 -0
- package/dist/migrate/migrate-orchestrator.d.ts.map +1 -0
- package/dist/migrate/migrate-orchestrator.js +204 -0
- package/dist/migrate/migrate-orchestrator.js.map +1 -0
- package/dist/migrate/migrate-scope-resolver.d.ts +19 -0
- package/dist/migrate/migrate-scope-resolver.d.ts.map +1 -0
- package/dist/migrate/migrate-scope-resolver.js +81 -0
- package/dist/migrate/migrate-scope-resolver.js.map +1 -0
- package/dist/migrate/migrate-ui-summary.d.ts +14 -0
- package/dist/migrate/migrate-ui-summary.d.ts.map +1 -0
- package/dist/migrate/migrate-ui-summary.js +65 -0
- package/dist/migrate/migrate-ui-summary.js.map +1 -0
- package/dist/migrate/model-taxonomy.d.ts +16 -0
- package/dist/migrate/model-taxonomy.d.ts.map +1 -0
- package/dist/migrate/model-taxonomy.js +58 -0
- package/dist/migrate/model-taxonomy.js.map +1 -0
- package/dist/migrate/portable-installer.d.ts +14 -0
- package/dist/migrate/portable-installer.d.ts.map +1 -0
- package/dist/migrate/portable-installer.js +159 -0
- package/dist/migrate/portable-installer.js.map +1 -0
- package/dist/migrate/provider-overrides.d.ts +8 -0
- package/dist/migrate/provider-overrides.d.ts.map +1 -0
- package/dist/migrate/provider-overrides.js +40 -0
- package/dist/migrate/provider-overrides.js.map +1 -0
- package/dist/migrate/provider-registry-utils.d.ts +23 -0
- package/dist/migrate/provider-registry-utils.d.ts.map +1 -0
- package/dist/migrate/provider-registry-utils.js +67 -0
- package/dist/migrate/provider-registry-utils.js.map +1 -0
- package/dist/migrate/provider-registry.d.ts +5 -0
- package/dist/migrate/provider-registry.d.ts.map +1 -0
- package/dist/migrate/provider-registry.js +327 -0
- package/dist/migrate/provider-registry.js.map +1 -0
- package/dist/migrate/reconcile/checksum-utils.d.ts +8 -0
- package/dist/migrate/reconcile/checksum-utils.d.ts.map +1 -0
- package/dist/migrate/reconcile/checksum-utils.js +32 -0
- package/dist/migrate/reconcile/checksum-utils.js.map +1 -0
- package/dist/migrate/reconcile/conflict-resolver.d.ts +8 -0
- package/dist/migrate/reconcile/conflict-resolver.d.ts.map +1 -0
- package/dist/migrate/reconcile/conflict-resolver.js +59 -0
- package/dist/migrate/reconcile/conflict-resolver.js.map +1 -0
- package/dist/migrate/reconcile/diff-display.d.ts +6 -0
- package/dist/migrate/reconcile/diff-display.d.ts.map +1 -0
- package/dist/migrate/reconcile/diff-display.js +40 -0
- package/dist/migrate/reconcile/diff-display.js.map +1 -0
- package/dist/migrate/reconcile/index.d.ts +10 -0
- package/dist/migrate/reconcile/index.d.ts.map +1 -0
- package/dist/migrate/reconcile/index.js +10 -0
- package/dist/migrate/reconcile/index.js.map +1 -0
- package/dist/migrate/reconcile/output-sanitizer.d.ts +3 -0
- package/dist/migrate/reconcile/output-sanitizer.d.ts.map +1 -0
- package/dist/migrate/reconcile/output-sanitizer.js +42 -0
- package/dist/migrate/reconcile/output-sanitizer.js.map +1 -0
- package/dist/migrate/reconcile/portable-registry.d.ts +142 -0
- package/dist/migrate/reconcile/portable-registry.d.ts.map +1 -0
- package/dist/migrate/reconcile/portable-registry.js +224 -0
- package/dist/migrate/reconcile/portable-registry.js.map +1 -0
- package/dist/migrate/reconcile/process-lock.d.ts +15 -0
- package/dist/migrate/reconcile/process-lock.d.ts.map +1 -0
- package/dist/migrate/reconcile/process-lock.js +77 -0
- package/dist/migrate/reconcile/process-lock.js.map +1 -0
- package/dist/migrate/reconcile/reconcile-state-builders.d.ts +24 -0
- package/dist/migrate/reconcile/reconcile-state-builders.d.ts.map +1 -0
- package/dist/migrate/reconcile/reconcile-state-builders.js +185 -0
- package/dist/migrate/reconcile/reconcile-state-builders.js.map +1 -0
- package/dist/migrate/reconcile/reconcile-types.d.ts +113 -0
- package/dist/migrate/reconcile/reconcile-types.d.ts.map +1 -0
- package/dist/migrate/reconcile/reconcile-types.js +42 -0
- package/dist/migrate/reconcile/reconcile-types.js.map +1 -0
- package/dist/migrate/reconcile/reconciler.d.ts +3 -0
- package/dist/migrate/reconcile/reconciler.d.ts.map +1 -0
- package/dist/migrate/reconcile/reconciler.js +445 -0
- package/dist/migrate/reconcile/reconciler.js.map +1 -0
- package/dist/migrate/skill-directory-installer.d.ts +23 -0
- package/dist/migrate/skill-directory-installer.d.ts.map +1 -0
- package/dist/migrate/skill-directory-installer.js +55 -0
- package/dist/migrate/skill-directory-installer.js.map +1 -0
- package/dist/migrate/types.d.ts +174 -0
- package/dist/migrate/types.d.ts.map +1 -0
- package/dist/migrate/types.js +45 -0
- package/dist/migrate/types.js.map +1 -0
- package/dist/orchviz/constants.d.ts +53 -0
- package/dist/orchviz/constants.d.ts.map +1 -0
- package/dist/orchviz/constants.js +68 -0
- package/dist/orchviz/constants.js.map +1 -0
- package/dist/orchviz/fs-utils.d.ts +24 -0
- package/dist/orchviz/fs-utils.d.ts.map +1 -0
- package/dist/orchviz/fs-utils.js +49 -0
- package/dist/orchviz/fs-utils.js.map +1 -0
- package/dist/orchviz/index.d.ts +29 -0
- package/dist/orchviz/index.d.ts.map +1 -0
- package/dist/orchviz/index.js +28 -0
- package/dist/orchviz/index.js.map +1 -0
- package/dist/orchviz/log-persister.d.ts +22 -0
- package/dist/orchviz/log-persister.d.ts.map +1 -0
- package/dist/orchviz/log-persister.js +96 -0
- package/dist/orchviz/log-persister.js.map +1 -0
- package/dist/orchviz/logger.d.ts +13 -0
- package/dist/orchviz/logger.d.ts.map +1 -0
- package/dist/orchviz/logger.js +47 -0
- package/dist/orchviz/logger.js.map +1 -0
- package/dist/orchviz/open-url.d.ts +11 -0
- package/dist/orchviz/open-url.d.ts.map +1 -0
- package/dist/orchviz/open-url.js +28 -0
- package/dist/orchviz/open-url.js.map +1 -0
- package/dist/orchviz/overlay/collector.d.ts +29 -0
- package/dist/orchviz/overlay/collector.d.ts.map +1 -0
- package/dist/orchviz/overlay/collector.js +38 -0
- package/dist/orchviz/overlay/collector.js.map +1 -0
- package/dist/orchviz/overlay/gate-readers.d.ts +18 -0
- package/dist/orchviz/overlay/gate-readers.d.ts.map +1 -0
- package/dist/orchviz/overlay/gate-readers.js +111 -0
- package/dist/orchviz/overlay/gate-readers.js.map +1 -0
- package/dist/orchviz/overlay/session-state-readers.d.ts +18 -0
- package/dist/orchviz/overlay/session-state-readers.d.ts.map +1 -0
- package/dist/orchviz/overlay/session-state-readers.js +78 -0
- package/dist/orchviz/overlay/session-state-readers.js.map +1 -0
- package/dist/orchviz/parser/handle-progress.d.ts +9 -0
- package/dist/orchviz/parser/handle-progress.d.ts.map +1 -0
- package/dist/orchviz/parser/handle-progress.js +38 -0
- package/dist/orchviz/parser/handle-progress.js.map +1 -0
- package/dist/orchviz/parser/handle-text.d.ts +10 -0
- package/dist/orchviz/parser/handle-text.d.ts.map +1 -0
- package/dist/orchviz/parser/handle-text.js +38 -0
- package/dist/orchviz/parser/handle-text.js.map +1 -0
- package/dist/orchviz/parser/handle-thinking.d.ts +10 -0
- package/dist/orchviz/parser/handle-thinking.d.ts.map +1 -0
- package/dist/orchviz/parser/handle-thinking.js +35 -0
- package/dist/orchviz/parser/handle-thinking.js.map +1 -0
- package/dist/orchviz/parser/handle-tool-result.d.ts +10 -0
- package/dist/orchviz/parser/handle-tool-result.d.ts.map +1 -0
- package/dist/orchviz/parser/handle-tool-result.js +62 -0
- package/dist/orchviz/parser/handle-tool-result.js.map +1 -0
- package/dist/orchviz/parser/handle-tool-use.d.ts +11 -0
- package/dist/orchviz/parser/handle-tool-use.d.ts.map +1 -0
- package/dist/orchviz/parser/handle-tool-use.js +38 -0
- package/dist/orchviz/parser/handle-tool-use.js.map +1 -0
- package/dist/orchviz/parser/index.d.ts +38 -0
- package/dist/orchviz/parser/index.d.ts.map +1 -0
- package/dist/orchviz/parser/index.js +139 -0
- package/dist/orchviz/parser/index.js.map +1 -0
- package/dist/orchviz/parser/label-helpers.d.ts +9 -0
- package/dist/orchviz/parser/label-helpers.d.ts.map +1 -0
- package/dist/orchviz/parser/label-helpers.js +44 -0
- package/dist/orchviz/parser/label-helpers.js.map +1 -0
- package/dist/orchviz/parser/strip-ansi.d.ts +6 -0
- package/dist/orchviz/parser/strip-ansi.d.ts.map +1 -0
- package/dist/orchviz/parser/strip-ansi.js +14 -0
- package/dist/orchviz/parser/strip-ansi.js.map +1 -0
- package/dist/orchviz/parser/utils.d.ts +20 -0
- package/dist/orchviz/parser/utils.d.ts.map +1 -0
- package/dist/orchviz/parser/utils.js +56 -0
- package/dist/orchviz/parser/utils.js.map +1 -0
- package/dist/orchviz/permission-detection.d.ts +18 -0
- package/dist/orchviz/permission-detection.d.ts.map +1 -0
- package/dist/orchviz/permission-detection.js +50 -0
- package/dist/orchviz/permission-detection.js.map +1 -0
- package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.d.ts +15 -0
- package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.d.ts.map +1 -0
- package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.js +165 -0
- package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.js.map +1 -0
- package/dist/orchviz/plan/__tests__/atomic-write.test.d.ts +11 -0
- package/dist/orchviz/plan/__tests__/atomic-write.test.d.ts.map +1 -0
- package/dist/orchviz/plan/__tests__/atomic-write.test.js +89 -0
- package/dist/orchviz/plan/__tests__/atomic-write.test.js.map +1 -0
- package/dist/orchviz/plan/__tests__/end-to-end.test.d.ts +10 -0
- package/dist/orchviz/plan/__tests__/end-to-end.test.d.ts.map +1 -0
- package/dist/orchviz/plan/__tests__/end-to-end.test.js +132 -0
- package/dist/orchviz/plan/__tests__/end-to-end.test.js.map +1 -0
- package/dist/orchviz/plan/__tests__/etag.test.d.ts +11 -0
- package/dist/orchviz/plan/__tests__/etag.test.d.ts.map +1 -0
- package/dist/orchviz/plan/__tests__/etag.test.js +92 -0
- package/dist/orchviz/plan/__tests__/etag.test.js.map +1 -0
- package/dist/orchviz/plan/__tests__/list-plans.test.d.ts +14 -0
- package/dist/orchviz/plan/__tests__/list-plans.test.d.ts.map +1 -0
- package/dist/orchviz/plan/__tests__/list-plans.test.js +154 -0
- package/dist/orchviz/plan/__tests__/list-plans.test.js.map +1 -0
- package/dist/orchviz/plan/apply-todo-toggle.d.ts +29 -0
- package/dist/orchviz/plan/apply-todo-toggle.d.ts.map +1 -0
- package/dist/orchviz/plan/apply-todo-toggle.js +129 -0
- package/dist/orchviz/plan/apply-todo-toggle.js.map +1 -0
- package/dist/orchviz/plan/atomic-write.d.ts +25 -0
- package/dist/orchviz/plan/atomic-write.d.ts.map +1 -0
- package/dist/orchviz/plan/atomic-write.js +85 -0
- package/dist/orchviz/plan/atomic-write.js.map +1 -0
- package/dist/orchviz/plan/collector.d.ts +49 -0
- package/dist/orchviz/plan/collector.d.ts.map +1 -0
- package/dist/orchviz/plan/collector.js +173 -0
- package/dist/orchviz/plan/collector.js.map +1 -0
- package/dist/orchviz/plan/etag.d.ts +24 -0
- package/dist/orchviz/plan/etag.d.ts.map +1 -0
- package/dist/orchviz/plan/etag.js +58 -0
- package/dist/orchviz/plan/etag.js.map +1 -0
- package/dist/orchviz/plan/find-active-plan.d.ts +9 -0
- package/dist/orchviz/plan/find-active-plan.d.ts.map +1 -0
- package/dist/orchviz/plan/find-active-plan.js +90 -0
- package/dist/orchviz/plan/find-active-plan.js.map +1 -0
- package/dist/orchviz/plan/index.d.ts +23 -0
- package/dist/orchviz/plan/index.d.ts.map +1 -0
- package/dist/orchviz/plan/index.js +91 -0
- package/dist/orchviz/plan/index.js.map +1 -0
- package/dist/orchviz/plan/list-plans.d.ts +19 -0
- package/dist/orchviz/plan/list-plans.d.ts.map +1 -0
- package/dist/orchviz/plan/list-plans.js +148 -0
- package/dist/orchviz/plan/list-plans.js.map +1 -0
- package/dist/orchviz/plan/parse-phase-file.d.ts +13 -0
- package/dist/orchviz/plan/parse-phase-file.d.ts.map +1 -0
- package/dist/orchviz/plan/parse-phase-file.js +136 -0
- package/dist/orchviz/plan/parse-phase-file.js.map +1 -0
- package/dist/orchviz/plan/parse-plan-file.d.ts +19 -0
- package/dist/orchviz/plan/parse-plan-file.d.ts.map +1 -0
- package/dist/orchviz/plan/parse-plan-file.js +62 -0
- package/dist/orchviz/plan/parse-plan-file.js.map +1 -0
- package/dist/orchviz/plan/plan-constants.d.ts +17 -0
- package/dist/orchviz/plan/plan-constants.d.ts.map +1 -0
- package/dist/orchviz/plan/plan-constants.js +19 -0
- package/dist/orchviz/plan/plan-constants.js.map +1 -0
- package/dist/orchviz/plan/types.d.ts +46 -0
- package/dist/orchviz/plan/types.d.ts.map +1 -0
- package/dist/orchviz/plan/types.js +6 -0
- package/dist/orchviz/plan/types.js.map +1 -0
- package/dist/orchviz/protocol.d.ts +116 -0
- package/dist/orchviz/protocol.d.ts.map +1 -0
- package/dist/orchviz/protocol.js +23 -0
- package/dist/orchviz/protocol.js.map +1 -0
- package/dist/orchviz/redact.d.ts +10 -0
- package/dist/orchviz/redact.d.ts.map +1 -0
- package/dist/orchviz/redact.js +38 -0
- package/dist/orchviz/redact.js.map +1 -0
- package/dist/orchviz/sanitize.d.ts +11 -0
- package/dist/orchviz/sanitize.d.ts.map +1 -0
- package/dist/orchviz/sanitize.js +38 -0
- package/dist/orchviz/sanitize.js.map +1 -0
- package/dist/orchviz/server/__tests__/security-smoke.test.d.ts +13 -0
- package/dist/orchviz/server/__tests__/security-smoke.test.d.ts.map +1 -0
- package/dist/orchviz/server/__tests__/security-smoke.test.js +207 -0
- package/dist/orchviz/server/__tests__/security-smoke.test.js.map +1 -0
- package/dist/orchviz/server/__tests__/write-handlers.test.d.ts +24 -0
- package/dist/orchviz/server/__tests__/write-handlers.test.d.ts.map +1 -0
- package/dist/orchviz/server/__tests__/write-handlers.test.js +347 -0
- package/dist/orchviz/server/__tests__/write-handlers.test.js.map +1 -0
- package/dist/orchviz/server/api-handlers.d.ts +55 -0
- package/dist/orchviz/server/api-handlers.d.ts.map +1 -0
- package/dist/orchviz/server/api-handlers.js +112 -0
- package/dist/orchviz/server/api-handlers.js.map +1 -0
- package/dist/orchviz/server/index.d.ts +36 -0
- package/dist/orchviz/server/index.d.ts.map +1 -0
- package/dist/orchviz/server/index.js +147 -0
- package/dist/orchviz/server/index.js.map +1 -0
- package/dist/orchviz/server/sse-handler.d.ts +25 -0
- package/dist/orchviz/server/sse-handler.d.ts.map +1 -0
- package/dist/orchviz/server/sse-handler.js +128 -0
- package/dist/orchviz/server/sse-handler.js.map +1 -0
- package/dist/orchviz/server/static-handler.d.ts +9 -0
- package/dist/orchviz/server/static-handler.d.ts.map +1 -0
- package/dist/orchviz/server/static-handler.js +76 -0
- package/dist/orchviz/server/static-handler.js.map +1 -0
- package/dist/orchviz/server/write-handlers.d.ts +20 -0
- package/dist/orchviz/server/write-handlers.d.ts.map +1 -0
- package/dist/orchviz/server/write-handlers.js +167 -0
- package/dist/orchviz/server/write-handlers.js.map +1 -0
- package/dist/orchviz/server/write-utils.d.ts +59 -0
- package/dist/orchviz/server/write-utils.d.ts.map +1 -0
- package/dist/orchviz/server/write-utils.js +161 -0
- package/dist/orchviz/server/write-utils.js.map +1 -0
- package/dist/orchviz/session-discovery.d.ts +19 -0
- package/dist/orchviz/session-discovery.d.ts.map +1 -0
- package/dist/orchviz/session-discovery.js +104 -0
- package/dist/orchviz/session-discovery.js.map +1 -0
- package/dist/orchviz/session-manager.d.ts +17 -0
- package/dist/orchviz/session-manager.d.ts.map +1 -0
- package/dist/orchviz/session-manager.js +62 -0
- package/dist/orchviz/session-manager.js.map +1 -0
- package/dist/orchviz/session-runtime.d.ts +22 -0
- package/dist/orchviz/session-runtime.d.ts.map +1 -0
- package/dist/orchviz/session-runtime.js +135 -0
- package/dist/orchviz/session-runtime.js.map +1 -0
- package/dist/orchviz/session-watcher.d.ts +33 -0
- package/dist/orchviz/session-watcher.d.ts.map +1 -0
- package/dist/orchviz/session-watcher.js +135 -0
- package/dist/orchviz/session-watcher.js.map +1 -0
- package/dist/orchviz/subagent-meta.d.ts +8 -0
- package/dist/orchviz/subagent-meta.d.ts.map +1 -0
- package/dist/orchviz/subagent-meta.js +28 -0
- package/dist/orchviz/subagent-meta.js.map +1 -0
- package/dist/orchviz/subagent-scanner.d.ts +15 -0
- package/dist/orchviz/subagent-scanner.d.ts.map +1 -0
- package/dist/orchviz/subagent-scanner.js +27 -0
- package/dist/orchviz/subagent-scanner.js.map +1 -0
- package/dist/orchviz/subagent-watcher.d.ts +19 -0
- package/dist/orchviz/subagent-watcher.d.ts.map +1 -0
- package/dist/orchviz/subagent-watcher.js +147 -0
- package/dist/orchviz/subagent-watcher.js.map +1 -0
- package/dist/orchviz/test-server-boot.d.ts +28 -0
- package/dist/orchviz/test-server-boot.d.ts.map +1 -0
- package/dist/orchviz/test-server-boot.js +64 -0
- package/dist/orchviz/test-server-boot.js.map +1 -0
- package/dist/orchviz/token-estimator.d.ts +11 -0
- package/dist/orchviz/token-estimator.d.ts.map +1 -0
- package/dist/orchviz/token-estimator.js +38 -0
- package/dist/orchviz/token-estimator.js.map +1 -0
- package/dist/orchviz/tool-input-data.d.ts +11 -0
- package/dist/orchviz/tool-input-data.d.ts.map +1 -0
- package/dist/orchviz/tool-input-data.js +76 -0
- package/dist/orchviz/tool-input-data.js.map +1 -0
- package/dist/orchviz/tool-summarizer.d.ts +16 -0
- package/dist/orchviz/tool-summarizer.d.ts.map +1 -0
- package/dist/orchviz/tool-summarizer.js +131 -0
- package/dist/orchviz/tool-summarizer.js.map +1 -0
- package/dist/orchviz-web/index.css +1 -0
- package/dist/orchviz-web/index.html +18 -0
- package/dist/orchviz-web/index.js +51 -0
- package/package.json +18 -3
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for list-plans.ts — listPlans().
|
|
3
|
+
*
|
|
4
|
+
* Coverage:
|
|
5
|
+
* - 3-plan fixture: returns all non-archived plans
|
|
6
|
+
* - Archived plan is filtered out
|
|
7
|
+
* - Sorted by plan.md mtimeMs descending
|
|
8
|
+
* - limit cap respected
|
|
9
|
+
* - Boundary rejection (symlink outside plansDir)
|
|
10
|
+
* - Missing tasks/plans/ returns []
|
|
11
|
+
* - Invalid slug name rejected (not returned)
|
|
12
|
+
*/
|
|
13
|
+
import { describe, expect, it, afterEach } from "vitest";
|
|
14
|
+
import * as fs from "node:fs";
|
|
15
|
+
import * as os from "node:os";
|
|
16
|
+
import * as path from "node:path";
|
|
17
|
+
import { listPlans } from "../list-plans.js";
|
|
18
|
+
let tmpDir = null;
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
if (tmpDir) {
|
|
21
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
22
|
+
tmpDir = null;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
function makeProjectRoot() {
|
|
26
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "list-plans-test-"));
|
|
27
|
+
const root = tmpDir;
|
|
28
|
+
const plansDir = path.join(root, "tasks", "plans");
|
|
29
|
+
fs.mkdirSync(plansDir, { recursive: true });
|
|
30
|
+
return { root, plansDir };
|
|
31
|
+
}
|
|
32
|
+
function writePlanDir(plansDir, slug, opts = {}) {
|
|
33
|
+
const dir = path.join(plansDir, slug);
|
|
34
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
35
|
+
const status = opts.status ?? "draft";
|
|
36
|
+
const title = opts.title ?? `Plan ${slug}`;
|
|
37
|
+
const frontmatter = [
|
|
38
|
+
"---",
|
|
39
|
+
`title: "${title}"`,
|
|
40
|
+
`status: ${status}`,
|
|
41
|
+
`created: "${opts.created ?? "260501"}"`,
|
|
42
|
+
`effort: "${opts.effort ?? "m"}"`,
|
|
43
|
+
"---",
|
|
44
|
+
"",
|
|
45
|
+
`# ${title}`,
|
|
46
|
+
].join("\n");
|
|
47
|
+
fs.writeFileSync(path.join(dir, "plan.md"), frontmatter, "utf-8");
|
|
48
|
+
for (let i = 1; i <= (opts.phaseCount ?? 0); i++) {
|
|
49
|
+
fs.writeFileSync(path.join(dir, `phase-0${i}-step.md`), `# Phase ${i}\n\n## Todo List\n\n- [ ] Do something\n`, "utf-8");
|
|
50
|
+
}
|
|
51
|
+
return dir;
|
|
52
|
+
}
|
|
53
|
+
describe("listPlans", () => {
|
|
54
|
+
it("returns [] when tasks/plans/ does not exist", () => {
|
|
55
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "list-plans-no-dir-"));
|
|
56
|
+
const result = listPlans(tmpDir);
|
|
57
|
+
expect(result).toEqual([]);
|
|
58
|
+
});
|
|
59
|
+
it("returns all non-archived plans", () => {
|
|
60
|
+
const { root, plansDir } = makeProjectRoot();
|
|
61
|
+
writePlanDir(plansDir, "260501-alpha", { status: "draft" });
|
|
62
|
+
writePlanDir(plansDir, "260501-beta", { status: "in_progress" });
|
|
63
|
+
writePlanDir(plansDir, "260501-gamma", { status: "active" });
|
|
64
|
+
const result = listPlans(root);
|
|
65
|
+
expect(result).toHaveLength(3);
|
|
66
|
+
const slugs = result.map((p) => p.slug);
|
|
67
|
+
expect(slugs).toContain("260501-alpha");
|
|
68
|
+
expect(slugs).toContain("260501-beta");
|
|
69
|
+
expect(slugs).toContain("260501-gamma");
|
|
70
|
+
});
|
|
71
|
+
it("filters out archived plans", () => {
|
|
72
|
+
const { root, plansDir } = makeProjectRoot();
|
|
73
|
+
writePlanDir(plansDir, "260501-active", { status: "draft" });
|
|
74
|
+
writePlanDir(plansDir, "260501-archived", { status: "archived" });
|
|
75
|
+
const result = listPlans(root);
|
|
76
|
+
expect(result).toHaveLength(1);
|
|
77
|
+
expect(result[0].slug).toBe("260501-active");
|
|
78
|
+
});
|
|
79
|
+
it("sorts by plan.md mtimeMs descending", () => {
|
|
80
|
+
const { root, plansDir } = makeProjectRoot();
|
|
81
|
+
const dirA = writePlanDir(plansDir, "260501-first", { status: "draft" });
|
|
82
|
+
// Small delay or touch to ensure different mtime
|
|
83
|
+
const dirB = writePlanDir(plansDir, "260501-second", { status: "draft" });
|
|
84
|
+
// Touch the first plan so it becomes most recent
|
|
85
|
+
const now = new Date();
|
|
86
|
+
fs.utimesSync(path.join(dirA, "plan.md"), now, new Date(Date.now() + 2000));
|
|
87
|
+
// We need the second plan to have an older mtime — set it explicitly in the past
|
|
88
|
+
const past = new Date(Date.now() - 10000);
|
|
89
|
+
fs.utimesSync(path.join(dirB, "plan.md"), past, past);
|
|
90
|
+
const result = listPlans(root);
|
|
91
|
+
expect(result).toHaveLength(2);
|
|
92
|
+
expect(result[0].slug).toBe("260501-first");
|
|
93
|
+
expect(result[1].slug).toBe("260501-second");
|
|
94
|
+
// Confirm descending order
|
|
95
|
+
expect(result[0].mtimeMs).toBeGreaterThan(result[1].mtimeMs);
|
|
96
|
+
});
|
|
97
|
+
it("respects the limit option", () => {
|
|
98
|
+
const { root, plansDir } = makeProjectRoot();
|
|
99
|
+
writePlanDir(plansDir, "260501-plan-a", { status: "draft" });
|
|
100
|
+
writePlanDir(plansDir, "260501-plan-b", { status: "draft" });
|
|
101
|
+
writePlanDir(plansDir, "260501-plan-c", { status: "active" });
|
|
102
|
+
const result = listPlans(root, { limit: 2 });
|
|
103
|
+
expect(result).toHaveLength(2);
|
|
104
|
+
});
|
|
105
|
+
it("includes phaseCount from phase-NN-*.md files", () => {
|
|
106
|
+
const { root, plansDir } = makeProjectRoot();
|
|
107
|
+
writePlanDir(plansDir, "260501-three-phases", { status: "draft", phaseCount: 3 });
|
|
108
|
+
const result = listPlans(root);
|
|
109
|
+
expect(result).toHaveLength(1);
|
|
110
|
+
expect(result[0].phaseCount).toBe(3);
|
|
111
|
+
});
|
|
112
|
+
it("returns slug, title, status, created, effort fields", () => {
|
|
113
|
+
const { root, plansDir } = makeProjectRoot();
|
|
114
|
+
writePlanDir(plansDir, "260501-full-fields", {
|
|
115
|
+
title: "My Test Plan",
|
|
116
|
+
status: "active",
|
|
117
|
+
created: "260501",
|
|
118
|
+
effort: "l",
|
|
119
|
+
});
|
|
120
|
+
const result = listPlans(root);
|
|
121
|
+
expect(result).toHaveLength(1);
|
|
122
|
+
const plan = result[0];
|
|
123
|
+
expect(plan.slug).toBe("260501-full-fields");
|
|
124
|
+
expect(plan.title).toBe("My Test Plan");
|
|
125
|
+
expect(plan.status).toBe("active");
|
|
126
|
+
expect(plan.created).toBe("260501");
|
|
127
|
+
expect(plan.effort).toBe("l");
|
|
128
|
+
expect(typeof plan.mtimeMs).toBe("number");
|
|
129
|
+
});
|
|
130
|
+
it("rejects symlinks pointing outside the boundary", () => {
|
|
131
|
+
const { root, plansDir } = makeProjectRoot();
|
|
132
|
+
// Create a valid plan for baseline
|
|
133
|
+
writePlanDir(plansDir, "260501-legit", { status: "draft" });
|
|
134
|
+
// Create a symlink that points to a temp dir outside the boundary
|
|
135
|
+
const outsideDir = fs.mkdtempSync(path.join(os.tmpdir(), "outside-boundary-"));
|
|
136
|
+
// Write a valid plan.md in outside dir so it would pass other checks
|
|
137
|
+
fs.writeFileSync(path.join(outsideDir, "plan.md"), "---\ntitle: Sneaky\nstatus: active\n---\n");
|
|
138
|
+
const symlinkPath = path.join(plansDir, "evil-symlink");
|
|
139
|
+
try {
|
|
140
|
+
fs.symlinkSync(outsideDir, symlinkPath);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// If symlink creation fails (e.g., Windows restrictions), skip boundary test
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const result = listPlans(root);
|
|
147
|
+
const slugs = result.map((p) => p.slug);
|
|
148
|
+
// The symlink plan should be rejected by realpath boundary check
|
|
149
|
+
expect(slugs).not.toContain("evil-symlink");
|
|
150
|
+
// The legit plan should still be present
|
|
151
|
+
expect(slugs).toContain("260501-legit");
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=list-plans.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-plans.test.js","sourceRoot":"","sources":["../../../../src/orchviz/plan/__tests__/list-plans.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* apply-todo-toggle — pure function that flips a single checkbox marker
|
|
3
|
+
* inside the ## Todo List section of a phase file's content string.
|
|
4
|
+
*
|
|
5
|
+
* Contract:
|
|
6
|
+
* - No fs, no http, no side effects. Pure transformation only.
|
|
7
|
+
* - Mirrors extractTodos fence-aware walk exactly (per red-team C1).
|
|
8
|
+
* - CRLF preserved: majority-EOL detection applied to full content.
|
|
9
|
+
* - Idempotent: marker already matches desired → {changed: false}.
|
|
10
|
+
* - Error tags are static strings, NEVER interpolated content (R2-14).
|
|
11
|
+
*/
|
|
12
|
+
/** Static error tags returned when applyTodoToggle cannot apply the flip. */
|
|
13
|
+
export type TodoToggleErrorTag = "section-missing" | "out-of-range" | "fence-overflow";
|
|
14
|
+
export type TodoToggleResult = {
|
|
15
|
+
content: string;
|
|
16
|
+
changed: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
error: TodoToggleErrorTag;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Flip the Nth (0-based) checkbox marker in ## Todo List section.
|
|
22
|
+
*
|
|
23
|
+
* Fence-aware walk matches extractTodos in parse-phase-file.ts exactly:
|
|
24
|
+
* - Lines matching /^```/ toggle fenceDepth 0→1 or 1→0.
|
|
25
|
+
* - Checkbox lines inside fences (fenceDepth > 0) are skipped/not counted.
|
|
26
|
+
* - Only `^phase-` regex used in server, NOT here — caller decides glob.
|
|
27
|
+
*/
|
|
28
|
+
export declare function applyTodoToggle(content: string, todoIdx: number, checked: boolean): TodoToggleResult;
|
|
29
|
+
//# sourceMappingURL=apply-todo-toggle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-todo-toggle.d.ts","sourceRoot":"","sources":["../../../src/orchviz/plan/apply-todo-toggle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,kBAAkB,GAC3B,iBAAiB,GACjB,cAAc,GACd,gBAAgB,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GACzB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACrC;IAAE,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAyBjC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,GACd,gBAAgB,CAqGlB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* apply-todo-toggle — pure function that flips a single checkbox marker
|
|
3
|
+
* inside the ## Todo List section of a phase file's content string.
|
|
4
|
+
*
|
|
5
|
+
* Contract:
|
|
6
|
+
* - No fs, no http, no side effects. Pure transformation only.
|
|
7
|
+
* - Mirrors extractTodos fence-aware walk exactly (per red-team C1).
|
|
8
|
+
* - CRLF preserved: majority-EOL detection applied to full content.
|
|
9
|
+
* - Idempotent: marker already matches desired → {changed: false}.
|
|
10
|
+
* - Error tags are static strings, NEVER interpolated content (R2-14).
|
|
11
|
+
*/
|
|
12
|
+
const TODO_RE = /^(\s*-\s*\[)(\s|x|X|~|✓)(\]\s+.+?)\s*$/;
|
|
13
|
+
const FENCE_RE = /^```/;
|
|
14
|
+
/**
|
|
15
|
+
* Detect the dominant line ending character.
|
|
16
|
+
* Returns "\r\n" if CRLF count > LF-only count, else "\n".
|
|
17
|
+
*/
|
|
18
|
+
function detectEol(content) {
|
|
19
|
+
const crlfCount = (content.match(/\r\n/g) ?? []).length;
|
|
20
|
+
const lfCount = (content.match(/(?<!\r)\n/g) ?? []).length;
|
|
21
|
+
// Detect mixed-EOL (meaningful mix: both > 0 and neither dominates by 2:1)
|
|
22
|
+
if (crlfCount > 0 && lfCount > 0) {
|
|
23
|
+
// Accept minor contamination (≤20% minority) as "effectively uniform"
|
|
24
|
+
const total = crlfCount + lfCount;
|
|
25
|
+
const minority = Math.min(crlfCount, lfCount);
|
|
26
|
+
if (minority / total > 0.2) {
|
|
27
|
+
// Genuinely mixed — caller may want to warn, but we proceed with majority
|
|
28
|
+
// and let the eol-mixed error tag be used if the caller needs it.
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return crlfCount >= lfCount ? "\r\n" : "\n";
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Flip the Nth (0-based) checkbox marker in ## Todo List section.
|
|
35
|
+
*
|
|
36
|
+
* Fence-aware walk matches extractTodos in parse-phase-file.ts exactly:
|
|
37
|
+
* - Lines matching /^```/ toggle fenceDepth 0→1 or 1→0.
|
|
38
|
+
* - Checkbox lines inside fences (fenceDepth > 0) are skipped/not counted.
|
|
39
|
+
* - Only `^phase-` regex used in server, NOT here — caller decides glob.
|
|
40
|
+
*/
|
|
41
|
+
export function applyTodoToggle(content, todoIdx, checked) {
|
|
42
|
+
// Split preserving original EOL on each line for later reassembly.
|
|
43
|
+
// We split on \n and check if each line ends with \r (for CRLF lines).
|
|
44
|
+
const eol = detectEol(content);
|
|
45
|
+
// Split into raw lines (without any EOL); we'll reassemble with detected eol.
|
|
46
|
+
// Handle CRLF: split on \n, strip trailing \r from each line for processing,
|
|
47
|
+
// then reattach the correct EOL on reassembly.
|
|
48
|
+
const rawLines = content.split("\n");
|
|
49
|
+
const lines = rawLines.map((l) => (l.endsWith("\r") ? l.slice(0, -1) : l));
|
|
50
|
+
// Locate ## Todo List section start
|
|
51
|
+
const todoSectionRe = /^##\s+Todo\s+List\s*$/i;
|
|
52
|
+
const nextSectionRe = /^##?\s/;
|
|
53
|
+
let sectionStart = -1;
|
|
54
|
+
let sectionEnd = lines.length;
|
|
55
|
+
for (let i = 0; i < lines.length; i++) {
|
|
56
|
+
if (todoSectionRe.test(lines[i])) {
|
|
57
|
+
sectionStart = i + 1;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (sectionStart !== -1 && i > sectionStart && nextSectionRe.test(lines[i])) {
|
|
61
|
+
sectionEnd = i;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (sectionStart === -1) {
|
|
66
|
+
return { error: "section-missing" };
|
|
67
|
+
}
|
|
68
|
+
// Walk todo section with fence tracker (must match extractTodos exactly)
|
|
69
|
+
let fenceDepth = 0;
|
|
70
|
+
let count = 0;
|
|
71
|
+
let targetLineIdx = -1;
|
|
72
|
+
for (let i = sectionStart; i < sectionEnd; i++) {
|
|
73
|
+
const line = lines[i];
|
|
74
|
+
if (FENCE_RE.test(line)) {
|
|
75
|
+
fenceDepth = fenceDepth === 0 ? 1 : 0;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (fenceDepth > 0)
|
|
79
|
+
continue;
|
|
80
|
+
const m = line.match(TODO_RE);
|
|
81
|
+
if (!m)
|
|
82
|
+
continue;
|
|
83
|
+
if (count === todoIdx) {
|
|
84
|
+
targetLineIdx = i;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
count++;
|
|
88
|
+
}
|
|
89
|
+
// Fence depth not closed: error (malformed doc)
|
|
90
|
+
if (fenceDepth > 0) {
|
|
91
|
+
return { error: "fence-overflow" };
|
|
92
|
+
}
|
|
93
|
+
if (targetLineIdx === -1) {
|
|
94
|
+
return { error: "out-of-range" };
|
|
95
|
+
}
|
|
96
|
+
// Check idempotency: does current marker already match desired state?
|
|
97
|
+
const m = lines[targetLineIdx].match(TODO_RE);
|
|
98
|
+
if (!m) {
|
|
99
|
+
// Shouldn't happen since we matched above, but guard defensively
|
|
100
|
+
return { error: "out-of-range" };
|
|
101
|
+
}
|
|
102
|
+
const currentMarker = m[2];
|
|
103
|
+
const currentChecked = currentMarker !== " " && currentMarker !== "";
|
|
104
|
+
if (currentChecked === checked) {
|
|
105
|
+
// Already in desired state — idempotent no-op
|
|
106
|
+
return { content, changed: false };
|
|
107
|
+
}
|
|
108
|
+
// Flip: replace marker char
|
|
109
|
+
const newMarker = checked ? "x" : " ";
|
|
110
|
+
const newLine = m[1] + newMarker + m[3];
|
|
111
|
+
lines[targetLineIdx] = newLine;
|
|
112
|
+
// Reassemble with original EOL type
|
|
113
|
+
// If original was CRLF, rawLines had \r on each line; we stripped them above.
|
|
114
|
+
// Now rebuild: join with detected EOL. Last line may or may not have trailing EOL.
|
|
115
|
+
const hasTrailingNewline = content.endsWith("\n") || content.endsWith("\r\n");
|
|
116
|
+
let newContent;
|
|
117
|
+
if (eol === "\r\n") {
|
|
118
|
+
newContent = lines.join("\r\n");
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
newContent = lines.join("\n");
|
|
122
|
+
}
|
|
123
|
+
// Preserve trailing newline if original had one
|
|
124
|
+
if (hasTrailingNewline && !newContent.endsWith("\n")) {
|
|
125
|
+
newContent += eol;
|
|
126
|
+
}
|
|
127
|
+
return { content: newContent, changed: true };
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=apply-todo-toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-todo-toggle.js","sourceRoot":"","sources":["../../../src/orchviz/plan/apply-todo-toggle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,MAAM,OAAO,GAAG,wCAAwC,CAAC;AACzD,MAAM,QAAQ,GAAG,MAAM,CAAC;AAExB;;;GAGG;AACH,SAAS,SAAS,CAAC,OAAe;IACjC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC3D,2EAA2E;IAC3E,IAAI,SAAS,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAClC,sEAAsE;QACtE,MAAM,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,QAAQ,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC;YAC5B,0EAA0E;YAC1E,kEAAkE;QACnE,CAAC;IACF,CAAC;IACD,OAAO,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC9B,OAAe,EACf,OAAe,EACf,OAAgB;IAEhB,mEAAmE;IACnE,uEAAuE;IACvE,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAE/B,8EAA8E;IAC9E,6EAA6E;IAC7E,+CAA+C;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3E,oCAAoC;IACpC,MAAM,aAAa,GAAG,wBAAwB,CAAC;IAC/C,MAAM,aAAa,GAAG,QAAQ,CAAC;IAE/B,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IACtB,IAAI,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACV,CAAC;QACD,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,YAAY,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,UAAU,GAAG,CAAC,CAAC;YACf,MAAM;QACP,CAAC;IACF,CAAC;IAED,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACrC,CAAC;IAED,yEAAyE;IACzE,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,UAAU,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,SAAS;QACV,CAAC;QACD,IAAI,UAAU,GAAG,CAAC;YAAE,SAAS;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACvB,aAAa,GAAG,CAAC,CAAC;YAClB,MAAM;QACP,CAAC;QACD,KAAK,EAAE,CAAC;IACT,CAAC;IAED,gDAAgD;IAChD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAClC,CAAC;IAED,sEAAsE;IACtE,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,CAAC,EAAE,CAAC;QACR,iEAAiE;QACjE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,cAAc,GAAG,aAAa,KAAK,GAAG,IAAI,aAAa,KAAK,EAAE,CAAC;IACrE,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;QAChC,8CAA8C;QAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;IAED,4BAA4B;IAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,KAAK,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC;IAE/B,oCAAoC;IACpC,8EAA8E;IAC9E,mFAAmF;IACnF,MAAM,kBAAkB,GACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEpD,IAAI,UAAkB,CAAC;IACvB,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACpB,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACP,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,gDAAgD;IAChD,IAAI,kBAAkB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,UAAU,IAAI,GAAG,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* atomic-write — same-dir tmp + renameSync for crash-safe file writes.
|
|
3
|
+
*
|
|
4
|
+
* Security: tmp filename uses .orchviz-tmp- prefix so phase-glob regex
|
|
5
|
+
* (/^phase-0*N-.*\.md$/i) never matches orphaned temps (R2-1, R2-13).
|
|
6
|
+
*
|
|
7
|
+
* Reliability:
|
|
8
|
+
* - renameSync is atomic on POSIX (same filesystem guaranteed by same-dir tmp).
|
|
9
|
+
* - Windows EPERM (file open in another process) → single 50ms retry.
|
|
10
|
+
* - try/finally unlinks tmp on every error path — no orphan on throw.
|
|
11
|
+
*
|
|
12
|
+
* Orphan cleanup: cleanOrphanedTmps(planDir) removes .orchviz-tmp-* files
|
|
13
|
+
* older than 5 minutes. Called on first write per slug (R2-13).
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Write `content` to `targetPath` atomically via a same-directory temp file.
|
|
17
|
+
* Throws on persistent failure (after Windows EPERM retry).
|
|
18
|
+
*/
|
|
19
|
+
export declare function atomicWriteFileSync(targetPath: string, content: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Remove .orchviz-tmp-* files older than ORPHAN_AGE_MS in planDir.
|
|
22
|
+
* Silently skips if dir doesn't exist or entry stat fails (R2-13).
|
|
23
|
+
*/
|
|
24
|
+
export declare function cleanOrphanedTmps(planDir: string): void;
|
|
25
|
+
//# sourceMappingURL=atomic-write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../../../src/orchviz/plan/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA6B7E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAoBvD"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* atomic-write — same-dir tmp + renameSync for crash-safe file writes.
|
|
3
|
+
*
|
|
4
|
+
* Security: tmp filename uses .orchviz-tmp- prefix so phase-glob regex
|
|
5
|
+
* (/^phase-0*N-.*\.md$/i) never matches orphaned temps (R2-1, R2-13).
|
|
6
|
+
*
|
|
7
|
+
* Reliability:
|
|
8
|
+
* - renameSync is atomic on POSIX (same filesystem guaranteed by same-dir tmp).
|
|
9
|
+
* - Windows EPERM (file open in another process) → single 50ms retry.
|
|
10
|
+
* - try/finally unlinks tmp on every error path — no orphan on throw.
|
|
11
|
+
*
|
|
12
|
+
* Orphan cleanup: cleanOrphanedTmps(planDir) removes .orchviz-tmp-* files
|
|
13
|
+
* older than 5 minutes. Called on first write per slug (R2-13).
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from "node:fs";
|
|
16
|
+
import * as path from "node:path";
|
|
17
|
+
import * as crypto from "node:crypto";
|
|
18
|
+
const TMP_PREFIX = ".orchviz-tmp-";
|
|
19
|
+
const ORPHAN_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
20
|
+
/**
|
|
21
|
+
* Write `content` to `targetPath` atomically via a same-directory temp file.
|
|
22
|
+
* Throws on persistent failure (after Windows EPERM retry).
|
|
23
|
+
*/
|
|
24
|
+
export function atomicWriteFileSync(targetPath, content) {
|
|
25
|
+
const dir = path.dirname(targetPath);
|
|
26
|
+
const rand = crypto.randomBytes(6).toString("hex");
|
|
27
|
+
const tmpPath = path.join(dir, `${TMP_PREFIX}${rand}`);
|
|
28
|
+
fs.writeFileSync(tmpPath, content, "utf-8");
|
|
29
|
+
try {
|
|
30
|
+
try {
|
|
31
|
+
fs.renameSync(tmpPath, targetPath);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
const e = err;
|
|
35
|
+
if (e.code === "EPERM") {
|
|
36
|
+
// Windows: file may be open in another process. Single 50ms retry.
|
|
37
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 50);
|
|
38
|
+
fs.renameSync(tmpPath, targetPath);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
// Clean up tmp on any rename failure
|
|
47
|
+
try {
|
|
48
|
+
fs.unlinkSync(tmpPath);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Best-effort; suppress secondary error
|
|
52
|
+
}
|
|
53
|
+
throw err;
|
|
54
|
+
}
|
|
55
|
+
// renameSync succeeded — tmp no longer exists (renamed to target), nothing to unlink.
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Remove .orchviz-tmp-* files older than ORPHAN_AGE_MS in planDir.
|
|
59
|
+
* Silently skips if dir doesn't exist or entry stat fails (R2-13).
|
|
60
|
+
*/
|
|
61
|
+
export function cleanOrphanedTmps(planDir) {
|
|
62
|
+
let entries;
|
|
63
|
+
try {
|
|
64
|
+
entries = fs.readdirSync(planDir);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
for (const name of entries) {
|
|
71
|
+
if (!name.startsWith(TMP_PREFIX))
|
|
72
|
+
continue;
|
|
73
|
+
const fullPath = path.join(planDir, name);
|
|
74
|
+
try {
|
|
75
|
+
const stat = fs.statSync(fullPath);
|
|
76
|
+
if (now - stat.mtimeMs > ORPHAN_AGE_MS) {
|
|
77
|
+
fs.unlinkSync(fullPath);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Skip — file may already be gone or inaccessible
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=atomic-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../../src/orchviz/plan/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,GAAG,eAAe,CAAC;AACnC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAEjD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,OAAe;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,EAAE,CAAC,CAAC;IAEvD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC;QACJ,IAAI,CAAC;YACJ,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,GAA4B,CAAC;YACvC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxB,mEAAmE;gBACnE,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACP,MAAM,GAAG,CAAC;YACX,CAAC;QACF,CAAC;IACF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,qCAAqC;QACrC,IAAI,CAAC;YACJ,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACR,wCAAwC;QACzC,CAAC;QACD,MAAM,GAAG,CAAC;IACX,CAAC;IACD,sFAAsF;AACvF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACJ,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;IACR,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,aAAa,EAAE,CAAC;gBACxC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,kDAAkD;QACnD,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlanCollector — read the active plan (or a slug-targeted plan) with mtime-keyed cache.
|
|
3
|
+
*
|
|
4
|
+
* Per red-team H3 (orchviz redesign): cache key is `(planDirMtime, max(phaseFileMtime))`.
|
|
5
|
+
* Cache invalidates the moment any plan file is touched on disk — no stale window.
|
|
6
|
+
* A 60s time-based fallback exists for paranoia (e.g., filesystems with broken mtime).
|
|
7
|
+
*
|
|
8
|
+
* Per R2-3: cache is plain Map<string, CacheEntry> keyed by slug-or-"__active".
|
|
9
|
+
* Soft-reset if map.size > 50. NO LRU, NO 16-entry cap, NO evict-oldest.
|
|
10
|
+
*
|
|
11
|
+
* Per R2-8: PlanSnapshot shape includes phaseEtags (not etag) and error tag.
|
|
12
|
+
* Read-only is the default behavior. Set MEOWKIT_ORCHVIZ_WRITABLE=1 to opt
|
|
13
|
+
* into write mode. Legacy MEOWKIT_ORCHVIZ_READONLY=0 continues to enable
|
|
14
|
+
* writes for backwards compatibility with existing user setups.
|
|
15
|
+
*/
|
|
16
|
+
import type { PlanState } from "./types.js";
|
|
17
|
+
/**
|
|
18
|
+
* Read-only is the default. Precedence (highest first):
|
|
19
|
+
* 1. MEOWKIT_ORCHVIZ_READONLY=1 forces readonly (defensive lock)
|
|
20
|
+
* 2. MEOWKIT_ORCHVIZ_WRITABLE=1 opts into writes (preferred opt-in)
|
|
21
|
+
* 3. MEOWKIT_ORCHVIZ_READONLY=0 opts into writes (legacy compat)
|
|
22
|
+
* 4. otherwise readonly
|
|
23
|
+
*/
|
|
24
|
+
export declare function isOrchvizReadonly(): boolean;
|
|
25
|
+
/** Error tags for PlanSnapshot failure cases (R2-8). */
|
|
26
|
+
export type PlanSnapshotError = "invalid-slug" | "forbidden-path" | "not-found";
|
|
27
|
+
export interface PlanSnapshot {
|
|
28
|
+
plan: PlanState | null;
|
|
29
|
+
/** Per-phase etags keyed by phase number. null on error. */
|
|
30
|
+
phaseEtags: Record<number, string> | null;
|
|
31
|
+
/** Whether the server is in read-only mode (default true; see isOrchvizReadonly). */
|
|
32
|
+
readonly: boolean;
|
|
33
|
+
generatedAt: string;
|
|
34
|
+
error?: PlanSnapshotError;
|
|
35
|
+
}
|
|
36
|
+
export declare class PlanCollector {
|
|
37
|
+
private readonly projectRoot;
|
|
38
|
+
private readonly cache;
|
|
39
|
+
/** Cached `realpathSync(plansDir)` — constant per-projectRoot, avoids syscall per slug poll. */
|
|
40
|
+
private resolvedPlansDir;
|
|
41
|
+
constructor(projectRoot: string);
|
|
42
|
+
snapshot(slug?: string): PlanSnapshot;
|
|
43
|
+
private snapshotActive;
|
|
44
|
+
private snapshotBySlug;
|
|
45
|
+
/** Soft-reset the cache if it grows too large, then insert the new entry (R2-3). */
|
|
46
|
+
private writeCache;
|
|
47
|
+
invalidate(): void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/orchviz/plan/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAS5C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAK3C;AAED,wDAAwD;AACxD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,gBAAgB,GAAG,WAAW,CAAC;AAEhF,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC1C,qFAAqF;IACrF,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAQD,qBAAa,aAAa;IAKb,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,gGAAgG;IAChG,OAAO,CAAC,gBAAgB,CAAuB;gBAElB,WAAW,EAAE,MAAM;IAEhD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY;IAUrC,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,cAAc;IA2FtB,oFAAoF;IACpF,OAAO,CAAC,UAAU;IAYlB,UAAU,IAAI,IAAI;CAIlB"}
|