@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.
Files changed (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +253 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +43 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/collector/collector.d.ts +15 -0
  7. package/dist/collector/collector.js +118 -0
  8. package/dist/collector/collector.js.map +1 -0
  9. package/dist/collector/known-layers.d.ts +2 -0
  10. package/dist/collector/known-layers.js +15 -0
  11. package/dist/collector/known-layers.js.map +1 -0
  12. package/dist/collector/probe.d.ts +19 -0
  13. package/dist/collector/probe.js +2 -0
  14. package/dist/collector/probe.js.map +1 -0
  15. package/dist/commands/apply.d.ts +10 -0
  16. package/dist/commands/apply.js +234 -0
  17. package/dist/commands/apply.js.map +1 -0
  18. package/dist/commands/bind.d.ts +8 -0
  19. package/dist/commands/bind.js +78 -0
  20. package/dist/commands/bind.js.map +1 -0
  21. package/dist/commands/collect.d.ts +8 -0
  22. package/dist/commands/collect.js +22 -0
  23. package/dist/commands/collect.js.map +1 -0
  24. package/dist/commands/export.d.ts +6 -0
  25. package/dist/commands/export.js +24 -0
  26. package/dist/commands/export.js.map +1 -0
  27. package/dist/commands/import-simple.d.ts +6 -0
  28. package/dist/commands/import-simple.js +96 -0
  29. package/dist/commands/import-simple.js.map +1 -0
  30. package/dist/commands/import.d.ts +8 -0
  31. package/dist/commands/import.js +108 -0
  32. package/dist/commands/import.js.map +1 -0
  33. package/dist/commands/inspect.d.ts +1 -0
  34. package/dist/commands/inspect.js +21 -0
  35. package/dist/commands/inspect.js.map +1 -0
  36. package/dist/commands/install-skills.d.ts +11 -0
  37. package/dist/commands/install-skills.js +316 -0
  38. package/dist/commands/install-skills.js.map +1 -0
  39. package/dist/commands/pack.d.ts +4 -0
  40. package/dist/commands/pack.js +37 -0
  41. package/dist/commands/pack.js.map +1 -0
  42. package/dist/commands/preview.d.ts +8 -0
  43. package/dist/commands/preview.js +108 -0
  44. package/dist/commands/preview.js.map +1 -0
  45. package/dist/commands/unpack.d.ts +4 -0
  46. package/dist/commands/unpack.js +45 -0
  47. package/dist/commands/unpack.js.map +1 -0
  48. package/dist/core/archive.d.ts +2 -0
  49. package/dist/core/archive.js +46 -0
  50. package/dist/core/archive.js.map +1 -0
  51. package/dist/core/bindings.d.ts +22 -0
  52. package/dist/core/bindings.js +46 -0
  53. package/dist/core/bindings.js.map +1 -0
  54. package/dist/core/env.d.ts +13 -0
  55. package/dist/core/env.js +49 -0
  56. package/dist/core/env.js.map +1 -0
  57. package/dist/core/fs.d.ts +12 -0
  58. package/dist/core/fs.js +233 -0
  59. package/dist/core/fs.js.map +1 -0
  60. package/dist/core/materialize.d.ts +10 -0
  61. package/dist/core/materialize.js +54 -0
  62. package/dist/core/materialize.js.map +1 -0
  63. package/dist/core/redaction.d.ts +25 -0
  64. package/dist/core/redaction.js +184 -0
  65. package/dist/core/redaction.js.map +1 -0
  66. package/dist/core/schemas.d.ts +9 -0
  67. package/dist/core/schemas.js +60 -0
  68. package/dist/core/schemas.js.map +1 -0
  69. package/dist/core/types.d.ts +125 -0
  70. package/dist/core/types.js +2 -0
  71. package/dist/core/types.js.map +1 -0
  72. package/dist/core/yaml.d.ts +1 -0
  73. package/dist/core/yaml.js +8 -0
  74. package/dist/core/yaml.js.map +1 -0
  75. package/dist/import/claude-code.d.ts +3 -0
  76. package/dist/import/claude-code.js +182 -0
  77. package/dist/import/claude-code.js.map +1 -0
  78. package/dist/import/codex.d.ts +3 -0
  79. package/dist/import/codex.js +162 -0
  80. package/dist/import/codex.js.map +1 -0
  81. package/dist/import/compatibility.d.ts +42 -0
  82. package/dist/import/compatibility.js +99 -0
  83. package/dist/import/compatibility.js.map +1 -0
  84. package/dist/import/install-plan.d.ts +43 -0
  85. package/dist/import/install-plan.js +125 -0
  86. package/dist/import/install-plan.js.map +1 -0
  87. package/dist/import/openclaw.d.ts +3 -0
  88. package/dist/import/openclaw.js +128 -0
  89. package/dist/import/openclaw.js.map +1 -0
  90. package/dist/import/portable.d.ts +6 -0
  91. package/dist/import/portable.js +394 -0
  92. package/dist/import/portable.js.map +1 -0
  93. package/dist/import/types.d.ts +21 -0
  94. package/dist/import/types.js +2 -0
  95. package/dist/import/types.js.map +1 -0
  96. package/dist/probes/claude-code.d.ts +9 -0
  97. package/dist/probes/claude-code.js +244 -0
  98. package/dist/probes/claude-code.js.map +1 -0
  99. package/dist/probes/codex.d.ts +10 -0
  100. package/dist/probes/codex.js +219 -0
  101. package/dist/probes/codex.js.map +1 -0
  102. package/dist/probes/cursor.d.ts +9 -0
  103. package/dist/probes/cursor.js +102 -0
  104. package/dist/probes/cursor.js.map +1 -0
  105. package/dist/probes/openclaw.d.ts +9 -0
  106. package/dist/probes/openclaw.js +52 -0
  107. package/dist/probes/openclaw.js.map +1 -0
  108. 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
+ }