plexus-agent-config 0.0.2 → 0.0.3

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 (160) hide show
  1. package/dist/bin.js +2 -1
  2. package/dist/bin.js.map +1 -1
  3. package/package.json +2 -10
  4. package/vendor/plexus-agent-config-core/package.json +1 -1
  5. package/vendor/plexus-agent-config-web/.next/BUILD_ID +1 -1
  6. package/vendor/plexus-agent-config-web/.next/app-path-routes-manifest.json +10 -10
  7. package/vendor/plexus-agent-config-web/.next/build-manifest.json +2 -2
  8. package/vendor/plexus-agent-config-web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/vendor/plexus-agent-config-web/.next/server/app/_global-error.html +1 -1
  10. package/vendor/plexus-agent-config-web/.next/server/app/_global-error.rsc +1 -1
  11. package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  13. package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  14. package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  15. package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  16. package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/vendor/plexus-agent-config-web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/vendor/plexus-agent-config-web/.next/server/app/about/page_client-reference-manifest.js +1 -1
  19. package/vendor/plexus-agent-config-web/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
  20. package/vendor/plexus-agent-config-web/.next/server/app/api/debug/route.js +1 -1
  21. package/vendor/plexus-agent-config-web/.next/server/app/backups/page_client-reference-manifest.js +1 -1
  22. package/vendor/plexus-agent-config-web/.next/server/app/debug/page.js +1 -1
  23. package/vendor/plexus-agent-config-web/.next/server/app/debug/page_client-reference-manifest.js +1 -1
  24. package/vendor/plexus-agent-config-web/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  25. package/vendor/plexus-agent-config-web/.next/server/app/mirror/page_client-reference-manifest.js +1 -1
  26. package/vendor/plexus-agent-config-web/.next/server/app/page_client-reference-manifest.js +1 -1
  27. package/vendor/plexus-agent-config-web/.next/server/app/rules/page_client-reference-manifest.js +1 -1
  28. package/vendor/plexus-agent-config-web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  29. package/vendor/plexus-agent-config-web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  30. package/vendor/plexus-agent-config-web/.next/server/app/spread/page_client-reference-manifest.js +1 -1
  31. package/vendor/plexus-agent-config-web/.next/server/app/team/page_client-reference-manifest.js +1 -1
  32. package/vendor/plexus-agent-config-web/.next/server/app-paths-manifest.json +10 -10
  33. package/vendor/plexus-agent-config-web/.next/server/chunks/620.js +1 -1
  34. package/vendor/plexus-agent-config-web/.next/server/middleware-build-manifest.js +1 -1
  35. package/vendor/plexus-agent-config-web/.next/server/pages/500.html +1 -1
  36. package/vendor/plexus-agent-config-web/.next/static/chunks/app/{layout-2d0506b46622a8c9.js → layout-c148ba3a96b46ad6.js} +1 -1
  37. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/base.d.ts +38 -0
  38. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/base.d.ts.map +1 -0
  39. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/base.js +125 -0
  40. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/base.js.map +1 -0
  41. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/codex.d.ts +9 -0
  42. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/codex.d.ts.map +1 -0
  43. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/codex.js +96 -0
  44. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/codex.js.map +1 -0
  45. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/index.d.ts +8 -0
  46. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/index.d.ts.map +1 -0
  47. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/index.js +12 -0
  48. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/index.js.map +1 -0
  49. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/json-mcp.d.ts +25 -0
  50. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/json-mcp.d.ts.map +1 -0
  51. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/json-mcp.js +182 -0
  52. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/json-mcp.js.map +1 -0
  53. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/catalog.d.ts +15 -0
  54. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/catalog.d.ts.map +1 -0
  55. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/catalog.js +153 -0
  56. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/catalog.js.map +1 -0
  57. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/detect.d.ts +14 -0
  58. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/detect.d.ts.map +1 -0
  59. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/detect.js +92 -0
  60. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/detect.js.map +1 -0
  61. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/index.d.ts +5 -0
  62. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/index.d.ts.map +1 -0
  63. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/index.js +5 -0
  64. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/index.js.map +1 -0
  65. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/inspect.d.ts +74 -0
  66. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/inspect.d.ts.map +1 -0
  67. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/inspect.js +169 -0
  68. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/inspect.js.map +1 -0
  69. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/backup/index.d.ts +70 -0
  70. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/backup/index.d.ts.map +1 -0
  71. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/backup/index.js +258 -0
  72. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/backup/index.js.map +1 -0
  73. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/debug/index.d.ts +71 -0
  74. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/debug/index.d.ts.map +1 -0
  75. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/debug/index.js +263 -0
  76. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/debug/index.js.map +1 -0
  77. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/effective/index.d.ts +65 -0
  78. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/effective/index.d.ts.map +1 -0
  79. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/effective/index.js +227 -0
  80. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/effective/index.js.map +1 -0
  81. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/from-agents.d.ts +59 -0
  82. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/from-agents.d.ts.map +1 -0
  83. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/from-agents.js +212 -0
  84. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/from-agents.js.map +1 -0
  85. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/index.d.ts +26 -0
  86. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/index.d.ts.map +1 -0
  87. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/index.js +100 -0
  88. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/index.js.map +1 -0
  89. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/index.d.ts +12 -0
  90. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/index.d.ts.map +1 -0
  91. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/index.js +12 -0
  92. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/index.js.map +1 -0
  93. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/rules/index.d.ts +6 -0
  94. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/rules/index.d.ts.map +1 -0
  95. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/rules/index.js +292 -0
  96. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/rules/index.js.map +1 -0
  97. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/spread/index.d.ts +38 -0
  98. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/spread/index.d.ts.map +1 -0
  99. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/spread/index.js +190 -0
  100. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/spread/index.js.map +1 -0
  101. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/config.d.ts +5 -0
  102. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/config.d.ts.map +1 -0
  103. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/config.js +62 -0
  104. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/config.js.map +1 -0
  105. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/custom-agents.d.ts +45 -0
  106. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/custom-agents.d.ts.map +1 -0
  107. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/custom-agents.js +103 -0
  108. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/custom-agents.js.map +1 -0
  109. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/fs-utils.d.ts +16 -0
  110. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/fs-utils.d.ts.map +1 -0
  111. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/fs-utils.js +45 -0
  112. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/fs-utils.js.map +1 -0
  113. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/index.d.ts +9 -0
  114. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/index.d.ts.map +1 -0
  115. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/index.js +9 -0
  116. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/index.js.map +1 -0
  117. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/mcp.d.ts +5 -0
  118. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/mcp.d.ts.map +1 -0
  119. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/mcp.js +30 -0
  120. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/mcp.js.map +1 -0
  121. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/merge.d.ts +15 -0
  122. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/merge.d.ts.map +1 -0
  123. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/merge.js +28 -0
  124. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/merge.js.map +1 -0
  125. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/paths.d.ts +22 -0
  126. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/paths.d.ts.map +1 -0
  127. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/paths.js +107 -0
  128. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/paths.js.map +1 -0
  129. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/rules.d.ts +12 -0
  130. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/rules.d.ts.map +1 -0
  131. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/rules.js +32 -0
  132. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/rules.js.map +1 -0
  133. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/scaffolding.d.ts +11 -0
  134. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/scaffolding.d.ts.map +1 -0
  135. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/scaffolding.js +32 -0
  136. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/scaffolding.js.map +1 -0
  137. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/skills.d.ts +13 -0
  138. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/skills.d.ts.map +1 -0
  139. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/skills.js +84 -0
  140. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/skills.js.map +1 -0
  141. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/sync/index.d.ts +89 -0
  142. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/sync/index.d.ts.map +1 -0
  143. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/sync/index.js +423 -0
  144. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/sync/index.js.map +1 -0
  145. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/git.d.ts +23 -0
  146. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/git.d.ts.map +1 -0
  147. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/git.js +132 -0
  148. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/git.js.map +1 -0
  149. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/index.d.ts +2 -0
  150. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/index.d.ts.map +1 -0
  151. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/index.js +2 -0
  152. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/index.js.map +1 -0
  153. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/types.d.ts +142 -0
  154. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/types.d.ts.map +1 -0
  155. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/types.js +13 -0
  156. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/types.js.map +1 -0
  157. package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/package.json +29 -0
  158. package/vendor/plexus-agent-config-web/package.json +1 -1
  159. /package/vendor/plexus-agent-config-web/.next/static/{FKr7yvzxSzNS1oAjTyP1N → cYvZNrsyPRNUjzvxkVMIa}/_buildManifest.js +0 -0
  160. /package/vendor/plexus-agent-config-web/.next/static/{FKr7yvzxSzNS1oAjTyP1N → cYvZNrsyPRNUjzvxkVMIa}/_ssgManifest.js +0 -0
@@ -0,0 +1,169 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { pathExists } from "../store/fs-utils.js";
4
+ import { AGENT_DISPLAY_NAMES, AGENT_PATHS, AGENT_ROOTS } from "../store/paths.js";
5
+ import { isAgentInstalled } from "./detect.js";
6
+ async function statFile(p) {
7
+ const status = { path: p, exists: false, isSymlink: false };
8
+ try {
9
+ const lst = await fs.lstat(p);
10
+ status.exists = true;
11
+ status.isSymlink = lst.isSymbolicLink();
12
+ if (status.isSymlink) {
13
+ try {
14
+ const t = await fs.readlink(p);
15
+ status.linkTarget = path.isAbsolute(t) ? t : path.resolve(path.dirname(p), t);
16
+ }
17
+ catch {
18
+ // ignore
19
+ }
20
+ }
21
+ try {
22
+ const s = await fs.stat(p); // follows symlink
23
+ status.size = s.size;
24
+ status.mtime = s.mtime.toISOString();
25
+ }
26
+ catch {
27
+ // dangling symlink
28
+ }
29
+ }
30
+ catch {
31
+ // not present
32
+ }
33
+ return status;
34
+ }
35
+ async function listSkills(skillsDir) {
36
+ if (!(await pathExists(skillsDir)))
37
+ return [];
38
+ try {
39
+ const entries = await fs.readdir(skillsDir, { withFileTypes: true });
40
+ const out = [];
41
+ for (const entry of entries) {
42
+ // Skip OS noise and Plexus's own internal backup folders.
43
+ if (entry.name.startsWith("."))
44
+ continue;
45
+ if (entry.name.includes(".plexus-backup-"))
46
+ continue;
47
+ const full = path.join(skillsDir, entry.name);
48
+ let isSymlink = false;
49
+ let linkTarget;
50
+ try {
51
+ const lst = await fs.lstat(full);
52
+ isSymlink = lst.isSymbolicLink();
53
+ if (isSymlink) {
54
+ const t = await fs.readlink(full);
55
+ linkTarget = path.isAbsolute(t) ? t : path.resolve(path.dirname(full), t);
56
+ }
57
+ }
58
+ catch {
59
+ continue;
60
+ }
61
+ // Treat as skill if dir or symlink-to-dir.
62
+ const skillMd = path.join(full, "SKILL.md");
63
+ const hasSkillMd = await pathExists(skillMd);
64
+ out.push({
65
+ id: entry.name,
66
+ path: full,
67
+ isSymlink,
68
+ linkTarget,
69
+ hasSkillMd,
70
+ });
71
+ }
72
+ return out.sort((a, b) => a.id.localeCompare(b.id));
73
+ }
74
+ catch {
75
+ return [];
76
+ }
77
+ }
78
+ export function instructionsForAgent(agentId) {
79
+ const root = AGENT_ROOTS[agentId];
80
+ switch (agentId) {
81
+ case "claude-code":
82
+ return [
83
+ {
84
+ label: "CLAUDE.md (user-level memory)",
85
+ filename: "CLAUDE.md",
86
+ abs: path.join(root, "CLAUDE.md"),
87
+ },
88
+ ];
89
+ case "cursor":
90
+ return [
91
+ {
92
+ label: "AGENTS.md (user-level)",
93
+ filename: "AGENTS.md",
94
+ abs: path.join(root, "AGENTS.md"),
95
+ },
96
+ ];
97
+ case "codex":
98
+ return [
99
+ {
100
+ label: "AGENTS.md (user-level)",
101
+ filename: "AGENTS.md",
102
+ abs: path.join(root, "AGENTS.md"),
103
+ },
104
+ ];
105
+ case "gemini-cli":
106
+ return [
107
+ {
108
+ label: "GEMINI.md (user-level)",
109
+ filename: "GEMINI.md",
110
+ abs: path.join(root, "GEMINI.md"),
111
+ },
112
+ ];
113
+ case "qwen-code":
114
+ return [
115
+ {
116
+ label: "QWEN.md (user-level)",
117
+ filename: "QWEN.md",
118
+ abs: path.join(root, "QWEN.md"),
119
+ },
120
+ ];
121
+ case "factory-droid":
122
+ return [
123
+ {
124
+ label: "AGENTS.md (user-level)",
125
+ filename: "AGENTS.md",
126
+ abs: path.join(root, "AGENTS.md"),
127
+ },
128
+ ];
129
+ }
130
+ }
131
+ export async function inspectAgent(agentId) {
132
+ const caps = AGENT_PATHS[agentId];
133
+ const root = AGENT_ROOTS[agentId];
134
+ const installed = isAgentInstalled(agentId);
135
+ const [mcpFile, skillsDir] = await Promise.all([
136
+ statFile(caps.mcpPath),
137
+ statFile(caps.skillsDir),
138
+ ]);
139
+ const skills = caps.skills ? await listSkills(caps.skillsDir) : [];
140
+ const instructionFiles = [];
141
+ for (const ins of instructionsForAgent(agentId)) {
142
+ instructionFiles.push({
143
+ label: ins.label,
144
+ filename: ins.filename,
145
+ status: await statFile(ins.abs),
146
+ });
147
+ }
148
+ return {
149
+ id: agentId,
150
+ displayName: AGENT_DISPLAY_NAMES[agentId],
151
+ rootDir: root,
152
+ installed,
153
+ mcpFile,
154
+ mcpFileMode: caps.mcpFileMode ?? "shared",
155
+ skillsDir,
156
+ skills,
157
+ instructionFiles,
158
+ };
159
+ }
160
+ /** Read a file (small text; the UI only enables editing for instruction files & SKILL.md). */
161
+ export async function readTextFile(absPath) {
162
+ return fs.readFile(absPath, "utf8");
163
+ }
164
+ /** Write a file, creating parent dir as needed. (Caller is responsible for backup if it cares.) */
165
+ export async function writeTextFile(absPath, content) {
166
+ await fs.mkdir(path.dirname(absPath), { recursive: true });
167
+ await fs.writeFile(absPath, content, "utf8");
168
+ }
169
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/agents/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import type { AgentId } from "../types.js";
2
+ /** Where collision backups (from placeLinkOrCopy) end up. */
3
+ export declare const COLLISION_BACKUP_ROOT: string;
4
+ /** Where one-time-quarantined `.plexus-backup-*` residue ends up. */
5
+ export declare const LEGACY_RESIDUE_ROOT: string;
6
+ /**
7
+ * Plexus snapshots every agent's native MCP config file before any sync write.
8
+ *
9
+ * Snapshots live under `~/.config/plexus/backups/<ISO-timestamp>/` so a user
10
+ * can always restore the previous state with `cp` if Plexus made a wrong
11
+ * decision. We deliberately do NOT back up skill directories: skills are
12
+ * already symlinks to the Plexus store, and doubling the disk usage on every
13
+ * toggle would be expensive and rarely useful.
14
+ */
15
+ export interface BackupEntry {
16
+ agent: AgentId;
17
+ /** Path of the snapshotted file inside the backup directory. */
18
+ backupPath: string;
19
+ /** Original path of the file we copied. */
20
+ originalPath: string;
21
+ /** Was the original a symlink? Lets restore reproduce the link. */
22
+ wasSymlink: boolean;
23
+ /** If symlink, the link target at snapshot time. */
24
+ linkTarget?: string;
25
+ }
26
+ export interface BackupSnapshot {
27
+ /** Backup directory (one per snapshot). */
28
+ dir: string;
29
+ /** ISO timestamp identifier. */
30
+ id: string;
31
+ entries: BackupEntry[];
32
+ }
33
+ export declare function snapshotAgentConfigs(opts?: {
34
+ reason?: string;
35
+ }): Promise<BackupSnapshot>;
36
+ export declare function listBackups(): Promise<BackupSnapshot[]>;
37
+ /**
38
+ * Snapshot a single file (e.g. CLAUDE.md) before edit. Stored alongside the
39
+ * regular sync snapshots so the user has one consistent recovery surface.
40
+ */
41
+ export declare function snapshotSingleFile(filePath: string, reason?: string): Promise<string | null>;
42
+ /**
43
+ * Move a colliding file/dir into the central backups area instead of leaving
44
+ * `<name>.plexus-backup-<ts>` debris in the agent's own directory.
45
+ *
46
+ * Called by adapter `placeLinkOrCopy` whenever it needs to evict a real
47
+ * file/dir before placing a symlink.
48
+ */
49
+ export declare function quarantineCollision(opts: {
50
+ agent: AgentId | "unknown";
51
+ sourcePath: string;
52
+ }): Promise<string | null>;
53
+ /**
54
+ * One-shot cleanup: scan every agent's skills dir for `.plexus-backup-*`
55
+ * residue (left by old versions of placeLinkOrCopy) and quarantine them
56
+ * into the central backups area. Idempotent.
57
+ */
58
+ export declare function cleanupLegacyResidue(): Promise<{
59
+ moved: Array<{
60
+ agent: AgentId;
61
+ from: string;
62
+ to: string;
63
+ }>;
64
+ }>;
65
+ /** Restore one snapshot by copying every backed-up file back over the original. */
66
+ export declare function restoreSnapshot(id: string): Promise<{
67
+ restored: number;
68
+ errors: string[];
69
+ }>;
70
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backup/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB,QAAiD,CAAC;AACpF,qEAAqE;AACrE,eAAO,MAAM,mBAAmB,QAAqD,CAAC;AAEtF;;;;;;;;GAQG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,UAAU,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AA2BD,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,cAAc,CAAC,CAmD1B;AAqBD,wBAAsB,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAuB7D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6BxB;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBzB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC;IACpD,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5D,CAAC,CA4BD;AAED,mFAAmF;AACnF,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CAwBD"}
@@ -0,0 +1,258 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { ensureDir, pathExists } from "../store/fs-utils.js";
5
+ import { AGENT_PATHS, ALL_AGENTS, PLEXUS_PATHS } from "../store/paths.js";
6
+ /** Where collision backups (from placeLinkOrCopy) end up. */
7
+ export const COLLISION_BACKUP_ROOT = path.join(PLEXUS_PATHS.backups, "_collisions");
8
+ /** Where one-time-quarantined `.plexus-backup-*` residue ends up. */
9
+ export const LEGACY_RESIDUE_ROOT = path.join(PLEXUS_PATHS.backups, "_legacy-residue");
10
+ const KEEP = 20;
11
+ const SNAPSHOT_ID_RE = /^\d{4}-\d{2}-\d{2}T/;
12
+ async function createSnapshotDir() {
13
+ await ensureDir(PLEXUS_PATHS.backups);
14
+ const base = new Date().toISOString().replace(/[:.]/g, "-");
15
+ for (let i = 0; i < 1000; i += 1) {
16
+ const id = i === 0 ? base : `${base}-${String(i).padStart(3, "0")}`;
17
+ const dir = path.join(PLEXUS_PATHS.backups, id);
18
+ try {
19
+ await fs.mkdir(dir, { recursive: false });
20
+ return { id, dir };
21
+ }
22
+ catch (err) {
23
+ if (err.code !== "EEXIST")
24
+ throw err;
25
+ }
26
+ }
27
+ throw new Error(`Could not allocate a unique backup directory for ${base}`);
28
+ }
29
+ function backupFileName(filePath) {
30
+ const parsed = path.parse(filePath);
31
+ const hash = crypto.createHash("sha256").update(path.resolve(filePath)).digest("hex").slice(0, 8);
32
+ return `${parsed.name}.${hash}${parsed.ext || ".bak"}`;
33
+ }
34
+ export async function snapshotAgentConfigs(opts) {
35
+ const { id, dir } = await createSnapshotDir();
36
+ if (opts?.reason) {
37
+ await fs.writeFile(path.join(dir, "_reason.txt"), opts.reason, "utf8").catch(() => { });
38
+ }
39
+ const entries = [];
40
+ for (const agentId of ALL_AGENTS) {
41
+ const caps = AGENT_PATHS[agentId];
42
+ if (!caps.mcp)
43
+ continue;
44
+ if (!(await pathExists(caps.mcpPath)))
45
+ continue;
46
+ let wasSymlink = false;
47
+ let linkTarget;
48
+ try {
49
+ const lst = await fs.lstat(caps.mcpPath);
50
+ wasSymlink = lst.isSymbolicLink();
51
+ if (wasSymlink)
52
+ linkTarget = await fs.readlink(caps.mcpPath);
53
+ }
54
+ catch {
55
+ continue;
56
+ }
57
+ const ext = path.extname(caps.mcpPath) || ".bak";
58
+ const fname = `${agentId}-mcp${ext}`;
59
+ const backupPath = path.join(dir, fname);
60
+ try {
61
+ // Always copy the resolved file content (so the backup is self-contained).
62
+ const content = await fs.readFile(caps.mcpPath);
63
+ await fs.writeFile(backupPath, content);
64
+ entries.push({
65
+ agent: agentId,
66
+ backupPath,
67
+ originalPath: caps.mcpPath,
68
+ wasSymlink,
69
+ linkTarget,
70
+ });
71
+ }
72
+ catch {
73
+ // best-effort; skip agents we can't read
74
+ }
75
+ }
76
+ // Write a manifest so a human can interpret a backup dir without grepping.
77
+ await fs.writeFile(path.join(dir, "manifest.json"), JSON.stringify({ id, createdAt: new Date().toISOString(), entries }, null, 2), "utf8");
78
+ await pruneOldBackups(KEEP);
79
+ return { dir, id, entries };
80
+ }
81
+ async function pruneOldBackups(keep) {
82
+ try {
83
+ const ents = await fs.readdir(PLEXUS_PATHS.backups, { withFileTypes: true });
84
+ const dirs = ents
85
+ .filter((e) => e.isDirectory() && SNAPSHOT_ID_RE.test(e.name))
86
+ .map((e) => e.name)
87
+ .sort()
88
+ .reverse();
89
+ for (const old of dirs.slice(keep)) {
90
+ await fs.rm(path.join(PLEXUS_PATHS.backups, old), {
91
+ recursive: true,
92
+ force: true,
93
+ });
94
+ }
95
+ }
96
+ catch {
97
+ // ignore — pruning is best-effort
98
+ }
99
+ }
100
+ export async function listBackups() {
101
+ try {
102
+ const ents = await fs.readdir(PLEXUS_PATHS.backups, { withFileTypes: true });
103
+ const dirs = ents
104
+ .filter((e) => e.isDirectory())
105
+ .map((e) => e.name)
106
+ .sort()
107
+ .reverse();
108
+ const out = [];
109
+ for (const d of dirs) {
110
+ const dir = path.join(PLEXUS_PATHS.backups, d);
111
+ try {
112
+ const raw = await fs.readFile(path.join(dir, "manifest.json"), "utf8");
113
+ const m = JSON.parse(raw);
114
+ out.push({ dir, id: m.id, entries: m.entries });
115
+ }
116
+ catch {
117
+ out.push({ dir, id: d, entries: [] });
118
+ }
119
+ }
120
+ return out;
121
+ }
122
+ catch {
123
+ return [];
124
+ }
125
+ }
126
+ /**
127
+ * Snapshot a single file (e.g. CLAUDE.md) before edit. Stored alongside the
128
+ * regular sync snapshots so the user has one consistent recovery surface.
129
+ */
130
+ export async function snapshotSingleFile(filePath, reason) {
131
+ if (!(await pathExists(filePath)))
132
+ return null;
133
+ const { id, dir } = await createSnapshotDir();
134
+ if (reason) {
135
+ await fs.writeFile(path.join(dir, "_reason.txt"), reason, "utf8").catch(() => { });
136
+ }
137
+ const fname = backupFileName(filePath);
138
+ const backupPath = path.join(dir, fname);
139
+ try {
140
+ const content = await fs.readFile(filePath);
141
+ await fs.writeFile(backupPath, content);
142
+ await fs.writeFile(path.join(dir, "manifest.json"), JSON.stringify({
143
+ id,
144
+ createdAt: new Date().toISOString(),
145
+ entries: [{ agent: null, backupPath, originalPath: filePath, wasSymlink: false }],
146
+ }, null, 2), "utf8");
147
+ await pruneOldBackups(KEEP);
148
+ return dir;
149
+ }
150
+ catch {
151
+ return null;
152
+ }
153
+ }
154
+ /**
155
+ * Move a colliding file/dir into the central backups area instead of leaving
156
+ * `<name>.plexus-backup-<ts>` debris in the agent's own directory.
157
+ *
158
+ * Called by adapter `placeLinkOrCopy` whenever it needs to evict a real
159
+ * file/dir before placing a symlink.
160
+ */
161
+ export async function quarantineCollision(opts) {
162
+ if (!(await pathExists(opts.sourcePath)))
163
+ return null;
164
+ const ts = new Date().toISOString().replace(/[:.]/g, "-");
165
+ const destDir = path.join(COLLISION_BACKUP_ROOT, ts, opts.agent);
166
+ await ensureDir(destDir);
167
+ const destPath = path.join(destDir, path.basename(opts.sourcePath));
168
+ try {
169
+ await fs.rename(opts.sourcePath, destPath);
170
+ return destPath;
171
+ }
172
+ catch {
173
+ // Cross-device or permission — fall back to copy + delete.
174
+ try {
175
+ const lst = await fs.lstat(opts.sourcePath);
176
+ if (lst.isDirectory()) {
177
+ await fs.cp(opts.sourcePath, destPath, { recursive: true });
178
+ await fs.rm(opts.sourcePath, { recursive: true, force: true });
179
+ }
180
+ else {
181
+ await fs.copyFile(opts.sourcePath, destPath);
182
+ await fs.unlink(opts.sourcePath);
183
+ }
184
+ return destPath;
185
+ }
186
+ catch {
187
+ return null;
188
+ }
189
+ }
190
+ }
191
+ /**
192
+ * One-shot cleanup: scan every agent's skills dir for `.plexus-backup-*`
193
+ * residue (left by old versions of placeLinkOrCopy) and quarantine them
194
+ * into the central backups area. Idempotent.
195
+ */
196
+ export async function cleanupLegacyResidue() {
197
+ const moved = [];
198
+ for (const agentId of ALL_AGENTS) {
199
+ const caps = AGENT_PATHS[agentId];
200
+ if (!caps.skills)
201
+ continue;
202
+ if (!(await pathExists(caps.skillsDir)))
203
+ continue;
204
+ let entries;
205
+ try {
206
+ entries = await fs.readdir(caps.skillsDir);
207
+ }
208
+ catch {
209
+ continue;
210
+ }
211
+ for (const name of entries) {
212
+ if (!name.includes(".plexus-backup-"))
213
+ continue;
214
+ const src = path.join(caps.skillsDir, name);
215
+ const ts = new Date().toISOString().replace(/[:.]/g, "-");
216
+ const destDir = path.join(LEGACY_RESIDUE_ROOT, ts, agentId);
217
+ await ensureDir(destDir);
218
+ const dest = path.join(destDir, name);
219
+ try {
220
+ await fs.rename(src, dest);
221
+ moved.push({ agent: agentId, from: src, to: dest });
222
+ }
223
+ catch {
224
+ // best effort
225
+ }
226
+ }
227
+ }
228
+ return { moved };
229
+ }
230
+ /** Restore one snapshot by copying every backed-up file back over the original. */
231
+ export async function restoreSnapshot(id) {
232
+ const snapshots = await listBackups();
233
+ const snap = snapshots.find((s) => s.id === id);
234
+ if (!snap)
235
+ return { restored: 0, errors: [`No snapshot with id ${id}`] };
236
+ const errors = [];
237
+ let restored = 0;
238
+ for (const entry of snap.entries) {
239
+ try {
240
+ // Remove existing file/symlink first to avoid writing through links.
241
+ try {
242
+ await fs.unlink(entry.originalPath);
243
+ }
244
+ catch {
245
+ // ignore
246
+ }
247
+ const content = await fs.readFile(entry.backupPath);
248
+ await ensureDir(path.dirname(entry.originalPath));
249
+ await fs.writeFile(entry.originalPath, content);
250
+ restored += 1;
251
+ }
252
+ catch (err) {
253
+ errors.push(`${entry.agent}: ${err.message}`);
254
+ }
255
+ }
256
+ return { restored, errors };
257
+ }
258
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backup/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG1E,6DAA6D;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AACpF,qEAAqE;AACrE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAgCtF,MAAM,IAAI,GAAG,EAAE,CAAC;AAChB,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAE7C,KAAK,UAAU,iBAAiB;IAC9B,MAAM,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;QAClE,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oDAAoD,IAAI,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClG,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAE1C;IACC,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAE9C,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,SAAS;QACxB,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAAE,SAAS;QAEhD,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,UAA8B,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,UAAU,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;YAClC,IAAI,UAAU;gBAAE,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC;QACjD,MAAM,KAAK,GAAG,GAAG,OAAO,OAAO,GAAG,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,2EAA2E;YAC3E,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,OAAO;gBACd,UAAU;gBACV,YAAY,EAAE,IAAI,CAAC,OAAO;gBAC1B,UAAU;gBACV,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAC/B,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7E,MAAM,CACP,CAAC;IAEF,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,IAAI;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aAC7D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,EAAE;aACN,OAAO,EAAE,CAAC;QACb,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;gBAChD,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,IAAI;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,EAAE;aACN,OAAO,EAAE,CAAC;QACb,MAAM,GAAG,GAAqB,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;gBACvE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2C,CAAC;gBACpE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,MAAe;IAEf,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC9C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAC/B,IAAI,CAAC,SAAS,CACZ;YACE,EAAE;YACF,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;SAClF,EACD,IAAI,EACJ,CAAC,CACF,EACD,MAAM,CACP,CAAC;QACF,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAGzC;IACC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;QAC3D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5D,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC7C,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IAGxC,MAAM,KAAK,GAAwD,EAAE,CAAC;IACtE,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,SAAS;QAC3B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAAE,SAAS;QAClD,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAAE,SAAS;YAChD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAU;IAI9C,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,uBAAuB,EAAE,EAAE,CAAC,EAAE,CAAC;IAEzE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,qEAAqE;YACrE,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YAClD,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAChD,QAAQ,IAAI,CAAC,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,71 @@
1
+ import type { AgentId } from "../types.js";
2
+ /**
3
+ * "Debug snapshot" — a one-shot dump of every path Plexus cares about.
4
+ *
5
+ * Designed to be copy/pasted into a chat with a maintainer when something
6
+ * goes wrong (sync didn't take effect, symlink looks weird, file size is 0,
7
+ * etc.). It deliberately avoids reading file *contents* — only metadata —
8
+ * so secrets in `~/.claude.json` etc. never leak.
9
+ */
10
+ export interface PathStat {
11
+ /** Absolute path. */
12
+ path: string;
13
+ /** Path with `$HOME` collapsed to `~`, for readable output. */
14
+ display: string;
15
+ exists: boolean;
16
+ /** "file" | "dir" | "symlink" | "missing" */
17
+ kind: "file" | "dir" | "symlink" | "missing";
18
+ /** If symlink: the absolute target. */
19
+ linkTarget?: string;
20
+ /** If symlink: whether the target currently exists. */
21
+ linkTargetExists?: boolean;
22
+ /** Size in bytes (resolved through symlink). */
23
+ size?: number;
24
+ /** ISO mtime (resolved through symlink). */
25
+ mtime?: string;
26
+ /** For directories: number of entries (skipping dotfiles & .plexus-backup-*). */
27
+ entryCount?: number;
28
+ }
29
+ export interface DirectoryListing {
30
+ dir: PathStat;
31
+ entries: PathStat[];
32
+ }
33
+ export interface AgentDebugBlock {
34
+ id: AgentId;
35
+ displayName: string;
36
+ installed: boolean;
37
+ mcpFileMode: "exclusive" | "shared";
38
+ root: PathStat;
39
+ mcpFile: PathStat;
40
+ instructionFile: PathStat | null;
41
+ skillsDir: PathStat;
42
+ skillEntries: PathStat[];
43
+ }
44
+ export interface PlexusStoreBlock {
45
+ root: PathStat;
46
+ config: PathStat;
47
+ team: PathStat;
48
+ personal: PathStat;
49
+ cacheMcp: PathStat;
50
+ backups: PathStat;
51
+ teamMcpServers: PathStat;
52
+ personalMcpServers: PathStat;
53
+ teamSkillEntries: PathStat[];
54
+ personalSkillEntries: PathStat[];
55
+ cacheMcpEntries: PathStat[];
56
+ backupCount: number;
57
+ }
58
+ export interface DebugSnapshot {
59
+ generatedAt: string;
60
+ host: {
61
+ platform: string;
62
+ release: string;
63
+ node: string;
64
+ home: string;
65
+ };
66
+ plexus: PlexusStoreBlock;
67
+ agents: AgentDebugBlock[];
68
+ }
69
+ export declare function collectDebugSnapshot(): Promise<DebugSnapshot>;
70
+ export declare function formatDebugSnapshot(s: DebugSnapshot, version?: string): string;
71
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/debug/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;GAOG;AAEH,MAAM,WAAW,QAAQ;IACvB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7C,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,QAAQ,CAAC;IACd,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,WAAW,GAAG,QAAQ,CAAC;IACpC,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,QAAQ,CAAC;IAClB,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,QAAQ,CAAC;IACpB,YAAY,EAAE,QAAQ,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,QAAQ,CAAC;IAClB,cAAc,EAAE,QAAQ,CAAC;IACzB,kBAAkB,EAAE,QAAQ,CAAC;IAC7B,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IAC7B,oBAAoB,EAAE,QAAQ,EAAE,CAAC;IACjC,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AA8JD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,aAAa,CAAC,CAcnE;AAoFD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAe9E"}