@nuomiji/agentbox 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +253 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/collector/collector.d.ts +15 -0
- package/dist/collector/collector.js +118 -0
- package/dist/collector/collector.js.map +1 -0
- package/dist/collector/known-layers.d.ts +2 -0
- package/dist/collector/known-layers.js +15 -0
- package/dist/collector/known-layers.js.map +1 -0
- package/dist/collector/probe.d.ts +19 -0
- package/dist/collector/probe.js +2 -0
- package/dist/collector/probe.js.map +1 -0
- package/dist/commands/apply.d.ts +10 -0
- package/dist/commands/apply.js +234 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/bind.d.ts +8 -0
- package/dist/commands/bind.js +78 -0
- package/dist/commands/bind.js.map +1 -0
- package/dist/commands/collect.d.ts +8 -0
- package/dist/commands/collect.js +22 -0
- package/dist/commands/collect.js.map +1 -0
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.js +24 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import-simple.d.ts +6 -0
- package/dist/commands/import-simple.js +96 -0
- package/dist/commands/import-simple.js.map +1 -0
- package/dist/commands/import.d.ts +8 -0
- package/dist/commands/import.js +108 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/inspect.d.ts +1 -0
- package/dist/commands/inspect.js +21 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/install-skills.d.ts +11 -0
- package/dist/commands/install-skills.js +316 -0
- package/dist/commands/install-skills.js.map +1 -0
- package/dist/commands/pack.d.ts +4 -0
- package/dist/commands/pack.js +37 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/preview.d.ts +8 -0
- package/dist/commands/preview.js +108 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/unpack.d.ts +4 -0
- package/dist/commands/unpack.js +45 -0
- package/dist/commands/unpack.js.map +1 -0
- package/dist/core/archive.d.ts +2 -0
- package/dist/core/archive.js +46 -0
- package/dist/core/archive.js.map +1 -0
- package/dist/core/bindings.d.ts +22 -0
- package/dist/core/bindings.js +46 -0
- package/dist/core/bindings.js.map +1 -0
- package/dist/core/env.d.ts +13 -0
- package/dist/core/env.js +49 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/fs.d.ts +12 -0
- package/dist/core/fs.js +233 -0
- package/dist/core/fs.js.map +1 -0
- package/dist/core/materialize.d.ts +10 -0
- package/dist/core/materialize.js +54 -0
- package/dist/core/materialize.js.map +1 -0
- package/dist/core/redaction.d.ts +25 -0
- package/dist/core/redaction.js +184 -0
- package/dist/core/redaction.js.map +1 -0
- package/dist/core/schemas.d.ts +9 -0
- package/dist/core/schemas.js +60 -0
- package/dist/core/schemas.js.map +1 -0
- package/dist/core/types.d.ts +125 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/yaml.d.ts +1 -0
- package/dist/core/yaml.js +8 -0
- package/dist/core/yaml.js.map +1 -0
- package/dist/import/claude-code.d.ts +3 -0
- package/dist/import/claude-code.js +182 -0
- package/dist/import/claude-code.js.map +1 -0
- package/dist/import/codex.d.ts +3 -0
- package/dist/import/codex.js +162 -0
- package/dist/import/codex.js.map +1 -0
- package/dist/import/compatibility.d.ts +42 -0
- package/dist/import/compatibility.js +99 -0
- package/dist/import/compatibility.js.map +1 -0
- package/dist/import/install-plan.d.ts +43 -0
- package/dist/import/install-plan.js +125 -0
- package/dist/import/install-plan.js.map +1 -0
- package/dist/import/openclaw.d.ts +3 -0
- package/dist/import/openclaw.js +128 -0
- package/dist/import/openclaw.js.map +1 -0
- package/dist/import/portable.d.ts +6 -0
- package/dist/import/portable.js +394 -0
- package/dist/import/portable.js.map +1 -0
- package/dist/import/types.d.ts +21 -0
- package/dist/import/types.js +2 -0
- package/dist/import/types.js.map +1 -0
- package/dist/probes/claude-code.d.ts +9 -0
- package/dist/probes/claude-code.js +244 -0
- package/dist/probes/claude-code.js.map +1 -0
- package/dist/probes/codex.d.ts +10 -0
- package/dist/probes/codex.js +219 -0
- package/dist/probes/codex.js.map +1 -0
- package/dist/probes/cursor.d.ts +9 -0
- package/dist/probes/cursor.js +102 -0
- package/dist/probes/cursor.js.map +1 -0
- package/dist/probes/openclaw.d.ts +9 -0
- package/dist/probes/openclaw.js +52 -0
- package/dist/probes/openclaw.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import { createEmptyResolvedSnapshot, createEmptySources } from "../core/schemas.js";
|
|
4
|
+
import { detectFormat, listDirectoryNames, listMarkdownFilesRecursive, listRecentFiles, readJsonIfExists, readTextIfExists, readTextPreview, pathExists } from "../core/fs.js";
|
|
5
|
+
export class ClaudeCodeProbe {
|
|
6
|
+
host = "claude-code";
|
|
7
|
+
async detect(context) {
|
|
8
|
+
const settingsPath = path.join(context.homeDir, ".claude", "settings.json");
|
|
9
|
+
if (!(await pathExists(settingsPath))) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
host: this.host,
|
|
14
|
+
confidence: 0.9,
|
|
15
|
+
reason: `Found ${settingsPath}`
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async collect(context) {
|
|
19
|
+
const resolved = createEmptyResolvedSnapshot(this.host);
|
|
20
|
+
const sources = createEmptySources();
|
|
21
|
+
// Collect from user-level settings
|
|
22
|
+
const userSettingsPath = path.join(context.homeDir, ".claude", "settings.json");
|
|
23
|
+
const parsed = await readJsonIfExists(userSettingsPath);
|
|
24
|
+
if (parsed) {
|
|
25
|
+
resolved.plugins = {
|
|
26
|
+
enabledPlugins: parsed.enabledPlugins ?? {},
|
|
27
|
+
extraKnownMarketplaces: parsed.extraKnownMarketplaces ?? {}
|
|
28
|
+
};
|
|
29
|
+
resolved.tools = {
|
|
30
|
+
mcpPermissions: {},
|
|
31
|
+
mcpServers: parsed.mcpServers ?? {}
|
|
32
|
+
};
|
|
33
|
+
sources.records.push({ key: "host.plugins", sourcePath: userSettingsPath, layer: "plugins", origin: "user" }, { key: "host.tools", sourcePath: userSettingsPath, layer: "tools", origin: "user" });
|
|
34
|
+
}
|
|
35
|
+
resolved.profile = await collectClaudeProfile(context);
|
|
36
|
+
resolved.memory = await collectClaudeMemory(context);
|
|
37
|
+
resolved.session = await collectClaudeSession(context);
|
|
38
|
+
resolved.skills = await collectSharedSkills(context);
|
|
39
|
+
const artifacts = await collectClaudeArtifacts(context);
|
|
40
|
+
resolved.hostArtifacts.push(...artifacts);
|
|
41
|
+
sources.records.push({ key: "profile.currentProject", sourcePath: path.join(context.cwd, "CLAUDE.md"), layer: "profile", origin: "project" }, { key: "profile.user", sourcePath: path.join(context.homeDir, ".claude", "CLAUDE.md"), layer: "profile", origin: "user" }, { key: "memory.projects", sourcePath: path.join(context.homeDir, ".claude", "projects"), layer: "memory", origin: "user", note: "Scoped to current project directory" }, { key: "session.root", sourcePath: path.join(context.homeDir, ".claude"), layer: "session", origin: "user" }, { key: "skills.shared", sourcePath: path.join(context.homeDir, ".agents"), layer: "skills", origin: "user" });
|
|
42
|
+
return { resolved, sources };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function collectClaudeProfile(context) {
|
|
46
|
+
const projectClaudePath = path.join(context.cwd, "CLAUDE.md");
|
|
47
|
+
const userClaudePath = path.join(context.homeDir, ".claude", "CLAUDE.md");
|
|
48
|
+
const projectRulesPath = path.join(context.cwd, ".claude");
|
|
49
|
+
const projectClaude = await readTextIfExists(projectClaudePath);
|
|
50
|
+
const userClaude = await readTextIfExists(userClaudePath);
|
|
51
|
+
return {
|
|
52
|
+
projectInstructionPath: (await pathExists(projectClaudePath)) ? projectClaudePath : null,
|
|
53
|
+
projectInstructionContent: projectClaude ?? null,
|
|
54
|
+
projectInstructionPreview: projectClaude ? projectClaude.slice(0, 280) : null,
|
|
55
|
+
userInstructionPath: (await pathExists(userClaudePath)) ? userClaudePath : null,
|
|
56
|
+
userInstructionContent: userClaude ?? null,
|
|
57
|
+
userInstructionPreview: userClaude ? userClaude.slice(0, 280) : null,
|
|
58
|
+
projectConfigDirExists: await pathExists(projectRulesPath)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async function collectClaudeMemory(context) {
|
|
62
|
+
const projectsRoot = path.join(context.homeDir, ".claude", "projects");
|
|
63
|
+
// Claude Code encodes the project path as: ':' → '-', '\' or '/' → '-'
|
|
64
|
+
// e.g. D:\zhangyy\AIzyyai\agentbox → D--zhangyy-AIzyyai-agentbox
|
|
65
|
+
const projectDirName = context.cwd.replace(/:/g, "-").replace(/[/\\]/g, "-");
|
|
66
|
+
const projectMemoryRoot = path.join(projectsRoot, projectDirName, "memory");
|
|
67
|
+
if (await pathExists(projectMemoryRoot)) {
|
|
68
|
+
const markdownFiles = await listMarkdownFilesRecursive(projectMemoryRoot, 40);
|
|
69
|
+
const recentMarkdownFiles = await listRecentFiles(projectMemoryRoot, 8, [".md"]);
|
|
70
|
+
const memoryExcerpts = await Promise.all(recentMarkdownFiles.map(async (filePath) => ({
|
|
71
|
+
path: filePath,
|
|
72
|
+
preview: await readTextPreview(filePath, 360)
|
|
73
|
+
})));
|
|
74
|
+
const validExcerpts = memoryExcerpts.filter((entry) => entry.preview);
|
|
75
|
+
return {
|
|
76
|
+
projectMemoryRoot,
|
|
77
|
+
markdownFileCount: markdownFiles.length,
|
|
78
|
+
sampleMemoryFiles: markdownFiles.slice(0, 12),
|
|
79
|
+
memoryExcerpts: validExcerpts,
|
|
80
|
+
portableSummary: validExcerpts.length > 0
|
|
81
|
+
? `Captured ${validExcerpts.length} memory files from current project (${projectDirName}).`
|
|
82
|
+
: "Current project memory directory exists but contains no markdown files."
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Fallback: no memory directory found for this project
|
|
86
|
+
const projectDirs = await listDirectoryNames(projectsRoot, 200);
|
|
87
|
+
return {
|
|
88
|
+
projectMemoryRoot: null,
|
|
89
|
+
projectCount: projectDirs.length,
|
|
90
|
+
sampleProjects: projectDirs.slice(0, 10),
|
|
91
|
+
markdownFileCount: 0,
|
|
92
|
+
sampleMemoryFiles: [],
|
|
93
|
+
memoryExcerpts: [],
|
|
94
|
+
portableSummary: `No memory directory found for current project (${projectDirName}). ${projectDirs.length} total project(s) exist in ~/.claude/projects.`
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async function collectClaudeSession(context) {
|
|
98
|
+
const claudeRoot = path.join(context.homeDir, ".claude");
|
|
99
|
+
const projectsRoot = path.join(claudeRoot, "projects");
|
|
100
|
+
const projectDirName = context.cwd.replace(/:/g, "-").replace(/[/\\]/g, "-");
|
|
101
|
+
const projectSessionRoot = path.join(projectsRoot, projectDirName);
|
|
102
|
+
// Collect full session files for current project
|
|
103
|
+
const transcriptFiles = await listRecentFiles(projectSessionRoot, 50, [".jsonl"]);
|
|
104
|
+
// Extract slugs from session files to find related plans
|
|
105
|
+
const slugs = await extractSlugsFromTranscripts(transcriptFiles);
|
|
106
|
+
const plansRoot = path.join(claudeRoot, "plans");
|
|
107
|
+
const planFiles = await collectPlansBySlugs(plansRoot, slugs);
|
|
108
|
+
const result = {
|
|
109
|
+
captureMode: "full",
|
|
110
|
+
projectSessionRoot,
|
|
111
|
+
transcriptFiles: transcriptFiles.map(f => ({ path: f })),
|
|
112
|
+
planFiles: planFiles.map(f => ({ path: f })),
|
|
113
|
+
extractedSlugs: Array.from(slugs),
|
|
114
|
+
portableSummary: `Captured ${transcriptFiles.length} transcripts and ${planFiles.length} plans (from ${slugs.size} unique slugs) from current project.`
|
|
115
|
+
};
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
async function extractSlugsFromTranscripts(transcriptFiles) {
|
|
119
|
+
const slugs = new Set();
|
|
120
|
+
for (const transcriptPath of transcriptFiles) {
|
|
121
|
+
try {
|
|
122
|
+
const content = await fs.readFile(transcriptPath, "utf-8");
|
|
123
|
+
const lines = content.split("\n").filter((line) => line.trim());
|
|
124
|
+
for (const line of lines) {
|
|
125
|
+
try {
|
|
126
|
+
const entry = JSON.parse(line);
|
|
127
|
+
if (entry.slug && typeof entry.slug === "string") {
|
|
128
|
+
slugs.add(entry.slug);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Skip malformed JSON lines
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Skip files that can't be read
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return slugs;
|
|
141
|
+
}
|
|
142
|
+
async function collectPlansBySlugs(plansRoot, slugs) {
|
|
143
|
+
const planFiles = [];
|
|
144
|
+
if (!(await pathExists(plansRoot))) {
|
|
145
|
+
return planFiles;
|
|
146
|
+
}
|
|
147
|
+
for (const slug of slugs) {
|
|
148
|
+
const planPath = path.join(plansRoot, `${slug}.md`);
|
|
149
|
+
if (await pathExists(planPath)) {
|
|
150
|
+
planFiles.push(planPath);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return planFiles;
|
|
154
|
+
}
|
|
155
|
+
async function collectSharedSkills(context) {
|
|
156
|
+
const lockPath = path.join(context.homeDir, ".agents", ".skill-lock.json");
|
|
157
|
+
const sharedSkillsRoot = path.join(context.homeDir, ".agents", "skills");
|
|
158
|
+
const hostSkillsRoot = path.join(context.homeDir, ".claude", "skills");
|
|
159
|
+
const lock = await readJsonIfExists(lockPath);
|
|
160
|
+
const installedSkillNames = await listDirectoryNames(sharedSkillsRoot, 100);
|
|
161
|
+
const hostLinkedSkillNames = await listDirectoryNames(hostSkillsRoot, 100);
|
|
162
|
+
return {
|
|
163
|
+
sharedRoot: sharedSkillsRoot,
|
|
164
|
+
installedSkillCount: installedSkillNames.length,
|
|
165
|
+
installedSkillNames,
|
|
166
|
+
hostLinkedSkillCount: hostLinkedSkillNames.length,
|
|
167
|
+
hostLinkedSkillNames,
|
|
168
|
+
lockfilePath: (await pathExists(lockPath)) ? lockPath : null,
|
|
169
|
+
lockfileSkills: lock && typeof lock.skills === "object" ? lock.skills : {}
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
async function collectClaudeArtifacts(context) {
|
|
173
|
+
const root = path.join(context.homeDir, ".claude");
|
|
174
|
+
const candidates = [
|
|
175
|
+
{ name: "plans", category: "session-plans", portability: "adaptable", sensitivity: "internal" },
|
|
176
|
+
{ name: "tasks", category: "session-tasks", portability: "adaptable", sensitivity: "internal" },
|
|
177
|
+
{ name: "todos", category: "session-todos", portability: "adaptable", sensitivity: "internal" },
|
|
178
|
+
{ name: "shell-snapshots", category: "shell-snapshots", portability: "host-specific", sensitivity: "internal" },
|
|
179
|
+
{ name: "transcripts", category: "transcripts", portability: "opaque", sensitivity: "sensitive" },
|
|
180
|
+
{ name: "ide", category: "ide-locks", portability: "opaque", sensitivity: "internal" }
|
|
181
|
+
];
|
|
182
|
+
const artifacts = [];
|
|
183
|
+
for (const candidate of candidates) {
|
|
184
|
+
const artifactPath = path.join(root, candidate.name);
|
|
185
|
+
if (await pathExists(artifactPath)) {
|
|
186
|
+
artifacts.push({
|
|
187
|
+
path: artifactPath,
|
|
188
|
+
detectedFormat: await detectFormat(artifactPath),
|
|
189
|
+
probableCategory: candidate.category,
|
|
190
|
+
portability: candidate.portability,
|
|
191
|
+
sensitivity: candidate.sensitivity
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return artifacts;
|
|
196
|
+
}
|
|
197
|
+
function createBindingsFromEnvKeys(envKeys) {
|
|
198
|
+
return envKeys.map((envKey) => ({
|
|
199
|
+
key: envKey,
|
|
200
|
+
kind: envKey.includes("URL") ? "endpoint" : "secret",
|
|
201
|
+
required: envKey.endsWith("TOKEN") || envKey.endsWith("KEY"),
|
|
202
|
+
description: `Environment binding referenced by Claude Code settings: ${envKey}`
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
function pushBindings(target, next) {
|
|
206
|
+
const seen = new Set(target.map((entry) => entry.key));
|
|
207
|
+
for (const binding of next) {
|
|
208
|
+
if (!seen.has(binding.key)) {
|
|
209
|
+
target.push(binding);
|
|
210
|
+
seen.add(binding.key);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function getClaudeSessionCaptureConfig(mode) {
|
|
215
|
+
if (mode === "raw") {
|
|
216
|
+
return {
|
|
217
|
+
planLimit: 6,
|
|
218
|
+
planPreviewChars: 1800,
|
|
219
|
+
todoLimit: 6,
|
|
220
|
+
todoPreviewChars: 1000,
|
|
221
|
+
rawPlanLimit: 4,
|
|
222
|
+
rawPlanChars: 6000
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
if (mode === "rich") {
|
|
226
|
+
return {
|
|
227
|
+
planLimit: 5,
|
|
228
|
+
planPreviewChars: 900,
|
|
229
|
+
todoLimit: 5,
|
|
230
|
+
todoPreviewChars: 500,
|
|
231
|
+
rawPlanLimit: 0,
|
|
232
|
+
rawPlanChars: 0
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
planLimit: 3,
|
|
237
|
+
planPreviewChars: 280,
|
|
238
|
+
todoLimit: 0,
|
|
239
|
+
todoPreviewChars: 0,
|
|
240
|
+
rawPlanLimit: 0,
|
|
241
|
+
rawPlanChars: 0
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/probes/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ResolvedSnapshot } from "../core/types.js";
|
|
2
|
+
import type { HostDetection, HostProbe, ProbeContext } from "../collector/probe.js";
|
|
3
|
+
export declare class CodexProbe implements HostProbe {
|
|
4
|
+
readonly host: "codex";
|
|
5
|
+
detect(context: ProbeContext): Promise<HostDetection | null>;
|
|
6
|
+
collect(context: ProbeContext): Promise<{
|
|
7
|
+
resolved: ResolvedSnapshot;
|
|
8
|
+
sources: import("../core/types.js").SourceSnapshot;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { parse as parseToml } from "smol-toml";
|
|
3
|
+
import { createEmptyResolvedSnapshot, createEmptySources } from "../core/schemas.js";
|
|
4
|
+
import { countDirectoryEntries, detectFormat, listDirectoryNames, listRecentFiles, pathExists, readJsonIfExists, readTextIfExists, readTextPreview } from "../core/fs.js";
|
|
5
|
+
export class CodexProbe {
|
|
6
|
+
host = "codex";
|
|
7
|
+
async detect(context) {
|
|
8
|
+
const configPath = path.join(context.homeDir, ".codex", "config.toml");
|
|
9
|
+
if (!(await pathExists(configPath))) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
host: this.host,
|
|
14
|
+
confidence: 0.95,
|
|
15
|
+
reason: `Found ${configPath}`
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async collect(context) {
|
|
19
|
+
const resolved = createEmptyResolvedSnapshot(this.host);
|
|
20
|
+
const sources = createEmptySources();
|
|
21
|
+
const configPath = path.join(context.homeDir, ".codex", "config.toml");
|
|
22
|
+
const versionPath = path.join(context.homeDir, ".codex", "version.json");
|
|
23
|
+
try {
|
|
24
|
+
const raw = await readTextIfExists(configPath);
|
|
25
|
+
if (!raw) {
|
|
26
|
+
throw new Error("Codex config.toml not found.");
|
|
27
|
+
}
|
|
28
|
+
const parsed = parseToml(raw);
|
|
29
|
+
applyCodexConfig(resolved, parsed);
|
|
30
|
+
sources.records.push({ key: "host.config", sourcePath: configPath, layer: "preferences", origin: "user" }, { key: "tools.mcp", sourcePath: configPath, layer: "tools", origin: "user" });
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
resolved.hostArtifacts.push({
|
|
34
|
+
path: configPath,
|
|
35
|
+
detectedFormat: "toml",
|
|
36
|
+
probableCategory: "config",
|
|
37
|
+
portability: "opaque",
|
|
38
|
+
sensitivity: "internal"
|
|
39
|
+
});
|
|
40
|
+
sources.records.push({
|
|
41
|
+
key: "host.config.error",
|
|
42
|
+
sourcePath: configPath,
|
|
43
|
+
layer: "hostArtifacts",
|
|
44
|
+
origin: "user",
|
|
45
|
+
note: error instanceof Error ? error.message : String(error)
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const parsedVersion = await readJsonIfExists(versionPath);
|
|
50
|
+
if (!parsedVersion) {
|
|
51
|
+
throw new Error("version.json missing");
|
|
52
|
+
}
|
|
53
|
+
resolved.host.version = typeof parsedVersion.version === "string" ? parsedVersion.version : resolved.host.version;
|
|
54
|
+
sources.records.push({
|
|
55
|
+
key: "host.version",
|
|
56
|
+
sourcePath: versionPath,
|
|
57
|
+
layer: "runtime",
|
|
58
|
+
origin: "user"
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Version metadata is optional at this stage.
|
|
63
|
+
}
|
|
64
|
+
resolved.profile = await collectCodexProfile(context);
|
|
65
|
+
resolved.memory = await collectCodexMemory(context);
|
|
66
|
+
resolved.session = await collectCodexSession(context);
|
|
67
|
+
resolved.skills = await collectCodexSkills(context);
|
|
68
|
+
resolved.runtime = {
|
|
69
|
+
...resolved.runtime,
|
|
70
|
+
codexRoot: path.join(context.homeDir, ".codex"),
|
|
71
|
+
sessionFiles: await countDirectoryEntries(path.join(context.homeDir, ".codex", "sessions"), "file"),
|
|
72
|
+
sqliteFiles: await countDirectoryEntries(path.join(context.homeDir, ".codex", "sqlite"), "file")
|
|
73
|
+
};
|
|
74
|
+
resolved.hostArtifacts.push(...(await collectCodexArtifacts(context)));
|
|
75
|
+
sources.records.push({ key: "memory.codex", sourcePath: path.join(context.homeDir, ".codex", "memories"), layer: "memory", origin: "user" }, { key: "skills.codex", sourcePath: path.join(context.homeDir, ".codex", "skills"), layer: "skills", origin: "user" }, { key: "skills.shared", sourcePath: path.join(context.homeDir, ".agents"), layer: "skills", origin: "user" }, { key: "session.codex", sourcePath: path.join(context.homeDir, ".codex", "sessions"), layer: "session", origin: "user" });
|
|
76
|
+
return { resolved, sources };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function applyCodexConfig(resolved, parsed) {
|
|
80
|
+
resolved.host.version = typeof parsed.version === "string" ? parsed.version : undefined;
|
|
81
|
+
// Only collect MCP servers - don't collect model/provider/security settings
|
|
82
|
+
resolved.tools = {
|
|
83
|
+
mcpServers: parsed.mcp_servers ?? {}
|
|
84
|
+
};
|
|
85
|
+
resolved.runtime = {
|
|
86
|
+
platform: process.platform,
|
|
87
|
+
shell: process.env.SHELL ?? process.env.ComSpec
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async function collectCodexProfile(context) {
|
|
91
|
+
const projectClaudePath = path.join(context.cwd, "CLAUDE.md");
|
|
92
|
+
const projectInstruction = await readTextIfExists(projectClaudePath);
|
|
93
|
+
return {
|
|
94
|
+
projectInstructionPath: (await pathExists(projectClaudePath)) ? projectClaudePath : null,
|
|
95
|
+
projectInstructionContent: projectInstruction ?? null,
|
|
96
|
+
projectInstructionPreview: projectInstruction ? projectInstruction.slice(0, 280) : null
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async function collectCodexMemory(context) {
|
|
100
|
+
const memoriesRoot = path.join(context.homeDir, ".codex", "memories");
|
|
101
|
+
const projectName = path.basename(context.cwd).toLowerCase();
|
|
102
|
+
// 只采集文件名包含当前项目名的 memory 文件
|
|
103
|
+
const allMemoryFiles = await listRecentFiles(memoriesRoot, 50, [".md", ".txt", ".json", ".yaml"]);
|
|
104
|
+
const projectMemoryFiles = allMemoryFiles.filter(filePath => path.basename(filePath).toLowerCase().includes(projectName));
|
|
105
|
+
const excerpts = await Promise.all(projectMemoryFiles.slice(0, 8).map(async (filePath) => ({
|
|
106
|
+
path: filePath,
|
|
107
|
+
preview: await readTextPreview(filePath, 360)
|
|
108
|
+
})));
|
|
109
|
+
return {
|
|
110
|
+
memoriesRoot,
|
|
111
|
+
projectName,
|
|
112
|
+
projectMemoryFileCount: projectMemoryFiles.length,
|
|
113
|
+
sampleMemoryFiles: projectMemoryFiles.slice(0, 12),
|
|
114
|
+
memoryExcerpts: excerpts.filter((entry) => entry.preview),
|
|
115
|
+
portableSummary: projectMemoryFiles.length > 0
|
|
116
|
+
? `Captured ${excerpts.filter((entry) => entry.preview).length} memory files for project "${projectName}".`
|
|
117
|
+
: `No memory files found for project "${projectName}" in ~/.codex/memories.`
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async function collectCodexSession(context) {
|
|
121
|
+
const codexRoot = path.join(context.homeDir, ".codex");
|
|
122
|
+
const sessionsRoot = path.join(codexRoot, "sessions");
|
|
123
|
+
// 只采集最近的 session 文件(不采集全局 history.jsonl)
|
|
124
|
+
const recentSessionFiles = await listRecentFiles(sessionsRoot, 10, [".jsonl"]);
|
|
125
|
+
const result = {
|
|
126
|
+
captureMode: "full",
|
|
127
|
+
sessionsRoot,
|
|
128
|
+
recentSessionFiles: recentSessionFiles.map(f => ({ path: f })),
|
|
129
|
+
sessionFileCount: recentSessionFiles.length,
|
|
130
|
+
portableSummary: `Captured ${recentSessionFiles.length} recent session files from ~/.codex/sessions.`
|
|
131
|
+
};
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
async function collectCodexSkills(context) {
|
|
135
|
+
const codexSkillsRoot = path.join(context.homeDir, ".codex", "skills");
|
|
136
|
+
const vendorRoot = path.join(context.homeDir, ".codex", "vendor_imports", "skills", "skills");
|
|
137
|
+
const sharedSkillsRoot = path.join(context.homeDir, ".agents", "skills");
|
|
138
|
+
const lockPath = path.join(context.homeDir, ".agents", ".skill-lock.json");
|
|
139
|
+
const lock = await readJsonIfExists(lockPath);
|
|
140
|
+
return {
|
|
141
|
+
codexSkillNames: await listDirectoryNames(codexSkillsRoot, 100),
|
|
142
|
+
vendorSkillCollections: await listDirectoryNames(vendorRoot, 100),
|
|
143
|
+
sharedSkillNames: await listDirectoryNames(sharedSkillsRoot, 100),
|
|
144
|
+
lockfileSkills: lock && typeof lock.skills === "object" ? lock.skills : {}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
async function collectCodexArtifacts(context) {
|
|
148
|
+
const root = path.join(context.homeDir, ".codex");
|
|
149
|
+
const candidates = [
|
|
150
|
+
{ name: ".sandbox", category: "sandbox", portability: "host-specific", sensitivity: "internal" },
|
|
151
|
+
{ name: ".sandbox-secrets", category: "sandbox-secrets", portability: "opaque", sensitivity: "secret" },
|
|
152
|
+
{ name: "state_5.sqlite", category: "state-db", portability: "opaque", sensitivity: "internal" },
|
|
153
|
+
{ name: "vendor_imports", category: "vendor-imports", portability: "adaptable", sensitivity: "internal" },
|
|
154
|
+
{ name: "auth.json", category: "auth-file", portability: "opaque", sensitivity: "secret" }
|
|
155
|
+
];
|
|
156
|
+
const artifacts = [];
|
|
157
|
+
for (const candidate of candidates) {
|
|
158
|
+
const artifactPath = path.join(root, candidate.name);
|
|
159
|
+
if (await pathExists(artifactPath)) {
|
|
160
|
+
artifacts.push({
|
|
161
|
+
path: artifactPath,
|
|
162
|
+
detectedFormat: await detectFormat(artifactPath),
|
|
163
|
+
probableCategory: candidate.category,
|
|
164
|
+
portability: candidate.portability,
|
|
165
|
+
sensitivity: candidate.sensitivity
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return artifacts;
|
|
170
|
+
}
|
|
171
|
+
function pushBindings(target, next) {
|
|
172
|
+
const seen = new Set(target.map((entry) => entry.key));
|
|
173
|
+
for (const binding of next) {
|
|
174
|
+
if (!seen.has(binding.key)) {
|
|
175
|
+
target.push(binding);
|
|
176
|
+
seen.add(binding.key);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function getCodexSessionCaptureConfig(mode) {
|
|
181
|
+
if (mode === "raw") {
|
|
182
|
+
return {
|
|
183
|
+
historyReadLimit: 40,
|
|
184
|
+
promptLimit: 16,
|
|
185
|
+
promptChars: 600,
|
|
186
|
+
entryLimit: 16,
|
|
187
|
+
entryChars: 1500,
|
|
188
|
+
rawEntryLimit: 24,
|
|
189
|
+
rawEntryChars: 4000
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if (mode === "rich") {
|
|
193
|
+
return {
|
|
194
|
+
historyReadLimit: 24,
|
|
195
|
+
promptLimit: 12,
|
|
196
|
+
promptChars: 360,
|
|
197
|
+
entryLimit: 12,
|
|
198
|
+
entryChars: 900,
|
|
199
|
+
rawEntryLimit: 0,
|
|
200
|
+
rawEntryChars: 0
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
historyReadLimit: 12,
|
|
205
|
+
promptLimit: 8,
|
|
206
|
+
promptChars: 220,
|
|
207
|
+
entryLimit: 0,
|
|
208
|
+
entryChars: 0,
|
|
209
|
+
rawEntryLimit: 0,
|
|
210
|
+
rawEntryChars: 0
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function truncate(value, maxChars) {
|
|
214
|
+
if (value.length <= maxChars) {
|
|
215
|
+
return value;
|
|
216
|
+
}
|
|
217
|
+
return `${value.slice(0, Math.max(0, maxChars - 3))}...`;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/probes/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HostDetection, HostProbe, ProbeContext } from "../collector/probe.js";
|
|
2
|
+
export declare class CursorProbe implements HostProbe {
|
|
3
|
+
readonly host: "cursor";
|
|
4
|
+
detect(context: ProbeContext): Promise<HostDetection | null>;
|
|
5
|
+
collect(context: ProbeContext): Promise<{
|
|
6
|
+
resolved: import("../core/types.js").ResolvedSnapshot;
|
|
7
|
+
sources: import("../core/types.js").SourceSnapshot;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { createEmptyResolvedSnapshot, createEmptySources } from "../core/schemas.js";
|
|
3
|
+
import { countDirectoryEntries, detectFormat, listDirectoryNames, pathExists, readJsonIfExists } from "../core/fs.js";
|
|
4
|
+
export class CursorProbe {
|
|
5
|
+
host = "cursor";
|
|
6
|
+
async detect(context) {
|
|
7
|
+
const mcpPath = path.join(context.homeDir, ".cursor", "mcp.json");
|
|
8
|
+
if (!(await pathExists(mcpPath))) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
host: this.host,
|
|
13
|
+
confidence: 0.85,
|
|
14
|
+
reason: `Found ${mcpPath}`
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async collect(context) {
|
|
18
|
+
const resolved = createEmptyResolvedSnapshot(this.host);
|
|
19
|
+
const sources = createEmptySources();
|
|
20
|
+
const cursorRoot = path.join(context.homeDir, ".cursor");
|
|
21
|
+
const mcpPath = path.join(cursorRoot, "mcp.json");
|
|
22
|
+
const mcp = await readJsonIfExists(mcpPath);
|
|
23
|
+
resolved.profile = {
|
|
24
|
+
projectRulesDirExists: await pathExists(path.join(context.cwd, ".cursor")),
|
|
25
|
+
projectRulesFileExists: await pathExists(path.join(context.cwd, ".cursorrules"))
|
|
26
|
+
};
|
|
27
|
+
resolved.tools = {
|
|
28
|
+
mcpServers: mcp && typeof mcp.mcpServers === "object" ? mcp.mcpServers : {}
|
|
29
|
+
};
|
|
30
|
+
resolved.plugins = {
|
|
31
|
+
extensionCount: await countDirectoryEntries(path.join(cursorRoot, "extensions"), "directory"),
|
|
32
|
+
sampleExtensions: await listDirectoryNames(path.join(cursorRoot, "extensions"), 20)
|
|
33
|
+
};
|
|
34
|
+
resolved.session = {
|
|
35
|
+
captureMode: context.sessionMode,
|
|
36
|
+
snapshotCount: await countDirectoryEntries(path.join(cursorRoot, "snapshots"), "file"),
|
|
37
|
+
projectCount: await countDirectoryEntries(path.join(cursorRoot, "projects"), "directory")
|
|
38
|
+
};
|
|
39
|
+
resolved.runtime = {
|
|
40
|
+
platform: process.platform,
|
|
41
|
+
shell: process.env.SHELL ?? process.env.ComSpec,
|
|
42
|
+
cursorRoot
|
|
43
|
+
};
|
|
44
|
+
pushBindings(resolved.bindings, extractCursorBindings(mcp && typeof mcp.mcpServers === "object" ? mcp.mcpServers : {}));
|
|
45
|
+
resolved.hostArtifacts.push(...(await collectCursorArtifacts(cursorRoot)));
|
|
46
|
+
sources.records.push({ key: "cursor.mcp", sourcePath: mcpPath, layer: "tools", origin: "user" }, { key: "cursor.extensions", sourcePath: path.join(cursorRoot, "extensions"), layer: "plugins", origin: "user" }, { key: "cursor.projects", sourcePath: path.join(cursorRoot, "projects"), layer: "session", origin: "user" });
|
|
47
|
+
return { resolved, sources };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function extractCursorBindings(mcpServers) {
|
|
51
|
+
const bindings = [];
|
|
52
|
+
for (const [serverName, value] of Object.entries(mcpServers)) {
|
|
53
|
+
if (!value || typeof value !== "object") {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const server = value;
|
|
57
|
+
const env = server.env;
|
|
58
|
+
if (env && typeof env === "object") {
|
|
59
|
+
for (const key of Object.keys(env)) {
|
|
60
|
+
bindings.push({
|
|
61
|
+
key,
|
|
62
|
+
kind: key.includes("URL") ? "endpoint" : "secret",
|
|
63
|
+
required: true,
|
|
64
|
+
description: `Cursor MCP server "${serverName}" requires ${key}.`
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return bindings;
|
|
70
|
+
}
|
|
71
|
+
async function collectCursorArtifacts(cursorRoot) {
|
|
72
|
+
const candidates = [
|
|
73
|
+
{ name: "ai-tracking", category: "analytics", portability: "opaque", sensitivity: "internal" },
|
|
74
|
+
{ name: "browser-logs", category: "browser-logs", portability: "opaque", sensitivity: "internal" },
|
|
75
|
+
{ name: "skills-cursor", category: "skills-cache", portability: "host-specific", sensitivity: "internal" },
|
|
76
|
+
{ name: "ide_state.json", category: "ide-state", portability: "opaque", sensitivity: "internal" }
|
|
77
|
+
];
|
|
78
|
+
const artifacts = [];
|
|
79
|
+
for (const candidate of candidates) {
|
|
80
|
+
const artifactPath = path.join(cursorRoot, candidate.name);
|
|
81
|
+
if (await pathExists(artifactPath)) {
|
|
82
|
+
artifacts.push({
|
|
83
|
+
path: artifactPath,
|
|
84
|
+
detectedFormat: await detectFormat(artifactPath),
|
|
85
|
+
probableCategory: candidate.category,
|
|
86
|
+
portability: candidate.portability,
|
|
87
|
+
sensitivity: candidate.sensitivity
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return artifacts;
|
|
92
|
+
}
|
|
93
|
+
function pushBindings(target, next) {
|
|
94
|
+
const seen = new Set(target.map((entry) => entry.key));
|
|
95
|
+
for (const binding of next) {
|
|
96
|
+
if (!seen.has(binding.key)) {
|
|
97
|
+
target.push(binding);
|
|
98
|
+
seen.add(binding.key);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/probes/cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HostDetection, HostProbe, ProbeContext } from "../collector/probe.js";
|
|
2
|
+
export declare class OpenClawProbe implements HostProbe {
|
|
3
|
+
readonly host: "openclaw";
|
|
4
|
+
detect(context: ProbeContext): Promise<HostDetection | null>;
|
|
5
|
+
collect(context: ProbeContext): Promise<{
|
|
6
|
+
resolved: import("../core/types.js").ResolvedSnapshot;
|
|
7
|
+
sources: import("../core/types.js").SourceSnapshot;
|
|
8
|
+
}>;
|
|
9
|
+
}
|