oh-my-codex 0.12.4 → 0.12.6
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/Cargo.lock +5 -5
- package/Cargo.toml +1 -1
- package/README.md +27 -3
- package/dist/cli/__tests__/ask.test.js +26 -0
- package/dist/cli/__tests__/ask.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +28 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/explore.test.js +95 -8
- package/dist/cli/__tests__/explore.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +102 -4
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +169 -0
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/mcp-parity.test.js +31 -0
- package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js +66 -2
- package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +51 -1
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +148 -3
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/uninstall.test.js +14 -1
- package/dist/cli/__tests__/uninstall.test.js.map +1 -1
- package/dist/cli/cleanup.js +1 -1
- package/dist/cli/cleanup.js.map +1 -1
- package/dist/cli/constants.d.ts +1 -0
- package/dist/cli/constants.d.ts.map +1 -1
- package/dist/cli/constants.js +1 -0
- package/dist/cli/constants.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +15 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/explore.d.ts +1 -0
- package/dist/cli/explore.d.ts.map +1 -1
- package/dist/cli/explore.js +49 -1
- package/dist/cli/explore.js.map +1 -1
- package/dist/cli/index.d.ts +2 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +127 -14
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-parity.d.ts +1 -1
- package/dist/cli/mcp-parity.d.ts.map +1 -1
- package/dist/cli/mcp-parity.js +24 -0
- package/dist/cli/mcp-parity.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +17 -5
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +80 -6
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/uninstall.d.ts.map +1 -1
- package/dist/cli/uninstall.js +1 -0
- package/dist/cli/uninstall.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +60 -0
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/mcp-registry.test.js +61 -0
- package/dist/config/__tests__/mcp-registry.test.js.map +1 -1
- package/dist/config/__tests__/wiki-config-contract.test.d.ts +2 -0
- package/dist/config/__tests__/wiki-config-contract.test.d.ts.map +1 -0
- package/dist/config/__tests__/wiki-config-contract.test.js +19 -0
- package/dist/config/__tests__/wiki-config-contract.test.js.map +1 -0
- package/dist/config/generator.d.ts +1 -0
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +88 -3
- package/dist/config/generator.js.map +1 -1
- package/dist/config/mcp-registry.d.ts +2 -0
- package/dist/config/mcp-registry.d.ts.map +1 -1
- package/dist/config/mcp-registry.js +12 -0
- package/dist/config/mcp-registry.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +39 -0
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +297 -4
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +392 -22
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +166 -67
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +112 -2
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-modules.test.js +52 -12
- package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-regression-205.test.d.ts +2 -3
- package/dist/hooks/__tests__/notify-hook-regression-205.test.d.ts.map +1 -1
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js +18 -23
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js +33 -0
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +176 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +355 -7
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +90 -2
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
- package/dist/hooks/__tests__/session.test.js +142 -2
- package/dist/hooks/__tests__/session.test.js.map +1 -1
- package/dist/hooks/__tests__/wiki-docs-contract.test.d.ts +2 -0
- package/dist/hooks/__tests__/wiki-docs-contract.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/wiki-docs-contract.test.js +34 -0
- package/dist/hooks/__tests__/wiki-docs-contract.test.js.map +1 -0
- package/dist/hooks/agents-overlay.d.ts.map +1 -1
- package/dist/hooks/agents-overlay.js +0 -1
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js +32 -0
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/runtime.test.js +31 -0
- package/dist/hooks/extensibility/__tests__/runtime.test.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/sdk.test.js +33 -3
- package/dist/hooks/extensibility/__tests__/sdk.test.js.map +1 -1
- package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
- package/dist/hooks/extensibility/dispatcher.js +41 -0
- package/dist/hooks/extensibility/dispatcher.js.map +1 -1
- package/dist/hooks/extensibility/sdk/runtime-state.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk/runtime-state.js +7 -1
- package/dist/hooks/extensibility/sdk/runtime-state.js.map +1 -1
- package/dist/hooks/extensibility/types.d.ts +1 -0
- package/dist/hooks/extensibility/types.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +6 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +207 -10
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/keyword-registry.d.ts.map +1 -1
- package/dist/hooks/keyword-registry.js +3 -0
- package/dist/hooks/keyword-registry.js.map +1 -1
- package/dist/hooks/session.d.ts +14 -2
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +120 -16
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/state.test.js +111 -2
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +18 -21
- package/dist/hud/state.js.map +1 -1
- package/dist/mcp/__tests__/bootstrap.test.js +88 -1
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
- package/dist/mcp/__tests__/server-lifecycle.test.js +3 -0
- package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
- package/dist/mcp/__tests__/state-paths.test.js +30 -2
- package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server.test.js +415 -0
- package/dist/mcp/__tests__/state-server.test.js.map +1 -1
- package/dist/mcp/__tests__/wiki-server.test.d.ts +2 -0
- package/dist/mcp/__tests__/wiki-server.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/wiki-server.test.js +30 -0
- package/dist/mcp/__tests__/wiki-server.test.js.map +1 -0
- package/dist/mcp/bootstrap.d.ts +19 -1
- package/dist/mcp/bootstrap.d.ts.map +1 -1
- package/dist/mcp/bootstrap.js +185 -0
- package/dist/mcp/bootstrap.js.map +1 -1
- package/dist/mcp/state-paths.d.ts +5 -0
- package/dist/mcp/state-paths.d.ts.map +1 -1
- package/dist/mcp/state-paths.js +41 -11
- package/dist/mcp/state-paths.js.map +1 -1
- package/dist/mcp/state-server.d.ts +4 -4
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/state-server.js +49 -2
- package/dist/mcp/state-server.js.map +1 -1
- package/dist/mcp/wiki-server.d.ts +181 -0
- package/dist/mcp/wiki-server.d.ts.map +1 -0
- package/dist/mcp/wiki-server.js +235 -0
- package/dist/mcp/wiki-server.js.map +1 -0
- package/dist/modes/__tests__/base-autoresearch-contract.test.js +74 -2
- package/dist/modes/__tests__/base-autoresearch-contract.test.js.map +1 -1
- package/dist/modes/__tests__/base-multi-state-compat.test.d.ts +2 -0
- package/dist/modes/__tests__/base-multi-state-compat.test.d.ts.map +1 -0
- package/dist/modes/__tests__/base-multi-state-compat.test.js +38 -0
- package/dist/modes/__tests__/base-multi-state-compat.test.js.map +1 -0
- package/dist/modes/__tests__/base-tmux-pane.test.js +1 -1
- package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
- package/dist/modes/base.d.ts +2 -1
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +55 -31
- package/dist/modes/base.js.map +1 -1
- package/dist/notifications/__tests__/formatter.test.js +11 -0
- package/dist/notifications/__tests__/formatter.test.js.map +1 -1
- package/dist/notifications/__tests__/idle-cooldown.test.js +32 -1
- package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -1
- package/dist/notifications/__tests__/index.test.d.ts +2 -0
- package/dist/notifications/__tests__/index.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/index.test.js +113 -0
- package/dist/notifications/__tests__/index.test.js.map +1 -0
- package/dist/notifications/__tests__/lifecycle-dedupe.test.d.ts +2 -0
- package/dist/notifications/__tests__/lifecycle-dedupe.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/lifecycle-dedupe.test.js +86 -0
- package/dist/notifications/__tests__/lifecycle-dedupe.test.js.map +1 -0
- package/dist/notifications/__tests__/reply-listener.test.js +174 -0
- package/dist/notifications/__tests__/reply-listener.test.js.map +1 -1
- package/dist/notifications/__tests__/session-idle-tail-dedupe.test.d.ts +2 -0
- package/dist/notifications/__tests__/session-idle-tail-dedupe.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js +93 -0
- package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js.map +1 -0
- package/dist/notifications/__tests__/session-registry.test.js +48 -1
- package/dist/notifications/__tests__/session-registry.test.js.map +1 -1
- package/dist/notifications/__tests__/session-status.test.d.ts +2 -0
- package/dist/notifications/__tests__/session-status.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/session-status.test.js +159 -0
- package/dist/notifications/__tests__/session-status.test.js.map +1 -0
- package/dist/notifications/__tests__/tmux.test.js +58 -1
- package/dist/notifications/__tests__/tmux.test.js.map +1 -1
- package/dist/notifications/idle-cooldown.d.ts +11 -0
- package/dist/notifications/idle-cooldown.d.ts.map +1 -1
- package/dist/notifications/idle-cooldown.js +42 -8
- package/dist/notifications/idle-cooldown.js.map +1 -1
- package/dist/notifications/index.d.ts +1 -1
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +41 -8
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/lifecycle-dedupe.d.ts +8 -0
- package/dist/notifications/lifecycle-dedupe.d.ts.map +1 -0
- package/dist/notifications/lifecycle-dedupe.js +112 -0
- package/dist/notifications/lifecycle-dedupe.js.map +1 -0
- package/dist/notifications/reply-listener.d.ts +10 -1
- package/dist/notifications/reply-listener.d.ts.map +1 -1
- package/dist/notifications/reply-listener.js +49 -11
- package/dist/notifications/reply-listener.js.map +1 -1
- package/dist/notifications/session-registry.d.ts.map +1 -1
- package/dist/notifications/session-registry.js +7 -1
- package/dist/notifications/session-registry.js.map +1 -1
- package/dist/notifications/session-status.d.ts +23 -0
- package/dist/notifications/session-status.d.ts.map +1 -0
- package/dist/notifications/session-status.js +187 -0
- package/dist/notifications/session-status.js.map +1 -0
- package/dist/notifications/tmux.d.ts +10 -0
- package/dist/notifications/tmux.d.ts.map +1 -1
- package/dist/notifications/tmux.js +59 -5
- package/dist/notifications/tmux.js.map +1 -1
- package/dist/notifications/types.d.ts +2 -0
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/openclaw/__tests__/index.test.js +84 -0
- package/dist/openclaw/__tests__/index.test.js.map +1 -1
- package/dist/openclaw/index.d.ts.map +1 -1
- package/dist/openclaw/index.js +7 -14
- package/dist/openclaw/index.js.map +1 -1
- package/dist/openclaw/types.d.ts +2 -2
- package/dist/openclaw/types.d.ts.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +692 -40
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/hook-derived-watcher.test.d.ts +2 -0
- package/dist/scripts/__tests__/hook-derived-watcher.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/hook-derived-watcher.test.js +87 -0
- package/dist/scripts/__tests__/hook-derived-watcher.test.js.map +1 -0
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +309 -77
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/hook-derived-watcher.js +43 -1
- package/dist/scripts/hook-derived-watcher.js.map +1 -1
- package/dist/scripts/notify-fallback-watcher.js +95 -21
- package/dist/scripts/notify-fallback-watcher.js.map +1 -1
- package/dist/scripts/notify-hook/active-team.d.ts +9 -0
- package/dist/scripts/notify-hook/active-team.d.ts.map +1 -0
- package/dist/scripts/notify-hook/active-team.js +44 -0
- package/dist/scripts/notify-hook/active-team.js.map +1 -0
- package/dist/scripts/notify-hook/auto-nudge.d.ts +5 -3
- package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/auto-nudge.js +121 -78
- package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.js +18 -4
- package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
- package/dist/scripts/notify-hook/operational-events.d.ts.map +1 -1
- package/dist/scripts/notify-hook/operational-events.js +21 -0
- package/dist/scripts/notify-hook/operational-events.js.map +1 -1
- package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -1
- package/dist/scripts/notify-hook/ralph-session-resume.js +3 -2
- package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -1
- package/dist/scripts/notify-hook/state-io.d.ts +10 -1
- package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
- package/dist/scripts/notify-hook/state-io.js +56 -12
- package/dist/scripts/notify-hook/state-io.js.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.js +305 -167
- package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.js +87 -15
- package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.js +11 -2
- package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
- package/dist/scripts/notify-hook.js +26 -16
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/scripts/run-provider-advisor.js +20 -2
- package/dist/scripts/run-provider-advisor.js.map +1 -1
- package/dist/scripts/smoke-packed-install.d.ts +1 -8
- package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
- package/dist/scripts/smoke-packed-install.js +12 -68
- package/dist/scripts/smoke-packed-install.js.map +1 -1
- package/dist/state/__tests__/operations.test.js +113 -0
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/skill-active.test.js +35 -0
- package/dist/state/__tests__/skill-active.test.js.map +1 -1
- package/dist/state/__tests__/workflow-transition.test.d.ts +2 -0
- package/dist/state/__tests__/workflow-transition.test.d.ts.map +1 -0
- package/dist/state/__tests__/workflow-transition.test.js +56 -0
- package/dist/state/__tests__/workflow-transition.test.js.map +1 -0
- package/dist/state/operations.d.ts +1 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +88 -2
- package/dist/state/operations.js.map +1 -1
- package/dist/state/skill-active.d.ts +2 -2
- package/dist/state/skill-active.d.ts.map +1 -1
- package/dist/state/skill-active.js +119 -33
- package/dist/state/skill-active.js.map +1 -1
- package/dist/state/workflow-transition-reconcile.d.ts +15 -0
- package/dist/state/workflow-transition-reconcile.d.ts.map +1 -0
- package/dist/state/workflow-transition-reconcile.js +100 -0
- package/dist/state/workflow-transition-reconcile.js.map +1 -0
- package/dist/state/workflow-transition.d.ts +22 -0
- package/dist/state/workflow-transition.d.ts.map +1 -0
- package/dist/state/workflow-transition.js +188 -0
- package/dist/state/workflow-transition.js.map +1 -0
- package/dist/team/__tests__/api-interop.test.js +90 -0
- package/dist/team/__tests__/api-interop.test.js.map +1 -1
- package/dist/team/__tests__/current-task-baseline.test.d.ts +2 -0
- package/dist/team/__tests__/current-task-baseline.test.d.ts.map +1 -0
- package/dist/team/__tests__/current-task-baseline.test.js +87 -0
- package/dist/team/__tests__/current-task-baseline.test.js.map +1 -0
- package/dist/team/__tests__/hardening-e2e.test.js +17 -0
- package/dist/team/__tests__/hardening-e2e.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +673 -65
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/shutdown-fallback.test.js +11 -1
- package/dist/team/__tests__/shutdown-fallback.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +447 -4
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +10 -1
- package/dist/team/api-interop.js.map +1 -1
- package/dist/team/current-task-baseline.d.ts +32 -0
- package/dist/team/current-task-baseline.d.ts.map +1 -0
- package/dist/team/current-task-baseline.js +85 -0
- package/dist/team/current-task-baseline.js.map +1 -0
- package/dist/team/delivery-log.d.ts +1 -1
- package/dist/team/delivery-log.d.ts.map +1 -1
- package/dist/team/delivery-log.js.map +1 -1
- package/dist/team/leader-activity.d.ts +1 -0
- package/dist/team/leader-activity.d.ts.map +1 -1
- package/dist/team/leader-activity.js +4 -2
- package/dist/team/leader-activity.js.map +1 -1
- package/dist/team/progress-evidence.d.ts +2 -0
- package/dist/team/progress-evidence.d.ts.map +1 -0
- package/dist/team/progress-evidence.js +77 -0
- package/dist/team/progress-evidence.js.map +1 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +269 -64
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +1 -1
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +2 -13
- package/dist/team/state.js.map +1 -1
- package/dist/team/tmux-session.d.ts +12 -3
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +174 -20
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worktree.d.ts +6 -1
- package/dist/team/worktree.d.ts.map +1 -1
- package/dist/team/worktree.js +28 -4
- package/dist/team/worktree.js.map +1 -1
- package/dist/utils/__tests__/agents-md.test.js +21 -1
- package/dist/utils/__tests__/agents-md.test.js.map +1 -1
- package/dist/utils/__tests__/repo-deps.test.d.ts +2 -0
- package/dist/utils/__tests__/repo-deps.test.d.ts.map +1 -0
- package/dist/utils/__tests__/repo-deps.test.js +71 -0
- package/dist/utils/__tests__/repo-deps.test.js.map +1 -0
- package/dist/utils/agents-md.d.ts +1 -0
- package/dist/utils/agents-md.d.ts.map +1 -1
- package/dist/utils/agents-md.js +7 -3
- package/dist/utils/agents-md.js.map +1 -1
- package/dist/utils/paths.d.ts +4 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +20 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/repo-deps.d.ts +20 -0
- package/dist/utils/repo-deps.d.ts.map +1 -0
- package/dist/utils/repo-deps.js +78 -0
- package/dist/utils/repo-deps.js.map +1 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.d.ts +2 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.d.ts.map +1 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +54 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -0
- package/dist/wiki/__tests__/cjk-tokenize.test.d.ts +12 -0
- package/dist/wiki/__tests__/cjk-tokenize.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/cjk-tokenize.test.js +139 -0
- package/dist/wiki/__tests__/cjk-tokenize.test.js.map +1 -0
- package/dist/wiki/__tests__/crlf-parse.test.d.ts +2 -0
- package/dist/wiki/__tests__/crlf-parse.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/crlf-parse.test.js +24 -0
- package/dist/wiki/__tests__/crlf-parse.test.js.map +1 -0
- package/dist/wiki/__tests__/escape-newline.test.d.ts +2 -0
- package/dist/wiki/__tests__/escape-newline.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/escape-newline.test.js +45 -0
- package/dist/wiki/__tests__/escape-newline.test.js.map +1 -0
- package/dist/wiki/__tests__/ingest.test.d.ts +5 -0
- package/dist/wiki/__tests__/ingest.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/ingest.test.js +181 -0
- package/dist/wiki/__tests__/ingest.test.js.map +1 -0
- package/dist/wiki/__tests__/lint.test.d.ts +5 -0
- package/dist/wiki/__tests__/lint.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/lint.test.js +163 -0
- package/dist/wiki/__tests__/lint.test.js.map +1 -0
- package/dist/wiki/__tests__/query.test.d.ts +5 -0
- package/dist/wiki/__tests__/query.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/query.test.js +141 -0
- package/dist/wiki/__tests__/query.test.js.map +1 -0
- package/dist/wiki/__tests__/reserved-file-guard.test.d.ts +2 -0
- package/dist/wiki/__tests__/reserved-file-guard.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/reserved-file-guard.test.js +44 -0
- package/dist/wiki/__tests__/reserved-file-guard.test.js.map +1 -0
- package/dist/wiki/__tests__/session-hooks.test.d.ts +5 -0
- package/dist/wiki/__tests__/session-hooks.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/session-hooks.test.js +36 -0
- package/dist/wiki/__tests__/session-hooks.test.js.map +1 -0
- package/dist/wiki/__tests__/slug-nonascii.test.d.ts +2 -0
- package/dist/wiki/__tests__/slug-nonascii.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/slug-nonascii.test.js +24 -0
- package/dist/wiki/__tests__/slug-nonascii.test.js.map +1 -0
- package/dist/wiki/__tests__/storage.test.d.ts +5 -0
- package/dist/wiki/__tests__/storage.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/storage.test.js +278 -0
- package/dist/wiki/__tests__/storage.test.js.map +1 -0
- package/dist/wiki/__tests__/test-helpers.d.ts +31 -0
- package/dist/wiki/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/wiki/__tests__/test-helpers.js +108 -0
- package/dist/wiki/__tests__/test-helpers.js.map +1 -0
- package/dist/wiki/index.d.ts +14 -0
- package/dist/wiki/index.d.ts.map +1 -0
- package/dist/wiki/index.js +17 -0
- package/dist/wiki/index.js.map +1 -0
- package/dist/wiki/ingest.d.ts +20 -0
- package/dist/wiki/ingest.d.ts.map +1 -0
- package/dist/wiki/ingest.js +115 -0
- package/dist/wiki/ingest.js.map +1 -0
- package/dist/wiki/lifecycle.d.ts +20 -0
- package/dist/wiki/lifecycle.d.ts.map +1 -0
- package/dist/wiki/lifecycle.js +212 -0
- package/dist/wiki/lifecycle.js.map +1 -0
- package/dist/wiki/lint.d.ts +25 -0
- package/dist/wiki/lint.d.ts.map +1 -0
- package/dist/wiki/lint.js +166 -0
- package/dist/wiki/lint.js.map +1 -0
- package/dist/wiki/query.d.ts +36 -0
- package/dist/wiki/query.d.ts.map +1 -0
- package/dist/wiki/query.js +138 -0
- package/dist/wiki/query.js.map +1 -0
- package/dist/wiki/storage.d.ts +33 -0
- package/dist/wiki/storage.d.ts.map +1 -0
- package/dist/wiki/storage.js +321 -0
- package/dist/wiki/storage.js.map +1 -0
- package/dist/wiki/types.d.ts +83 -0
- package/dist/wiki/types.d.ts.map +1 -0
- package/dist/wiki/types.js +15 -0
- package/dist/wiki/types.js.map +1 -0
- package/package.json +3 -1
- package/skills/configure-notifications/SKILL.md +1 -0
- package/skills/doctor/SKILL.md +11 -0
- package/skills/omx-setup/SKILL.md +1 -1
- package/skills/wiki/SKILL.md +57 -0
- package/src/scripts/__tests__/codex-native-hook.test.ts +920 -56
- package/src/scripts/__tests__/hook-derived-watcher.test.ts +111 -0
- package/src/scripts/codex-native-hook.ts +377 -83
- package/src/scripts/hook-derived-watcher.ts +43 -1
- package/src/scripts/notify-fallback-watcher.ts +99 -20
- package/src/scripts/notify-hook/active-team.ts +54 -0
- package/src/scripts/notify-hook/auto-nudge.ts +132 -79
- package/src/scripts/notify-hook/managed-tmux.ts +22 -4
- package/src/scripts/notify-hook/operational-events.ts +21 -0
- package/src/scripts/notify-hook/ralph-session-resume.ts +3 -2
- package/src/scripts/notify-hook/state-io.ts +89 -12
- package/src/scripts/notify-hook/team-dispatch.ts +326 -168
- package/src/scripts/notify-hook/team-leader-nudge.ts +91 -14
- package/src/scripts/notify-hook/tmux-injection.ts +11 -2
- package/src/scripts/notify-hook.ts +36 -22
- package/src/scripts/run-provider-advisor.ts +20 -2
- package/src/scripts/smoke-packed-install.ts +16 -83
- package/templates/AGENTS.md +3 -4
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiki lifecycle integration.
|
|
3
|
+
*/
|
|
4
|
+
export declare function onSessionStart(data: {
|
|
5
|
+
cwd?: string;
|
|
6
|
+
}): {
|
|
7
|
+
additionalContext?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function onSessionEnd(data: {
|
|
10
|
+
cwd?: string;
|
|
11
|
+
session_id?: string;
|
|
12
|
+
}): {
|
|
13
|
+
continue: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare function onPreCompact(data: {
|
|
16
|
+
cwd?: string;
|
|
17
|
+
}): {
|
|
18
|
+
additionalContext?: string;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/wiki/lifecycle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoCH,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,CAqCrF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAsD/F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,CAsBnF"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiki lifecycle integration.
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync, statSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { codexHome, omxProjectMemoryPath } from '../utils/paths.js';
|
|
7
|
+
import { appendLogUnsafe, getWikiDir, listPages, readAllPages, readIndex, readPage, updateIndexUnsafe, withWikiLock, writePageUnsafe, } from './storage.js';
|
|
8
|
+
import { DEFAULT_WIKI_CONFIG, WIKI_SCHEMA_VERSION } from './types.js';
|
|
9
|
+
function loadWikiConfig(root) {
|
|
10
|
+
const candidates = [join(root, '.omx-config.json'), join(codexHome(), '.omx-config.json')];
|
|
11
|
+
for (const path of candidates) {
|
|
12
|
+
try {
|
|
13
|
+
if (!existsSync(path))
|
|
14
|
+
continue;
|
|
15
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
16
|
+
if (parsed?.wiki && typeof parsed.wiki === 'object') {
|
|
17
|
+
return { ...DEFAULT_WIKI_CONFIG, ...parsed.wiki };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// ignore malformed config and continue to defaults
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return DEFAULT_WIKI_CONFIG;
|
|
25
|
+
}
|
|
26
|
+
export function onSessionStart(data) {
|
|
27
|
+
try {
|
|
28
|
+
const root = data.cwd || process.cwd();
|
|
29
|
+
const config = loadWikiConfig(root);
|
|
30
|
+
if (!config.enabled)
|
|
31
|
+
return {};
|
|
32
|
+
const wikiDir = getWikiDir(root);
|
|
33
|
+
if (!existsSync(wikiDir))
|
|
34
|
+
return {};
|
|
35
|
+
const pages = listPages(root);
|
|
36
|
+
if (pages.length === 0)
|
|
37
|
+
return {};
|
|
38
|
+
if (!readIndex(root)) {
|
|
39
|
+
withWikiLock(root, () => {
|
|
40
|
+
updateIndexUnsafe(root);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (config.feedProjectMemoryOnStart) {
|
|
44
|
+
feedProjectMemory(root);
|
|
45
|
+
}
|
|
46
|
+
const index = readIndex(root);
|
|
47
|
+
if (!index)
|
|
48
|
+
return {};
|
|
49
|
+
const summary = [
|
|
50
|
+
`[OMX Wiki: ${pages.length} pages at .omx/wiki/]`,
|
|
51
|
+
'',
|
|
52
|
+
'Use wiki_query to search, wiki_list to browse, wiki_read to inspect pages.',
|
|
53
|
+
'',
|
|
54
|
+
...index.split('\n').slice(0, config.maxContextLines),
|
|
55
|
+
].join('\n');
|
|
56
|
+
return { additionalContext: summary };
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function onSessionEnd(data) {
|
|
63
|
+
const startedAt = Date.now();
|
|
64
|
+
const timeoutMs = 3_000;
|
|
65
|
+
try {
|
|
66
|
+
const root = data.cwd || process.cwd();
|
|
67
|
+
const config = loadWikiConfig(root);
|
|
68
|
+
if (!config.enabled || !config.autoCapture) {
|
|
69
|
+
return { continue: true };
|
|
70
|
+
}
|
|
71
|
+
const wikiDir = getWikiDir(root);
|
|
72
|
+
if (!existsSync(wikiDir)) {
|
|
73
|
+
return { continue: true };
|
|
74
|
+
}
|
|
75
|
+
const sessionId = data.session_id || `session-${Date.now()}`;
|
|
76
|
+
const now = new Date().toISOString();
|
|
77
|
+
const dateSlug = now.split('T')[0];
|
|
78
|
+
const filename = `session-log-${dateSlug}-${sessionId.slice(-8)}.md`;
|
|
79
|
+
withWikiLock(root, () => {
|
|
80
|
+
if (Date.now() - startedAt > timeoutMs)
|
|
81
|
+
return;
|
|
82
|
+
writePageUnsafe(root, {
|
|
83
|
+
filename,
|
|
84
|
+
frontmatter: {
|
|
85
|
+
title: `Session Log ${dateSlug}`,
|
|
86
|
+
tags: ['session-log', 'auto-captured'],
|
|
87
|
+
created: now,
|
|
88
|
+
updated: now,
|
|
89
|
+
sources: [sessionId],
|
|
90
|
+
links: [],
|
|
91
|
+
category: 'session-log',
|
|
92
|
+
confidence: 'medium',
|
|
93
|
+
schemaVersion: WIKI_SCHEMA_VERSION,
|
|
94
|
+
},
|
|
95
|
+
content: `\n# Session Log ${dateSlug}\n\nAuto-captured session metadata.\nSession ID: ${sessionId}\n\nReview and promote significant findings to curated wiki pages via \`wiki_ingest\`.\n`,
|
|
96
|
+
});
|
|
97
|
+
appendLogUnsafe(root, {
|
|
98
|
+
timestamp: now,
|
|
99
|
+
operation: 'session-end',
|
|
100
|
+
pagesAffected: [filename],
|
|
101
|
+
summary: `Auto-captured session log for ${sessionId}`,
|
|
102
|
+
});
|
|
103
|
+
updateIndexUnsafe(root);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// best effort only
|
|
108
|
+
}
|
|
109
|
+
return { continue: true };
|
|
110
|
+
}
|
|
111
|
+
export function onPreCompact(data) {
|
|
112
|
+
try {
|
|
113
|
+
const root = data.cwd || process.cwd();
|
|
114
|
+
const config = loadWikiConfig(root);
|
|
115
|
+
if (!config.enabled)
|
|
116
|
+
return {};
|
|
117
|
+
const pages = listPages(root);
|
|
118
|
+
if (pages.length === 0)
|
|
119
|
+
return {};
|
|
120
|
+
const allPages = readAllPages(root);
|
|
121
|
+
const categories = [...new Set(allPages.map((page) => page.frontmatter.category))];
|
|
122
|
+
const latestUpdate = allPages
|
|
123
|
+
.map((page) => page.frontmatter.updated)
|
|
124
|
+
.sort()
|
|
125
|
+
.reverse()[0] || 'unknown';
|
|
126
|
+
return {
|
|
127
|
+
additionalContext: `[Wiki: ${pages.length} pages | categories: ${categories.join(', ')} | last updated: ${latestUpdate}]`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return {};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function feedProjectMemory(root) {
|
|
135
|
+
try {
|
|
136
|
+
const projectMemoryPath = omxProjectMemoryPath(root);
|
|
137
|
+
if (!existsSync(projectMemoryPath))
|
|
138
|
+
return;
|
|
139
|
+
const parsed = JSON.parse(readFileSync(projectMemoryPath, 'utf8'));
|
|
140
|
+
const existing = readPage(root, 'environment.md');
|
|
141
|
+
const memoryMtime = statSync(projectMemoryPath).mtimeMs;
|
|
142
|
+
const existingUpdated = existing ? new Date(existing.frontmatter.updated).getTime() : 0;
|
|
143
|
+
if (existing && existingUpdated >= memoryMtime) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const sections = ['\n# Project Environment\n'];
|
|
147
|
+
const stringFields = [
|
|
148
|
+
['Tech Stack', parsed.techStack],
|
|
149
|
+
['Build', parsed.build],
|
|
150
|
+
['Conventions', parsed.conventions],
|
|
151
|
+
['Structure', parsed.structure],
|
|
152
|
+
];
|
|
153
|
+
for (const [label, value] of stringFields) {
|
|
154
|
+
if (typeof value === 'string' && value.trim() !== '') {
|
|
155
|
+
sections.push(`## ${label}`);
|
|
156
|
+
sections.push(value.trim());
|
|
157
|
+
sections.push('');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (Array.isArray(parsed.notes) && parsed.notes.length > 0) {
|
|
161
|
+
sections.push('## Notes');
|
|
162
|
+
for (const note of parsed.notes.slice(0, 20)) {
|
|
163
|
+
const content = typeof note.content === 'string'
|
|
164
|
+
? note.content.trim()
|
|
165
|
+
: '';
|
|
166
|
+
if (content)
|
|
167
|
+
sections.push(`- ${content}`);
|
|
168
|
+
}
|
|
169
|
+
sections.push('');
|
|
170
|
+
}
|
|
171
|
+
if (Array.isArray(parsed.directives) && parsed.directives.length > 0) {
|
|
172
|
+
sections.push('## Directives');
|
|
173
|
+
for (const directive of parsed.directives.slice(0, 20)) {
|
|
174
|
+
const content = typeof directive.directive === 'string'
|
|
175
|
+
? directive.directive.trim()
|
|
176
|
+
: '';
|
|
177
|
+
if (content)
|
|
178
|
+
sections.push(`- ${content}`);
|
|
179
|
+
}
|
|
180
|
+
sections.push('');
|
|
181
|
+
}
|
|
182
|
+
const now = new Date().toISOString();
|
|
183
|
+
withWikiLock(root, () => {
|
|
184
|
+
writePageUnsafe(root, {
|
|
185
|
+
filename: 'environment.md',
|
|
186
|
+
frontmatter: {
|
|
187
|
+
title: 'Project Environment',
|
|
188
|
+
tags: ['environment', 'auto-detected'],
|
|
189
|
+
created: existing?.frontmatter.created || now,
|
|
190
|
+
updated: now,
|
|
191
|
+
sources: ['project-memory-auto-detect'],
|
|
192
|
+
links: [],
|
|
193
|
+
category: 'environment',
|
|
194
|
+
confidence: 'high',
|
|
195
|
+
schemaVersion: WIKI_SCHEMA_VERSION,
|
|
196
|
+
},
|
|
197
|
+
content: sections.join('\n'),
|
|
198
|
+
}, { allowReserved: true });
|
|
199
|
+
updateIndexUnsafe(root);
|
|
200
|
+
appendLogUnsafe(root, {
|
|
201
|
+
timestamp: now,
|
|
202
|
+
operation: 'session-start',
|
|
203
|
+
pagesAffected: ['environment.md'],
|
|
204
|
+
summary: 'Synced project memory into managed environment page',
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// best effort only
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/wiki/lifecycle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EACL,eAAe,EACf,UAAU,EACV,SAAS,EACT,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,YAAY,EACZ,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAmB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEvF,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE3F,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAmC,CAAC;YACxF,IAAI,MAAM,EAAE,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpD,OAAO,EAAE,GAAG,mBAAmB,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YACpD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAsB;IACnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAE/B,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE;gBACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;YACpC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QAEtB,MAAM,OAAO,GAAG;YACd,cAAc,KAAK,CAAC,MAAM,uBAAuB;YACjD,EAAE;YACF,4EAA4E;YAC5E,EAAE;YACF,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC;SACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAA2C;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,KAAK,CAAC;IAExB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,eAAe,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAErE,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE;YACtB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS;gBAAE,OAAO;YAE/C,eAAe,CAAC,IAAI,EAAE;gBACpB,QAAQ;gBACR,WAAW,EAAE;oBACX,KAAK,EAAE,eAAe,QAAQ,EAAE;oBAChC,IAAI,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC;oBACtC,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,CAAC,SAAS,CAAC;oBACpB,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,aAAa;oBACvB,UAAU,EAAE,QAAQ;oBACpB,aAAa,EAAE,mBAAmB;iBACnC;gBACD,OAAO,EAAE,mBAAmB,QAAQ,oDAAoD,SAAS,0FAA0F;aAC5L,CAAC,CAAC;YAEH,eAAe,CAAC,IAAI,EAAE;gBACpB,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,aAAa;gBACxB,aAAa,EAAE,CAAC,QAAQ,CAAC;gBACzB,OAAO,EAAE,iCAAiC,SAAS,EAAE;aACtD,CAAC,CAAC;YAEH,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB;IACrB,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAsB;IACjD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAE/B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,QAAQ;aAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;aACvC,IAAI,EAAE;aACN,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QAE7B,OAAO;YACL,iBAAiB,EAAE,UAAU,KAAK,CAAC,MAAM,wBAAwB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,YAAY,GAAG;SAC1H,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;YAAE,OAAO;QAE3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAA4B,CAAC;QAC9F,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;QACxD,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,IAAI,QAAQ,IAAI,eAAe,IAAI,WAAW,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAa,CAAC,2BAA2B,CAAC,CAAC;QACzD,MAAM,YAAY,GAA6B;YAC7C,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC;YAChC,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;YACvB,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC;YACnC,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC;SAChC,CAAC;QAEF,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;YAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,OAAQ,IAA8B,CAAC,OAAO,KAAK,QAAQ;oBACzE,CAAC,CAAE,IAA4B,CAAC,OAAO,CAAC,IAAI,EAAE;oBAC9C,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,OAAO;oBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC/B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACvD,MAAM,OAAO,GAAG,OAAQ,SAAqC,CAAC,SAAS,KAAK,QAAQ;oBAClF,CAAC,CAAE,SAAmC,CAAC,SAAS,CAAC,IAAI,EAAE;oBACvD,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,OAAO;oBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE;YACtB,eAAe,CAAC,IAAI,EAAE;gBACpB,QAAQ,EAAE,gBAAgB;gBAC1B,WAAW,EAAE;oBACX,KAAK,EAAE,qBAAqB;oBAC5B,IAAI,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC;oBACtC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,IAAI,GAAG;oBAC7C,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,CAAC,4BAA4B,CAAC;oBACvC,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,aAAa;oBACvB,UAAU,EAAE,MAAM;oBAClB,aAAa,EAAE,mBAAmB;iBACnC;gBACD,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7B,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,eAAe,CAAC,IAAI,EAAE;gBACpB,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,eAAe;gBAC1B,aAAa,EAAE,CAAC,gBAAgB,CAAC;gBACjC,OAAO,EAAE,qDAAqD;aAC/D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiki Lint
|
|
3
|
+
*
|
|
4
|
+
* Health checks for the wiki knowledge base.
|
|
5
|
+
* Detects orphan pages, stale content, broken cross-references,
|
|
6
|
+
* oversized pages, and structural contradictions.
|
|
7
|
+
*/
|
|
8
|
+
import { type WikiLintReport, type WikiConfig } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Run health checks on the wiki.
|
|
11
|
+
*
|
|
12
|
+
* Checks performed:
|
|
13
|
+
* 1. Orphan pages — no incoming [[links]] from other pages
|
|
14
|
+
* 2. Stale pages — not updated in `staleDays` days
|
|
15
|
+
* 3. Broken cross-references — [[links]] to non-existent pages
|
|
16
|
+
* 4. Low confidence — pages marked as `confidence: low`
|
|
17
|
+
* 5. Oversized — content exceeds `maxPageSize` bytes
|
|
18
|
+
* 6. Structural contradictions — same topic with conflicting confidence/category
|
|
19
|
+
*
|
|
20
|
+
* @param root - Project root directory
|
|
21
|
+
* @param config - Wiki configuration (uses defaults if not provided)
|
|
22
|
+
* @returns Lint report with issues and stats
|
|
23
|
+
*/
|
|
24
|
+
export declare function lintWiki(root: string, config?: WikiConfig): WikiLintReport;
|
|
25
|
+
//# sourceMappingURL=lint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/wiki/lint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,cAAc,EAGnB,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAC;AAMpB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,UAAgC,GAAG,cAAc,CAkG/F"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiki Lint
|
|
3
|
+
*
|
|
4
|
+
* Health checks for the wiki knowledge base.
|
|
5
|
+
* Detects orphan pages, stale content, broken cross-references,
|
|
6
|
+
* oversized pages, and structural contradictions.
|
|
7
|
+
*/
|
|
8
|
+
import { DEFAULT_WIKI_CONFIG, } from './types.js';
|
|
9
|
+
import { readAllPages, appendLog, } from './storage.js';
|
|
10
|
+
/**
|
|
11
|
+
* Run health checks on the wiki.
|
|
12
|
+
*
|
|
13
|
+
* Checks performed:
|
|
14
|
+
* 1. Orphan pages — no incoming [[links]] from other pages
|
|
15
|
+
* 2. Stale pages — not updated in `staleDays` days
|
|
16
|
+
* 3. Broken cross-references — [[links]] to non-existent pages
|
|
17
|
+
* 4. Low confidence — pages marked as `confidence: low`
|
|
18
|
+
* 5. Oversized — content exceeds `maxPageSize` bytes
|
|
19
|
+
* 6. Structural contradictions — same topic with conflicting confidence/category
|
|
20
|
+
*
|
|
21
|
+
* @param root - Project root directory
|
|
22
|
+
* @param config - Wiki configuration (uses defaults if not provided)
|
|
23
|
+
* @returns Lint report with issues and stats
|
|
24
|
+
*/
|
|
25
|
+
export function lintWiki(root, config = DEFAULT_WIKI_CONFIG) {
|
|
26
|
+
const pages = readAllPages(root);
|
|
27
|
+
const issues = [];
|
|
28
|
+
const pageFilenames = new Set(pages.map(p => p.filename));
|
|
29
|
+
// Build incoming link map
|
|
30
|
+
const incomingLinks = new Map();
|
|
31
|
+
for (const page of pages) {
|
|
32
|
+
for (const link of page.frontmatter.links) {
|
|
33
|
+
if (!incomingLinks.has(link))
|
|
34
|
+
incomingLinks.set(link, new Set());
|
|
35
|
+
incomingLinks.get(link).add(page.filename);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
const staleThresholdMs = config.staleDays * 24 * 60 * 60 * 1000;
|
|
40
|
+
for (const page of pages) {
|
|
41
|
+
// 1. Orphan detection — no incoming links from other pages
|
|
42
|
+
if (!incomingLinks.has(page.filename) || incomingLinks.get(page.filename).size === 0) {
|
|
43
|
+
issues.push({
|
|
44
|
+
page: page.filename,
|
|
45
|
+
severity: 'info',
|
|
46
|
+
type: 'orphan',
|
|
47
|
+
message: `No other pages link to "${page.frontmatter.title}"`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// 2. Stale detection — not updated recently
|
|
51
|
+
const updatedAt = new Date(page.frontmatter.updated).getTime();
|
|
52
|
+
if (now - updatedAt > staleThresholdMs) {
|
|
53
|
+
const daysSince = Math.floor((now - updatedAt) / (24 * 60 * 60 * 1000));
|
|
54
|
+
issues.push({
|
|
55
|
+
page: page.filename,
|
|
56
|
+
severity: 'warning',
|
|
57
|
+
type: 'stale',
|
|
58
|
+
message: `"${page.frontmatter.title}" not updated in ${daysSince} days`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// 3. Broken cross-references — links to non-existent pages
|
|
62
|
+
for (const link of page.frontmatter.links) {
|
|
63
|
+
if (!pageFilenames.has(link)) {
|
|
64
|
+
issues.push({
|
|
65
|
+
page: page.filename,
|
|
66
|
+
severity: 'error',
|
|
67
|
+
type: 'broken-ref',
|
|
68
|
+
message: `Broken link to "${link}" from "${page.frontmatter.title}"`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// 4. Low confidence
|
|
73
|
+
if (page.frontmatter.confidence === 'low') {
|
|
74
|
+
issues.push({
|
|
75
|
+
page: page.filename,
|
|
76
|
+
severity: 'info',
|
|
77
|
+
type: 'low-confidence',
|
|
78
|
+
message: `"${page.frontmatter.title}" has low confidence — consider verifying or removing`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// 5. Oversized pages
|
|
82
|
+
const contentSize = Buffer.byteLength(page.content, 'utf-8');
|
|
83
|
+
if (contentSize > config.maxPageSize) {
|
|
84
|
+
const sizeKB = (contentSize / 1024).toFixed(1);
|
|
85
|
+
issues.push({
|
|
86
|
+
page: page.filename,
|
|
87
|
+
severity: 'warning',
|
|
88
|
+
type: 'oversized',
|
|
89
|
+
message: `"${page.frontmatter.title}" is ${sizeKB}KB — consider splitting into smaller pages`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// 6. Structural contradictions — same slug prefix with conflicting metadata
|
|
94
|
+
detectStructuralContradictions(pages, issues);
|
|
95
|
+
// Build stats
|
|
96
|
+
const stats = {
|
|
97
|
+
totalPages: pages.length,
|
|
98
|
+
orphanCount: issues.filter(i => i.type === 'orphan').length,
|
|
99
|
+
staleCount: issues.filter(i => i.type === 'stale').length,
|
|
100
|
+
brokenRefCount: issues.filter(i => i.type === 'broken-ref').length,
|
|
101
|
+
lowConfidenceCount: issues.filter(i => i.type === 'low-confidence').length,
|
|
102
|
+
oversizedCount: issues.filter(i => i.type === 'oversized').length,
|
|
103
|
+
contradictionCount: issues.filter(i => i.type === 'structural-contradiction').length,
|
|
104
|
+
};
|
|
105
|
+
// Log the lint operation
|
|
106
|
+
appendLog(root, {
|
|
107
|
+
timestamp: new Date().toISOString(),
|
|
108
|
+
operation: 'lint',
|
|
109
|
+
pagesAffected: [...new Set(issues.map(i => i.page))],
|
|
110
|
+
summary: `Lint: ${issues.length} issues (${stats.orphanCount} orphan, ${stats.staleCount} stale, ${stats.brokenRefCount} broken, ${stats.contradictionCount} contradictions)`,
|
|
111
|
+
});
|
|
112
|
+
return { issues, stats };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Detect structural contradictions:
|
|
116
|
+
* - Pages with overlapping tags but different categories
|
|
117
|
+
* - Pages with same slug prefix but different confidence levels
|
|
118
|
+
*
|
|
119
|
+
* NOTE: Semantic contradiction detection requires LLM integration (v2).
|
|
120
|
+
*/
|
|
121
|
+
function detectStructuralContradictions(pages, issues) {
|
|
122
|
+
// Group by slug prefix (first segment before first hyphen-separated word boundary)
|
|
123
|
+
const slugGroups = new Map();
|
|
124
|
+
for (const page of pages) {
|
|
125
|
+
const prefix = page.filename.split('-').slice(0, 2).join('-');
|
|
126
|
+
if (!slugGroups.has(prefix))
|
|
127
|
+
slugGroups.set(prefix, []);
|
|
128
|
+
slugGroups.get(prefix).push(page);
|
|
129
|
+
}
|
|
130
|
+
for (const [_prefix, group] of slugGroups) {
|
|
131
|
+
if (group.length < 2)
|
|
132
|
+
continue;
|
|
133
|
+
// Check for conflicting confidence on same topic
|
|
134
|
+
const confidences = new Set(group.map(p => p.frontmatter.confidence));
|
|
135
|
+
if (confidences.size > 1 && confidences.has('high') && confidences.has('low')) {
|
|
136
|
+
const titles = group.map(p => `"${p.frontmatter.title}"`).join(', ');
|
|
137
|
+
issues.push({
|
|
138
|
+
page: group[0].filename,
|
|
139
|
+
severity: 'warning',
|
|
140
|
+
type: 'structural-contradiction',
|
|
141
|
+
message: `Conflicting confidence levels for related pages: ${titles}`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Check for overlapping tags with different categories
|
|
145
|
+
const tagCategoryPairs = new Map();
|
|
146
|
+
for (const page of group) {
|
|
147
|
+
for (const tag of page.frontmatter.tags) {
|
|
148
|
+
if (!tagCategoryPairs.has(tag))
|
|
149
|
+
tagCategoryPairs.set(tag, new Set());
|
|
150
|
+
tagCategoryPairs.get(tag).add(page.frontmatter.category);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
for (const [tag, categories] of tagCategoryPairs) {
|
|
154
|
+
if (categories.size > 1) {
|
|
155
|
+
issues.push({
|
|
156
|
+
page: group[0].filename,
|
|
157
|
+
severity: 'info',
|
|
158
|
+
type: 'structural-contradiction',
|
|
159
|
+
message: `Tag "${tag}" appears in pages with different categories: ${[...categories].join(', ')}`,
|
|
160
|
+
});
|
|
161
|
+
break; // One contradiction per group is enough
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/wiki/lint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAKL,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,SAAqB,mBAAmB;IAC7E,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE1D,0BAA0B;IAC1B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACjE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAEhE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,2DAA2D;QAC3D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtF,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,2BAA2B,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG;aAC9D,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/D,IAAI,GAAG,GAAG,SAAS,GAAG,gBAAgB,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,oBAAoB,SAAS,OAAO;aACxE,CAAC,CAAC;QACL,CAAC;QAED,2DAA2D;QAC3D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,IAAI,CAAC,QAAQ;oBACnB,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,mBAAmB,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG;iBACrE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,uDAAuD;aAC3F,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB;QACrB,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,IAAI,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,MAAM,4CAA4C;aAC9F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAE9C,cAAc;IACd,MAAM,KAAK,GAAG;QACZ,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM;QAC3D,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM;QACzD,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,MAAM;QAClE,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,MAAM;QAC1E,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,MAAM;QACjE,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,0BAA0B,CAAC,CAAC,MAAM;KACrF,CAAC;IAEF,yBAAyB;IACzB,SAAS,CAAC,IAAI,EAAE;QACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,MAAM;QACjB,aAAa,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,OAAO,EAAE,SAAS,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,WAAW,YAAY,KAAK,CAAC,UAAU,WAAW,KAAK,CAAC,cAAc,YAAY,KAAK,CAAC,kBAAkB,kBAAkB;KAC9K,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,SAAS,8BAA8B,CAAC,KAAiB,EAAE,MAAuB;IAChF,mFAAmF;IACnF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxD,UAAU,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,iDAAiD;QACjD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QACtE,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ;gBACvB,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,0BAA0B;gBAChC,OAAO,EAAE,oDAAoD,MAAM,EAAE;aACtE,CAAC,CAAC;QACL,CAAC;QAED,uDAAuD;QACvD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;gBACrE,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACjD,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ;oBACvB,QAAQ,EAAE,MAAM;oBAChB,IAAI,EAAE,0BAA0B;oBAChC,OAAO,EAAE,QAAQ,GAAG,iDAAiD,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAClG,CAAC,CAAC;gBACH,MAAM,CAAC,wCAAwC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiki Query
|
|
3
|
+
*
|
|
4
|
+
* Keyword + tag search across all wiki pages.
|
|
5
|
+
* Returns matching pages with relevance snippets.
|
|
6
|
+
*
|
|
7
|
+
* NO vector embeddings — search is keyword-based only (hard constraint).
|
|
8
|
+
* The LLM caller synthesizes answers from returned matches.
|
|
9
|
+
*/
|
|
10
|
+
import { type WikiQueryOptions, type WikiQueryMatch } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Tokenize text for search, with CJK bi-gram support.
|
|
13
|
+
*
|
|
14
|
+
* Latin/numeric words: split on whitespace.
|
|
15
|
+
* CJK characters (Han, Hangul, Kana): bi-grams (2-char sliding window)
|
|
16
|
+
* plus individual characters for single-char query support.
|
|
17
|
+
* Other scripts (Cyrillic, Arabic, Thai, etc.): whitespace split (fallback).
|
|
18
|
+
*/
|
|
19
|
+
export declare function tokenize(text: string): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Search wiki pages by keyword and/or tags.
|
|
22
|
+
*
|
|
23
|
+
* Matching strategy:
|
|
24
|
+
* 1. Tag match: pages whose tags intersect with query tags (highest weight)
|
|
25
|
+
* 2. Title match: pages whose title contains the query text
|
|
26
|
+
* 3. Content match: pages whose content contains the query text
|
|
27
|
+
*
|
|
28
|
+
* Results are scored and sorted by relevance (descending).
|
|
29
|
+
*
|
|
30
|
+
* @param root - Project root directory
|
|
31
|
+
* @param queryText - Search text (matched against title + content)
|
|
32
|
+
* @param options - Optional filters (tags, category, limit)
|
|
33
|
+
* @returns Matching pages with snippets, sorted by relevance
|
|
34
|
+
*/
|
|
35
|
+
export declare function queryWiki(root: string, queryText: string, options?: WikiQueryOptions): WikiQueryMatch[];
|
|
36
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/wiki/query.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAMpB;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiC/C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,gBAAqB,GAC7B,cAAc,EAAE,CAiFlB"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiki Query
|
|
3
|
+
*
|
|
4
|
+
* Keyword + tag search across all wiki pages.
|
|
5
|
+
* Returns matching pages with relevance snippets.
|
|
6
|
+
*
|
|
7
|
+
* NO vector embeddings — search is keyword-based only (hard constraint).
|
|
8
|
+
* The LLM caller synthesizes answers from returned matches.
|
|
9
|
+
*/
|
|
10
|
+
import { readAllPages, appendLog, } from './storage.js';
|
|
11
|
+
/**
|
|
12
|
+
* Tokenize text for search, with CJK bi-gram support.
|
|
13
|
+
*
|
|
14
|
+
* Latin/numeric words: split on whitespace.
|
|
15
|
+
* CJK characters (Han, Hangul, Kana): bi-grams (2-char sliding window)
|
|
16
|
+
* plus individual characters for single-char query support.
|
|
17
|
+
* Other scripts (Cyrillic, Arabic, Thai, etc.): whitespace split (fallback).
|
|
18
|
+
*/
|
|
19
|
+
export function tokenize(text) {
|
|
20
|
+
const lower = text.toLowerCase();
|
|
21
|
+
const tokens = [];
|
|
22
|
+
// Latin/numeric tokens (including accented Latin: café, naïve, etc.)
|
|
23
|
+
const latinMatches = lower.match(/[a-z0-9\u00C0-\u024F]+/g);
|
|
24
|
+
if (latinMatches)
|
|
25
|
+
tokens.push(...latinMatches);
|
|
26
|
+
// CJK segments (Hiragana + Katakana + CJK Unified Ideographs + Hangul)
|
|
27
|
+
const cjkPattern = /[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uAC00-\uD7AF]+/g;
|
|
28
|
+
const cjkMatches = lower.match(cjkPattern);
|
|
29
|
+
if (cjkMatches) {
|
|
30
|
+
for (const segment of cjkMatches) {
|
|
31
|
+
for (let i = 0; i < segment.length; i++) {
|
|
32
|
+
tokens.push(segment[i]);
|
|
33
|
+
}
|
|
34
|
+
for (let i = 0; i < segment.length - 1; i++) {
|
|
35
|
+
tokens.push(segment.slice(i, i + 2));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Fallback: other scripts (Cyrillic, Arabic, Thai, Devanagari, etc.)
|
|
40
|
+
// Remove already-matched Latin and CJK, then whitespace-split the remainder
|
|
41
|
+
// Filter out pure-punctuation tokens to avoid false-positive matches.
|
|
42
|
+
const remaining = lower
|
|
43
|
+
.replace(/[a-z0-9\u00C0-\u024F]+/g, ' ')
|
|
44
|
+
.replace(cjkPattern, ' ')
|
|
45
|
+
.split(/\s+/)
|
|
46
|
+
.filter(t => t.length > 0 && /\p{L}/u.test(t));
|
|
47
|
+
if (remaining.length > 0)
|
|
48
|
+
tokens.push(...remaining);
|
|
49
|
+
return tokens;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Search wiki pages by keyword and/or tags.
|
|
53
|
+
*
|
|
54
|
+
* Matching strategy:
|
|
55
|
+
* 1. Tag match: pages whose tags intersect with query tags (highest weight)
|
|
56
|
+
* 2. Title match: pages whose title contains the query text
|
|
57
|
+
* 3. Content match: pages whose content contains the query text
|
|
58
|
+
*
|
|
59
|
+
* Results are scored and sorted by relevance (descending).
|
|
60
|
+
*
|
|
61
|
+
* @param root - Project root directory
|
|
62
|
+
* @param queryText - Search text (matched against title + content)
|
|
63
|
+
* @param options - Optional filters (tags, category, limit)
|
|
64
|
+
* @returns Matching pages with snippets, sorted by relevance
|
|
65
|
+
*/
|
|
66
|
+
export function queryWiki(root, queryText, options = {}) {
|
|
67
|
+
const { tags: filterTags, category, limit = 20, logQuery = true } = options;
|
|
68
|
+
const pages = readAllPages(root);
|
|
69
|
+
const queryLower = queryText.toLowerCase();
|
|
70
|
+
const queryTerms = tokenize(queryText);
|
|
71
|
+
const matches = [];
|
|
72
|
+
for (const page of pages) {
|
|
73
|
+
// Category filter
|
|
74
|
+
if (category && page.frontmatter.category !== category)
|
|
75
|
+
continue;
|
|
76
|
+
let score = 0;
|
|
77
|
+
let snippet = '';
|
|
78
|
+
// Tag matching (weight: 3 per matching tag)
|
|
79
|
+
if (filterTags && filterTags.length > 0) {
|
|
80
|
+
const tagOverlap = filterTags.filter(t => page.frontmatter.tags.some(pt => pt.toLowerCase() === t.toLowerCase()));
|
|
81
|
+
score += tagOverlap.length * 3;
|
|
82
|
+
}
|
|
83
|
+
// Also match query terms against page tags
|
|
84
|
+
for (const term of queryTerms) {
|
|
85
|
+
if (page.frontmatter.tags.some(t => t.toLowerCase().includes(term))) {
|
|
86
|
+
score += 2;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Title matching (weight: 5)
|
|
90
|
+
const titleLower = page.frontmatter.title.toLowerCase();
|
|
91
|
+
if (titleLower.includes(queryLower)) {
|
|
92
|
+
score += 5;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
for (const term of queryTerms) {
|
|
96
|
+
if (titleLower.includes(term))
|
|
97
|
+
score += 2;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Content matching (weight: 1 per unique term match)
|
|
101
|
+
const contentLower = page.content.toLowerCase();
|
|
102
|
+
for (const term of queryTerms) {
|
|
103
|
+
const idx = contentLower.indexOf(term);
|
|
104
|
+
if (idx !== -1) {
|
|
105
|
+
score += 1;
|
|
106
|
+
// Extract snippet around first match
|
|
107
|
+
if (!snippet) {
|
|
108
|
+
const start = Math.max(0, idx - 40);
|
|
109
|
+
const end = Math.min(contentLower.length, idx + term.length + 80);
|
|
110
|
+
const raw = page.content.slice(start, end).replace(/\n+/g, ' ').trim();
|
|
111
|
+
snippet = (start > 0 ? '...' : '') + raw + (end < contentLower.length ? '...' : '');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (score > 0) {
|
|
116
|
+
if (!snippet) {
|
|
117
|
+
// Default snippet: first non-empty line
|
|
118
|
+
snippet = page.content.split('\n').find(l => l.trim().length > 0)?.trim() || '';
|
|
119
|
+
if (snippet.length > 120)
|
|
120
|
+
snippet = snippet.slice(0, 117) + '...';
|
|
121
|
+
}
|
|
122
|
+
matches.push({ page, snippet, score });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Sort by score descending
|
|
126
|
+
matches.sort((a, b) => b.score - a.score);
|
|
127
|
+
const limited = matches.slice(0, limit);
|
|
128
|
+
if (logQuery) {
|
|
129
|
+
appendLog(root, {
|
|
130
|
+
timestamp: new Date().toISOString(),
|
|
131
|
+
operation: 'query',
|
|
132
|
+
pagesAffected: limited.map(m => m.page.filename),
|
|
133
|
+
summary: `Query "${queryText}" → ${limited.length} results (of ${matches.length} total)`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return limited;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/wiki/query.ts"],"names":[],"mappings":"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"}
|