@mycodemap/mycodemap 0.5.2-beta.1 → 1.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.
Files changed (96) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +84 -10
  3. package/dist/cli/commands/init.d.ts +7 -2
  4. package/dist/cli/commands/init.d.ts.map +1 -1
  5. package/dist/cli/commands/init.js +22 -34
  6. package/dist/cli/commands/init.js.map +1 -1
  7. package/dist/cli/commands/publish-status.d.ts +31 -0
  8. package/dist/cli/commands/publish-status.d.ts.map +1 -0
  9. package/dist/cli/commands/publish-status.js +101 -0
  10. package/dist/cli/commands/publish-status.js.map +1 -0
  11. package/dist/cli/commands/readiness-gate.d.ts +25 -0
  12. package/dist/cli/commands/readiness-gate.d.ts.map +1 -0
  13. package/dist/cli/commands/readiness-gate.js +197 -0
  14. package/dist/cli/commands/readiness-gate.js.map +1 -0
  15. package/dist/cli/commands/ship/checker.d.ts +4 -9
  16. package/dist/cli/commands/ship/checker.d.ts.map +1 -1
  17. package/dist/cli/commands/ship/checker.js +60 -22
  18. package/dist/cli/commands/ship/checker.js.map +1 -1
  19. package/dist/cli/commands/ship/monitor.d.ts +6 -1
  20. package/dist/cli/commands/ship/monitor.d.ts.map +1 -1
  21. package/dist/cli/commands/ship/monitor.js +223 -46
  22. package/dist/cli/commands/ship/monitor.js.map +1 -1
  23. package/dist/cli/commands/ship/pipeline.d.ts.map +1 -1
  24. package/dist/cli/commands/ship/pipeline.js +14 -5
  25. package/dist/cli/commands/ship/pipeline.js.map +1 -1
  26. package/dist/cli/commands/ship/rules/quality-rules.d.ts +12 -8
  27. package/dist/cli/commands/ship/rules/quality-rules.d.ts.map +1 -1
  28. package/dist/cli/commands/ship/rules/quality-rules.js +49 -34
  29. package/dist/cli/commands/ship/rules/quality-rules.js.map +1 -1
  30. package/dist/cli/config-loader.js +1 -1
  31. package/dist/cli/config-loader.js.map +1 -1
  32. package/dist/cli/first-run-guide.d.ts.map +1 -1
  33. package/dist/cli/first-run-guide.js +10 -12
  34. package/dist/cli/first-run-guide.js.map +1 -1
  35. package/dist/cli/index.js +8 -1
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/cli/init/hooks.d.ts +17 -0
  38. package/dist/cli/init/hooks.d.ts.map +1 -0
  39. package/dist/cli/init/hooks.js +220 -0
  40. package/dist/cli/init/hooks.js.map +1 -0
  41. package/dist/cli/init/receipt.d.ts +4 -0
  42. package/dist/cli/init/receipt.d.ts.map +1 -0
  43. package/dist/cli/init/receipt.js +117 -0
  44. package/dist/cli/init/receipt.js.map +1 -0
  45. package/dist/cli/init/reconciler.d.ts +44 -0
  46. package/dist/cli/init/reconciler.d.ts.map +1 -0
  47. package/dist/cli/init/reconciler.js +377 -0
  48. package/dist/cli/init/reconciler.js.map +1 -0
  49. package/dist/cli/init/rule-templates.d.ts +9 -0
  50. package/dist/cli/init/rule-templates.d.ts.map +1 -0
  51. package/dist/cli/init/rule-templates.js +105 -0
  52. package/dist/cli/init/rule-templates.js.map +1 -0
  53. package/dist/cli/init/rules.d.ts +13 -0
  54. package/dist/cli/init/rules.d.ts.map +1 -0
  55. package/dist/cli/init/rules.js +113 -0
  56. package/dist/cli/init/rules.js.map +1 -0
  57. package/dist/cli/paths.d.ts +4 -2
  58. package/dist/cli/paths.d.ts.map +1 -1
  59. package/dist/cli/paths.js +13 -5
  60. package/dist/cli/paths.js.map +1 -1
  61. package/dist/orchestrator/test-linker.d.ts.map +1 -1
  62. package/dist/orchestrator/test-linker.js +5 -36
  63. package/dist/orchestrator/test-linker.js.map +1 -1
  64. package/docs/AI_ASSISTANT_SETUP.md +4 -2
  65. package/docs/SETUP_GUIDE.md +12 -12
  66. package/docs/agents/domain.md +36 -0
  67. package/docs/agents/issue-tracker.md +22 -0
  68. package/docs/agents/triage-labels.md +15 -0
  69. package/docs/ai-guide/COMMANDS.md +57 -3
  70. package/docs/ai-guide/INTEGRATION.md +1 -1
  71. package/docs/ai-guide/PATTERNS.md +3 -3
  72. package/docs/ai-guide/QUICKSTART.md +13 -4
  73. package/docs/ai-guide/README.md +7 -7
  74. package/docs/archive/ideation/2026-04-22-harness-rules-entry-docs-optimization-ideation.md +102 -0
  75. package/docs/archive/ideation/2026-04-22-rules-claude-agents-optimization-ideation.md +107 -0
  76. package/docs/brainstorms/2026-04-22-rules-entry-docs-phase1-structure-consolidation-requirements.md +110 -0
  77. package/docs/brainstorms/999.1-mycodemap-init-enhancements-requirements.md +166 -0
  78. package/docs/exec-plans/README.md +3 -0
  79. package/docs/ideation/2026-04-20-mycodemap-init-enhancements-ideation.md +96 -0
  80. package/docs/ideation/2026-04-22-rules-entry-docs-optimization-consolidated-ideation.md +119 -0
  81. package/docs/lesson-learn/2026-04-19-prerelease-trusted-publishing-fix.md +119 -0
  82. package/docs/lesson-learn/image.png +0 -0
  83. package/docs/rules/README.md +4 -1
  84. package/docs/rules/deployment.md +7 -0
  85. package/docs/rules/engineering-with-codex-openai.md +47 -8
  86. package/docs/rules/pre-release-checklist.md +44 -33
  87. package/docs/rules/release.md +303 -0
  88. package/docs/rules/testing.md +19 -0
  89. package/docs/rules/validation.md +16 -7
  90. package/mycodemap.config.schema.json +1 -1
  91. package/package.json +3 -3
  92. package/scripts/hooks/templates/commit-msg +38 -0
  93. package/scripts/hooks/templates/pre-commit +224 -0
  94. package/scripts/pre-release-check.js +4 -4
  95. package/scripts/release.sh +1 -1
  96. package/scripts/validate-docs.js +283 -14
@@ -0,0 +1,377 @@
1
+ // [META] since:2026-04-21 | owner:cli-team | stable:false
2
+ // [WHY] 把 init 命令拆成可测试的状态扫描与收敛计划,避免入口函数膨胀
3
+ import { createHash } from 'node:crypto';
4
+ import { existsSync, readFileSync } from 'node:fs';
5
+ import { mkdir, writeFile } from 'node:fs/promises';
6
+ import path from 'node:path';
7
+ import { createDefaultCodemapConfigFile } from '../config-loader.js';
8
+ import { applyHookPlan, createHookPlan } from './hooks.js';
9
+ import { applyRulesPlan, createRulesPlan } from './rules.js';
10
+ import { CONFIG_FILE_CANONICAL, CONFIG_FILE_NEW, CONFIG_FILE_OLD, DEFAULT_OUTPUT_DIR_NEW, DEFAULT_OUTPUT_DIR_OLD, } from '../paths.js';
11
+ const RECEIPT_VERSION_HINT = 'init-receipt-v1';
12
+ function buildInitPaths(rootDir) {
13
+ const workspaceRoot = path.join(rootDir, DEFAULT_OUTPUT_DIR_NEW);
14
+ return {
15
+ workspaceRoot,
16
+ canonicalConfigPath: path.join(workspaceRoot, CONFIG_FILE_CANONICAL),
17
+ legacyRootConfigPath: path.join(rootDir, CONFIG_FILE_NEW),
18
+ oldRootConfigPath: path.join(rootDir, CONFIG_FILE_OLD),
19
+ legacyOutputDir: path.join(rootDir, DEFAULT_OUTPUT_DIR_OLD),
20
+ logsDir: path.join(workspaceRoot, 'logs'),
21
+ workflowDir: path.join(workspaceRoot, 'workflow'),
22
+ rulesDir: path.join(workspaceRoot, 'rules'),
23
+ hooksDir: path.join(workspaceRoot, 'hooks'),
24
+ storageDir: path.join(workspaceRoot, 'storage'),
25
+ statusDir: path.join(workspaceRoot, 'status'),
26
+ receiptPath: path.join(workspaceRoot, 'status', 'init-last.json'),
27
+ firstRunMarkerPath: path.join(workspaceRoot, '.first-run-done'),
28
+ gitDir: path.join(rootDir, '.git'),
29
+ gitignorePath: path.join(rootDir, '.gitignore'),
30
+ claudePath: path.join(rootDir, 'CLAUDE.md'),
31
+ agentsPath: path.join(rootDir, 'AGENTS.md'),
32
+ };
33
+ }
34
+ function fileHash(text) {
35
+ return createHash('sha256').update(text).digest('hex').slice(0, 12);
36
+ }
37
+ function safeReadText(filePath) {
38
+ if (!existsSync(filePath)) {
39
+ return undefined;
40
+ }
41
+ return readFileSync(filePath, 'utf8');
42
+ }
43
+ function safeReadJson(filePath) {
44
+ const text = safeReadText(filePath);
45
+ if (!text) {
46
+ return undefined;
47
+ }
48
+ try {
49
+ const parsed = JSON.parse(text);
50
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
51
+ return parsed;
52
+ }
53
+ }
54
+ catch {
55
+ return undefined;
56
+ }
57
+ return undefined;
58
+ }
59
+ function describeRelative(rootDir, targetPath) {
60
+ const relativePath = path.relative(rootDir, targetPath);
61
+ return relativePath.length > 0 ? relativePath : '.';
62
+ }
63
+ function getWorkspaceDirectories(paths) {
64
+ return [
65
+ paths.workspaceRoot,
66
+ paths.logsDir,
67
+ paths.workflowDir,
68
+ paths.rulesDir,
69
+ paths.hooksDir,
70
+ paths.storageDir,
71
+ paths.statusDir,
72
+ ];
73
+ }
74
+ function getMissingWorkspaceDirectories(paths) {
75
+ return getWorkspaceDirectories(paths).filter((directoryPath) => !existsSync(directoryPath));
76
+ }
77
+ function getMigrationSource(paths) {
78
+ const preferredSourcePath = existsSync(paths.legacyRootConfigPath)
79
+ ? paths.legacyRootConfigPath
80
+ : existsSync(paths.oldRootConfigPath)
81
+ ? paths.oldRootConfigPath
82
+ : undefined;
83
+ if (!preferredSourcePath) {
84
+ return undefined;
85
+ }
86
+ const sourceText = readFileSync(preferredSourcePath, 'utf8');
87
+ return {
88
+ path: preferredSourcePath,
89
+ text: sourceText,
90
+ hash: fileHash(sourceText),
91
+ };
92
+ }
93
+ function collectLegacyStorageHints(configText) {
94
+ if (!configText) {
95
+ return [];
96
+ }
97
+ try {
98
+ const parsed = JSON.parse(configText);
99
+ const hints = [];
100
+ if (parsed.output === DEFAULT_OUTPUT_DIR_OLD) {
101
+ hints.push('output 仍指向 .codemap');
102
+ }
103
+ const storage = parsed.storage;
104
+ if (storage && typeof storage === 'object' && !Array.isArray(storage)) {
105
+ const outputPath = storage.outputPath;
106
+ if (outputPath === `${DEFAULT_OUTPUT_DIR_OLD}/storage`) {
107
+ hints.push('storage.outputPath 仍指向 .codemap/storage');
108
+ }
109
+ }
110
+ return hints;
111
+ }
112
+ catch {
113
+ return ['配置文件无法解析,需手动确认其中是否仍引用旧路径'];
114
+ }
115
+ }
116
+ function scanInitState(rootDir) {
117
+ const paths = buildInitPaths(rootDir);
118
+ const canonicalConfigText = safeReadText(paths.canonicalConfigPath);
119
+ const migrationSource = getMigrationSource(paths);
120
+ const effectiveConfigText = canonicalConfigText ?? migrationSource?.text;
121
+ return {
122
+ rootDir,
123
+ paths,
124
+ hasCanonicalConfig: canonicalConfigText !== undefined,
125
+ hasLegacyOutputDir: existsSync(paths.legacyOutputDir),
126
+ hasFirstRunMarker: existsSync(paths.firstRunMarkerPath),
127
+ canonicalConfigText,
128
+ canonicalConfigHash: canonicalConfigText ? fileHash(canonicalConfigText) : undefined,
129
+ migrationSourcePath: migrationSource?.path,
130
+ migrationSourceText: migrationSource?.text,
131
+ migrationSourceHash: migrationSource?.hash,
132
+ legacyStorageHints: collectLegacyStorageHints(effectiveConfigText),
133
+ workspaceMissingDirs: getMissingWorkspaceDirectories(paths),
134
+ receiptExists: existsSync(paths.receiptPath),
135
+ };
136
+ }
137
+ function createAsset(key, label, status, ownership, origin, details, options = {}) {
138
+ return {
139
+ key,
140
+ label,
141
+ status,
142
+ ownership,
143
+ origin,
144
+ path: options.path,
145
+ details,
146
+ hash: options.hash,
147
+ versionHint: options.versionHint,
148
+ rollbackHint: options.rollbackHint,
149
+ manualAction: options.manualAction,
150
+ };
151
+ }
152
+ function buildWorkspaceAsset(scan) {
153
+ const details = scan.workspaceMissingDirs.length === 0
154
+ ? ['`.mycodemap/` workspace 目录结构已就绪']
155
+ : [`将确保创建 ${scan.workspaceMissingDirs.map((directoryPath) => `\`${describeRelative(scan.rootDir, directoryPath)}\``).join('、')}`];
156
+ return createAsset('workspace', 'workspace', scan.workspaceMissingDirs.length === 0 ? 'already-synced' : 'installed', 'tool-owned', 'generated', details, {
157
+ path: scan.paths.workspaceRoot,
158
+ rollbackHint: scan.workspaceMissingDirs.length === 0
159
+ ? undefined
160
+ : '如需回退,可删除新建的 `.mycodemap/` 子目录并保留你确认需要的文件',
161
+ });
162
+ }
163
+ function buildCanonicalConfigText(scan) {
164
+ if (scan.migrationSourceText) {
165
+ return scan.migrationSourceText;
166
+ }
167
+ return JSON.stringify(createDefaultCodemapConfigFile(), null, 2);
168
+ }
169
+ function buildConfigAsset(scan) {
170
+ if (scan.hasCanonicalConfig) {
171
+ return createAsset('canonical-config', 'canonical config', 'already-synced', 'tool-owned', 'canonical-config', ['共享 CLI 配置加载已优先读取 `.mycodemap/config.json`'], {
172
+ path: scan.paths.canonicalConfigPath,
173
+ hash: scan.canonicalConfigHash,
174
+ });
175
+ }
176
+ if (scan.migrationSourcePath) {
177
+ return createAsset('canonical-config', 'canonical config', 'migrated', 'tool-owned', describeRelative(scan.rootDir, scan.migrationSourcePath), [
178
+ `将复制 \`${describeRelative(scan.rootDir, scan.migrationSourcePath)}\` 到 \`${describeRelative(scan.rootDir, scan.paths.canonicalConfigPath)}\``,
179
+ '根目录旧配置会保留,便于人工确认后再删除',
180
+ ], {
181
+ path: scan.paths.canonicalConfigPath,
182
+ hash: scan.migrationSourceHash,
183
+ rollbackHint: '如需回退本次迁移,可删除 `.mycodemap/config.json`;根目录旧配置仍会保留',
184
+ });
185
+ }
186
+ return createAsset('canonical-config', 'canonical config', 'installed', 'tool-owned', 'generated-default', ['将写入默认 `.mycodemap/config.json`,作为后续命令的 canonical 配置'], {
187
+ path: scan.paths.canonicalConfigPath,
188
+ hash: fileHash(buildCanonicalConfigText(scan)),
189
+ rollbackHint: '如需回退本次初始化,可删除 `.mycodemap/config.json`',
190
+ });
191
+ }
192
+ function buildLegacyRootConfigAssets(scan) {
193
+ const assets = [];
194
+ const rootConfigFiles = [
195
+ scan.paths.legacyRootConfigPath,
196
+ scan.paths.oldRootConfigPath,
197
+ ];
198
+ for (const rootConfigPath of rootConfigFiles) {
199
+ const text = safeReadText(rootConfigPath);
200
+ if (!text) {
201
+ continue;
202
+ }
203
+ assets.push(createAsset(`legacy-root-config:${path.basename(rootConfigPath)}`, path.basename(rootConfigPath), 'manual-action-needed', 'user-owned', 'legacy-root-config', [
204
+ `根目录旧配置 \`${describeRelative(scan.rootDir, rootConfigPath)}\` 已被视为 migration source,而非 steady-state truth`,
205
+ '确认 `.mycodemap/config.json` 可用后,可手动删除该旧配置文件',
206
+ ], {
207
+ path: rootConfigPath,
208
+ hash: fileHash(text),
209
+ manualAction: `确认 canonical 配置无误后,删除 \`${describeRelative(scan.rootDir, rootConfigPath)}\``,
210
+ rollbackHint: '如需回退,可继续使用该根目录配置文件,但建议尽快收敛到 canonical 路径',
211
+ }));
212
+ }
213
+ return assets;
214
+ }
215
+ function buildLegacyOutputAsset(scan) {
216
+ if (!scan.hasLegacyOutputDir) {
217
+ return undefined;
218
+ }
219
+ return createAsset('legacy-output-dir', 'legacy .codemap', 'manual-action-needed', 'user-owned', 'legacy-workspace', [
220
+ '检测到旧 `.codemap/` 目录,说明项目仍存在迁移前的 workspace / storage 痕迹',
221
+ '本次 init 不会自动删除旧目录,避免误删用户数据',
222
+ ], {
223
+ path: scan.paths.legacyOutputDir,
224
+ manualAction: '确认旧目录内容已迁移后,手动清理 `.codemap/`',
225
+ rollbackHint: '保留 `.codemap/` 即可维持旧状态;删除前请先确认其中没有仍需保留的数据',
226
+ });
227
+ }
228
+ function buildLegacyStorageAsset(scan) {
229
+ if (scan.legacyStorageHints.length === 0) {
230
+ return undefined;
231
+ }
232
+ return createAsset('legacy-storage-hints', 'legacy storage hints', 'manual-action-needed', 'user-owned', 'config-drift', scan.legacyStorageHints.map((hint) => `配置 drift:${hint}`), {
233
+ path: scan.paths.canonicalConfigPath,
234
+ manualAction: '按需把 canonical 配置中的旧 `.codemap` 路径改为 `.mycodemap` 命名空间',
235
+ rollbackHint: '保留旧路径配置可继续兼容旧数据,但会延续两套 workspace 心智',
236
+ });
237
+ }
238
+ function buildFirstRunAsset(scan) {
239
+ return createAsset('first-run-marker', 'first-run marker', scan.hasFirstRunMarker ? 'already-synced' : 'skipped', 'tool-owned', 'cli-first-run-guide', scan.hasFirstRunMarker
240
+ ? ['首次运行标记已存在,CLI 欢迎信息不会重复打扰']
241
+ : ['首次运行标记由 CLI 欢迎流程维护;本次 init 不额外写入该标记'], {
242
+ path: scan.paths.firstRunMarkerPath,
243
+ });
244
+ }
245
+ function buildStatusLedgerAsset(scan, mode) {
246
+ const status = mode === 'preview'
247
+ ? 'skipped'
248
+ : scan.receiptExists
249
+ ? 'already-synced'
250
+ : 'installed';
251
+ const details = mode === 'preview'
252
+ ? ['预览模式不会写入 `.mycodemap/status/init-last.json`']
253
+ : ['本次 init 会把 machine-readable receipt 写入 `.mycodemap/status/init-last.json`'];
254
+ return createAsset('status-ledger', 'status ledger', status, 'tool-owned', RECEIPT_VERSION_HINT, details, {
255
+ path: scan.paths.receiptPath,
256
+ versionHint: RECEIPT_VERSION_HINT,
257
+ rollbackHint: mode === 'apply' ? '如需回退本次 ledger,可删除 `.mycodemap/status/init-last.json`' : undefined,
258
+ });
259
+ }
260
+ function summarizeAssets(assets) {
261
+ return assets.reduce((summary, asset) => {
262
+ summary[asset.status] += 1;
263
+ return summary;
264
+ }, {
265
+ missing: 0,
266
+ 'already-synced': 0,
267
+ migrated: 0,
268
+ installed: 0,
269
+ conflict: 0,
270
+ 'manual-action-needed': 0,
271
+ skipped: 0,
272
+ });
273
+ }
274
+ function buildReceiptNotes(scan) {
275
+ const notes = [
276
+ 'canonical 配置位置是 `.mycodemap/config.json`;根目录 `mycodemap.config.json` / `codemap.config.json` 仅作为迁移来源保留',
277
+ '旧 `.codemap/` 或旧 storage 路径不会被静默忽略;若仍存在,receipt 会把它们标记为 drift / manual action',
278
+ ];
279
+ if (scan.legacyStorageHints.length > 0) {
280
+ notes.push(`检测到 legacy storage hint:${scan.legacyStorageHints.join(';')}`);
281
+ }
282
+ return notes;
283
+ }
284
+ function buildNextSteps(assets) {
285
+ const manualSteps = assets
286
+ .filter((asset) => asset.status === 'manual-action-needed' && asset.manualAction)
287
+ .map((asset) => asset.manualAction);
288
+ if (manualSteps.length > 0) {
289
+ return manualSteps;
290
+ }
291
+ const conflictSteps = assets
292
+ .filter((asset) => asset.status === 'conflict' && asset.manualAction)
293
+ .map((asset) => asset.manualAction);
294
+ if (conflictSteps.length > 0) {
295
+ return conflictSteps;
296
+ }
297
+ return [
298
+ '运行 `mycodemap generate` 生成代码地图',
299
+ '运行 `mycodemap --help` 查看更多命令',
300
+ ];
301
+ }
302
+ export function createInitPlan(rootDir, mode) {
303
+ const scan = scanInitState(rootDir);
304
+ const hookPlan = createHookPlan(rootDir);
305
+ const rulesPlan = createRulesPlan(rootDir);
306
+ const assets = [
307
+ buildWorkspaceAsset(scan),
308
+ buildConfigAsset(scan),
309
+ ...buildLegacyRootConfigAssets(scan),
310
+ buildStatusLedgerAsset(scan, mode),
311
+ ...hookPlan.assets,
312
+ ...rulesPlan.assets,
313
+ buildFirstRunAsset(scan),
314
+ ];
315
+ const legacyOutputAsset = buildLegacyOutputAsset(scan);
316
+ if (legacyOutputAsset) {
317
+ assets.push(legacyOutputAsset);
318
+ }
319
+ const legacyStorageAsset = buildLegacyStorageAsset(scan);
320
+ if (legacyStorageAsset) {
321
+ assets.push(legacyStorageAsset);
322
+ }
323
+ return {
324
+ receipt: {
325
+ version: 1,
326
+ generatedAt: new Date().toISOString(),
327
+ mode,
328
+ rootDir,
329
+ receiptPath: scan.paths.receiptPath,
330
+ canonicalConfigPath: scan.paths.canonicalConfigPath,
331
+ assets,
332
+ summary: summarizeAssets(assets),
333
+ notes: buildReceiptNotes(scan),
334
+ nextSteps: buildNextSteps(assets),
335
+ },
336
+ actions: {
337
+ ensureWorkspace: scan.workspaceMissingDirs.length > 0,
338
+ writeCanonicalConfig: !scan.hasCanonicalConfig,
339
+ canonicalConfigText: !scan.hasCanonicalConfig ? buildCanonicalConfigText(scan) : undefined,
340
+ hookPlan,
341
+ rulesPlan,
342
+ },
343
+ };
344
+ }
345
+ async function ensureWorkspaceDirectories(paths) {
346
+ for (const directoryPath of getWorkspaceDirectories(paths)) {
347
+ await mkdir(directoryPath, { recursive: true });
348
+ }
349
+ }
350
+ async function maybeWriteCanonicalConfig(paths, plan) {
351
+ if (!plan.actions.writeCanonicalConfig || !plan.actions.canonicalConfigText) {
352
+ return;
353
+ }
354
+ await mkdir(path.dirname(paths.canonicalConfigPath), { recursive: true });
355
+ await writeFile(paths.canonicalConfigPath, plan.actions.canonicalConfigText, 'utf8');
356
+ }
357
+ function receiptPaths(receipt) {
358
+ return buildInitPaths(receipt.rootDir);
359
+ }
360
+ export async function applyInitPlan(plan) {
361
+ const paths = receiptPaths(plan.receipt);
362
+ await ensureWorkspaceDirectories(paths);
363
+ await maybeWriteCanonicalConfig(paths, plan);
364
+ await applyHookPlan(plan.actions.hookPlan);
365
+ await applyRulesPlan(plan.actions.rulesPlan);
366
+ return plan.receipt;
367
+ }
368
+ export async function writeInitReceipt(receipt) {
369
+ await mkdir(path.dirname(receipt.receiptPath), { recursive: true });
370
+ await writeFile(receipt.receiptPath, JSON.stringify(receipt, null, 2), 'utf8');
371
+ }
372
+ export function readReceiptConfigPath(receiptPath) {
373
+ const parsed = safeReadJson(receiptPath);
374
+ const value = parsed?.canonicalConfigPath;
375
+ return typeof value === 'string' ? value : undefined;
376
+ }
377
+ //# sourceMappingURL=reconciler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconciler.js","sourceRoot":"","sources":["../../../src/cli/init/reconciler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface BuiltInRuleTemplate {
2
+ category: 'commit' | 'test' | 'lint' | 'docs' | 'validation';
3
+ fileName: string;
4
+ content: string;
5
+ }
6
+ export declare function getRulesBundleVersion(): string;
7
+ export declare function getBuiltInRuleTemplates(): BuiltInRuleTemplate[];
8
+ export declare function buildRulesSnippet(): string;
9
+ //# sourceMappingURL=rule-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-templates.d.ts","sourceRoot":"","sources":["../../../src/cli/init/rule-templates.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAaD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,uBAAuB,IAAI,mBAAmB,EAAE,CA8E/D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAU1C"}
@@ -0,0 +1,105 @@
1
+ // [META] since:2026-04-21 | owner:cli-team | stable:false
2
+ // [WHY] 提供可发布的内置通用 rules bundle 模板,避免把仓库私有规则直接复制到目标项目
3
+ const RULES_BUNDLE_VERSION = 'rules-bundle-v1';
4
+ function templateHeader(title) {
5
+ return [
6
+ `# ${title}`,
7
+ '',
8
+ '> Built-in mycodemap rules bundle',
9
+ '',
10
+ ].join('\n');
11
+ }
12
+ export function getRulesBundleVersion() {
13
+ return RULES_BUNDLE_VERSION;
14
+ }
15
+ export function getBuiltInRuleTemplates() {
16
+ return [
17
+ {
18
+ category: 'commit',
19
+ fileName: 'default.md',
20
+ content: `${templateHeader('Commit Rules')}## Goal
21
+
22
+ - Keep commits focused, reviewable, and reversible.
23
+
24
+ ## Rules
25
+
26
+ - One commit should represent one logical change.
27
+ - Use a clear value-first commit message format.
28
+ - Avoid bundling unrelated refactors with feature or bugfix work.
29
+ - Never commit secrets, tokens, or local machine credentials.
30
+ `,
31
+ },
32
+ {
33
+ category: 'test',
34
+ fileName: 'default.md',
35
+ content: `${templateHeader('Testing Rules')}## Goal
36
+
37
+ - Every behavior change should come with evidence.
38
+
39
+ ## Rules
40
+
41
+ - Add or update tests for new behavior and bug fixes.
42
+ - Reproduce the failure first when fixing a bug.
43
+ - Start with the smallest relevant test, then broaden coverage.
44
+ - Keep tests deterministic and independent from local state.
45
+ `,
46
+ },
47
+ {
48
+ category: 'lint',
49
+ fileName: 'default.md',
50
+ content: `${templateHeader('Code Quality Rules')}## Goal
51
+
52
+ - Prefer simple, explicit, maintainable code.
53
+
54
+ ## Rules
55
+
56
+ - Avoid \`any\` outside true boundary code; prefer specific types or \`unknown\`.
57
+ - Keep functions focused; split overly large functions before they become opaque.
58
+ - Remove unused imports and variables introduced by your change.
59
+ - Handle async work explicitly; do not leave floating promises.
60
+ `,
61
+ },
62
+ {
63
+ category: 'docs',
64
+ fileName: 'default.md',
65
+ content: `${templateHeader('Docs & Config Rules')}## Goal
66
+
67
+ - Keep docs and user-facing configuration guidance aligned with shipped behavior.
68
+
69
+ ## Rules
70
+
71
+ - Update docs when commands, flags, config keys, or output contracts change.
72
+ - Prefer concise entry docs that link to deeper references.
73
+ - Do not claim support for behavior that has not been verified in code.
74
+ - Record important migration notes when defaults or canonical paths change.
75
+ `,
76
+ },
77
+ {
78
+ category: 'validation',
79
+ fileName: 'default.md',
80
+ content: `${templateHeader('Validation Rules')}## Goal
81
+
82
+ - Do not declare work complete without verification.
83
+
84
+ ## Rules
85
+
86
+ - Run typecheck or equivalent structural validation after implementation.
87
+ - Run targeted tests for touched behavior before broader regression checks.
88
+ - Include at least one failure-mode check, not only the happy path.
89
+ - Surface remaining risks explicitly when you cannot verify them locally.
90
+ `,
91
+ },
92
+ ];
93
+ }
94
+ export function buildRulesSnippet() {
95
+ return [
96
+ '<!-- mycodemap-rules-bundle:start -->',
97
+ '- `@.mycodemap/rules/commit/default.md`',
98
+ '- `@.mycodemap/rules/test/default.md`',
99
+ '- `@.mycodemap/rules/lint/default.md`',
100
+ '- `@.mycodemap/rules/docs/default.md`',
101
+ '- `@.mycodemap/rules/validation/default.md`',
102
+ '<!-- mycodemap-rules-bundle:end -->',
103
+ ].join('\n');
104
+ }
105
+ //# sourceMappingURL=rule-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-templates.js","sourceRoot":"","sources":["../../../src/cli/init/rule-templates.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,sDAAsD;AAQtD,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAE/C,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO;QACL,KAAK,KAAK,EAAE;QACZ,EAAE;QACF,mCAAmC;QACnC,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL;YACE,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,GAAG,cAAc,CAAC,cAAc,CAAC;;;;;;;;;;CAU/C;SACI;QACD;YACE,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,GAAG,cAAc,CAAC,eAAe,CAAC;;;;;;;;;;CAUhD;SACI;QACD;YACE,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,GAAG,cAAc,CAAC,oBAAoB,CAAC;;;;;;;;;;CAUrD;SACI;QACD;YACE,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,GAAG,cAAc,CAAC,qBAAqB,CAAC;;;;;;;;;;CAUtD;SACI;QACD;YACE,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,GAAG,cAAc,CAAC,kBAAkB,CAAC;;;;;;;;;;CAUnD;SACI;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,uCAAuC;QACvC,yCAAyC;QACzC,uCAAuC;QACvC,uCAAuC;QACvC,uCAAuC;QACvC,6CAA6C;QAC7C,qCAAqC;KACtC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { InitAsset } from './reconciler.js';
2
+ interface FileWriteAction {
3
+ targetPath: string;
4
+ content: string;
5
+ }
6
+ export interface RulesPlan {
7
+ assets: InitAsset[];
8
+ writes: FileWriteAction[];
9
+ }
10
+ export declare function createRulesPlan(rootDir: string): RulesPlan;
11
+ export declare function applyRulesPlan(plan: RulesPlan): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/cli/init/rules.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAiKD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAU1D;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnE"}
@@ -0,0 +1,113 @@
1
+ // [META] since:2026-04-21 | owner:cli-team | stable:false
2
+ // [WHY] 为 init 提供内置 rules bundle 生成、drift 检测和 AI context snippet 状态
3
+ import { mkdir, writeFile } from 'node:fs/promises';
4
+ import { existsSync, readFileSync } from 'node:fs';
5
+ import path from 'node:path';
6
+ import { buildRulesSnippet, getBuiltInRuleTemplates, getRulesBundleVersion } from './rule-templates.js';
7
+ function safeReadText(filePath) {
8
+ if (!existsSync(filePath)) {
9
+ return undefined;
10
+ }
11
+ return readFileSync(filePath, 'utf8');
12
+ }
13
+ function hashText(text) {
14
+ return Buffer.from(text).toString('base64').slice(0, 12);
15
+ }
16
+ function makeRulesAsset(key, label, status, ownership, origin, details, options = {}) {
17
+ return {
18
+ key,
19
+ label,
20
+ status,
21
+ ownership,
22
+ origin,
23
+ path: options.path,
24
+ details,
25
+ hash: options.hash,
26
+ versionHint: options.versionHint,
27
+ rollbackHint: options.rollbackHint,
28
+ manualAction: options.manualAction,
29
+ };
30
+ }
31
+ function previewDiff(currentText, expectedText) {
32
+ const currentPreview = currentText.trim().split('\n').slice(0, 3).join(' / ');
33
+ const expectedPreview = expectedText.trim().split('\n').slice(0, 3).join(' / ');
34
+ return `当前: ${currentPreview} | 目标: ${expectedPreview}`;
35
+ }
36
+ function ruleFilePath(rootDir, category, fileName) {
37
+ return path.join(rootDir, '.mycodemap', 'rules', category, fileName);
38
+ }
39
+ function ruleAssets(rootDir, writes) {
40
+ const assets = [];
41
+ for (const template of getBuiltInRuleTemplates()) {
42
+ const targetPath = ruleFilePath(rootDir, template.category, template.fileName);
43
+ const currentText = safeReadText(targetPath);
44
+ if (currentText === template.content) {
45
+ assets.push(makeRulesAsset(`rules:${template.category}`, `rules: ${template.category}`, 'already-synced', 'tool-owned', 'built-in-rules-bundle', ['内置 rules 文件已同步'], {
46
+ path: targetPath,
47
+ hash: hashText(template.content),
48
+ versionHint: getRulesBundleVersion(),
49
+ }));
50
+ continue;
51
+ }
52
+ if (currentText !== undefined) {
53
+ assets.push(makeRulesAsset(`rules:${template.category}`, `rules: ${template.category}`, 'conflict', 'tool-owned', 'built-in-rules-bundle', [
54
+ '检测到目标项目中的 rules 文件与内置模板存在 drift;本次不会自动覆盖',
55
+ previewDiff(currentText, template.content),
56
+ ], {
57
+ path: targetPath,
58
+ hash: hashText(template.content),
59
+ versionHint: getRulesBundleVersion(),
60
+ manualAction: `手动审阅 \`.mycodemap/rules/${template.category}/${template.fileName}\` 的 drift,确认后可删除该文件再重跑 init`,
61
+ }));
62
+ continue;
63
+ }
64
+ writes.push({
65
+ targetPath,
66
+ content: template.content,
67
+ });
68
+ assets.push(makeRulesAsset(`rules:${template.category}`, `rules: ${template.category}`, 'installed', 'tool-owned', 'built-in-rules-bundle', ['将生成通用 rules 文件,不自动注入任何 repo 私有路径或项目专属流程'], {
69
+ path: targetPath,
70
+ hash: hashText(template.content),
71
+ versionHint: getRulesBundleVersion(),
72
+ rollbackHint: `如需回退,可删除 \`.mycodemap/rules/${template.category}/${template.fileName}\``,
73
+ }));
74
+ }
75
+ return assets;
76
+ }
77
+ function aiContextAsset(rootDir) {
78
+ const snippet = buildRulesSnippet();
79
+ const claudePath = path.join(rootDir, 'CLAUDE.md');
80
+ const agentsPath = path.join(rootDir, 'AGENTS.md');
81
+ const claudeText = safeReadText(claudePath);
82
+ const agentsText = safeReadText(agentsPath);
83
+ const hasReference = claudeText?.includes('.mycodemap/rules/') || agentsText?.includes('.mycodemap/rules/');
84
+ if (hasReference) {
85
+ return makeRulesAsset('ai-context-rules-snippet', 'AI context rules snippet', 'already-synced', 'team-owned', 'existing-team-context-file', ['检测到 `CLAUDE.md` 或 `AGENTS.md` 已引用 `.mycodemap/rules/`,无需重复提醒'], {
86
+ path: claudeText?.includes('.mycodemap/rules/') ? claudePath : agentsPath,
87
+ });
88
+ }
89
+ return makeRulesAsset('ai-context-rules-snippet', 'AI context rules snippet', 'manual-action-needed', 'team-owned', 'copy-paste-snippet', [
90
+ 'init 不会自动改写 team-owned 的 `CLAUDE.md` / `AGENTS.md`',
91
+ '请复制以下片段到你的 AI 上下文文件:',
92
+ snippet,
93
+ ], {
94
+ manualAction: '把 receipt 中的 `.mycodemap/rules/` 引用片段手动加入 `CLAUDE.md` 或 `AGENTS.md`',
95
+ });
96
+ }
97
+ export function createRulesPlan(rootDir) {
98
+ const writes = [];
99
+ return {
100
+ assets: [
101
+ ...ruleAssets(rootDir, writes),
102
+ aiContextAsset(rootDir),
103
+ ],
104
+ writes,
105
+ };
106
+ }
107
+ export async function applyRulesPlan(plan) {
108
+ for (const writeAction of plan.writes) {
109
+ await mkdir(path.dirname(writeAction.targetPath), { recursive: true });
110
+ await writeFile(writeAction.targetPath, writeAction.content, 'utf8');
111
+ }
112
+ }
113
+ //# sourceMappingURL=rules.js.map