@ksefnik/cli 0.0.1
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/LICENSE +21 -0
- package/dist/commands/bank.d.ts +3 -0
- package/dist/commands/bank.d.ts.map +1 -0
- package/dist/commands/bank.js +22 -0
- package/dist/commands/bank.js.map +1 -0
- package/dist/commands/fetch.d.ts +3 -0
- package/dist/commands/fetch.d.ts.map +1 -0
- package/dist/commands/fetch.js +40 -0
- package/dist/commands/fetch.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +24 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/reconcile.d.ts +3 -0
- package/dist/commands/reconcile.d.ts.map +1 -0
- package/dist/commands/reconcile.js +28 -0
- package/dist/commands/reconcile.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +25 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +35 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive/guided-reconcile.d.ts +2 -0
- package/dist/interactive/guided-reconcile.d.ts.map +1 -0
- package/dist/interactive/guided-reconcile.js +39 -0
- package/dist/interactive/guided-reconcile.js.map +1 -0
- package/dist/interactive/index.d.ts +2 -0
- package/dist/interactive/index.d.ts.map +1 -0
- package/dist/interactive/index.js +2 -0
- package/dist/interactive/index.js.map +1 -0
- package/dist/main.d.ts +4 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +34 -0
- package/dist/main.js.map +1 -0
- package/dist/utils/config.d.ts +13 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +43 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/output.d.ts +4 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +27 -0
- package/dist/utils/output.js.map +1 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 CodeFormers-it
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bank.d.ts","sourceRoot":"","sources":["../../src/commands/bank.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMxC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB1D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { importBankStatementFromString } from '@ksefnik/core';
|
|
3
|
+
import { output } from '../utils/output.js';
|
|
4
|
+
export function registerBankCommand(program) {
|
|
5
|
+
const bank = program.command('bank').description('Bank statement operations');
|
|
6
|
+
bank
|
|
7
|
+
.command('import <file>')
|
|
8
|
+
.description('Import bank statement file')
|
|
9
|
+
.option('--format <format>', 'Output format: json|table', 'json')
|
|
10
|
+
.action(async (file, opts) => {
|
|
11
|
+
const content = readFileSync(file, 'utf-8');
|
|
12
|
+
const transactions = await importBankStatementFromString(content);
|
|
13
|
+
console.log(`Imported ${transactions.length} transactions`);
|
|
14
|
+
output(transactions.map((t) => ({
|
|
15
|
+
date: t.date,
|
|
16
|
+
amount: (t.amount / 100).toFixed(2),
|
|
17
|
+
description: t.description.slice(0, 60),
|
|
18
|
+
bank: t.bank,
|
|
19
|
+
})), opts.format);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=bank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bank.js","sourceRoot":"","sources":["../../src/commands/bank.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAiB,6BAA6B,EAAE,MAAM,eAAe,CAAA;AAE5E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAA;IAE7E,IAAI;SACD,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAwB,EAAE,EAAE;QACvD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,MAAM,6BAA6B,CAAC,OAAO,CAAC,CAAA;QAEjE,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,CAAC,MAAM,eAAe,CAAC,CAAA;QAC3D,MAAM,CACJ,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACnC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC,EACH,IAAI,CAAC,MAA0B,CAChC,CAAA;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/commands/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMxC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmC3D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createKsefnik } from '@ksefnik/core';
|
|
2
|
+
import { KsefAuthError } from '@ksefnik/http';
|
|
3
|
+
import { resolveAdapter, resolveConfig } from '../utils/config.js';
|
|
4
|
+
import { output } from '../utils/output.js';
|
|
5
|
+
export function registerFetchCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command('fetch')
|
|
8
|
+
.description('Fetch invoices from KSeF')
|
|
9
|
+
.requiredOption('--from <date>', 'Start date (YYYY-MM-DD)')
|
|
10
|
+
.requiredOption('--to <date>', 'End date (YYYY-MM-DD)')
|
|
11
|
+
.option('--format <format>', 'Output format: json|table', 'json')
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
const globalOpts = program.opts();
|
|
14
|
+
const config = resolveConfig(globalOpts);
|
|
15
|
+
const adapter = resolveAdapter(globalOpts, config);
|
|
16
|
+
const ksef = createKsefnik({ config, adapter });
|
|
17
|
+
try {
|
|
18
|
+
const invoices = await ksef.invoices.fetch({
|
|
19
|
+
from: opts.from,
|
|
20
|
+
to: opts.to,
|
|
21
|
+
nip: config.nip || undefined,
|
|
22
|
+
});
|
|
23
|
+
output(invoices, opts.format);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (error instanceof KsefAuthError) {
|
|
27
|
+
const status = error.statusCode ?? '?';
|
|
28
|
+
throw new Error(`KSeF authentication failed (status ${status}): ${error.message}. ` +
|
|
29
|
+
'Verify --token / KSEFNIK_TOKEN and that the token is valid for this environment.');
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
if (adapter.closeSession) {
|
|
35
|
+
await adapter.closeSession();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/commands/fetch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAsB,MAAM,oBAAoB,CAAA;AACtF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0BAA0B,CAAC;SACvC,cAAc,CAAC,eAAe,EAAE,yBAAyB,CAAC;SAC1D,cAAc,CAAC,aAAa,EAAE,uBAAuB,CAAC;SACtD,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,IAAkD,EAAE,EAAE;QACnE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAA;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;QACxC,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAClD,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;QAE/C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACzC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,SAAS;aAC7B,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAA0B,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,IAAI,GAAG,CAAA;gBACtC,MAAM,IAAI,KAAK,CACb,sCAAsC,MAAM,MAAM,KAAK,CAAC,OAAO,IAAI;oBACjE,kFAAkF,CACrF,CAAA;YACH,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,MAAM,OAAO,CAAC,YAAY,EAAE,CAAA;YAC9B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMxC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmBzD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createKsefnik } from '@ksefnik/core';
|
|
2
|
+
import { createMcpServer } from '@ksefnik/mcp';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { resolveAdapter, resolveConfig } from '../utils/config.js';
|
|
5
|
+
export function registerMcpCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command('mcp')
|
|
8
|
+
.description('Start MCP server for AI assistant integration')
|
|
9
|
+
.option('--stdio', 'Use stdio transport (default)', true)
|
|
10
|
+
.action(async () => {
|
|
11
|
+
const globalOpts = program.opts();
|
|
12
|
+
const config = resolveConfig(globalOpts);
|
|
13
|
+
const adapter = resolveAdapter(globalOpts, config);
|
|
14
|
+
const ksef = createKsefnik({ config, adapter });
|
|
15
|
+
const server = createMcpServer(ksef);
|
|
16
|
+
// NOTE: session init is lazy — the KsefAdapterImpl in @ksefnik/core
|
|
17
|
+
// authenticates on first tool call that needs it. Eager init here
|
|
18
|
+
// would deadlock the MCP handshake if auth fails (client never gets
|
|
19
|
+
// the `initialize` response because the process dies with stderr).
|
|
20
|
+
const transport = new StdioServerTransport();
|
|
21
|
+
await server.connect(transport);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAsB,MAAM,oBAAoB,CAAA;AAEtF,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,SAAS,EAAE,+BAA+B,EAAE,IAAI,CAAC;SACxD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAA;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;QACxC,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAClD,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;QAEpC,oEAAoE;QACpE,kEAAkE;QAClE,oEAAoE;QACpE,mEAAmE;QACnE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;QAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/commands/reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMxC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B/D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { createKsefnik } from '@ksefnik/core';
|
|
3
|
+
import { resolveConfig } from '../utils/config.js';
|
|
4
|
+
import { output } from '../utils/output.js';
|
|
5
|
+
export function registerReconcileCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command('reconcile')
|
|
8
|
+
.description('Run reconciliation between invoices and bank transactions')
|
|
9
|
+
.requiredOption('--bank <file>', 'Bank statement file')
|
|
10
|
+
.option('--format <format>', 'Output format: json|table', 'json')
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
const globalOpts = program.opts();
|
|
13
|
+
const config = resolveConfig(globalOpts);
|
|
14
|
+
const ksef = createKsefnik({ config });
|
|
15
|
+
const bankContent = readFileSync(opts.bank, 'utf-8');
|
|
16
|
+
const transactions = await ksef.bank.importFromString(bankContent);
|
|
17
|
+
const invoices = await ksef.invoices.list();
|
|
18
|
+
const report = await ksef.reconciliation.run(invoices, transactions);
|
|
19
|
+
console.log(`Matched: ${report.summary.matchedCount}`);
|
|
20
|
+
console.log(`Unmatched invoices: ${report.summary.unmatchedInvoiceCount}`);
|
|
21
|
+
console.log(`Unmatched transactions: ${report.summary.unmatchedTransactionCount}`);
|
|
22
|
+
console.log(`Average confidence: ${report.summary.averageConfidence}%`);
|
|
23
|
+
if (opts.format === 'json') {
|
|
24
|
+
output(report);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=reconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/commands/reconcile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAiC,MAAM,eAAe,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAsB,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,2DAA2D,CAAC;SACxE,cAAc,CAAC,eAAe,EAAE,qBAAqB,CAAC;SACtD,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,IAAsC,EAAE,EAAE;QACvD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAA;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;QACxC,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAEtC,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAA;QAClE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;QAE3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QAEpE,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;QACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAA;QAC1E,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAA;QAClF,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,OAAO,CAAC,iBAAiB,GAAG,CAAC,CAAA;QAEvE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,CAAA;QAChB,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMxC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoB1D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { createKsefnik } from '@ksefnik/core';
|
|
3
|
+
import { resolveConfig } from '../utils/config.js';
|
|
4
|
+
import { output } from '../utils/output.js';
|
|
5
|
+
export function registerSendCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command('send <filePath>')
|
|
8
|
+
.description('Send invoice XML to KSeF')
|
|
9
|
+
.option('--format <format>', 'Output format: json|text', 'json')
|
|
10
|
+
.action(async (filePath, opts) => {
|
|
11
|
+
const globalOpts = program.opts();
|
|
12
|
+
const config = resolveConfig(globalOpts);
|
|
13
|
+
const ksef = createKsefnik({ config });
|
|
14
|
+
const xml = readFileSync(filePath, 'utf-8');
|
|
15
|
+
const result = await ksef.invoices.send({ xml, nip: config.nip });
|
|
16
|
+
if (opts.format === 'text') {
|
|
17
|
+
console.log(`KSeF reference: ${result.ksefReference}`);
|
|
18
|
+
console.log(`Timestamp: ${result.timestamp}`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
output(result);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAsB,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,IAAwB,EAAE,EAAE;QAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAA;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;QACxC,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAEtC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;QAEjE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAA;YACtD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,CAAA;QAChB,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOxC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgC9D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { createKsefnik } from '@ksefnik/core';
|
|
3
|
+
import { resolveConfig } from '../utils/config.js';
|
|
4
|
+
import { output } from '../utils/output.js';
|
|
5
|
+
export function registerValidateCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command('validate <file>')
|
|
8
|
+
.description('Validate invoice JSON file')
|
|
9
|
+
.option('--format <format>', 'Output format: json|table', 'json')
|
|
10
|
+
.action(async (file, opts) => {
|
|
11
|
+
const globalOpts = program.opts();
|
|
12
|
+
const config = resolveConfig(globalOpts);
|
|
13
|
+
const ksef = createKsefnik({ config });
|
|
14
|
+
const content = readFileSync(file, 'utf-8');
|
|
15
|
+
const invoices = JSON.parse(content);
|
|
16
|
+
const arr = Array.isArray(invoices) ? invoices : [invoices];
|
|
17
|
+
const reports = ksef.validation.validate(arr);
|
|
18
|
+
for (const report of reports) {
|
|
19
|
+
const errors = report.results.filter((r) => !r.valid);
|
|
20
|
+
if (errors.length === 0) {
|
|
21
|
+
console.log(`✓ ${report.invoice.invoiceNumber}: valid`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
console.log(`✗ ${report.invoice.invoiceNumber}: ${errors.length} error(s)`);
|
|
25
|
+
for (const err of errors) {
|
|
26
|
+
console.log(` - [${err.rule}] ${err.field ?? ''}: ${err.message ?? 'invalid'}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (opts.format === 'json') {
|
|
31
|
+
output(reports);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAsB,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAwB,EAAE,EAAE;QACvD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAA;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;QACxC,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAEtC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC3C,MAAM,QAAQ,GAAc,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QAE3D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAE7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,aAAa,SAAS,CAAC,CAAA;YACzD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,aAAa,KAAK,MAAM,CAAC,MAAM,WAAW,CAAC,CAAA;gBAC3E,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,GAAG,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAA;gBAClF,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guided-reconcile.d.ts","sourceRoot":"","sources":["../../src/interactive/guided-reconcile.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA4CrD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import { createKsefnik } from '@ksefnik/core';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
export async function guidedReconcile() {
|
|
5
|
+
p.intro('Ksefnik — Guided Reconciliation');
|
|
6
|
+
const bankFile = await p.text({
|
|
7
|
+
message: 'Path to bank statement file:',
|
|
8
|
+
placeholder: './bank-statement.csv',
|
|
9
|
+
validate: (v) => (v.length === 0 ? 'Required' : undefined),
|
|
10
|
+
});
|
|
11
|
+
if (p.isCancel(bankFile))
|
|
12
|
+
return;
|
|
13
|
+
const nip = await p.text({
|
|
14
|
+
message: 'Your NIP:',
|
|
15
|
+
placeholder: '1234567890',
|
|
16
|
+
validate: (v) => (v.length !== 10 ? 'NIP must be 10 digits' : undefined),
|
|
17
|
+
});
|
|
18
|
+
if (p.isCancel(nip))
|
|
19
|
+
return;
|
|
20
|
+
const config = { nip, environment: 'test' };
|
|
21
|
+
const ksef = createKsefnik({ config });
|
|
22
|
+
const s = p.spinner();
|
|
23
|
+
s.start('Importing bank statement...');
|
|
24
|
+
const content = readFileSync(bankFile, 'utf-8');
|
|
25
|
+
const transactions = await ksef.bank.importFromString(content);
|
|
26
|
+
s.stop(`Imported ${transactions.length} transactions`);
|
|
27
|
+
const invoices = await ksef.invoices.list();
|
|
28
|
+
s.start('Running reconciliation...');
|
|
29
|
+
const report = await ksef.reconciliation.run(invoices, transactions);
|
|
30
|
+
s.stop('Reconciliation complete');
|
|
31
|
+
p.note([
|
|
32
|
+
`Matched: ${report.summary.matchedCount}`,
|
|
33
|
+
`Unmatched invoices: ${report.summary.unmatchedInvoiceCount}`,
|
|
34
|
+
`Unmatched transactions: ${report.summary.unmatchedTransactionCount}`,
|
|
35
|
+
`Average confidence: ${report.summary.averageConfidence}%`,
|
|
36
|
+
].join('\n'), 'Results');
|
|
37
|
+
p.outro('Done!');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=guided-reconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guided-reconcile.js","sourceRoot":"","sources":["../../src/interactive/guided-reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAAE,aAAa,EAAiC,MAAM,eAAe,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGtC,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;IAE1C,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QAC5B,OAAO,EAAE,8BAA8B;QACvC,WAAW,EAAE,sBAAsB;QACnC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;KAC3D,CAAC,CAAA;IACF,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAM;IAEhC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACvB,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC;KACzE,CAAC,CAAA;IACF,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAM;IAE3B,MAAM,MAAM,GAAkB,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,CAAA;IAC1D,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEtC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;IACrB,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAEtC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC/C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC9D,CAAC,CAAC,IAAI,CAAC,YAAY,YAAY,CAAC,MAAM,eAAe,CAAC,CAAA;IAEtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE3C,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IACpE,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IAEjC,CAAC,CAAC,IAAI,CACJ;QACE,YAAY,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;QACzC,uBAAuB,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE;QAC7D,2BAA2B,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE;QACrE,uBAAuB,MAAM,CAAC,OAAO,CAAC,iBAAiB,GAAG;KAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,SAAS,CACV,CAAA;IAED,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interactive/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interactive/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,wBAAgB,aAAa,IAAI,OAAO,CAyBvC"}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { registerFetchCommand } from './commands/fetch.js';
|
|
4
|
+
import { registerSendCommand } from './commands/send.js';
|
|
5
|
+
import { registerBankCommand } from './commands/bank.js';
|
|
6
|
+
import { registerReconcileCommand } from './commands/reconcile.js';
|
|
7
|
+
import { registerValidateCommand } from './commands/validate.js';
|
|
8
|
+
import { registerMcpCommand } from './commands/mcp.js';
|
|
9
|
+
export function createProgram() {
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name('ksefnik')
|
|
13
|
+
.description('KSeF reconciliation CLI')
|
|
14
|
+
.version('0.0.1')
|
|
15
|
+
.option('--nip <nip>', 'NIP number')
|
|
16
|
+
.option('--env <environment>', 'KSeF environment: production|demo|test (default: env KSEFNIK_ENV or test)')
|
|
17
|
+
.option('--token <token>', 'KSeF API token')
|
|
18
|
+
.option('--adapter <kind>', 'KSeF adapter: http | simulator (default: env KSEFNIK_ADAPTER or http)')
|
|
19
|
+
.option('--public-key <pathOrPem>', 'Path to KSeF MF public key (PEM) or inline PEM; required for HTTP adapter')
|
|
20
|
+
.option('--debug', 'Enable debug output');
|
|
21
|
+
registerFetchCommand(program);
|
|
22
|
+
registerSendCommand(program);
|
|
23
|
+
registerBankCommand(program);
|
|
24
|
+
registerReconcileCommand(program);
|
|
25
|
+
registerValidateCommand(program);
|
|
26
|
+
registerMcpCommand(program);
|
|
27
|
+
return program;
|
|
28
|
+
}
|
|
29
|
+
createProgram().parseAsync(process.argv).catch((error) => {
|
|
30
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
31
|
+
process.stderr.write(`ksefnik: ${message}\n`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,yBAAyB,CAAC;SACtC,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC;SACnC,MAAM,CAAC,qBAAqB,EAAE,2EAA2E,CAAC;SAC1G,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;SAC3C,MAAM,CAAC,kBAAkB,EAAE,uEAAuE,CAAC;SACnG,MAAM,CACL,0BAA0B,EAC1B,2EAA2E,CAC5E;SACA,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAA;IAE3C,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC5B,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC5B,wBAAwB,CAAC,OAAO,CAAC,CAAA;IACjC,uBAAuB,CAAC,OAAO,CAAC,CAAA;IAChC,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAE3B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,aAAa,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAChE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,IAAI,CAAC,CAAA;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { KsefAdapter, KsefnikConfig } from '@ksefnik/shared';
|
|
2
|
+
export type CliAdapterKind = 'http' | 'simulator';
|
|
3
|
+
export interface CliGlobalOpts {
|
|
4
|
+
nip?: string;
|
|
5
|
+
env?: 'production' | 'demo' | 'test';
|
|
6
|
+
token?: string;
|
|
7
|
+
adapter?: CliAdapterKind;
|
|
8
|
+
publicKey?: string;
|
|
9
|
+
debug?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function resolveConfig(opts: CliGlobalOpts): KsefnikConfig;
|
|
12
|
+
export declare function resolveAdapter(opts: CliGlobalOpts, config: KsefnikConfig): KsefAdapter;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAIjE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,CAAA;AAEjD,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,CAAA;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,CAMhE;AAgBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,GAAG,WAAW,CAqBtF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { createHttpAdapter } from '@ksefnik/http';
|
|
3
|
+
import { createKsefSimulator } from '@ksefnik/simulator';
|
|
4
|
+
export function resolveConfig(opts) {
|
|
5
|
+
return {
|
|
6
|
+
nip: opts.nip ?? process.env['KSEFNIK_NIP'] ?? '',
|
|
7
|
+
environment: opts.env ?? process.env['KSEFNIK_ENV'] ?? 'test',
|
|
8
|
+
token: opts.token ?? process.env['KSEFNIK_TOKEN'],
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function resolvePublicKey(opts) {
|
|
12
|
+
const cliValue = opts.publicKey;
|
|
13
|
+
if (cliValue && cliValue.includes('-----BEGIN PUBLIC KEY-----'))
|
|
14
|
+
return cliValue;
|
|
15
|
+
if (cliValue && cliValue.length > 0)
|
|
16
|
+
return readFileSync(cliValue, 'utf8');
|
|
17
|
+
const envInline = process.env['KSEFNIK_PUBLIC_KEY_PEM'];
|
|
18
|
+
if (envInline && envInline.includes('-----BEGIN PUBLIC KEY-----'))
|
|
19
|
+
return envInline;
|
|
20
|
+
const envPath = process.env['KSEFNIK_PUBLIC_KEY_PATH'];
|
|
21
|
+
if (envPath && envPath.length > 0)
|
|
22
|
+
return readFileSync(envPath, 'utf8');
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
export function resolveAdapter(opts, config) {
|
|
26
|
+
const kind = opts.adapter ?? (process.env['KSEFNIK_ADAPTER'] ?? 'http');
|
|
27
|
+
if (kind === 'simulator') {
|
|
28
|
+
return createKsefSimulator({ scenario: 'happy-path' }).adapter;
|
|
29
|
+
}
|
|
30
|
+
if (!config.token) {
|
|
31
|
+
throw new Error('HTTP adapter requires KSeF token (--token or KSEFNIK_TOKEN).');
|
|
32
|
+
}
|
|
33
|
+
if (!config.nip) {
|
|
34
|
+
throw new Error('HTTP adapter requires NIP (--nip or KSEFNIK_NIP).');
|
|
35
|
+
}
|
|
36
|
+
return createHttpAdapter({
|
|
37
|
+
nip: config.nip,
|
|
38
|
+
token: config.token,
|
|
39
|
+
environment: config.environment,
|
|
40
|
+
publicKeyPem: resolvePublicKey(opts),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAaxD,MAAM,UAAU,aAAa,CAAC,IAAmB;IAC/C,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE;QACjD,WAAW,EAAE,IAAI,CAAC,GAAG,IAAK,OAAO,CAAC,GAAG,CAAC,aAAa,CAAkC,IAAI,MAAM;QAC/F,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;KAClD,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAmB;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAA;IAC/B,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAAE,OAAO,QAAQ,CAAA;IAChF,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAE1E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;IACvD,IAAI,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAAE,OAAO,SAAS,CAAA;IAEnF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;IACtD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAEvE,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAmB,EAAE,MAAqB;IACvE,MAAM,IAAI,GACR,IAAI,CAAC,OAAO,IAAI,CAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAgC,IAAI,MAAM,CAAC,CAAA;IAE5F,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO,mBAAmB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,OAAO,CAAA;IAChE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACtE,CAAC;IAED,OAAO,iBAAiB,CAAC;QACvB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,YAAY,EAAE,gBAAgB,CAAC,IAAI,CAAC;KACrC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAUnE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,GAAE,MAAM,GAAG,OAAgB,GAAG,IAAI,CAQ7E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function formatJson(data) {
|
|
2
|
+
return JSON.stringify(data, null, 2);
|
|
3
|
+
}
|
|
4
|
+
export function formatTable(rows) {
|
|
5
|
+
if (rows.length === 0)
|
|
6
|
+
return '(no data)';
|
|
7
|
+
const keys = Object.keys(rows[0]);
|
|
8
|
+
const widths = keys.map((k) => Math.max(k.length, ...rows.map((r) => String(r[k] ?? '').length)));
|
|
9
|
+
const header = keys.map((k, i) => k.padEnd(widths[i])).join(' | ');
|
|
10
|
+
const separator = widths.map((w) => '-'.repeat(w)).join('-+-');
|
|
11
|
+
const body = rows
|
|
12
|
+
.map((r) => keys.map((k, i) => String(r[k] ?? '').padEnd(widths[i])).join(' | '))
|
|
13
|
+
.join('\n');
|
|
14
|
+
return `${header}\n${separator}\n${body}`;
|
|
15
|
+
}
|
|
16
|
+
export function output(data, format = 'json') {
|
|
17
|
+
if (format === 'json') {
|
|
18
|
+
console.log(formatJson(data));
|
|
19
|
+
}
|
|
20
|
+
else if (format === 'table' && Array.isArray(data)) {
|
|
21
|
+
console.log(formatTable(data));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
console.log(formatJson(data));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAA+B;IACzD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAA;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACjG,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9D,MAAM,IAAI,GAAG,IAAI;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACjF,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,OAAO,GAAG,MAAM,KAAK,SAAS,KAAK,IAAI,EAAE,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAa,EAAE,SAA2B,MAAM;IACrE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/B,CAAC;SAAM,IAAI,MAAM,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;IAChC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ksefnik/cli",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Command-line interface for Ksefnik — fetch KSeF invoices, reconcile with bank statements, run MCP server",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "CodeFormers",
|
|
7
|
+
"homepage": "https://ksefnik.pl",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/CodeFormers-it/ksefnik.git",
|
|
11
|
+
"directory": "packages/cli"
|
|
12
|
+
},
|
|
13
|
+
"keywords": ["ksef", "ksefnik", "cli", "einvoice", "reconciliation", "poland", "mt940"],
|
|
14
|
+
"type": "module",
|
|
15
|
+
"bin": {
|
|
16
|
+
"ksefnik": "./dist/main.js"
|
|
17
|
+
},
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"files": ["dist", "!dist/**/__tests__", "!dist/**/*.test.*", "README.md", "LICENSE"],
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"import": "./dist/index.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc --build",
|
|
32
|
+
"dev": "tsc --build --watch",
|
|
33
|
+
"typecheck": "tsc --noEmit"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@ksefnik/shared": "workspace:^",
|
|
37
|
+
"@ksefnik/core": "workspace:^",
|
|
38
|
+
"@ksefnik/http": "workspace:^",
|
|
39
|
+
"@ksefnik/simulator": "workspace:^",
|
|
40
|
+
"@ksefnik/mcp": "workspace:^",
|
|
41
|
+
"@modelcontextprotocol/sdk": "^1.12",
|
|
42
|
+
"commander": "^13.1",
|
|
43
|
+
"@clack/prompts": "^0.10"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"typescript": "^5.7"
|
|
47
|
+
}
|
|
48
|
+
}
|