emdash-emit 0.1.9 → 0.1.11
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/CHANGELOG.md +101 -0
- package/README.md +102 -13
- package/dist/bin/emit.d.ts.map +1 -1
- package/dist/bin/emit.js +6 -0
- package/dist/bin/emit.js.map +1 -1
- package/dist/cli/commands/conflicts.d.ts +4 -0
- package/dist/cli/commands/conflicts.d.ts.map +1 -0
- package/dist/cli/commands/conflicts.js +153 -0
- package/dist/cli/commands/conflicts.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +4 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +89 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +4 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +82 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/new.d.ts.map +1 -1
- package/dist/cli/commands/new.js +52 -22
- package/dist/cli/commands/new.js.map +1 -1
- package/dist/cli/commands/pull.d.ts.map +1 -1
- package/dist/cli/commands/pull.js +23 -0
- package/dist/cli/commands/pull.js.map +1 -1
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +36 -1
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +27 -7
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/context.d.ts +3 -1
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +17 -6
- package/dist/cli/context.js.map +1 -1
- package/dist/db/cache.d.ts +3 -0
- package/dist/db/cache.d.ts.map +1 -1
- package/dist/db/cache.js +39 -0
- package/dist/db/cache.js.map +1 -1
- package/dist/mcp/context.d.ts +7 -0
- package/dist/mcp/context.d.ts.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +39 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-errors.d.ts +7 -2
- package/dist/mcp/tool-errors.d.ts.map +1 -1
- package/dist/mcp/tool-errors.js +80 -5
- package/dist/mcp/tool-errors.js.map +1 -1
- package/dist/mcp/tools/profile.d.ts.map +1 -1
- package/dist/mcp/tools/profile.js +4 -0
- package/dist/mcp/tools/profile.js.map +1 -1
- package/dist/mcp/tools/sync-conflicts.d.ts +4 -0
- package/dist/mcp/tools/sync-conflicts.d.ts.map +1 -0
- package/dist/mcp/tools/sync-conflicts.js +100 -0
- package/dist/mcp/tools/sync-conflicts.js.map +1 -0
- package/dist/mcp/tools/sync-delete.d.ts +4 -0
- package/dist/mcp/tools/sync-delete.d.ts.map +1 -0
- package/dist/mcp/tools/sync-delete.js +77 -0
- package/dist/mcp/tools/sync-delete.js.map +1 -0
- package/dist/mcp/tools/sync-diff.d.ts.map +1 -1
- package/dist/mcp/tools/sync-diff.js +3 -2
- package/dist/mcp/tools/sync-diff.js.map +1 -1
- package/dist/mcp/tools/sync-doctor.d.ts +4 -0
- package/dist/mcp/tools/sync-doctor.d.ts.map +1 -0
- package/dist/mcp/tools/sync-doctor.js +57 -0
- package/dist/mcp/tools/sync-doctor.js.map +1 -0
- package/dist/mcp/tools/sync-new.d.ts.map +1 -1
- package/dist/mcp/tools/sync-new.js +16 -3
- package/dist/mcp/tools/sync-new.js.map +1 -1
- package/dist/mcp/tools/sync-pull.d.ts.map +1 -1
- package/dist/mcp/tools/sync-pull.js +41 -11
- package/dist/mcp/tools/sync-pull.js.map +1 -1
- package/dist/mcp/tools/sync-push.d.ts.map +1 -1
- package/dist/mcp/tools/sync-push.js +16 -2
- package/dist/mcp/tools/sync-push.js.map +1 -1
- package/dist/mcp/tools/sync-status.d.ts.map +1 -1
- package/dist/mcp/tools/sync-status.js +63 -22
- package/dist/mcp/tools/sync-status.js.map +1 -1
- package/dist/sync/conflicts.d.ts +89 -0
- package/dist/sync/conflicts.d.ts.map +1 -0
- package/dist/sync/conflicts.js +374 -0
- package/dist/sync/conflicts.js.map +1 -0
- package/dist/sync/delete.d.ts +58 -0
- package/dist/sync/delete.d.ts.map +1 -0
- package/dist/sync/delete.js +221 -0
- package/dist/sync/delete.js.map +1 -0
- package/dist/sync/diff.d.ts.map +1 -1
- package/dist/sync/diff.js +6 -3
- package/dist/sync/diff.js.map +1 -1
- package/dist/sync/doctor.d.ts +31 -0
- package/dist/sync/doctor.d.ts.map +1 -0
- package/dist/sync/doctor.js +273 -0
- package/dist/sync/doctor.js.map +1 -0
- package/dist/sync/media.d.ts +22 -0
- package/dist/sync/media.d.ts.map +1 -1
- package/dist/sync/media.js +342 -94
- package/dist/sync/media.js.map +1 -1
- package/dist/sync/merge.d.ts +17 -1
- package/dist/sync/merge.d.ts.map +1 -1
- package/dist/sync/merge.js +110 -3
- package/dist/sync/merge.js.map +1 -1
- package/dist/sync/new.d.ts +31 -0
- package/dist/sync/new.d.ts.map +1 -1
- package/dist/sync/new.js +139 -2
- package/dist/sync/new.js.map +1 -1
- package/dist/sync/orchestrator.d.ts.map +1 -1
- package/dist/sync/orchestrator.js +2 -0
- package/dist/sync/orchestrator.js.map +1 -1
- package/dist/sync/preflight.d.ts.map +1 -1
- package/dist/sync/preflight.js +29 -3
- package/dist/sync/preflight.js.map +1 -1
- package/dist/sync/pull.d.ts +4 -0
- package/dist/sync/pull.d.ts.map +1 -1
- package/dist/sync/pull.js +159 -80
- package/dist/sync/pull.js.map +1 -1
- package/dist/sync/push.d.ts +10 -0
- package/dist/sync/push.d.ts.map +1 -1
- package/dist/sync/push.js +84 -31
- package/dist/sync/push.js.map +1 -1
- package/dist/sync/status.d.ts +10 -0
- package/dist/sync/status.d.ts.map +1 -1
- package/dist/sync/status.js +26 -0
- package/dist/sync/status.js.map +1 -1
- package/dist/sync/taxonomies.d.ts +14 -5
- package/dist/sync/taxonomies.d.ts.map +1 -1
- package/dist/sync/taxonomies.js +104 -6
- package/dist/sync/taxonomies.js.map +1 -1
- package/dist/sync/terms.d.ts +32 -0
- package/dist/sync/terms.d.ts.map +1 -0
- package/dist/sync/terms.js +62 -0
- package/dist/sync/terms.js.map +1 -0
- package/dist/utils/config.d.ts +12 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +27 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +40 -3
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +188 -5
- package/dist/utils/frontmatter.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { CacheDatabase } from '../db/cache.js';
|
|
2
|
+
export declare class UnpushedModificationsError extends Error {
|
|
3
|
+
readonly code = "UNPUSHED_CHANGES_PROTECTION";
|
|
4
|
+
readonly filePath: string;
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly suggestion: string;
|
|
7
|
+
constructor(details: {
|
|
8
|
+
filePath: string;
|
|
9
|
+
id: string;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export declare class PublishedArticleDeletionForbiddenError extends Error {
|
|
13
|
+
readonly code = "PUBLISHED_ARTICLE_PROTECTION";
|
|
14
|
+
readonly filePath: string;
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly suggestion: string;
|
|
17
|
+
constructor(details: {
|
|
18
|
+
filePath: string;
|
|
19
|
+
id: string;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Scans article Markdown body to detect referenced media files in media/.
|
|
24
|
+
*/
|
|
25
|
+
export declare function scanArticleMediaReferences(bodyMarkdown: string): string[];
|
|
26
|
+
export interface DeleteArticleOptions {
|
|
27
|
+
workspaceRoot: string;
|
|
28
|
+
cache: CacheDatabase;
|
|
29
|
+
filePath?: string;
|
|
30
|
+
id?: string;
|
|
31
|
+
collection?: string;
|
|
32
|
+
allowDeletePublished?: boolean;
|
|
33
|
+
dryRun?: boolean;
|
|
34
|
+
origin?: string;
|
|
35
|
+
token?: string;
|
|
36
|
+
refreshToken?: string;
|
|
37
|
+
fetchFn?: typeof fetch;
|
|
38
|
+
}
|
|
39
|
+
export interface DeleteArticleResult {
|
|
40
|
+
success: boolean;
|
|
41
|
+
dryRun: boolean;
|
|
42
|
+
id: string;
|
|
43
|
+
slug: string;
|
|
44
|
+
title: string;
|
|
45
|
+
status: string;
|
|
46
|
+
filePath: string;
|
|
47
|
+
bodyLineCount: number;
|
|
48
|
+
referencedMedia: string[];
|
|
49
|
+
rescueFilePath?: string;
|
|
50
|
+
remoteDeleted: boolean;
|
|
51
|
+
message: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Safely deletes an article with strict unpushed modification protection,
|
|
55
|
+
* published article protection, automatic rescue backup, and remote API deletion.
|
|
56
|
+
*/
|
|
57
|
+
export declare function deleteArticle(options: DeleteArticleOptions): Promise<DeleteArticleResult>;
|
|
58
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/sync/delete.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMpD,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,SAAgB,IAAI,iCAAiC;IACrD,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC,YAAY,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAWpD;CACF;AAED,qBAAa,sCAAuC,SAAQ,KAAK;IAC/D,SAAgB,IAAI,kCAAkC;IACtD,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC,YAAY,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAYpD;CACF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBzE;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA+I/F"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 SPORT-SERVICE RS★R
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
import fs from 'node:fs';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import { parseMarkdown } from '../utils/frontmatter.js';
|
|
25
|
+
import { calculateHash, CONFLICTS_SUBDIR } from './pull.js';
|
|
26
|
+
import { resolveArticleTarget } from './diff.js';
|
|
27
|
+
import { ApiError } from '../client/error.js';
|
|
28
|
+
export class UnpushedModificationsError extends Error {
|
|
29
|
+
code = 'UNPUSHED_CHANGES_PROTECTION';
|
|
30
|
+
filePath;
|
|
31
|
+
id;
|
|
32
|
+
suggestion;
|
|
33
|
+
constructor(details) {
|
|
34
|
+
const msg = [
|
|
35
|
+
`❌ ABORT: File contains unpushed local modifications: ${details.filePath}`,
|
|
36
|
+
` Local changes would be lost permanently.`,
|
|
37
|
+
` 💡 Suggestion: Run "emit push" (or sync_push) to save changes, or discard them first.`,
|
|
38
|
+
].join('\n');
|
|
39
|
+
super(msg);
|
|
40
|
+
this.name = 'UnpushedModificationsError';
|
|
41
|
+
this.filePath = details.filePath;
|
|
42
|
+
this.id = details.id;
|
|
43
|
+
this.suggestion = 'Run "emit push" (or sync_push) to save changes, or discard them first.';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class PublishedArticleDeletionForbiddenError extends Error {
|
|
47
|
+
code = 'PUBLISHED_ARTICLE_PROTECTION';
|
|
48
|
+
filePath;
|
|
49
|
+
id;
|
|
50
|
+
suggestion;
|
|
51
|
+
constructor(details) {
|
|
52
|
+
const msg = [
|
|
53
|
+
`❌ ABORT: Article is published: ${details.filePath}`,
|
|
54
|
+
` Deleting a live published article is an irreversible public action.`,
|
|
55
|
+
` 💡 Suggestion: Pass --allow-delete-published (or allowDeletePublished: true in MCP) to confirm.`,
|
|
56
|
+
].join('\n');
|
|
57
|
+
super(msg);
|
|
58
|
+
this.name = 'PublishedArticleDeletionForbiddenError';
|
|
59
|
+
this.filePath = details.filePath;
|
|
60
|
+
this.id = details.id;
|
|
61
|
+
this.suggestion =
|
|
62
|
+
'Pass --allow-delete-published (or allowDeletePublished: true in MCP) to confirm.';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Scans article Markdown body to detect referenced media files in media/.
|
|
67
|
+
*/
|
|
68
|
+
export function scanArticleMediaReferences(bodyMarkdown) {
|
|
69
|
+
const references = new Set();
|
|
70
|
+
// 1. Markdown image syntax: 
|
|
71
|
+
const mdRegex = /!\[.*?\]\(([^)\s]+)(?:\s+["'].*?["'])?\)/g;
|
|
72
|
+
let match;
|
|
73
|
+
while ((match = mdRegex.exec(bodyMarkdown)) !== null) {
|
|
74
|
+
const url = match[1].trim();
|
|
75
|
+
if (!url.startsWith('http://') && !url.startsWith('https://') && !url.startsWith('data:')) {
|
|
76
|
+
references.add(url);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// 2. HTML <img> tags: <img src="...">
|
|
80
|
+
const htmlRegex = /<img[^>]+src=["']([^"']+)["']/gi;
|
|
81
|
+
while ((match = htmlRegex.exec(bodyMarkdown)) !== null) {
|
|
82
|
+
const url = match[1].trim();
|
|
83
|
+
if (!url.startsWith('http://') && !url.startsWith('https://') && !url.startsWith('data:')) {
|
|
84
|
+
references.add(url);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return Array.from(references).sort();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Safely deletes an article with strict unpushed modification protection,
|
|
91
|
+
* published article protection, automatic rescue backup, and remote API deletion.
|
|
92
|
+
*/
|
|
93
|
+
export async function deleteArticle(options) {
|
|
94
|
+
const collection = options.collection || 'posts';
|
|
95
|
+
const { id: targetId, filePath: targetFile } = resolveArticleTarget({
|
|
96
|
+
workspaceRoot: options.workspaceRoot,
|
|
97
|
+
cache: options.cache,
|
|
98
|
+
filePath: options.filePath,
|
|
99
|
+
id: options.id,
|
|
100
|
+
});
|
|
101
|
+
if (!targetFile) {
|
|
102
|
+
throw new Error(`❌ Could not resolve article file path for deletion (id: "${options.id || ''}", filePath: "${options.filePath || ''}").`);
|
|
103
|
+
}
|
|
104
|
+
const fullLocalPath = path.join(options.workspaceRoot, targetFile);
|
|
105
|
+
if (!fs.existsSync(fullLocalPath)) {
|
|
106
|
+
throw new Error(`❌ Local file not found: ${targetFile}`);
|
|
107
|
+
}
|
|
108
|
+
const rawContent = fs.readFileSync(fullLocalPath, 'utf8');
|
|
109
|
+
const parsed = parseMarkdown(rawContent);
|
|
110
|
+
const articleId = parsed.frontmatter.id || targetId || 'unknown';
|
|
111
|
+
const articleStatus = parsed.frontmatter.status || 'draft';
|
|
112
|
+
const articleSlug = parsed.frontmatter.slug || '';
|
|
113
|
+
const articleTitle = parsed.frontmatter.title || articleSlug;
|
|
114
|
+
const bodyLineCount = parsed.body.split('\n').length;
|
|
115
|
+
const referencedMedia = scanArticleMediaReferences(parsed.body);
|
|
116
|
+
// Safety Guard 1: Unpushed Modifications Protection
|
|
117
|
+
const syncState = options.cache.getSyncState(articleId);
|
|
118
|
+
const currentHash = calculateHash(rawContent);
|
|
119
|
+
if (syncState && syncState.localHash !== currentHash) {
|
|
120
|
+
throw new UnpushedModificationsError({ filePath: targetFile, id: articleId });
|
|
121
|
+
}
|
|
122
|
+
// Safety Guard 2: Published Article Deletion Protection
|
|
123
|
+
if (articleStatus === 'published' && !options.allowDeletePublished) {
|
|
124
|
+
throw new PublishedArticleDeletionForbiddenError({ filePath: targetFile, id: articleId });
|
|
125
|
+
}
|
|
126
|
+
// Dry-run mode: return preview without modifying anything
|
|
127
|
+
if (options.dryRun) {
|
|
128
|
+
const mediaNote = referencedMedia.length > 0
|
|
129
|
+
? ` Note: ${referencedMedia.length} referenced media file(s) would be preserved in media/.`
|
|
130
|
+
: '';
|
|
131
|
+
return {
|
|
132
|
+
success: true,
|
|
133
|
+
dryRun: true,
|
|
134
|
+
id: articleId,
|
|
135
|
+
slug: articleSlug,
|
|
136
|
+
title: articleTitle,
|
|
137
|
+
status: articleStatus,
|
|
138
|
+
filePath: targetFile,
|
|
139
|
+
bodyLineCount,
|
|
140
|
+
referencedMedia,
|
|
141
|
+
remoteDeleted: false,
|
|
142
|
+
message: `[DRY-RUN] Article ${articleId} (${targetFile}) would be deleted.${mediaNote}`,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// Remote API deletion (DELETE /_emdash/api/content/{collection}/{id})
|
|
146
|
+
// Attempt remote deletion first before touching local files or rescue directories
|
|
147
|
+
let remoteDeleted = false;
|
|
148
|
+
if (options.origin && options.token && articleId && articleId !== 'unknown') {
|
|
149
|
+
const fetchFn = options.fetchFn || globalThis.fetch;
|
|
150
|
+
const url = new URL(`/_emdash/api/content/${collection}/${articleId}`, options.origin);
|
|
151
|
+
let res;
|
|
152
|
+
try {
|
|
153
|
+
res = await fetchFn(url.toString(), {
|
|
154
|
+
method: 'DELETE',
|
|
155
|
+
headers: {
|
|
156
|
+
Authorization: `Bearer ${options.token}`,
|
|
157
|
+
Accept: 'application/json',
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (fetchErr) {
|
|
162
|
+
throw new ApiError({
|
|
163
|
+
endpoint: url.pathname,
|
|
164
|
+
code: 'REMOTE_DELETE_FAILED',
|
|
165
|
+
status: 0,
|
|
166
|
+
message: `Network error during remote DELETE: ${fetchErr instanceof Error ? fetchErr.message : String(fetchErr)}`,
|
|
167
|
+
suggestion: 'Verify network connectivity, origin URL, and remote server status.',
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
if (res.ok || res.status === 204) {
|
|
171
|
+
remoteDeleted = true;
|
|
172
|
+
}
|
|
173
|
+
else if (res.status === 404) {
|
|
174
|
+
// Already absent on remote server
|
|
175
|
+
remoteDeleted = false;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// Remote deletion failed: abort before deleting local file or writing rescue to prevent desync
|
|
179
|
+
const errText = await res.text().catch(() => '');
|
|
180
|
+
throw new ApiError({
|
|
181
|
+
endpoint: url.pathname,
|
|
182
|
+
code: 'REMOTE_DELETE_FAILED',
|
|
183
|
+
status: res.status,
|
|
184
|
+
message: errText || `Remote DELETE failed with status ${res.status}`,
|
|
185
|
+
suggestion: 'Verify network connectivity, token permissions, and article status.',
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Rescue Backup: save copy to <collection>/conflicts/<name>.deleted.md only after remote is confirmed
|
|
190
|
+
const conflictsDir = path.join(options.workspaceRoot, collection, CONFLICTS_SUBDIR);
|
|
191
|
+
fs.mkdirSync(conflictsDir, { recursive: true });
|
|
192
|
+
const filenameBase = path.basename(targetFile, '.md');
|
|
193
|
+
const rescueRelPath = path.join(collection, CONFLICTS_SUBDIR, `${filenameBase}.deleted.md`);
|
|
194
|
+
const rescueFullPath = path.join(options.workspaceRoot, rescueRelPath);
|
|
195
|
+
fs.writeFileSync(rescueFullPath, rawContent, 'utf8');
|
|
196
|
+
// Delete local file from disk
|
|
197
|
+
fs.unlinkSync(fullLocalPath);
|
|
198
|
+
// Remove cache DB records (entries, base_snapshots, sync_state)
|
|
199
|
+
options.cache.deleteEntry(articleId);
|
|
200
|
+
const mediaMsg = referencedMedia.length > 0
|
|
201
|
+
? `\nℹ️ Note: ${referencedMedia.length} referenced media file(s) remain safely preserved in media/.`
|
|
202
|
+
: '';
|
|
203
|
+
return {
|
|
204
|
+
success: true,
|
|
205
|
+
dryRun: false,
|
|
206
|
+
id: articleId,
|
|
207
|
+
slug: articleSlug,
|
|
208
|
+
title: articleTitle,
|
|
209
|
+
status: articleStatus,
|
|
210
|
+
filePath: targetFile,
|
|
211
|
+
bodyLineCount,
|
|
212
|
+
referencedMedia,
|
|
213
|
+
rescueFilePath: rescueRelPath,
|
|
214
|
+
remoteDeleted,
|
|
215
|
+
message: `✅ Successfully deleted article ${articleId} (${targetFile}).` +
|
|
216
|
+
`\n🩹 Rescue backup saved to: ${rescueRelPath}` +
|
|
217
|
+
(remoteDeleted ? '\n🌐 Remote article deleted from server.' : '') +
|
|
218
|
+
mediaMsg,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/sync/delete.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/diff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/sync/diff.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/sync/diff.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMpD,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,qBAAqB,CAkBhG;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,cAAc,GAAG,WAAW,CAAC;IAC3E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,qBAAqB,CAwGxB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E,UAAU,CAiDZ"}
|
package/dist/sync/diff.js
CHANGED
|
@@ -25,6 +25,7 @@ import { diffPatch } from 'node-diff3';
|
|
|
25
25
|
import { extractUlidFromFilename } from '../utils/naming.js';
|
|
26
26
|
import { serializeMarkdown } from '../utils/frontmatter.js';
|
|
27
27
|
import { calculateHash } from './pull.js';
|
|
28
|
+
import { loadLocalTaxonomyCandidates } from './taxonomies.js';
|
|
28
29
|
/**
|
|
29
30
|
* Resolves a paired article ULID and workspace-relative file path from either `filePath` or `id`.
|
|
30
31
|
* Shared across CLI (`emit diff`) and MCP (`sync_diff`, `sync_pull`).
|
|
@@ -108,9 +109,11 @@ export function inspectArticleDiff(options) {
|
|
|
108
109
|
const currentHash = calculateHash(localContent);
|
|
109
110
|
const isModified = syncState ? syncState.localHash !== currentHash : true;
|
|
110
111
|
// base_snapshots.frontmatterYaml stores a JSON-encoded Frontmatter (see pull.ts / push.ts).
|
|
111
|
-
// Rebuild the base document with the exact same serializer used to write the local file so the
|
|
112
|
-
// diff compares canonical Markdown against canonical Markdown instead of JSON against YAML
|
|
113
|
-
|
|
112
|
+
// Rebuild the base document with the exact same serializer and taxonomy candidates used to write the local file so the
|
|
113
|
+
// diff compares canonical Markdown against canonical Markdown instead of JSON against YAML,
|
|
114
|
+
// preventing phantom diffs caused by taxonomy inline comments.
|
|
115
|
+
const candidates = loadLocalTaxonomyCandidates(options.workspaceRoot);
|
|
116
|
+
const baseFullMarkdown = serializeMarkdown(JSON.parse(baseSnapshot.frontmatterYaml), baseSnapshot.bodyMarkdown, candidates);
|
|
114
117
|
const diffResult = computeContextDiff(baseFullMarkdown, localContent, {
|
|
115
118
|
baseLabel: `base [rev: ${baseSnapshot.rev}]`,
|
|
116
119
|
localLabel: `local [${targetFile}]`,
|
package/dist/sync/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/sync/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAoB,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/sync/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CacheDatabase } from '../db/cache.js';
|
|
2
|
+
import type { EmitConfig } from '../utils/config.js';
|
|
3
|
+
export type CheckStatus = 'ok' | 'warning' | 'error';
|
|
4
|
+
export interface DoctorCheckResult {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
status: CheckStatus;
|
|
8
|
+
message: string;
|
|
9
|
+
details?: Record<string, unknown> | Array<unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface DoctorReport {
|
|
12
|
+
workspace: string;
|
|
13
|
+
emitVersion: string;
|
|
14
|
+
createdWithVersion?: string;
|
|
15
|
+
lastSyncedVersion?: string;
|
|
16
|
+
overallStatus: 'healthy' | 'warnings' | 'errors';
|
|
17
|
+
checks: DoctorCheckResult[];
|
|
18
|
+
}
|
|
19
|
+
export interface RunWorkspaceDoctorOptions {
|
|
20
|
+
workspaceRoot: string;
|
|
21
|
+
cache: CacheDatabase;
|
|
22
|
+
config: EmitConfig;
|
|
23
|
+
profileName?: string;
|
|
24
|
+
profileOrigin?: string;
|
|
25
|
+
collection?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Runs a comprehensive health diagnostic across the workspace.
|
|
29
|
+
*/
|
|
30
|
+
export declare function runWorkspaceDoctor(options: RunWorkspaceDoctorOptions): Promise<DoctorReport>;
|
|
31
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/sync/doctor.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOrD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjD,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,YAAY,CAAC,CAyPvB"}
|