@memorax/memorax-code 0.1.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/LICENSE +21 -0
- package/README.md +53 -0
- package/bin/memorax-cli.mjs +28 -0
- package/bin/memorax-code-backend.mjs +4 -0
- package/bin/memorax-code-claude.mjs +4 -0
- package/bin/memorax-code-codex.mjs +4 -0
- package/bin/memorax-code-npm-preinstall.mjs +55 -0
- package/bin/memorax-code-plugin-postinstall.mjs +1236 -0
- package/bin/memorax-code.mjs +204 -0
- package/docs/configuration.md +232 -0
- package/docs/troubleshooting.md +179 -0
- package/lib/client-hook-runtime.mjs +32 -0
- package/lib/memorax-code-adapter-common/src/backend-connection.d.mts +111 -0
- package/lib/memorax-code-adapter-common/src/backend-connection.mjs +304 -0
- package/lib/memorax-code-adapter-common/src/clients/claude-command.mjs +38 -0
- package/lib/memorax-code-adapter-common/src/clients/codex-command.mjs +41 -0
- package/lib/memorax-code-adapter-common/src/clients/codex-plugin-artifact.d.mts +3 -0
- package/lib/memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs +38 -0
- package/lib/memorax-code-adapter-common/src/config-utils.d.mts +27 -0
- package/lib/memorax-code-adapter-common/src/config-utils.mjs +391 -0
- package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +137 -0
- package/lib/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +324 -0
- package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +142 -0
- package/lib/memorax-code-adapter-common/src/hooks/hook-runtime-generation.d.mts +38 -0
- package/lib/memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs +501 -0
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +277 -0
- package/lib/memorax-code-adapter-common/src/memorax-code-config-file.d.mts +28 -0
- package/lib/memorax-code-adapter-common/src/memorax-code-config-file.mjs +296 -0
- package/lib/memorax-code-adapter-common/src/memorax-defaults.d.mts +10 -0
- package/lib/memorax-code-adapter-common/src/memorax-defaults.mjs +12 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs +28 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs +252 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +559 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +411 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy-evaluator.mjs +185 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy.mjs +165 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs +181 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs +251 -0
- package/lib/memorax-code-adapter-common/src/runtime-record.d.mts +55 -0
- package/lib/memorax-code-adapter-common/src/runtime-record.mjs +152 -0
- package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +100 -0
- package/lib/memorax-code-backend/dist/active-client-selection.js +35 -0
- package/lib/memorax-code-backend/dist/adapter-lifecycle-participant.js +1 -0
- package/lib/memorax-code-backend/dist/automatic-memory-retrieval.js +113 -0
- package/lib/memorax-code-backend/dist/automatic-memory-writeback.js +297 -0
- package/lib/memorax-code-backend/dist/backend-env.js +13 -0
- package/lib/memorax-code-backend/dist/backend-lifecycle-lock.js +42 -0
- package/lib/memorax-code-backend/dist/backend-process.js +147 -0
- package/lib/memorax-code-backend/dist/backend-service-cleanup.js +18 -0
- package/lib/memorax-code-backend/dist/backend-service-record.js +206 -0
- package/lib/memorax-code-backend/dist/backend-service-result.js +37 -0
- package/lib/memorax-code-backend/dist/backend-service-token.js +11 -0
- package/lib/memorax-code-backend/dist/backend-shutdown-request.js +133 -0
- package/lib/memorax-code-backend/dist/backend-state.js +58 -0
- package/lib/memorax-code-backend/dist/backend-status.js +53 -0
- package/lib/memorax-code-backend/dist/backend-token-record.js +79 -0
- package/lib/memorax-code-backend/dist/claude-adapter-lifecycle.js +134 -0
- package/lib/memorax-code-backend/dist/claude-local-transcript.js +648 -0
- package/lib/memorax-code-backend/dist/claude-memory-hook-runtime.js +472 -0
- package/lib/memorax-code-backend/dist/claude-transcript-turn.js +876 -0
- package/lib/memorax-code-backend/dist/client-plugin-removal.js +67 -0
- package/lib/memorax-code-backend/dist/client-selection.js +36 -0
- package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +131 -0
- package/lib/memorax-code-backend/dist/codex-effective-prompt.js +54 -0
- package/lib/memorax-code-backend/dist/codex-memory-hook-runtime.js +541 -0
- package/lib/memorax-code-backend/dist/codex-plugin-hooks.js +421 -0
- package/lib/memorax-code-backend/dist/codex-plugin-install.js +523 -0
- package/lib/memorax-code-backend/dist/codex-rollout-turn.js +402 -0
- package/lib/memorax-code-backend/dist/codex-session-turn-index.js +88 -0
- package/lib/memorax-code-backend/dist/codex-workspace-links.js +55 -0
- package/lib/memorax-code-backend/dist/debug-log.js +21 -0
- package/lib/memorax-code-backend/dist/entrypoint.js +14 -0
- package/lib/memorax-code-backend/dist/incremental-jsonl-projection.js +271 -0
- package/lib/memorax-code-backend/dist/install-watchdog.js +71 -0
- package/lib/memorax-code-backend/dist/jsonl-append.js +75 -0
- package/lib/memorax-code-backend/dist/memorax-adapter.js +451 -0
- package/lib/memorax-code-backend/dist/memorax-cli.js +14 -0
- package/lib/memorax-code-backend/dist/memorax-code-config.js +279 -0
- package/lib/memorax-code-backend/dist/memorax-code-lifecycle.js +523 -0
- package/lib/memorax-code-backend/dist/memorax-code.js +3 -0
- package/lib/memorax-code-backend/dist/memorax-config.js +283 -0
- package/lib/memorax-code-backend/dist/memorax-http.js +142 -0
- package/lib/memorax-code-backend/dist/memory-cli.js +345 -0
- package/lib/memorax-code-backend/dist/memory-hook-command.js +200 -0
- package/lib/memorax-code-backend/dist/memory-observability.js +1 -0
- package/lib/memorax-code-backend/dist/memory-project.js +89 -0
- package/lib/memorax-code-backend/dist/memory-reminder-trace-recorder.js +58 -0
- package/lib/memorax-code-backend/dist/memory-service.js +66 -0
- package/lib/memorax-code-backend/dist/memory-turn-coordinator.js +139 -0
- package/lib/memorax-code-backend/dist/memory-viewer-activity.js +113 -0
- package/lib/memorax-code-backend/dist/memory-viewer-data-projection-cache.js +69 -0
- package/lib/memorax-code-backend/dist/memory-viewer-event-identity.js +3 -0
- package/lib/memorax-code-backend/dist/memory-viewer-history-projection.js +79 -0
- package/lib/memorax-code-backend/dist/memory-viewer-logo.js +1 -0
- package/lib/memorax-code-backend/dist/memory-viewer-observability.js +8 -0
- package/lib/memorax-code-backend/dist/memory-viewer-redaction.js +52 -0
- package/lib/memorax-code-backend/dist/memory-viewer-session-title.js +93 -0
- package/lib/memorax-code-backend/dist/memory-viewer-store.js +964 -0
- package/lib/memorax-code-backend/dist/memory-viewer-turn-reference.js +12 -0
- package/lib/memorax-code-backend/dist/memory-viewer-user-html.js +115 -0
- package/lib/memorax-code-backend/dist/memory-viewer-user-projection.js +168 -0
- package/lib/memorax-code-backend/dist/memory-viewer-writeback-status.js +97 -0
- package/lib/memorax-code-backend/dist/memory-writeback-buffer.js +217 -0
- package/lib/memorax-code-backend/dist/memory-writeback-chunk.js +120 -0
- package/lib/memorax-code-backend/dist/memory-writeback-reconciler.js +244 -0
- package/lib/memorax-code-backend/dist/memory-writeback-task-projection.js +377 -0
- package/lib/memorax-code-backend/dist/proxy-env.js +54 -0
- package/lib/memorax-code-backend/dist/repo-memory-readiness.js +188 -0
- package/lib/memorax-code-backend/dist/repository-memory-context.js +134 -0
- package/lib/memorax-code-backend/dist/repository-memory-scope.js +490 -0
- package/lib/memorax-code-backend/dist/server-cli.js +787 -0
- package/lib/memorax-code-backend/dist/server-health.js +16 -0
- package/lib/memorax-code-backend/dist/server-http.js +110 -0
- package/lib/memorax-code-backend/dist/server-json.js +4 -0
- package/lib/memorax-code-backend/dist/server-memory-hook.js +32 -0
- package/lib/memorax-code-backend/dist/server-memory-viewer.js +135 -0
- package/lib/memorax-code-backend/dist/server-observability.js +102 -0
- package/lib/memorax-code-backend/dist/server.js +220 -0
- package/lib/memorax-code-backend/dist/service-entrypoint.js +10 -0
- package/lib/memorax-code-backend/dist/service.js +567 -0
- package/lib/memorax-code-backend/dist/trace-config.js +112 -0
- package/lib/memorax-code-backend/dist/trace-context.js +111 -0
- package/lib/memorax-code-backend/dist/trace-store.js +571 -0
- package/lib/memorax-code-backend/dist/utils.js +3 -0
- package/lib/memorax-code-backend/dist/windows-cli-invocation.js +148 -0
- package/lib/memorax-code-backend/package.json +26 -0
- package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +15 -0
- package/lib/memorax-code-claude-adapter/hooks/hook-launcher.mjs +27 -0
- package/lib/memorax-code-claude-adapter/hooks/hooks.json +66 -0
- package/lib/memorax-code-claude-adapter/hooks/repo-memory-job.mjs +37 -0
- package/lib/memorax-code-claude-adapter/hooks/runtime-hook.mjs +4 -0
- package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +5 -0
- package/lib/memorax-code-claude-adapter/package.json +13 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/capture-cwd.mjs +17 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +59 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/memory-cli-session.mjs +33 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/memory-skill-reminder.mjs +73 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +91 -0
- package/lib/memorax-code-claude-adapter/scripts/build-marketplace.mjs +99 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +83 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +9 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +82 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +61 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +100 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +270 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +96 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +270 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +116 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
- package/lib/memorax-code-claude-adapter/src/adapter-paths.mjs +46 -0
- package/lib/memorax-code-claude-adapter/src/cli.mjs +363 -0
- package/lib/memorax-code-claude-adapter/src/config-utils.mjs +1 -0
- package/lib/memorax-code-claude-adapter/src/config.mjs +544 -0
- package/lib/memorax-code-claude-adapter/src/plugin-artifact-contract.mjs +148 -0
- package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +566 -0
- package/lib/memorax-code-claude-marketplace/.claude-plugin/marketplace.json +15 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +15 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/hook-launcher.mjs +27 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/hooks.json +66 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/repo-memory-job.mjs +37 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-hook.mjs +4 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +5 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/backend-connection.d.mts +111 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/backend-connection.mjs +304 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/claude-command.mjs +38 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-command.mjs +41 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-plugin-artifact.d.mts +3 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs +38 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.d.mts +27 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.mjs +391 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +137 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +324 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +142 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/hook-runtime-generation.d.mts +38 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs +501 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +277 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-code-config-file.d.mts +28 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-code-config-file.mjs +296 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-defaults.d.mts +10 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-defaults.mjs +12 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs +28 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs +252 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +559 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +411 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy-evaluator.mjs +185 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy.mjs +165 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs +181 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs +251 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/runtime-record.d.mts +55 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/runtime-record.mjs +152 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +100 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +13 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/capture-cwd.mjs +17 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +59 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-cli-session.mjs +33 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-skill-reminder.mjs +73 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +91 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/scripts/build-marketplace.mjs +99 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +83 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +9 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +82 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +61 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +100 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +270 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +96 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +270 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +116 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/adapter-paths.mjs +46 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/cli.mjs +363 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/config-utils.mjs +1 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/config.mjs +544 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-artifact-contract.mjs +148 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +566 -0
- package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +33 -0
- package/lib/memorax-code-codex-adapter/assets/composer-icon.png +0 -0
- package/lib/memorax-code-codex-adapter/assets/logo.png +0 -0
- package/lib/memorax-code-codex-adapter/hooks/hook-launcher.mjs +26 -0
- package/lib/memorax-code-codex-adapter/hooks/hooks.json +61 -0
- package/lib/memorax-code-codex-adapter/hooks/repo-memory-job.mjs +38 -0
- package/lib/memorax-code-codex-adapter/hooks/repo-memory-update-policy.mjs +10 -0
- package/lib/memorax-code-codex-adapter/hooks/runtime-hook.mjs +4 -0
- package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +5 -0
- package/lib/memorax-code-codex-adapter/package.json +13 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/capture-cwd.mjs +18 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/ensure-backend.mjs +82 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +125 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/memory-writeback.mjs +52 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +83 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +9 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +82 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +61 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +100 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +270 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +96 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +270 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +116 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
- package/lib/memorax-code-codex-adapter/src/adapter-paths.mjs +29 -0
- package/lib/memorax-code-codex-adapter/src/cli.mjs +368 -0
- package/lib/memorax-code-codex-adapter/src/config-utils.mjs +1 -0
- package/lib/memorax-code-codex-adapter/src/config.mjs +226 -0
- package/lib/memorax-code-codex-adapter/src/session-registry.mjs +331 -0
- package/lib/memorax-code-codex-adapter/src/workspace-kind.mjs +68 -0
- package/lib/node-version.mjs +11 -0
- package/lib/npm-invocation.mjs +31 -0
- package/lib/resolve-claude-command.mjs +47 -0
- package/lib/resolve-codex-command.mjs +94 -0
- package/lib/run-entrypoint.mjs +83 -0
- package/lib/vscode-extension-command.mjs +119 -0
- package/lib/windows-cli-invocation.mjs +100 -0
- package/package.json +45 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate authored repo-memory bundles."""
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import json
|
|
6
|
+
import re
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
BASELINE_FILES = [
|
|
13
|
+
Path("PROFILE.md"),
|
|
14
|
+
Path("resources/commits.md"),
|
|
15
|
+
Path("resources/prs.md"),
|
|
16
|
+
Path("resources/issues.md"),
|
|
17
|
+
Path("raw/git-commits.json"),
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
PROVIDER_RAW_FILES = [Path("raw/github-facets.json"), Path("raw/gitlab-facets.json")]
|
|
21
|
+
PROVIDER_RESOURCE_FILES = [Path("resources/prs.md"), Path("resources/issues.md")]
|
|
22
|
+
USER_PROFILE_SIDECAR = Path("user-profile/preferences.md")
|
|
23
|
+
PROCEDURE_SIDECAR_DIRECTORY = "procedure-memory"
|
|
24
|
+
PLACEHOLDER_RE = re.compile(r"\[([^\]\n]+)\]")
|
|
25
|
+
LINK_TARGET_AFTER_BRACKET_RE = re.compile(r"[ \t\r\n]*\(")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def relative(path: Path, memory: Path) -> str:
|
|
29
|
+
return path.relative_to(memory).as_posix()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def resolve_memory_root(path: Path) -> Path:
|
|
33
|
+
candidate = path.expanduser().resolve()
|
|
34
|
+
if candidate.name == ".repo_memory":
|
|
35
|
+
return candidate
|
|
36
|
+
return candidate / ".repo_memory"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def parse_frontmatter(text: str) -> dict[str, Any]:
|
|
40
|
+
if not text.startswith("---\n"):
|
|
41
|
+
return {}
|
|
42
|
+
end = text.find("\n---", 4)
|
|
43
|
+
if end == -1:
|
|
44
|
+
return {}
|
|
45
|
+
values: dict[str, Any] = {}
|
|
46
|
+
for line in text[4:end].splitlines():
|
|
47
|
+
if ":" not in line:
|
|
48
|
+
continue
|
|
49
|
+
key, value = line.split(":", 1)
|
|
50
|
+
key = key.strip()
|
|
51
|
+
value = value.strip()
|
|
52
|
+
if not key:
|
|
53
|
+
continue
|
|
54
|
+
if (value.startswith('"') and value.endswith('"')) or (value.startswith("'") and value.endswith("'")):
|
|
55
|
+
values[key] = value[1:-1]
|
|
56
|
+
elif re.fullmatch(r"-?\d+", value):
|
|
57
|
+
values[key] = int(value)
|
|
58
|
+
elif value.lower() == "true":
|
|
59
|
+
values[key] = True
|
|
60
|
+
elif value.lower() == "false":
|
|
61
|
+
values[key] = False
|
|
62
|
+
else:
|
|
63
|
+
values[key] = value
|
|
64
|
+
return values
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def body_after_frontmatter(text: str) -> str:
|
|
68
|
+
if not text.startswith("---\n"):
|
|
69
|
+
return text
|
|
70
|
+
end = text.find("\n---", 4)
|
|
71
|
+
if end == -1:
|
|
72
|
+
return text
|
|
73
|
+
return text[end + 4 :].lstrip("\n")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def item_section_count(text: str) -> int:
|
|
77
|
+
body = body_after_frontmatter(text)
|
|
78
|
+
lines = body.splitlines()
|
|
79
|
+
title_seen = False
|
|
80
|
+
count = 0
|
|
81
|
+
for line in lines:
|
|
82
|
+
if line.startswith("# ") and not title_seen:
|
|
83
|
+
title_seen = True
|
|
84
|
+
continue
|
|
85
|
+
if title_seen and line.startswith("## "):
|
|
86
|
+
count += 1
|
|
87
|
+
return count
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def placeholder_matches(text: str) -> list[str]:
|
|
91
|
+
text = strip_markdown_code(text)
|
|
92
|
+
matches: list[str] = []
|
|
93
|
+
for match in PLACEHOLDER_RE.finditer(text):
|
|
94
|
+
if LINK_TARGET_AFTER_BRACKET_RE.match(text, match.end()):
|
|
95
|
+
continue
|
|
96
|
+
value = match.group(1).strip()
|
|
97
|
+
if not value or value.startswith("#"):
|
|
98
|
+
continue
|
|
99
|
+
if re.search(r"[A-Za-z]", value):
|
|
100
|
+
matches.append(f"[{value}]")
|
|
101
|
+
return matches
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def strip_markdown_code(text: str) -> str:
|
|
105
|
+
without_fences = re.sub(r"```.*?```", "", text, flags=re.DOTALL)
|
|
106
|
+
return re.sub(r"`[^`\n]*`", "", without_fences)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def check_exists(memory: Path, rel_path: Path, errors: list[str], checked: list[str]) -> bool:
|
|
110
|
+
path = memory / rel_path
|
|
111
|
+
checked.append(rel_path.as_posix())
|
|
112
|
+
if not path.exists():
|
|
113
|
+
errors.append(f"{rel_path.as_posix()}: required file is missing")
|
|
114
|
+
return False
|
|
115
|
+
if not path.is_file():
|
|
116
|
+
errors.append(f"{rel_path.as_posix()}: expected a file")
|
|
117
|
+
return False
|
|
118
|
+
return True
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def validate_json(path: Path, memory: Path, errors: list[str], checked: list[str]) -> None:
|
|
122
|
+
checked.append(relative(path, memory))
|
|
123
|
+
try:
|
|
124
|
+
json.loads(path.read_text(encoding="utf-8"))
|
|
125
|
+
except json.JSONDecodeError as exc:
|
|
126
|
+
errors.append(f"{relative(path, memory)}: invalid JSON at line {exc.lineno}, column {exc.colno}: {exc.msg}")
|
|
127
|
+
except OSError as exc:
|
|
128
|
+
errors.append(f"{relative(path, memory)}: could not read JSON: {exc}")
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def validate_markdown(path: Path, memory: Path, errors: list[str], warnings: list[str], checked: list[str]) -> None:
|
|
132
|
+
checked.append(relative(path, memory))
|
|
133
|
+
try:
|
|
134
|
+
text = path.read_text(encoding="utf-8")
|
|
135
|
+
except OSError as exc:
|
|
136
|
+
errors.append(f"{relative(path, memory)}: could not read Markdown: {exc}")
|
|
137
|
+
return
|
|
138
|
+
|
|
139
|
+
frontmatter = parse_frontmatter(text)
|
|
140
|
+
rel = relative(path, memory)
|
|
141
|
+
if not frontmatter.get("schema"):
|
|
142
|
+
errors.append(f"{rel}: frontmatter field 'schema' is missing")
|
|
143
|
+
|
|
144
|
+
placeholders = placeholder_matches(text)
|
|
145
|
+
if placeholders:
|
|
146
|
+
errors.append(f"{rel}: unresolved bracket placeholder(s): {', '.join(placeholders)}")
|
|
147
|
+
|
|
148
|
+
if path.parent.name != "resources":
|
|
149
|
+
return
|
|
150
|
+
|
|
151
|
+
for field in ["resource_count", "raw_source"]:
|
|
152
|
+
if field not in frontmatter:
|
|
153
|
+
errors.append(f"{rel}: frontmatter field '{field}' is missing")
|
|
154
|
+
|
|
155
|
+
expected = frontmatter.get("resource_count")
|
|
156
|
+
actual = item_section_count(text)
|
|
157
|
+
if isinstance(expected, int):
|
|
158
|
+
if expected != actual:
|
|
159
|
+
errors.append(f"{rel}: resource_count is {expected}, but found {actual} item section(s)")
|
|
160
|
+
elif expected is not None:
|
|
161
|
+
errors.append(f"{rel}: resource_count must be an integer")
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def provider_raw_paths(memory: Path) -> list[Path]:
|
|
165
|
+
return [memory / rel for rel in PROVIDER_RAW_FILES if (memory / rel).exists()]
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def validate(memory: Path) -> dict[str, Any]:
|
|
169
|
+
errors: list[str] = []
|
|
170
|
+
warnings: list[str] = []
|
|
171
|
+
checked: list[str] = []
|
|
172
|
+
|
|
173
|
+
if not memory.exists():
|
|
174
|
+
errors.append(f"{memory}: .repo_memory directory is missing")
|
|
175
|
+
return {"ok": False, "errors": errors, "warnings": warnings, "checked": checked}
|
|
176
|
+
if not memory.is_dir():
|
|
177
|
+
errors.append(f"{memory}: expected .repo_memory to be a directory")
|
|
178
|
+
return {"ok": False, "errors": errors, "warnings": warnings, "checked": checked}
|
|
179
|
+
|
|
180
|
+
for rel_path in BASELINE_FILES:
|
|
181
|
+
check_exists(memory, rel_path, errors, checked)
|
|
182
|
+
|
|
183
|
+
markdown_paths = sorted(
|
|
184
|
+
path
|
|
185
|
+
for path in memory.rglob("*.md")
|
|
186
|
+
if path.is_file()
|
|
187
|
+
and path.relative_to(memory) != USER_PROFILE_SIDECAR
|
|
188
|
+
and path.relative_to(memory).parts[0] != PROCEDURE_SIDECAR_DIRECTORY
|
|
189
|
+
)
|
|
190
|
+
for path in markdown_paths:
|
|
191
|
+
if path.exists() and path.is_file():
|
|
192
|
+
validate_markdown(path, memory, errors, warnings, checked)
|
|
193
|
+
|
|
194
|
+
json_paths = sorted(path for path in (memory / "raw").rglob("*.json") if path.is_file())
|
|
195
|
+
provider_raw = provider_raw_paths(memory)
|
|
196
|
+
|
|
197
|
+
if provider_raw:
|
|
198
|
+
for rel_path in PROVIDER_RESOURCE_FILES:
|
|
199
|
+
check_exists(memory, rel_path, errors, checked)
|
|
200
|
+
|
|
201
|
+
seen_json: set[Path] = set()
|
|
202
|
+
for path in json_paths:
|
|
203
|
+
if path.exists() and path.is_file() and path not in seen_json:
|
|
204
|
+
seen_json.add(path)
|
|
205
|
+
validate_json(path, memory, errors, checked)
|
|
206
|
+
|
|
207
|
+
checked = sorted(dict.fromkeys(checked))
|
|
208
|
+
return {"ok": not errors, "errors": errors, "warnings": warnings, "checked": checked}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def parse_args(argv: list[str]) -> argparse.Namespace:
|
|
212
|
+
parser = argparse.ArgumentParser(description="Validate a repo-memory bundle.")
|
|
213
|
+
parser.add_argument("path", help="Path to a repository or its .repo_memory directory")
|
|
214
|
+
parser.add_argument("--pretty", action="store_true", help="Pretty-print JSON output")
|
|
215
|
+
return parser.parse_args(argv)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def main(argv: list[str]) -> int:
|
|
219
|
+
args = parse_args(argv)
|
|
220
|
+
report = validate(resolve_memory_root(Path(args.path)))
|
|
221
|
+
print(json.dumps(report, ensure_ascii=False, indent=2 if args.pretty else None))
|
|
222
|
+
return 0 if report["ok"] else 1
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
if __name__ == "__main__":
|
|
226
|
+
raise SystemExit(main(sys.argv[1:]))
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { DEFAULT_BACKEND_URL } from "../../memorax-code-adapter-common/src/backend-connection.mjs";
|
|
4
|
+
|
|
5
|
+
export { DEFAULT_BACKEND_URL };
|
|
6
|
+
export const DEFAULT_TOKEN_ENV = "MEMORAX_CODE_BACKEND_TOKEN";
|
|
7
|
+
export function defaultCodexHome(env = process.env) {
|
|
8
|
+
return env.CODEX_HOME || join(homedir(), ".codex");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function defaultMemoraxCodeHome(env = process.env) {
|
|
12
|
+
return env.MEMORAX_CODE_HOME || join(homedir(), ".memorax-code");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function adapterStatePath(memoraxCodeHome, runtime = "codex") {
|
|
16
|
+
return join(memoraxCodeHome, "adapters", runtime, "state.json");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function adapterWorkspaceStatePath(memoraxCodeHome, runtime = "codex") {
|
|
20
|
+
return join(memoraxCodeHome, "adapters", runtime, "workspaces.json");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function adapterSessionRegistryPath(memoraxCodeHome, runtime = "codex") {
|
|
24
|
+
return join(memoraxCodeHome, "adapters", runtime, "session-registry.json");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function normalizeBackendUrl(value = DEFAULT_BACKEND_URL) {
|
|
28
|
+
return value.replace(/\/+$/, "");
|
|
29
|
+
}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_TOKEN_ENV,
|
|
4
|
+
defaultCodexHome,
|
|
5
|
+
defaultMemoraxCodeHome,
|
|
6
|
+
inspectCodexHistory,
|
|
7
|
+
readCodexAdapterStatus,
|
|
8
|
+
readCodexWorkspaceStatus,
|
|
9
|
+
readMergedCodexSessions,
|
|
10
|
+
updateCodexSessionRegistry,
|
|
11
|
+
} from "./config.mjs";
|
|
12
|
+
import { resolveBackendConnection } from "../../memorax-code-adapter-common/src/backend-connection.mjs";
|
|
13
|
+
|
|
14
|
+
const VALUE_OPTIONS = new Set([
|
|
15
|
+
"--codex-home",
|
|
16
|
+
"--memorax-code-home",
|
|
17
|
+
"--backend-url",
|
|
18
|
+
"--backend-token-env",
|
|
19
|
+
"--session-id",
|
|
20
|
+
"--title",
|
|
21
|
+
"--transcript-path",
|
|
22
|
+
"--workspace",
|
|
23
|
+
"--max-files",
|
|
24
|
+
]);
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const parsed = parseCli(process.argv);
|
|
28
|
+
const command = parsed.command;
|
|
29
|
+
if (parsed.help) {
|
|
30
|
+
printHelp();
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
const options = parsed.options;
|
|
34
|
+
if (command === "status") {
|
|
35
|
+
print(readCodexAdapterStatus(options), options);
|
|
36
|
+
} else if (command === "inspect-history") {
|
|
37
|
+
print(inspectCodexHistory(options), options);
|
|
38
|
+
} else if (command === "sessions") {
|
|
39
|
+
print(readMergedCodexSessions(options), options);
|
|
40
|
+
} else if (command === "mark-session") {
|
|
41
|
+
print(updateCodexSessionRegistry(options), options);
|
|
42
|
+
} else if (command === "doctor") {
|
|
43
|
+
const [status, workspace, backend] = await Promise.all([
|
|
44
|
+
readCodexAdapterStatus(options),
|
|
45
|
+
readCodexWorkspaceStatus(options),
|
|
46
|
+
backendHealth(options.backendUrl, backendToken(options)),
|
|
47
|
+
]);
|
|
48
|
+
const adapterOk = status.ok
|
|
49
|
+
&& status.enabled === true
|
|
50
|
+
&& status.backendUrlMatches !== false
|
|
51
|
+
&& status.codexSkills?.ok === true;
|
|
52
|
+
print({
|
|
53
|
+
ok: adapterOk && backend.ok,
|
|
54
|
+
action: "doctor",
|
|
55
|
+
status,
|
|
56
|
+
workspace,
|
|
57
|
+
backend,
|
|
58
|
+
}, options);
|
|
59
|
+
} else {
|
|
60
|
+
throw new Error(`unknown command: ${command}`);
|
|
61
|
+
}
|
|
62
|
+
} catch (error) {
|
|
63
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function printHelp() {
|
|
68
|
+
console.log([
|
|
69
|
+
"Usage: memorax-code-codex [status|doctor|inspect-history|sessions|mark-session] [options]",
|
|
70
|
+
"",
|
|
71
|
+
"Lifecycle note: use `memorax-code start` and `memorax-code stop` to enable or disable the Codex Hook adapter.",
|
|
72
|
+
"",
|
|
73
|
+
"Options:",
|
|
74
|
+
" --codex-home DIR Codex home to inspect (default: CODEX_HOME or ~/.codex)",
|
|
75
|
+
" --memorax-code-home DIR MemoraX Code state home (default: MEMORAX_CODE_HOME or ~/.memorax-code)",
|
|
76
|
+
" --backend-url URL Local Backend URL (default: persisted connection or http://127.0.0.1:8787)",
|
|
77
|
+
" --backend-token-env NAME Token env var for Backend health checks",
|
|
78
|
+
" --session-id ID Adapter session id for mark-session",
|
|
79
|
+
" --title TEXT Optional session title for mark-session",
|
|
80
|
+
" --transcript-path FILE Optional Codex transcript path for mark-session",
|
|
81
|
+
" --workspace DIR Optional workspace path for mark-session",
|
|
82
|
+
" --max-files N Max native session files to inspect (default: 500)",
|
|
83
|
+
" --json Print machine-readable JSON",
|
|
84
|
+
].join("\n"));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function parseCli(argv) {
|
|
88
|
+
const args = argv.slice(2);
|
|
89
|
+
const first = args[0];
|
|
90
|
+
const command = first && !first.startsWith("-") ? first : "status";
|
|
91
|
+
const optionArgs = command === first ? args.slice(1) : args;
|
|
92
|
+
const help = command === "help" || optionArgs.includes("--help");
|
|
93
|
+
return {
|
|
94
|
+
command,
|
|
95
|
+
help,
|
|
96
|
+
options: help ? {} : parseOptions(optionArgs, command === "status" || command === "doctor"),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function parseOptions(args, resolveConnection) {
|
|
101
|
+
const values = {};
|
|
102
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
103
|
+
const arg = args[index];
|
|
104
|
+
if (arg === "--json" || arg === "--help") {
|
|
105
|
+
values[arg] = true;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (VALUE_OPTIONS.has(arg)) {
|
|
109
|
+
const value = args[index + 1];
|
|
110
|
+
if (!value || value.startsWith("--")) throw new Error(`${arg} requires a value`);
|
|
111
|
+
values[arg] = value;
|
|
112
|
+
index += 1;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (arg.startsWith("--")) throw new Error(`unknown option: ${arg}`);
|
|
116
|
+
throw new Error(`unexpected argument: ${arg}`);
|
|
117
|
+
}
|
|
118
|
+
const memoraxCodeHome = values["--memorax-code-home"] ?? defaultMemoraxCodeHome();
|
|
119
|
+
let backendUrl;
|
|
120
|
+
if (resolveConnection) {
|
|
121
|
+
const requestedBackendUrl = values["--backend-url"] ?? process.env.MEMORAX_CODE_BACKEND_URL;
|
|
122
|
+
if (requestedBackendUrl) validateHttpUrl(requestedBackendUrl, "--backend-url");
|
|
123
|
+
backendUrl = resolveBackendConnection({
|
|
124
|
+
memoraxCodeHome,
|
|
125
|
+
backendUrl: values["--backend-url"],
|
|
126
|
+
}).url;
|
|
127
|
+
}
|
|
128
|
+
const maxFiles = values["--max-files"] ? parseNonNegativeInteger(values["--max-files"], "--max-files") : undefined;
|
|
129
|
+
return {
|
|
130
|
+
codexHome: values["--codex-home"] ?? defaultCodexHome(),
|
|
131
|
+
memoraxCodeHome,
|
|
132
|
+
...(backendUrl ? { backendUrl } : {}),
|
|
133
|
+
backendTokenEnv: values["--backend-token-env"],
|
|
134
|
+
sessionId: values["--session-id"],
|
|
135
|
+
title: values["--title"],
|
|
136
|
+
transcriptPath: values["--transcript-path"],
|
|
137
|
+
workspace: values["--workspace"],
|
|
138
|
+
maxFiles,
|
|
139
|
+
json: Boolean(values["--json"]),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function stringOption(value) {
|
|
144
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function validateHttpUrl(value, optionName) {
|
|
148
|
+
try {
|
|
149
|
+
const url = new URL(value);
|
|
150
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") throw new Error("unsupported protocol");
|
|
151
|
+
} catch {
|
|
152
|
+
throw new Error(`${optionName} must be an http(s) URL`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function parseNonNegativeInteger(value, optionName) {
|
|
157
|
+
const parsed = Number(value);
|
|
158
|
+
if (!Number.isInteger(parsed) || parsed < 0) throw new Error(`${optionName} must be a non-negative integer`);
|
|
159
|
+
return parsed;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async function backendHealth(backendUrl, token) {
|
|
163
|
+
try {
|
|
164
|
+
const headers = token ? { authorization: `Bearer ${token}` } : {};
|
|
165
|
+
const response = await fetch(new URL("/health", backendUrl), { headers });
|
|
166
|
+
const body = await response.json().catch(() => undefined);
|
|
167
|
+
return { ok: response.ok && body?.ok === true && body?.service === "memorax-code-backend", status: response.status, body };
|
|
168
|
+
} catch (error) {
|
|
169
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function backendToken(options) {
|
|
174
|
+
const tokenEnv = options.backendTokenEnv ?? DEFAULT_TOKEN_ENV;
|
|
175
|
+
if (tokenEnv !== DEFAULT_TOKEN_ENV) return tokenEnv ? process.env[tokenEnv] : undefined;
|
|
176
|
+
return resolveBackendConnection({
|
|
177
|
+
memoraxCodeHome: options.memoraxCodeHome,
|
|
178
|
+
backendUrl: options.backendUrl,
|
|
179
|
+
}).token;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function print(result, options) {
|
|
183
|
+
if (options.json) {
|
|
184
|
+
console.log(JSON.stringify(result, null, 2));
|
|
185
|
+
} else if (result.action === "status") {
|
|
186
|
+
printStatus(result);
|
|
187
|
+
} else if (result.action === "doctor") {
|
|
188
|
+
printDoctor(result);
|
|
189
|
+
} else if (result.action === "inspect-history") {
|
|
190
|
+
printInspectHistory(result);
|
|
191
|
+
} else if (result.action === "sessions") {
|
|
192
|
+
printSessions(result);
|
|
193
|
+
} else if (result.action === "mark-session") {
|
|
194
|
+
printMarkSession(result);
|
|
195
|
+
} else if (result.ok) {
|
|
196
|
+
console.log(`${result.action}: ok`);
|
|
197
|
+
if (result.statePath) console.log(`state: ${result.statePath}`);
|
|
198
|
+
printCodexSkills(result.codexSkills);
|
|
199
|
+
if (result.workspace) {
|
|
200
|
+
console.log(`workspace: ${result.workspace.realpath ?? result.workspace.path}`);
|
|
201
|
+
}
|
|
202
|
+
if (result.backend?.ok === false) console.log(`backend: ${result.backend.error ?? result.backend.status ?? "not ok"}`);
|
|
203
|
+
} else {
|
|
204
|
+
console.log(JSON.stringify(result, null, 2));
|
|
205
|
+
}
|
|
206
|
+
process.exit(result.ok ? 0 : 1);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function printStatus(result) {
|
|
210
|
+
console.log(`status: ${result.enabled === true && result.backendUrlMatches !== false && result.codexSkills?.ok === true ? "ok" : "not enabled"}`);
|
|
211
|
+
console.log(`codex home: ${result.codexHome}`);
|
|
212
|
+
console.log(`memorax-code home: ${result.memoraxCodeHome}`);
|
|
213
|
+
console.log(`state: ${result.statePath}`);
|
|
214
|
+
console.log("integration: hooks");
|
|
215
|
+
console.log("provider config: unchanged (Codex-owned)");
|
|
216
|
+
console.log(`adapter state: ${check(Boolean(result.state && !result.state.unreadable))}${stateDetail(result.state)}`);
|
|
217
|
+
console.log(`backend endpoint: ${check(result.backendUrlMatches !== false)} configured=${result.configuredBackendUrl ?? "missing"} expected=${result.expectedBackendUrl ?? "unknown"}`);
|
|
218
|
+
printCodexSkills(result.codexSkills);
|
|
219
|
+
printHints(statusHints(result));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function printDoctor(result) {
|
|
223
|
+
console.log(`doctor: ${result.ok ? "ok" : "needs attention"}`);
|
|
224
|
+
printStatus(result.status);
|
|
225
|
+
console.log(`workspace capture: ${check(result.workspace?.captured === true)}${workspaceDetail(result.workspace)}`);
|
|
226
|
+
console.log(`backend health: ${check(result.backend?.ok === true)}${backendDetail(result.backend)}`);
|
|
227
|
+
printHints(doctorHints(result));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function printInspectHistory(result) {
|
|
231
|
+
console.log(`inspect-history: ${result.ok ? "ok" : "needs attention"}`);
|
|
232
|
+
console.log(`codex home: ${result.codexHome}`);
|
|
233
|
+
console.log(`native sessions root: ${result.native.sessionsRoot} ${result.native.sessionsRootExists ? "(found)" : "(missing)"}`);
|
|
234
|
+
console.log(`native session files: ${result.native.sessionCount}`);
|
|
235
|
+
console.log(`memorax-code registry: ${result.memoraxCode.registryPath} ${result.memoraxCode.registryExists ? "(found)" : "(missing)"}`);
|
|
236
|
+
console.log(`memorax-code workspace state: ${result.memoraxCode.workspaceStatePath} ${result.memoraxCode.workspaceStateExists ? "(found)" : "(missing)"}`);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function printSessions(result) {
|
|
240
|
+
if (!result.ok) {
|
|
241
|
+
console.log(JSON.stringify(result, null, 2));
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
console.log(`sessions: ${result.ok ? "ok" : "needs attention"}`);
|
|
245
|
+
console.log(`session count: ${result.sessionCount}`);
|
|
246
|
+
for (const session of result.sessions.slice(0, 20)) {
|
|
247
|
+
const title = session.title ? ` ${session.title}` : "";
|
|
248
|
+
const workspace = session.workspace ? ` workspace=${session.workspace}` : "";
|
|
249
|
+
const path = session.relativePath ? ` path=${session.relativePath}` : "";
|
|
250
|
+
console.log(`- ${session.key}${title}${workspace}${path}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function printMarkSession(result) {
|
|
255
|
+
if (!result.ok) {
|
|
256
|
+
console.log(JSON.stringify(result, null, 2));
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
console.log("mark-session: ok");
|
|
260
|
+
console.log(`registry: ${result.path}`);
|
|
261
|
+
console.log(`session: ${result.session.key}`);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function check(ok) {
|
|
265
|
+
return ok ? "ok" : "not ok";
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function stateDetail(state) {
|
|
269
|
+
if (!state) return " missing";
|
|
270
|
+
if (state.unreadable) return " unreadable";
|
|
271
|
+
const parts = [
|
|
272
|
+
state.integration ? `integration=${state.integration}` : undefined,
|
|
273
|
+
typeof state.enabled === "boolean" ? `enabled=${state.enabled}` : undefined,
|
|
274
|
+
].filter(Boolean);
|
|
275
|
+
return parts.length ? ` ${parts.join(" ")}` : "";
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function workspaceDetail(workspace) {
|
|
279
|
+
if (!workspace) return " missing";
|
|
280
|
+
if (!workspace.captured) return ` no cwd captured (${workspace.path})`;
|
|
281
|
+
const latest = workspace.latest;
|
|
282
|
+
const cwd = typeof latest?.cwd === "string" ? latest.cwd : "unknown cwd";
|
|
283
|
+
const capturedAt = typeof latest?.capturedAt === "string" ? ` at ${latest.capturedAt}` : "";
|
|
284
|
+
return ` ${cwd}${capturedAt}`;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function backendDetail(backend) {
|
|
288
|
+
if (!backend) return " missing";
|
|
289
|
+
if (backend.ok) return backend.status ? ` status=${backend.status}` : "";
|
|
290
|
+
return ` ${backend.error ?? backend.status ?? "not reachable"}`;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function printHints(hints) {
|
|
294
|
+
if (hints.length === 0) return;
|
|
295
|
+
console.log("");
|
|
296
|
+
console.log("Recommended next steps:");
|
|
297
|
+
for (const hint of hints) console.log(`- ${hint}`);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function printCodexSkills(codexSkills) {
|
|
301
|
+
if (!codexSkills) return;
|
|
302
|
+
console.log(`codex skills: ${codexSkillsStatusLine(codexSkills)}`);
|
|
303
|
+
for (const skill of codexSkills.skills ?? []) {
|
|
304
|
+
if (skill.status === "linked") continue;
|
|
305
|
+
console.log(` ${skill.name}: ${skillStatusLine(skill)}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function codexSkillsStatusLine(codexSkills) {
|
|
310
|
+
const counts = codexSkills.counts ?? {};
|
|
311
|
+
const details = [
|
|
312
|
+
`total=${counts.total ?? 0}`,
|
|
313
|
+
`linked=${counts.linked ?? 0}`,
|
|
314
|
+
counts.changed ? `changed=${counts.changed}` : undefined,
|
|
315
|
+
counts.removed ? `removed=${counts.removed}` : undefined,
|
|
316
|
+
counts.conflict ? `conflict=${counts.conflict}` : undefined,
|
|
317
|
+
counts.sourceMissing ? `source-missing=${counts.sourceMissing}` : undefined,
|
|
318
|
+
counts.failed ? `failed=${counts.failed}` : undefined,
|
|
319
|
+
].filter(Boolean).join(" ");
|
|
320
|
+
return `${codexSkills.status ?? "unknown"}${details ? ` ${details}` : ""}`;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
function statusHints(result) {
|
|
324
|
+
const hints = [];
|
|
325
|
+
if (result.codexSkills?.status === "missing") {
|
|
326
|
+
hints.push("The plugin-managed memorax-code skill is missing; rerun `memorax-code start --codex-home DIR` to refresh the Codex plugin.");
|
|
327
|
+
}
|
|
328
|
+
if (result.enabled !== true) {
|
|
329
|
+
hints.push("Enable the adapter after the Backend is installed: `memorax-code start`.");
|
|
330
|
+
}
|
|
331
|
+
if (result.state?.unreadable) {
|
|
332
|
+
hints.push("Adapter state is unreadable; inspect or remove the state file, then rerun `memorax-code start`.");
|
|
333
|
+
}
|
|
334
|
+
if (result.backendUrlMatches === false) {
|
|
335
|
+
hints.push("Adapter state points at a different Backend endpoint; rerun `memorax-code start` to reconcile the persisted Hook connection.");
|
|
336
|
+
}
|
|
337
|
+
return hints;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function doctorHints(result) {
|
|
341
|
+
const hints = [...statusHints(result.status)];
|
|
342
|
+
if (result.backend?.ok !== true) {
|
|
343
|
+
hints.push("Backend is not reachable; start it with `memorax-code start` or pass the correct `--backend-url`.");
|
|
344
|
+
}
|
|
345
|
+
if (result.workspace?.captured !== true) {
|
|
346
|
+
hints.push("No Codex workspace has been captured yet; open or restart Codex in a workspace with the MemoraX Code hook installed, then submit one prompt.");
|
|
347
|
+
}
|
|
348
|
+
return dedupe(hints);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function dedupe(values) {
|
|
352
|
+
return [...new Set(values)];
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function skillStatusLine(skill) {
|
|
356
|
+
if (skill.status === "linked") return `ok linked source=${statusValue(skill.sourcePath)}`;
|
|
357
|
+
if (skill.status === "plugin-managed") return "ok plugin-managed";
|
|
358
|
+
if (skill.status === "missing") return `not linked target=${statusValue(skill.targetPath)}`;
|
|
359
|
+
if (skill.status === "source-missing") return `not ok source missing at ${statusValue(skill.sourcePath)}`;
|
|
360
|
+
if (skill.status === "conflict") return `not ok conflict target=${statusValue(skill.targetPath)}${skill.reason ? ` reason=${skill.reason}` : ""}`;
|
|
361
|
+
if (skill.status === "link-failed") return `not ok link failed target=${statusValue(skill.targetPath)}${skill.reason ? ` reason=${skill.reason}` : ""}`;
|
|
362
|
+
if (skill.status === "unlink-failed") return `not ok unlink failed target=${statusValue(skill.targetPath)}${skill.reason ? ` reason=${skill.reason}` : ""}`;
|
|
363
|
+
return `not ok ${skill.status ?? "unknown"}`;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function statusValue(value) {
|
|
367
|
+
return JSON.stringify(String(value ?? ""));
|
|
368
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../memorax-code-adapter-common/src/config-utils.mjs";
|