@xfe-repo/cli-plugin-ai-rules 2.0.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/dist/block-utils.d.ts +11 -0
- package/dist/block-utils.d.ts.map +1 -0
- package/dist/block-utils.js +13 -0
- package/dist/block-utils.js.map +1 -0
- package/dist/formats/agent-md.d.ts +35 -0
- package/dist/formats/agent-md.d.ts.map +1 -0
- package/dist/formats/agent-md.js +241 -0
- package/dist/formats/agent-md.js.map +1 -0
- package/dist/formats/markdown.d.ts +35 -0
- package/dist/formats/markdown.d.ts.map +1 -0
- package/dist/formats/markdown.js +241 -0
- package/dist/formats/markdown.js.map +1 -0
- package/dist/formats/mcp-json.d.ts +25 -0
- package/dist/formats/mcp-json.d.ts.map +1 -0
- package/dist/formats/mcp-json.js +132 -0
- package/dist/formats/mcp-json.js.map +1 -0
- package/dist/formats/shared.d.ts +4 -0
- package/dist/formats/shared.d.ts.map +1 -0
- package/dist/formats/shared.js +24 -0
- package/dist/formats/shared.js.map +1 -0
- package/dist/formats/skill-dir.d.ts +17 -0
- package/dist/formats/skill-dir.d.ts.map +1 -0
- package/dist/formats/skill-dir.js +72 -0
- package/dist/formats/skill-dir.js.map +1 -0
- package/dist/gitignore.d.ts +12 -0
- package/dist/gitignore.d.ts.map +1 -0
- package/dist/gitignore.js +32 -0
- package/dist/gitignore.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +358 -0
- package/dist/index.js.map +1 -0
- package/dist/injection.d.ts +26 -0
- package/dist/injection.d.ts.map +1 -0
- package/dist/injection.js +169 -0
- package/dist/injection.js.map +1 -0
- package/dist/mcp-writer.d.ts +23 -0
- package/dist/mcp-writer.d.ts.map +1 -0
- package/dist/mcp-writer.js +131 -0
- package/dist/mcp-writer.js.map +1 -0
- package/dist/merge.d.ts +14 -0
- package/dist/merge.d.ts.map +1 -0
- package/dist/merge.js +35 -0
- package/dist/merge.js.map +1 -0
- package/dist/pipeline.d.ts +16 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +165 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/pipeline.new.d.ts +11 -0
- package/dist/pipeline.new.d.ts.map +1 -0
- package/dist/pipeline.new.js +11 -0
- package/dist/pipeline.new.js.map +1 -0
- package/dist/repo-cache.d.ts +24 -0
- package/dist/repo-cache.d.ts.map +1 -0
- package/dist/repo-cache.js +51 -0
- package/dist/repo-cache.js.map +1 -0
- package/dist/scanner.d.ts +12 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +119 -0
- package/dist/scanner.js.map +1 -0
- package/dist/sync.d.ts +26 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +172 -0
- package/dist/sync.js.map +1 -0
- package/dist/targets.d.ts +28 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +90 -0
- package/dist/targets.js.map +1 -0
- package/dist/types.d.ts +112 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +53 -0
- package/dist/types.js.map +1 -0
- package/dist/writers/index.d.ts +15 -0
- package/dist/writers/index.d.ts.map +1 -0
- package/dist/writers/index.js +23 -0
- package/dist/writers/index.js.map +1 -0
- package/dist/writers/markdown-writer.d.ts +15 -0
- package/dist/writers/markdown-writer.d.ts.map +1 -0
- package/dist/writers/markdown-writer.js +249 -0
- package/dist/writers/markdown-writer.js.map +1 -0
- package/dist/writers/mcp-json-writer.d.ts +11 -0
- package/dist/writers/mcp-json-writer.d.ts.map +1 -0
- package/dist/writers/mcp-json-writer.js +185 -0
- package/dist/writers/mcp-json-writer.js.map +1 -0
- package/dist/writers/types.d.ts +29 -0
- package/dist/writers/types.d.ts.map +1 -0
- package/dist/writers/types.js +8 -0
- package/dist/writers/types.js.map +1 -0
- package/package.json +27 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-utils.d.ts","sourceRoot":"","sources":["../src/block-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;GAIG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @xfe-repo/cli-plugin-ai-rules - 标记块工具
|
|
4
|
+
*
|
|
5
|
+
* 通用的标记块替换/追加/移除逻辑,统一 merge / gitignore / injection 三处复用
|
|
6
|
+
*/
|
|
7
|
+
// ─── Public ──────
|
|
8
|
+
/**
|
|
9
|
+
* 在内容中查找标记块并替换;标记块不存在时追加到末尾
|
|
10
|
+
*
|
|
11
|
+
* 不传 replacement 时移除标记块及其周围空白
|
|
12
|
+
*/
|
|
13
|
+
//# sourceMappingURL=block-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-utils.js","sourceRoot":"","sources":["../src/block-utils.ts"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,oBAAoB;AAEpB;;;;GAIG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown 格式模块
|
|
3
|
+
*
|
|
4
|
+
* 处理 Markdown 系列文件的同步写入:
|
|
5
|
+
* - 合并文件(AGENTS.md / CLAUDE.md):多 item 拼接到同一文件
|
|
6
|
+
* - 独立文件(.mdc / .instructions.md):每 item 一个文件
|
|
7
|
+
* - 注入标记块:动态注入内容用 HTML 注释标记包裹
|
|
8
|
+
*/
|
|
9
|
+
import type { AiConfig, InjectionRegistry, PlannedFile, SyncEntry } from '../types.js';
|
|
10
|
+
import type { TargetConfig } from '../targets.js';
|
|
11
|
+
/**
|
|
12
|
+
* 将同步项按 target 配置转换为 PlannedFile 列表
|
|
13
|
+
*
|
|
14
|
+
* 合并文件:多 item 拼到同一文件;独立文件:每 item 一个文件
|
|
15
|
+
* 可选注入项追加到合并文件末尾,独立注入项生成独立文件
|
|
16
|
+
*/
|
|
17
|
+
export declare function planMarkdownFiles(target: TargetConfig, items: SyncEntry[], injections?: InjectionRegistry): PlannedFile[];
|
|
18
|
+
export declare function detectMarkdownConflict(file: PlannedFile, projectRoot: string, lastHashes: Record<string, string>): Promise<PlannedFile>;
|
|
19
|
+
export declare function writeMarkdownFile(file: PlannedFile, projectRoot: string): Promise<string>;
|
|
20
|
+
export interface PatchResult {
|
|
21
|
+
written: number;
|
|
22
|
+
removed: number;
|
|
23
|
+
hashes: Record<string, string>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 将注入注册表中的 Markdown 内容立即写入已有的目标文件
|
|
27
|
+
*
|
|
28
|
+
* 合并文件:在已有内容末尾追加/替换注入块
|
|
29
|
+
* 独立文件:直接写入
|
|
30
|
+
*/
|
|
31
|
+
export declare function patchMarkdownInjections(config: AiConfig, projectRoot: string, injections: InjectionRegistry): Promise<PatchResult>;
|
|
32
|
+
export declare function getMarkdownGitignore(target: TargetConfig): string[];
|
|
33
|
+
export declare function removeStaleInjectedFiles(projectRoot: string, prevPaths: Set<string>, currentPaths: Set<string>): Promise<number>;
|
|
34
|
+
export declare function stripInjectedSections(content: string): string;
|
|
35
|
+
//# sourceMappingURL=agent-md.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-md.d.ts","sourceRoot":"","sources":["../../src/formats/agent-md.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAajD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC,EAAE,iBAAiB,GAAG,WAAW,EAAE,CAsCzH;AAID,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,WAAW,CAAC,CAUtB;AAID,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO/F;AAID,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAwCxI;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAEnE;AAID,wBAAsB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBtI;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY7D"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown 格式模块
|
|
3
|
+
*
|
|
4
|
+
* 处理 Markdown 系列文件的同步写入:
|
|
5
|
+
* - 合并文件(AGENTS.md / CLAUDE.md):多 item 拼接到同一文件
|
|
6
|
+
* - 独立文件(.mdc / .instructions.md):每 item 一个文件
|
|
7
|
+
* - 注入标记块:动态注入内容用 HTML 注释标记包裹
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync } from 'node:fs';
|
|
10
|
+
import { readFile, writeFile, mkdir, unlink } from 'node:fs/promises';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import { SyncItemType } from '../types.js';
|
|
13
|
+
import { getTarget, isIndividualSlot, resolvePathTemplate, formatOutputFile } from '../targets.js';
|
|
14
|
+
import { computeHash } from './shared.js';
|
|
15
|
+
// ─── Constants ──────
|
|
16
|
+
const INJECTED_BEGIN = '<!-- xfe:injected:begin -->';
|
|
17
|
+
const INJECTED_END = '<!-- xfe:injected:end -->';
|
|
18
|
+
const INJECTED_SOURCE_BEGIN = (source) => `<!-- xfe:injected:${source}:begin -->`;
|
|
19
|
+
const INJECTED_SOURCE_END = (source) => `<!-- xfe:injected:${source}:end -->`;
|
|
20
|
+
const AUTO_GENERATED_HEADER = '<!-- Auto-generated by xfe rules sync — do not edit manually -->';
|
|
21
|
+
// ─── Plan ──────
|
|
22
|
+
/**
|
|
23
|
+
* 将同步项按 target 配置转换为 PlannedFile 列表
|
|
24
|
+
*
|
|
25
|
+
* 合并文件:多 item 拼到同一文件;独立文件:每 item 一个文件
|
|
26
|
+
* 可选注入项追加到合并文件末尾,独立注入项生成独立文件
|
|
27
|
+
*/
|
|
28
|
+
export function planMarkdownFiles(target, items, injections) {
|
|
29
|
+
const mergeMap = new Map();
|
|
30
|
+
const files = [];
|
|
31
|
+
for (const item of items) {
|
|
32
|
+
if (item.type === SyncItemType.McpServer || item.type === SyncItemType.Skill)
|
|
33
|
+
continue;
|
|
34
|
+
const template = resolvePathTemplate(target, item.type);
|
|
35
|
+
if (isIndividualSlot(template)) {
|
|
36
|
+
const filePath = template.replace('{id}', item.id);
|
|
37
|
+
files.push({ relativePath: filePath, content: formatOutputFile(filePath, item), action: 'write', source: 'sync', format: 'markdown' });
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const section = `# ${item.name}\n\n${item.content}`;
|
|
41
|
+
const existing = mergeMap.get(template);
|
|
42
|
+
mergeMap.set(template, existing ? existing + '\n\n---\n\n' + section : section);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// 合并文件
|
|
46
|
+
for (const [relativePath, content] of mergeMap) {
|
|
47
|
+
files.push({
|
|
48
|
+
relativePath,
|
|
49
|
+
content: AUTO_GENERATED_HEADER + '\n\n' + content + '\n',
|
|
50
|
+
action: 'write',
|
|
51
|
+
source: 'sync',
|
|
52
|
+
format: 'markdown',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// 注入项
|
|
56
|
+
if (injections && injections.size > 0) {
|
|
57
|
+
appendInjections(target, files, injections);
|
|
58
|
+
}
|
|
59
|
+
return files;
|
|
60
|
+
}
|
|
61
|
+
// ─── Conflict Detection ──────
|
|
62
|
+
export async function detectMarkdownConflict(file, projectRoot, lastHashes) {
|
|
63
|
+
const absPath = path.join(projectRoot, file.relativePath);
|
|
64
|
+
if (!existsSync(absPath))
|
|
65
|
+
return file;
|
|
66
|
+
const localContent = await readFile(absPath, 'utf-8');
|
|
67
|
+
const localHash = computeHash(stripInjectedSections(localContent));
|
|
68
|
+
const knownHash = lastHashes[file.relativePath];
|
|
69
|
+
return !knownHash || localHash !== knownHash ? { ...file, action: 'conflict' } : file;
|
|
70
|
+
}
|
|
71
|
+
// ─── Write ──────
|
|
72
|
+
export async function writeMarkdownFile(file, projectRoot) {
|
|
73
|
+
const absPath = path.join(projectRoot, file.relativePath);
|
|
74
|
+
await mkdir(path.dirname(absPath), { recursive: true });
|
|
75
|
+
await writeFile(absPath, file.content, 'utf-8');
|
|
76
|
+
return computeHash(stripInjectedSections(file.content));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 将注入注册表中的 Markdown 内容立即写入已有的目标文件
|
|
80
|
+
*
|
|
81
|
+
* 合并文件:在已有内容末尾追加/替换注入块
|
|
82
|
+
* 独立文件:直接写入
|
|
83
|
+
*/
|
|
84
|
+
export async function patchMarkdownInjections(config, projectRoot, injections) {
|
|
85
|
+
const mdInjections = filterMarkdownInjections(injections);
|
|
86
|
+
const injectedBlock = buildInjectedBlock(mdInjections);
|
|
87
|
+
const mergeFilePaths = collectMergeFilePaths(config);
|
|
88
|
+
let written = 0;
|
|
89
|
+
let removed = 0;
|
|
90
|
+
const hashes = {};
|
|
91
|
+
// 合并文件:追加/移除注入块
|
|
92
|
+
for (const relativePath of mergeFilePaths) {
|
|
93
|
+
const absPath = path.join(projectRoot, relativePath);
|
|
94
|
+
if (!existsSync(absPath))
|
|
95
|
+
continue;
|
|
96
|
+
const content = await readFile(absPath, 'utf-8');
|
|
97
|
+
const stripped = stripInjectedSections(content);
|
|
98
|
+
if (injectedBlock) {
|
|
99
|
+
await writeFile(absPath, stripped.trimEnd() + '\n\n' + injectedBlock + '\n', 'utf-8');
|
|
100
|
+
written++;
|
|
101
|
+
}
|
|
102
|
+
else if (content !== stripped) {
|
|
103
|
+
await writeFile(absPath, stripped, 'utf-8');
|
|
104
|
+
removed++;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// 独立注入文件
|
|
108
|
+
const individualFiles = generateInjectedIndividualFiles(config, mdInjections);
|
|
109
|
+
for (const file of individualFiles) {
|
|
110
|
+
const absPath = path.join(projectRoot, file.relativePath);
|
|
111
|
+
await mkdir(path.dirname(absPath), { recursive: true });
|
|
112
|
+
await writeFile(absPath, file.content, 'utf-8');
|
|
113
|
+
hashes[file.relativePath] = computeHash(file.content);
|
|
114
|
+
written++;
|
|
115
|
+
}
|
|
116
|
+
return { written, removed, hashes };
|
|
117
|
+
}
|
|
118
|
+
// ─── Gitignore ──────
|
|
119
|
+
export function getMarkdownGitignore(target) {
|
|
120
|
+
return [...target.gitignoreEntries];
|
|
121
|
+
}
|
|
122
|
+
// ─── Stale File Cleanup ──────
|
|
123
|
+
export async function removeStaleInjectedFiles(projectRoot, prevPaths, currentPaths) {
|
|
124
|
+
let removed = 0;
|
|
125
|
+
for (const stalePath of prevPaths) {
|
|
126
|
+
if (currentPaths.has(stalePath))
|
|
127
|
+
continue;
|
|
128
|
+
const absPath = path.join(projectRoot, stalePath);
|
|
129
|
+
if (!existsSync(absPath))
|
|
130
|
+
continue;
|
|
131
|
+
try {
|
|
132
|
+
await unlink(absPath);
|
|
133
|
+
removed++;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// 删除失败时静默跳过
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return removed;
|
|
140
|
+
}
|
|
141
|
+
// ─── Marker Utilities (pipeline 需要) ──────
|
|
142
|
+
export function stripInjectedSections(content) {
|
|
143
|
+
const beginIdx = content.indexOf(INJECTED_BEGIN);
|
|
144
|
+
const endIdx = content.indexOf(INJECTED_END);
|
|
145
|
+
if (beginIdx === -1 || endIdx === -1)
|
|
146
|
+
return content;
|
|
147
|
+
const before = content.slice(0, beginIdx).trimEnd();
|
|
148
|
+
const after = content.slice(endIdx + INJECTED_END.length).trimStart();
|
|
149
|
+
if (!after)
|
|
150
|
+
return before ? before + '\n' : '';
|
|
151
|
+
return before + '\n\n' + after;
|
|
152
|
+
}
|
|
153
|
+
// ─── Helpers ──────
|
|
154
|
+
function appendInjections(target, files, injections) {
|
|
155
|
+
const mdInjections = filterMarkdownInjections(injections);
|
|
156
|
+
if (mdInjections.size === 0)
|
|
157
|
+
return;
|
|
158
|
+
const injectedBlock = buildInjectedBlock(mdInjections);
|
|
159
|
+
if (!injectedBlock)
|
|
160
|
+
return;
|
|
161
|
+
// 追加到合并文件
|
|
162
|
+
const mergeTemplates = new Set();
|
|
163
|
+
for (const template of [target.agent, target.rules, target.subagents, target.skills]) {
|
|
164
|
+
if (!isIndividualSlot(template))
|
|
165
|
+
mergeTemplates.add(template);
|
|
166
|
+
}
|
|
167
|
+
for (const file of files) {
|
|
168
|
+
if (file.format !== 'markdown' || !mergeTemplates.has(file.relativePath))
|
|
169
|
+
continue;
|
|
170
|
+
file.content = file.content.trimEnd() + '\n\n' + injectedBlock + '\n';
|
|
171
|
+
}
|
|
172
|
+
// 独立注入文件
|
|
173
|
+
const allItems = [...mdInjections.values()].flat();
|
|
174
|
+
for (const item of allItems) {
|
|
175
|
+
const template = resolvePathTemplate(target, item.type);
|
|
176
|
+
if (!isIndividualSlot(template))
|
|
177
|
+
continue;
|
|
178
|
+
const filePath = template.replace('{id}', item.id);
|
|
179
|
+
files.push({
|
|
180
|
+
relativePath: filePath,
|
|
181
|
+
content: formatOutputFile(filePath, item),
|
|
182
|
+
action: 'write',
|
|
183
|
+
source: 'injection',
|
|
184
|
+
format: 'markdown',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function filterMarkdownInjections(injections) {
|
|
189
|
+
const filtered = new Map();
|
|
190
|
+
for (const [source, items] of injections) {
|
|
191
|
+
const mdItems = items.filter((item) => item.type !== SyncItemType.McpServer);
|
|
192
|
+
if (mdItems.length > 0)
|
|
193
|
+
filtered.set(source, mdItems);
|
|
194
|
+
}
|
|
195
|
+
return filtered;
|
|
196
|
+
}
|
|
197
|
+
function buildInjectedBlock(injections) {
|
|
198
|
+
const sections = [];
|
|
199
|
+
for (const [source, items] of injections) {
|
|
200
|
+
if (items.length === 0)
|
|
201
|
+
continue;
|
|
202
|
+
const content = items.map((item) => `## ${item.name}\n\n${item.content}`).join('\n\n---\n\n');
|
|
203
|
+
sections.push([INJECTED_SOURCE_BEGIN(source), '', content, '', INJECTED_SOURCE_END(source)].join('\n'));
|
|
204
|
+
}
|
|
205
|
+
if (sections.length === 0)
|
|
206
|
+
return '';
|
|
207
|
+
return [INJECTED_BEGIN, '', ...sections, '', INJECTED_END].join('\n');
|
|
208
|
+
}
|
|
209
|
+
function collectMergeFilePaths(config) {
|
|
210
|
+
const paths = new Set();
|
|
211
|
+
for (const targetId of config.targets) {
|
|
212
|
+
const target = getTarget(targetId);
|
|
213
|
+
if (!target)
|
|
214
|
+
continue;
|
|
215
|
+
for (const template of [target.agent, target.rules, target.subagents, target.skills]) {
|
|
216
|
+
if (!isIndividualSlot(template))
|
|
217
|
+
paths.add(template);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return paths;
|
|
221
|
+
}
|
|
222
|
+
function generateInjectedIndividualFiles(config, injections) {
|
|
223
|
+
const allItems = [...injections.values()].flat();
|
|
224
|
+
if (allItems.length === 0)
|
|
225
|
+
return [];
|
|
226
|
+
const files = [];
|
|
227
|
+
for (const targetId of config.targets) {
|
|
228
|
+
const target = getTarget(targetId);
|
|
229
|
+
if (!target)
|
|
230
|
+
continue;
|
|
231
|
+
for (const item of allItems) {
|
|
232
|
+
const template = resolvePathTemplate(target, item.type);
|
|
233
|
+
if (!isIndividualSlot(template))
|
|
234
|
+
continue;
|
|
235
|
+
const filePath = template.replace('{id}', item.id);
|
|
236
|
+
files.push({ relativePath: filePath, content: formatOutputFile(filePath, item) });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return files;
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=agent-md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-md.js","sourceRoot":"","sources":["../../src/formats/agent-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown 格式模块
|
|
3
|
+
*
|
|
4
|
+
* 处理 Markdown 系列文件的同步写入:
|
|
5
|
+
* - 合并文件(AGENTS.md / CLAUDE.md):多 item 拼接到同一文件
|
|
6
|
+
* - 独立文件(.mdc / .instructions.md):每 item 一个文件
|
|
7
|
+
* - 注入标记块:动态注入内容用 HTML 注释标记包裹
|
|
8
|
+
*/
|
|
9
|
+
import type { AiConfig, InjectionRegistry, PlannedFile, SyncEntry } from '../types.js';
|
|
10
|
+
import type { TargetConfig } from '../targets.js';
|
|
11
|
+
/**
|
|
12
|
+
* 将同步项按 target 配置转换为 PlannedFile 列表
|
|
13
|
+
*
|
|
14
|
+
* 合并文件:多 item 拼到同一文件;独立文件:每 item 一个文件
|
|
15
|
+
* 可选注入项追加到合并文件末尾,独立注入项生成独立文件
|
|
16
|
+
*/
|
|
17
|
+
export declare function planMarkdownFiles(target: TargetConfig, items: SyncEntry[], injections?: InjectionRegistry): PlannedFile[];
|
|
18
|
+
export declare function detectMarkdownConflict(file: PlannedFile, projectRoot: string, lastHashes: Record<string, string>): Promise<PlannedFile>;
|
|
19
|
+
export declare function writeMarkdownFile(file: PlannedFile, projectRoot: string): Promise<string>;
|
|
20
|
+
export interface PatchResult {
|
|
21
|
+
written: number;
|
|
22
|
+
removed: number;
|
|
23
|
+
hashes: Record<string, string>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 将注入注册表中的 Markdown 内容立即写入已有的目标文件
|
|
27
|
+
*
|
|
28
|
+
* 合并文件:在已有内容末尾追加/替换注入块
|
|
29
|
+
* 独立文件:直接写入
|
|
30
|
+
*/
|
|
31
|
+
export declare function patchMarkdownInjections(config: AiConfig, projectRoot: string, injections: InjectionRegistry): Promise<PatchResult>;
|
|
32
|
+
export declare function getMarkdownGitignore(target: TargetConfig): string[];
|
|
33
|
+
export declare function removeStaleInjectedFiles(projectRoot: string, prevPaths: Set<string>, currentPaths: Set<string>): Promise<number>;
|
|
34
|
+
export declare function stripInjectedSections(content: string): string;
|
|
35
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formats/markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAajD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC,EAAE,iBAAiB,GAAG,WAAW,EAAE,CAsCzH;AAID,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,WAAW,CAAC,CAUtB;AAID,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO/F;AAID,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAwCxI;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAEnE;AAID,wBAAsB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBtI;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY7D"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown 格式模块
|
|
3
|
+
*
|
|
4
|
+
* 处理 Markdown 系列文件的同步写入:
|
|
5
|
+
* - 合并文件(AGENTS.md / CLAUDE.md):多 item 拼接到同一文件
|
|
6
|
+
* - 独立文件(.mdc / .instructions.md):每 item 一个文件
|
|
7
|
+
* - 注入标记块:动态注入内容用 HTML 注释标记包裹
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync } from 'node:fs';
|
|
10
|
+
import { readFile, writeFile, mkdir, unlink } from 'node:fs/promises';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import { SyncItemType } from '../types.js';
|
|
13
|
+
import { getTarget, isIndividualSlot, resolvePathTemplate, formatOutputFile } from '../targets.js';
|
|
14
|
+
import { computeHash } from './shared.js';
|
|
15
|
+
// ─── Constants ──────
|
|
16
|
+
const INJECTED_BEGIN = '<!-- xfe:injected:begin -->';
|
|
17
|
+
const INJECTED_END = '<!-- xfe:injected:end -->';
|
|
18
|
+
const INJECTED_SOURCE_BEGIN = (source) => `<!-- xfe:injected:${source}:begin -->`;
|
|
19
|
+
const INJECTED_SOURCE_END = (source) => `<!-- xfe:injected:${source}:end -->`;
|
|
20
|
+
const AUTO_GENERATED_HEADER = '<!-- Auto-generated by xfe rules sync — do not edit manually -->';
|
|
21
|
+
// ─── Plan ──────
|
|
22
|
+
/**
|
|
23
|
+
* 将同步项按 target 配置转换为 PlannedFile 列表
|
|
24
|
+
*
|
|
25
|
+
* 合并文件:多 item 拼到同一文件;独立文件:每 item 一个文件
|
|
26
|
+
* 可选注入项追加到合并文件末尾,独立注入项生成独立文件
|
|
27
|
+
*/
|
|
28
|
+
export function planMarkdownFiles(target, items, injections) {
|
|
29
|
+
const mergeMap = new Map();
|
|
30
|
+
const files = [];
|
|
31
|
+
for (const item of items) {
|
|
32
|
+
if (item.type === SyncItemType.McpServer || item.type === SyncItemType.Skill)
|
|
33
|
+
continue;
|
|
34
|
+
const template = resolvePathTemplate(target, item.type);
|
|
35
|
+
if (isIndividualSlot(template)) {
|
|
36
|
+
const filePath = template.replace('{id}', item.id);
|
|
37
|
+
files.push({ relativePath: filePath, content: formatOutputFile(filePath, item), action: 'write', source: 'sync', format: 'markdown' });
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const section = `# ${item.name}\n\n${item.content}`;
|
|
41
|
+
const existing = mergeMap.get(template);
|
|
42
|
+
mergeMap.set(template, existing ? existing + '\n\n---\n\n' + section : section);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// 合并文件
|
|
46
|
+
for (const [relativePath, content] of mergeMap) {
|
|
47
|
+
files.push({
|
|
48
|
+
relativePath,
|
|
49
|
+
content: AUTO_GENERATED_HEADER + '\n\n' + content + '\n',
|
|
50
|
+
action: 'write',
|
|
51
|
+
source: 'sync',
|
|
52
|
+
format: 'markdown',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// 注入项
|
|
56
|
+
if (injections && injections.size > 0) {
|
|
57
|
+
appendInjections(target, files, injections);
|
|
58
|
+
}
|
|
59
|
+
return files;
|
|
60
|
+
}
|
|
61
|
+
// ─── Conflict Detection ──────
|
|
62
|
+
export async function detectMarkdownConflict(file, projectRoot, lastHashes) {
|
|
63
|
+
const absPath = path.join(projectRoot, file.relativePath);
|
|
64
|
+
if (!existsSync(absPath))
|
|
65
|
+
return file;
|
|
66
|
+
const localContent = await readFile(absPath, 'utf-8');
|
|
67
|
+
const localHash = computeHash(stripInjectedSections(localContent));
|
|
68
|
+
const knownHash = lastHashes[file.relativePath];
|
|
69
|
+
return !knownHash || localHash !== knownHash ? { ...file, action: 'conflict' } : file;
|
|
70
|
+
}
|
|
71
|
+
// ─── Write ──────
|
|
72
|
+
export async function writeMarkdownFile(file, projectRoot) {
|
|
73
|
+
const absPath = path.join(projectRoot, file.relativePath);
|
|
74
|
+
await mkdir(path.dirname(absPath), { recursive: true });
|
|
75
|
+
await writeFile(absPath, file.content, 'utf-8');
|
|
76
|
+
return computeHash(stripInjectedSections(file.content));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 将注入注册表中的 Markdown 内容立即写入已有的目标文件
|
|
80
|
+
*
|
|
81
|
+
* 合并文件:在已有内容末尾追加/替换注入块
|
|
82
|
+
* 独立文件:直接写入
|
|
83
|
+
*/
|
|
84
|
+
export async function patchMarkdownInjections(config, projectRoot, injections) {
|
|
85
|
+
const mdInjections = filterMarkdownInjections(injections);
|
|
86
|
+
const injectedBlock = buildInjectedBlock(mdInjections);
|
|
87
|
+
const mergeFilePaths = collectMergeFilePaths(config);
|
|
88
|
+
let written = 0;
|
|
89
|
+
let removed = 0;
|
|
90
|
+
const hashes = {};
|
|
91
|
+
// 合并文件:追加/移除注入块
|
|
92
|
+
for (const relativePath of mergeFilePaths) {
|
|
93
|
+
const absPath = path.join(projectRoot, relativePath);
|
|
94
|
+
if (!existsSync(absPath))
|
|
95
|
+
continue;
|
|
96
|
+
const content = await readFile(absPath, 'utf-8');
|
|
97
|
+
const stripped = stripInjectedSections(content);
|
|
98
|
+
if (injectedBlock) {
|
|
99
|
+
await writeFile(absPath, stripped.trimEnd() + '\n\n' + injectedBlock + '\n', 'utf-8');
|
|
100
|
+
written++;
|
|
101
|
+
}
|
|
102
|
+
else if (content !== stripped) {
|
|
103
|
+
await writeFile(absPath, stripped, 'utf-8');
|
|
104
|
+
removed++;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// 独立注入文件
|
|
108
|
+
const individualFiles = generateInjectedIndividualFiles(config, mdInjections);
|
|
109
|
+
for (const file of individualFiles) {
|
|
110
|
+
const absPath = path.join(projectRoot, file.relativePath);
|
|
111
|
+
await mkdir(path.dirname(absPath), { recursive: true });
|
|
112
|
+
await writeFile(absPath, file.content, 'utf-8');
|
|
113
|
+
hashes[file.relativePath] = computeHash(file.content);
|
|
114
|
+
written++;
|
|
115
|
+
}
|
|
116
|
+
return { written, removed, hashes };
|
|
117
|
+
}
|
|
118
|
+
// ─── Gitignore ──────
|
|
119
|
+
export function getMarkdownGitignore(target) {
|
|
120
|
+
return [...target.gitignoreEntries];
|
|
121
|
+
}
|
|
122
|
+
// ─── Stale File Cleanup ──────
|
|
123
|
+
export async function removeStaleInjectedFiles(projectRoot, prevPaths, currentPaths) {
|
|
124
|
+
let removed = 0;
|
|
125
|
+
for (const stalePath of prevPaths) {
|
|
126
|
+
if (currentPaths.has(stalePath))
|
|
127
|
+
continue;
|
|
128
|
+
const absPath = path.join(projectRoot, stalePath);
|
|
129
|
+
if (!existsSync(absPath))
|
|
130
|
+
continue;
|
|
131
|
+
try {
|
|
132
|
+
await unlink(absPath);
|
|
133
|
+
removed++;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// 删除失败时静默跳过
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return removed;
|
|
140
|
+
}
|
|
141
|
+
// ─── Marker Utilities (pipeline 需要) ──────
|
|
142
|
+
export function stripInjectedSections(content) {
|
|
143
|
+
const beginIdx = content.indexOf(INJECTED_BEGIN);
|
|
144
|
+
const endIdx = content.indexOf(INJECTED_END);
|
|
145
|
+
if (beginIdx === -1 || endIdx === -1)
|
|
146
|
+
return content;
|
|
147
|
+
const before = content.slice(0, beginIdx).trimEnd();
|
|
148
|
+
const after = content.slice(endIdx + INJECTED_END.length).trimStart();
|
|
149
|
+
if (!after)
|
|
150
|
+
return before ? before + '\n' : '';
|
|
151
|
+
return before + '\n\n' + after;
|
|
152
|
+
}
|
|
153
|
+
// ─── Helpers ──────
|
|
154
|
+
function appendInjections(target, files, injections) {
|
|
155
|
+
const mdInjections = filterMarkdownInjections(injections);
|
|
156
|
+
if (mdInjections.size === 0)
|
|
157
|
+
return;
|
|
158
|
+
const injectedBlock = buildInjectedBlock(mdInjections);
|
|
159
|
+
if (!injectedBlock)
|
|
160
|
+
return;
|
|
161
|
+
// 追加到合并文件
|
|
162
|
+
const mergeTemplates = new Set();
|
|
163
|
+
for (const template of [target.agent, target.rules, target.subagents, target.skills]) {
|
|
164
|
+
if (!isIndividualSlot(template))
|
|
165
|
+
mergeTemplates.add(template);
|
|
166
|
+
}
|
|
167
|
+
for (const file of files) {
|
|
168
|
+
if (file.format !== 'markdown' || !mergeTemplates.has(file.relativePath))
|
|
169
|
+
continue;
|
|
170
|
+
file.content = file.content.trimEnd() + '\n\n' + injectedBlock + '\n';
|
|
171
|
+
}
|
|
172
|
+
// 独立注入文件
|
|
173
|
+
const allItems = [...mdInjections.values()].flat();
|
|
174
|
+
for (const item of allItems) {
|
|
175
|
+
const template = resolvePathTemplate(target, item.type);
|
|
176
|
+
if (!isIndividualSlot(template))
|
|
177
|
+
continue;
|
|
178
|
+
const filePath = template.replace('{id}', item.id);
|
|
179
|
+
files.push({
|
|
180
|
+
relativePath: filePath,
|
|
181
|
+
content: formatOutputFile(filePath, item),
|
|
182
|
+
action: 'write',
|
|
183
|
+
source: 'injection',
|
|
184
|
+
format: 'markdown',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function filterMarkdownInjections(injections) {
|
|
189
|
+
const filtered = new Map();
|
|
190
|
+
for (const [source, items] of injections) {
|
|
191
|
+
const mdItems = items.filter((item) => item.type !== SyncItemType.McpServer);
|
|
192
|
+
if (mdItems.length > 0)
|
|
193
|
+
filtered.set(source, mdItems);
|
|
194
|
+
}
|
|
195
|
+
return filtered;
|
|
196
|
+
}
|
|
197
|
+
function buildInjectedBlock(injections) {
|
|
198
|
+
const sections = [];
|
|
199
|
+
for (const [source, items] of injections) {
|
|
200
|
+
if (items.length === 0)
|
|
201
|
+
continue;
|
|
202
|
+
const content = items.map((item) => `## ${item.name}\n\n${item.content}`).join('\n\n---\n\n');
|
|
203
|
+
sections.push([INJECTED_SOURCE_BEGIN(source), '', content, '', INJECTED_SOURCE_END(source)].join('\n'));
|
|
204
|
+
}
|
|
205
|
+
if (sections.length === 0)
|
|
206
|
+
return '';
|
|
207
|
+
return [INJECTED_BEGIN, '', ...sections, '', INJECTED_END].join('\n');
|
|
208
|
+
}
|
|
209
|
+
function collectMergeFilePaths(config) {
|
|
210
|
+
const paths = new Set();
|
|
211
|
+
for (const targetId of config.targets) {
|
|
212
|
+
const target = getTarget(targetId);
|
|
213
|
+
if (!target)
|
|
214
|
+
continue;
|
|
215
|
+
for (const template of [target.agent, target.rules, target.subagents, target.skills]) {
|
|
216
|
+
if (!isIndividualSlot(template))
|
|
217
|
+
paths.add(template);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return paths;
|
|
221
|
+
}
|
|
222
|
+
function generateInjectedIndividualFiles(config, injections) {
|
|
223
|
+
const allItems = [...injections.values()].flat();
|
|
224
|
+
if (allItems.length === 0)
|
|
225
|
+
return [];
|
|
226
|
+
const files = [];
|
|
227
|
+
for (const targetId of config.targets) {
|
|
228
|
+
const target = getTarget(targetId);
|
|
229
|
+
if (!target)
|
|
230
|
+
continue;
|
|
231
|
+
for (const item of allItems) {
|
|
232
|
+
const template = resolvePathTemplate(target, item.type);
|
|
233
|
+
if (!isIndividualSlot(template))
|
|
234
|
+
continue;
|
|
235
|
+
const filePath = template.replace('{id}', item.id);
|
|
236
|
+
files.push({ relativePath: filePath, content: formatOutputFile(filePath, item) });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return files;
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formats/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP JSON 格式模块
|
|
3
|
+
*
|
|
4
|
+
* 处理 MCP 配置文件(.vscode/mcp.json、.cursor/mcp.json、.mcp.json)的同步写入:
|
|
5
|
+
* - 使用 `xfe:` 前缀隔离 xfe 管理的 server 条目与用户自定义条目
|
|
6
|
+
* - 写入时保留非 xfe 前缀的用户条目,仅覆盖 xfe 前缀条目
|
|
7
|
+
* - 不做冲突检测(前缀隔离已足够)
|
|
8
|
+
*/
|
|
9
|
+
import type { AiConfig, InjectionRegistry, PlannedFile, SyncEntry } from '../types.js';
|
|
10
|
+
import type { TargetConfig } from '../targets.js';
|
|
11
|
+
/**
|
|
12
|
+
* 将 MCP server 项按 target 转换为 PlannedFile
|
|
13
|
+
*
|
|
14
|
+
* 可选注入项合并到同一 JSON 文件
|
|
15
|
+
*/
|
|
16
|
+
export declare function planMcpJsonFiles(target: TargetConfig, items: SyncEntry[], injections?: InjectionRegistry): PlannedFile[];
|
|
17
|
+
export declare function writeMcpJsonFile(file: PlannedFile, projectRoot: string): Promise<string>;
|
|
18
|
+
export interface PatchResult {
|
|
19
|
+
written: number;
|
|
20
|
+
removed: number;
|
|
21
|
+
hashes: Record<string, string>;
|
|
22
|
+
}
|
|
23
|
+
export declare function patchMcpJsonInjections(config: AiConfig, projectRoot: string, injections: InjectionRegistry): Promise<PatchResult>;
|
|
24
|
+
export declare function getMcpJsonGitignore(target: TargetConfig): string[];
|
|
25
|
+
//# sourceMappingURL=mcp-json.d.ts.map
|