plexus-agent-config 0.0.2 → 0.0.4
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/dist/bin.js +2 -1
- package/dist/bin.js.map +1 -1
- package/package.json +2 -10
- package/vendor/plexus-agent-config-core/package.json +1 -1
- package/vendor/plexus-agent-config-web/.next/BUILD_ID +1 -1
- package/vendor/plexus-agent-config-web/.next/app-path-routes-manifest.json +7 -7
- package/vendor/plexus-agent-config-web/.next/build-manifest.json +2 -2
- package/vendor/plexus-agent-config-web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/_global-error.html +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/_global-error.rsc +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/about/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/api/debug/route.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/backups/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/debug/page.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/debug/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/mirror/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/rules/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/spread/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app/team/page_client-reference-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/app-paths-manifest.json +7 -7
- package/vendor/plexus-agent-config-web/.next/server/chunks/620.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/middleware-build-manifest.js +1 -1
- package/vendor/plexus-agent-config-web/.next/server/pages/500.html +1 -1
- package/vendor/plexus-agent-config-web/.next/static/chunks/app/{layout-2d0506b46622a8c9.js → layout-60f950c38a06198d.js} +1 -1
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/base.d.ts +38 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/base.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/base.js +125 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/base.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/codex.d.ts +9 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/codex.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/codex.js +96 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/codex.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/index.d.ts +8 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/index.js +12 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/json-mcp.d.ts +25 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/json-mcp.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/json-mcp.js +182 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/adapters/json-mcp.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/catalog.d.ts +15 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/catalog.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/catalog.js +153 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/catalog.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/detect.d.ts +14 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/detect.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/detect.js +92 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/detect.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/index.d.ts +5 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/index.js +5 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/inspect.d.ts +74 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/inspect.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/inspect.js +169 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/inspect.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/backup/index.d.ts +70 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/backup/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/backup/index.js +258 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/backup/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/debug/index.d.ts +71 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/debug/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/debug/index.js +263 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/debug/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/effective/index.d.ts +65 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/effective/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/effective/index.js +227 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/effective/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/from-agents.d.ts +59 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/from-agents.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/from-agents.js +212 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/from-agents.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/index.d.ts +26 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/index.js +100 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/import/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/index.d.ts +12 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/index.js +12 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/rules/index.d.ts +6 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/rules/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/rules/index.js +292 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/rules/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/spread/index.d.ts +38 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/spread/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/spread/index.js +190 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/spread/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/config.d.ts +5 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/config.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/config.js +62 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/config.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/custom-agents.d.ts +45 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/custom-agents.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/custom-agents.js +103 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/custom-agents.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/fs-utils.d.ts +16 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/fs-utils.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/fs-utils.js +45 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/fs-utils.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/index.d.ts +9 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/index.js +9 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/mcp.d.ts +5 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/mcp.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/mcp.js +30 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/mcp.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/merge.d.ts +15 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/merge.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/merge.js +28 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/merge.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/paths.d.ts +22 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/paths.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/paths.js +107 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/paths.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/rules.d.ts +12 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/rules.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/rules.js +32 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/rules.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/scaffolding.d.ts +11 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/scaffolding.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/scaffolding.js +32 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/scaffolding.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/skills.d.ts +13 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/skills.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/skills.js +84 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/store/skills.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/sync/index.d.ts +89 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/sync/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/sync/index.js +423 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/sync/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/git.d.ts +23 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/git.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/git.js +132 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/git.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/index.d.ts +2 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/index.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/index.js +2 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/team/index.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/types.d.ts +142 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/types.d.ts.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/types.js +13 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/types.js.map +1 -0
- package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/package.json +29 -0
- package/vendor/plexus-agent-config-web/package.json +1 -1
- /package/vendor/plexus-agent-config-web/.next/static/{FKr7yvzxSzNS1oAjTyP1N → v1aj22QNmPE-dQiztsZVd}/_buildManifest.js +0 -0
- /package/vendor/plexus-agent-config-web/.next/static/{FKr7yvzxSzNS1oAjTyP1N → v1aj22QNmPE-dQiztsZVd}/_ssgManifest.js +0 -0
package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/agents/inspect.js
ADDED
|
@@ -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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"}
|
package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/backup/index.d.ts
ADDED
|
@@ -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"}
|
package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/backup/index.js
ADDED
|
@@ -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":"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"}
|
package/vendor/plexus-agent-config-web/node_modules/plexus-agent-config-core/dist/debug/index.d.ts
ADDED
|
@@ -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"}
|