@sirius-mcp/mcp 1.5.2 → 1.6.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/README.md +17 -4
- package/dist/adapters/fs/structure.d.ts.map +1 -1
- package/dist/adapters/fs/structure.js +16 -0
- package/dist/adapters/fs/structure.js.map +1 -1
- package/dist/adapters/mcp/crawl.js +1 -1
- package/dist/adapters/mcp/crawl.js.map +1 -1
- package/dist/adapters/mcp/get.js +1 -1
- package/dist/adapters/mcp/get.js.map +1 -1
- package/dist/adapters/mcp/index.d.ts +2 -0
- package/dist/adapters/mcp/index.d.ts.map +1 -1
- package/dist/adapters/mcp/index.js +5 -1
- package/dist/adapters/mcp/index.js.map +1 -1
- package/dist/adapters/mcp/init.js +1 -1
- package/dist/adapters/mcp/init.js.map +1 -1
- package/dist/adapters/mcp/list.js +1 -1
- package/dist/adapters/mcp/list.js.map +1 -1
- package/dist/adapters/mcp/query-counter.d.ts +17 -0
- package/dist/adapters/mcp/query-counter.d.ts.map +1 -0
- package/dist/adapters/mcp/query-counter.js +30 -0
- package/dist/adapters/mcp/query-counter.js.map +1 -0
- package/dist/adapters/mcp/reindex.js +1 -1
- package/dist/adapters/mcp/reindex.js.map +1 -1
- package/dist/adapters/mcp/resources.d.ts +4 -1
- package/dist/adapters/mcp/resources.d.ts.map +1 -1
- package/dist/adapters/mcp/resources.js +50 -1
- package/dist/adapters/mcp/resources.js.map +1 -1
- package/dist/adapters/mcp/search.js +1 -1
- package/dist/adapters/mcp/search.js.map +1 -1
- package/dist/adapters/mcp/upsert.js +1 -1
- package/dist/adapters/mcp/upsert.js.map +1 -1
- package/dist/adapters/update/check.d.ts +27 -0
- package/dist/adapters/update/check.d.ts.map +1 -1
- package/dist/adapters/update/check.js +40 -2
- package/dist/adapters/update/check.js.map +1 -1
- package/dist/app/list.d.ts +2 -2
- package/dist/app/precedence-contract.d.ts +14 -0
- package/dist/app/precedence-contract.d.ts.map +1 -0
- package/dist/app/precedence-contract.js +51 -0
- package/dist/app/precedence-contract.js.map +1 -0
- package/dist/app/upsert.d.ts +2 -2
- package/dist/errors.d.ts +30 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +88 -16
- package/dist/errors.js.map +1 -1
- package/dist/installer/cli-parser.d.ts.map +1 -1
- package/dist/installer/cli-parser.js +13 -3
- package/dist/installer/cli-parser.js.map +1 -1
- package/dist/installer/cli.d.ts.map +1 -1
- package/dist/installer/cli.js +61 -37
- package/dist/installer/cli.js.map +1 -1
- package/dist/installer/contract-seed.d.ts +6 -0
- package/dist/installer/contract-seed.d.ts.map +1 -0
- package/dist/installer/contract-seed.js +140 -0
- package/dist/installer/contract-seed.js.map +1 -0
- package/dist/installer/dispatch.d.ts.map +1 -1
- package/dist/installer/dispatch.js +3 -1
- package/dist/installer/dispatch.js.map +1 -1
- package/dist/installer/index.d.ts +4 -0
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +33 -5
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/instruction-targets.d.ts +33 -0
- package/dist/installer/instruction-targets.d.ts.map +1 -0
- package/dist/installer/instruction-targets.js +199 -0
- package/dist/installer/instruction-targets.js.map +1 -0
- package/dist/installer/precedence.d.ts +59 -0
- package/dist/installer/precedence.d.ts.map +1 -0
- package/dist/installer/precedence.js +218 -0
- package/dist/installer/precedence.js.map +1 -0
- package/dist/installer/snippet-context.d.ts +49 -0
- package/dist/installer/snippet-context.d.ts.map +1 -0
- package/dist/installer/snippet-context.js +93 -0
- package/dist/installer/snippet-context.js.map +1 -0
- package/dist/installer/snippet-engine.d.ts +21 -0
- package/dist/installer/snippet-engine.d.ts.map +1 -0
- package/dist/installer/snippet-engine.js +122 -0
- package/dist/installer/snippet-engine.js.map +1 -0
- package/dist/installer/snippet-exec.d.ts +4 -0
- package/dist/installer/snippet-exec.d.ts.map +1 -0
- package/dist/installer/snippet-exec.js +105 -0
- package/dist/installer/snippet-exec.js.map +1 -0
- package/dist/installer/snippet-offer.d.ts +21 -0
- package/dist/installer/snippet-offer.d.ts.map +1 -0
- package/dist/installer/snippet-offer.js +108 -0
- package/dist/installer/snippet-offer.js.map +1 -0
- package/dist/installer/snippet-report.d.ts +14 -0
- package/dist/installer/snippet-report.d.ts.map +1 -0
- package/dist/installer/snippet-report.js +217 -0
- package/dist/installer/snippet-report.js.map +1 -0
- package/dist/installer/snippet.d.ts +4 -0
- package/dist/installer/snippet.d.ts.map +1 -0
- package/dist/installer/snippet.js +158 -0
- package/dist/installer/snippet.js.map +1 -0
- package/dist/installer/tui-render.d.ts +3 -0
- package/dist/installer/tui-render.d.ts.map +1 -0
- package/dist/installer/tui-render.js +31 -0
- package/dist/installer/tui-render.js.map +1 -0
- package/dist/installer/tui.d.ts +5 -3
- package/dist/installer/tui.d.ts.map +1 -1
- package/dist/installer/tui.js +7 -24
- package/dist/installer/tui.js.map +1 -1
- package/dist/installer/types.d.ts +40 -2
- package/dist/installer/types.d.ts.map +1 -1
- package/dist/installer/types.js.map +1 -1
- package/dist/installer/version.d.ts +2 -0
- package/dist/installer/version.d.ts.map +1 -0
- package/dist/installer/version.js +18 -0
- package/dist/installer/version.js.map +1 -0
- package/dist/schemas/document.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import {} from "./types.js";
|
|
3
|
+
import { pJoin, getConfigDir } from "./targets-base.js";
|
|
4
|
+
const CLAUDE_GLOBAL = (env) => pJoin(env.platform, env.homeDir, ".claude", "CLAUDE.md");
|
|
5
|
+
const OPENCODE_GLOBAL = (env) => pJoin(env.platform, getConfigDir(env), "opencode", "AGENTS.md");
|
|
6
|
+
const CODEX_GLOBAL = (env) => pJoin(env.platform, env.homeDir, ".codex", "AGENTS.md");
|
|
7
|
+
export const INSTRUCTION_TARGETS = [
|
|
8
|
+
{
|
|
9
|
+
targetId: "claude-code",
|
|
10
|
+
files: [
|
|
11
|
+
{
|
|
12
|
+
path: "CLAUDE.md",
|
|
13
|
+
verification: "verified",
|
|
14
|
+
globalPath: CLAUDE_GLOBAL,
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
source: "https://code.claude.com/docs/en/memory (checked 2026-09-11)",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
targetId: "opencode",
|
|
21
|
+
files: [
|
|
22
|
+
{
|
|
23
|
+
path: "AGENTS.md",
|
|
24
|
+
verification: "verified",
|
|
25
|
+
globalPath: OPENCODE_GLOBAL,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
source: "https://opencode.ai/docs/rules/ (checked 2026-09-11)",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
targetId: "codex",
|
|
32
|
+
files: [
|
|
33
|
+
{
|
|
34
|
+
path: "AGENTS.md",
|
|
35
|
+
verification: "verified",
|
|
36
|
+
globalPath: CODEX_GLOBAL,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
source: "https://agents.md/ ; https://developers.openai.com/codex/ (checked 2026-09-11)",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
targetId: "zed",
|
|
43
|
+
files: [{ path: "AGENTS.md", verification: "verified" }],
|
|
44
|
+
source: "https://zed.dev/docs/ai/llm-rules (checked 2026-09-11)",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
targetId: "copilot",
|
|
48
|
+
files: [
|
|
49
|
+
{
|
|
50
|
+
path: ".github/copilot-instructions.md",
|
|
51
|
+
verification: "verified",
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
source: "https://docs.github.com/en/copilot/how-tos/configure-custom-instructions/add-repository-instructions (checked 2026-09-11)",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
targetId: "roo-code",
|
|
58
|
+
files: [
|
|
59
|
+
{
|
|
60
|
+
path: ".roo/rules/sirius-precedence-contract.md",
|
|
61
|
+
verification: "verified",
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
source: "https://docs.roocode.com/features/custom-instructions/ (checked 2026-09-11)",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
targetId: "cline",
|
|
68
|
+
files: [
|
|
69
|
+
{
|
|
70
|
+
path: ".clinerules/sirius-precedence-contract.md",
|
|
71
|
+
verification: "verified",
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
source: "https://docs.cline.bot/features/clinerules (checked 2026-09-11)",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
targetId: "continue",
|
|
78
|
+
files: [
|
|
79
|
+
{
|
|
80
|
+
path: ".continue/rules/sirius-precedence-contract.md",
|
|
81
|
+
verification: "verified",
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
source: "https://docs.continue.dev/customize/deep-dive/core-concepts/rules (checked 2026-09-11)",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
targetId: "kiro",
|
|
88
|
+
files: [
|
|
89
|
+
{
|
|
90
|
+
path: ".kiro/steering/sirius-precedence-contract.md",
|
|
91
|
+
verification: "verified",
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
source: "https://kiro.dev/docs/steering/ (checked 2026-09-11)",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
targetId: "windsurf",
|
|
98
|
+
files: [
|
|
99
|
+
{
|
|
100
|
+
path: ".windsurf/rules/sirius-precedence-contract.md",
|
|
101
|
+
verification: "verified",
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
source: "https://docs.windsurf.com/windsurf/rules (checked 2026-09-11)",
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
targetId: "cursor",
|
|
108
|
+
files: [
|
|
109
|
+
{
|
|
110
|
+
path: ".cursor/rules/sirius-precedence-contract.mdc",
|
|
111
|
+
verification: "unverified",
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
reason: "Convention churn (legacy .cursorrules to .cursor/rules/*.mdc); re-verify .mdc frontmatter handling before release (R-7).",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
targetId: "aider",
|
|
118
|
+
files: [
|
|
119
|
+
{ path: "CONVENTIONS.md", verification: "unverified" },
|
|
120
|
+
],
|
|
121
|
+
reason: "aider does not auto-read CONVENTIONS.md (opt-in via config read:); no auto-read Markdown convention.",
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
targetId: "goose",
|
|
125
|
+
files: [],
|
|
126
|
+
reason: "No known repository instruction-file convention.",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
targetId: "antigravity",
|
|
130
|
+
files: [],
|
|
131
|
+
reason: "No known repository instruction-file convention.",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
targetId: "devin",
|
|
135
|
+
files: [],
|
|
136
|
+
reason: "Cloud-resident agent; no repository instruction file (S-5).",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
targetId: "claude-desktop",
|
|
140
|
+
files: [],
|
|
141
|
+
reason: "Does not operate on a repository; no instruction file (S-5).",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
targetId: "jetbrains",
|
|
145
|
+
files: [],
|
|
146
|
+
reason: "No single repository instruction-file convention (AI Assistant settings).",
|
|
147
|
+
},
|
|
148
|
+
];
|
|
149
|
+
export function getInstructionTarget(targetId) {
|
|
150
|
+
return INSTRUCTION_TARGETS.find((e) => e.targetId === targetId);
|
|
151
|
+
}
|
|
152
|
+
export function resolveInstructionTarget(target, scope, env, repoRoot) {
|
|
153
|
+
const entry = getInstructionTarget(target.id);
|
|
154
|
+
if (!entry) {
|
|
155
|
+
return {
|
|
156
|
+
targetId: target.id,
|
|
157
|
+
covered: false,
|
|
158
|
+
skipReason: "No instruction-file mapping for this target.",
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const file = scope === "global" ? pickGlobalFile(entry, env) : pickWorkspaceFile(entry, repoRoot);
|
|
162
|
+
const declaredPath = file?.absPath ?? declaredPathFor(entry, scope, env, repoRoot);
|
|
163
|
+
if (!file) {
|
|
164
|
+
return {
|
|
165
|
+
targetId: target.id,
|
|
166
|
+
covered: false,
|
|
167
|
+
declaredPath,
|
|
168
|
+
skipReason: entry.reason ??
|
|
169
|
+
(scope === "global"
|
|
170
|
+
? "No verified global instruction-file convention."
|
|
171
|
+
: "Instruction convention not verified for this target (R-7)."),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return { targetId: target.id, covered: true, file, declaredPath };
|
|
175
|
+
}
|
|
176
|
+
function declaredPathFor(entry, scope, env, repoRoot) {
|
|
177
|
+
const first = entry.files[0];
|
|
178
|
+
if (!first)
|
|
179
|
+
return undefined;
|
|
180
|
+
if (scope === "global" && first.globalPath)
|
|
181
|
+
return first.globalPath(env);
|
|
182
|
+
return path.resolve(repoRoot, ...first.path.split("/"));
|
|
183
|
+
}
|
|
184
|
+
function pickWorkspaceFile(entry, repoRoot) {
|
|
185
|
+
const verified = entry.files.find((f) => f.verification === "verified");
|
|
186
|
+
if (!verified)
|
|
187
|
+
return undefined;
|
|
188
|
+
return {
|
|
189
|
+
absPath: path.resolve(repoRoot, ...verified.path.split("/")),
|
|
190
|
+
scope: "workspace",
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function pickGlobalFile(entry, env) {
|
|
194
|
+
const verified = entry.files.find((f) => f.verification === "verified" && f.globalPath);
|
|
195
|
+
if (!verified?.globalPath)
|
|
196
|
+
return undefined;
|
|
197
|
+
return { absPath: verified.globalPath(env), scope: "global" };
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=instruction-targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-targets.js","sourceRoot":"","sources":["../../src/installer/instruction-targets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export declare const SNIPPET_MARKER_PREFIX = "sirius:precedence-contract";
|
|
2
|
+
export declare const SNIPPET_END_MARKER = "<!-- /sirius:precedence-contract -->";
|
|
3
|
+
export declare const CANONICAL_MARKER_PREFIX = "sirius:precedence-canonical";
|
|
4
|
+
export declare const CONTRACT_TYPE: "business-rule";
|
|
5
|
+
export declare const CONTRACT_ID = "precedence-contract";
|
|
6
|
+
export declare const CONTRACT_RELATIVE_PATH = ".context/business-rule/precedence-contract.md";
|
|
7
|
+
export declare const CONTRACT_MAX_BODY_BYTES: number;
|
|
8
|
+
export declare const INITIAL_CONTRACT_VERSION = 1;
|
|
9
|
+
export type SnippetLanguage = "en" | "pt";
|
|
10
|
+
export type Eol = "\r\n" | "\n";
|
|
11
|
+
export interface CanonicalTemplate {
|
|
12
|
+
readonly version: number;
|
|
13
|
+
readonly language: SnippetLanguage;
|
|
14
|
+
readonly template: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class PrecedenceError extends Error {
|
|
17
|
+
readonly code: string;
|
|
18
|
+
readonly details: Record<string, unknown>;
|
|
19
|
+
constructor(code: string, message: string, details?: Record<string, unknown>);
|
|
20
|
+
}
|
|
21
|
+
export declare function todayIso(): string;
|
|
22
|
+
export declare function canonicalDigest(template: string): string;
|
|
23
|
+
export declare function detectDominantEol(content: string): Eol;
|
|
24
|
+
export declare function toEol(text: string, eol: Eol): string;
|
|
25
|
+
export declare function renderSnippetBlock(template: string, version: number, contractPath: string, eol?: Eol): string;
|
|
26
|
+
export declare function extractCanonicalTemplates(body: string): CanonicalTemplate[];
|
|
27
|
+
export declare function chooseSnippetTemplate(templates: CanonicalTemplate[], language: SnippetLanguage): CanonicalTemplate;
|
|
28
|
+
export type BlockLocation = {
|
|
29
|
+
readonly status: "absent";
|
|
30
|
+
} | {
|
|
31
|
+
readonly status: "present";
|
|
32
|
+
readonly startIndex: number;
|
|
33
|
+
readonly endIndex: number;
|
|
34
|
+
readonly eol: Eol | "";
|
|
35
|
+
readonly installedVersion: number | null;
|
|
36
|
+
readonly installedDigest: string | null;
|
|
37
|
+
readonly startLine: number;
|
|
38
|
+
readonly endLine: number;
|
|
39
|
+
} | {
|
|
40
|
+
readonly status: "corrupt";
|
|
41
|
+
readonly problems: string[];
|
|
42
|
+
};
|
|
43
|
+
export declare function locateBlock(content: string): BlockLocation;
|
|
44
|
+
export interface BlockApplication {
|
|
45
|
+
readonly nextContent: string;
|
|
46
|
+
readonly separatorInserted: boolean;
|
|
47
|
+
}
|
|
48
|
+
export declare function appendBlock(content: string, renderedBlockLf: string): BlockApplication;
|
|
49
|
+
export declare function replaceBlock(content: string, location: BlockLocation & {
|
|
50
|
+
status: "present";
|
|
51
|
+
}, renderedBlockLf: string): BlockApplication;
|
|
52
|
+
export declare function removeBlock(content: string, location: BlockLocation & {
|
|
53
|
+
status: "present";
|
|
54
|
+
}): {
|
|
55
|
+
nextContent: string;
|
|
56
|
+
generatorCreated: boolean;
|
|
57
|
+
};
|
|
58
|
+
export declare function snippetBodyWordCount(renderedBlock: string): number;
|
|
59
|
+
//# sourceMappingURL=precedence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"precedence.d.ts","sourceRoot":"","sources":["../../src/installer/precedence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export const SNIPPET_MARKER_PREFIX = "sirius:precedence-contract";
|
|
3
|
+
export const SNIPPET_END_MARKER = "<!-- /sirius:precedence-contract -->";
|
|
4
|
+
export const CANONICAL_MARKER_PREFIX = "sirius:precedence-canonical";
|
|
5
|
+
export const CONTRACT_TYPE = "business-rule";
|
|
6
|
+
export const CONTRACT_ID = "precedence-contract";
|
|
7
|
+
export const CONTRACT_RELATIVE_PATH = ".context/business-rule/precedence-contract.md";
|
|
8
|
+
export const CONTRACT_MAX_BODY_BYTES = 6 * 1024;
|
|
9
|
+
export const INITIAL_CONTRACT_VERSION = 1;
|
|
10
|
+
export class PrecedenceError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
details;
|
|
13
|
+
constructor(code, message, details = {}) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = "PrecedenceError";
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.details = details;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function todayIso() {
|
|
21
|
+
return new Date().toISOString().slice(0, 10);
|
|
22
|
+
}
|
|
23
|
+
function scanMarkers(content, pattern) {
|
|
24
|
+
const fresh = new RegExp(pattern.source, pattern.flags);
|
|
25
|
+
const matches = [];
|
|
26
|
+
for (const match of content.matchAll(fresh)) {
|
|
27
|
+
matches.push({ index: match.index ?? 0, text: match[0] });
|
|
28
|
+
}
|
|
29
|
+
return matches;
|
|
30
|
+
}
|
|
31
|
+
function lineAt(content, index) {
|
|
32
|
+
let line = 1;
|
|
33
|
+
for (let i = 0; i < index && i < content.length; i++) {
|
|
34
|
+
if (content.charCodeAt(i) === 10)
|
|
35
|
+
line++;
|
|
36
|
+
}
|
|
37
|
+
return line;
|
|
38
|
+
}
|
|
39
|
+
export function canonicalDigest(template) {
|
|
40
|
+
return createHash("sha256").update(template, "utf8").digest("hex").slice(0, 8);
|
|
41
|
+
}
|
|
42
|
+
export function detectDominantEol(content) {
|
|
43
|
+
let crlf = 0;
|
|
44
|
+
let lf = 0;
|
|
45
|
+
for (let i = 0; i < content.length; i++) {
|
|
46
|
+
if (content.charCodeAt(i) === 10) {
|
|
47
|
+
if (i > 0 && content.charCodeAt(i - 1) === 13)
|
|
48
|
+
crlf++;
|
|
49
|
+
else
|
|
50
|
+
lf++;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return crlf > lf ? "\r\n" : "\n";
|
|
54
|
+
}
|
|
55
|
+
export function toEol(text, eol) {
|
|
56
|
+
return eol === "\r\n" ? text.replace(/\r?\n/g, "\r\n") : text.replace(/\r\n/g, "\n");
|
|
57
|
+
}
|
|
58
|
+
export function renderSnippetBlock(template, version, contractPath, eol = "\n") {
|
|
59
|
+
const digest = canonicalDigest(template);
|
|
60
|
+
const rendered = template
|
|
61
|
+
.replaceAll("{VERSION}", String(version))
|
|
62
|
+
.replaceAll("{DIGEST}", digest)
|
|
63
|
+
.replaceAll("{CONTRACT_PATH}", contractPath);
|
|
64
|
+
return toEol(rendered, eol);
|
|
65
|
+
}
|
|
66
|
+
const CANONICAL_START_PATTERN = /<!--\s*sirius:precedence-canonical\s+v(\d+)(?:\s+lang:([a-z-]+))?\s*-->/g;
|
|
67
|
+
const CANONICAL_END_PATTERN = /<!--\s*\/sirius:precedence-canonical\s*-->/g;
|
|
68
|
+
function languageForOrder(index) {
|
|
69
|
+
return index === 1 ? "pt" : "en";
|
|
70
|
+
}
|
|
71
|
+
function stripBoundingNewlines(text) {
|
|
72
|
+
return text.replace(/^\r?\n/, "").replace(/\r?\n[ \t]*$/, "");
|
|
73
|
+
}
|
|
74
|
+
export function extractCanonicalTemplates(body) {
|
|
75
|
+
const starts = scanMarkers(body, CANONICAL_START_PATTERN);
|
|
76
|
+
const ends = scanMarkers(body, CANONICAL_END_PATTERN);
|
|
77
|
+
if (starts.length === 0) {
|
|
78
|
+
throw new PrecedenceError("NO_CANONICAL_BLOCK", "Contract body has no canonical routing snippet (missing sirius:precedence-canonical markers).");
|
|
79
|
+
}
|
|
80
|
+
if (starts.length !== ends.length) {
|
|
81
|
+
throw new PrecedenceError("CORRUPT_BLOCK", `Canonical markers are unbalanced: ${starts.length} start vs ${ends.length} end.`, { startLines: starts.map((s) => lineAt(body, s.index)), endLines: ends.map((e) => lineAt(body, e.index)) });
|
|
82
|
+
}
|
|
83
|
+
const versions = new Set(starts.map((s) => /v(\d+)/.exec(s.text)?.[1] ?? ""));
|
|
84
|
+
if (versions.size > 1) {
|
|
85
|
+
throw new PrecedenceError("CANONICAL_VERSIONS_DIVERGE", `Canonical blocks declare divergent versions: ${Array.from(versions).join(", ")}. Share one vN across all canonical blocks.`, { versions: Array.from(versions) });
|
|
86
|
+
}
|
|
87
|
+
assertNotInterleaved(body, starts, ends);
|
|
88
|
+
return starts.map((start, i) => {
|
|
89
|
+
const end = ends[i];
|
|
90
|
+
const explicit = start.text.match(/lang:([a-z-]+)/)?.[1];
|
|
91
|
+
const template = stripBoundingNewlines(body.slice(start.index + start.text.length, end.index));
|
|
92
|
+
return {
|
|
93
|
+
version: Number(/v(\d+)/.exec(start.text)?.[1] ?? INITIAL_CONTRACT_VERSION),
|
|
94
|
+
language: explicit ? (explicit === "pt" ? "pt" : "en") : languageForOrder(i),
|
|
95
|
+
template,
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function assertNotInterleaved(body, starts, ends) {
|
|
100
|
+
for (let i = 0; i < starts.length - 1; i++) {
|
|
101
|
+
if (starts[i + 1].index < ends[i].index) {
|
|
102
|
+
throw new PrecedenceError("CORRUPT_BLOCK", `Canonical markers are interleaved: start at line ${lineAt(body, starts[i + 1].index)} opens before the block opened at line ${lineAt(body, starts[i].index)} is closed at line ${lineAt(body, ends[i].index)}.`, {
|
|
103
|
+
outerStartLine: lineAt(body, starts[i].index),
|
|
104
|
+
innerStartLine: lineAt(body, starts[i + 1].index),
|
|
105
|
+
outerEndLine: lineAt(body, ends[i].index),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export function chooseSnippetTemplate(templates, language) {
|
|
111
|
+
const explicit = templates.find((t) => t.language === language);
|
|
112
|
+
if (explicit)
|
|
113
|
+
return explicit;
|
|
114
|
+
return templates[0];
|
|
115
|
+
}
|
|
116
|
+
// Inline-tolerant (A-2 migration: anything after the recognized prefix may
|
|
117
|
+
// evolve). The trailing EOL is consumed only when the marker ends its line.
|
|
118
|
+
const BLOCK_START_PATTERN = /<!--[ \t]*sirius:precedence-contract\b[^\n]*?-->[ \t]*(?:\r?\n|$)?/g;
|
|
119
|
+
const BLOCK_END_PATTERN = /<!--[ \t]*\/sirius:precedence-contract[ \t]*-->[ \t]*(?:\r?\n|$)?/g;
|
|
120
|
+
function parseInstalledVersion(text) {
|
|
121
|
+
return Number(VERSION_IN_MARKER.exec(text)?.[1] ?? NaN) || null;
|
|
122
|
+
}
|
|
123
|
+
const VERSION_IN_MARKER = /\bv(\d+)\b/;
|
|
124
|
+
const DIGEST_IN_MARKER = /digest:\s*([0-9a-fA-F]{8})\b/;
|
|
125
|
+
function describeDuplicates(label, markers, content) {
|
|
126
|
+
if (markers.length <= 1)
|
|
127
|
+
return null;
|
|
128
|
+
return `${markers.length} ${label} markers (lines ${markers
|
|
129
|
+
.map((m) => lineAt(content, m.index))
|
|
130
|
+
.join(", ")})`;
|
|
131
|
+
}
|
|
132
|
+
function presentLocation(content, start, end) {
|
|
133
|
+
return {
|
|
134
|
+
status: "present",
|
|
135
|
+
startIndex: start.index,
|
|
136
|
+
endIndex: end.index + end.text.length,
|
|
137
|
+
eol: end.text.endsWith("\r\n") ? "\r\n" : end.text.endsWith("\n") ? "\n" : "",
|
|
138
|
+
installedVersion: parseInstalledVersion(start.text),
|
|
139
|
+
installedDigest: DIGEST_IN_MARKER.exec(start.text)?.[1] ?? null,
|
|
140
|
+
startLine: lineAt(content, start.index),
|
|
141
|
+
endLine: lineAt(content, end.index),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function unbalancedProblems(content, starts, ends) {
|
|
145
|
+
const problems = [];
|
|
146
|
+
const startDuplicates = describeDuplicates("start", starts, content);
|
|
147
|
+
const endDuplicates = describeDuplicates("end", ends, content);
|
|
148
|
+
if (startDuplicates)
|
|
149
|
+
problems.push(startDuplicates);
|
|
150
|
+
if (endDuplicates)
|
|
151
|
+
problems.push(endDuplicates);
|
|
152
|
+
if (starts.length === 1 && ends.length === 0) {
|
|
153
|
+
problems.push(`start marker at line ${lineAt(content, starts[0].index)} has no end marker`);
|
|
154
|
+
}
|
|
155
|
+
if (starts.length === 0 && ends.length === 1) {
|
|
156
|
+
problems.push(`end marker at line ${lineAt(content, ends[0].index)} has no start marker`);
|
|
157
|
+
}
|
|
158
|
+
if (starts.length === 1 && ends.length === 1) {
|
|
159
|
+
problems.push(`start marker at line ${lineAt(content, starts[0].index)} appears after end marker at line ${lineAt(content, ends[0].index)}`);
|
|
160
|
+
}
|
|
161
|
+
return problems;
|
|
162
|
+
}
|
|
163
|
+
export function locateBlock(content) {
|
|
164
|
+
const starts = scanMarkers(content, BLOCK_START_PATTERN);
|
|
165
|
+
const ends = scanMarkers(content, BLOCK_END_PATTERN);
|
|
166
|
+
if (starts.length === 0 && ends.length === 0) {
|
|
167
|
+
return { status: "absent" };
|
|
168
|
+
}
|
|
169
|
+
if (starts.length === 1 && ends.length === 1 && starts[0].index < ends[0].index) {
|
|
170
|
+
return presentLocation(content, starts[0], ends[0]);
|
|
171
|
+
}
|
|
172
|
+
return { status: "corrupt", problems: unbalancedProblems(content, starts, ends) };
|
|
173
|
+
}
|
|
174
|
+
export function appendBlock(content, renderedBlockLf) {
|
|
175
|
+
const eol = detectDominantEol(content);
|
|
176
|
+
const separator = content.length === 0 || content.endsWith("\n") || content.endsWith("\r\n")
|
|
177
|
+
? ""
|
|
178
|
+
: eol;
|
|
179
|
+
return {
|
|
180
|
+
nextContent: `${content}${separator}${toEol(renderedBlockLf, eol)}${eol}`,
|
|
181
|
+
separatorInserted: separator.length > 0,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function requireIndex(location, key) {
|
|
185
|
+
const value = location.status === "present" ? location[key] : undefined;
|
|
186
|
+
if (typeof value !== "number") {
|
|
187
|
+
throw new PrecedenceError("CORRUPT_BLOCK", `Refusing to splice the file: block location is missing '${key}'.`);
|
|
188
|
+
}
|
|
189
|
+
return value;
|
|
190
|
+
}
|
|
191
|
+
export function replaceBlock(content, location, renderedBlockLf) {
|
|
192
|
+
const startIndex = requireIndex(location, "startIndex");
|
|
193
|
+
const endIndex = requireIndex(location, "endIndex");
|
|
194
|
+
const eol = location.eol === "" ? detectDominantEol(content) : location.eol;
|
|
195
|
+
const before = content.slice(0, startIndex);
|
|
196
|
+
const after = content.slice(endIndex);
|
|
197
|
+
return {
|
|
198
|
+
nextContent: `${before}${toEol(renderedBlockLf, eol)}${eol}${after}`,
|
|
199
|
+
separatorInserted: false,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
export function removeBlock(content, location) {
|
|
203
|
+
const startIndex = requireIndex(location, "startIndex");
|
|
204
|
+
const endIndex = requireIndex(location, "endIndex");
|
|
205
|
+
const before = content.slice(0, startIndex);
|
|
206
|
+
const after = content.slice(endIndex);
|
|
207
|
+
return {
|
|
208
|
+
nextContent: `${before}${after}`,
|
|
209
|
+
generatorCreated: before.trim() === "" && after.trim() === "",
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
export function snippetBodyWordCount(renderedBlock) {
|
|
213
|
+
const inner = renderedBlock
|
|
214
|
+
.replace(/^[^\n]*\n/, "")
|
|
215
|
+
.replace(/\n[^\n]*$/, "");
|
|
216
|
+
return inner.split(/\s+/).filter(Boolean).length;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=precedence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"precedence.js","sourceRoot":"","sources":["../../src/installer/precedence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type McpError } from "../errors.js";
|
|
2
|
+
import { type ClientTargetDefinition } from "./types.js";
|
|
3
|
+
import { type CanonicalTemplate, type SnippetLanguage, todayIso } from "./precedence.js";
|
|
4
|
+
export { todayIso };
|
|
5
|
+
import type { InstallerOptions, PatchAction } from "./types.js";
|
|
6
|
+
export type SnippetMode = "generate" | "remove" | "status";
|
|
7
|
+
export interface SnippetContractContext {
|
|
8
|
+
readonly contractFile: string;
|
|
9
|
+
readonly language: SnippetLanguage;
|
|
10
|
+
readonly contractVersion: number;
|
|
11
|
+
readonly contractBody: string;
|
|
12
|
+
readonly expectedBlock: string;
|
|
13
|
+
readonly expectedDigest: string;
|
|
14
|
+
readonly chosen: CanonicalTemplate;
|
|
15
|
+
}
|
|
16
|
+
export interface GroupOutcome {
|
|
17
|
+
readonly action: PatchAction;
|
|
18
|
+
readonly message: string;
|
|
19
|
+
readonly backupPath?: string;
|
|
20
|
+
readonly diff?: string;
|
|
21
|
+
readonly error?: {
|
|
22
|
+
code: string;
|
|
23
|
+
details: string;
|
|
24
|
+
};
|
|
25
|
+
readonly reason?: string;
|
|
26
|
+
readonly createdFile?: boolean;
|
|
27
|
+
readonly installedVersion?: number | null;
|
|
28
|
+
}
|
|
29
|
+
export interface SnippetTargetGroup {
|
|
30
|
+
readonly key: string;
|
|
31
|
+
readonly absPath: string;
|
|
32
|
+
readonly targets: ClientTargetDefinition[];
|
|
33
|
+
}
|
|
34
|
+
export declare function resolveMode(options: InstallerOptions): SnippetMode;
|
|
35
|
+
export declare function resolveSnippetTargets(options: InstallerOptions): ClientTargetDefinition[];
|
|
36
|
+
export declare function flagConflict(options: InstallerOptions): McpError | null;
|
|
37
|
+
export declare function normalizeLanguage(language: string | undefined): SnippetLanguage;
|
|
38
|
+
export interface SelectedEntry {
|
|
39
|
+
readonly id: string;
|
|
40
|
+
readonly target?: ClientTargetDefinition;
|
|
41
|
+
}
|
|
42
|
+
/** Selected targets, keeping unknown --clients ids visible as entries. */
|
|
43
|
+
export declare function selectedEntries(options: InstallerOptions): SelectedEntry[];
|
|
44
|
+
export declare function readFileOrNull(filePath: string): string | null;
|
|
45
|
+
export declare function contractBodyOf(raw: string): string;
|
|
46
|
+
export declare function buildContractContext(contractFile: string, language: SnippetLanguage, raw: string): SnippetContractContext;
|
|
47
|
+
export declare function notInitializedRefusal(): McpError;
|
|
48
|
+
export declare function contractMissingRefusal(): McpError;
|
|
49
|
+
//# sourceMappingURL=snippet-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippet-context.d.ts","sourceRoot":"","sources":["../../src/installer/snippet-context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EAQpB,QAAQ,EACT,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,EAAE,CAAC;CAC5C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW,CAIlE;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,gBAAgB,GACxB,sBAAsB,EAAE,CAa1B;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,QAAQ,GAAG,IAAI,CAkBvE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,CAE/E;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAC1C;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,EAAE,CAW1E;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO9D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,eAAe,EACzB,GAAG,EAAE,MAAM,GACV,sBAAsB,CAsBxB;AAED,wBAAgB,qBAAqB,IAAI,QAAQ,CAOhD;AAED,wBAAgB,sBAAsB,IAAI,QAAQ,CAOjD"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { parseDocumentMarkdown } from "../schemas/document.js";
|
|
3
|
+
import { mcpRefusal } from "../errors.js";
|
|
4
|
+
import { ALL_TARGETS, getTargetById } from "./targets.js";
|
|
5
|
+
import {} from "./types.js";
|
|
6
|
+
import { PrecedenceError, CONTRACT_MAX_BODY_BYTES, CONTRACT_RELATIVE_PATH, canonicalDigest, chooseSnippetTemplate, extractCanonicalTemplates, renderSnippetBlock, todayIso, } from "./precedence.js";
|
|
7
|
+
export { todayIso };
|
|
8
|
+
export function resolveMode(options) {
|
|
9
|
+
if (options.status)
|
|
10
|
+
return "status";
|
|
11
|
+
if (options.remove)
|
|
12
|
+
return "remove";
|
|
13
|
+
return "generate";
|
|
14
|
+
}
|
|
15
|
+
export function resolveSnippetTargets(options) {
|
|
16
|
+
if (options.targets && options.targets.length > 0) {
|
|
17
|
+
return options.targets
|
|
18
|
+
.map((id) => getTargetById(id))
|
|
19
|
+
.filter((t) => t !== undefined);
|
|
20
|
+
}
|
|
21
|
+
if (options.category === "cli") {
|
|
22
|
+
return ALL_TARGETS.filter((t) => t.category === "cli");
|
|
23
|
+
}
|
|
24
|
+
if (options.category === "ides") {
|
|
25
|
+
return ALL_TARGETS.filter((t) => t.category === "ide");
|
|
26
|
+
}
|
|
27
|
+
return [...ALL_TARGETS];
|
|
28
|
+
}
|
|
29
|
+
export function flagConflict(options) {
|
|
30
|
+
if (options.status && options.remove) {
|
|
31
|
+
return mcpRefusal("CONFLICTING_FLAGS", "--status and --remove cannot be combined.", "The flags request mutually exclusive modes.", "Run 'sirius snippet --status' or 'sirius snippet --remove' separately.");
|
|
32
|
+
}
|
|
33
|
+
if (options.status && options.dryRun) {
|
|
34
|
+
return mcpRefusal("CONFLICTING_FLAGS", "--status is strictly read-only; --dry-run does not apply.", "The flags request mutually exclusive modes.", "Drop --dry-run when requesting 'sirius snippet --status'.");
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
export function normalizeLanguage(language) {
|
|
39
|
+
return language === "pt" ? "pt" : "en";
|
|
40
|
+
}
|
|
41
|
+
/** Selected targets, keeping unknown --clients ids visible as entries. */
|
|
42
|
+
export function selectedEntries(options) {
|
|
43
|
+
if (options.targets && options.targets.length > 0) {
|
|
44
|
+
return options.targets.map((id) => ({ id, target: getTargetById(id) }));
|
|
45
|
+
}
|
|
46
|
+
if (options.category === "cli") {
|
|
47
|
+
return ALL_TARGETS.filter((t) => t.category === "cli").map((target) => ({ id: target.id, target }));
|
|
48
|
+
}
|
|
49
|
+
if (options.category === "ides") {
|
|
50
|
+
return ALL_TARGETS.filter((t) => t.category === "ide").map((target) => ({ id: target.id, target }));
|
|
51
|
+
}
|
|
52
|
+
return ALL_TARGETS.map((target) => ({ id: target.id, target }));
|
|
53
|
+
}
|
|
54
|
+
export function readFileOrNull(filePath) {
|
|
55
|
+
try {
|
|
56
|
+
return fs.readFileSync(filePath, "utf8");
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (err.code === "ENOENT")
|
|
60
|
+
return null;
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function contractBodyOf(raw) {
|
|
65
|
+
const parsed = parseDocumentMarkdown(raw);
|
|
66
|
+
return parsed.success ? parsed.data.body : raw;
|
|
67
|
+
}
|
|
68
|
+
export function buildContractContext(contractFile, language, raw) {
|
|
69
|
+
const templates = extractCanonicalTemplates(raw);
|
|
70
|
+
const version = templates[0].version;
|
|
71
|
+
const chosen = chooseSnippetTemplate(templates, language);
|
|
72
|
+
const contractBody = contractBodyOf(raw);
|
|
73
|
+
if (Buffer.byteLength(contractBody, "utf8") > CONTRACT_MAX_BODY_BYTES) {
|
|
74
|
+
throw new PrecedenceError("CONTRACT_TOO_LARGE", `Precedence contract body exceeds ${CONTRACT_MAX_BODY_BYTES} bytes (${Buffer.byteLength(contractBody, "utf8")}).`, { limitBytes: CONTRACT_MAX_BODY_BYTES, actualBytes: Buffer.byteLength(contractBody, "utf8") });
|
|
75
|
+
}
|
|
76
|
+
const expectedDigest = canonicalDigest(chosen.template);
|
|
77
|
+
return {
|
|
78
|
+
contractFile,
|
|
79
|
+
language,
|
|
80
|
+
contractVersion: version,
|
|
81
|
+
contractBody,
|
|
82
|
+
expectedDigest,
|
|
83
|
+
chosen,
|
|
84
|
+
expectedBlock: renderSnippetBlock(chosen.template, version, CONTRACT_RELATIVE_PATH),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function notInitializedRefusal() {
|
|
88
|
+
return mcpRefusal("PROJECT_NOT_INITIALIZED", "Project not initialized: context.config.yaml was not found.", "The snippet generator only runs inside an initialized Sirius project.", "Run 'sirius init' (or the project_init tool) in this repository, then re-run 'sirius snippet'.");
|
|
89
|
+
}
|
|
90
|
+
export function contractMissingRefusal() {
|
|
91
|
+
return mcpRefusal("PRECEDENCE_CONTRACT_MISSING", "The precedence contract was not found in the context store.", "A routing block must point at an existing contract document.", "Run 'sirius snippet' (it seeds the contract) or 'sirius init', then retry.");
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=snippet-context.js.map
|