@hasna/invoices 0.1.0 → 0.1.2

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.
Files changed (40) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +9 -92
  3. package/dashboard/dist/assets/index-NFe45aEq.js +139 -0
  4. package/dashboard/dist/assets/index-khzrvnCp.css +1 -0
  5. package/dashboard/dist/index.html +13 -0
  6. package/dashboard/dist/logo.jpg +0 -0
  7. package/dist/cli/index.js +650 -10267
  8. package/dist/cli/tui.d.ts +2 -0
  9. package/dist/cli/tui.d.ts.map +1 -0
  10. package/dist/db/agents.d.ts +19 -0
  11. package/dist/db/agents.d.ts.map +1 -0
  12. package/dist/db/core.test.d.ts +2 -0
  13. package/dist/db/core.test.d.ts.map +1 -0
  14. package/dist/db/database.d.ts +6 -8
  15. package/dist/db/database.d.ts.map +1 -1
  16. package/dist/db/invoices.d.ts +77 -90
  17. package/dist/db/invoices.d.ts.map +1 -1
  18. package/dist/db/migrate.d.ts +5 -0
  19. package/dist/db/migrate.d.ts.map +1 -0
  20. package/dist/db/schema.d.ts +6 -0
  21. package/dist/db/schema.d.ts.map +1 -0
  22. package/dist/index.d.ts +6 -7
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +417 -10044
  25. package/dist/lib/version.d.ts +2 -0
  26. package/dist/lib/version.d.ts.map +1 -0
  27. package/dist/mcp/index.d.ts +1 -1
  28. package/dist/mcp/index.js +595 -10281
  29. package/dist/server/index.d.ts +3 -0
  30. package/dist/server/index.d.ts.map +1 -0
  31. package/dist/server/index.js +4694 -0
  32. package/dist/types/index.d.ts +18 -0
  33. package/dist/types/index.d.ts.map +1 -0
  34. package/package.json +20 -14
  35. package/dist/db/business.d.ts +0 -93
  36. package/dist/db/business.d.ts.map +0 -1
  37. package/dist/db/clients.d.ts +0 -45
  38. package/dist/db/clients.d.ts.map +0 -1
  39. package/dist/db/migrations.d.ts +0 -7
  40. package/dist/db/migrations.d.ts.map +0 -1
@@ -0,0 +1,18 @@
1
+ export type InvoiceStatus = "draft" | "sent" | "partially_paid" | "paid" | "void" | "overdue";
2
+ export interface InvoiceLine {
3
+ description: string;
4
+ quantity: number;
5
+ unitPrice: number;
6
+ taxRate?: number;
7
+ }
8
+ export interface Invoice {
9
+ id: string;
10
+ number: string;
11
+ customerName: string;
12
+ currency: string;
13
+ status: InvoiceStatus;
14
+ issuedAt: string;
15
+ dueAt?: string;
16
+ lines: InvoiceLine[];
17
+ }
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE9F,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB"}
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@hasna/invoices",
3
- "version": "0.1.0",
4
- "description": "Invoice management for AI agents CLI + MCP server with SQLite storage",
3
+ "version": "0.1.2",
4
+ "description": "Invoice generation and management for AI agents - CLI + MCP server + REST API + dashboard + SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "bin": {
9
9
  "invoices": "dist/cli/index.js",
10
- "invoices-mcp": "dist/mcp/index.js"
10
+ "invoices-mcp": "dist/mcp/index.js",
11
+ "invoices-serve": "dist/server/index.js"
11
12
  },
12
13
  "exports": {
13
14
  ".": {
@@ -17,28 +18,30 @@
17
18
  },
18
19
  "files": [
19
20
  "dist",
21
+ "dashboard/dist",
20
22
  "LICENSE",
21
23
  "README.md"
22
24
  ],
23
25
  "scripts": {
24
- "build": "bun build src/cli/index.ts --outdir dist/cli --target bun --external @modelcontextprotocol/sdk && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk && bun build src/index.ts --outdir dist --target bun && tsc --emitDeclarationOnly --outDir dist",
26
+ "build": "cd dashboard && bun run build && cd .. && bun build src/cli/index.ts --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk && bun build src/server/index.ts --outdir dist/server --target bun && bun build src/index.ts --outdir dist --target bun && tsc --emitDeclarationOnly --outDir dist",
27
+ "build:dashboard": "cd dashboard && bun run build",
25
28
  "typecheck": "tsc --noEmit",
26
29
  "test": "bun test",
27
30
  "dev:cli": "bun run src/cli/index.ts",
28
31
  "dev:mcp": "bun run src/mcp/index.ts",
29
- "prepublishOnly": "bun run build",
30
- "postinstall": "mkdir -p $HOME/.hasna/invoices 2>/dev/null || true"
32
+ "dev:serve": "bun run src/server/index.ts",
33
+ "dev:dashboard": "cd dashboard && bun run dev",
34
+ "prepublishOnly": "bun run build"
31
35
  },
32
36
  "keywords": [
33
37
  "invoices",
34
- "invoicing",
35
38
  "billing",
36
39
  "mcp",
37
40
  "ai",
38
- "coding-agent",
39
- "claude",
41
+ "agents",
40
42
  "cli",
41
- "sqlite"
43
+ "sdk",
44
+ "dashboard"
42
45
  ],
43
46
  "publishConfig": {
44
47
  "registry": "https://registry.npmjs.org",
@@ -46,11 +49,11 @@
46
49
  },
47
50
  "repository": {
48
51
  "type": "git",
49
- "url": "https://github.com/hasna/open-invoices.git"
52
+ "url": "https://github.com/hasna/invoices.git"
50
53
  },
51
- "homepage": "https://github.com/hasna/open-invoices",
54
+ "homepage": "https://github.com/hasna/invoices",
52
55
  "bugs": {
53
- "url": "https://github.com/hasna/open-invoices/issues"
56
+ "url": "https://github.com/hasna/invoices/issues"
54
57
  },
55
58
  "engines": {
56
59
  "bun": ">=1.0.0"
@@ -58,13 +61,16 @@
58
61
  "author": "Andrei Hasna <andrei@hasna.com>",
59
62
  "license": "Apache-2.0",
60
63
  "dependencies": {
61
- "@hasna/cloud": "^0.1.24",
62
64
  "@modelcontextprotocol/sdk": "^1.12.1",
65
+ "chalk": "^5.4.1",
63
66
  "commander": "^13.1.0",
67
+ "ink": "^5.2.0",
68
+ "react": "^18.3.1",
64
69
  "zod": "^3.24.2"
65
70
  },
66
71
  "devDependencies": {
67
72
  "@types/bun": "^1.2.4",
73
+ "@types/react": "^18.3.18",
68
74
  "typescript": "^5.7.3"
69
75
  }
70
76
  }
@@ -1,93 +0,0 @@
1
- /**
2
- * Business profiles and tax rules
3
- */
4
- export interface BusinessProfile {
5
- id: string;
6
- name: string;
7
- address_line1: string | null;
8
- address_line2: string | null;
9
- city: string | null;
10
- state: string | null;
11
- postal_code: string | null;
12
- country: string;
13
- tax_id: string | null;
14
- vat_number: string | null;
15
- registration_number: string | null;
16
- email: string | null;
17
- phone: string | null;
18
- website: string | null;
19
- bank_name: string | null;
20
- bank_iban: string | null;
21
- bank_swift: string | null;
22
- bank_account: string | null;
23
- logo_url: string | null;
24
- is_default: boolean;
25
- metadata: Record<string, unknown>;
26
- created_at: string;
27
- updated_at: string;
28
- }
29
- export interface CreateBusinessInput {
30
- name: string;
31
- address_line1?: string;
32
- address_line2?: string;
33
- city?: string;
34
- state?: string;
35
- postal_code?: string;
36
- country?: string;
37
- tax_id?: string;
38
- vat_number?: string;
39
- registration_number?: string;
40
- email?: string;
41
- phone?: string;
42
- website?: string;
43
- bank_name?: string;
44
- bank_iban?: string;
45
- bank_swift?: string;
46
- bank_account?: string;
47
- logo_url?: string;
48
- is_default?: boolean;
49
- }
50
- export declare function createBusinessProfile(input: CreateBusinessInput): BusinessProfile;
51
- export declare function getBusinessProfile(id: string): BusinessProfile | null;
52
- export declare function getDefaultBusinessProfile(): BusinessProfile | null;
53
- export declare function listBusinessProfiles(): BusinessProfile[];
54
- export declare function updateBusinessProfile(id: string, input: Partial<CreateBusinessInput>): BusinessProfile | null;
55
- export declare function deleteBusinessProfile(id: string): boolean;
56
- export interface TaxRule {
57
- id: string;
58
- country: string;
59
- region: string | null;
60
- tax_name: string;
61
- rate: number;
62
- type: "vat" | "sales_tax" | "gst" | "other";
63
- is_default: boolean;
64
- reverse_charge: boolean;
65
- description: string | null;
66
- created_at: string;
67
- }
68
- export declare function getTaxRulesForCountry(country: string): TaxRule[];
69
- export declare function getDefaultTaxRule(country: string): TaxRule | null;
70
- export declare function getTaxRule(id: string): TaxRule | null;
71
- export declare function listAllTaxRules(): TaxRule[];
72
- export interface CreateTaxRuleInput {
73
- country: string;
74
- region?: string;
75
- tax_name: string;
76
- rate: number;
77
- type?: "vat" | "sales_tax" | "gst" | "other";
78
- is_default?: boolean;
79
- reverse_charge?: boolean;
80
- description?: string;
81
- }
82
- export declare function createTaxRule(input: CreateTaxRuleInput): TaxRule;
83
- export declare function deleteTaxRule(id: string): boolean;
84
- /**
85
- * Determine tax for an invoice based on issuer and client countries.
86
- * Applies EU reverse charge when both parties are in EU and client has VAT number.
87
- */
88
- export declare function determineTax(issuerCountry: string, clientCountry: string, clientVatNumber?: string | null): {
89
- tax_rate: number;
90
- tax_name: string;
91
- reverse_charge: boolean;
92
- };
93
- //# sourceMappingURL=business.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"business.d.ts","sourceRoot":"","sources":["../../src/db/business.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- /**
2
- * Client CRUD operations for invoicing
3
- */
4
- export interface Client {
5
- id: string;
6
- name: string;
7
- email: string | null;
8
- phone: string | null;
9
- address: string | null;
10
- address_line1: string | null;
11
- address_line2: string | null;
12
- city: string | null;
13
- state: string | null;
14
- postal_code: string | null;
15
- country: string | null;
16
- tax_id: string | null;
17
- vat_number: string | null;
18
- language: string | null;
19
- notes: string | null;
20
- metadata: Record<string, unknown>;
21
- created_at: string;
22
- updated_at: string;
23
- }
24
- export interface CreateClientInput {
25
- name: string;
26
- email?: string;
27
- phone?: string;
28
- address?: string;
29
- address_line1?: string;
30
- address_line2?: string;
31
- city?: string;
32
- state?: string;
33
- postal_code?: string;
34
- country?: string;
35
- tax_id?: string;
36
- vat_number?: string;
37
- language?: string;
38
- notes?: string;
39
- }
40
- export declare function createClient(input: CreateClientInput): Client;
41
- export declare function getClient(id: string): Client | null;
42
- export declare function listClients(search?: string): Client[];
43
- export declare function updateClient(id: string, input: Partial<CreateClientInput>): Client | null;
44
- export declare function deleteClient(id: string): boolean;
45
- //# sourceMappingURL=clients.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/db/clients.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAmB7D;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAInD;AAED,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAUrD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,MAAM,GAAG,IAAI,CAsBzF;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAGhD"}
@@ -1,7 +0,0 @@
1
- export interface MigrationEntry {
2
- id: number;
3
- name: string;
4
- sql: string;
5
- }
6
- export declare const MIGRATIONS: MigrationEntry[];
7
- //# sourceMappingURL=migrations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,UAAU,EAAE,cAAc,EAiLtC,CAAC"}