@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,559 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { execFileSync, spawn, spawnSync } from "node:child_process";
|
|
3
|
+
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, statSync } from "node:fs";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { join, resolve } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { atomicWriteJson, stringOption } from "../config-utils.mjs";
|
|
8
|
+
import { repoMemoryJobWorkerEnv } from "./repo-memory-job-context.mjs";
|
|
9
|
+
import {
|
|
10
|
+
markerPathForRepo,
|
|
11
|
+
readActiveRepoMemoryJobMarker,
|
|
12
|
+
realpathRepo,
|
|
13
|
+
releaseRepoMemoryStartupLock,
|
|
14
|
+
repoMemoryJobsDir,
|
|
15
|
+
removeRepoMemoryJobMarkerIfOwned,
|
|
16
|
+
tryAcquireRepoMemoryStartupLock,
|
|
17
|
+
waitForActiveRepoMemoryJobMarker,
|
|
18
|
+
writeRepoMemoryJobMarker,
|
|
19
|
+
} from "./repo-memory-job-marker.mjs";
|
|
20
|
+
|
|
21
|
+
const workerPath = fileURLToPath(new URL("./repo-memory-job-worker.mjs", import.meta.url));
|
|
22
|
+
const maintenanceDecisionSchema = "repo_memory_maintenance_decision.v1";
|
|
23
|
+
const DEFAULT_MEMORY_SKILL_INVOCATION = "$memorax-code";
|
|
24
|
+
|
|
25
|
+
export function runRepoMemoryJob(args, options) {
|
|
26
|
+
const runtime = normalizeRuntime(options);
|
|
27
|
+
const request = parseArgs(args);
|
|
28
|
+
if (request.command === "maintain") return maintainRepoMemory(request, runtime);
|
|
29
|
+
if (request.command === "start") return startRepoMemoryJob(request, runtime);
|
|
30
|
+
throw new Error(usage());
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function normalizeRuntime(options) {
|
|
34
|
+
if (typeof options?.createCommand !== "function") {
|
|
35
|
+
throw new Error("repo memory job runtime requires createCommand");
|
|
36
|
+
}
|
|
37
|
+
if (typeof options?.evaluateRepository !== "function") {
|
|
38
|
+
throw new Error("repo memory job runtime requires evaluateRepository");
|
|
39
|
+
}
|
|
40
|
+
if (!options?.validatorPath) {
|
|
41
|
+
throw new Error("repo memory job runtime requires validatorPath");
|
|
42
|
+
}
|
|
43
|
+
const runner = typeof options.runner === "string" ? options.runner.trim() : "";
|
|
44
|
+
if (!/^[a-z][a-z0-9-]*$/.test(runner)) {
|
|
45
|
+
throw new Error("repo memory job runtime requires a valid runner");
|
|
46
|
+
}
|
|
47
|
+
const finalMessageSource = options.finalMessageSource || "file";
|
|
48
|
+
if (finalMessageSource !== "file" && finalMessageSource !== "stdout") {
|
|
49
|
+
throw new Error("repo memory job runtime requires a valid finalMessageSource");
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
createCommand: options.createCommand,
|
|
53
|
+
evaluateRepository: options.evaluateRepository,
|
|
54
|
+
finalMessageSource,
|
|
55
|
+
memorySkillInvocation: stringOption(options.memorySkillInvocation) ?? DEFAULT_MEMORY_SKILL_INVOCATION,
|
|
56
|
+
runner,
|
|
57
|
+
validatorPath: resolve(options.validatorPath),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function maintainRepoMemory(request, runtime) {
|
|
62
|
+
const repo = realpathRepo(resolve(request.repo));
|
|
63
|
+
const memoraxCodeHome = process.env.MEMORAX_CODE_HOME || join(homedir(), ".memorax-code");
|
|
64
|
+
const activeMarker = readActiveRepoMemoryJobMarker({ memoraxCodeHome, repoRealpath: repo });
|
|
65
|
+
if (activeMarker.active) {
|
|
66
|
+
return maintenanceDecision({
|
|
67
|
+
action: "deduplicated",
|
|
68
|
+
reason: "active_job",
|
|
69
|
+
bundleStatus: "unchecked",
|
|
70
|
+
repo,
|
|
71
|
+
job: alreadyRunningPayload(activeMarker.marker),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const bundle = inspectRepoMemoryBundle(repo, runtime.validatorPath);
|
|
76
|
+
if (bundle.status === "unknown") {
|
|
77
|
+
return maintenanceDecision({
|
|
78
|
+
ok: false,
|
|
79
|
+
action: "none",
|
|
80
|
+
reason: "bundle_validation_failed",
|
|
81
|
+
bundleStatus: "unknown",
|
|
82
|
+
repo,
|
|
83
|
+
validation: bundle.validation,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (bundle.status === "missing" || bundle.status === "invalid") {
|
|
87
|
+
return launchMaintenanceJob({
|
|
88
|
+
request,
|
|
89
|
+
runtime,
|
|
90
|
+
repo,
|
|
91
|
+
action: "build",
|
|
92
|
+
reason: bundle.status === "missing" ? "bundle_missing" : "bundle_invalid",
|
|
93
|
+
bundleStatus: bundle.status,
|
|
94
|
+
validation: bundle.validation,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
let policyDecision;
|
|
99
|
+
try {
|
|
100
|
+
policyDecision = runtime.evaluateRepository({
|
|
101
|
+
repo,
|
|
102
|
+
nowMs: request.nowMs,
|
|
103
|
+
configPath: request.configPath,
|
|
104
|
+
});
|
|
105
|
+
} catch {
|
|
106
|
+
return maintenanceDecision({
|
|
107
|
+
ok: false,
|
|
108
|
+
action: "none",
|
|
109
|
+
reason: "policy_evaluation_failed",
|
|
110
|
+
bundleStatus: "usable",
|
|
111
|
+
repo,
|
|
112
|
+
validation: bundle.validation,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (!policyDecision.trigger) {
|
|
117
|
+
return maintenanceDecision({
|
|
118
|
+
action: "none",
|
|
119
|
+
reason: "up_to_date",
|
|
120
|
+
bundleStatus: "usable",
|
|
121
|
+
repo,
|
|
122
|
+
validation: bundle.validation,
|
|
123
|
+
policyDecision,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return launchMaintenanceJob({
|
|
128
|
+
request,
|
|
129
|
+
runtime,
|
|
130
|
+
repo,
|
|
131
|
+
action: "update",
|
|
132
|
+
reason: policyDecision.reason || "policy_triggered",
|
|
133
|
+
bundleStatus: "usable",
|
|
134
|
+
validation: bundle.validation,
|
|
135
|
+
policyDecision,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function launchMaintenanceJob(input) {
|
|
140
|
+
const job = startRepoMemoryJob({
|
|
141
|
+
command: "start",
|
|
142
|
+
repo: input.repo,
|
|
143
|
+
mode: input.action,
|
|
144
|
+
dryRun: input.request.dryRun,
|
|
145
|
+
}, input.runtime);
|
|
146
|
+
if (job.alreadyRunning) {
|
|
147
|
+
return maintenanceDecision({
|
|
148
|
+
action: "deduplicated",
|
|
149
|
+
reason: "active_job",
|
|
150
|
+
bundleStatus: input.bundleStatus,
|
|
151
|
+
repo: input.repo,
|
|
152
|
+
validation: input.validation,
|
|
153
|
+
policyDecision: input.policyDecision,
|
|
154
|
+
job,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return maintenanceDecision({
|
|
158
|
+
action: input.action,
|
|
159
|
+
reason: input.reason,
|
|
160
|
+
bundleStatus: input.bundleStatus,
|
|
161
|
+
repo: input.repo,
|
|
162
|
+
validation: input.validation,
|
|
163
|
+
policyDecision: input.policyDecision,
|
|
164
|
+
job,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function maintenanceDecision(input) {
|
|
169
|
+
return Object.fromEntries(Object.entries({
|
|
170
|
+
schema: maintenanceDecisionSchema,
|
|
171
|
+
ok: input.ok ?? true,
|
|
172
|
+
action: input.action,
|
|
173
|
+
reason: input.reason,
|
|
174
|
+
bundleStatus: input.bundleStatus,
|
|
175
|
+
repo: input.repo,
|
|
176
|
+
validation: input.validation,
|
|
177
|
+
policyDecision: input.policyDecision,
|
|
178
|
+
job: input.job,
|
|
179
|
+
}).filter(([, value]) => value !== undefined));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function inspectRepoMemoryBundle(repo, validatorPath) {
|
|
183
|
+
const profilePath = join(repo, ".repo_memory", "PROFILE.md");
|
|
184
|
+
if (!existsSync(profilePath)) return { status: "missing" };
|
|
185
|
+
try {
|
|
186
|
+
if (!statSync(profilePath).isFile()) {
|
|
187
|
+
return {
|
|
188
|
+
status: "invalid",
|
|
189
|
+
validation: { ok: false, reason: "profile_not_regular_file" },
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
} catch {
|
|
193
|
+
return {
|
|
194
|
+
status: "invalid",
|
|
195
|
+
validation: { ok: false, reason: "profile_unreadable" },
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
try {
|
|
200
|
+
if (!statSync(validatorPath).isFile()) {
|
|
201
|
+
return {
|
|
202
|
+
status: "unknown",
|
|
203
|
+
validation: { ok: false, reason: "validator_unavailable" },
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
} catch {
|
|
207
|
+
return {
|
|
208
|
+
status: "unknown",
|
|
209
|
+
validation: { ok: false, reason: "validator_unavailable" },
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const python = process.env.MEMORAX_CODE_REPO_MEMORY_PYTHON_COMMAND || "python3";
|
|
214
|
+
const result = spawnSync(python, [validatorPath, repo], {
|
|
215
|
+
cwd: repo,
|
|
216
|
+
encoding: "utf8",
|
|
217
|
+
env: process.env,
|
|
218
|
+
});
|
|
219
|
+
let report;
|
|
220
|
+
try {
|
|
221
|
+
report = JSON.parse(result.stdout || "");
|
|
222
|
+
} catch {
|
|
223
|
+
report = undefined;
|
|
224
|
+
}
|
|
225
|
+
if (!result.error && result.status === 0 && report?.ok === true) {
|
|
226
|
+
return {
|
|
227
|
+
status: "usable",
|
|
228
|
+
validation: { ok: true, exitCode: result.status },
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
if (result.error || !report || typeof report.ok !== "boolean") {
|
|
232
|
+
return {
|
|
233
|
+
status: "unknown",
|
|
234
|
+
validation: {
|
|
235
|
+
ok: false,
|
|
236
|
+
reason: "validator_unavailable",
|
|
237
|
+
exitCode: result.status,
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
status: "invalid",
|
|
243
|
+
validation: {
|
|
244
|
+
ok: false,
|
|
245
|
+
reason: result.error ? "validator_unavailable" : "validation_failed",
|
|
246
|
+
exitCode: result.status,
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function startRepoMemoryJob(request, runtime) {
|
|
252
|
+
const repo = realpathRepo(resolve(request.repo));
|
|
253
|
+
const mode = request.mode;
|
|
254
|
+
if (mode !== "build" && mode !== "update") throw new Error("--mode must be build or update");
|
|
255
|
+
if (mode === "update" && !existsSync(join(repo, ".repo_memory", "PROFILE.md"))) {
|
|
256
|
+
throw new Error(`repo memory update requires an existing .repo_memory/PROFILE.md: ${repo}`);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const memoraxCodeHome = process.env.MEMORAX_CODE_HOME || join(homedir(), ".memorax-code");
|
|
260
|
+
const jobsDir = repoMemoryJobsDir(memoraxCodeHome);
|
|
261
|
+
|
|
262
|
+
const activeMarker = readActiveRepoMemoryJobMarker({ memoraxCodeHome, repoRealpath: repo });
|
|
263
|
+
if (activeMarker.active) return alreadyRunningPayload(activeMarker.marker);
|
|
264
|
+
|
|
265
|
+
const jobId = `${new Date().toISOString().replace(/[^0-9]/g, "").slice(0, 17)}-${mode}-${safeSlug(repo)}-${randomSuffix()}`;
|
|
266
|
+
const jobDir = join(jobsDir, jobId);
|
|
267
|
+
const finalMessagePath = join(jobDir, "final-message.txt");
|
|
268
|
+
const outputLogPath = join(jobDir, "output.log");
|
|
269
|
+
const jobPath = join(jobDir, "job.json");
|
|
270
|
+
const snapshot = gitSnapshot(repo);
|
|
271
|
+
const prompt = mode === "build"
|
|
272
|
+
? buildPrompt(repo, snapshot.head, runtime.memorySkillInvocation)
|
|
273
|
+
: updatePrompt(repo, snapshot.head, runtime.memorySkillInvocation);
|
|
274
|
+
const command = runtime.createCommand({
|
|
275
|
+
finalMessagePath,
|
|
276
|
+
prompt,
|
|
277
|
+
repo,
|
|
278
|
+
});
|
|
279
|
+
assertCommand(command);
|
|
280
|
+
const runId = randomUUID().replace(/-/g, "");
|
|
281
|
+
const workerCommand = [
|
|
282
|
+
process.execPath,
|
|
283
|
+
workerPath,
|
|
284
|
+
"--job",
|
|
285
|
+
jobPath,
|
|
286
|
+
"--repo",
|
|
287
|
+
repo,
|
|
288
|
+
"--memorax-code-home",
|
|
289
|
+
memoraxCodeHome,
|
|
290
|
+
"--validator",
|
|
291
|
+
runtime.validatorPath,
|
|
292
|
+
];
|
|
293
|
+
|
|
294
|
+
if (request.dryRun) {
|
|
295
|
+
return {
|
|
296
|
+
ok: true,
|
|
297
|
+
dryRun: true,
|
|
298
|
+
alreadyRunning: false,
|
|
299
|
+
mode,
|
|
300
|
+
runner: runtime.runner,
|
|
301
|
+
finalMessageSource: runtime.finalMessageSource,
|
|
302
|
+
repo,
|
|
303
|
+
jobPath,
|
|
304
|
+
command,
|
|
305
|
+
workerCommand,
|
|
306
|
+
prompt,
|
|
307
|
+
snapshotHead: snapshot.head,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
mkdirSync(jobsDir, { recursive: true });
|
|
312
|
+
const lockResult = tryAcquireRepoMemoryStartupLock({ memoraxCodeHome, repoRealpath: repo });
|
|
313
|
+
if (!lockResult.acquired) {
|
|
314
|
+
const markerState = waitForActiveRepoMemoryJobMarker({ memoraxCodeHome, repoRealpath: repo, timeoutMs: 2000, intervalMs: 50 });
|
|
315
|
+
if (markerState.active) return alreadyRunningPayload(markerState.marker);
|
|
316
|
+
throw new Error(`repo memory job startup is already in progress for ${repo}`);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const startupLock = lockResult.lock;
|
|
320
|
+
try {
|
|
321
|
+
const markerInsideLock = readActiveRepoMemoryJobMarker({ memoraxCodeHome, repoRealpath: repo });
|
|
322
|
+
if (markerInsideLock.active) return alreadyRunningPayload(markerInsideLock.marker);
|
|
323
|
+
|
|
324
|
+
mkdirSync(jobDir);
|
|
325
|
+
const state = {
|
|
326
|
+
version: 1,
|
|
327
|
+
jobId,
|
|
328
|
+
mode,
|
|
329
|
+
repo,
|
|
330
|
+
status: "started",
|
|
331
|
+
startedAt: new Date().toISOString(),
|
|
332
|
+
command,
|
|
333
|
+
workerCommand,
|
|
334
|
+
prompt,
|
|
335
|
+
runner: runtime.runner,
|
|
336
|
+
finalMessageSource: runtime.finalMessageSource,
|
|
337
|
+
outputLogPath,
|
|
338
|
+
finalMessagePath,
|
|
339
|
+
runId,
|
|
340
|
+
snapshotHead: snapshot.head,
|
|
341
|
+
snapshotBranch: snapshot.branch,
|
|
342
|
+
snapshotWorkingTreeState: snapshot.workingTreeState,
|
|
343
|
+
};
|
|
344
|
+
atomicWriteJson(jobPath, state);
|
|
345
|
+
|
|
346
|
+
let logFd;
|
|
347
|
+
let child;
|
|
348
|
+
try {
|
|
349
|
+
logFd = openSync(outputLogPath, "a");
|
|
350
|
+
child = spawn(workerCommand[0], workerCommand.slice(1), {
|
|
351
|
+
cwd: repo,
|
|
352
|
+
detached: true,
|
|
353
|
+
env: repoMemoryJobWorkerEnv({ jobId, runId }),
|
|
354
|
+
stdio: ["ignore", logFd, logFd],
|
|
355
|
+
});
|
|
356
|
+
} finally {
|
|
357
|
+
if (logFd !== undefined) closeSync(logFd);
|
|
358
|
+
}
|
|
359
|
+
if (!Number.isInteger(child?.pid) || child.pid <= 0) {
|
|
360
|
+
child?.on?.("error", () => {});
|
|
361
|
+
throw new Error("failed to start repo memory job supervisor");
|
|
362
|
+
}
|
|
363
|
+
state.pid = child.pid;
|
|
364
|
+
state.workerPid = child.pid;
|
|
365
|
+
atomicWriteJson(jobPath, state);
|
|
366
|
+
writeRepoMemoryJobMarker({
|
|
367
|
+
memoraxCodeHome,
|
|
368
|
+
marker: {
|
|
369
|
+
version: 1,
|
|
370
|
+
repo,
|
|
371
|
+
repoKey: markerPathForRepo(memoraxCodeHome, repo).repoKey,
|
|
372
|
+
mode,
|
|
373
|
+
jobId,
|
|
374
|
+
jobPath,
|
|
375
|
+
outputLogPath,
|
|
376
|
+
finalMessagePath,
|
|
377
|
+
pid: child.pid,
|
|
378
|
+
runner: runtime.runner,
|
|
379
|
+
runId,
|
|
380
|
+
startedAt: state.startedAt,
|
|
381
|
+
},
|
|
382
|
+
});
|
|
383
|
+
waitForWorkerInitialization({
|
|
384
|
+
child,
|
|
385
|
+
memoraxCodeHome,
|
|
386
|
+
jobPath,
|
|
387
|
+
repo,
|
|
388
|
+
state,
|
|
389
|
+
jobId,
|
|
390
|
+
runId,
|
|
391
|
+
});
|
|
392
|
+
child.unref();
|
|
393
|
+
return {
|
|
394
|
+
ok: true,
|
|
395
|
+
alreadyRunning: false,
|
|
396
|
+
mode,
|
|
397
|
+
runner: runtime.runner,
|
|
398
|
+
repo,
|
|
399
|
+
jobId,
|
|
400
|
+
jobPath,
|
|
401
|
+
outputLogPath,
|
|
402
|
+
finalMessagePath,
|
|
403
|
+
pid: child.pid,
|
|
404
|
+
};
|
|
405
|
+
} finally {
|
|
406
|
+
releaseRepoMemoryStartupLock(startupLock);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
function waitForWorkerInitialization(input) {
|
|
411
|
+
const deadline = Date.now() + 3000;
|
|
412
|
+
let lastState = input.state;
|
|
413
|
+
for (;;) {
|
|
414
|
+
try {
|
|
415
|
+
lastState = JSON.parse(readFileSync(input.jobPath, "utf8"));
|
|
416
|
+
} catch {
|
|
417
|
+
// Atomic replacement can make the file briefly unavailable to a concurrent reader.
|
|
418
|
+
}
|
|
419
|
+
if (lastState.status === "running" || lastState.status === "succeeded" || lastState.status === "failed") return;
|
|
420
|
+
|
|
421
|
+
if (!pidIsRunning(input.child.pid)) {
|
|
422
|
+
failWorkerInitialization(input, lastState, "repo memory job supervisor exited during startup");
|
|
423
|
+
}
|
|
424
|
+
if (Date.now() >= deadline) {
|
|
425
|
+
try {
|
|
426
|
+
process.kill(input.child.pid, "SIGTERM");
|
|
427
|
+
} catch {
|
|
428
|
+
// The worker may have exited between the liveness check and cleanup.
|
|
429
|
+
}
|
|
430
|
+
failWorkerInitialization(input, lastState, "timed out waiting for repo memory job supervisor startup");
|
|
431
|
+
}
|
|
432
|
+
sleep(25);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function failWorkerInitialization(input, state, message) {
|
|
437
|
+
atomicWriteJson(input.jobPath, {
|
|
438
|
+
...state,
|
|
439
|
+
status: "failed",
|
|
440
|
+
finishedAt: new Date().toISOString(),
|
|
441
|
+
failureReason: "worker_start_failed",
|
|
442
|
+
error: message,
|
|
443
|
+
});
|
|
444
|
+
removeRepoMemoryJobMarkerIfOwned({
|
|
445
|
+
memoraxCodeHome: input.memoraxCodeHome,
|
|
446
|
+
repoRealpath: input.repo,
|
|
447
|
+
jobId: input.jobId,
|
|
448
|
+
runId: input.runId,
|
|
449
|
+
});
|
|
450
|
+
throw new Error(message);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function pidIsRunning(pid) {
|
|
454
|
+
try {
|
|
455
|
+
process.kill(pid, 0);
|
|
456
|
+
return true;
|
|
457
|
+
} catch (error) {
|
|
458
|
+
return error?.code === "EPERM";
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
function sleep(ms) {
|
|
463
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
function alreadyRunningPayload(marker) {
|
|
467
|
+
return {
|
|
468
|
+
ok: true,
|
|
469
|
+
alreadyRunning: true,
|
|
470
|
+
mode: marker.mode,
|
|
471
|
+
repo: marker.repo,
|
|
472
|
+
jobId: marker.jobId,
|
|
473
|
+
jobPath: marker.jobPath,
|
|
474
|
+
outputLogPath: marker.outputLogPath,
|
|
475
|
+
finalMessagePath: marker.finalMessagePath,
|
|
476
|
+
pid: marker.pid,
|
|
477
|
+
runner: marker.runner,
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
function parseArgs(values) {
|
|
482
|
+
const result = { command: values[0] };
|
|
483
|
+
for (let index = 1; index < values.length; index += 1) {
|
|
484
|
+
const value = values[index];
|
|
485
|
+
if (value === "--mode") result.mode = values[++index];
|
|
486
|
+
else if (value === "--repo") result.repo = values[++index];
|
|
487
|
+
else if (value === "--dry-run") result.dryRun = true;
|
|
488
|
+
else if (value === "--now") {
|
|
489
|
+
result.nowMs = Date.parse(values[++index] || "");
|
|
490
|
+
if (!Number.isFinite(result.nowMs)) throw new Error("--now must be ISO8601");
|
|
491
|
+
} else if (value === "--config") {
|
|
492
|
+
const configPath = values[++index];
|
|
493
|
+
if (!configPath || configPath.startsWith("--")) throw new Error("--config requires a value");
|
|
494
|
+
result.configPath = resolve(configPath);
|
|
495
|
+
} else throw new Error(`unknown argument: ${value}`);
|
|
496
|
+
}
|
|
497
|
+
if (!result.repo) throw new Error("--repo is required");
|
|
498
|
+
if (result.command === "start" && (result.nowMs !== undefined || result.configPath !== undefined)) {
|
|
499
|
+
throw new Error("--now and --config are only valid with maintain");
|
|
500
|
+
}
|
|
501
|
+
if (result.command === "maintain" && result.mode !== undefined) {
|
|
502
|
+
throw new Error("--mode is only valid with start");
|
|
503
|
+
}
|
|
504
|
+
return result;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
function usage() {
|
|
508
|
+
return [
|
|
509
|
+
"usage:",
|
|
510
|
+
" repo-memory-job.mjs maintain --repo PATH [--dry-run] [--now ISO8601] [--config PATH]",
|
|
511
|
+
" repo-memory-job.mjs start --mode build|update --repo PATH [--dry-run]",
|
|
512
|
+
].join("\n");
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
function buildPrompt(repo, snapshotHead, memorySkillInvocation) {
|
|
516
|
+
return `This invocation is the authorized background repo-memory worker. Complete the requested operation yourself; do not inspect, launch, or defer to another repo-memory job.\n\nUse ${memorySkillInvocation} and select the Repo Memory repo-build operation to build lightweight repo memory for this repository.\n\nRepository: ${repo}\nSnapshot HEAD: ${snapshotHead}\n\nDefault behavior:\n- Collect local git commit evidence from the exact snapshot SHA above, not a later symbolic HEAD.\n- Also try GitHub/GitLab PR, MR, and issue evidence when provider CLIs and authentication are available.\n- If provider evidence is unavailable, continue local-only and clearly record why.\n- Do not fabricate PR, MR, or issue facts.\n- If a previous attempt left an existing partial or unusable .repo_memory directory, perform a full refresh with collect_all.py --reuse instead of stopping because the directory exists.\n- Preserve .repo_memory/procedure-memory and .repo_memory/user-profile sidecars during full-refresh recovery.\n- Keep file writes scoped to ${repo}/.repo_memory and necessary repo-memory ignore/config entries.\n- Do not modify source code, dependency files, global config, or files outside the target repo unless explicitly required by repo-memory tooling.\n- Ensure PROFILE.md local_head resolves to the snapshot SHA above.\n- Run the packaged repo-memory validator before finishing.\n- Write a concise final summary with generated files, provider evidence status, and any follow-up needed.\n`;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
function updatePrompt(repo, snapshotHead, memorySkillInvocation) {
|
|
520
|
+
return `This invocation is the authorized background repo-memory worker. Complete the requested operation yourself; do not inspect, launch, or defer to another repo-memory job.\n\nUse ${memorySkillInvocation} and select the Repo Memory repo-update operation to incrementally update this repository's existing .repo_memory.\n\nRepository: ${repo}\nSnapshot HEAD: ${snapshotHead}\n\nDefault behavior:\n- Treat existing .repo_memory as the baseline.\n- Detect local commit delta from the stored baseline to the exact snapshot SHA above.\n- Also try GitHub/GitLab PR, MR, and issue evidence when provider CLIs and authentication are available.\n- If provider evidence is unavailable, continue with local git evidence and preserve existing provider resources.\n- Do not rebuild unless updater reports the baseline is unusable; if a full rebuild is required, stop and report that.\n- Keep file writes scoped to ${repo}/.repo_memory and necessary repo-memory ignore/config entries.\n- Do not modify source code, dependency files, global config, or files outside the target repo unless explicitly required by repo-memory tooling.\n- Ensure PROFILE.md local_head resolves to the snapshot SHA above.\n- Run the packaged repo-memory validator before finishing.\n- Write a concise final summary with changed files, provider evidence status, and any follow-up needed.\n`;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
function gitSnapshot(repo) {
|
|
524
|
+
try {
|
|
525
|
+
return {
|
|
526
|
+
head: execFileSync("git", ["rev-parse", "--verify", "HEAD^{commit}"], {
|
|
527
|
+
cwd: repo,
|
|
528
|
+
encoding: "utf8",
|
|
529
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
530
|
+
}).trim(),
|
|
531
|
+
branch: execFileSync("git", ["branch", "--show-current"], {
|
|
532
|
+
cwd: repo,
|
|
533
|
+
encoding: "utf8",
|
|
534
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
535
|
+
}).trim() || "(detached HEAD)",
|
|
536
|
+
workingTreeState: execFileSync("git", ["status", "--short"], {
|
|
537
|
+
cwd: repo,
|
|
538
|
+
encoding: "utf8",
|
|
539
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
540
|
+
}).trim() ? "dirty" : "clean",
|
|
541
|
+
};
|
|
542
|
+
} catch {
|
|
543
|
+
throw new Error(`repo memory jobs require a readable git HEAD: ${repo}`);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
function safeSlug(value) {
|
|
548
|
+
return value.split(/[\\/]/).filter(Boolean).pop()?.replace(/[^a-zA-Z0-9_.-]/g, "-").slice(0, 40) || "repo";
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
function randomSuffix() {
|
|
552
|
+
return randomUUID().replace(/-/g, "").slice(0, 8);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
function assertCommand(command) {
|
|
556
|
+
if (!Array.isArray(command) || command.length === 0 || command.some((entry) => typeof entry !== "string" || !entry)) {
|
|
557
|
+
throw new Error("repo memory job runtime returned an invalid command");
|
|
558
|
+
}
|
|
559
|
+
}
|