@shrkcrft/cli 0.1.0-alpha.2 → 0.1.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit/knowledge-audit-llm.d.ts +19 -0
- package/dist/audit/knowledge-audit-llm.d.ts.map +1 -0
- package/dist/audit/knowledge-audit-llm.js +164 -0
- package/dist/audit/knowledge-audit.d.ts +61 -0
- package/dist/audit/knowledge-audit.d.ts.map +1 -0
- package/dist/audit/knowledge-audit.js +203 -0
- package/dist/audit/knowledge-fix-plan-llm.d.ts +11 -0
- package/dist/audit/knowledge-fix-plan-llm.d.ts.map +1 -0
- package/dist/audit/knowledge-fix-plan-llm.js +141 -0
- package/dist/audit/knowledge-fix-plan.d.ts +41 -0
- package/dist/audit/knowledge-fix-plan.d.ts.map +1 -0
- package/dist/audit/knowledge-fix-plan.js +125 -0
- package/dist/audit/pipeline-audit-llm.d.ts +11 -0
- package/dist/audit/pipeline-audit-llm.d.ts.map +1 -0
- package/dist/audit/pipeline-audit-llm.js +134 -0
- package/dist/audit/pipeline-audit.d.ts +69 -0
- package/dist/audit/pipeline-audit.d.ts.map +1 -0
- package/dist/audit/pipeline-audit.js +166 -0
- package/dist/audit/templates-audit-llm.d.ts +19 -0
- package/dist/audit/templates-audit-llm.d.ts.map +1 -0
- package/dist/audit/templates-audit-llm.js +207 -0
- package/dist/audit/templates-audit.d.ts +63 -0
- package/dist/audit/templates-audit.d.ts.map +1 -0
- package/dist/audit/templates-audit.js +171 -0
- package/dist/audit/templates-fix-plan-llm.d.ts +19 -0
- package/dist/audit/templates-fix-plan-llm.d.ts.map +1 -0
- package/dist/audit/templates-fix-plan-llm.js +162 -0
- package/dist/audit/templates-fix-plan.d.ts +37 -0
- package/dist/audit/templates-fix-plan.d.ts.map +1 -0
- package/dist/audit/templates-fix-plan.js +174 -0
- package/dist/command-registry.d.ts +28 -0
- package/dist/command-registry.d.ts.map +1 -1
- package/dist/command-registry.js +91 -1
- package/dist/commands/ai-status.command.d.ts +19 -0
- package/dist/commands/ai-status.command.d.ts.map +1 -0
- package/dist/commands/ai-status.command.js +94 -0
- package/dist/commands/api-diff.command.d.ts +11 -0
- package/dist/commands/api-diff.command.d.ts.map +1 -0
- package/dist/commands/api-diff.command.js +144 -0
- package/dist/commands/apply.command.d.ts.map +1 -1
- package/dist/commands/apply.command.js +10 -2
- package/dist/commands/arch.command.d.ts +9 -0
- package/dist/commands/arch.command.d.ts.map +1 -0
- package/dist/commands/arch.command.js +186 -0
- package/dist/commands/ask.command.d.ts.map +1 -1
- package/dist/commands/ask.command.js +10 -9
- package/dist/commands/cache-align.command.d.ts +12 -0
- package/dist/commands/cache-align.command.d.ts.map +1 -0
- package/dist/commands/cache-align.command.js +78 -0
- package/dist/commands/check.command.d.ts.map +1 -1
- package/dist/commands/check.command.js +26 -2
- package/dist/commands/code-intel.command.d.ts +18 -0
- package/dist/commands/code-intel.command.d.ts.map +1 -0
- package/dist/commands/code-intel.command.js +146 -0
- package/dist/commands/codemod.command.d.ts.map +1 -1
- package/dist/commands/codemod.command.js +27 -6
- package/dist/commands/command-catalog.d.ts +15 -3
- package/dist/commands/command-catalog.d.ts.map +1 -1
- package/dist/commands/command-catalog.js +407 -34
- package/dist/commands/commands.command.d.ts.map +1 -1
- package/dist/commands/commands.command.js +4 -4
- package/dist/commands/completion.command.d.ts +10 -0
- package/dist/commands/completion.command.d.ts.map +1 -0
- package/dist/commands/completion.command.js +121 -0
- package/dist/commands/compress.command.d.ts +8 -0
- package/dist/commands/compress.command.d.ts.map +1 -0
- package/dist/commands/compress.command.js +147 -0
- package/dist/commands/constructs.command.d.ts.map +1 -1
- package/dist/commands/constructs.command.js +89 -23
- package/dist/commands/context.command.d.ts.map +1 -1
- package/dist/commands/context.command.js +121 -1
- package/dist/commands/contract-gate.command.d.ts.map +1 -1
- package/dist/commands/contract-gate.command.js +5 -1
- package/dist/commands/delegate.command.d.ts +65 -0
- package/dist/commands/delegate.command.d.ts.map +1 -0
- package/dist/commands/delegate.command.js +657 -0
- package/dist/commands/deps-audit.command.d.ts +23 -0
- package/dist/commands/deps-audit.command.d.ts.map +1 -0
- package/dist/commands/deps-audit.command.js +270 -0
- package/dist/commands/dev.command.d.ts.map +1 -1
- package/dist/commands/dev.command.js +5 -2
- package/dist/commands/diff-check.command.d.ts +30 -0
- package/dist/commands/diff-check.command.d.ts.map +1 -0
- package/dist/commands/diff-check.command.js +210 -0
- package/dist/commands/doctor.command.d.ts.map +1 -1
- package/dist/commands/doctor.command.js +162 -10
- package/dist/commands/export.command.d.ts.map +1 -1
- package/dist/commands/export.command.js +76 -3
- package/dist/commands/framework.command.d.ts +12 -0
- package/dist/commands/framework.command.d.ts.map +1 -0
- package/dist/commands/framework.command.js +180 -0
- package/dist/commands/gate.command.d.ts +15 -0
- package/dist/commands/gate.command.d.ts.map +1 -0
- package/dist/commands/gate.command.js +300 -0
- package/dist/commands/gen.command.d.ts.map +1 -1
- package/dist/commands/gen.command.js +13 -1
- package/dist/commands/graph-code-subverbs.d.ts +33 -0
- package/dist/commands/graph-code-subverbs.d.ts.map +1 -0
- package/dist/commands/graph-code-subverbs.js +1385 -0
- package/dist/commands/graph.command.d.ts.map +1 -1
- package/dist/commands/graph.command.js +31 -2
- package/dist/commands/help.command.d.ts +4 -3
- package/dist/commands/help.command.d.ts.map +1 -1
- package/dist/commands/help.command.js +86 -18
- package/dist/commands/helper.command.js +1 -1
- package/dist/commands/impact.command.d.ts.map +1 -1
- package/dist/commands/impact.command.js +171 -1
- package/dist/commands/import.command.d.ts.map +1 -1
- package/dist/commands/import.command.js +121 -5
- package/dist/commands/ingest.command.d.ts.map +1 -1
- package/dist/commands/ingest.command.js +5 -1
- package/dist/commands/init.command.d.ts.map +1 -1
- package/dist/commands/init.command.js +174 -7
- package/dist/commands/knowledge-author.command.d.ts.map +1 -1
- package/dist/commands/knowledge-author.command.js +9 -0
- package/dist/commands/knowledge-propose.command.d.ts.map +1 -1
- package/dist/commands/knowledge-propose.command.js +4 -2
- package/dist/commands/knowledge.command.d.ts.map +1 -1
- package/dist/commands/knowledge.command.js +26 -3
- package/dist/commands/migrate.command.d.ts +13 -0
- package/dist/commands/migrate.command.d.ts.map +1 -0
- package/dist/commands/migrate.command.js +152 -0
- package/dist/commands/move-plan.command.d.ts +23 -0
- package/dist/commands/move-plan.command.d.ts.map +1 -0
- package/dist/commands/move-plan.command.js +360 -0
- package/dist/commands/packs-new.d.ts +1 -1
- package/dist/commands/packs-new.d.ts.map +1 -1
- package/dist/commands/packs-new.js +5 -36
- package/dist/commands/packs.command.d.ts.map +1 -1
- package/dist/commands/packs.command.js +2 -10
- package/dist/commands/plan-context.command.d.ts +11 -0
- package/dist/commands/plan-context.command.d.ts.map +1 -0
- package/dist/commands/plan-context.command.js +85 -0
- package/dist/commands/preflight.command.d.ts.map +1 -1
- package/dist/commands/preflight.command.js +15 -0
- package/dist/commands/profiles.command.js +4 -4
- package/dist/commands/recommend.command.d.ts +6 -0
- package/dist/commands/recommend.command.d.ts.map +1 -1
- package/dist/commands/recommend.command.js +119 -5
- package/dist/commands/release.command.js +13 -13
- package/dist/commands/rule-graph-subverbs.d.ts +3 -0
- package/dist/commands/rule-graph-subverbs.d.ts.map +1 -0
- package/dist/commands/rule-graph-subverbs.js +132 -0
- package/dist/commands/rules.command.d.ts.map +1 -1
- package/dist/commands/rules.command.js +20 -3
- package/dist/commands/scaffold-validate.command.d.ts +22 -0
- package/dist/commands/scaffold-validate.command.d.ts.map +1 -0
- package/dist/commands/scaffold-validate.command.js +215 -0
- package/dist/commands/search-structural.command.d.ts +18 -0
- package/dist/commands/search-structural.command.d.ts.map +1 -0
- package/dist/commands/search-structural.command.js +376 -0
- package/dist/commands/search.command.js +1 -1
- package/dist/commands/smart-context.command.d.ts +67 -0
- package/dist/commands/smart-context.command.d.ts.map +1 -0
- package/dist/commands/smart-context.command.js +4728 -0
- package/dist/commands/spike.command.d.ts +22 -0
- package/dist/commands/spike.command.d.ts.map +1 -0
- package/dist/commands/spike.command.js +235 -0
- package/dist/commands/surface.command.d.ts +1 -0
- package/dist/commands/surface.command.d.ts.map +1 -1
- package/dist/commands/surface.command.js +10 -3
- package/dist/commands/task-context.command.d.ts.map +1 -1
- package/dist/commands/task-context.command.js +5 -17
- package/dist/commands/task.command.d.ts.map +1 -1
- package/dist/commands/task.command.js +8 -2
- package/dist/commands/template-quality.command.d.ts.map +1 -1
- package/dist/commands/template-quality.command.js +39 -3
- package/dist/commands/templates.command.d.ts.map +1 -1
- package/dist/commands/templates.command.js +37 -2
- package/dist/commands/tests.command.d.ts.map +1 -1
- package/dist/commands/tests.command.js +13 -2
- package/dist/commands/watch.command.d.ts +26 -0
- package/dist/commands/watch.command.d.ts.map +1 -0
- package/dist/commands/watch.command.js +456 -0
- package/dist/dashboard/code-intelligence-data.d.ts +33 -0
- package/dist/dashboard/code-intelligence-data.d.ts.map +1 -0
- package/dist/dashboard/code-intelligence-data.js +329 -0
- package/dist/dashboard/dashboard-api-server.d.ts.map +1 -1
- package/dist/dashboard/dashboard-api-server.js +256 -2
- package/dist/dashboard/knowledge-ask.d.ts +4 -0
- package/dist/dashboard/knowledge-ask.d.ts.map +1 -0
- package/dist/dashboard/knowledge-ask.js +112 -0
- package/dist/env/load-dotenv.d.ts +15 -0
- package/dist/env/load-dotenv.d.ts.map +1 -0
- package/dist/env/load-dotenv.js +70 -0
- package/dist/export/claude-commands-export.d.ts +60 -0
- package/dist/export/claude-commands-export.d.ts.map +1 -0
- package/dist/export/claude-commands-export.js +276 -0
- package/dist/export/export-formats.d.ts +1 -1
- package/dist/export/export-formats.d.ts.map +1 -1
- package/dist/export/export-formats.js +139 -12
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/init/init-templates.d.ts.map +1 -1
- package/dist/init/init-templates.js +133 -113
- package/dist/init/paths-advisory.d.ts +20 -0
- package/dist/init/paths-advisory.d.ts.map +1 -0
- package/dist/init/paths-advisory.js +88 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +331 -17
- package/dist/output/ccr-store-config.d.ts +18 -0
- package/dist/output/ccr-store-config.d.ts.map +1 -0
- package/dist/output/ccr-store-config.js +41 -0
- package/dist/output/format-output.d.ts.map +1 -1
- package/dist/output/format-output.js +6 -1
- package/dist/output/output-compression.d.ts +15 -0
- package/dist/output/output-compression.d.ts.map +1 -0
- package/dist/output/output-compression.js +60 -0
- package/dist/output/resolve-compress-type.d.ts +22 -0
- package/dist/output/resolve-compress-type.d.ts.map +1 -0
- package/dist/output/resolve-compress-type.js +21 -0
- package/dist/output/watch-loop.d.ts +9 -1
- package/dist/output/watch-loop.d.ts.map +1 -1
- package/dist/output/watch-loop.js +13 -3
- package/dist/schemas/json-schemas.d.ts +384 -36
- package/dist/schemas/json-schemas.d.ts.map +1 -1
- package/dist/schemas/json-schemas.js +247 -36
- package/dist/surface/profiles.d.ts.map +1 -1
- package/dist/surface/profiles.js +54 -10
- package/dist/surface/surface-config-writer.d.ts.map +1 -1
- package/dist/surface/surface-config-writer.js +23 -11
- package/dist/validation/run-validation-loop.d.ts.map +1 -1
- package/dist/validation/run-validation-loop.js +5 -1
- package/package.json +35 -21
- package/dist/commands/plugin.command.d.ts +0 -11
- package/dist/commands/plugin.command.d.ts.map +0 -1
- package/dist/commands/plugin.command.js +0 -394
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only "ask a question over the knowledge base" for the dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Deterministic retrieval (searchKnowledge) is the source of truth and ALWAYS
|
|
5
|
+
* populates `sources`. The local LLM only synthesizes a prose `answer` grounded
|
|
6
|
+
* in those entries. When no LLM is reachable, or it times out / errors, the
|
|
7
|
+
* response degrades gracefully to the retrieved entries — the GET handler never
|
|
8
|
+
* hangs and never writes anything.
|
|
9
|
+
*/
|
|
10
|
+
import { ERROR_CODES } from '@shrkcrft/core';
|
|
11
|
+
import { AiMessageRole, selectAiProvider } from '@shrkcrft/ai';
|
|
12
|
+
import { searchKnowledge } from '@shrkcrft/knowledge';
|
|
13
|
+
/** Hard wall-clock bound so a slow local model can't hang a dashboard GET. */
|
|
14
|
+
const ASK_TIMEOUT_MS = 15_000;
|
|
15
|
+
/** How many entries to retrieve and feed as grounding. */
|
|
16
|
+
const RETRIEVE_LIMIT = 8;
|
|
17
|
+
/** Per-entry grounding budget (chars) — keeps the prompt small for local models. */
|
|
18
|
+
const ENTRY_CHARS = 1100;
|
|
19
|
+
const SYSTEM_PROMPT = [
|
|
20
|
+
'You are the SharkCraft knowledge assistant for a single repository.',
|
|
21
|
+
'Answer the question USING ONLY the knowledge entries provided below as context.',
|
|
22
|
+
'Every entry is delimited and prefixed with its id in [brackets].',
|
|
23
|
+
'Cite the entries you used by writing their id in [brackets] inline.',
|
|
24
|
+
'If the answer is not present in the provided entries, say so plainly — do not invent.',
|
|
25
|
+
'Be concise: a few short paragraphs or bullets. No preamble, no sign-off.',
|
|
26
|
+
].join('\n');
|
|
27
|
+
function roundScore(n) {
|
|
28
|
+
return Math.round(n * 100) / 100;
|
|
29
|
+
}
|
|
30
|
+
function buildMessages(question, grounding) {
|
|
31
|
+
return [
|
|
32
|
+
{ role: AiMessageRole.System, content: SYSTEM_PROMPT },
|
|
33
|
+
{
|
|
34
|
+
role: AiMessageRole.User,
|
|
35
|
+
content: [
|
|
36
|
+
'# Knowledge entries',
|
|
37
|
+
grounding,
|
|
38
|
+
'',
|
|
39
|
+
'# Question',
|
|
40
|
+
question.trim(),
|
|
41
|
+
'',
|
|
42
|
+
'Answer now, citing entry ids in [brackets].',
|
|
43
|
+
].join('\n'),
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
export async function buildKnowledgeAsk(inspection, question) {
|
|
48
|
+
const startedAt = Date.now();
|
|
49
|
+
const trimmed = question.trim();
|
|
50
|
+
// 1. Deterministic retrieval — always available, the engine's ground truth.
|
|
51
|
+
const results = searchKnowledge(inspection.knowledgeEntries, {
|
|
52
|
+
query: trimmed,
|
|
53
|
+
limit: RETRIEVE_LIMIT,
|
|
54
|
+
});
|
|
55
|
+
const sources = results.map((r) => ({
|
|
56
|
+
id: r.entry.id,
|
|
57
|
+
title: r.entry.title,
|
|
58
|
+
type: String(r.entry.type),
|
|
59
|
+
score: roundScore(r.score),
|
|
60
|
+
}));
|
|
61
|
+
const degrade = (note, provider) => ({
|
|
62
|
+
question: trimmed,
|
|
63
|
+
llmAvailable: false,
|
|
64
|
+
...(provider ? { provider } : {}),
|
|
65
|
+
answer: null,
|
|
66
|
+
degraded: true,
|
|
67
|
+
note,
|
|
68
|
+
sources,
|
|
69
|
+
citedEntryIds: [],
|
|
70
|
+
durationMs: Date.now() - startedAt,
|
|
71
|
+
});
|
|
72
|
+
// 2. Provider selection — local-only, may be absent.
|
|
73
|
+
const selection = selectAiProvider(process.env.AI_PROVIDER);
|
|
74
|
+
if (!selection.provider) {
|
|
75
|
+
return degrade('No local LLM is reachable, so this is the deterministic top-matches view. Start an Ollama daemon or set LLAMACPP_MODEL_PATH to enable synthesized answers.');
|
|
76
|
+
}
|
|
77
|
+
if (results.length === 0) {
|
|
78
|
+
return degrade('No knowledge entries matched the question.', selection.provider.id);
|
|
79
|
+
}
|
|
80
|
+
// 3. Grounded prompt from the retrieved entries.
|
|
81
|
+
const grounding = results
|
|
82
|
+
.map((r) => {
|
|
83
|
+
const body = (r.entry.summary ?? r.entry.content).slice(0, ENTRY_CHARS);
|
|
84
|
+
return `### [${r.entry.id}] ${r.entry.title}\n${body}`;
|
|
85
|
+
})
|
|
86
|
+
.join('\n\n');
|
|
87
|
+
// 4. Bounded LLM call; any failure degrades to retrieval-only.
|
|
88
|
+
const res = await selection.provider.send({
|
|
89
|
+
messages: buildMessages(trimmed, grounding),
|
|
90
|
+
maxTokens: 1024,
|
|
91
|
+
temperature: 0.2,
|
|
92
|
+
timeoutMs: ASK_TIMEOUT_MS,
|
|
93
|
+
});
|
|
94
|
+
if (!res.ok) {
|
|
95
|
+
const note = res.error.code === ERROR_CODES.TIMEOUT
|
|
96
|
+
? 'The local LLM timed out — showing the deterministic top matches instead.'
|
|
97
|
+
: `The local LLM could not answer (${res.error.message}) — showing the deterministic top matches instead.`;
|
|
98
|
+
return degrade(note, selection.provider.id);
|
|
99
|
+
}
|
|
100
|
+
const answer = res.value.content.trim();
|
|
101
|
+
const citedEntryIds = sources.map((s) => s.id).filter((id) => answer.includes(id));
|
|
102
|
+
return {
|
|
103
|
+
question: trimmed,
|
|
104
|
+
llmAvailable: true,
|
|
105
|
+
provider: selection.provider.id,
|
|
106
|
+
answer,
|
|
107
|
+
degraded: false,
|
|
108
|
+
sources,
|
|
109
|
+
citedEntryIds,
|
|
110
|
+
durationMs: Date.now() - startedAt,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal `.env` loader for the Node-based `shrk` binary.
|
|
3
|
+
*
|
|
4
|
+
* Bun auto-loads `.env`; Node does not. This walks from `cwd` up to the
|
|
5
|
+
* filesystem root looking for a `.env` file and merges any KEY=VALUE
|
|
6
|
+
* pairs into `process.env` — but only when the key is not already set,
|
|
7
|
+
* so an actual shell export always wins.
|
|
8
|
+
*
|
|
9
|
+
* No dependency on `dotenv`. Parser is intentionally small: lines that
|
|
10
|
+
* start with `#` are comments, blank lines are skipped, surrounding
|
|
11
|
+
* single/double quotes on the value are stripped, and escaped `\n`
|
|
12
|
+
* sequences inside double-quoted values become real newlines.
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadDotenv(startDir: string): void;
|
|
15
|
+
//# sourceMappingURL=load-dotenv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-dotenv.d.ts","sourceRoot":"","sources":["../../src/env/load-dotenv.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAmBjD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import * as nodePath from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Minimal `.env` loader for the Node-based `shrk` binary.
|
|
5
|
+
*
|
|
6
|
+
* Bun auto-loads `.env`; Node does not. This walks from `cwd` up to the
|
|
7
|
+
* filesystem root looking for a `.env` file and merges any KEY=VALUE
|
|
8
|
+
* pairs into `process.env` — but only when the key is not already set,
|
|
9
|
+
* so an actual shell export always wins.
|
|
10
|
+
*
|
|
11
|
+
* No dependency on `dotenv`. Parser is intentionally small: lines that
|
|
12
|
+
* start with `#` are comments, blank lines are skipped, surrounding
|
|
13
|
+
* single/double quotes on the value are stripped, and escaped `\n`
|
|
14
|
+
* sequences inside double-quoted values become real newlines.
|
|
15
|
+
*/
|
|
16
|
+
export function loadDotenv(startDir) {
|
|
17
|
+
const envPath = findEnvFile(startDir);
|
|
18
|
+
if (!envPath)
|
|
19
|
+
return;
|
|
20
|
+
let body;
|
|
21
|
+
try {
|
|
22
|
+
body = readFileSync(envPath, 'utf8');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
for (const rawLine of body.split(/\r?\n/)) {
|
|
28
|
+
const line = rawLine.trim();
|
|
29
|
+
if (line.length === 0 || line.startsWith('#'))
|
|
30
|
+
continue;
|
|
31
|
+
const eq = line.indexOf('=');
|
|
32
|
+
if (eq <= 0)
|
|
33
|
+
continue;
|
|
34
|
+
const key = line.slice(0, eq).trim();
|
|
35
|
+
if (!isValidKey(key))
|
|
36
|
+
continue;
|
|
37
|
+
if (process.env[key] !== undefined)
|
|
38
|
+
continue;
|
|
39
|
+
process.env[key] = unquote(line.slice(eq + 1).trim());
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function isValidKey(key) {
|
|
43
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(key);
|
|
44
|
+
}
|
|
45
|
+
function unquote(value) {
|
|
46
|
+
if (value.length >= 2) {
|
|
47
|
+
const first = value[0];
|
|
48
|
+
const last = value[value.length - 1];
|
|
49
|
+
if (first === '"' && last === '"') {
|
|
50
|
+
return value.slice(1, -1).replace(/\\n/g, '\n').replace(/\\r/g, '\r').replace(/\\t/g, '\t');
|
|
51
|
+
}
|
|
52
|
+
if (first === "'" && last === "'") {
|
|
53
|
+
return value.slice(1, -1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const hash = value.indexOf(' #');
|
|
57
|
+
return hash === -1 ? value : value.slice(0, hash).trimEnd();
|
|
58
|
+
}
|
|
59
|
+
function findEnvFile(startDir) {
|
|
60
|
+
let dir = nodePath.resolve(startDir);
|
|
61
|
+
while (true) {
|
|
62
|
+
const candidate = nodePath.join(dir, '.env');
|
|
63
|
+
if (existsSync(candidate))
|
|
64
|
+
return candidate;
|
|
65
|
+
const parent = nodePath.dirname(dir);
|
|
66
|
+
if (parent === dir)
|
|
67
|
+
return null;
|
|
68
|
+
dir = parent;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.claude/commands/` generator — emits per-project slash commands
|
|
3
|
+
* for Claude Code. Companion to `claude-skill` export, but with a
|
|
4
|
+
* different inversion semantics:
|
|
5
|
+
*
|
|
6
|
+
* - **claude-skill** loads rules into Claude's prompt automatically
|
|
7
|
+
* based on description match. Passive — Claude reads the rules.
|
|
8
|
+
* - **claude-commands** registers slash commands the USER invokes
|
|
9
|
+
* (`/new-service`, `/check-changes`). Active — the command IS the
|
|
10
|
+
* recipe; Claude follows it step-by-step.
|
|
11
|
+
*
|
|
12
|
+
* Generated commands fall into two buckets:
|
|
13
|
+
*
|
|
14
|
+
* **Static commands** (always present, project-agnostic recipes):
|
|
15
|
+
* - `/follow-shrk` — short reminder of the apply-gate flow.
|
|
16
|
+
* - `/check-changes` — runs `shrk check boundaries --changed-only`
|
|
17
|
+
* scoped to the current diff and reports back.
|
|
18
|
+
* - `/shrk-brief` — runs `shrk brief` and uses the output for the
|
|
19
|
+
* current task.
|
|
20
|
+
* - `/explain-file <path>` — per-file rules / paths / boundary
|
|
21
|
+
* lookup (pairs with `shrk advise <path>` from Phase 3).
|
|
22
|
+
*
|
|
23
|
+
* **Per-template commands** (one per id in `sharkcraft/templates.ts`):
|
|
24
|
+
* - `/new-<template-id>` — Claude runs `shrk gen <template-id>
|
|
25
|
+
* <name> --dry-run --save-plan ...`, reviews the plan, and
|
|
26
|
+
* applies via `shrk apply ... --verify-signature --validate`.
|
|
27
|
+
*
|
|
28
|
+
* Generated files are self-contained markdown — no `@shrkcrft/*`
|
|
29
|
+
* imports, no shell expansions. Each one is a complete "recipe in a
|
|
30
|
+
* file" that Claude Code reads when the user types the slash command.
|
|
31
|
+
*/
|
|
32
|
+
import type { ISharkcraftInspection } from '@shrkcrft/inspector';
|
|
33
|
+
export interface IClaudeCommandFile {
|
|
34
|
+
/** Path relative to project root (e.g. `.claude/commands/new-service.md`). */
|
|
35
|
+
path: string;
|
|
36
|
+
/** Full markdown body, including YAML frontmatter. */
|
|
37
|
+
content: string;
|
|
38
|
+
/** The slash name users type (e.g. `new-service` → `/new-service`). */
|
|
39
|
+
slash: string;
|
|
40
|
+
/** Why this command was generated — surfaces in the dry-run summary. */
|
|
41
|
+
source: 'static' | 'template';
|
|
42
|
+
}
|
|
43
|
+
export interface IClaudeCommandsResult {
|
|
44
|
+
files: readonly IClaudeCommandFile[];
|
|
45
|
+
}
|
|
46
|
+
export interface IClaudeCommandsOptions {
|
|
47
|
+
/**
|
|
48
|
+
* Cap on the number of per-template commands to emit. Default 20.
|
|
49
|
+
* Templates are sorted by id; the first N are kept.
|
|
50
|
+
*/
|
|
51
|
+
maxTemplateCommands?: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Build the full set of `.claude/commands/*.md` files for a project.
|
|
55
|
+
*
|
|
56
|
+
* Pure — caller writes the bytes. Same shape as the `synthesize-*`
|
|
57
|
+
* functions in this codebase: input inspection → output file list.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildClaudeCommands(inspection: ISharkcraftInspection, options?: IClaudeCommandsOptions): IClaudeCommandsResult;
|
|
60
|
+
//# sourceMappingURL=claude-commands-export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-commands-export.d.ts","sourceRoot":"","sources":["../../src/export/claude-commands-export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACtC;AA0MD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAsDvB"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.claude/commands/` generator — emits per-project slash commands
|
|
3
|
+
* for Claude Code. Companion to `claude-skill` export, but with a
|
|
4
|
+
* different inversion semantics:
|
|
5
|
+
*
|
|
6
|
+
* - **claude-skill** loads rules into Claude's prompt automatically
|
|
7
|
+
* based on description match. Passive — Claude reads the rules.
|
|
8
|
+
* - **claude-commands** registers slash commands the USER invokes
|
|
9
|
+
* (`/new-service`, `/check-changes`). Active — the command IS the
|
|
10
|
+
* recipe; Claude follows it step-by-step.
|
|
11
|
+
*
|
|
12
|
+
* Generated commands fall into two buckets:
|
|
13
|
+
*
|
|
14
|
+
* **Static commands** (always present, project-agnostic recipes):
|
|
15
|
+
* - `/follow-shrk` — short reminder of the apply-gate flow.
|
|
16
|
+
* - `/check-changes` — runs `shrk check boundaries --changed-only`
|
|
17
|
+
* scoped to the current diff and reports back.
|
|
18
|
+
* - `/shrk-brief` — runs `shrk brief` and uses the output for the
|
|
19
|
+
* current task.
|
|
20
|
+
* - `/explain-file <path>` — per-file rules / paths / boundary
|
|
21
|
+
* lookup (pairs with `shrk advise <path>` from Phase 3).
|
|
22
|
+
*
|
|
23
|
+
* **Per-template commands** (one per id in `sharkcraft/templates.ts`):
|
|
24
|
+
* - `/new-<template-id>` — Claude runs `shrk gen <template-id>
|
|
25
|
+
* <name> --dry-run --save-plan ...`, reviews the plan, and
|
|
26
|
+
* applies via `shrk apply ... --verify-signature --validate`.
|
|
27
|
+
*
|
|
28
|
+
* Generated files are self-contained markdown — no `@shrkcrft/*`
|
|
29
|
+
* imports, no shell expansions. Each one is a complete "recipe in a
|
|
30
|
+
* file" that Claude Code reads when the user types the slash command.
|
|
31
|
+
*/
|
|
32
|
+
// ─── Static commands (always emitted) ────────────────────────────────────────
|
|
33
|
+
const STATIC_FOLLOW_SHRK = `---
|
|
34
|
+
description: Reminder of the shrk apply-gate flow for this project. Use when generating or modifying code so the change passes the same boundary / validation gates the project CI uses.
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# Follow the shrk apply-gate flow
|
|
38
|
+
|
|
39
|
+
This repo uses [SharkCraft](https://github.com/shrkcrft/sharkcraft) as the
|
|
40
|
+
gate for AI-written code. Skip the gate and CI will fail with the same
|
|
41
|
+
errors anyway — save the round-trip.
|
|
42
|
+
|
|
43
|
+
## The loop
|
|
44
|
+
|
|
45
|
+
1. **Get focused context first.**
|
|
46
|
+
- Run: \`shrk task "<one-sentence task>"\` for a task packet (relevant rules + templates + verification commands).
|
|
47
|
+
- Or: \`shrk brief\` for the single-page project brief.
|
|
48
|
+
|
|
49
|
+
2. **Scaffold via a template (not freehand).**
|
|
50
|
+
- List options: \`shrk templates list\`.
|
|
51
|
+
- Dry-run + save plan: \`shrk gen <template-id> <name> --dry-run --save-plan /tmp/plan.json\`.
|
|
52
|
+
|
|
53
|
+
3. **Apply the plan through the CLI.**
|
|
54
|
+
- \`shrk apply /tmp/plan.json --verify-signature --validate\`.
|
|
55
|
+
- Never write files directly through MCP — MCP is read-only in this repo.
|
|
56
|
+
|
|
57
|
+
4. **Verify before declaring done.**
|
|
58
|
+
- \`shrk check boundaries --changed-only\` — fails if the diff broke any layer rule.
|
|
59
|
+
- \`shrk check imports\` — fails on lazy requires / cross-package deep imports.
|
|
60
|
+
- Project verification commands (from \`shrk task\`'s \`actionHints.verificationCommands\`).
|
|
61
|
+
|
|
62
|
+
## When this loop doesn't apply
|
|
63
|
+
|
|
64
|
+
- Tiny changes that don't touch source files (docs, comments).
|
|
65
|
+
- Read-only investigations.
|
|
66
|
+
- Anything where shrk would clearly be in the way.
|
|
67
|
+
|
|
68
|
+
In all other cases: **follow the loop**. The gates are short; the rework if you skip them is long.
|
|
69
|
+
`;
|
|
70
|
+
const STATIC_CHECK_CHANGES = `---
|
|
71
|
+
description: Run shrk's boundary + import-hygiene checks on the current git diff. Use after making any file change to confirm the change didn't violate the project's architecture rules before declaring the task done.
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
# Check the current diff for boundary violations
|
|
75
|
+
|
|
76
|
+
Run the diff-scoped boundary check:
|
|
77
|
+
|
|
78
|
+
\`\`\`bash
|
|
79
|
+
shrk check boundaries --changed-only
|
|
80
|
+
\`\`\`
|
|
81
|
+
|
|
82
|
+
Run the import-hygiene check on the changed files:
|
|
83
|
+
|
|
84
|
+
\`\`\`bash
|
|
85
|
+
shrk check imports
|
|
86
|
+
\`\`\`
|
|
87
|
+
|
|
88
|
+
## Interpreting the output
|
|
89
|
+
|
|
90
|
+
- **Exit 0, "0 violations":** safe to declare done.
|
|
91
|
+
- **Exit non-zero with violations listed:** fix each violation before continuing. Each violation has a \`suggestedFix\` line — apply it.
|
|
92
|
+
- **A violation on a file you didn't change:** that's a pre-existing violation in the repo. Ignore it; the \`--changed-only\` filter only fails on violations your diff introduced.
|
|
93
|
+
|
|
94
|
+
If the violations look like false positives, consult \`sharkcraft/boundaries.ts\` (the rule definitions) — don't disable them ad-hoc.
|
|
95
|
+
`;
|
|
96
|
+
const STATIC_SHRK_BRIEF = `---
|
|
97
|
+
description: Pull shrk's single-page project brief — focused rules, paths, verification commands. Use when starting work in this codebase so you have the project's actual conventions in context before writing any code.
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
# Pull the shrk brief for this project
|
|
101
|
+
|
|
102
|
+
Run the project brief:
|
|
103
|
+
|
|
104
|
+
\`\`\`bash
|
|
105
|
+
shrk brief
|
|
106
|
+
\`\`\`
|
|
107
|
+
|
|
108
|
+
This returns a compact markdown brief covering:
|
|
109
|
+
- Project overview (name, frameworks, package manager).
|
|
110
|
+
- Top rules that apply to code generation in this repo.
|
|
111
|
+
- Path conventions (where different file types belong).
|
|
112
|
+
- Action hints (commands, MCP tools, verification commands).
|
|
113
|
+
- Forbidden actions (what NOT to do).
|
|
114
|
+
|
|
115
|
+
For a per-task version (only the rules + paths + templates relevant to one task):
|
|
116
|
+
|
|
117
|
+
\`\`\`bash
|
|
118
|
+
shrk task "<one-sentence task description>"
|
|
119
|
+
\`\`\`
|
|
120
|
+
|
|
121
|
+
Both are read-only — no files are touched. Use the output to shape your plan before making any changes.
|
|
122
|
+
`;
|
|
123
|
+
const STATIC_EXPLAIN_FILE = `---
|
|
124
|
+
description: Look up the rules, path conventions, and boundary rules that apply to a specific file in this codebase. Use before editing an unfamiliar file so you follow the project's per-area conventions instead of generic patterns.
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
# Explain what applies to a file in this codebase
|
|
128
|
+
|
|
129
|
+
For a given file path (e.g. \`apps/users/src/profile.service.ts\`):
|
|
130
|
+
|
|
131
|
+
\`\`\`bash
|
|
132
|
+
shrk why <file-path>
|
|
133
|
+
\`\`\`
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
- Which package / layer the file belongs to.
|
|
137
|
+
- Which path conventions apply (e.g. "services live in \`apps/<x>/src/services/\`").
|
|
138
|
+
- Which rules are scoped to this file's path.
|
|
139
|
+
- Which boundary rules constrain this file's imports.
|
|
140
|
+
- Cross-references to related knowledge entries.
|
|
141
|
+
|
|
142
|
+
Use this *before* editing. The output is the project's actual conventions for that area, not your guess based on the file's content.
|
|
143
|
+
`;
|
|
144
|
+
// ─── Per-template command generator ──────────────────────────────────────────
|
|
145
|
+
/**
|
|
146
|
+
* Slugify a template id into a slash-command name. Template ids
|
|
147
|
+
* conventionally look like `typescript.service`; the slash command is
|
|
148
|
+
* `new-typescript-service` (or `new-service` if the segment after the
|
|
149
|
+
* dot is unique and shorter).
|
|
150
|
+
*/
|
|
151
|
+
function templateSlash(templateId) {
|
|
152
|
+
// Use the LAST dot-separated segment as the primary name —
|
|
153
|
+
// `typescript.service` → `new-service`. Falls back to the full id
|
|
154
|
+
// when there's no dot or the segment is too generic (single char).
|
|
155
|
+
const parts = templateId.split('.');
|
|
156
|
+
const tail = parts[parts.length - 1] ?? templateId;
|
|
157
|
+
const safeName = tail.length >= 3 ? tail : templateId.replace(/\./g, '-');
|
|
158
|
+
return `new-${safeName}`
|
|
159
|
+
.toLowerCase()
|
|
160
|
+
.replace(/[^a-z0-9-]+/g, '-')
|
|
161
|
+
.replace(/-+/g, '-')
|
|
162
|
+
.replace(/^-+|-+$/g, '');
|
|
163
|
+
}
|
|
164
|
+
function templateCommandBody(template) {
|
|
165
|
+
const displayName = template.name ?? template.id;
|
|
166
|
+
const description = template.description
|
|
167
|
+
? template.description.replace(/\s+/g, ' ').trim()
|
|
168
|
+
: `Scaffold a new ${displayName} using the project's actual template (\`${template.id}\`). Follows the shrk plan → apply → validate flow.`;
|
|
169
|
+
return `---
|
|
170
|
+
description: ${JSON.stringify(description)}
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
# /${templateSlash(template.id)} — scaffold ${displayName}
|
|
174
|
+
|
|
175
|
+
This command scaffolds a new ${displayName} using the project's actual template
|
|
176
|
+
defined in \`sharkcraft/templates.ts\`. The template encodes this repo's
|
|
177
|
+
conventions for path, naming, and structure — the result will match how
|
|
178
|
+
the rest of the codebase is organized, not generic patterns.
|
|
179
|
+
|
|
180
|
+
## The flow
|
|
181
|
+
|
|
182
|
+
When the user invokes \`/${templateSlash(template.id)} <name>\`:
|
|
183
|
+
|
|
184
|
+
1. **Generate a plan (no writes yet):**
|
|
185
|
+
\`\`\`bash
|
|
186
|
+
shrk gen ${template.id} <name> --dry-run --save-plan /tmp/${templateSlash(template.id)}.plan.json
|
|
187
|
+
\`\`\`
|
|
188
|
+
|
|
189
|
+
2. **Read the plan back** from \`/tmp/${templateSlash(template.id)}.plan.json\` and show the user which files will be created.
|
|
190
|
+
|
|
191
|
+
3. **Confirm.** Wait for the user to approve. If they want changes, adjust the plan or re-run \`shrk gen\` with different flags.
|
|
192
|
+
|
|
193
|
+
4. **Apply through the validated CLI path:**
|
|
194
|
+
\`\`\`bash
|
|
195
|
+
shrk apply /tmp/${templateSlash(template.id)}.plan.json --verify-signature --validate
|
|
196
|
+
\`\`\`
|
|
197
|
+
|
|
198
|
+
5. **Verify** the diff didn't break any boundary rules:
|
|
199
|
+
\`\`\`bash
|
|
200
|
+
shrk check boundaries --changed-only
|
|
201
|
+
\`\`\`
|
|
202
|
+
|
|
203
|
+
## If the template doesn't fit
|
|
204
|
+
|
|
205
|
+
If the user's request doesn't match the \`${template.id}\` template
|
|
206
|
+
shape, fall back to:
|
|
207
|
+
|
|
208
|
+
- \`shrk templates list\` — see all available templates.
|
|
209
|
+
- \`shrk gen <other-template> <name> --dry-run\` — try a different template.
|
|
210
|
+
- Hand-author only as last resort, and run \`/check-changes\` after.
|
|
211
|
+
|
|
212
|
+
The whole point of using the template is consistency with the rest of
|
|
213
|
+
this codebase. Skipping it means the new code will look different from
|
|
214
|
+
what's already there.
|
|
215
|
+
`;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Build the full set of `.claude/commands/*.md` files for a project.
|
|
219
|
+
*
|
|
220
|
+
* Pure — caller writes the bytes. Same shape as the `synthesize-*`
|
|
221
|
+
* functions in this codebase: input inspection → output file list.
|
|
222
|
+
*/
|
|
223
|
+
export function buildClaudeCommands(inspection, options = {}) {
|
|
224
|
+
const files = [];
|
|
225
|
+
files.push({
|
|
226
|
+
path: '.claude/commands/follow-shrk.md',
|
|
227
|
+
slash: 'follow-shrk',
|
|
228
|
+
source: 'static',
|
|
229
|
+
content: STATIC_FOLLOW_SHRK,
|
|
230
|
+
});
|
|
231
|
+
files.push({
|
|
232
|
+
path: '.claude/commands/check-changes.md',
|
|
233
|
+
slash: 'check-changes',
|
|
234
|
+
source: 'static',
|
|
235
|
+
content: STATIC_CHECK_CHANGES,
|
|
236
|
+
});
|
|
237
|
+
files.push({
|
|
238
|
+
path: '.claude/commands/shrk-brief.md',
|
|
239
|
+
slash: 'shrk-brief',
|
|
240
|
+
source: 'static',
|
|
241
|
+
content: STATIC_SHRK_BRIEF,
|
|
242
|
+
});
|
|
243
|
+
files.push({
|
|
244
|
+
path: '.claude/commands/explain-file.md',
|
|
245
|
+
slash: 'explain-file',
|
|
246
|
+
source: 'static',
|
|
247
|
+
content: STATIC_EXPLAIN_FILE,
|
|
248
|
+
});
|
|
249
|
+
// Per-template commands — bounded so a pack with 50 templates
|
|
250
|
+
// doesn't dump 50 slash commands into the user's palette. Sorted
|
|
251
|
+
// by id for deterministic emit order.
|
|
252
|
+
const cap = options.maxTemplateCommands ?? 20;
|
|
253
|
+
const templates = [...inspection.templates].sort((a, b) => a.id.localeCompare(b.id));
|
|
254
|
+
const seenSlash = new Set(files.map((f) => f.slash));
|
|
255
|
+
for (const t of templates) {
|
|
256
|
+
if (files.filter((f) => f.source === 'template').length >= cap)
|
|
257
|
+
break;
|
|
258
|
+
let slash = templateSlash(t.id);
|
|
259
|
+
if (seenSlash.has(slash)) {
|
|
260
|
+
// Two templates with the same tail (e.g. `ts.service` and
|
|
261
|
+
// `py.service` both → `new-service`) — fall back to the full id
|
|
262
|
+
// to disambiguate the second one.
|
|
263
|
+
slash = `new-${t.id.replace(/\./g, '-').toLowerCase()}`;
|
|
264
|
+
if (seenSlash.has(slash))
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
seenSlash.add(slash);
|
|
268
|
+
files.push({
|
|
269
|
+
path: `.claude/commands/${slash}.md`,
|
|
270
|
+
slash,
|
|
271
|
+
source: 'template',
|
|
272
|
+
content: templateCommandBody(t),
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
return { files };
|
|
276
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ISharkcraftInspection } from '@shrkcrft/inspector';
|
|
2
|
-
export type ExportFormat = 'agents-md' | 'claude-md' | 'cursor-rules' | 'copilot-instructions';
|
|
2
|
+
export type ExportFormat = 'agents-md' | 'claude-md' | 'claude-skill' | 'cursor-rules' | 'copilot-instructions';
|
|
3
3
|
export interface ExportOptions {
|
|
4
4
|
format: ExportFormat;
|
|
5
5
|
/** Optional task to scope the export. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-formats.d.ts","sourceRoot":"","sources":["../../src/export/export-formats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAIjE,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,WAAW,GACX,cAAc,GACd,sBAAsB,CAAC;AAE3B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"export-formats.d.ts","sourceRoot":"","sources":["../../src/export/export-formats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAIjE,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,WAAW,GACX,cAAc,GACd,cAAc,GACd,sBAAsB,CAAC;AAE3B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAqPD,wBAAgB,YAAY,CAC1B,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE,aAAa,GACrB,YAAY,CAmCd;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAQnE;AAED,eAAO,MAAM,kBAAkB,EAAE,SAAS,YAAY,EAMpD,CAAC"}
|