dk-bogfoerer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/billy-api.d.ts +22 -0
- package/dist/billy-api.js +90 -0
- package/dist/billy-api.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +592 -0
- package/dist/cli.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Billy API klient til CLI-brug
|
|
3
|
+
*/
|
|
4
|
+
export declare function setToken(token: string): void;
|
|
5
|
+
export declare function getToken(): string;
|
|
6
|
+
export declare function billyFetch(path: string, options?: {
|
|
7
|
+
method?: string;
|
|
8
|
+
body?: unknown;
|
|
9
|
+
params?: Record<string, string | number | boolean | undefined>;
|
|
10
|
+
}): Promise<unknown>;
|
|
11
|
+
export declare function getOrganization(): Promise<Record<string, unknown>>;
|
|
12
|
+
export declare function getDaybooks(): Promise<Array<Record<string, unknown>>>;
|
|
13
|
+
export declare function getAccounts(): Promise<Array<Record<string, unknown>>>;
|
|
14
|
+
export declare function uploadFile(filename: string, dataBase64: string): Promise<Record<string, unknown>>;
|
|
15
|
+
export declare function createAttachment(data: {
|
|
16
|
+
readonly ownerId: string;
|
|
17
|
+
readonly ownerReference: string;
|
|
18
|
+
readonly fileId: string;
|
|
19
|
+
}): Promise<Record<string, unknown>>;
|
|
20
|
+
export declare function createBill(data: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
21
|
+
export declare function getContacts(q?: string): Promise<Array<Record<string, unknown>>>;
|
|
22
|
+
export declare function getTaxRates(): Promise<Array<Record<string, unknown>>>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Billy API klient til CLI-brug
|
|
3
|
+
*/
|
|
4
|
+
const BASE_URL = "https://api.billysbilling.com/v2";
|
|
5
|
+
let overrideToken;
|
|
6
|
+
export function setToken(token) {
|
|
7
|
+
overrideToken = token;
|
|
8
|
+
process.env.BILLY_API_TOKEN = token;
|
|
9
|
+
}
|
|
10
|
+
export function getToken() {
|
|
11
|
+
const token = overrideToken ?? process.env.BILLY_API_TOKEN;
|
|
12
|
+
if (!token) {
|
|
13
|
+
throw new Error("BILLY_API_TOKEN er ikke sat.\n" +
|
|
14
|
+
"Find dit token: Billy → Indstillinger → Adgangstokens\n" +
|
|
15
|
+
"Koer 'dk-bogfoerer setup' for at konfigurere.");
|
|
16
|
+
}
|
|
17
|
+
return token;
|
|
18
|
+
}
|
|
19
|
+
export async function billyFetch(path, options = {}) {
|
|
20
|
+
const { method = "GET", body, params } = options;
|
|
21
|
+
const url = new URL(`${BASE_URL}${path}`);
|
|
22
|
+
if (params) {
|
|
23
|
+
for (const [key, value] of Object.entries(params)) {
|
|
24
|
+
if (value !== undefined && value !== null) {
|
|
25
|
+
url.searchParams.set(key, String(value));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const headers = {
|
|
30
|
+
"X-Access-Token": getToken(),
|
|
31
|
+
"Accept": "application/json",
|
|
32
|
+
};
|
|
33
|
+
if (body)
|
|
34
|
+
headers["Content-Type"] = "application/json";
|
|
35
|
+
const response = await fetch(url.toString(), {
|
|
36
|
+
method,
|
|
37
|
+
headers,
|
|
38
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
39
|
+
signal: AbortSignal.timeout(30_000),
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
const errorText = await response.text().catch(() => "");
|
|
43
|
+
throw new Error(`Billy API ${response.status}: ${response.statusText}\n${errorText}`);
|
|
44
|
+
}
|
|
45
|
+
return response.json();
|
|
46
|
+
}
|
|
47
|
+
export async function getOrganization() {
|
|
48
|
+
const result = await billyFetch("/organization");
|
|
49
|
+
return (result.organization ?? result);
|
|
50
|
+
}
|
|
51
|
+
export async function getDaybooks() {
|
|
52
|
+
const result = await billyFetch("/daybooks");
|
|
53
|
+
return (result.daybooks ?? []);
|
|
54
|
+
}
|
|
55
|
+
export async function getAccounts() {
|
|
56
|
+
const result = await billyFetch("/accounts", { params: { pageSize: 500 } });
|
|
57
|
+
return (result.accounts ?? []);
|
|
58
|
+
}
|
|
59
|
+
export async function uploadFile(filename, dataBase64) {
|
|
60
|
+
const result = await billyFetch("/files", {
|
|
61
|
+
method: "POST",
|
|
62
|
+
body: { file: { filename, data: dataBase64 } },
|
|
63
|
+
});
|
|
64
|
+
return (result.file ?? result);
|
|
65
|
+
}
|
|
66
|
+
export async function createAttachment(data) {
|
|
67
|
+
const result = await billyFetch("/attachments", {
|
|
68
|
+
method: "POST",
|
|
69
|
+
body: { attachment: data },
|
|
70
|
+
});
|
|
71
|
+
return (result.attachment ?? result);
|
|
72
|
+
}
|
|
73
|
+
export async function createBill(data) {
|
|
74
|
+
const result = await billyFetch("/bills", {
|
|
75
|
+
method: "POST",
|
|
76
|
+
body: { bill: data },
|
|
77
|
+
});
|
|
78
|
+
return (result.bill ?? result);
|
|
79
|
+
}
|
|
80
|
+
export async function getContacts(q) {
|
|
81
|
+
const result = await billyFetch("/contacts", {
|
|
82
|
+
params: { q, isSupplier: true, pageSize: 10 },
|
|
83
|
+
});
|
|
84
|
+
return (result.contacts ?? []);
|
|
85
|
+
}
|
|
86
|
+
export async function getTaxRates() {
|
|
87
|
+
const result = await billyFetch("/taxRates", { params: { pageSize: 100 } });
|
|
88
|
+
return (result.taxRates ?? []);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=billy-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billy-api.js","sourceRoot":"","sources":["../src/billy-api.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile, mkdir, writeFile, readdir, stat, copyFile, unlink } from "node:fs/promises";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { join, extname, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { dirname } from "node:path";
|
|
7
|
+
import { createInterface } from "node:readline";
|
|
8
|
+
import { execSync } from "node:child_process";
|
|
9
|
+
import { getToken, setToken, getOrganization, getDaybooks, getAccounts, getTaxRates, uploadFile, } from "./billy-api.js";
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
const GITHUB_REPO = "lauenborg/dk-bogfoerer-crew";
|
|
13
|
+
const DEFAULT_INSTALL_DIR = join(process.env.HOME ?? "~", ".dk-bogfoerer");
|
|
14
|
+
function getCrewRoot() {
|
|
15
|
+
// Lokal udvikling: brug relativ sti hvis agents/ eksisterer
|
|
16
|
+
const localRoot = resolve(__dirname, "..", "..");
|
|
17
|
+
if (existsSync(join(localRoot, "agents")))
|
|
18
|
+
return localRoot;
|
|
19
|
+
// Installeret: brug ~/.dk-bogfoerer
|
|
20
|
+
return DEFAULT_INSTALL_DIR;
|
|
21
|
+
}
|
|
22
|
+
async function ensureCrewInstalled() {
|
|
23
|
+
const crewRoot = getCrewRoot();
|
|
24
|
+
// Allerede installeret lokalt (udvikling)?
|
|
25
|
+
if (existsSync(join(crewRoot, "agents")) && existsSync(join(crewRoot, "bogfoerer-mcp", "src"))) {
|
|
26
|
+
return crewRoot;
|
|
27
|
+
}
|
|
28
|
+
// Klon fra GitHub
|
|
29
|
+
console.log(` Henter dk-bogfoerer-crew fra GitHub...\n`);
|
|
30
|
+
if (existsSync(DEFAULT_INSTALL_DIR)) {
|
|
31
|
+
// Opdater eksisterende
|
|
32
|
+
try {
|
|
33
|
+
execSync("git pull --ff-only", { cwd: DEFAULT_INSTALL_DIR, stdio: "pipe" });
|
|
34
|
+
console.log(" ✓ Opdateret til seneste version");
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
console.log(" ⚠ Kunne ikke opdatere. Bruger eksisterende version.");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
try {
|
|
42
|
+
execSync(`git clone https://github.com/${GITHUB_REPO}.git "${DEFAULT_INSTALL_DIR}"`, { stdio: "pipe" });
|
|
43
|
+
console.log(" ✓ Klonet fra GitHub");
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
console.error(` ✗ Kunne ikke klone: ${e.message}`);
|
|
47
|
+
console.error(` Proev manuelt: git clone https://github.com/${GITHUB_REPO}.git ~/.dk-bogfoerer`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return DEFAULT_INSTALL_DIR;
|
|
52
|
+
}
|
|
53
|
+
// ─── Readline helper ───
|
|
54
|
+
function createRl() {
|
|
55
|
+
return createInterface({ input: process.stdin, output: process.stdout });
|
|
56
|
+
}
|
|
57
|
+
async function ask(rl, question, defaultValue) {
|
|
58
|
+
const suffix = defaultValue ? ` [${defaultValue}]` : "";
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
rl.question(` ${question}${suffix}: `, (answer) => {
|
|
61
|
+
resolve(answer.trim() || defaultValue || "");
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async function askChoice(rl, question, choices) {
|
|
66
|
+
console.log(` ${question}`);
|
|
67
|
+
for (let i = 0; i < choices.length; i++) {
|
|
68
|
+
console.log(` ${i + 1}) ${choices[i]}`);
|
|
69
|
+
}
|
|
70
|
+
const answer = await ask(rl, "Vaelg nummer", "1");
|
|
71
|
+
const idx = parseInt(answer, 10) - 1;
|
|
72
|
+
return choices[Math.max(0, Math.min(idx, choices.length - 1))];
|
|
73
|
+
}
|
|
74
|
+
// ─── Hjaelpetekst ───
|
|
75
|
+
function printHelp() {
|
|
76
|
+
console.log(`
|
|
77
|
+
╔══════════════════════════════════════════════════╗
|
|
78
|
+
║ dk-bogfoerer — AI Bogfoerer for Danmark ║
|
|
79
|
+
╚══════════════════════════════════════════════════╝
|
|
80
|
+
|
|
81
|
+
Brug:
|
|
82
|
+
dk-bogfoerer setup Interaktiv foerstegangsopsaetning (start her!)
|
|
83
|
+
dk-bogfoerer init [sti] Opret mappestruktur for bogfoering
|
|
84
|
+
dk-bogfoerer dump <mappe> Upload fakturaer/bilag til Billy
|
|
85
|
+
dk-bogfoerer status Vis Billy-forbindelse og firmainfo
|
|
86
|
+
dk-bogfoerer deadlines Vis naeste indberetningsfrister
|
|
87
|
+
dk-bogfoerer help Vis denne hjaelp
|
|
88
|
+
|
|
89
|
+
Foerste gang? Koer:
|
|
90
|
+
dk-bogfoerer setup
|
|
91
|
+
`);
|
|
92
|
+
}
|
|
93
|
+
// ─── SETUP command (interaktiv foerstegangsopsaetning) ───
|
|
94
|
+
async function cmdSetup() {
|
|
95
|
+
const rl = createRl();
|
|
96
|
+
const claudeJson = join(process.env.HOME ?? "~", ".claude.json");
|
|
97
|
+
const claudeDir = join(process.env.HOME ?? "~", ".claude");
|
|
98
|
+
console.log(`
|
|
99
|
+
╔══════════════════════════════════════════════════╗
|
|
100
|
+
║ dk-bogfoerer setup ║
|
|
101
|
+
║ Interaktiv opsaetning af AI Bogfoerer ║
|
|
102
|
+
╚══════════════════════════════════════════════════╝
|
|
103
|
+
`);
|
|
104
|
+
// ─── Trin 1: Billy API token ───
|
|
105
|
+
console.log(" ── Trin 1/6: Billy API token ──\n");
|
|
106
|
+
console.log(" For at forbinde til dit regnskabsprogram (Billy) skal du bruge et API token.");
|
|
107
|
+
console.log(" Find det i Billy: Indstillinger → Adgangstokens → Opret nyt token\n");
|
|
108
|
+
const billyToken = await ask(rl, "Indsaet dit Billy API token");
|
|
109
|
+
if (!billyToken) {
|
|
110
|
+
console.log("\n ⚠ Intet token angivet. Du kan tilfoeje det senere med 'dk-bogfoerer setup'.\n");
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Test token
|
|
114
|
+
setToken(billyToken);
|
|
115
|
+
try {
|
|
116
|
+
const org = await getOrganization();
|
|
117
|
+
console.log(`\n ✓ Forbundet til Billy: ${org.name} (CVR: ${org.registrationNo ?? "—"})\n`);
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
console.log(`\n ✗ Token virkede ikke: ${e.message}`);
|
|
121
|
+
console.log(" Du kan proeve igen med 'dk-bogfoerer setup'.\n");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// ─── Trin 2: Gmail ───
|
|
125
|
+
console.log(" ── Trin 2/7: Gmail (faktura-indhentning) ──\n");
|
|
126
|
+
// Tjek om Gmail MCP er konfigureret
|
|
127
|
+
let gmailConfigured = false;
|
|
128
|
+
if (existsSync(claudeJson)) {
|
|
129
|
+
const existing = JSON.parse(await readFile(claudeJson, "utf-8"));
|
|
130
|
+
const servers = (existing.mcpServers ?? {});
|
|
131
|
+
gmailConfigured = "claude_ai_Gmail" in servers || Object.keys(servers).some((k) => k.toLowerCase().includes("gmail"));
|
|
132
|
+
}
|
|
133
|
+
if (gmailConfigured) {
|
|
134
|
+
console.log(" ✓ Gmail MCP er allerede konfigureret i Claude Code.\n");
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
console.log(" Gmail-integration lader dig hente fakturaer direkte fra din email.");
|
|
138
|
+
console.log(" Det er en built-in Claude Code integration — du aktiverer den saadan:\n");
|
|
139
|
+
console.log(" 1. Abn Claude Code");
|
|
140
|
+
console.log(" 2. Skriv /mcp");
|
|
141
|
+
console.log(" 3. Vaelg 'Claude AI' → aktiver 'Gmail'");
|
|
142
|
+
console.log(" 4. Log ind med din Google-konto\n");
|
|
143
|
+
console.log(" Naar det er aktiveret kan du bruge /gmail-bilag til at soege fakturaer.\n");
|
|
144
|
+
const gmailNow = await askChoice(rl, "Vil du aktivere Gmail nu? (kraever genstart af Claude Code)", ["Senere", "Vis mig hvordan"]);
|
|
145
|
+
if (gmailNow === "Vis mig hvordan") {
|
|
146
|
+
console.log("\n I Claude Code terminalen:");
|
|
147
|
+
console.log(" 1. Tryk Ctrl+C for at stoppe denne setup (vi gemmer dit Billy token)");
|
|
148
|
+
console.log(" 2. Skriv: /mcp");
|
|
149
|
+
console.log(" 3. Scroll ned til 'Claude AI' sektionen");
|
|
150
|
+
console.log(" 4. Aktiver 'Gmail' og log ind");
|
|
151
|
+
console.log(" 5. Koer 'dk-bogfoerer setup' igen for at faerdiggoere\n");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ─── Trin 3: Virksomhedsinfo ───
|
|
155
|
+
console.log(" ── Trin 3/7: Virksomhedsinfo ──\n");
|
|
156
|
+
let firmanavn = "";
|
|
157
|
+
let cvr = "";
|
|
158
|
+
if (billyToken) {
|
|
159
|
+
try {
|
|
160
|
+
const org = await getOrganization();
|
|
161
|
+
firmanavn = org.name ?? "";
|
|
162
|
+
cvr = org.registrationNo ?? "";
|
|
163
|
+
}
|
|
164
|
+
catch { /* ignore */ }
|
|
165
|
+
}
|
|
166
|
+
firmanavn = await ask(rl, "Firmanavn", firmanavn || undefined);
|
|
167
|
+
cvr = await ask(rl, "CVR-nummer", cvr || undefined);
|
|
168
|
+
const virksomhedstype = await askChoice(rl, "Virksomhedstype:", [
|
|
169
|
+
"ApS (Anpartsselskab)",
|
|
170
|
+
"EMV (Enkeltmandsvirksomhed)",
|
|
171
|
+
"A/S (Aktieselskab)",
|
|
172
|
+
"I/S (Interessentskab)",
|
|
173
|
+
]);
|
|
174
|
+
const vtKort = virksomhedstype.split(" ")[0].toLowerCase();
|
|
175
|
+
// ─── Trin 3: Momsperiode ───
|
|
176
|
+
console.log("\n ── Trin 4/7: Momsperiode ──\n");
|
|
177
|
+
console.log(" Afhaenger af din omsaetning:");
|
|
178
|
+
console.log(" Under 5 mio. kr. → Halvaar");
|
|
179
|
+
console.log(" 5-50 mio. kr. → Kvartal");
|
|
180
|
+
console.log(" Over 50 mio. kr. → Maaned\n");
|
|
181
|
+
const momsperiode = await askChoice(rl, "Din momsperiode:", [
|
|
182
|
+
"Halvaar (under 5 mio.)",
|
|
183
|
+
"Kvartal (5-50 mio.)",
|
|
184
|
+
"Maaned (over 50 mio.)",
|
|
185
|
+
]);
|
|
186
|
+
const mpKort = momsperiode.split(" ")[0].toLowerCase();
|
|
187
|
+
// ─── Trin 4: Har du ansatte? ───
|
|
188
|
+
console.log("\n ── Trin 5/7: Ansatte ──\n");
|
|
189
|
+
const harAnsatte = await askChoice(rl, "Har virksomheden ansatte?", ["Ja", "Nej"]);
|
|
190
|
+
const ansatte = harAnsatte === "Ja";
|
|
191
|
+
const branche = await ask(rl, "Branche (f.eks. 'konsulent', 'handel', 'haandvaerker')", "generel");
|
|
192
|
+
// ─── Trin 5: Bogfoeringsmappe ───
|
|
193
|
+
console.log("\n ── Trin 6/7: Bogfoeringsmappe ──\n");
|
|
194
|
+
const defaultPath = join(process.cwd(), firmanavn ? firmanavn.toLowerCase().replace(/[^a-z0-9æøåäöü]/g, "-").replace(/-+/g, "-") : "bogfoering");
|
|
195
|
+
const bogfoeringsSti = await ask(rl, "Hvor skal bogfoeringsmappen oprettes?", defaultPath);
|
|
196
|
+
// ─── Trin 6: Installer ───
|
|
197
|
+
console.log("\n ── Trin 7/7: Installation ──\n");
|
|
198
|
+
console.log(" Installerer...\n");
|
|
199
|
+
// 6a: Hent/opdater crew fra GitHub + byg MCP-servere
|
|
200
|
+
const CREW_ROOT = await ensureCrewInstalled();
|
|
201
|
+
const bogfoeringMcpDir = join(CREW_ROOT, "bogfoerer-mcp");
|
|
202
|
+
const billyMcpDir = join(CREW_ROOT, "billy-mcp");
|
|
203
|
+
if (existsSync(bogfoeringMcpDir)) {
|
|
204
|
+
try {
|
|
205
|
+
if (!existsSync(join(bogfoeringMcpDir, "node_modules"))) {
|
|
206
|
+
execSync("npm install --silent", { cwd: bogfoeringMcpDir, stdio: "ignore" });
|
|
207
|
+
}
|
|
208
|
+
if (!existsSync(join(bogfoeringMcpDir, "dist"))) {
|
|
209
|
+
execSync("npm run build --silent", { cwd: bogfoeringMcpDir, stdio: "ignore" });
|
|
210
|
+
}
|
|
211
|
+
console.log(" ✓ dk-bogfoerer MCP klar (42 tools: moms, skat, kontoplan, loen, retsinformation)");
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
console.log(" ⚠ Kunne ikke bygge dk-bogfoerer MCP. Koer 'npm install && npm run build' i bogfoerer-mcp/");
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (existsSync(billyMcpDir)) {
|
|
218
|
+
try {
|
|
219
|
+
if (!existsSync(join(billyMcpDir, "node_modules"))) {
|
|
220
|
+
execSync("npm install --silent", { cwd: billyMcpDir, stdio: "ignore" });
|
|
221
|
+
}
|
|
222
|
+
if (!existsSync(join(billyMcpDir, "dist"))) {
|
|
223
|
+
execSync("npm run build --silent", { cwd: billyMcpDir, stdio: "ignore" });
|
|
224
|
+
}
|
|
225
|
+
console.log(" ✓ Billy MCP klar (26 tools: banklinjer, fakturaer, bogfoering, moms)");
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
console.log(" ⚠ Kunne ikke bygge Billy MCP. Koer 'npm install && npm run build' i billy-mcp/");
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// 6b: Registrer MCP-servere i ~/.claude.json
|
|
232
|
+
let claudeConfig = {};
|
|
233
|
+
if (existsSync(claudeJson)) {
|
|
234
|
+
claudeConfig = JSON.parse(await readFile(claudeJson, "utf-8"));
|
|
235
|
+
}
|
|
236
|
+
const mcpServers = (claudeConfig.mcpServers ?? {});
|
|
237
|
+
if (existsSync(join(bogfoeringMcpDir, "dist", "index.js"))) {
|
|
238
|
+
mcpServers["dk-bogfoerer"] = {
|
|
239
|
+
command: "node",
|
|
240
|
+
args: [join(bogfoeringMcpDir, "dist", "index.js")],
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
if (existsSync(join(billyMcpDir, "dist", "index.js"))) {
|
|
244
|
+
mcpServers["billy"] = {
|
|
245
|
+
command: "node",
|
|
246
|
+
args: [join(billyMcpDir, "dist", "index.js")],
|
|
247
|
+
...(billyToken ? { env: { BILLY_API_TOKEN: billyToken } } : {}),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
claudeConfig.mcpServers = mcpServers;
|
|
251
|
+
await writeFile(claudeJson, JSON.stringify(claudeConfig, null, 2), "utf-8");
|
|
252
|
+
console.log(" ✓ MCP-servere registreret i Claude Code");
|
|
253
|
+
// 6c: Installer agents
|
|
254
|
+
const agentsSource = join(CREW_ROOT, "agents");
|
|
255
|
+
const agentsTarget = join(claudeDir, "agents");
|
|
256
|
+
if (existsSync(agentsSource)) {
|
|
257
|
+
await mkdir(agentsTarget, { recursive: true });
|
|
258
|
+
const agentFiles = await readdir(agentsSource);
|
|
259
|
+
for (const f of agentFiles) {
|
|
260
|
+
if (f.endsWith(".md")) {
|
|
261
|
+
await copyFile(join(agentsSource, f), join(agentsTarget, f));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
console.log(` ✓ ${agentFiles.filter((f) => f.endsWith(".md")).length} agents installeret`);
|
|
265
|
+
}
|
|
266
|
+
// 6d: Installer skills
|
|
267
|
+
const skillsSource = join(CREW_ROOT, "skills");
|
|
268
|
+
const skillsTarget = join(claudeDir, "skills");
|
|
269
|
+
if (existsSync(skillsSource)) {
|
|
270
|
+
const skillFiles = await readdir(skillsSource);
|
|
271
|
+
for (const f of skillFiles) {
|
|
272
|
+
if (f.endsWith(".md")) {
|
|
273
|
+
const skillName = f.replace(".md", "");
|
|
274
|
+
await mkdir(join(skillsTarget, skillName), { recursive: true });
|
|
275
|
+
await copyFile(join(skillsSource, f), join(skillsTarget, skillName, "SKILL.md"));
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
console.log(` ✓ ${skillFiles.filter((f) => f.endsWith(".md")).length} skills installeret`);
|
|
279
|
+
}
|
|
280
|
+
// 6e: Opret bogfoeringsmappe
|
|
281
|
+
const target = resolve(bogfoeringsSti);
|
|
282
|
+
const dirs = [
|
|
283
|
+
"bilag/indgaaende",
|
|
284
|
+
"bilag/udgaaende",
|
|
285
|
+
"bilag/dump",
|
|
286
|
+
"bank",
|
|
287
|
+
"moms",
|
|
288
|
+
"rapporter",
|
|
289
|
+
...(ansatte ? ["loen"] : []),
|
|
290
|
+
"aarsafslutning",
|
|
291
|
+
];
|
|
292
|
+
for (const dir of dirs) {
|
|
293
|
+
await mkdir(join(target, dir), { recursive: true });
|
|
294
|
+
}
|
|
295
|
+
// Config
|
|
296
|
+
const config = {
|
|
297
|
+
firmanavn,
|
|
298
|
+
cvr,
|
|
299
|
+
virksomhedstype: vtKort,
|
|
300
|
+
momsperiode: mpKort,
|
|
301
|
+
branche,
|
|
302
|
+
har_ansatte: ansatte,
|
|
303
|
+
regnskabsaar: "kalenderaar",
|
|
304
|
+
oprettet: new Date().toISOString().slice(0, 10),
|
|
305
|
+
billy_token_sat: !!billyToken,
|
|
306
|
+
};
|
|
307
|
+
await writeFile(join(target, "config.json"), JSON.stringify(config, null, 2), "utf-8");
|
|
308
|
+
// Hent data fra Billy
|
|
309
|
+
if (billyToken) {
|
|
310
|
+
try {
|
|
311
|
+
const accounts = await getAccounts();
|
|
312
|
+
await writeFile(join(target, "kontoplan-billy.json"), JSON.stringify(accounts, null, 2), "utf-8");
|
|
313
|
+
console.log(` ✓ Kontoplan hentet fra Billy (${accounts.length} konti)`);
|
|
314
|
+
}
|
|
315
|
+
catch { /* stille */ }
|
|
316
|
+
try {
|
|
317
|
+
const daybooks = await getDaybooks();
|
|
318
|
+
await writeFile(join(target, "dagboeger.json"), JSON.stringify(daybooks, null, 2), "utf-8");
|
|
319
|
+
}
|
|
320
|
+
catch { /* stille */ }
|
|
321
|
+
try {
|
|
322
|
+
const taxRates = await getTaxRates();
|
|
323
|
+
await writeFile(join(target, "momssatser.json"), JSON.stringify(taxRates, null, 2), "utf-8");
|
|
324
|
+
}
|
|
325
|
+
catch { /* stille */ }
|
|
326
|
+
}
|
|
327
|
+
// README
|
|
328
|
+
const readme = [
|
|
329
|
+
`# ${firmanavn || "Bogfoering"}`,
|
|
330
|
+
"",
|
|
331
|
+
`| Felt | Vaerdi |`,
|
|
332
|
+
`|------|--------|`,
|
|
333
|
+
`| CVR | ${cvr || "—"} |`,
|
|
334
|
+
`| Type | ${virksomhedstype} |`,
|
|
335
|
+
`| Momsperiode | ${momsperiode} |`,
|
|
336
|
+
`| Branche | ${branche} |`,
|
|
337
|
+
`| Ansatte | ${ansatte ? "Ja" : "Nej"} |`,
|
|
338
|
+
"",
|
|
339
|
+
"## Brug",
|
|
340
|
+
"```bash",
|
|
341
|
+
"# Smid fakturaer i dump-mappen og upload til Billy",
|
|
342
|
+
`dk-bogfoerer dump ${join(target, "bilag/dump/")}`,
|
|
343
|
+
"",
|
|
344
|
+
"# Se frister",
|
|
345
|
+
"dk-bogfoerer deadlines",
|
|
346
|
+
"",
|
|
347
|
+
"# I Claude Code:",
|
|
348
|
+
"/bogfoer # Konter et bilag",
|
|
349
|
+
"/gmail-bilag # Hent fakturaer fra email",
|
|
350
|
+
"/bankafstem # Afstem banklinjer",
|
|
351
|
+
"/momsopgoer # Klargoor momsindberetning",
|
|
352
|
+
...(ansatte ? ["/loenkoersel # Koer loen"] : []),
|
|
353
|
+
"/aarsafslutning # Aarsafslutning",
|
|
354
|
+
"/deadline # Vis frister",
|
|
355
|
+
"```",
|
|
356
|
+
"",
|
|
357
|
+
"## Mappestruktur",
|
|
358
|
+
"```",
|
|
359
|
+
"bilag/dump/ ← Smid filer her → dk-bogfoerer dump",
|
|
360
|
+
"bilag/indgaaende/ ← Koebsfakturaer",
|
|
361
|
+
"bilag/udgaaende/ ← Salgsfakturaer",
|
|
362
|
+
"bank/ ← Kontoudtog",
|
|
363
|
+
...(ansatte ? ["loen/ ← Loensedler"] : []),
|
|
364
|
+
"moms/ ← Momsindberetninger",
|
|
365
|
+
"aarsafslutning/ ← Aarsregnskab",
|
|
366
|
+
"rapporter/ ← Perioderegnskaber",
|
|
367
|
+
"```",
|
|
368
|
+
].join("\n");
|
|
369
|
+
await writeFile(join(target, "README.md"), readme, "utf-8");
|
|
370
|
+
await writeFile(join(target, ".gitignore"), "config.json\n*.billy.json\n.processed/\n", "utf-8");
|
|
371
|
+
console.log(` ✓ Bogfoeringsmappe oprettet: ${target}`);
|
|
372
|
+
// ─── Opsummering ───
|
|
373
|
+
console.log(`
|
|
374
|
+
╔══════════════════════════════════════════════════╗
|
|
375
|
+
║ Setup faerdig! ║
|
|
376
|
+
╚══════════════════════════════════════════════════╝
|
|
377
|
+
|
|
378
|
+
Firma: ${firmanavn || "—"}
|
|
379
|
+
CVR: ${cvr || "—"}
|
|
380
|
+
Type: ${virksomhedstype}
|
|
381
|
+
Momsperiode: ${momsperiode}
|
|
382
|
+
Ansatte: ${ansatte ? "Ja" : "Nej"}
|
|
383
|
+
Billy: ${billyToken ? "✓ Forbundet" : "✗ Ikke forbundet"}
|
|
384
|
+
Gmail: ${gmailConfigured ? "✓ Aktiv" : "○ Ikke aktiveret (brug /mcp i Claude Code)"}
|
|
385
|
+
|
|
386
|
+
Bogfoeringsmappe: ${target}
|
|
387
|
+
|
|
388
|
+
Naeste skridt:
|
|
389
|
+
1. Genstart Claude Code (luk og aaben igen)
|
|
390
|
+
2. Smid fakturaer i: ${join(target, "bilag/dump/")}
|
|
391
|
+
3. Koer: dk-bogfoerer dump ${join(target, "bilag/dump/")}
|
|
392
|
+
4. Eller abn Claude Code og skriv /bogfoer
|
|
393
|
+
`);
|
|
394
|
+
rl.close();
|
|
395
|
+
}
|
|
396
|
+
// ─── INIT command (hurtig mappeopsaetning uden interaktion) ───
|
|
397
|
+
async function cmdInit(targetPath) {
|
|
398
|
+
const target = resolve(targetPath ?? ".");
|
|
399
|
+
console.log("\n dk-bogfoerer init\n");
|
|
400
|
+
let orgName = "Ukendt";
|
|
401
|
+
try {
|
|
402
|
+
const org = await getOrganization();
|
|
403
|
+
orgName = org.name ?? "Ukendt";
|
|
404
|
+
console.log(` ✓ Billy: ${orgName}`);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
console.log(" ⚠ Billy ikke forbundet. Koer 'dk-bogfoerer setup' foerst.");
|
|
408
|
+
}
|
|
409
|
+
const dirs = ["bilag/indgaaende", "bilag/udgaaende", "bilag/dump", "bank", "loen", "moms", "aarsafslutning", "rapporter"];
|
|
410
|
+
for (const dir of dirs)
|
|
411
|
+
await mkdir(join(target, dir), { recursive: true });
|
|
412
|
+
await writeFile(join(target, "config.json"), JSON.stringify({ firmanavn: orgName, oprettet: new Date().toISOString().slice(0, 10) }, null, 2), "utf-8");
|
|
413
|
+
await writeFile(join(target, ".gitignore"), "config.json\n*.billy.json\n.processed/\n", "utf-8");
|
|
414
|
+
console.log(` ✓ Mappestruktur oprettet: ${target}\n`);
|
|
415
|
+
}
|
|
416
|
+
// ─── DUMP command ───
|
|
417
|
+
const SUPPORTED_EXTENSIONS = new Set([".pdf", ".png", ".jpg", ".jpeg", ".gif", ".webp", ".tiff", ".bmp", ".heic"]);
|
|
418
|
+
async function cmdDump(dumpPath) {
|
|
419
|
+
const target = resolve(dumpPath);
|
|
420
|
+
if (!existsSync(target)) {
|
|
421
|
+
console.error(` Fejl: "${target}" eksisterer ikke.`);
|
|
422
|
+
process.exit(1);
|
|
423
|
+
}
|
|
424
|
+
console.log(`\n dk-bogfoerer dump — ${target}\n`);
|
|
425
|
+
try {
|
|
426
|
+
getToken();
|
|
427
|
+
}
|
|
428
|
+
catch (e) {
|
|
429
|
+
console.error(` ${e.message}`);
|
|
430
|
+
console.error(" Koer 'dk-bogfoerer setup' foerst.");
|
|
431
|
+
process.exit(1);
|
|
432
|
+
}
|
|
433
|
+
const entries = await readdir(target);
|
|
434
|
+
const files = [];
|
|
435
|
+
for (const entry of entries) {
|
|
436
|
+
if (entry.startsWith("."))
|
|
437
|
+
continue;
|
|
438
|
+
const filePath = join(target, entry);
|
|
439
|
+
const fileStat = await stat(filePath);
|
|
440
|
+
if (!fileStat.isFile())
|
|
441
|
+
continue;
|
|
442
|
+
if (!SUPPORTED_EXTENSIONS.has(extname(entry).toLowerCase()))
|
|
443
|
+
continue;
|
|
444
|
+
files.push({ path: filePath, name: entry, size: fileStat.size });
|
|
445
|
+
}
|
|
446
|
+
if (files.length === 0) {
|
|
447
|
+
console.log(" Ingen filer fundet. Formater: PDF, PNG, JPG, GIF, WEBP, TIFF, BMP, HEIC");
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
console.log(` ${files.length} filer fundet:\n`);
|
|
451
|
+
const processedDir = join(target, ".processed");
|
|
452
|
+
await mkdir(processedDir, { recursive: true });
|
|
453
|
+
let uploaded = 0;
|
|
454
|
+
let failed = 0;
|
|
455
|
+
for (const file of files) {
|
|
456
|
+
try {
|
|
457
|
+
const buffer = await readFile(file.path);
|
|
458
|
+
const base64 = buffer.toString("base64");
|
|
459
|
+
const uploadResult = await uploadFile(file.name, base64);
|
|
460
|
+
const fileId = uploadResult.id;
|
|
461
|
+
console.log(` ✓ ${file.name} (${(file.size / 1024).toFixed(0)} KB) → Billy: ${fileId}`);
|
|
462
|
+
await copyFile(file.path, join(processedDir, file.name));
|
|
463
|
+
await unlink(file.path);
|
|
464
|
+
await writeFile(join(processedDir, `${file.name}.billy.json`), JSON.stringify({
|
|
465
|
+
original_name: file.name,
|
|
466
|
+
billy_file_id: fileId,
|
|
467
|
+
uploaded_at: new Date().toISOString(),
|
|
468
|
+
size_bytes: file.size,
|
|
469
|
+
}, null, 2), "utf-8");
|
|
470
|
+
uploaded++;
|
|
471
|
+
}
|
|
472
|
+
catch (e) {
|
|
473
|
+
console.log(` ✗ ${file.name}: ${e.message}`);
|
|
474
|
+
failed++;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
console.log(`
|
|
478
|
+
Uploaded: ${uploaded} | Fejlede: ${failed}
|
|
479
|
+
Filer flyttet til: ${processedDir}
|
|
480
|
+
|
|
481
|
+
Abn Claude Code og skriv /bogfoer for at kontere filerne.
|
|
482
|
+
`);
|
|
483
|
+
}
|
|
484
|
+
// ─── STATUS command ───
|
|
485
|
+
async function cmdStatus() {
|
|
486
|
+
console.log("\n dk-bogfoerer status\n");
|
|
487
|
+
try {
|
|
488
|
+
getToken();
|
|
489
|
+
const org = await getOrganization();
|
|
490
|
+
console.log(` Firma: ${org.name}`);
|
|
491
|
+
console.log(` CVR: ${org.registrationNo ?? "—"}`);
|
|
492
|
+
console.log(` Valuta: ${org.baseCurrencyId ?? "DKK"}`);
|
|
493
|
+
console.log(` Billy ID: ${org.id}`);
|
|
494
|
+
const daybooks = await getDaybooks();
|
|
495
|
+
console.log(` Dagboeger: ${daybooks.length} stk`);
|
|
496
|
+
for (const db of daybooks) {
|
|
497
|
+
console.log(` - ${db.name} (${db.id})`);
|
|
498
|
+
}
|
|
499
|
+
console.log("\n ✓ Billy OK\n");
|
|
500
|
+
}
|
|
501
|
+
catch (e) {
|
|
502
|
+
console.error(` ✗ ${e.message}`);
|
|
503
|
+
console.error(" Koer 'dk-bogfoerer setup' for at konfigurere.\n");
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
// ─── DEADLINES command ───
|
|
507
|
+
async function cmdDeadlines() {
|
|
508
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
509
|
+
console.log(`\n dk-bogfoerer deadlines (${today})\n`);
|
|
510
|
+
const deadlines = [
|
|
511
|
+
{ frist: "2026-09-01", beskrivelse: "Moms: 1. halvaar 2026" },
|
|
512
|
+
{ frist: "2027-03-01", beskrivelse: "Moms: 2. halvaar 2026" },
|
|
513
|
+
{ frist: "2026-05-11", beskrivelse: "A-skat/AM-bidrag: April" },
|
|
514
|
+
{ frist: "2026-06-10", beskrivelse: "A-skat/AM-bidrag: Maj" },
|
|
515
|
+
{ frist: "2026-07-10", beskrivelse: "A-skat/AM-bidrag: Juni" },
|
|
516
|
+
{ frist: "2026-08-10", beskrivelse: "A-skat/AM-bidrag: Juli" },
|
|
517
|
+
{ frist: "2026-09-10", beskrivelse: "A-skat/AM-bidrag: August" },
|
|
518
|
+
{ frist: "2026-10-12", beskrivelse: "A-skat/AM-bidrag: September" },
|
|
519
|
+
{ frist: "2026-11-10", beskrivelse: "A-skat/AM-bidrag: Oktober" },
|
|
520
|
+
{ frist: "2026-12-10", beskrivelse: "A-skat/AM-bidrag: November" },
|
|
521
|
+
{ frist: "2026-11-20", beskrivelse: "Selskabsskat: 2. aconto-rate" },
|
|
522
|
+
{ frist: "2026-05-01", beskrivelse: "Privat selvangivelse" },
|
|
523
|
+
{ frist: "2026-05-31", beskrivelse: "Aarsrapport til Erhvervsstyrelsen" },
|
|
524
|
+
{ frist: "2026-06-30", beskrivelse: "Selskabsselvangivelse" },
|
|
525
|
+
{ frist: "2026-07-01", beskrivelse: "Udvidet selvangivelse (selvstaendige)" },
|
|
526
|
+
];
|
|
527
|
+
const kommende = deadlines
|
|
528
|
+
.filter((d) => d.frist >= today)
|
|
529
|
+
.sort((a, b) => a.frist.localeCompare(b.frist))
|
|
530
|
+
.slice(0, 8);
|
|
531
|
+
if (kommende.length === 0) {
|
|
532
|
+
console.log(" Ingen kommende deadlines.");
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
for (const d of kommende) {
|
|
536
|
+
const dage = Math.ceil((new Date(d.frist).getTime() - new Date(today).getTime()) / 86400000);
|
|
537
|
+
const urgency = dage <= 7 ? " ⚠ SNART!" : dage <= 30 ? " ←" : "";
|
|
538
|
+
console.log(` ${d.frist} ${d.beskrivelse} (${dage} dage)${urgency}`);
|
|
539
|
+
}
|
|
540
|
+
console.log();
|
|
541
|
+
}
|
|
542
|
+
// ─── Main router ───
|
|
543
|
+
async function main() {
|
|
544
|
+
const args = process.argv.slice(2);
|
|
545
|
+
const command = args[0];
|
|
546
|
+
switch (command) {
|
|
547
|
+
case "setup":
|
|
548
|
+
await cmdSetup();
|
|
549
|
+
break;
|
|
550
|
+
case "init":
|
|
551
|
+
await cmdInit(args[1]);
|
|
552
|
+
break;
|
|
553
|
+
case "dump":
|
|
554
|
+
if (!args[1]) {
|
|
555
|
+
console.error(" Brug: dk-bogfoerer dump <mappe>");
|
|
556
|
+
process.exit(1);
|
|
557
|
+
}
|
|
558
|
+
await cmdDump(args[1]);
|
|
559
|
+
break;
|
|
560
|
+
case "status":
|
|
561
|
+
await cmdStatus();
|
|
562
|
+
break;
|
|
563
|
+
case "deadlines":
|
|
564
|
+
await cmdDeadlines();
|
|
565
|
+
break;
|
|
566
|
+
case "help":
|
|
567
|
+
case "--help":
|
|
568
|
+
case "-h":
|
|
569
|
+
printHelp();
|
|
570
|
+
break;
|
|
571
|
+
case undefined:
|
|
572
|
+
// Foerste gang? Koer setup
|
|
573
|
+
if (!existsSync(join(process.env.HOME ?? "~", ".claude.json")) ||
|
|
574
|
+
!process.env.BILLY_API_TOKEN) {
|
|
575
|
+
console.log("\n Velkommen! Koerer foerstegangsopsaetning...\n");
|
|
576
|
+
await cmdSetup();
|
|
577
|
+
}
|
|
578
|
+
else {
|
|
579
|
+
printHelp();
|
|
580
|
+
}
|
|
581
|
+
break;
|
|
582
|
+
default:
|
|
583
|
+
console.error(` Ukendt kommando: ${command}`);
|
|
584
|
+
printHelp();
|
|
585
|
+
process.exit(1);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
main().catch((error) => {
|
|
589
|
+
console.error("Fejl:", error.message);
|
|
590
|
+
process.exit(1);
|
|
591
|
+
});
|
|
592
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAC1E,UAAU,GACX,MAAM,gBAAgB,CAAC;AAExB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAClD,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,eAAe,CAAC,CAAC;AAE3E,SAAS,WAAW;IAClB,4DAA4D;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5D,oCAAoC;IACpC,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,2CAA2C;IAC3C,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QAC/F,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAE1D,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpC,uBAAuB;QACvB,IAAI,CAAC;YACH,QAAQ,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,QAAQ,CAAC,gCAAgC,WAAW,SAAS,mBAAmB,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACxG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,yBAA0B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,KAAK,CAAC,iDAAiD,WAAW,sBAAsB,CAAC,CAAC;YAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,0BAA0B;AAE1B,SAAS,QAAQ;IACf,OAAO,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,EAA+B,EAAE,QAAgB,EAAE,YAAqB;IACzF,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,KAAK,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YACjD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,EAA+B,EAAE,QAAgB,EAAE,OAA0B;IACpG,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,uBAAuB;AAEvB,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;GAeX,CAAC,CAAC;AACL,CAAC;AAED,4DAA4D;AAE5D,KAAK,UAAU,QAAQ;IACrB,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IACtB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,SAAS,CAAC,CAAC;IAE3D,OAAO,CAAC,GAAG,CAAC;;;;;CAKb,CAAC,CAAC;IAED,kCAAkC;IAElC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IAErF,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,6BAA6B,CAAC,CAAC;IAEhE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC;IACnG,CAAC;SAAM,CAAC;QACN,aAAa;QACb,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,8BAA8B,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,cAAc,IAAI,GAAG,KAAK,CAAC,CAAC;QAC9F,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,6BAA8B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,wBAAwB;IAExB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAE/D,oCAAoC;IACpC,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAA4B,CAAC;QAC5F,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;QACvE,eAAe,GAAG,iBAAiB,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACxH,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAE3F,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,6DAA6D,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACnI,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,kCAAkC;IAElC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnD,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;YACpC,SAAS,GAAI,GAAG,CAAC,IAAe,IAAI,EAAE,CAAC;YACvC,GAAG,GAAI,GAAG,CAAC,cAAyB,IAAI,EAAE,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC;IAC/D,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;IAEpD,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,kBAAkB,EAAE;QAC9D,sBAAsB;QACtB,6BAA6B;QAC7B,oBAAoB;QACpB,uBAAuB;KACxB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAE3D,8BAA8B;IAE9B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,kBAAkB,EAAE;QAC1D,wBAAwB;QACxB,qBAAqB;QACrB,uBAAuB;KACxB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEvD,kCAAkC;IAElC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,2BAA2B,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,UAAU,KAAK,IAAI,CAAC;IAEpC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,wDAAwD,EAAE,SAAS,CAAC,CAAC;IAEnG,mCAAmC;IAEnC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACjJ,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,uCAAuC,EAAE,WAAW,CAAC,CAAC;IAE3F,4BAA4B;IAE5B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAElC,qDAAqD;IACrD,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC9C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEjD,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;gBACxD,QAAQ,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAChD,QAAQ,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;QACpG,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,6FAA6F,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;gBACnD,QAAQ,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC3C,QAAQ,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,YAAY,GAA4B,EAAE,CAAC;IAC/C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAA4B,CAAC;IAC5F,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,YAAY,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;IAE9E,IAAI,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;QAC3D,UAAU,CAAC,cAAc,CAAC,GAAG;YAC3B,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;SACnD,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;QACtD,UAAU,CAAC,OAAO,CAAC,GAAG;YACpB,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAC7C,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,UAAU,GAAG,UAAU,CAAC;IACrC,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAEzD,uBAAuB;IACvB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAC9F,CAAC;IAED,uBAAuB;IACvB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACvC,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChE,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAC9F,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG;QACX,kBAAkB;QAClB,iBAAiB;QACjB,YAAY;QACZ,MAAM;QACN,MAAM;QACN,WAAW;QACX,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5B,gBAAgB;KACjB,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,SAAS;IACT,MAAM,MAAM,GAAG;QACb,SAAS;QACT,GAAG;QACH,eAAe,EAAE,MAAM;QACvB,WAAW,EAAE,MAAM;QACnB,OAAO;QACP,WAAW,EAAE,OAAO;QACpB,YAAY,EAAE,aAAa;QAC3B,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/C,eAAe,EAAE,CAAC,CAAC,UAAU;KAC9B,CAAC;IACF,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEvF,sBAAsB;IACtB,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;YACrC,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAClG,OAAO,CAAC,GAAG,CAAC,mCAAmC,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;YACrC,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9F,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;YACrC,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/F,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS;IACT,MAAM,MAAM,GAAG;QACb,KAAK,SAAS,IAAI,YAAY,EAAE;QAChC,EAAE;QACF,mBAAmB;QACnB,mBAAmB;QACnB,WAAW,GAAG,IAAI,GAAG,IAAI;QACzB,YAAY,eAAe,IAAI;QAC/B,mBAAmB,WAAW,IAAI;QAClC,eAAe,OAAO,IAAI;QAC1B,eAAe,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QACzC,EAAE;QACF,SAAS;QACT,SAAS;QACT,oDAAoD;QACpD,qBAAqB,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE;QAClD,EAAE;QACF,cAAc;QACd,wBAAwB;QACxB,EAAE;QACF,kBAAkB;QAClB,qCAAqC;QACrC,8CAA8C;QAC9C,uCAAuC;QACvC,+CAA+C;QAC/C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,oCAAoC;QACpC,iCAAiC;QACjC,KAAK;QACL,EAAE;QACF,kBAAkB;QAClB,KAAK;QACL,2DAA2D;QAC3D,uCAAuC;QACvC,uCAAuC;QACvC,mCAAmC;QACnC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,2CAA2C;QAC3C,qCAAqC;QACrC,0CAA0C;QAC1C,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,0CAA0C,EAAE,OAAO,CAAC,CAAC;IAEjG,OAAO,CAAC,GAAG,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAC;IAExD,sBAAsB;IAEtB,OAAO,CAAC,GAAG,CAAC;;;;;qBAKO,SAAS,IAAI,GAAG;qBAChB,GAAG,IAAI,GAAG;qBACV,eAAe;qBACf,WAAW;qBACX,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;qBACtB,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB;qBAC/C,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,4CAA4C;;sBAEzE,MAAM;;;;2BAID,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;iCACrB,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;;GAEzD,CAAC,CAAC;IAEH,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC;AAED,iEAAiE;AAEjE,KAAK,UAAU,OAAO,CAAC,UAAmB;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;QACpC,OAAO,GAAI,GAAG,CAAC,IAAe,IAAI,QAAQ,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAC1H,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5E,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxJ,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,0CAA0C,EAAE,OAAO,CAAC,CAAC;IAEjG,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,uBAAuB;AAEvB,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEnH,KAAK,UAAU,OAAO,CAAC,QAAgB;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,oBAAoB,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,IAAI,CAAC,CAAC;IAEnD,IAAI,CAAC;QAAC,QAAQ,EAAE,CAAC;IAAC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YAAE,SAAS;QACjC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAAE,SAAS;QACtE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACzF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAY,CAAC;YAEzC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;YAEzF,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAExB,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,IAAI,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;gBAC5E,aAAa,EAAE,IAAI,CAAC,IAAI;gBACxB,aAAa,EAAE,MAAM;gBACrB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,UAAU,EAAE,IAAI,CAAC,IAAI;aACtB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAEtB,QAAQ,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC;cACA,QAAQ,eAAe,MAAM;uBACpB,YAAY;;;GAGhC,CAAC,CAAC;AACL,CAAC;AAED,yBAAyB;AAEzB,KAAK,UAAU,SAAS;IACtB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,QAAQ,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,cAAc,IAAI,GAAG,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,cAAc,IAAI,KAAK,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,MAAM,MAAM,CAAC,CAAC;QACnD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,OAAQ,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,4BAA4B;AAE5B,KAAK,UAAU,YAAY;IACzB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,KAAK,CAAC,CAAC;IAEvD,MAAM,SAAS,GAAG;QAChB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE;QAC7D,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE;QAC7D,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,yBAAyB,EAAE;QAC/D,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE;QAC7D,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,wBAAwB,EAAE;QAC9D,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,wBAAwB,EAAE;QAC9D,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,0BAA0B,EAAE;QAChE,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,6BAA6B,EAAE;QACnE,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,2BAA2B,EAAE;QACjE,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,4BAA4B,EAAE;QAClE,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,8BAA8B,EAAE;QACpE,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAE;QAC5D,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,mCAAmC,EAAE;QACzE,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE;QAC7D,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,uCAAuC,EAAE;KAC9E,CAAC;IAEF,MAAM,QAAQ,GAAG,SAAS;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SAC9C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,WAAW,MAAM,IAAI,SAAS,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,sBAAsB;AAEtB,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,MAAM,QAAQ,EAAE,CAAC;YACjB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM;QACR,KAAK,MAAM;YACT,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM;QACR,KAAK,WAAW;YACd,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,SAAS,EAAE,CAAC;YACZ,MAAM;QACR,KAAK,SAAS;YACZ,2BAA2B;YAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,cAAc,CAAC,CAAC;gBAC1D,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;gBACjE,MAAM,QAAQ,EAAE,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,SAAS,EAAE,CAAC;YACd,CAAC;YACD,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;YAC/C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dk-bogfoerer",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI Bogfoerer for danske virksomheder — CLI + MCP servere til Claude Code med Billy.dk og Gmail integration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"dk-bogfoerer": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/**/*"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"start": "node dist/cli.js",
|
|
15
|
+
"dev": "tsx src/cli.ts",
|
|
16
|
+
"prepublishOnly": "npm run build"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"bogfoering",
|
|
20
|
+
"denmark",
|
|
21
|
+
"accounting",
|
|
22
|
+
"moms",
|
|
23
|
+
"skat",
|
|
24
|
+
"billy",
|
|
25
|
+
"mcp",
|
|
26
|
+
"claude-code",
|
|
27
|
+
"ai",
|
|
28
|
+
"bookkeeping"
|
|
29
|
+
],
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/lauenborg/dk-bogfoerer-crew"
|
|
33
|
+
},
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"typescript": "^5.7.0",
|
|
41
|
+
"tsx": "^4.19.0",
|
|
42
|
+
"@types/node": "^22.0.0"
|
|
43
|
+
}
|
|
44
|
+
}
|