@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,116 @@
|
|
|
1
|
+
# Repo Memory Update
|
|
2
|
+
|
|
3
|
+
## Core Principle
|
|
4
|
+
|
|
5
|
+
Update existing repo memory from a delta, not a full rebuild. Treat the current `.repo_memory/` bundle as the baseline, detect the newest local commits and provider PR/MR/issue changes, then edit only the affected resources.
|
|
6
|
+
|
|
7
|
+
Do not rebuild the whole bundle by default. Return to `SKILL.md` and use `repo-build.md` only when `.repo_memory/PROFILE.md` is missing, the existing memory is structurally unusable, or the user explicitly asks for a full rebuild.
|
|
8
|
+
|
|
9
|
+
This is the incremental updater, not the daily reader. Use `repo-read.md` for task-time search over existing memory. Use `repo-build.md` for first-time creation, full rebuild flows, or full refresh work that should rerun builder collection with `collect_all.py --reuse`.
|
|
10
|
+
|
|
11
|
+
## Prerequisite
|
|
12
|
+
|
|
13
|
+
The user selects a repository, not a memory directory. Derive the memory path as `<repo>/.repo_memory`.
|
|
14
|
+
|
|
15
|
+
Require:
|
|
16
|
+
|
|
17
|
+
- `<repo>` is a local git repository;
|
|
18
|
+
- `<repo>/.repo_memory/PROFILE.md` exists;
|
|
19
|
+
- existing `PROFILE.md` and `resources/*.md` are treated as the baseline.
|
|
20
|
+
|
|
21
|
+
If `.repo_memory/PROFILE.md` is missing, stop and route to `repo-build.md`; do not fabricate an incremental baseline from live files alone.
|
|
22
|
+
|
|
23
|
+
## Path Convention
|
|
24
|
+
|
|
25
|
+
`<skill-dir>` means the parent directory of the `references/` directory containing this file.
|
|
26
|
+
|
|
27
|
+
## Default Settings
|
|
28
|
+
|
|
29
|
+
Updater uses `<skill-dir>/defaults.json` for provider comparison defaults so build and update operations stay aligned. It reads `limits.prs`, `limits.issues`, and `summaryChars`; local commit deltas are not limit-capped because they are computed from the stored baseline commit to current `HEAD`.
|
|
30
|
+
|
|
31
|
+
Override one updater run with `--pr-limit`, `--issue-limit`, or `--summary-chars`. Do not edit `defaults.json` for a one-run updater request.
|
|
32
|
+
|
|
33
|
+
## User Count Requests
|
|
34
|
+
|
|
35
|
+
If the user says how many PRs/MRs or issues to compare, pass explicit one-run flags:
|
|
36
|
+
|
|
37
|
+
- "PR 拉 20 条" means add `--pr-limit 20`.
|
|
38
|
+
- "issue 拉 30 条" means add `--issue-limit 30`.
|
|
39
|
+
- "PR 和 issue 都拉 50 条" means add `--pr-limit 50 --issue-limit 50`.
|
|
40
|
+
|
|
41
|
+
Only change `<skill-dir>/defaults.json` when the user asks to change future default behavior.
|
|
42
|
+
|
|
43
|
+
## Detection
|
|
44
|
+
|
|
45
|
+
Start every updater run by detecting deltas:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
python3 <skill-dir>/scripts/detect_updates.py \
|
|
49
|
+
--repo-path <repo-path> \
|
|
50
|
+
--pretty
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The detector:
|
|
54
|
+
|
|
55
|
+
- reads the commit baseline from `PROFILE.md` `local_head`, with a fallback to the nearest stored ancestor commit in `resources/commits.md`;
|
|
56
|
+
- reads PR/MR and issue baselines from `resources/prs.md` and `resources/issues.md`, enriched by existing raw provider facets when available;
|
|
57
|
+
- compares local git `HEAD` against the newest stored commit;
|
|
58
|
+
- reports `local_commit_status.status: "skipped"` with `reason: "missing_baseline_commit"` when no stored local commit baseline can be found;
|
|
59
|
+
- reports `local_commit_status.status: "skipped"` with `reason: "baseline_not_ancestor_of_head"` when history was rebased or force-pushed, instead of silently returning no commit delta;
|
|
60
|
+
- detects provider state from live git remotes and provider CLIs;
|
|
61
|
+
- fetches bounded latest GitHub/GitLab PR/MR/issue facets when provider evidence is available;
|
|
62
|
+
- reports added or changed PR/MR/issue numbers without editing memory files;
|
|
63
|
+
- reports provider items missing from the current bounded window as `baseline_only_numbers`, not as deletions.
|
|
64
|
+
|
|
65
|
+
Warnings such as rewritten commit baselines or provider fetch failures are returned as structured `notices[]` with `render_as: "assistant_message"`. Show these notices to the user as normal assistant messages; do not bury them in terminal output.
|
|
66
|
+
|
|
67
|
+
When provider fetch succeeds, the report includes fetched authoring evidence under `current.provider_items.pull_requests` and `current.provider_items.issues`. Use those facets, plus existing raw/provider resources when needed, to write or replace search-grade sections; do not author provider sections from number-only deltas.
|
|
68
|
+
|
|
69
|
+
The report also includes `builder_helpers` fingerprints for the sibling builder files that updater depends on, including `path`, `exists`, `mtime_ns`, and `size_bytes`. Use this only for compatibility diagnostics; it is not evidence for authoring repo-memory resources.
|
|
70
|
+
|
|
71
|
+
Use `--provider-mode off` when the user requested a local-only update or provider access is intentionally unavailable.
|
|
72
|
+
|
|
73
|
+
## Provider Sandbox and Transport Failures
|
|
74
|
+
|
|
75
|
+
`gh/glab` provider delta detection needs external network access. If `current.provider_fetch.ok` is false, or notice/stderr shows `fetch failed`, timeout, DNS, connection, TLS, `ENOTFOUND`, `EAI_AGAIN`, or similar transport text, show `Provider Delta Fetch Failed`, keep existing PR/MR/issue resources unchanged, and continue only with safe local commit updates.
|
|
76
|
+
|
|
77
|
+
Verify provider authentication in the same normal shell with the command reported by `detect_updates.py`; for GitHub Enterprise or self-hosted GitLab this may include `--hostname <host>`. Authenticate with `gh auth login` or `glab auth login` (also host-scoped when prompted), then rerun `detect_updates.py`; do not paste tokens into the skill or call provider APIs directly.
|
|
78
|
+
|
|
79
|
+
Do not use a restricted shell sandbox to verify provider/API availability. Verify in a normal shell or approved network-enabled mode before editing provider resources. If only restricted shell access is available, keep existing PR/MR/issue resources unchanged and continue only with safe local commit updates. Do not treat provider fetch failure as no PR/issue delta, empty provider evidence, bad login, or bypass the detector with direct APIs, browser scraping, copied credentials, or hand-written raw facets.
|
|
80
|
+
|
|
81
|
+
## Report Gates
|
|
82
|
+
|
|
83
|
+
Read the JSON report as gates before editing. Stop at the first blocking gate; otherwise edit only resources named by the report.
|
|
84
|
+
|
|
85
|
+
| Report field | Action |
|
|
86
|
+
| --- | --- |
|
|
87
|
+
| `ok: false` and missing memory | Route to `repo-build.md`; do not invent a baseline. |
|
|
88
|
+
| no deltas and no notices | Report no update needed. |
|
|
89
|
+
| `commit_delta_skipped: "missing_baseline_commit"` | Stop commit-resource updates; recommend full rebuild. |
|
|
90
|
+
| `commit_delta_skipped: "baseline_not_ancestor_of_head"` | Stop commit-resource updates; recommend rebuild or explicit baseline reset. |
|
|
91
|
+
| provider fetch failed / `Provider Delta Fetch Failed` | Keep existing PR/MR/issue resources unchanged; local commits may still be updated. |
|
|
92
|
+
| `deltas.local_commits` | Update only `resources/commits.md`; refresh `PROFILE.md` local head and `generated_at` timestamp. |
|
|
93
|
+
| `deltas.pull_requests.upsert_numbers` | Upsert only matching PR/MR sections from `current.provider_items.pull_requests`; preserve `baseline_only_numbers`. |
|
|
94
|
+
| `deltas.issues.upsert_numbers` | Upsert only matching issue sections from `current.provider_items.issues`; preserve `baseline_only_numbers`. |
|
|
95
|
+
|
|
96
|
+
Never delete prior PR/MR/issue sections because they are absent from the bounded provider fetch; deletion needs explicit user instruction or verified invalidation. Finish with the builder validator:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
python3 <skill-dir>/scripts/validate_memory.py <repo-path> --pretty
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Whenever an update changes generated repo-memory artifacts, set `PROFILE.md.generated_at` to the successful update time and `PROFILE.md.local_head` to the processed snapshot. The read-time cooldown policy uses this timestamp; do not preserve an older build time after a successful incremental update.
|
|
103
|
+
|
|
104
|
+
## Authoring Rules
|
|
105
|
+
|
|
106
|
+
Match existing fixed-field sections first; use builder templates only when the file shape is incomplete. Upsert by stable keys: commit SHA, PR/MR number, and issue number. Replace matching sections, append only new keys, and do not delete useful notes unless explicit instruction or verified evidence invalidates them.
|
|
107
|
+
|
|
108
|
+
Every new or replaced section needs a search-grade `Description`, evidence strength, and source from local commit delta, `current.provider_items`, or raw provider files. Number-only deltas route the edit; they are not authoring evidence. Do not invent PR/MR/issue evidence when provider fetch is skipped or unavailable, paste long raw summaries, or treat validator/counts as proof of body quality.
|
|
109
|
+
|
|
110
|
+
## Trust Rules
|
|
111
|
+
|
|
112
|
+
- Live code and targeted verification are stronger than repo memory.
|
|
113
|
+
- Local commit deltas are checkout history, not current behavior proof.
|
|
114
|
+
- Provider PR/MR/issue deltas are historical or planning context, not implementation truth.
|
|
115
|
+
- Open PRs/MRs are branch intent, not landed behavior.
|
|
116
|
+
- Issues are user/problem context, not implementation proof.
|
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Run the mechanical repo-memory collection steps."""
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import json
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
from collections import Counter
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any, Optional
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
SCRIPT_DIR = Path(__file__).resolve().parent
|
|
14
|
+
DEFAULTS_PATH = SCRIPT_DIR.parent / "defaults.json"
|
|
15
|
+
FALLBACK_DEFAULTS = {
|
|
16
|
+
"limits": {
|
|
17
|
+
"commits": 30,
|
|
18
|
+
"prs": 30,
|
|
19
|
+
"issues": 30,
|
|
20
|
+
},
|
|
21
|
+
"summaryChars": 4000,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ProgressBar:
|
|
26
|
+
def __init__(self, enabled: bool, total: int) -> None:
|
|
27
|
+
self.enabled = enabled
|
|
28
|
+
self.total = total
|
|
29
|
+
self.width = 20
|
|
30
|
+
self._last_line_len = 0
|
|
31
|
+
self._is_tty = sys.stderr.isatty()
|
|
32
|
+
|
|
33
|
+
def update(self, completed: int, label: str) -> None:
|
|
34
|
+
if not self.enabled:
|
|
35
|
+
return
|
|
36
|
+
completed = max(0, min(completed, self.total))
|
|
37
|
+
filled = round((completed / self.total) * self.width) if self.total else self.width
|
|
38
|
+
bar = "#" * filled + "-" * (self.width - filled)
|
|
39
|
+
line = f"memorax-code repo-build [{bar}] {completed}/{self.total} {label}"
|
|
40
|
+
if self._is_tty:
|
|
41
|
+
padding = " " * max(0, self._last_line_len - len(line))
|
|
42
|
+
print(f"\r{line}{padding}", end="", file=sys.stderr, flush=True)
|
|
43
|
+
self._last_line_len = len(line)
|
|
44
|
+
else:
|
|
45
|
+
print(line, file=sys.stderr, flush=True)
|
|
46
|
+
|
|
47
|
+
def fail(self, completed: int, label: str) -> None:
|
|
48
|
+
self.update(completed, label)
|
|
49
|
+
self.finish()
|
|
50
|
+
|
|
51
|
+
def finish(self) -> None:
|
|
52
|
+
if self.enabled and self._is_tty:
|
|
53
|
+
print(file=sys.stderr, flush=True)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def run_step(cmd: list[str], cwd: Path) -> subprocess.CompletedProcess[str]:
|
|
57
|
+
return subprocess.run(cmd, cwd=cwd, text=True, capture_output=True)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def json_step(result: subprocess.CompletedProcess[str]) -> dict[str, Any]:
|
|
61
|
+
return {
|
|
62
|
+
"ok": result.returncode == 0,
|
|
63
|
+
"exit_code": result.returncode,
|
|
64
|
+
"stdout": result.stdout.strip(),
|
|
65
|
+
"stderr": result.stderr.strip(),
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def load_json(path: Path) -> Any:
|
|
70
|
+
return json.loads(path.read_text(encoding="utf-8"))
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def raw_source_counts(path: Path) -> dict[str, int]:
|
|
74
|
+
if not path.exists():
|
|
75
|
+
return {}
|
|
76
|
+
data = load_json(path)
|
|
77
|
+
if not isinstance(data, list):
|
|
78
|
+
return {}
|
|
79
|
+
counts = Counter(str(item.get("sourceType") or "unknown") for item in data if isinstance(item, dict))
|
|
80
|
+
return dict(sorted(counts.items()))
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def emit_process_output(result: subprocess.CompletedProcess[str]) -> None:
|
|
84
|
+
if result.stderr:
|
|
85
|
+
print(result.stderr, file=sys.stderr)
|
|
86
|
+
if result.stdout:
|
|
87
|
+
print(result.stdout, file=sys.stderr)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def write_report(report: dict[str, Any], pretty: bool) -> None:
|
|
91
|
+
print(json.dumps(report, ensure_ascii=False, indent=2 if pretty else None))
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def write_failure(
|
|
95
|
+
failed_step: str,
|
|
96
|
+
result: subprocess.CompletedProcess[str],
|
|
97
|
+
pretty: bool,
|
|
98
|
+
*,
|
|
99
|
+
repo: Optional[Path] = None,
|
|
100
|
+
memory: Optional[Path] = None,
|
|
101
|
+
provider: Optional[dict[str, Any]] = None,
|
|
102
|
+
steps: Optional[dict[str, Any]] = None,
|
|
103
|
+
outputs: Optional[dict[str, str]] = None,
|
|
104
|
+
notices: Optional[list[dict[str, Any]]] = None,
|
|
105
|
+
) -> int:
|
|
106
|
+
emit_process_output(result)
|
|
107
|
+
step_reports = dict(steps or {})
|
|
108
|
+
step_reports[failed_step] = json_step(result)
|
|
109
|
+
report = {
|
|
110
|
+
"ok": False,
|
|
111
|
+
"failed_step": failed_step,
|
|
112
|
+
"steps": step_reports,
|
|
113
|
+
}
|
|
114
|
+
if repo is not None:
|
|
115
|
+
report["repo_path"] = str(repo)
|
|
116
|
+
if memory is not None:
|
|
117
|
+
report["memory_path"] = str(memory)
|
|
118
|
+
if provider is not None:
|
|
119
|
+
report["provider"] = provider
|
|
120
|
+
if outputs:
|
|
121
|
+
report["outputs"] = outputs
|
|
122
|
+
if notices:
|
|
123
|
+
report["notices"] = notices
|
|
124
|
+
write_report(report, pretty)
|
|
125
|
+
return result.returncode or 1
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def provider_report(prepare_report: dict[str, Any]) -> dict[str, Any]:
|
|
129
|
+
return {
|
|
130
|
+
"name": prepare_report.get("git_provider", ""),
|
|
131
|
+
"repo": prepare_report.get("git_remote_repo", ""),
|
|
132
|
+
"host": prepare_report.get("git_remote_host", ""),
|
|
133
|
+
"remote_name": prepare_report.get("git_remote_name", ""),
|
|
134
|
+
"selection_reason": prepare_report.get("git_remote_selection_reason", ""),
|
|
135
|
+
"cli": prepare_report.get("provider_cli", ""),
|
|
136
|
+
"cli_available": bool(prepare_report.get("provider_cli_available")),
|
|
137
|
+
"authenticated": bool(prepare_report.get("provider_authenticated")),
|
|
138
|
+
"auth_status": prepare_report.get("provider_auth_status", ""),
|
|
139
|
+
"evidence_state": prepare_report.get("provider_evidence_state", ""),
|
|
140
|
+
"login_hint": prepare_report.get("provider_login_hint", ""),
|
|
141
|
+
"notice_level": prepare_report.get("provider_notice_level", ""),
|
|
142
|
+
"user_notice": prepare_report.get("provider_user_notice", ""),
|
|
143
|
+
"notice_markdown": prepare_report.get("provider_notice_markdown", ""),
|
|
144
|
+
"next_steps": prepare_report.get("provider_next_steps", []),
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def provider_notices(prepare_report: dict[str, Any]) -> list[dict[str, Any]]:
|
|
149
|
+
if prepare_report.get("provider_notice_level") != "warning":
|
|
150
|
+
return []
|
|
151
|
+
message = str(prepare_report.get("provider_user_notice", "")).replace("`", "")
|
|
152
|
+
return [
|
|
153
|
+
{
|
|
154
|
+
"level": "warning",
|
|
155
|
+
"title": "Provider Evidence Unavailable",
|
|
156
|
+
"message": message,
|
|
157
|
+
"command": prepare_report.get("provider_login_hint", ""),
|
|
158
|
+
"next_steps": prepare_report.get("provider_next_steps", []),
|
|
159
|
+
"render_as": "assistant_message",
|
|
160
|
+
}
|
|
161
|
+
]
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def provider_failure_notice(provider: dict[str, Any], result: subprocess.CompletedProcess[str], *, continuing: bool) -> dict[str, Any]:
|
|
165
|
+
stderr = result.stderr.strip()
|
|
166
|
+
stdout = result.stdout.strip()
|
|
167
|
+
detail = (stderr or stdout or "provider facet collection failed").replace("`", "")
|
|
168
|
+
if len(detail) > 800:
|
|
169
|
+
detail = f"{detail[:800]}..."
|
|
170
|
+
label = str(provider.get("name") or "provider")
|
|
171
|
+
evidence = "GitHub PR/issue" if label == "github" else "GitLab MR/issue" if label == "gitlab" else "provider"
|
|
172
|
+
continuation = (
|
|
173
|
+
"Continuing with local-only repo memory now."
|
|
174
|
+
if continuing
|
|
175
|
+
else "Provider evidence was required, so the run stopped before authoring provider resources."
|
|
176
|
+
)
|
|
177
|
+
return {
|
|
178
|
+
"level": "warning",
|
|
179
|
+
"title": "Provider Evidence Unavailable",
|
|
180
|
+
"message": (
|
|
181
|
+
f"{evidence} evidence could not be collected even though the provider CLI appeared ready. "
|
|
182
|
+
f"{continuation} Provider error: {detail}"
|
|
183
|
+
),
|
|
184
|
+
"command": "",
|
|
185
|
+
"next_steps": [
|
|
186
|
+
"Fix provider repository access or remote URL.",
|
|
187
|
+
f"Rerun $memorax-code repo-build to collect {evidence} evidence.",
|
|
188
|
+
],
|
|
189
|
+
"render_as": "assistant_message",
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def provider_script(provider: str) -> str:
|
|
194
|
+
if provider == "github":
|
|
195
|
+
return "github_resource_facets.py"
|
|
196
|
+
if provider == "gitlab":
|
|
197
|
+
return "gitlab_resource_facets.py"
|
|
198
|
+
return ""
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def provider_raw_name(provider: str) -> str:
|
|
202
|
+
if provider == "github":
|
|
203
|
+
return "github-facets.json"
|
|
204
|
+
if provider == "gitlab":
|
|
205
|
+
return "gitlab-facets.json"
|
|
206
|
+
return "provider-facets.json"
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def load_default_settings() -> tuple[dict[str, Any], str]:
|
|
210
|
+
if not DEFAULTS_PATH.exists():
|
|
211
|
+
return FALLBACK_DEFAULTS, "hardcoded_fallback"
|
|
212
|
+
try:
|
|
213
|
+
data = json.loads(DEFAULTS_PATH.read_text(encoding="utf-8"))
|
|
214
|
+
except json.JSONDecodeError as exc:
|
|
215
|
+
raise ValueError(f"{DEFAULTS_PATH}: invalid JSON at line {exc.lineno}, column {exc.colno}: {exc.msg}") from exc
|
|
216
|
+
if not isinstance(data, dict):
|
|
217
|
+
raise ValueError(f"{DEFAULTS_PATH}: expected a JSON object")
|
|
218
|
+
return data, str(DEFAULTS_PATH)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def default_int(settings: dict[str, Any], path: list[str], fallback: int) -> int:
|
|
222
|
+
value: Any = settings
|
|
223
|
+
for key in path:
|
|
224
|
+
value = value.get(key) if isinstance(value, dict) else None
|
|
225
|
+
if value is None:
|
|
226
|
+
return fallback
|
|
227
|
+
if isinstance(value, bool) or not isinstance(value, int):
|
|
228
|
+
raise ValueError(f"{DEFAULTS_PATH}: {'.'.join(path)} must be an integer")
|
|
229
|
+
return value
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def validate_range(parser: argparse.ArgumentParser, name: str, value: int, minimum: int, maximum: int) -> None:
|
|
233
|
+
if value < minimum or value > maximum:
|
|
234
|
+
parser.error(f"{name} must be from {minimum} to {maximum}")
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def apply_effective_settings(args: argparse.Namespace, parser: argparse.ArgumentParser) -> argparse.Namespace:
|
|
238
|
+
try:
|
|
239
|
+
defaults, source = load_default_settings()
|
|
240
|
+
default_commit_limit = default_int(defaults, ["limits", "commits"], FALLBACK_DEFAULTS["limits"]["commits"])
|
|
241
|
+
default_pr_limit = default_int(defaults, ["limits", "prs"], FALLBACK_DEFAULTS["limits"]["prs"])
|
|
242
|
+
default_issue_limit = default_int(defaults, ["limits", "issues"], FALLBACK_DEFAULTS["limits"]["issues"])
|
|
243
|
+
default_summary_chars = default_int(defaults, ["summaryChars"], FALLBACK_DEFAULTS["summaryChars"])
|
|
244
|
+
except ValueError as exc:
|
|
245
|
+
parser.error(str(exc))
|
|
246
|
+
|
|
247
|
+
commit_limit = args.commit_limit if args.commit_limit is not None else default_commit_limit
|
|
248
|
+
pr_limit = args.pr_limit if args.pr_limit is not None else default_pr_limit
|
|
249
|
+
issue_limit = args.issue_limit if args.issue_limit is not None else default_issue_limit
|
|
250
|
+
summary_chars = args.summary_chars if args.summary_chars is not None else default_summary_chars
|
|
251
|
+
|
|
252
|
+
validate_range(parser, "--commit-limit", commit_limit, 1, 500)
|
|
253
|
+
validate_range(parser, "--pr-limit", pr_limit, 1, 100)
|
|
254
|
+
validate_range(parser, "--issue-limit", issue_limit, 1, 100)
|
|
255
|
+
if summary_chars < 100:
|
|
256
|
+
parser.error("--summary-chars must be at least 100")
|
|
257
|
+
|
|
258
|
+
overrides: dict[str, int] = {}
|
|
259
|
+
if args.commit_limit is not None:
|
|
260
|
+
overrides["commit_limit"] = args.commit_limit
|
|
261
|
+
if args.pr_limit is not None:
|
|
262
|
+
overrides["pr_limit"] = args.pr_limit
|
|
263
|
+
if args.issue_limit is not None:
|
|
264
|
+
overrides["issue_limit"] = args.issue_limit
|
|
265
|
+
if args.summary_chars is not None:
|
|
266
|
+
overrides["summary_chars"] = args.summary_chars
|
|
267
|
+
|
|
268
|
+
args.commit_limit = commit_limit
|
|
269
|
+
args.pr_limit = pr_limit
|
|
270
|
+
args.issue_limit = issue_limit
|
|
271
|
+
args.summary_chars = summary_chars
|
|
272
|
+
args.effective_settings = {
|
|
273
|
+
"limits": {
|
|
274
|
+
"commits": commit_limit,
|
|
275
|
+
"prs": pr_limit,
|
|
276
|
+
"issues": issue_limit,
|
|
277
|
+
},
|
|
278
|
+
"summary_chars": summary_chars,
|
|
279
|
+
"source": source,
|
|
280
|
+
"overrides": overrides,
|
|
281
|
+
}
|
|
282
|
+
return args
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def parse_args(argv: list[str]) -> argparse.Namespace:
|
|
286
|
+
parser = argparse.ArgumentParser(description="Prepare repo memory and collect raw facets for agent-authored resources.")
|
|
287
|
+
parser.add_argument("--repo-path", default=".", help="Local git repository path")
|
|
288
|
+
parser.add_argument("--reuse", action="store_true", help="Reuse/update an existing .repo_memory directory")
|
|
289
|
+
parser.add_argument("--snapshot-ref", default="HEAD", help="Local git ref whose history should be collected")
|
|
290
|
+
parser.add_argument("--commit-limit", type=int, default=None, help="Maximum local commits retained from the snapshot history")
|
|
291
|
+
parser.add_argument("--pr-limit", type=int, default=None, help="Maximum snapshot-filtered PRs/MRs retained")
|
|
292
|
+
parser.add_argument("--issue-limit", type=int, default=None, help="Maximum provider issues retained")
|
|
293
|
+
parser.add_argument("--summary-chars", type=int, default=None)
|
|
294
|
+
parser.add_argument("--skip-provider", action="store_true", help="Skip GitHub/GitLab PR/MR/issue collection and build local-only memory")
|
|
295
|
+
parser.add_argument("--require-provider", action="store_true", help="Fail if provider PR/MR/issue evidence cannot be collected")
|
|
296
|
+
parser.add_argument("--pretty", action="store_true", help="Pretty-print JSON")
|
|
297
|
+
parser.add_argument(
|
|
298
|
+
"--progress",
|
|
299
|
+
action="store_true",
|
|
300
|
+
help="Render a stderr progress bar while keeping stdout as the final JSON report",
|
|
301
|
+
)
|
|
302
|
+
args = parser.parse_args(argv)
|
|
303
|
+
if args.skip_provider and args.require_provider:
|
|
304
|
+
parser.error("--skip-provider and --require-provider cannot be used together")
|
|
305
|
+
args.repo_path = Path(args.repo_path).expanduser().resolve()
|
|
306
|
+
return apply_effective_settings(args, parser)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def main(argv: list[str]) -> int:
|
|
310
|
+
args = parse_args(argv)
|
|
311
|
+
repo = args.repo_path
|
|
312
|
+
progress = ProgressBar(args.progress, 3)
|
|
313
|
+
command_cwd = repo if repo.exists() else SCRIPT_DIR
|
|
314
|
+
prepare_cmd = [sys.executable, str(SCRIPT_DIR / "prepare_repo_memory.py"), str(repo)]
|
|
315
|
+
if args.reuse:
|
|
316
|
+
prepare_cmd.append("--reuse")
|
|
317
|
+
progress.update(0, "prepare")
|
|
318
|
+
prepare = run_step(prepare_cmd, command_cwd)
|
|
319
|
+
if prepare.returncode != 0:
|
|
320
|
+
progress.fail(0, "prepare failed")
|
|
321
|
+
return write_failure("prepare", prepare, args.pretty, repo=repo)
|
|
322
|
+
if prepare.stderr:
|
|
323
|
+
print(prepare.stderr, file=sys.stderr)
|
|
324
|
+
progress.update(1, "prepare")
|
|
325
|
+
|
|
326
|
+
memory = repo / ".repo_memory"
|
|
327
|
+
raw_dir = memory / "raw"
|
|
328
|
+
prepare_report_path = raw_dir / "prepare-report.json"
|
|
329
|
+
prepare_data = load_json(prepare_report_path)
|
|
330
|
+
notices = provider_notices(prepare_data)
|
|
331
|
+
|
|
332
|
+
git_commits_path = raw_dir / "git-commits.json"
|
|
333
|
+
git_commits = run_step(
|
|
334
|
+
[
|
|
335
|
+
sys.executable,
|
|
336
|
+
str(SCRIPT_DIR / "git_commit_facets.py"),
|
|
337
|
+
"--repo-path",
|
|
338
|
+
str(repo),
|
|
339
|
+
"--snapshot-ref",
|
|
340
|
+
args.snapshot_ref,
|
|
341
|
+
"--limit",
|
|
342
|
+
str(args.commit_limit),
|
|
343
|
+
"--summary-chars",
|
|
344
|
+
str(args.summary_chars),
|
|
345
|
+
"--out",
|
|
346
|
+
str(git_commits_path),
|
|
347
|
+
],
|
|
348
|
+
repo,
|
|
349
|
+
)
|
|
350
|
+
outputs = {
|
|
351
|
+
"prepare_report": str(prepare_report_path),
|
|
352
|
+
"git_commits": str(git_commits_path),
|
|
353
|
+
}
|
|
354
|
+
if git_commits.returncode != 0:
|
|
355
|
+
progress.fail(1, "git commits failed")
|
|
356
|
+
return write_failure(
|
|
357
|
+
"git_commits",
|
|
358
|
+
git_commits,
|
|
359
|
+
args.pretty,
|
|
360
|
+
repo=repo,
|
|
361
|
+
memory=memory,
|
|
362
|
+
steps={"prepare": json_step(prepare)},
|
|
363
|
+
outputs=outputs,
|
|
364
|
+
)
|
|
365
|
+
progress.update(2, "git commits")
|
|
366
|
+
|
|
367
|
+
provider = provider_report(prepare_data)
|
|
368
|
+
provider_name = str(provider["name"])
|
|
369
|
+
provider_facets: dict[str, Any]
|
|
370
|
+
provider_output = raw_dir / provider_raw_name(provider_name)
|
|
371
|
+
provider_script_name = provider_script(provider_name)
|
|
372
|
+
if args.skip_provider:
|
|
373
|
+
provider_facets = {
|
|
374
|
+
"ok": True,
|
|
375
|
+
"skipped": True,
|
|
376
|
+
"reason": "provider_skipped_by_user",
|
|
377
|
+
"output": "",
|
|
378
|
+
}
|
|
379
|
+
elif provider["evidence_state"] == "ready" and provider_script_name and provider["repo"]:
|
|
380
|
+
provider_cmd = [
|
|
381
|
+
sys.executable,
|
|
382
|
+
str(SCRIPT_DIR / provider_script_name),
|
|
383
|
+
"--repo",
|
|
384
|
+
str(provider["repo"]),
|
|
385
|
+
"--repo-path",
|
|
386
|
+
str(repo),
|
|
387
|
+
"--snapshot-ref",
|
|
388
|
+
args.snapshot_ref,
|
|
389
|
+
"--include",
|
|
390
|
+
"prs,issues",
|
|
391
|
+
"--pr-limit",
|
|
392
|
+
str(args.pr_limit),
|
|
393
|
+
"--issue-limit",
|
|
394
|
+
str(args.issue_limit),
|
|
395
|
+
"--state",
|
|
396
|
+
"all",
|
|
397
|
+
"--summary-chars",
|
|
398
|
+
str(args.summary_chars),
|
|
399
|
+
"--out",
|
|
400
|
+
str(provider_output),
|
|
401
|
+
]
|
|
402
|
+
if provider.get("host"):
|
|
403
|
+
provider_cmd.extend(["--hostname", str(provider["host"])])
|
|
404
|
+
provider_result = run_step(provider_cmd, repo)
|
|
405
|
+
provider_facets = {
|
|
406
|
+
**json_step(provider_result),
|
|
407
|
+
"skipped": False,
|
|
408
|
+
"output": str(provider_output),
|
|
409
|
+
}
|
|
410
|
+
if provider_result.returncode != 0:
|
|
411
|
+
provider_facets["degraded_to_local_only"] = not args.require_provider
|
|
412
|
+
provider_facets["reason"] = "provider_facets_failed"
|
|
413
|
+
provider_facets["output"] = ""
|
|
414
|
+
if provider_output.exists():
|
|
415
|
+
provider_output.unlink()
|
|
416
|
+
if args.require_provider:
|
|
417
|
+
progress.fail(2, "provider facets failed")
|
|
418
|
+
return write_failure(
|
|
419
|
+
"provider_facets",
|
|
420
|
+
provider_result,
|
|
421
|
+
args.pretty,
|
|
422
|
+
repo=repo,
|
|
423
|
+
memory=memory,
|
|
424
|
+
provider=provider,
|
|
425
|
+
steps={
|
|
426
|
+
"prepare": json_step(prepare),
|
|
427
|
+
"git_commits": json_step(git_commits),
|
|
428
|
+
},
|
|
429
|
+
outputs=outputs,
|
|
430
|
+
notices=[provider_failure_notice(provider, provider_result, continuing=False)],
|
|
431
|
+
)
|
|
432
|
+
notices.append(provider_failure_notice(provider, provider_result, continuing=True))
|
|
433
|
+
else:
|
|
434
|
+
outputs["provider_facets"] = provider_facets["output"]
|
|
435
|
+
else:
|
|
436
|
+
if args.require_provider:
|
|
437
|
+
provider_result = subprocess.CompletedProcess(
|
|
438
|
+
args=[],
|
|
439
|
+
returncode=1,
|
|
440
|
+
stdout="",
|
|
441
|
+
stderr=f"provider evidence is required but provider_evidence_state={provider['evidence_state']}",
|
|
442
|
+
)
|
|
443
|
+
progress.fail(2, "provider facets unavailable")
|
|
444
|
+
return write_failure(
|
|
445
|
+
"provider_facets",
|
|
446
|
+
provider_result,
|
|
447
|
+
args.pretty,
|
|
448
|
+
repo=repo,
|
|
449
|
+
memory=memory,
|
|
450
|
+
provider=provider,
|
|
451
|
+
steps={
|
|
452
|
+
"prepare": json_step(prepare),
|
|
453
|
+
"git_commits": json_step(git_commits),
|
|
454
|
+
},
|
|
455
|
+
outputs=outputs,
|
|
456
|
+
notices=notices,
|
|
457
|
+
)
|
|
458
|
+
provider_facets = {
|
|
459
|
+
"ok": True,
|
|
460
|
+
"skipped": True,
|
|
461
|
+
"reason": f"provider_evidence_state={provider['evidence_state']}",
|
|
462
|
+
"output": "",
|
|
463
|
+
}
|
|
464
|
+
progress.update(3, "provider facets")
|
|
465
|
+
progress.finish()
|
|
466
|
+
|
|
467
|
+
counts = {
|
|
468
|
+
"raw": {
|
|
469
|
+
"git_commits": raw_source_counts(git_commits_path),
|
|
470
|
+
},
|
|
471
|
+
}
|
|
472
|
+
if provider_facets.get("output"):
|
|
473
|
+
counts["raw"]["provider_facets"] = raw_source_counts(Path(str(provider_facets["output"])))
|
|
474
|
+
|
|
475
|
+
report = {
|
|
476
|
+
"ok": True,
|
|
477
|
+
"repo_path": str(repo),
|
|
478
|
+
"memory_path": str(memory),
|
|
479
|
+
"provider": provider,
|
|
480
|
+
"notices": notices,
|
|
481
|
+
"effective_settings": args.effective_settings,
|
|
482
|
+
"steps": {
|
|
483
|
+
"prepare": json_step(prepare),
|
|
484
|
+
"git_commits": json_step(git_commits),
|
|
485
|
+
"provider_facets": provider_facets,
|
|
486
|
+
},
|
|
487
|
+
"outputs": outputs,
|
|
488
|
+
"counts": counts,
|
|
489
|
+
"next_step": "Inspect raw evidence, then author PROFILE.md and resources/*.md.",
|
|
490
|
+
}
|
|
491
|
+
write_report(report, args.pretty)
|
|
492
|
+
return 0
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
if __name__ == "__main__":
|
|
496
|
+
raise SystemExit(main(sys.argv[1:]))
|