@dhahaby-com/aurelia-cli 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,30 @@
1
- # Temporary Holding Version
1
+ # @dhahaby-com/aurelia-cli
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Aurelia by Dhahaby in your terminal: today's gold price, what you could borrow against your gold, and your own Dhahaby gold account (read-only).
4
+
5
+ ```bash
6
+ npx @dhahaby-com/aurelia-cli price
7
+ npx @dhahaby-com/aurelia-cli estimate --karat 21 --grams 40
8
+ npm i -g @dhahaby-com/aurelia-cli && aurelia login
9
+ ```
10
+
11
+ | Command | What it does | Sign-in |
12
+ | --------------------------------- | ------------------------------------------------------------------------------------- | ------- |
13
+ | `price` | Gold price per gram for 24K, 22K, 21K and 18K (indicative) | no |
14
+ | `estimate --karat K --grams G` | Indicative value, loan and card limits | no |
15
+ | `products` | Gold-backed loan vs card | no |
16
+ | `jewellers` | Partner jewellers for a certified appraisal | no |
17
+ | `login` / `logout` | Sign in with your Dhahaby account in the browser (device code), or revoke this device | |
18
+ | `whoami` | Your account summary | yes |
19
+ | `pieces` | Your gold pieces and the next step for each | yes |
20
+ | `status` | Loan and card applications, facilities and appraisal bookings | yes |
21
+ | `tools` / `run <tool> key=value…` | List or call any tool | |
22
+ | `mcp` | Run as a stdio MCP server (same as `@dhahaby-com/aurelia-mcp`) | |
23
+
24
+ Options: `--json` for machine-readable output; `--server URL` or `AURELIA_SERVER` to use another server (default `https://mcp.dhahaby.com`).
25
+
26
+ Exit codes: `0` ok · `2` bad input · `3` not signed in · `4` not allowed · `5` server problem.
27
+
28
+ Sign-in uses OAuth 2.1 (device authorization grant). Credentials are stored in `~/.config/aurelia/credentials.json` (mode 0600) and refreshed automatically; `aurelia logout` revokes them on the server. Access is read-only: Aurelia cannot sign, pay, apply, book or move your gold. Figures are indicative; final amounts are set by a licensed lender after a certified appraisal.
29
+
30
+ Docs: https://docs.dhahaby.com · MIT licence
package/dist/api.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { type Credentials } from './credentials.js';
3
+ export declare const DEFAULT_SERVER = "https://mcp.dhahaby.com";
4
+ export declare const CLIENT_ID = "aurelia-cli";
5
+ export declare const VERSION = "0.1.0";
6
+ export declare class CliError extends Error {
7
+ readonly exitCode: 2 | 3 | 4 | 5;
8
+ constructor(message: string, exitCode: 2 | 3 | 4 | 5);
9
+ }
10
+ export declare function serverUrl(flag?: string): string;
11
+ export interface Discovery {
12
+ resource: string;
13
+ issuer: string;
14
+ tokenEndpoint: string;
15
+ deviceEndpoint: string;
16
+ revocationEndpoint?: string;
17
+ }
18
+ /** RFC 9728 → RFC 8414 discovery, starting from the MCP server. */
19
+ export declare function discover(server: string): Promise<Discovery>;
20
+ export declare function postForm<T>(url: string, body: Record<string, string>): Promise<{
21
+ status: number;
22
+ body: T;
23
+ }>;
24
+ /** A valid access token for the saved session, refreshing it when it is about to expire. */
25
+ export declare function accessToken(force?: boolean): Promise<Credentials | null>;
26
+ /** An MCP client: authenticated when signed in (unless `publicOnly`), otherwise the public endpoint. */
27
+ export declare function mcpClient(server: string, opts?: {
28
+ publicOnly?: boolean;
29
+ }): Promise<{
30
+ client: Client;
31
+ signedIn: boolean;
32
+ }>;
33
+ export interface ToolCall {
34
+ data: Record<string, unknown>;
35
+ isError: boolean;
36
+ text: string;
37
+ }
38
+ export declare function callTool(client: Client, name: string, args?: Record<string, unknown>): Promise<ToolCall>;
package/dist/api.js ADDED
@@ -0,0 +1,105 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
3
+ import { loadCredentials, saveCredentials } from './credentials.js';
4
+ export const DEFAULT_SERVER = 'https://mcp.dhahaby.com';
5
+ export const CLIENT_ID = 'aurelia-cli';
6
+ export const VERSION = '0.1.0';
7
+ export class CliError extends Error {
8
+ exitCode;
9
+ constructor(message, exitCode) {
10
+ super(message);
11
+ this.exitCode = exitCode;
12
+ }
13
+ }
14
+ export function serverUrl(flag) {
15
+ return (flag ??
16
+ process.env.AURELIA_SERVER ??
17
+ loadCredentials()?.server ??
18
+ DEFAULT_SERVER).replace(/\/$/, '');
19
+ }
20
+ /** RFC 9728 → RFC 8414 discovery, starting from the MCP server. */
21
+ export async function discover(server) {
22
+ const prm = await getJson(`${server}/.well-known/oauth-protected-resource/mcp`);
23
+ const issuer = prm.authorization_servers[0];
24
+ if (!issuer)
25
+ throw new CliError('The server does not advertise an authorization server.', 5);
26
+ const meta = await getJson(`${issuer}/.well-known/oauth-authorization-server`);
27
+ return {
28
+ resource: prm.resource,
29
+ issuer,
30
+ tokenEndpoint: meta.token_endpoint,
31
+ deviceEndpoint: meta.device_authorization_endpoint,
32
+ revocationEndpoint: meta.revocation_endpoint,
33
+ };
34
+ }
35
+ async function getJson(url) {
36
+ let res;
37
+ try {
38
+ res = await fetch(url, { signal: AbortSignal.timeout(15_000) });
39
+ }
40
+ catch (err) {
41
+ throw new CliError(`Cannot reach ${new URL(url).host}: ${err.message}`, 5);
42
+ }
43
+ if (!res.ok)
44
+ throw new CliError(`${new URL(url).host} returned HTTP ${res.status}`, 5);
45
+ return (await res.json());
46
+ }
47
+ export async function postForm(url, body) {
48
+ const res = await fetch(url, {
49
+ method: 'POST',
50
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
51
+ body: new URLSearchParams(body),
52
+ signal: AbortSignal.timeout(15_000),
53
+ });
54
+ return { status: res.status, body: (await res.json().catch(() => ({}))) };
55
+ }
56
+ /** A valid access token for the saved session, refreshing it when it is about to expire. */
57
+ export async function accessToken(force = false) {
58
+ const c = loadCredentials();
59
+ if (!c)
60
+ return null;
61
+ if (!force && c.expiresAt > Date.now() + 60_000)
62
+ return c;
63
+ const r = await postForm(c.tokenEndpoint, {
64
+ grant_type: 'refresh_token',
65
+ refresh_token: c.refreshToken,
66
+ client_id: c.clientId,
67
+ });
68
+ if (r.status !== 200 || !r.body.access_token || !r.body.refresh_token) {
69
+ throw new CliError('Your session has ended. Run `aurelia login` again.', 3);
70
+ }
71
+ const next = {
72
+ ...c,
73
+ accessToken: r.body.access_token,
74
+ refreshToken: r.body.refresh_token,
75
+ expiresAt: Date.now() + (r.body.expires_in ?? 900) * 1000,
76
+ };
77
+ saveCredentials(next);
78
+ return next;
79
+ }
80
+ /** An MCP client: authenticated when signed in (unless `publicOnly`), otherwise the public endpoint. */
81
+ export async function mcpClient(server, opts = {}) {
82
+ const creds = opts.publicOnly ? null : await accessToken();
83
+ const client = new Client({ name: 'aurelia-cli', version: VERSION });
84
+ const url = new URL(creds ? `${server}/mcp` : `${server}/public`);
85
+ const transport = new StreamableHTTPClientTransport(url, {
86
+ requestInit: creds ? { headers: { Authorization: `Bearer ${creds.accessToken}` } } : undefined,
87
+ });
88
+ try {
89
+ await client.connect(transport);
90
+ }
91
+ catch (err) {
92
+ const msg = err.message;
93
+ if (/401/.test(msg))
94
+ throw new CliError('Not signed in or session expired. Run `aurelia login`.', 3);
95
+ throw new CliError(`Cannot connect to ${url.host}: ${msg}`, 5);
96
+ }
97
+ return { client, signedIn: Boolean(creds) };
98
+ }
99
+ export async function callTool(client, name, args = {}) {
100
+ const r = await client.callTool({ name, arguments: args });
101
+ const text = r.content.map((c) => c.text ?? '').join('\n');
102
+ const structured = (r.structuredContent ?? {});
103
+ return { data: structured.untrusted ?? {}, isError: Boolean(r.isError), text };
104
+ }
105
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/bin.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ import { CliError, VERSION } from './api.js';
3
+ import { runBridge } from './bridge.js';
4
+ import * as cmd from './commands.js';
5
+ const HELP = `aurelia ${VERSION}: Aurelia by Dhahaby in your terminal
6
+
7
+ Usage: aurelia <command> [options]
8
+
9
+ login [--no-browser] Sign in with your Dhahaby account (opens a browser)
10
+ logout Sign out and revoke this device's access
11
+ whoami Your Dhahaby account summary
12
+ price Today's gold price per gram (indicative)
13
+ estimate --karat K --grams G
14
+ What you could borrow against gold (indicative)
15
+ products Gold-backed loan vs card
16
+ jewellers Partner jewellers for certified appraisal
17
+ pieces Your gold pieces and what you can do next
18
+ status Your applications, facilities and appraisals
19
+ tools List available tools
20
+ run <tool> [key=value…] Call any tool
21
+ mcp Run as a stdio MCP server (for MCP clients)
22
+
23
+ Options: --json machine-readable output · --server URL (default https://mcp.dhahaby.com, or AURELIA_SERVER)
24
+ Exit codes: 0 ok · 2 bad input · 3 not signed in · 4 not allowed · 5 server problem`;
25
+ const argv = process.argv.slice(2);
26
+ const flags = { json: argv.includes('--json'), server: valueOf('--server') };
27
+ function valueOf(name) {
28
+ const i = argv.indexOf(name);
29
+ return i >= 0 ? argv[i + 1] : undefined;
30
+ }
31
+ const positional = argv.filter((a, i) => !a.startsWith('--') && !['--server', '--karat', '--grams'].includes(argv[i - 1] ?? ''));
32
+ const [command, ...rest] = positional;
33
+ async function main() {
34
+ switch (command) {
35
+ case 'login':
36
+ return cmd.login(flags, { noBrowser: argv.includes('--no-browser') });
37
+ case 'logout':
38
+ return cmd.logout(flags);
39
+ case 'whoami':
40
+ return cmd.whoami(flags);
41
+ case 'price':
42
+ return cmd.price(flags);
43
+ case 'estimate':
44
+ return cmd.estimate(flags, Number(valueOf('--karat')), Number(valueOf('--grams')));
45
+ case 'products':
46
+ return cmd.simple(flags, 'products_compare', true);
47
+ case 'jewellers':
48
+ return cmd.simple(flags, 'jewellers_list', true);
49
+ case 'pieces':
50
+ return cmd.pieces(flags);
51
+ case 'status':
52
+ return cmd.status(flags);
53
+ case 'tools':
54
+ return cmd.tools(flags);
55
+ case 'run':
56
+ if (!rest[0])
57
+ throw new CliError('Usage: aurelia run <tool> [key=value…]', 2);
58
+ return cmd.run(flags, rest[0], rest.slice(1));
59
+ case 'mcp':
60
+ return runBridge(flags.server);
61
+ case undefined:
62
+ case 'help':
63
+ process.stdout.write(`${HELP}\n`);
64
+ return;
65
+ case 'version':
66
+ process.stdout.write(`${VERSION}\n`);
67
+ return;
68
+ default:
69
+ throw new CliError(`Unknown command "${command}". Run \`aurelia help\`.`, 2);
70
+ }
71
+ }
72
+ main().then(() => {
73
+ if (command !== 'mcp')
74
+ process.exit(0);
75
+ }, (err) => {
76
+ const e = err instanceof CliError ? err : new CliError(err.message ?? String(err), 5);
77
+ process.stderr.write(`aurelia: ${e.message}\n`);
78
+ process.exit(e.exitCode);
79
+ });
80
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * stdio MCP server that forwards to the remote Aurelia MCP: signed-in tools after `aurelia login`,
3
+ * otherwise the public tools. For MCP clients that only speak stdio.
4
+ */
5
+ export declare function runBridge(server?: string): Promise<void>;
package/dist/bridge.js ADDED
@@ -0,0 +1,19 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
+ import { mcpClient, serverUrl, VERSION } from './api.js';
5
+ /**
6
+ * stdio MCP server that forwards to the remote Aurelia MCP: signed-in tools after `aurelia login`,
7
+ * otherwise the public tools. For MCP clients that only speak stdio.
8
+ */
9
+ export async function runBridge(server = serverUrl()) {
10
+ const { client, signedIn } = await mcpClient(server);
11
+ const remoteInfo = client.getServerVersion();
12
+ const bridge = new Server({ name: 'aurelia', version: VERSION }, { capabilities: { tools: {} }, instructions: client.getInstructions() });
13
+ bridge.setRequestHandler(ListToolsRequestSchema, async () => client.listTools());
14
+ bridge.setRequestHandler(CallToolRequestSchema, async (req) => client.callTool({ name: req.params.name, arguments: req.params.arguments ?? {} }));
15
+ await bridge.connect(new StdioServerTransport());
16
+ // stderr only: stdout belongs to the MCP protocol.
17
+ console.error(`aurelia-mcp: bridging to ${server} (${signedIn ? 'signed in' : 'public tools'}; ${remoteInfo?.name ?? 'aurelia'})`);
18
+ }
19
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAEnG,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE;IAClD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EACrC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,eAAe,EAAE,EAAE,CACxE,CAAC;IACF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACjF,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAC5D,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,CAClF,CAAC;IACF,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACjD,mDAAmD;IACnD,OAAO,CAAC,KAAK,CACX,4BAA4B,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,KAAK,UAAU,EAAE,IAAI,IAAI,SAAS,GAAG,CACpH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface Flags {
2
+ json: boolean;
3
+ server?: string;
4
+ }
5
+ export declare function login(flags: Flags, opts?: {
6
+ noBrowser?: boolean;
7
+ }): Promise<void>;
8
+ export declare function logout(flags: Flags): Promise<void>;
9
+ export declare function whoami(flags: Flags): Promise<void>;
10
+ export declare function price(flags: Flags): Promise<void>;
11
+ export declare function estimate(flags: Flags, karat: number, grams: number): Promise<void>;
12
+ export declare function simple(flags: Flags, tool: string, publicOnly: boolean): Promise<void>;
13
+ export declare function pieces(flags: Flags): Promise<void>;
14
+ export declare function status(flags: Flags): Promise<void>;
15
+ export declare function tools(flags: Flags): Promise<void>;
16
+ export declare function run(flags: Flags, name: string, kv: string[]): Promise<void>;
@@ -0,0 +1,170 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { CLIENT_ID, CliError, callTool, discover, mcpClient, postForm, serverUrl } from './api.js';
3
+ import { clearCredentials, loadCredentials, saveCredentials } from './credentials.js';
4
+ const out = (flags, human, data) => {
5
+ if (flags.json)
6
+ process.stdout.write(`${JSON.stringify(data, null, 2)}\n`);
7
+ else
8
+ process.stdout.write(`${human}\n`);
9
+ };
10
+ const aed = (n) => typeof n === 'number'
11
+ ? `AED ${n.toLocaleString('en-AE', { maximumFractionDigits: 2 })}`
12
+ : String(n);
13
+ function openBrowser(url) {
14
+ const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
15
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
16
+ execFile(cmd, args, () => { });
17
+ }
18
+ export async function login(flags, opts = {}) {
19
+ const server = serverUrl(flags.server);
20
+ const d = await discover(server);
21
+ const start = await postForm(d.deviceEndpoint, {
22
+ client_id: CLIENT_ID,
23
+ scope: 'read offline_access',
24
+ resource: d.resource,
25
+ });
26
+ if (start.status !== 200)
27
+ throw new CliError(`Login could not start (${start.body.error ?? start.status}).`, 5);
28
+ const b = start.body;
29
+ process.stderr.write(`\nTo sign in, open:\n ${b.verification_uri_complete}\nand confirm the code ${b.user_code}\n\n`);
30
+ if (!opts.noBrowser)
31
+ openBrowser(b.verification_uri_complete);
32
+ let interval = b.interval * 1000;
33
+ const deadline = Date.now() + b.expires_in * 1000;
34
+ while (Date.now() < deadline) {
35
+ await new Promise((r) => setTimeout(r, interval));
36
+ const r = await postForm(d.tokenEndpoint, {
37
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
38
+ device_code: b.device_code,
39
+ client_id: CLIENT_ID,
40
+ });
41
+ if (r.status === 200 && r.body.access_token && r.body.refresh_token) {
42
+ saveCredentials({
43
+ server,
44
+ issuer: d.issuer,
45
+ tokenEndpoint: d.tokenEndpoint,
46
+ revocationEndpoint: d.revocationEndpoint,
47
+ clientId: CLIENT_ID,
48
+ accessToken: r.body.access_token,
49
+ refreshToken: r.body.refresh_token,
50
+ expiresAt: Date.now() + (r.body.expires_in ?? 900) * 1000,
51
+ });
52
+ out(flags, 'Signed in. Try `aurelia pieces` or `aurelia whoami`.', {
53
+ signedIn: true,
54
+ server,
55
+ });
56
+ return;
57
+ }
58
+ if (r.body.error === 'slow_down')
59
+ interval += 5000;
60
+ else if (r.body.error === 'access_denied')
61
+ throw new CliError('Sign-in was not allowed.', 4);
62
+ else if (r.body.error && r.body.error !== 'authorization_pending')
63
+ throw new CliError(`Sign-in failed (${r.body.error}).`, 5);
64
+ }
65
+ throw new CliError('The sign-in code expired. Run `aurelia login` again.', 3);
66
+ }
67
+ export async function logout(flags) {
68
+ const c = loadCredentials();
69
+ if (c?.revocationEndpoint)
70
+ await postForm(c.revocationEndpoint, { token: c.refreshToken, client_id: c.clientId }).catch(() => { });
71
+ clearCredentials();
72
+ out(flags, 'Signed out.', { signedIn: false });
73
+ }
74
+ async function signedIn(flags) {
75
+ const { client, signedIn } = await mcpClient(serverUrl(flags.server));
76
+ if (!signedIn)
77
+ throw new CliError('Not signed in. Run `aurelia login` first.', 3);
78
+ return client;
79
+ }
80
+ export async function whoami(flags) {
81
+ const client = await signedIn(flags);
82
+ const r = await callTool(client, 'account_context_get');
83
+ const u = (r.data.user ?? {});
84
+ out(flags, `${u.full_name ?? 'Dhahaby user'} · ${u.phone ?? u.email ?? ''} · home state ${r.data.homeState ?? '?'}`, r.data);
85
+ }
86
+ export async function price(flags) {
87
+ const { client } = await mcpClient(serverUrl(flags.server), { publicOnly: true });
88
+ const r = await callTool(client, 'gold_price_get');
89
+ const rows = r.data.perGram ?? [];
90
+ const human = [
91
+ `Gold price per gram (indicative, ${r.data.live ? 'live market' : 'last available'}, ${r.data.asOf}):`,
92
+ ...rows.map((p) => ` ${String(p.karat).padStart(2)}K ${aed(p.aed)}`),
93
+ ].join('\n');
94
+ out(flags, human, r.data);
95
+ }
96
+ export async function estimate(flags, karat, grams) {
97
+ if (!Number.isFinite(karat) || !Number.isFinite(grams) || karat <= 0 || grams <= 0) {
98
+ throw new CliError('Usage: aurelia estimate --karat 21 --grams 40', 2);
99
+ }
100
+ const { client } = await mcpClient(serverUrl(flags.server), { publicOnly: true });
101
+ const r = await callTool(client, 'borrowing_estimate', {
102
+ basis: 'self_reported',
103
+ karat,
104
+ weight_g: grams,
105
+ });
106
+ if (r.isError)
107
+ throw new CliError(r.text, 2);
108
+ const d = r.data;
109
+ out(flags, `${grams} g of ${karat}K ≈ ${aed(d.valueAed)} (indicative)\n Gold-backed loan: up to ${aed(d.loan.maxAed)}\n Gold-backed card: up to ${aed(d.card.maxAed)}\nFinal amounts are set by a licensed lender after a certified appraisal.`, r.data);
110
+ }
111
+ export async function simple(flags, tool, publicOnly) {
112
+ const { client } = publicOnly
113
+ ? await mcpClient(serverUrl(flags.server), { publicOnly: true })
114
+ : { client: await signedIn(flags) };
115
+ const r = await callTool(client, tool);
116
+ if (r.isError)
117
+ throw new CliError(r.text, 5);
118
+ out(flags, JSON.stringify(r.data, null, 2), r.data);
119
+ }
120
+ export async function pieces(flags) {
121
+ const client = await signedIn(flags);
122
+ const r = await callTool(client, 'pieces_list');
123
+ const list = r.data.pieces ?? [];
124
+ const human = list.length
125
+ ? list
126
+ .map((p) => `${p.ref} ${String(p.type ?? '').padEnd(14)} ${String(p.lifecycleStage ?? p.status).padEnd(16)} ${p.certifiedValueAed ? `certified AED ${p.certifiedValueAed}` : p.aiValueAed ? `≈ AED ${p.aiValueAed}` : ''} → ${p.nextActionLabel ?? p.nextAction ?? ''}`)
127
+ .join('\n')
128
+ : 'No gold pieces yet. Value one in the Aurelia app: https://aurelia.dhahaby.com/chat';
129
+ out(flags, human, r.data);
130
+ }
131
+ export async function status(flags) {
132
+ const client = await signedIn(flags);
133
+ const names = [
134
+ 'loan_application_get',
135
+ 'card_application_get',
136
+ 'loan_facilities_list',
137
+ 'card_facility_get',
138
+ 'appraisal_bookings_list',
139
+ ];
140
+ const results = Object.fromEntries(await Promise.all(names.map(async (n) => [n, (await callTool(client, n)).data])));
141
+ out(flags, JSON.stringify(results, null, 2), results);
142
+ }
143
+ export async function tools(flags) {
144
+ const { client, signedIn: s } = await mcpClient(serverUrl(flags.server));
145
+ const list = (await client.listTools()).tools;
146
+ out(flags, [
147
+ `${list.length} tools (${s ? 'signed in' : 'public'}):`,
148
+ ...list.map((t) => ` ${t.name.padEnd(24)} ${t.description?.split('.')[0] ?? ''}`),
149
+ ].join('\n'), list);
150
+ }
151
+ export async function run(flags, name, kv) {
152
+ const args = {};
153
+ for (const pair of kv) {
154
+ const i = pair.indexOf('=');
155
+ if (i < 1)
156
+ throw new CliError(`Arguments are key=value, got "${pair}"`, 2);
157
+ const v = pair.slice(i + 1);
158
+ args[pair.slice(0, i)] = /^-?\d+(\.\d+)?$/.test(v) ? Number(v) : v;
159
+ }
160
+ const { client } = await mcpClient(serverUrl(flags.server));
161
+ const r = await callTool(client, name, args);
162
+ if (r.isError)
163
+ throw new CliError(r.text, /^invalid_input/.test(r.text)
164
+ ? 2
165
+ : /Unknown or unavailable|auth_required/.test(r.text)
166
+ ? 4
167
+ : 5);
168
+ out(flags, JSON.stringify(r.data, null, 2), r.data);
169
+ }
170
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface Credentials {
2
+ server: string;
3
+ issuer: string;
4
+ tokenEndpoint: string;
5
+ revocationEndpoint?: string;
6
+ clientId: string;
7
+ accessToken: string;
8
+ refreshToken: string;
9
+ expiresAt: number;
10
+ }
11
+ export declare function credentialsPath(): string;
12
+ export declare function loadCredentials(): Credentials | null;
13
+ export declare function saveCredentials(c: Credentials): void;
14
+ export declare function clearCredentials(): void;
@@ -0,0 +1,28 @@
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ export function credentialsPath() {
5
+ const base = process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config');
6
+ return join(base, 'aurelia', 'credentials.json');
7
+ }
8
+ export function loadCredentials() {
9
+ const p = credentialsPath();
10
+ if (!existsSync(p))
11
+ return null;
12
+ try {
13
+ return JSON.parse(readFileSync(p, 'utf8'));
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ export function saveCredentials(c) {
20
+ const p = credentialsPath();
21
+ mkdirSync(dirname(p), { recursive: true, mode: 0o700 });
22
+ writeFileSync(p, `${JSON.stringify(c, null, 2)}\n`, { mode: 0o600 });
23
+ chmodSync(p, 0o600);
24
+ }
25
+ export function clearCredentials() {
26
+ rmSync(credentialsPath(), { force: true });
27
+ }
28
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChG,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAa1C,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAgB,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAc;IAC5C,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5B,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,aAAa,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,eAAe,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { CliError, DEFAULT_SERVER, discover, VERSION } from './api.js';
2
+ export { runBridge } from './bridge.js';
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { CliError, DEFAULT_SERVER, discover, VERSION } from './api.js';
2
+ export { runBridge } from './bridge.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,54 @@
1
1
  {
2
2
  "name": "@dhahaby-com/aurelia-cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "Aurelia by Dhahaby: gold prices, borrowing estimates and your Dhahaby gold account from the terminal, plus an MCP bridge.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "aurelia": "dist/bin.js"
9
+ },
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md"
21
+ ],
22
+ "engines": {
23
+ "node": ">=20"
24
+ },
25
+ "keywords": [
26
+ "dhahaby",
27
+ "aurelia",
28
+ "gold",
29
+ "mcp",
30
+ "cli",
31
+ "uae"
32
+ ],
33
+ "homepage": "https://docs.dhahaby.com",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/DHAHABY-COM/aurelia-skills"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "dependencies": {
42
+ "@modelcontextprotocol/sdk": "^1.32.1"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^22.0.0",
46
+ "typescript": "~6.0.3",
47
+ "vitest": "^5.0.5"
48
+ },
49
+ "scripts": {
50
+ "build": "tsc -p tsconfig.json && chmod +x dist/bin.js",
51
+ "typecheck": "tsc -p tsconfig.json --noEmit",
52
+ "test": "vitest run"
53
+ }
6
54
  }