@memnexus-ai/mx-agent-cli 0.1.166 → 0.1.167

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.
Files changed (96) hide show
  1. package/dist/__tests__/claude-sync.test.js +15 -0
  2. package/dist/__tests__/claude-sync.test.js.map +1 -1
  3. package/dist/__tests__/config-generation.test.d.ts +7 -0
  4. package/dist/__tests__/config-generation.test.d.ts.map +1 -0
  5. package/dist/__tests__/config-generation.test.js +141 -0
  6. package/dist/__tests__/config-generation.test.js.map +1 -0
  7. package/dist/__tests__/config-sync.test.d.ts +10 -0
  8. package/dist/__tests__/config-sync.test.d.ts.map +1 -0
  9. package/dist/__tests__/config-sync.test.js +180 -0
  10. package/dist/__tests__/config-sync.test.js.map +1 -0
  11. package/dist/__tests__/project-config.test.js +1 -0
  12. package/dist/__tests__/project-config.test.js.map +1 -1
  13. package/dist/agent-config/.mx-config-generation.json +4 -0
  14. package/dist/agent-config/CLAUDE.md.template +140 -0
  15. package/dist/agent-config/OWNERS.md +51 -0
  16. package/dist/agent-config/agents/bar-raiser.md +205 -0
  17. package/dist/agent-config/agents/dogfood-auditor.md +243 -0
  18. package/dist/agent-config/agents/git-expert.md +380 -0
  19. package/dist/agent-config/agents/implementation-engineer.md +387 -0
  20. package/dist/agent-config/agents/memory-creator.md +330 -0
  21. package/dist/agent-config/agents/prd-writer.md +478 -0
  22. package/dist/agent-config/agents/prfaq-writer.md +344 -0
  23. package/dist/agent-config/agents/prior-art-researcher.md +264 -0
  24. package/dist/agent-config/agents/qa-tester.md +406 -0
  25. package/dist/agent-config/agents/red-team.md +330 -0
  26. package/dist/agent-config/agents/security-reviewer.md +300 -0
  27. package/dist/agent-config/agents/status-reporter.md +297 -0
  28. package/dist/agent-config/claude-md/CLAUDE.core.md +105 -0
  29. package/dist/agent-config/claude-md/CLAUDE.overlay.memnexus.md +68 -0
  30. package/dist/agent-config/claude-md/compose.mjs +179 -0
  31. package/dist/agent-config/claude-md/vars.memnexus.json +4 -0
  32. package/dist/agent-config/hooks/auto-capture-precompact.sh +176 -0
  33. package/dist/agent-config/hooks/auto-capture-session-end.sh +178 -0
  34. package/dist/agent-config/hooks/auto-checkpoint.sh +102 -0
  35. package/dist/agent-config/hooks/ci-validate-hook.sh +499 -0
  36. package/dist/agent-config/hooks/ci-validate-routes.conf +16 -0
  37. package/dist/agent-config/hooks/delegation-audit.sh +61 -0
  38. package/dist/agent-config/hooks/deploy-verification-reminder.sh +179 -0
  39. package/dist/agent-config/hooks/git-mutation-guard.sh +219 -0
  40. package/dist/agent-config/hooks/iteration-log-check.sh +212 -0
  41. package/dist/agent-config/hooks/memory-checkpoint-reminder.sh +103 -0
  42. package/dist/agent-config/hooks/mx-guard-hook.sh +77 -0
  43. package/dist/agent-config/hooks/named-memory-write-guard.sh +237 -0
  44. package/dist/agent-config/hooks/reload-checkpoint.sh +68 -0
  45. package/dist/agent-config/hooks/set-terminal-appearance.sh +34 -0
  46. package/dist/agent-config/hooks/workflow-dispatch-guard.sh +184 -0
  47. package/dist/agent-config/hooks/worktree-guard.sh +258 -0
  48. package/dist/agent-config/rules/eval-harness.md +33 -0
  49. package/dist/agent-config/rules/frontend.md +17 -0
  50. package/dist/agent-config/rules/mcp-protocol.md +15 -0
  51. package/dist/agent-config/rules/retrieval.md +17 -0
  52. package/dist/agent-config/settings.json +196 -0
  53. package/dist/agent-config/shared/eval-tiered-rigor.md +15 -0
  54. package/dist/agent-config/shared/team-operating-rules.md +37 -0
  55. package/dist/agent-config/skills/eval-claim-impact/SKILL.md +20 -0
  56. package/dist/agent-config/skills/eval-harness-review/SKILL.md +21 -0
  57. package/dist/agent-config/skills/mx-checkpoint/SKILL.md +111 -0
  58. package/dist/agent-config/skills/mx-fix-pr/SKILL.md +90 -0
  59. package/dist/agent-config/skills/mx-gap-assessment/SKILL.md +90 -0
  60. package/dist/agent-config/skills/mx-iteration-close/SKILL.md +81 -0
  61. package/dist/agent-config/skills/mx-post-merge-sync/SKILL.md +83 -0
  62. package/dist/agent-config/skills/mx-pre-pr-check/SKILL.md +85 -0
  63. package/dist/agent-config/skills/mx-save/SKILL.md +102 -0
  64. package/dist/agent-config/skills/mx-session-start/SKILL.md +85 -0
  65. package/dist/agent-config/skills/team-gate-checklist/SKILL.md +19 -0
  66. package/dist/commands/config-sync.d.ts +39 -0
  67. package/dist/commands/config-sync.d.ts.map +1 -0
  68. package/dist/commands/config-sync.js +212 -0
  69. package/dist/commands/config-sync.js.map +1 -0
  70. package/dist/commands/create.d.ts.map +1 -1
  71. package/dist/commands/create.js +3 -0
  72. package/dist/commands/create.js.map +1 -1
  73. package/dist/commands/init.d.ts.map +1 -1
  74. package/dist/commands/init.js +12 -4
  75. package/dist/commands/init.js.map +1 -1
  76. package/dist/commands/start.d.ts.map +1 -1
  77. package/dist/commands/start.js +6 -0
  78. package/dist/commands/start.js.map +1 -1
  79. package/dist/index.js +23 -0
  80. package/dist/index.js.map +1 -1
  81. package/dist/lib/bundled-config.d.ts +44 -0
  82. package/dist/lib/bundled-config.d.ts.map +1 -0
  83. package/dist/lib/bundled-config.js +164 -0
  84. package/dist/lib/bundled-config.js.map +1 -0
  85. package/dist/lib/claude.d.ts.map +1 -1
  86. package/dist/lib/claude.js +9 -3
  87. package/dist/lib/claude.js.map +1 -1
  88. package/dist/lib/config-generation.d.ts +36 -0
  89. package/dist/lib/config-generation.d.ts.map +1 -0
  90. package/dist/lib/config-generation.js +73 -0
  91. package/dist/lib/config-generation.js.map +1 -0
  92. package/dist/lib/project-config.d.ts +7 -0
  93. package/dist/lib/project-config.d.ts.map +1 -1
  94. package/dist/lib/project-config.js +4 -0
  95. package/dist/lib/project-config.js.map +1 -1
  96. package/package.json +2 -2
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: mx-post-merge-sync
3
+ description: Sync worktree branch after a PR is squash-merged to main. Use immediately after every PR merge — do not start new work before running this.
4
+ ---
5
+
6
+ After a squash merge, ALL branch commits are on main as a single squash commit. The branch's original commits are redundant. Use `reset --hard` (not rebase) to sync — it's idempotent and safe to repeat.
7
+
8
+ ## Step 1: Sync Branch
9
+
10
+ > **WARNING: the stash stack is shared across ALL worktrees** (`refs/stash` is
11
+ > repository-global). Never operate positionally (`git stash pop` /
12
+ > `git stash pop stash@{0}` / `git stash drop stash@{n}`) — the index you
13
+ > resolve can point at another worktree's entry after a concurrent stash op
14
+ > (a time-of-check/time-of-use race). Address your own entry by its commit SHA.
15
+
16
+ ```bash
17
+ # GIT_EXPERT=1 prefixes below are DELIBERATE: git-mutation-guard blocks
18
+ # `git stash push/apply/drop` and `git reset --hard` to prevent accidental
19
+ # work loss in this shared worktree. This is the one sanctioned, SHA-addressed
20
+ # flow that genuinely needs them, so each mutating call overrides the guard
21
+ # explicitly. Read-only calls (stash list, rev-parse, status, fetch) are not
22
+ # prefixed — the guard already lets them through.
23
+ #
24
+ # Only stash if the worktree is actually dirty. In the normal (clean) case,
25
+ # skip stashing entirely: a positional pop would restore a FOREIGN stash from
26
+ # another worktree, silently injecting its changes here.
27
+ WT="$(basename "$(git rev-parse --show-toplevel)")"
28
+ STASH_TOKEN="post-merge-sync-${WT}-$$-${RANDOM}${RANDOM}" # nonce guards against PID/name collisions
29
+
30
+ STASH_SHA=""
31
+ if [ -n "$(git status --porcelain)" ]; then
32
+ GIT_EXPERT=1 git stash push -m "$STASH_TOKEN"
33
+ # Capture the stash's immutable commit SHA now — restore by SHA, not by index.
34
+ STASH_SHA="$(git rev-parse 'stash@{0}')"
35
+ fi
36
+
37
+ # Reset to main (idempotent — safe to repeat). GIT_EXPERT=1: sanctioned
38
+ # post-merge-sync reset, deliberate override of git-mutation-guard.
39
+ git fetch origin main
40
+ GIT_EXPERT=1 git reset --hard origin/main
41
+
42
+ # Restore ONLY our own stash, addressed by SHA — never a positional pop.
43
+ if [ -n "$STASH_SHA" ]; then
44
+ if GIT_EXPERT=1 git stash apply "$STASH_SHA"; then
45
+ # Drop our entry by re-locating the SHA immediately before dropping, so the
46
+ # index we drop is the one holding our SHA right now — never stash@{n}.
47
+ REF="$(git stash list --format='%gd %H' | awk -v sha="$STASH_SHA" '$2==sha{print $1; exit}')"
48
+ if [ -n "$REF" ]; then
49
+ GIT_EXPERT=1 git stash drop "$REF"
50
+ else
51
+ echo "WARN: applied stash $STASH_SHA but its ref vanished before drop — skipping drop."
52
+ fi
53
+ else
54
+ echo "WARN: could not restore own stash $STASH_SHA — another process may have dropped it."
55
+ echo " Recover manually: git stash list --format='%gd %H'"
56
+ fi
57
+ fi
58
+
59
+ # Verify: must return 0
60
+ git rev-list --count HEAD..origin/main
61
+ ```
62
+
63
+ If verification returns non-zero, run `git fetch origin main && GIT_EXPERT=1 git reset --hard origin/main` again (GIT_EXPERT=1: sanctioned override of git-mutation-guard, as above).
64
+
65
+ ## Step 2: Verify Deployment
66
+
67
+ ```bash
68
+ gh pr view <PR-number> --json mergeCommit --jq '.mergeCommit.oid'
69
+ gh run list --commit <sha> --json status,conclusion,name --jq '.[]'
70
+ ```
71
+
72
+ - If pipeline is running, wait for it
73
+ - If pipeline failed, read logs with `gh run view <run-id> --log-failed` and fix
74
+ - For CLI changes: `npm view @memnexus-ai/mx-agent-cli version` to confirm publish
75
+ - For service changes: confirm deploy workflow conclusion is `success`
76
+
77
+ **Do not start new work until deploy is verified.**
78
+
79
+ ## Step 3: Save Checkpoint
80
+
81
+ ```bash
82
+ mx memories create --conversation-id "<conv_id>" --content "PR #NNN merged + deployed. [result]. Next: [next step]." --topics "<component>,completed"
83
+ ```
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: mx-pre-pr-check
3
+ description: Verify the branch is clean and ready before creating a PR. Use before every gh pr create.
4
+ ---
5
+
6
+ A PR created from a dirty branch wastes CI resources and blocks the queue. 2 minutes of pre-PR checks saves 20 minutes of debugging later.
7
+
8
+ Run this checklist before every `gh pr create`.
9
+
10
+ ## Step 1: Rebase on Main
11
+
12
+ Delegate to Git Expert (`.claude/agents/git-expert.md`) to ensure the branch is rebased on latest main:
13
+
14
+ ```bash
15
+ git fetch origin main && git rebase origin/main
16
+ ```
17
+
18
+ If there are conflicts, the Git Expert resolves them. Wait for completion.
19
+
20
+ ## Step 2: Check for Uncommitted Changes
21
+
22
+ ```bash
23
+ git status
24
+ ```
25
+
26
+ - **Changes that should be committed:** Stage and commit them now.
27
+ - **Unrelated changes:** Stash them — `git stash --include-untracked`.
28
+ - **Clean working tree:** Proceed.
29
+
30
+ ## Step 3: Verify Commits Ahead of Main
31
+
32
+ ```bash
33
+ git log --oneline origin/main..HEAD
34
+ ```
35
+
36
+ If this is empty, there are no commits to PR. Something went wrong — check if you're on the right branch or if the commits were already merged.
37
+
38
+ ## Step 4: Run Local Validation
39
+
40
+ Run the team-specific validation checks. Common ones:
41
+
42
+ ```bash
43
+ # TypeScript projects
44
+ npm run typecheck
45
+ npm run lint
46
+
47
+ # If tests exist for changed files
48
+ npm test -- --relevant
49
+
50
+ # OpenAPI projects
51
+ npm run validate:openapi:local
52
+ ```
53
+
54
+ All checks must pass locally before creating the PR. Fix any failures.
55
+
56
+ ## Step 5: Review Commit History
57
+
58
+ ```bash
59
+ git log --oneline origin/main..HEAD
60
+ ```
61
+
62
+ Check for:
63
+ - **WIP commits** — squash or amend them into meaningful commits
64
+ - **Merge commits** — should not exist on a rebased branch; if present, re-rebase
65
+ - **Clear commit messages** — each commit should describe what and why
66
+
67
+ ## Step 6: Confirm Readiness
68
+
69
+ All of the following must be true:
70
+
71
+ - [ ] Branch is rebased on latest `origin/main`
72
+ - [ ] No uncommitted changes (clean `git status`)
73
+ - [ ] At least one commit ahead of main
74
+ - [ ] Local validation passes (typecheck, lint, tests)
75
+ - [ ] Commit history is clean (no WIP, no merge commits)
76
+
77
+ If all checks pass, proceed to create the PR.
78
+
79
+ ## Step 7: Create the PR
80
+
81
+ ```bash
82
+ gh pr create --title "<title>" --body "<description>"
83
+ ```
84
+
85
+ After creation, monitor the first CI run: `gh pr checks <number>`. If it fails, use `/fix-pr` to diagnose.
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: mx-save
3
+ description: "Quick memory snapshot — auto-detects current work context and saves a concise memory with conversation tracking. Use after completing tasks, fixing bugs, or making decisions."
4
+ disable-model-invocation: true
5
+ version: "1.7.158"
6
+ ---
7
+
8
+ # Quick Save Memory
9
+
10
+ You are helping quickly save a progress memory. Be fast and direct — this is NOT the interactive `/mx-checkpoint` command.
11
+
12
+ ## Steps
13
+
14
+ 1. Gather minimal context from the user (what they just did)
15
+ 2. Generate the memory content
16
+ 3. Save the memory immediately
17
+
18
+ ## What to Ask
19
+
20
+ Ask ONE question: **"What did you just complete or accomplish?"**
21
+
22
+ If the user already described the work in their message, skip asking and go straight to generating the memory.
23
+
24
+ ## Auto-Detect Context
25
+
26
+ From the conversation context, automatically determine:
27
+ - **Component(s) touched** — which project area
28
+ - **Type of work** — implementation, bug fix, refactor, configuration, etc.
29
+ - **Files modified** — from recent tool calls
30
+ - **Issue numbers** — from conversation context
31
+ - **Commit hashes** — from recent git operations
32
+
33
+ ## Memory Content Format
34
+
35
+ Keep it concise but complete:
36
+
37
+ ```
38
+ [Brief summary of what was done]
39
+
40
+ Details:
41
+ - [Specific change 1]
42
+ - [Specific change 2]
43
+ - [Specific change 3]
44
+
45
+ Files: [list key files modified]
46
+ Issue: #[number if applicable]
47
+ Commit: [hash if available]
48
+
49
+ Key decision: [if a notable decision was made]
50
+ Next: [obvious next step if any]
51
+ ```
52
+
53
+ ## Topic Selection
54
+
55
+ Auto-select 4-6 topics. Only add manual topics for:
56
+ - **Status**: `completed`, `in-progress`, `blocked`
57
+ - **Component**: project-specific component names
58
+
59
+ Other topics (technologies, activities) are auto-extracted from well-written content.
60
+
61
+ ## Conversation Tracking
62
+
63
+ 1. **Check if you already have a conversation ID** from earlier in this session
64
+ 2. **If yes** → reuse it
65
+ 3. **If no (first memory)** → use conversationId: "NEW"
66
+ 4. **Parse the response** → capture the conv_xxx ID for follow-up memories
67
+ 5. **New topic?** → use "NEW" again
68
+
69
+ ## How to Save
70
+
71
+ **Prefer MCP tools** (available when MemNexus MCP server is connected):
72
+
73
+ ```
74
+ create_memory({
75
+ content: "YOUR GENERATED CONTENT",
76
+ conversationId: "<ID or NEW>",
77
+ topics: ["topic1", "topic2"]
78
+ })
79
+ ```
80
+
81
+ **Fallback to CLI** (if MCP tools are not available):
82
+
83
+ ```bash
84
+ mx memories create \
85
+ --conversation-id "<ID or NEW>" \
86
+ --content "YOUR GENERATED CONTENT" \
87
+ --topics "topic1,topic2"
88
+ ```
89
+
90
+ ## After Saving
91
+
92
+ Report back:
93
+ - Memory ID created
94
+ - Brief confirmation of what was saved
95
+ - The conversation ID (so it can be reused)
96
+
97
+ ## Important Rules
98
+
99
+ 1. **Be fast** — don't ask unnecessary questions
100
+ 2. **Auto-detect** — use conversation context to fill in details
101
+ 3. **Save immediately** — execute the save, don't just show the command
102
+ 4. **Track conversations** — reuse conversation IDs within a session
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: mx-session-start
3
+ description: Initialize a new session with the full startup checklist. Use at the beginning of every session — first start, restart, or after context compaction.
4
+ ---
5
+
6
+ Run this checklist at the start of every session. Do not skip steps. Do not reorder.
7
+
8
+ ## Step 1: Rebase Worktree onto Main
9
+
10
+ Delegate to Git Expert (`.claude/agents/git-expert.md`) to rebase the worktree branch onto `origin/main` and force-push.
11
+
12
+ **Wait for the Git Expert to complete before proceeding.**
13
+
14
+ > The Git Expert delegation in step 1 is mandatory. Do NOT run git rebase/push commands directly.
15
+
16
+ ## Step 2: Build Context
17
+
18
+ Run `build_context` with your team's focus area and key files from your roleguide. Read the full briefing before continuing.
19
+
20
+ ```
21
+ build_context({ context: "<team focus area>", files: ["<key file paths from roleguide>"] })
22
+ ```
23
+
24
+ ## Step 3: Load Named Memories
25
+
26
+ Load the three core state memories. Named-memory keys are `<product-slug>-<team>-<type>`:
27
+ replace `<team>` with your actual team slug (e.g., `extraction`) and `<product-slug>` with the
28
+ `projectSlug` from `mx-agent.config.json` — **in this repository it is `memnexus`** (so
29
+ `<product-slug>-<team>-leader-state` resolves to e.g. `memnexus-extraction-leader-state`).
30
+
31
+ ```
32
+ get_memory({ name: "<product-slug>-<team>-leader-state" })
33
+ get_memory({ name: "<product-slug>-<team>-iteration-log" })
34
+ get_memory({ name: "<product-slug>-<team>-known-issues" })
35
+ ```
36
+
37
+ ## Step 4: Load Team Metrics
38
+
39
+ Load team-specific metrics memory if it exists:
40
+
41
+ ```
42
+ get_memory({ name: "<product-slug>-<team>-metrics" })
43
+ ```
44
+
45
+ If it returns 404, skip — not all teams track metrics in a named memory.
46
+
47
+ ## Step 5: Search Recent Work
48
+
49
+ ```
50
+ search_memories({ query: "<team focus area>", recent: "7d" })
51
+ ```
52
+
53
+ Review recent activity for anything that affects the current session.
54
+
55
+ ## Step 6: Check GitHub Issues
56
+
57
+ ```bash
58
+ gh issue list --search "<team keywords>" --state open --limit 20
59
+ ```
60
+
61
+ Note any P1/P2 issues that may override planned work.
62
+
63
+ ## Step 7: Check Cross-Team Escalations
64
+
65
+ ```
66
+ get_memory({ name: "memnexus-cross-team-escalations" })
67
+ ```
68
+
69
+ If there are escalations routed to your team, they take priority over planned iteration work.
70
+
71
+ ## Step 8: Resume or Start
72
+
73
+ - **If resuming:** Continue from the position recorded in `leader-state`. Pick up where you left off.
74
+ - **If first session:** Start at Step 1 of your team's improvement loop as defined in the roleguide.
75
+
76
+ ## Step 9: Update Leader State
77
+
78
+ Update `leader-state` immediately with the current session context:
79
+
80
+ ```
81
+ # <product-slug> = memnexus in this repo, e.g. memnexus-<team>-leader-state
82
+ manage_memory({ name: "<product-slug>-<team>-leader-state", action: "update", content: "Session started <date>. Resuming iteration N, step M. Context: ..." })
83
+ ```
84
+
85
+ This ensures the next session (or restart) can pick up cleanly.
@@ -0,0 +1,19 @@
1
+ # Team Gate Checklist
2
+
3
+ Use this skill before closing an iteration, opening a PR, merging a PR, or handing off a substantial task.
4
+
5
+ ## Checklist
6
+
7
+ 1. Confirm the assigned role guide was followed.
8
+ 2. Confirm relevant specialists were activated or explain why they were not needed.
9
+ 3. Confirm implementation and review happened in the assigned worktree, with no nested implementation worktree workflow.
10
+ 4. Confirm tests, fixtures, replays, screenshots, or manual checks appropriate to the risk were completed.
11
+ 5. Confirm hook output and command failures were interpreted from exit status and logs, not from noisy reminder text alone.
12
+ 6. Confirm state memories, issue comments, or claim ledgers were updated when the work changed project knowledge.
13
+ 7. List any unresolved risks before declaring the iteration complete.
14
+
15
+ ## Required Output
16
+
17
+ - Gate status: pass, blocked, or pass with caveats.
18
+ - Evidence checked.
19
+ - Unresolved risks.
@@ -0,0 +1,39 @@
1
+ /**
2
+ * mx-agent config-sync
3
+ *
4
+ * Update a project's committed agent-config from the config bundle the CLI ships
5
+ * with (Platform v2.35 Phase 3, #4017). Distribution channel for the portable
6
+ * agent-config: an external project that installed a newer CLI runs this to pull
7
+ * hook/agent/skill/template updates into its own configSource dir.
8
+ *
9
+ * Safety model (never silently overwrite local work):
10
+ * - Default is a DRY RUN — prints the plan, writes nothing. `--apply` writes.
11
+ * - File-level three-way: a per-file baseline (the bundle hash we last wrote,
12
+ * recorded in <configSource>/.mx-config-sync-state.json) is the common
13
+ * ancestor. A project file unchanged since the last sync updates cleanly; a
14
+ * locally-modified file is listed and SKIPPED unless --force.
15
+ * - Refuses to run on a dirty git tree unless --allow-dirty.
16
+ * - Writes go to the repo's configSource dir (respects mx-agent.config.json).
17
+ *
18
+ * For the MemNexus repo the bundle resolves to our own agent-config tree, so
19
+ * once this work is on main every file matches and the command reports
20
+ * everything in sync. (On a pre-merge branch, findProjectRoot resolves to the
21
+ * lagging /workspace main worktree, so a dry-run can legitimately show
22
+ * adds/edits until this merges.)
23
+ */
24
+ export interface ConfigSyncOptions {
25
+ apply?: boolean;
26
+ force?: boolean;
27
+ allowDirty?: boolean;
28
+ }
29
+ type Action = 'add' | 'update' | 'unchanged' | 'skip-local';
30
+ /**
31
+ * Classify one bundle file against the project copy using the recorded baseline.
32
+ * ours = hash of the project's current file (null if absent)
33
+ * base = hash config-sync last wrote for this file (null if never/unknown)
34
+ * theirs = hash of the bundle file
35
+ */
36
+ export declare function classifyFile(ours: string | null, base: string | null, theirs: string): Action;
37
+ export declare function runConfigSync(options?: ConfigSyncOptions): void;
38
+ export {};
39
+ //# sourceMappingURL=config-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-sync.d.ts","sourceRoot":"","sources":["../../src/commands/config-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAmBH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,KAAK,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;AA0B5D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK7F;AAkBD,wBAAgB,aAAa,CAAC,OAAO,GAAE,iBAAsB,GAAG,IAAI,CA8InE"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * mx-agent config-sync
3
+ *
4
+ * Update a project's committed agent-config from the config bundle the CLI ships
5
+ * with (Platform v2.35 Phase 3, #4017). Distribution channel for the portable
6
+ * agent-config: an external project that installed a newer CLI runs this to pull
7
+ * hook/agent/skill/template updates into its own configSource dir.
8
+ *
9
+ * Safety model (never silently overwrite local work):
10
+ * - Default is a DRY RUN — prints the plan, writes nothing. `--apply` writes.
11
+ * - File-level three-way: a per-file baseline (the bundle hash we last wrote,
12
+ * recorded in <configSource>/.mx-config-sync-state.json) is the common
13
+ * ancestor. A project file unchanged since the last sync updates cleanly; a
14
+ * locally-modified file is listed and SKIPPED unless --force.
15
+ * - Refuses to run on a dirty git tree unless --allow-dirty.
16
+ * - Writes go to the repo's configSource dir (respects mx-agent.config.json).
17
+ *
18
+ * For the MemNexus repo the bundle resolves to our own agent-config tree, so
19
+ * once this work is on main every file matches and the command reports
20
+ * everything in sync. (On a pre-merge branch, findProjectRoot resolves to the
21
+ * lagging /workspace main worktree, so a dry-run can legitimately show
22
+ * adds/edits until this merges.)
23
+ */
24
+ import { spawnSync } from 'child_process';
25
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
26
+ import { dirname, join } from 'path';
27
+ import chalk from 'chalk';
28
+ import { findProjectRoot } from '../lib/worktree.js';
29
+ import { loadProjectConfig, resolveProjectConfig } from '../lib/project-config.js';
30
+ import { getConfigValue, setConfigValue } from '../lib/config.js';
31
+ import { GENERATION_FILE, SYNC_STATE_FILE, getBundledConfigDir, hashConfigTree, hashFile, listConfigFiles, readGeneration, } from '../lib/bundled-config.js';
32
+ function loadSyncState(projectConfigDir) {
33
+ const p = join(projectConfigDir, SYNC_STATE_FILE);
34
+ if (!existsSync(p))
35
+ return { generation: null, files: {} };
36
+ try {
37
+ const parsed = JSON.parse(readFileSync(p, 'utf-8'));
38
+ return {
39
+ generation: typeof parsed.generation === 'number' ? parsed.generation : null,
40
+ files: parsed.files && typeof parsed.files === 'object' ? parsed.files : {},
41
+ };
42
+ }
43
+ catch {
44
+ return { generation: null, files: {} };
45
+ }
46
+ }
47
+ /**
48
+ * Classify one bundle file against the project copy using the recorded baseline.
49
+ * ours = hash of the project's current file (null if absent)
50
+ * base = hash config-sync last wrote for this file (null if never/unknown)
51
+ * theirs = hash of the bundle file
52
+ */
53
+ export function classifyFile(ours, base, theirs) {
54
+ if (ours === null)
55
+ return 'add';
56
+ if (ours === theirs)
57
+ return 'unchanged';
58
+ if (base !== null && ours === base)
59
+ return 'update'; // unchanged since last sync → clean update
60
+ return 'skip-local'; // differs from bundle and from baseline (or no baseline) → local edit
61
+ }
62
+ /** Is the whole working tree clean? Returns true when `git status` shows nothing. */
63
+ function isGitTreeClean(projectRoot) {
64
+ const r = spawnSync('git', ['status', '--porcelain'], {
65
+ cwd: projectRoot, encoding: 'utf-8', stdio: 'pipe',
66
+ });
67
+ if (r.status !== 0)
68
+ return true; // not a git repo / git error → don't block
69
+ return r.stdout.trim() === '';
70
+ }
71
+ const ACTION_LABEL = {
72
+ 'add': chalk.green('+ add '),
73
+ 'update': chalk.cyan('↑ update '),
74
+ 'unchanged': chalk.dim('= unchanged '),
75
+ 'skip-local': chalk.yellow('~ skip local'),
76
+ };
77
+ export function runConfigSync(options = {}) {
78
+ const apply = options.apply === true;
79
+ const force = options.force === true;
80
+ const allowDirty = options.allowDirty === true;
81
+ let projectRoot;
82
+ try {
83
+ projectRoot = findProjectRoot();
84
+ }
85
+ catch (err) {
86
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
87
+ process.exit(1);
88
+ }
89
+ const cfg = resolveProjectConfig(loadProjectConfig(projectRoot));
90
+ const projectConfigDir = join(projectRoot, cfg.configSource);
91
+ const bundleDir = getBundledConfigDir();
92
+ if (!bundleDir) {
93
+ console.error(chalk.red('config-sync: no bundled agent-config found in this CLI build.'));
94
+ process.exit(1);
95
+ }
96
+ if (!existsSync(projectConfigDir)) {
97
+ console.error(chalk.red(`config-sync: project config dir not found: ${projectConfigDir}`));
98
+ console.error(chalk.dim(' Run `mx-agent init` first, or check mx-agent.config.json configSource.'));
99
+ process.exit(1);
100
+ }
101
+ // Refuse on a dirty tree unless overridden — mixing sync writes with
102
+ // uncommitted work makes the change set unreviewable.
103
+ if (apply && !allowDirty && !isGitTreeClean(projectRoot)) {
104
+ console.error(chalk.red('config-sync: refusing to write — the working tree has uncommitted changes.'));
105
+ console.error(chalk.dim(' Commit or stash first, or pass --allow-dirty to proceed anyway.'));
106
+ process.exit(1);
107
+ }
108
+ const bundleGen = readGeneration(bundleDir);
109
+ const projectGen = readGeneration(projectConfigDir);
110
+ const state = loadSyncState(projectConfigDir);
111
+ const bundleHashes = hashConfigTree(bundleDir);
112
+ const bundleFiles = listConfigFiles(bundleDir);
113
+ const plans = [];
114
+ for (const rel of bundleFiles) {
115
+ const theirs = bundleHashes[rel];
116
+ const ours = existsSync(join(projectConfigDir, rel)) ? hashFile(join(projectConfigDir, rel)) : null;
117
+ const base = state.files[rel] ?? null;
118
+ plans.push({ rel, action: classifyFile(ours, base, theirs) });
119
+ }
120
+ const counts = { add: 0, update: 0, unchanged: 0, 'skip-local': 0 };
121
+ for (const p of plans)
122
+ counts[p.action]++;
123
+ // ── Report ──────────────────────────────────────────────────────────────
124
+ console.log();
125
+ console.log(chalk.cyan.bold(apply ? 'Config sync' : 'Config sync (dry run)'));
126
+ console.log(chalk.dim('─'.repeat(50)));
127
+ console.log(` ${chalk.bold('Project config:')} ${projectConfigDir}`);
128
+ console.log(` ${chalk.bold('Bundle:')} ${bundleDir}`);
129
+ console.log(` ${chalk.bold('Generation:')} project ${projectGen ?? '—'} → bundle ${bundleGen ?? '—'}`);
130
+ console.log();
131
+ // List everything except the (usually large) unchanged set.
132
+ const toShow = plans.filter(p => p.action !== 'unchanged');
133
+ if (toShow.length === 0) {
134
+ console.log(chalk.green(' ✓ Everything is in sync — no changes.'));
135
+ }
136
+ else {
137
+ for (const p of toShow) {
138
+ const forcedNote = p.action === 'skip-local' && !force ? chalk.dim(' (use --force to overwrite)') : '';
139
+ const willWrite = p.action !== 'skip-local' || force;
140
+ const doneMark = apply && willWrite ? chalk.green(' ✓') : '';
141
+ console.log(` ${ACTION_LABEL[p.action]} ${p.rel}${forcedNote}${doneMark}`);
142
+ }
143
+ }
144
+ console.log();
145
+ console.log(chalk.dim(` Summary: ${counts.add} add, ${counts.update} update, ${counts.unchanged} unchanged, ` +
146
+ `${counts['skip-local']} local-edit${counts['skip-local'] === 1 ? '' : 's'} ${force ? 'forced' : 'skipped'}`));
147
+ // ── Apply ───────────────────────────────────────────────────────────────
148
+ if (!apply) {
149
+ if (counts.add + counts.update + counts['skip-local'] > 0) {
150
+ console.log(chalk.dim(' Dry run — no files written. Re-run with --apply to write changes.'));
151
+ if (counts['skip-local'] > 0 && !force) {
152
+ console.log(chalk.dim(' Locally-modified files are skipped; add --force to overwrite them.'));
153
+ }
154
+ }
155
+ console.log();
156
+ return;
157
+ }
158
+ let written = 0;
159
+ const newState = { generation: bundleGen, files: { ...state.files } };
160
+ for (const p of plans) {
161
+ const theirs = bundleHashes[p.rel];
162
+ const write = p.action === 'add' || p.action === 'update' || (p.action === 'skip-local' && force);
163
+ if (write) {
164
+ const src = join(bundleDir, p.rel);
165
+ const dest = join(projectConfigDir, p.rel);
166
+ try {
167
+ mkdirSync(dirname(dest), { recursive: true });
168
+ writeFileSync(dest, readFileSync(src));
169
+ if (p.rel.endsWith('.sh')) {
170
+ try {
171
+ chmodSync(dest, 0o755);
172
+ }
173
+ catch { /* non-fatal */ }
174
+ }
175
+ newState.files[p.rel] = theirs;
176
+ written++;
177
+ }
178
+ catch (err) {
179
+ console.log(chalk.yellow(` ⚠ could not write ${p.rel}: ${err instanceof Error ? err.message : String(err)}`));
180
+ }
181
+ }
182
+ else if (p.action === 'unchanged') {
183
+ newState.files[p.rel] = theirs; // keep baseline current
184
+ }
185
+ // skip-local without force: leave baseline as-is so it stays flagged.
186
+ }
187
+ // Advance the project's generation stamp and write the sync-state baseline.
188
+ try {
189
+ const genSrc = join(bundleDir, GENERATION_FILE);
190
+ if (existsSync(genSrc)) {
191
+ writeFileSync(join(projectConfigDir, GENERATION_FILE), readFileSync(genSrc));
192
+ }
193
+ writeFileSync(join(projectConfigDir, SYNC_STATE_FILE), JSON.stringify(newState, null, 2) + '\n');
194
+ }
195
+ catch (err) {
196
+ console.log(chalk.yellow(` ⚠ could not write generation/sync-state: ${err instanceof Error ? err.message : String(err)}`));
197
+ }
198
+ // Seed a project-appropriate observability endpoint into operator config when
199
+ // the project declares one and the operator has not set it yet (#4017 Phase 3,
200
+ // Phase-1 deferral 4a). Never overwrites an existing value.
201
+ if (cfg.observabilityApiUrl && !getConfigValue('observability-api-url')) {
202
+ setConfigValue('observability-api-url', cfg.observabilityApiUrl);
203
+ console.log(chalk.green(` ✓ Set observability-api-url = ${cfg.observabilityApiUrl} (from mx-agent.config.json)`));
204
+ }
205
+ console.log();
206
+ console.log(chalk.green(` ✓ Wrote ${written} file${written === 1 ? '' : 's'}; project now at generation ${bundleGen ?? '—'}.`));
207
+ if (counts['skip-local'] > 0 && !force) {
208
+ console.log(chalk.yellow(` ${counts['skip-local']} locally-modified file(s) left untouched — re-run with --force to overwrite.`));
209
+ }
210
+ console.log();
211
+ }
212
+ //# sourceMappingURL=config-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-sync.js","sourceRoot":"","sources":["../../src/commands/config-sync.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiCH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA8LrE"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkCH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiMrE"}