link-agents 0.9.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/AGENTS.md +127 -0
- package/README.md +93 -0
- package/cursor-rules-notes.md +23 -0
- package/dist/cli/interactive.d.ts +9 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +1176 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/options.d.ts +3 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +107 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/options.spec.d.ts +2 -0
- package/dist/cli/options.spec.d.ts.map +1 -0
- package/dist/cli/options.spec.js +74 -0
- package/dist/cli/options.spec.js.map +1 -0
- package/dist/clients/definitions.d.ts +5 -0
- package/dist/clients/definitions.d.ts.map +1 -0
- package/dist/clients/definitions.js +82 -0
- package/dist/clients/definitions.js.map +1 -0
- package/dist/clients/definitions.spec.d.ts +2 -0
- package/dist/clients/definitions.spec.d.ts.map +1 -0
- package/dist/clients/definitions.spec.js +135 -0
- package/dist/clients/definitions.spec.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +81 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/restore.d.ts +3 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +36 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +193 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +98 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/apply.d.ts +22 -0
- package/dist/utils/apply.d.ts.map +1 -0
- package/dist/utils/apply.js +215 -0
- package/dist/utils/apply.js.map +1 -0
- package/dist/utils/bootstrap.d.ts +18 -0
- package/dist/utils/bootstrap.d.ts.map +1 -0
- package/dist/utils/bootstrap.js +31 -0
- package/dist/utils/bootstrap.js.map +1 -0
- package/dist/utils/bootstrap.spec.d.ts +2 -0
- package/dist/utils/bootstrap.spec.d.ts.map +1 -0
- package/dist/utils/bootstrap.spec.js +92 -0
- package/dist/utils/bootstrap.spec.js.map +1 -0
- package/dist/utils/canonical.d.ts +17 -0
- package/dist/utils/canonical.d.ts.map +1 -0
- package/dist/utils/canonical.js +136 -0
- package/dist/utils/canonical.js.map +1 -0
- package/dist/utils/canonicalState.d.ts +19 -0
- package/dist/utils/canonicalState.d.ts.map +1 -0
- package/dist/utils/canonicalState.js +21 -0
- package/dist/utils/canonicalState.js.map +1 -0
- package/dist/utils/cursorHistory.d.ts +7 -0
- package/dist/utils/cursorHistory.d.ts.map +1 -0
- package/dist/utils/cursorHistory.js +54 -0
- package/dist/utils/cursorHistory.js.map +1 -0
- package/dist/utils/cursorPaths.d.ts +3 -0
- package/dist/utils/cursorPaths.d.ts.map +1 -0
- package/dist/utils/cursorPaths.js +17 -0
- package/dist/utils/cursorPaths.js.map +1 -0
- package/dist/utils/discovery.d.ts +8 -0
- package/dist/utils/discovery.d.ts.map +1 -0
- package/dist/utils/discovery.js +93 -0
- package/dist/utils/discovery.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +32 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +263 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/frontmatter.spec.d.ts +2 -0
- package/dist/utils/frontmatter.spec.d.ts.map +1 -0
- package/dist/utils/frontmatter.spec.js +264 -0
- package/dist/utils/frontmatter.spec.js.map +1 -0
- package/dist/utils/fs.d.ts +27 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +137 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/fs.spec.d.ts +2 -0
- package/dist/utils/fs.spec.d.ts.map +1 -0
- package/dist/utils/fs.spec.js +73 -0
- package/dist/utils/fs.spec.js.map +1 -0
- package/dist/utils/gitignore.d.ts +10 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +63 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/manifest.d.ts +28 -0
- package/dist/utils/manifest.d.ts.map +1 -0
- package/dist/utils/manifest.js +89 -0
- package/dist/utils/manifest.js.map +1 -0
- package/dist/utils/mcp.d.ts +73 -0
- package/dist/utils/mcp.d.ts.map +1 -0
- package/dist/utils/mcp.js +529 -0
- package/dist/utils/mcp.js.map +1 -0
- package/dist/utils/mcp.spec.d.ts +2 -0
- package/dist/utils/mcp.spec.d.ts.map +1 -0
- package/dist/utils/mcp.spec.js +488 -0
- package/dist/utils/mcp.spec.js.map +1 -0
- package/dist/utils/merge.d.ts +17 -0
- package/dist/utils/merge.d.ts.map +1 -0
- package/dist/utils/merge.js +45 -0
- package/dist/utils/merge.js.map +1 -0
- package/dist/utils/merge.spec.d.ts +2 -0
- package/dist/utils/merge.spec.d.ts.map +1 -0
- package/dist/utils/merge.spec.js +134 -0
- package/dist/utils/merge.spec.js.map +1 -0
- package/dist/utils/paths.d.ts +11 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +164 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/paths.spec.d.ts +2 -0
- package/dist/utils/paths.spec.d.ts.map +1 -0
- package/dist/utils/paths.spec.js +282 -0
- package/dist/utils/paths.spec.js.map +1 -0
- package/dist/utils/plan.d.ts +7 -0
- package/dist/utils/plan.d.ts.map +1 -0
- package/dist/utils/plan.js +118 -0
- package/dist/utils/plan.js.map +1 -0
- package/dist/utils/plan.spec.d.ts +2 -0
- package/dist/utils/plan.spec.d.ts.map +1 -0
- package/dist/utils/plan.spec.js +420 -0
- package/dist/utils/plan.spec.js.map +1 -0
- package/dist/utils/reporting.d.ts +21 -0
- package/dist/utils/reporting.d.ts.map +1 -0
- package/dist/utils/reporting.js +82 -0
- package/dist/utils/reporting.js.map +1 -0
- package/dist/utils/reporting.spec.d.ts +2 -0
- package/dist/utils/reporting.spec.d.ts.map +1 -0
- package/dist/utils/reporting.spec.js +78 -0
- package/dist/utils/reporting.spec.js.map +1 -0
- package/dist/utils/reset.d.ts +14 -0
- package/dist/utils/reset.d.ts.map +1 -0
- package/dist/utils/reset.js +81 -0
- package/dist/utils/reset.js.map +1 -0
- package/dist/utils/revert.d.ts +30 -0
- package/dist/utils/revert.d.ts.map +1 -0
- package/dist/utils/revert.js +89 -0
- package/dist/utils/revert.js.map +1 -0
- package/dist/utils/revert.spec.d.ts +2 -0
- package/dist/utils/revert.spec.d.ts.map +1 -0
- package/dist/utils/revert.spec.js +102 -0
- package/dist/utils/revert.spec.js.map +1 -0
- package/dist/utils/similarity.d.ts +14 -0
- package/dist/utils/similarity.d.ts.map +1 -0
- package/dist/utils/similarity.js +70 -0
- package/dist/utils/similarity.js.map +1 -0
- package/dist/utils/similarity.spec.d.ts +2 -0
- package/dist/utils/similarity.spec.d.ts.map +1 -0
- package/dist/utils/similarity.spec.js +62 -0
- package/dist/utils/similarity.spec.js.map +1 -0
- package/dist/utils/snapshots.d.ts +21 -0
- package/dist/utils/snapshots.d.ts.map +1 -0
- package/dist/utils/snapshots.js +81 -0
- package/dist/utils/snapshots.js.map +1 -0
- package/dist/utils/snapshots.spec.d.ts +2 -0
- package/dist/utils/snapshots.spec.d.ts.map +1 -0
- package/dist/utils/snapshots.spec.js +56 -0
- package/dist/utils/snapshots.spec.js.map +1 -0
- package/dist/utils/syncFilters.d.ts +3 -0
- package/dist/utils/syncFilters.d.ts.map +1 -0
- package/dist/utils/syncFilters.js +8 -0
- package/dist/utils/syncFilters.js.map +1 -0
- package/dist/utils/syncRuntime.d.ts +3 -0
- package/dist/utils/syncRuntime.d.ts.map +1 -0
- package/dist/utils/syncRuntime.js +31 -0
- package/dist/utils/syncRuntime.js.map +1 -0
- package/dist/utils/validation.d.ts +3 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +19 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/validation.spec.d.ts +2 -0
- package/dist/utils/validation.spec.d.ts.map +1 -0
- package/dist/utils/validation.spec.js +36 -0
- package/dist/utils/validation.spec.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fg from 'fast-glob';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { fileExists, readFileSafe, writeFileSafe, expandHome } from './fs.js';
|
|
5
|
+
import { getCursorHistoryRoot, defaultCursorHistoryExportPath } from './cursorPaths.js';
|
|
6
|
+
import { normalizeRelativePath } from './paths.js';
|
|
7
|
+
export async function exportCursorHistory(options = {}) {
|
|
8
|
+
const historyRoot = getCursorHistoryRoot();
|
|
9
|
+
const exists = await fileExists(historyRoot);
|
|
10
|
+
if (!exists) {
|
|
11
|
+
if (options.verbose) {
|
|
12
|
+
console.log(chalk.gray('No Cursor history directory found, skipping export.'));
|
|
13
|
+
}
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const files = await fg(['**/*.md'], {
|
|
17
|
+
cwd: historyRoot,
|
|
18
|
+
dot: true,
|
|
19
|
+
onlyFiles: true,
|
|
20
|
+
unique: true,
|
|
21
|
+
});
|
|
22
|
+
if (files.length === 0) {
|
|
23
|
+
if (options.verbose) {
|
|
24
|
+
console.log(chalk.gray('No Cursor history markdown files detected.'));
|
|
25
|
+
}
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const sections = [];
|
|
29
|
+
for (const rel of files.sort()) {
|
|
30
|
+
const abs = path.join(historyRoot, rel);
|
|
31
|
+
const content = await readFileSafe(abs);
|
|
32
|
+
if (content === null) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
sections.push(`## ${normalizeRelativePath(rel)}\n\n${content.trim()}`);
|
|
36
|
+
}
|
|
37
|
+
if (sections.length === 0) {
|
|
38
|
+
if (options.verbose) {
|
|
39
|
+
console.log(chalk.gray('No readable Cursor history files found.'));
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const destination = resolveDestinationPath(options.destination ?? defaultCursorHistoryExportPath());
|
|
44
|
+
await writeFileSafe(destination, `${sections.join('\n\n---\n\n')}\n`);
|
|
45
|
+
console.log(chalk.green(`Cursor history exported to ${destination}`));
|
|
46
|
+
}
|
|
47
|
+
function resolveDestinationPath(inputPath) {
|
|
48
|
+
const expanded = expandHome(inputPath);
|
|
49
|
+
if (path.isAbsolute(expanded)) {
|
|
50
|
+
return expanded;
|
|
51
|
+
}
|
|
52
|
+
return path.join(process.cwd(), expanded);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=cursorHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursorHistory.js","sourceRoot":"","sources":["../../src/utils/cursorHistory.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAOnD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAyB,EAAE;IACnE,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE;QAClC,GAAG,EAAE,WAAW;QAChB,GAAG,EAAE,IAAI;QACT,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,MAAM,qBAAqB,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,WAAW,IAAI,8BAA8B,EAAE,CAAC,CAAC;IACpG,MAAM,aAAa,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAEtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAiB;IAC/C,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursorPaths.d.ts","sourceRoot":"","sources":["../../src/utils/cursorPaths.ts"],"names":[],"mappings":"AAKA,wBAAgB,oBAAoB,IAAI,MAAM,CAiB7C;AAED,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
const HOME = os.homedir();
|
|
4
|
+
export function getCursorHistoryRoot() {
|
|
5
|
+
if (process.platform === "darwin") {
|
|
6
|
+
return path.join(HOME, "Library", "Application Support", "Cursor", "User", "History");
|
|
7
|
+
}
|
|
8
|
+
if (process.platform === "win32") {
|
|
9
|
+
const roaming = process.env.APPDATA || path.join(HOME, "AppData", "Roaming");
|
|
10
|
+
return path.join(roaming, "Cursor", "User", "History");
|
|
11
|
+
}
|
|
12
|
+
return path.join(HOME, ".config", "Cursor", "User", "History");
|
|
13
|
+
}
|
|
14
|
+
export function defaultCursorHistoryExportPath() {
|
|
15
|
+
return path.join(HOME, ".cursor", "AGENTS.md");
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=cursorPaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursorPaths.js","sourceRoot":"","sources":["../../src/utils/cursorPaths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;AAE1B,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CACd,IAAI,EACJ,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,MAAM,EACN,SAAS,CACV,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AssetContent, AssetType, ClientDefinition } from "../types/index.js";
|
|
2
|
+
interface DiscoveryFilters {
|
|
3
|
+
types?: AssetType[];
|
|
4
|
+
clients?: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function discoverAssets(definitions: ClientDefinition[], filters?: DiscoveryFilters): Promise<AssetContent[]>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/utils/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAI3B,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,cAAc,CAClC,WAAW,EAAE,gBAAgB,EAAE,EAC/B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CA2EzB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fg from "fast-glob";
|
|
3
|
+
import { fileExists, hashContent, readFileSafe, getFileMtime } from "./fs.js";
|
|
4
|
+
import { canonicalizeRelativePath, normalizeRelativePath } from "./paths.js";
|
|
5
|
+
export async function discoverAssets(definitions, filters = {}) {
|
|
6
|
+
const out = [];
|
|
7
|
+
for (const def of definitions) {
|
|
8
|
+
const rootExists = await fileExists(def.root);
|
|
9
|
+
if (!rootExists) {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
for (const assetDef of def.assets) {
|
|
13
|
+
if (filters.types && !filters.types.includes(assetDef.type)) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const matches = await fg(assetDef.patterns, {
|
|
17
|
+
cwd: def.root,
|
|
18
|
+
dot: true,
|
|
19
|
+
onlyFiles: true,
|
|
20
|
+
absolute: true,
|
|
21
|
+
unique: true,
|
|
22
|
+
});
|
|
23
|
+
if (assetDef.files) {
|
|
24
|
+
for (const rel of assetDef.files) {
|
|
25
|
+
matches.push(path.join(def.root, rel));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
for (const absPath of matches) {
|
|
29
|
+
const exists = await fileExists(absPath);
|
|
30
|
+
if (!exists) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const content = await readFileSafe(absPath);
|
|
34
|
+
if (content === null) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const modifiedAt = await getFileMtime(absPath);
|
|
38
|
+
const relativeRaw = path.relative(def.root, absPath) || path.basename(absPath);
|
|
39
|
+
const normalizedRelative = normalizeRelativePath(relativeRaw);
|
|
40
|
+
let canonicalPath = canonicalizeRelativePath(def.name, assetDef.type, normalizedRelative);
|
|
41
|
+
let metadata;
|
|
42
|
+
if (def.name === "cursor" && assetDef.type === "rules") {
|
|
43
|
+
const classification = classifyCursorRule(content);
|
|
44
|
+
if (classification?.alwaysApply === false) {
|
|
45
|
+
canonicalPath =
|
|
46
|
+
buildCursorConditionalCanonicalPath(normalizedRelative);
|
|
47
|
+
}
|
|
48
|
+
metadata = { cursorRule: classification };
|
|
49
|
+
}
|
|
50
|
+
out.push({
|
|
51
|
+
client: def.name,
|
|
52
|
+
type: assetDef.type,
|
|
53
|
+
path: absPath,
|
|
54
|
+
relativePath: normalizedRelative,
|
|
55
|
+
canonicalPath,
|
|
56
|
+
name: deriveAssetName(def.root, absPath),
|
|
57
|
+
content,
|
|
58
|
+
hash: hashContent(content),
|
|
59
|
+
metadata,
|
|
60
|
+
modifiedAt: modifiedAt ?? undefined,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// NOTE: Cursor history discovery disabled - it includes editor file history
|
|
65
|
+
// (backups of all edited files), not agent rules.
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
function deriveAssetName(root, absPath) {
|
|
70
|
+
const relative = path.relative(root, absPath);
|
|
71
|
+
const normalized = relative.replace(/\\/g, "/");
|
|
72
|
+
const segments = normalized.split("/");
|
|
73
|
+
const file = segments.pop() ?? normalized;
|
|
74
|
+
const withoutExt = file.replace(/\.[^.]+$/, "");
|
|
75
|
+
return (`${segments.join("/")}${segments.length ? "/" : ""}${withoutExt}`.replace(/\/$/, "") || withoutExt);
|
|
76
|
+
}
|
|
77
|
+
function classifyCursorRule(content) {
|
|
78
|
+
const match = content.match(/---\s*([\s\S]*?)---/);
|
|
79
|
+
if (!match) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const alwaysMatch = match[1].match(/alwaysApply\s*:\s*(true|false)/i);
|
|
83
|
+
if (!alwaysMatch) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
return { alwaysApply: alwaysMatch[1].toLowerCase() === "true" };
|
|
87
|
+
}
|
|
88
|
+
function buildCursorConditionalCanonicalPath(relativePath) {
|
|
89
|
+
const normalized = normalizeRelativePath(relativePath);
|
|
90
|
+
const withoutRules = normalized.replace(/^rules\/?/, "");
|
|
91
|
+
return normalizeRelativePath(path.posix.join("skills", "cursor-rules", withoutRules));
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/utils/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AgentClientName, AssetType } from "../types/index.js";
|
|
2
|
+
interface FrontmatterData {
|
|
3
|
+
[key: string]: unknown;
|
|
4
|
+
}
|
|
5
|
+
interface ParsedMarkdown {
|
|
6
|
+
frontmatter: FrontmatterData | null;
|
|
7
|
+
body: string;
|
|
8
|
+
raw: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse YAML frontmatter from markdown content.
|
|
12
|
+
* Simple parser that handles common cases without external deps.
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseFrontmatter(content: string): ParsedMarkdown;
|
|
15
|
+
/**
|
|
16
|
+
* Reconstruct markdown with new frontmatter.
|
|
17
|
+
*/
|
|
18
|
+
export declare function reconstructMarkdown(frontmatter: FrontmatterData, body: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Transform agent frontmatter for OpenCode compatibility.
|
|
21
|
+
* Uses regex-based surgical replacement to preserve original formatting.
|
|
22
|
+
* OpenCode requires:
|
|
23
|
+
* - tools: Record<string, boolean> (not comma-separated string or array)
|
|
24
|
+
* - color: hex format (#RRGGBB)
|
|
25
|
+
*/
|
|
26
|
+
export declare function transformForOpenCode(content: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Transform content based on target client requirements.
|
|
29
|
+
*/
|
|
30
|
+
export declare function transformContentForClient(content: string, targetClient: AgentClientName, assetType: AssetType): string;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpE,UAAU,eAAe;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,cAAc;IACtB,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAYhE;AA6GD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,eAAe,EAC5B,IAAI,EAAE,MAAM,GACX,MAAM,CA0BR;AAmBD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA6C5D;AA2DD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,eAAe,EAC7B,SAAS,EAAE,SAAS,GACnB,MAAM,CAgBR"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
const FRONTMATTER_REGEX = /^---\r?\n([\s\S]*?)\r?\n---\r?\n/;
|
|
2
|
+
/**
|
|
3
|
+
* Parse YAML frontmatter from markdown content.
|
|
4
|
+
* Simple parser that handles common cases without external deps.
|
|
5
|
+
*/
|
|
6
|
+
export function parseFrontmatter(content) {
|
|
7
|
+
const match = content.match(FRONTMATTER_REGEX);
|
|
8
|
+
if (!match) {
|
|
9
|
+
return { frontmatter: null, body: content, raw: content };
|
|
10
|
+
}
|
|
11
|
+
const yamlContent = match[1];
|
|
12
|
+
const body = content.slice(match[0].length);
|
|
13
|
+
const frontmatter = parseSimpleYaml(yamlContent);
|
|
14
|
+
return { frontmatter, body, raw: content };
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Simple YAML parser for frontmatter.
|
|
18
|
+
* Handles: scalar values, arrays, simple nested objects.
|
|
19
|
+
* Does NOT handle: multiline strings, anchors/aliases, flow syntax, deeply nested structures.
|
|
20
|
+
* Intentionally minimal to avoid external deps for simple frontmatter use cases.
|
|
21
|
+
*/
|
|
22
|
+
function parseSimpleYaml(yaml) {
|
|
23
|
+
const result = {};
|
|
24
|
+
const lines = yaml.split("\n");
|
|
25
|
+
let currentKey = null;
|
|
26
|
+
let currentArray = null;
|
|
27
|
+
let currentObject = null;
|
|
28
|
+
let indent = 0;
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
const trimmed = line.trim();
|
|
31
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
32
|
+
continue;
|
|
33
|
+
const lineIndent = line.search(/\S/);
|
|
34
|
+
// Array item
|
|
35
|
+
if (trimmed.startsWith("- ")) {
|
|
36
|
+
const value = trimmed.slice(2).trim();
|
|
37
|
+
if (currentArray && lineIndent > indent) {
|
|
38
|
+
currentArray.push(parseYamlValue(value));
|
|
39
|
+
}
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// Key-value pair with nested object
|
|
43
|
+
if (trimmed.includes(": ") &&
|
|
44
|
+
lineIndent > indent &&
|
|
45
|
+
currentKey &&
|
|
46
|
+
currentObject) {
|
|
47
|
+
const colonIdx = trimmed.indexOf(":");
|
|
48
|
+
const key = trimmed.slice(0, colonIdx).trim();
|
|
49
|
+
const value = trimmed.slice(colonIdx + 1).trim();
|
|
50
|
+
currentObject[key] = parseYamlValue(value);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Top-level key
|
|
54
|
+
const colonIdx = trimmed.indexOf(":");
|
|
55
|
+
if (colonIdx > 0) {
|
|
56
|
+
// Finish previous key
|
|
57
|
+
if (currentKey && currentArray) {
|
|
58
|
+
result[currentKey] = currentArray;
|
|
59
|
+
}
|
|
60
|
+
else if (currentKey && currentObject) {
|
|
61
|
+
result[currentKey] = currentObject;
|
|
62
|
+
}
|
|
63
|
+
const key = trimmed.slice(0, colonIdx).trim();
|
|
64
|
+
const value = trimmed.slice(colonIdx + 1).trim();
|
|
65
|
+
currentKey = key;
|
|
66
|
+
indent = lineIndent;
|
|
67
|
+
if (value === "") {
|
|
68
|
+
// Could be array or object, check next line
|
|
69
|
+
currentArray = [];
|
|
70
|
+
currentObject = {};
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
result[key] = parseYamlValue(value);
|
|
74
|
+
currentKey = null;
|
|
75
|
+
currentArray = null;
|
|
76
|
+
currentObject = null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Finish last key
|
|
81
|
+
if (currentKey && currentArray && currentArray.length > 0) {
|
|
82
|
+
result[currentKey] = currentArray;
|
|
83
|
+
}
|
|
84
|
+
else if (currentKey &&
|
|
85
|
+
currentObject &&
|
|
86
|
+
Object.keys(currentObject).length > 0) {
|
|
87
|
+
result[currentKey] = currentObject;
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
function parseYamlValue(value) {
|
|
92
|
+
if (value === "true")
|
|
93
|
+
return true;
|
|
94
|
+
if (value === "false")
|
|
95
|
+
return false;
|
|
96
|
+
if (value === "null" || value === "~")
|
|
97
|
+
return null;
|
|
98
|
+
// Quoted string
|
|
99
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
100
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
101
|
+
return value.slice(1, -1);
|
|
102
|
+
}
|
|
103
|
+
// Number
|
|
104
|
+
const num = Number(value);
|
|
105
|
+
if (!isNaN(num) && value !== "")
|
|
106
|
+
return num;
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Reconstruct markdown with new frontmatter.
|
|
111
|
+
*/
|
|
112
|
+
export function reconstructMarkdown(frontmatter, body) {
|
|
113
|
+
const lines = [];
|
|
114
|
+
for (const [key, value] of Object.entries(frontmatter)) {
|
|
115
|
+
if (value === null || value === undefined)
|
|
116
|
+
continue;
|
|
117
|
+
if (Array.isArray(value)) {
|
|
118
|
+
lines.push(`${key}:`);
|
|
119
|
+
for (const item of value) {
|
|
120
|
+
lines.push(` - ${item}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else if (typeof value === "object") {
|
|
124
|
+
lines.push(`${key}:`);
|
|
125
|
+
for (const [k, v] of Object.entries(value)) {
|
|
126
|
+
lines.push(` ${k}: ${v}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else if (typeof value === "boolean") {
|
|
130
|
+
lines.push(`${key}: ${value}`);
|
|
131
|
+
}
|
|
132
|
+
else if (typeof value === "number") {
|
|
133
|
+
lines.push(`${key}: ${value}`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
lines.push(`${key}: ${value}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return `---\n${lines.join("\n")}\n---\n${body}`;
|
|
140
|
+
}
|
|
141
|
+
const COLOR_MAP = {
|
|
142
|
+
purple: "#9B59B6",
|
|
143
|
+
blue: "#3498DB",
|
|
144
|
+
green: "#27AE60",
|
|
145
|
+
red: "#E74C3C",
|
|
146
|
+
orange: "#E67E22",
|
|
147
|
+
yellow: "#F1C40F",
|
|
148
|
+
pink: "#E91E63",
|
|
149
|
+
cyan: "#00BCD4",
|
|
150
|
+
teal: "#009688",
|
|
151
|
+
indigo: "#3F51B5",
|
|
152
|
+
gray: "#95A5A6",
|
|
153
|
+
grey: "#95A5A6",
|
|
154
|
+
black: "#000000",
|
|
155
|
+
white: "#FFFFFF",
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Transform agent frontmatter for OpenCode compatibility.
|
|
159
|
+
* Uses regex-based surgical replacement to preserve original formatting.
|
|
160
|
+
* OpenCode requires:
|
|
161
|
+
* - tools: Record<string, boolean> (not comma-separated string or array)
|
|
162
|
+
* - color: hex format (#RRGGBB)
|
|
163
|
+
*/
|
|
164
|
+
export function transformForOpenCode(content) {
|
|
165
|
+
const match = content.match(FRONTMATTER_REGEX);
|
|
166
|
+
if (!match)
|
|
167
|
+
return content;
|
|
168
|
+
let frontmatterYaml = match[1];
|
|
169
|
+
let modified = false;
|
|
170
|
+
// Transform tools from comma-separated string to object format
|
|
171
|
+
// Match: tools: Read, Edit, Bash (single line, comma-separated)
|
|
172
|
+
const toolsStringMatch = frontmatterYaml.match(/^(tools:\s*)([A-Za-z][A-Za-z0-9_,\s]+)$/m);
|
|
173
|
+
if (toolsStringMatch) {
|
|
174
|
+
const toolsList = toolsStringMatch[2]
|
|
175
|
+
.split(",")
|
|
176
|
+
.map((t) => t.trim())
|
|
177
|
+
.filter(Boolean);
|
|
178
|
+
// Only transform if it looks like a comma-separated list (not already object format)
|
|
179
|
+
if (toolsList.length > 0 && !toolsStringMatch[2].includes(":")) {
|
|
180
|
+
const toolsYaml = "tools:\n" + toolsList.map((t) => ` ${t}: true`).join("\n");
|
|
181
|
+
frontmatterYaml = frontmatterYaml.replace(toolsStringMatch[0], toolsYaml);
|
|
182
|
+
modified = true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Transform color from named color to hex
|
|
186
|
+
const colorMatch = frontmatterYaml.match(/^(color:\s*)([a-zA-Z]+)\s*$/m);
|
|
187
|
+
if (colorMatch) {
|
|
188
|
+
const colorName = colorMatch[2].toLowerCase();
|
|
189
|
+
const hex = COLOR_MAP[colorName];
|
|
190
|
+
if (hex) {
|
|
191
|
+
frontmatterYaml = frontmatterYaml.replace(colorMatch[0], `color: "${hex}"`);
|
|
192
|
+
modified = true;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (!modified)
|
|
196
|
+
return content;
|
|
197
|
+
// Reconstruct with modified frontmatter
|
|
198
|
+
const body = content.slice(match[0].length);
|
|
199
|
+
return `---\n${frontmatterYaml}\n---\n${body}`;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Client-specific frontmatter keys stripped when syncing to incompatible clients.
|
|
203
|
+
*/
|
|
204
|
+
const CURSOR_ONLY_KEYS = ["argument-hint", "model"];
|
|
205
|
+
const CLAUDE_ONLY_KEYS = ["allowed_tools"];
|
|
206
|
+
/** Clients that DON'T understand Cursor command frontmatter */
|
|
207
|
+
const STRIP_CURSOR_KEYS_FOR = new Set([
|
|
208
|
+
"claude",
|
|
209
|
+
"codex",
|
|
210
|
+
]);
|
|
211
|
+
/** Clients that DON'T understand Claude command frontmatter */
|
|
212
|
+
const STRIP_CLAUDE_KEYS_FOR = new Set(["cursor"]);
|
|
213
|
+
/**
|
|
214
|
+
* Strip client-specific frontmatter keys from command content.
|
|
215
|
+
* Uses regex for surgical removal to preserve formatting.
|
|
216
|
+
*/
|
|
217
|
+
function stripClientSpecificFrontmatter(content, keysToStrip) {
|
|
218
|
+
const match = content.match(FRONTMATTER_REGEX);
|
|
219
|
+
if (!match)
|
|
220
|
+
return content;
|
|
221
|
+
let frontmatterYaml = match[1];
|
|
222
|
+
let modified = false;
|
|
223
|
+
for (const key of keysToStrip) {
|
|
224
|
+
// Regex breakdown:
|
|
225
|
+
// ^key:.* - match "key:" and rest of line
|
|
226
|
+
// (?:\n[ \t]+-.*)* - plus any following array items (lines starting with -)
|
|
227
|
+
// (?:\n[ \t]+\w+:.*)* - plus any nested key: value pairs
|
|
228
|
+
const keyRegex = new RegExp(`^${key}:.*(?:\\n(?:[ \\t]+-.*|[ \\t]+\\w+:.*))*`, "gm");
|
|
229
|
+
const newYaml = frontmatterYaml.replace(keyRegex, "");
|
|
230
|
+
if (newYaml !== frontmatterYaml) {
|
|
231
|
+
frontmatterYaml = newYaml;
|
|
232
|
+
modified = true;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (!modified)
|
|
236
|
+
return content;
|
|
237
|
+
// Clean up empty lines in frontmatter
|
|
238
|
+
frontmatterYaml = frontmatterYaml
|
|
239
|
+
.split("\n")
|
|
240
|
+
.filter((line) => line.trim() !== "")
|
|
241
|
+
.join("\n");
|
|
242
|
+
const body = content.slice(match[0].length);
|
|
243
|
+
return `---\n${frontmatterYaml}\n---\n${body}`;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Transform content based on target client requirements.
|
|
247
|
+
*/
|
|
248
|
+
export function transformContentForClient(content, targetClient, assetType) {
|
|
249
|
+
// Transform agents for OpenCode
|
|
250
|
+
if (targetClient === "opencode" && assetType === "agents") {
|
|
251
|
+
return transformForOpenCode(content);
|
|
252
|
+
}
|
|
253
|
+
if (assetType === "commands") {
|
|
254
|
+
if (STRIP_CURSOR_KEYS_FOR.has(targetClient)) {
|
|
255
|
+
return stripClientSpecificFrontmatter(content, CURSOR_ONLY_KEYS);
|
|
256
|
+
}
|
|
257
|
+
if (STRIP_CLAUDE_KEYS_FOR.has(targetClient)) {
|
|
258
|
+
return stripClientSpecificFrontmatter(content, CLAUDE_ONLY_KEYS);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return content;
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.spec.d.ts","sourceRoot":"","sources":["../../src/utils/frontmatter.spec.ts"],"names":[],"mappings":""}
|