@inf-monkeys-tech/monkeys-cli 0.11.0 → 0.11.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.
- package/README.md +38 -21
- package/README.zh.md +27 -19
- package/bin/install-wizard.js +12 -2
- package/bin/run.js +4 -4
- package/dist/command/metadata.d.ts +11 -0
- package/dist/command/metadata.d.ts.map +1 -0
- package/dist/command/metadata.js +150 -0
- package/dist/command/metadata.js.map +1 -0
- package/dist/command-support/asset-feature-backfill.d.ts +20 -4
- package/dist/command-support/asset-feature-backfill.d.ts.map +1 -1
- package/dist/commands/agent/work/watch.d.ts +3 -2
- package/dist/commands/agent/work/watch.d.ts.map +1 -1
- package/dist/commands/agent/work/watch.js +10 -5
- package/dist/commands/agent/work/watch.js.map +1 -1
- package/dist/commands/context/show.d.ts +11 -0
- package/dist/commands/context/show.d.ts.map +1 -0
- package/dist/commands/context/show.js +32 -0
- package/dist/commands/context/show.js.map +1 -0
- package/dist/commands/data/asset/list.d.ts.map +1 -1
- package/dist/commands/data/asset/list.js +9 -5
- package/dist/commands/data/asset/list.js.map +1 -1
- package/dist/commands/data/asset/search.d.ts.map +1 -1
- package/dist/commands/data/asset/search.js +9 -5
- package/dist/commands/data/asset/search.js.map +1 -1
- package/dist/commands/data/view/rows.d.ts.map +1 -1
- package/dist/commands/data/view/rows.js +9 -5
- package/dist/commands/data/view/rows.js.map +1 -1
- package/dist/commands/execution/watch.d.ts +3 -2
- package/dist/commands/execution/watch.d.ts.map +1 -1
- package/dist/commands/execution/watch.js +10 -5
- package/dist/commands/execution/watch.js.map +1 -1
- package/dist/commands/identity/get.d.ts +13 -0
- package/dist/commands/identity/get.d.ts.map +1 -0
- package/dist/commands/identity/get.js +18 -0
- package/dist/commands/identity/get.js.map +1 -0
- package/dist/commands/identity/list.d.ts +17 -0
- package/dist/commands/identity/list.d.ts.map +1 -0
- package/dist/commands/identity/list.js +33 -0
- package/dist/commands/identity/list.js.map +1 -0
- package/dist/commands/schema.d.ts +17 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +56 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/skills/list.d.ts +9 -0
- package/dist/commands/skills/list.d.ts.map +1 -0
- package/dist/commands/skills/list.js +11 -0
- package/dist/commands/skills/list.js.map +1 -0
- package/dist/commands/skills/read.d.ts +14 -0
- package/dist/commands/skills/read.d.ts.map +1 -0
- package/dist/commands/skills/read.js +20 -0
- package/dist/commands/skills/read.js.map +1 -0
- package/dist/commands/skills/status.d.ts +9 -0
- package/dist/commands/skills/status.d.ts.map +1 -0
- package/dist/commands/skills/status.js +12 -0
- package/dist/commands/skills/status.js.map +1 -0
- package/dist/commands/skills/sync.d.ts +10 -0
- package/dist/commands/skills/sync.d.ts.map +1 -0
- package/dist/commands/skills/sync.js +36 -0
- package/dist/commands/skills/sync.js.map +1 -0
- package/dist/commands/team/get.d.ts +13 -0
- package/dist/commands/team/get.d.ts.map +1 -0
- package/dist/commands/team/get.js +18 -0
- package/dist/commands/team/get.js.map +1 -0
- package/dist/commands/team/list.d.ts +16 -0
- package/dist/commands/team/list.d.ts.map +1 -0
- package/dist/commands/team/list.js +31 -0
- package/dist/commands/team/list.js.map +1 -0
- package/dist/commands/update.d.ts +2 -4
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +37 -76
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/version/check.d.ts.map +1 -1
- package/dist/commands/version/check.js +8 -4
- package/dist/commands/version/check.js.map +1 -1
- package/dist/commands/version/show.d.ts +2 -2
- package/dist/commands/version/show.d.ts.map +1 -1
- package/dist/commands/version/show.js +7 -12
- package/dist/commands/version/show.js.map +1 -1
- package/dist/config/local-command.d.ts +9 -1
- package/dist/config/local-command.d.ts.map +1 -1
- package/dist/config/local-command.js +44 -5
- package/dist/config/local-command.js.map +1 -1
- package/dist/contracts/version.d.ts +1 -1
- package/dist/contracts/version.d.ts.map +1 -1
- package/dist/contracts/version.js +9 -1
- package/dist/contracts/version.js.map +1 -1
- package/dist/data/asset-jsonl-import.d.ts +50 -10
- package/dist/data/asset-jsonl-import.d.ts.map +1 -1
- package/dist/data/asset-jsonl-import.js +13 -2
- package/dist/data/asset-jsonl-import.js.map +1 -1
- package/dist/data/client.d.ts +21 -3
- package/dist/data/client.d.ts.map +1 -1
- package/dist/data/client.js +132 -21
- package/dist/data/client.js.map +1 -1
- package/dist/data/command.d.ts +36 -6
- package/dist/data/command.d.ts.map +1 -1
- package/dist/data/command.js +81 -15
- package/dist/data/command.js.map +1 -1
- package/dist/data/contracts.d.ts +1 -0
- package/dist/data/contracts.d.ts.map +1 -1
- package/dist/data/contracts.js +6 -0
- package/dist/data/contracts.js.map +1 -1
- package/dist/data/cursor.d.ts +5 -1
- package/dist/data/cursor.d.ts.map +1 -1
- package/dist/data/cursor.js +12 -6
- package/dist/data/cursor.js.map +1 -1
- package/dist/data/kernel-bindings.d.ts.map +1 -1
- package/dist/data/kernel-bindings.js +1 -0
- package/dist/data/kernel-bindings.js.map +1 -1
- package/dist/data/ontology-command.d.ts +80 -16
- package/dist/data/ontology-command.d.ts.map +1 -1
- package/dist/data/perspective.d.ts +10 -5
- package/dist/data/perspective.d.ts.map +1 -1
- package/dist/data/perspective.js +50 -57
- package/dist/data/perspective.js.map +1 -1
- package/dist/data/resource-locator.d.ts.map +1 -1
- package/dist/data/resource-locator.js +9 -7
- package/dist/data/resource-locator.js.map +1 -1
- package/dist/data/view-rows.d.ts +1 -1
- package/dist/data/view-rows.d.ts.map +1 -1
- package/dist/data/view-rows.js +26 -3
- package/dist/data/view-rows.js.map +1 -1
- package/dist/data-transfer/asset-export.d.ts +10 -2
- package/dist/data-transfer/asset-export.d.ts.map +1 -1
- package/dist/data-transfer/asset-import.d.ts +10 -2
- package/dist/data-transfer/asset-import.d.ts.map +1 -1
- package/dist/data-transfer/ontology-export.d.ts +10 -2
- package/dist/data-transfer/ontology-export.d.ts.map +1 -1
- package/dist/data-transfer/ontology-import.d.ts +10 -2
- package/dist/data-transfer/ontology-import.d.ts.map +1 -1
- package/dist/discovery/client.d.ts +31 -0
- package/dist/discovery/client.d.ts.map +1 -0
- package/dist/discovery/client.js +117 -0
- package/dist/discovery/client.js.map +1 -0
- package/dist/discovery/pagination.d.ts +20 -0
- package/dist/discovery/pagination.d.ts.map +1 -0
- package/dist/discovery/pagination.js +32 -0
- package/dist/discovery/pagination.js.map +1 -0
- package/dist/output/render.d.ts +7 -1
- package/dist/output/render.d.ts.map +1 -1
- package/dist/output/render.js +73 -0
- package/dist/output/render.js.map +1 -1
- package/dist/schema/command-schema.d.ts +26 -0
- package/dist/schema/command-schema.d.ts.map +1 -0
- package/dist/schema/command-schema.js +27 -0
- package/dist/schema/command-schema.js.map +1 -0
- package/dist/skills/content.d.ts +13 -0
- package/dist/skills/content.d.ts.map +1 -0
- package/dist/skills/content.js +103 -0
- package/dist/skills/content.js.map +1 -0
- package/dist/skills/state.d.ts +43 -0
- package/dist/skills/state.d.ts.map +1 -0
- package/dist/skills/state.js +56 -0
- package/dist/skills/state.js.map +1 -0
- package/dist/skills/sync.d.ts +28 -0
- package/dist/skills/sync.d.ts.map +1 -0
- package/dist/skills/sync.js +17 -0
- package/dist/skills/sync.js.map +1 -0
- package/dist/transport/http-client.d.ts.map +1 -1
- package/dist/transport/http-client.js +1 -0
- package/dist/transport/http-client.js.map +1 -1
- package/dist/transport/types.d.ts +1 -0
- package/dist/transport/types.d.ts.map +1 -1
- package/dist/update/updater.d.ts +1 -0
- package/dist/update/updater.d.ts.map +1 -1
- package/dist/update/updater.js +21 -5
- package/dist/update/updater.js.map +1 -1
- package/oclif.manifest.json +6013 -370
- package/package.json +57 -3
- package/skills/monkeys-agent-work/SKILL.md +21 -0
- package/skills/monkeys-agent-work/agents/openai.yaml +4 -0
- package/skills/monkeys-auth/SKILL.md +21 -0
- package/skills/monkeys-auth/agents/openai.yaml +4 -0
- package/skills/monkeys-data/SKILL.md +31 -0
- package/skills/monkeys-data/agents/openai.yaml +4 -0
- package/skills/monkeys-data/references/data-perspective.md +50 -0
- package/skills/monkeys-data/references/data-read.md +46 -0
- package/skills/{monkeys → monkeys-data}/references/ontology-feature-search.md +5 -5
- package/skills/{monkeys → monkeys-data}/references/ontology-model.md +2 -1
- package/skills/monkeys-openapi/SKILL.md +19 -0
- package/skills/monkeys-openapi/agents/openai.yaml +4 -0
- package/skills/monkeys-shared/SKILL.md +31 -0
- package/skills/monkeys-shared/agents/openai.yaml +4 -0
- package/skills/{monkeys → monkeys-shared}/references/compatibility.md +2 -2
- package/skills/{monkeys → monkeys-shared}/references/safety-errors.md +1 -1
- package/skills/monkeys-system-config/SKILL.md +20 -0
- package/skills/monkeys-system-config/agents/openai.yaml +4 -0
- package/skills/monkeys-workflow/SKILL.md +21 -0
- package/skills/monkeys-workflow/agents/openai.yaml +4 -0
- package/skills/monkeys/SKILL.md +0 -60
- package/skills/monkeys/agents/openai.yaml +0 -4
- package/skills/monkeys/references/data-perspective.md +0 -45
- package/skills/monkeys/references/data-read.md +0 -34
- /package/skills/{monkeys → monkeys-agent-work}/references/agent-work.md +0 -0
- /package/skills/{monkeys → monkeys-auth}/references/authentication.md +0 -0
- /package/skills/{monkeys → monkeys-data}/references/data-governance.md +0 -0
- /package/skills/{monkeys → monkeys-data}/references/data-transfer.md +0 -0
- /package/skills/{monkeys → monkeys-data}/references/data-write.md +0 -0
- /package/skills/{monkeys → monkeys-openapi}/references/fallback.md +0 -0
- /package/skills/{monkeys → monkeys-shared}/references/platform-overview.md +0 -0
- /package/skills/{monkeys → monkeys-system-config}/references/system-config.md +0 -0
- /package/skills/{monkeys → monkeys-workflow}/references/workflow-execution-files.md +0 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { resolveAuthSurface } from '../credential/runtime.js';
|
|
2
|
+
import { CliError, EXIT_CODES } from '../errors/cli-error.js';
|
|
3
|
+
import { unwrapServerData } from '../semantic/runtime.js';
|
|
4
|
+
import { collectPages } from './pagination.js';
|
|
5
|
+
function objectValue(value) {
|
|
6
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
7
|
+
}
|
|
8
|
+
function itemArray(value) {
|
|
9
|
+
if (Array.isArray(value))
|
|
10
|
+
return value.filter((item) => Boolean(item) && typeof item === 'object' && !Array.isArray(item));
|
|
11
|
+
const object = objectValue(value);
|
|
12
|
+
for (const key of ['items', 'list', 'data']) {
|
|
13
|
+
if (Array.isArray(object[key]))
|
|
14
|
+
return itemArray(object[key]);
|
|
15
|
+
}
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
function numeric(value, fallback) {
|
|
19
|
+
const parsed = Number(value);
|
|
20
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;
|
|
21
|
+
}
|
|
22
|
+
function listPage(value, fallbackPage, fallbackPageSize) {
|
|
23
|
+
const unwrapped = unwrapServerData(value);
|
|
24
|
+
const envelope = objectValue(value);
|
|
25
|
+
const object = Object.keys(objectValue(unwrapped)).length > 0 && !Array.isArray(unwrapped) ? objectValue(unwrapped) : envelope;
|
|
26
|
+
const items = itemArray(unwrapped);
|
|
27
|
+
return {
|
|
28
|
+
items,
|
|
29
|
+
page: numeric(envelope.page ?? object.page, fallbackPage),
|
|
30
|
+
pageSize: numeric(envelope.pageSize ?? envelope.limit ?? object.pageSize ?? object.limit, fallbackPageSize),
|
|
31
|
+
total: numeric(envelope.total ?? envelope.totalCount ?? object.total ?? object.totalCount, items.length),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function requireItem(value, kind, id) {
|
|
35
|
+
const item = unwrapServerData(value);
|
|
36
|
+
if (!item || typeof item !== 'object' || Array.isArray(item)) {
|
|
37
|
+
throw new CliError(`${kind} was not found.`, {
|
|
38
|
+
code: `${kind.toUpperCase()}_NOT_FOUND`,
|
|
39
|
+
exitCode: EXIT_CODES.api,
|
|
40
|
+
safeDetails: { id },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return item;
|
|
44
|
+
}
|
|
45
|
+
export async function listTeams(runtime, options) {
|
|
46
|
+
const surface = resolveAuthSurface(runtime.context);
|
|
47
|
+
if (surface === 'studio') {
|
|
48
|
+
const response = await runtime.client.request({ method: 'GET', path: '/api/teams' });
|
|
49
|
+
const allItems = itemArray(unwrapServerData(response.data));
|
|
50
|
+
const keyword = options.keyword?.trim().toLowerCase();
|
|
51
|
+
const items = keyword ? allItems.filter((item) => JSON.stringify(item).toLowerCase().includes(keyword)) : allItems;
|
|
52
|
+
return { items, page: 1, pageSize: items.length, surface, total: items.length };
|
|
53
|
+
}
|
|
54
|
+
const page = await collectPages(options, async (pageNumber) => {
|
|
55
|
+
const response = await runtime.client.request({
|
|
56
|
+
method: 'GET',
|
|
57
|
+
path: '/api/kernel/teams',
|
|
58
|
+
query: {
|
|
59
|
+
includeBuiltin: options.includeBuiltin,
|
|
60
|
+
...(options.keyword ? { keyword: options.keyword } : {}),
|
|
61
|
+
page: pageNumber,
|
|
62
|
+
pageSize: options.pageSize,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
return listPage(response.data, pageNumber, options.pageSize);
|
|
66
|
+
});
|
|
67
|
+
return { ...page, surface };
|
|
68
|
+
}
|
|
69
|
+
export async function getTeam(runtime, id) {
|
|
70
|
+
const surface = resolveAuthSurface(runtime.context);
|
|
71
|
+
if (surface === 'kernel') {
|
|
72
|
+
const response = await runtime.client.request({ method: 'GET', path: `/api/kernel/teams/${encodeURIComponent(id)}` });
|
|
73
|
+
return { item: requireItem(response.data, 'team', id), surface };
|
|
74
|
+
}
|
|
75
|
+
const teams = await listTeams(runtime, { includeBuiltin: true, page: 1, pageAll: false, pageLimit: 1, pageSize: 100 });
|
|
76
|
+
const item = teams.items.find((candidate) => String(candidate.id ?? '') === id);
|
|
77
|
+
if (!item)
|
|
78
|
+
return { item: requireItem(undefined, 'team', id), surface };
|
|
79
|
+
return { item, surface };
|
|
80
|
+
}
|
|
81
|
+
export async function listIdentities(runtime, options) {
|
|
82
|
+
const surface = resolveAuthSurface(runtime.context);
|
|
83
|
+
if (surface === 'studio') {
|
|
84
|
+
const response = await runtime.client.request({
|
|
85
|
+
method: 'GET',
|
|
86
|
+
path: '/api/users/share-targets',
|
|
87
|
+
query: { ...(options.keyword ? { keyword: options.keyword } : {}), limit: options.pageSize },
|
|
88
|
+
});
|
|
89
|
+
const items = itemArray(unwrapServerData(response.data));
|
|
90
|
+
return { items, page: 1, pageSize: options.pageSize, surface, total: items.length };
|
|
91
|
+
}
|
|
92
|
+
const page = await collectPages(options, async (pageNumber) => {
|
|
93
|
+
const response = await runtime.client.request({
|
|
94
|
+
method: 'GET',
|
|
95
|
+
path: '/api/kernel/users',
|
|
96
|
+
query: {
|
|
97
|
+
...(options.keyword ? { keyword: options.keyword } : {}),
|
|
98
|
+
page: pageNumber,
|
|
99
|
+
pageSize: options.pageSize,
|
|
100
|
+
...(options.scope ? { scope: options.scope } : {}),
|
|
101
|
+
...(options.userType ? { userType: options.userType } : {}),
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
return listPage(response.data, pageNumber, options.pageSize);
|
|
105
|
+
});
|
|
106
|
+
return { ...page, surface };
|
|
107
|
+
}
|
|
108
|
+
export async function getIdentity(runtime, id) {
|
|
109
|
+
const surface = resolveAuthSurface(runtime.context);
|
|
110
|
+
const response = surface === 'kernel'
|
|
111
|
+
? await runtime.client.request({ method: 'GET', path: `/api/kernel/users/${encodeURIComponent(id)}` })
|
|
112
|
+
: await runtime.client.request({ body: { userIds: [id] }, method: 'POST', path: '/api/users/brief' });
|
|
113
|
+
const value = unwrapServerData(response.data);
|
|
114
|
+
const items = itemArray(value);
|
|
115
|
+
return { item: requireItem(surface === 'studio' ? items[0] : value, 'identity', id), surface };
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/discovery/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const paginationFlags: {
|
|
2
|
+
page: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
3
|
+
'page-all': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
4
|
+
'page-limit': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
5
|
+
'page-size': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
6
|
+
};
|
|
7
|
+
export interface PaginationInput {
|
|
8
|
+
page: number;
|
|
9
|
+
pageAll: boolean;
|
|
10
|
+
pageLimit: number;
|
|
11
|
+
pageSize: number;
|
|
12
|
+
}
|
|
13
|
+
export interface Page<T> {
|
|
14
|
+
items: T[];
|
|
15
|
+
page: number;
|
|
16
|
+
pageSize: number;
|
|
17
|
+
total: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function collectPages<T>(input: PaginationInput, fetchPage: (page: number) => Promise<Page<T>>): Promise<Page<T>>;
|
|
20
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/discovery/pagination.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe;IAC1B,IAAI;IACJ,UAAU;IACV,YAAY;IACZ,WAAW;CACZ,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAqB7H"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { CliError, EXIT_CODES } from '../errors/cli-error.js';
|
|
3
|
+
export const paginationFlags = {
|
|
4
|
+
page: Flags.integer({ default: 1, min: 1, summary: 'Page number, starting at 1' }),
|
|
5
|
+
'page-all': Flags.boolean({ default: false, summary: 'Fetch all result pages' }),
|
|
6
|
+
'page-limit': Flags.integer({ default: 20, max: 100, min: 1, summary: 'Maximum pages fetched with --page-all' }),
|
|
7
|
+
'page-size': Flags.integer({ default: 20, max: 100, min: 1, summary: 'Results per page' }),
|
|
8
|
+
};
|
|
9
|
+
export async function collectPages(input, fetchPage) {
|
|
10
|
+
const first = await fetchPage(input.page);
|
|
11
|
+
if (!input.pageAll || first.items.length === 0)
|
|
12
|
+
return first;
|
|
13
|
+
const items = [...first.items];
|
|
14
|
+
let current = first.page;
|
|
15
|
+
while (items.length < first.total && current - first.page + 1 < input.pageLimit) {
|
|
16
|
+
current += 1;
|
|
17
|
+
const next = await fetchPage(current);
|
|
18
|
+
items.push(...next.items);
|
|
19
|
+
if (next.items.length === 0)
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
if (items.length < first.total) {
|
|
23
|
+
throw new CliError('Pagination stopped before all results were fetched.', {
|
|
24
|
+
code: 'PAGE_LIMIT_REACHED',
|
|
25
|
+
exitCode: EXIT_CODES.partial,
|
|
26
|
+
recovery: ['Increase --page-limit or fetch the remaining pages explicitly.'],
|
|
27
|
+
safeDetails: { fetched: items.length, pageLimit: input.pageLimit, total: first.total },
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return { items, page: first.page, pageSize: input.pageSize, total: first.total };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/discovery/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;IAClF,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;IAChF,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC;IAChH,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC3F,CAAC;AAgBF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,KAAsB,EAAE,SAA6C;IACzG,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7D,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;IACzB,OAAO,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;IACrC,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,QAAQ,CAAC,qDAAqD,EAAE;YACxE,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,UAAU,CAAC,OAAO;YAC5B,QAAQ,EAAE,CAAC,gEAAgE,CAAC;YAC5E,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;SACvF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AACnF,CAAC"}
|
package/dist/output/render.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import type { CommandResult } from '../contracts/result.js';
|
|
2
|
-
export
|
|
2
|
+
export declare const OUTPUT_FORMATS: readonly ['json', 'pretty', 'table', 'ndjson', 'csv', 'text'];
|
|
3
|
+
export type OutputFormat = (typeof OUTPUT_FORMATS)[number];
|
|
4
|
+
export interface RenderOptions {
|
|
5
|
+
format: OutputFormat;
|
|
6
|
+
jq?: string;
|
|
7
|
+
}
|
|
3
8
|
export declare function renderResult<T>(result: CommandResult<T>, format: OutputFormat): string;
|
|
9
|
+
export declare function renderCommandResult<T>(result: CommandResult<T>, options: RenderOptions): Promise<string>;
|
|
4
10
|
//# sourceMappingURL=render.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/output/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/output/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG5D,eAAO,MAAM,cAAc,YAAI,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC;AAC5F,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAsDD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CActF;AAED,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB9G"}
|
package/dist/output/render.js
CHANGED
|
@@ -1,9 +1,56 @@
|
|
|
1
|
+
import { CliError, EXIT_CODES } from '../errors/cli-error.js';
|
|
2
|
+
export const OUTPUT_FORMATS = ['json', 'pretty', 'table', 'ndjson', 'csv', 'text'];
|
|
1
3
|
function renderTextValue(value) {
|
|
2
4
|
return typeof value === 'string' ? value : JSON.stringify(value, null, 2);
|
|
3
5
|
}
|
|
6
|
+
function dataRows(value) {
|
|
7
|
+
if (Array.isArray(value)) {
|
|
8
|
+
return value.map((item) => item && typeof item === 'object' && !Array.isArray(item) ? item : { value: item });
|
|
9
|
+
}
|
|
10
|
+
if (value && typeof value === 'object')
|
|
11
|
+
return [value];
|
|
12
|
+
return [{ value }];
|
|
13
|
+
}
|
|
14
|
+
function cellText(value) {
|
|
15
|
+
if (value === undefined || value === null)
|
|
16
|
+
return '';
|
|
17
|
+
return typeof value === 'object' ? JSON.stringify(value) : String(value);
|
|
18
|
+
}
|
|
19
|
+
function columnsFor(rows) {
|
|
20
|
+
return [...new Set(rows.flatMap((row) => Object.keys(row)))];
|
|
21
|
+
}
|
|
22
|
+
function renderTable(value) {
|
|
23
|
+
const rows = dataRows(value);
|
|
24
|
+
const columns = columnsFor(rows);
|
|
25
|
+
if (columns.length === 0)
|
|
26
|
+
return '';
|
|
27
|
+
const widths = columns.map((column) => Math.max(column.length, ...rows.map((row) => cellText(row[column]).length)));
|
|
28
|
+
const line = (cells) => cells
|
|
29
|
+
.map((cell, index) => cell.padEnd(widths[index] ?? 0))
|
|
30
|
+
.join(' ')
|
|
31
|
+
.trimEnd();
|
|
32
|
+
return [
|
|
33
|
+
line(columns),
|
|
34
|
+
line(widths.map((width) => '-'.repeat(width))),
|
|
35
|
+
...rows.map((row) => line(columns.map((column) => cellText(row[column])))),
|
|
36
|
+
].join('\n');
|
|
37
|
+
}
|
|
38
|
+
function csvCell(value) {
|
|
39
|
+
const text = cellText(value);
|
|
40
|
+
return /[",\r\n]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text;
|
|
41
|
+
}
|
|
42
|
+
function renderCsv(value) {
|
|
43
|
+
const rows = dataRows(value);
|
|
44
|
+
const columns = columnsFor(rows);
|
|
45
|
+
if (columns.length === 0)
|
|
46
|
+
return '';
|
|
47
|
+
return [columns.map(csvCell).join(','), ...rows.map((row) => columns.map((column) => csvCell(row[column])).join(','))].join('\n');
|
|
48
|
+
}
|
|
4
49
|
export function renderResult(result, format) {
|
|
5
50
|
if (format === 'json')
|
|
6
51
|
return JSON.stringify(result);
|
|
52
|
+
if (format === 'pretty')
|
|
53
|
+
return JSON.stringify(result, null, 2);
|
|
7
54
|
if (format === 'ndjson') {
|
|
8
55
|
const items = result.ok && Array.isArray(result.data) ? result.data : [result];
|
|
9
56
|
const lines = items.map((item) => JSON.stringify(item));
|
|
@@ -11,8 +58,34 @@ export function renderResult(result, format) {
|
|
|
11
58
|
lines.push(JSON.stringify({ _notice: result._notice }));
|
|
12
59
|
return lines.join('\n');
|
|
13
60
|
}
|
|
61
|
+
if (format === 'table')
|
|
62
|
+
return result.ok ? renderTable(result.data) : `${result.error.code}: ${result.error.message}`;
|
|
63
|
+
if (format === 'csv')
|
|
64
|
+
return result.ok ? renderCsv(result.data) : `${result.error.code},${csvCell(result.error.message)}`;
|
|
14
65
|
const body = result.ok ? renderTextValue(result.data) : `${result.error.code}: ${result.error.message}`;
|
|
15
66
|
const update = result._notice?.update;
|
|
16
67
|
return update ? `${body}\n\nUpdate available: ${update.current} → ${update.latest}. Run \`${update.command}\` to install.` : body;
|
|
17
68
|
}
|
|
69
|
+
export async function renderCommandResult(result, options) {
|
|
70
|
+
if (!options.jq)
|
|
71
|
+
return renderResult(result, options.format);
|
|
72
|
+
if (options.format !== 'json') {
|
|
73
|
+
throw new CliError('--jq can only be used with JSON output.', {
|
|
74
|
+
code: 'OUTPUT_OPTION_CONFLICT',
|
|
75
|
+
exitCode: EXIT_CODES.validation,
|
|
76
|
+
recovery: ['Remove --jq or use --format json.'],
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const { raw } = await import('jq-wasm');
|
|
80
|
+
const filtered = await raw(result, options.jq, ['-r']);
|
|
81
|
+
if (filtered.exitCode !== 0) {
|
|
82
|
+
throw new CliError('The jq expression could not be evaluated.', {
|
|
83
|
+
code: 'JQ_EXPRESSION_INVALID',
|
|
84
|
+
exitCode: EXIT_CODES.validation,
|
|
85
|
+
recovery: ['Check the jq expression and try again.'],
|
|
86
|
+
safeDetails: { stderr: filtered.stderr.trim() },
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return filtered.stdout.trimEnd();
|
|
90
|
+
}
|
|
18
91
|
//# sourceMappingURL=render.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/output/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/output/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getCommandMetadata } from '../command/metadata.js';
|
|
2
|
+
export interface LoadableCommand {
|
|
3
|
+
args?: Record<string, unknown>;
|
|
4
|
+
description?: string;
|
|
5
|
+
flags?: Record<string, unknown>;
|
|
6
|
+
id: string;
|
|
7
|
+
summary?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CommandSchema {
|
|
10
|
+
arguments: Record<string, unknown>;
|
|
11
|
+
command: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
execution: ReturnType<typeof getCommandMetadata>;
|
|
14
|
+
flags: Record<string, unknown>;
|
|
15
|
+
jqRootPath: '.';
|
|
16
|
+
result: {
|
|
17
|
+
dataPath: '.data';
|
|
18
|
+
envelopeSchemaVersion: '1';
|
|
19
|
+
errorPath: '.error';
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export declare function commandIdToPath(id: string): string;
|
|
23
|
+
export declare function normalizeSchemaPath(parts: string[]): string;
|
|
24
|
+
export declare function describeCommand(command: LoadableCommand): CommandSchema;
|
|
25
|
+
export declare function catalogEntry(command: LoadableCommand): Pick<CommandSchema, 'command' | 'description' | 'execution'>;
|
|
26
|
+
//# sourceMappingURL=command-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-schema.d.ts","sourceRoot":"","sources":["../../src/schema/command-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,UAAU,EAAE,GAAG,CAAC;IAChB,MAAM,EAAE;QACN,QAAQ,EAAE,OAAO,CAAC;QAClB,qBAAqB,EAAE,GAAG,CAAC;QAC3B,SAAS,EAAE,QAAQ,CAAC;KACrB,CAAC;CACH;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAK3D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAWvE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC,CAGnH"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { getCommandMetadata } from '../command/metadata.js';
|
|
2
|
+
export function commandIdToPath(id) {
|
|
3
|
+
return id.replaceAll(':', ' ');
|
|
4
|
+
}
|
|
5
|
+
export function normalizeSchemaPath(parts) {
|
|
6
|
+
return parts
|
|
7
|
+
.flatMap((part) => part.split(/[.:\s]+/))
|
|
8
|
+
.filter(Boolean)
|
|
9
|
+
.join(':');
|
|
10
|
+
}
|
|
11
|
+
export function describeCommand(command) {
|
|
12
|
+
const path = commandIdToPath(command.id);
|
|
13
|
+
return {
|
|
14
|
+
arguments: command.args ?? {},
|
|
15
|
+
command: path,
|
|
16
|
+
...((command.description ?? command.summary) ? { description: command.description ?? command.summary } : {}),
|
|
17
|
+
execution: getCommandMetadata(path),
|
|
18
|
+
flags: command.flags ?? {},
|
|
19
|
+
jqRootPath: '.',
|
|
20
|
+
result: { dataPath: '.data', envelopeSchemaVersion: '1', errorPath: '.error' },
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function catalogEntry(command) {
|
|
24
|
+
const schema = describeCommand(command);
|
|
25
|
+
return { command: schema.command, ...(schema.description ? { description: schema.description } : {}), execution: schema.execution };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=command-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-schema.js","sourceRoot":"","sources":["../../src/schema/command-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAwB5D,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAe;IACjD,OAAO,KAAK;SACT,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;SACxC,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAwB;IACtD,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QAC7B,OAAO,EAAE,IAAI;QACb,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5G,SAAS,EAAE,kBAAkB,CAAC,IAAI,CAAC;QACnC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;QAC1B,UAAU,EAAE,GAAG;QACf,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;KAC/E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAwB;IACnD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AACtI,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface BundledSkill {
|
|
2
|
+
checksum: string;
|
|
3
|
+
description: string;
|
|
4
|
+
name: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function bundledSkillsRoot(): string;
|
|
7
|
+
export declare function listBundledSkills(root?: string): Promise<BundledSkill[]>;
|
|
8
|
+
export declare function readBundledSkill(name: string, resource?: string, root?: string): Promise<{
|
|
9
|
+
content: string;
|
|
10
|
+
name: string;
|
|
11
|
+
resource: string;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/skills/content.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AA2CD,wBAAsB,iBAAiB,CAAC,IAAI,SAAsB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAQ3F;AAUD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAa,EACrB,IAAI,SAAsB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA+B9D"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readdir, readFile, realpath, stat } from 'node:fs/promises';
|
|
3
|
+
import { dirname, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { parse } from 'yaml';
|
|
6
|
+
import { BUNDLED_SKILL_NAMES } from '../contracts/version.js';
|
|
7
|
+
import { CliError, EXIT_CODES } from '../errors/cli-error.js';
|
|
8
|
+
export function bundledSkillsRoot() {
|
|
9
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), '../../skills');
|
|
10
|
+
}
|
|
11
|
+
async function skillFiles(directory, prefix = '') {
|
|
12
|
+
const entries = await readdir(resolve(directory, prefix), { withFileTypes: true });
|
|
13
|
+
const paths = [];
|
|
14
|
+
for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
|
|
15
|
+
const path = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
16
|
+
if (entry.isDirectory())
|
|
17
|
+
paths.push(...(await skillFiles(directory, path)));
|
|
18
|
+
else if (entry.isFile())
|
|
19
|
+
paths.push(path);
|
|
20
|
+
}
|
|
21
|
+
return paths;
|
|
22
|
+
}
|
|
23
|
+
async function checksumDirectory(directory) {
|
|
24
|
+
const hash = createHash('sha256');
|
|
25
|
+
for (const file of await skillFiles(directory)) {
|
|
26
|
+
hash
|
|
27
|
+
.update(file)
|
|
28
|
+
.update('\0')
|
|
29
|
+
.update(await readFile(resolve(directory, file)))
|
|
30
|
+
.update('\0');
|
|
31
|
+
}
|
|
32
|
+
return hash.digest('hex');
|
|
33
|
+
}
|
|
34
|
+
function skillFrontmatter(content, expectedName) {
|
|
35
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(content);
|
|
36
|
+
if (!match)
|
|
37
|
+
throw new CliError('Bundled Skill frontmatter is missing.', { code: 'SKILL_INVALID', exitCode: EXIT_CODES.compatibility });
|
|
38
|
+
const value = parse(match[1]);
|
|
39
|
+
if (!value || typeof value !== 'object') {
|
|
40
|
+
throw new CliError('Bundled Skill frontmatter is invalid.', { code: 'SKILL_INVALID', exitCode: EXIT_CODES.compatibility });
|
|
41
|
+
}
|
|
42
|
+
const frontmatter = value;
|
|
43
|
+
if (frontmatter.name !== expectedName || typeof frontmatter.description !== 'string' || !frontmatter.description.trim()) {
|
|
44
|
+
throw new CliError('Bundled Skill name or description is invalid.', {
|
|
45
|
+
code: 'SKILL_INVALID',
|
|
46
|
+
exitCode: EXIT_CODES.compatibility,
|
|
47
|
+
safeDetails: { expectedName },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return { description: frontmatter.description.trim(), name: frontmatter.name };
|
|
51
|
+
}
|
|
52
|
+
export async function listBundledSkills(root = bundledSkillsRoot()) {
|
|
53
|
+
const skills = [];
|
|
54
|
+
for (const name of BUNDLED_SKILL_NAMES) {
|
|
55
|
+
const directory = resolve(root, name);
|
|
56
|
+
const frontmatter = skillFrontmatter(await readFile(resolve(directory, 'SKILL.md'), 'utf8'), name);
|
|
57
|
+
skills.push({ ...frontmatter, checksum: await checksumDirectory(directory) });
|
|
58
|
+
}
|
|
59
|
+
return skills;
|
|
60
|
+
}
|
|
61
|
+
function validateResourcePath(value) {
|
|
62
|
+
const normalized = value.trim().replaceAll('\\', '/');
|
|
63
|
+
if (!normalized || normalized.startsWith('/') || normalized.split('/').some((part) => part === '..' || part === '.')) {
|
|
64
|
+
throw new CliError('Skill resource path is invalid.', { code: 'SKILL_PATH_INVALID', exitCode: EXIT_CODES.validation });
|
|
65
|
+
}
|
|
66
|
+
return normalized;
|
|
67
|
+
}
|
|
68
|
+
export async function readBundledSkill(name, resource = 'SKILL.md', root = bundledSkillsRoot()) {
|
|
69
|
+
if (!BUNDLED_SKILL_NAMES.includes(name)) {
|
|
70
|
+
throw new CliError('Bundled Skill was not found.', {
|
|
71
|
+
code: 'SKILL_NOT_FOUND',
|
|
72
|
+
exitCode: EXIT_CODES.validation,
|
|
73
|
+
recovery: ['Run `monkeys skills list` to see bundled Skills.'],
|
|
74
|
+
safeDetails: { name },
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const normalized = validateResourcePath(resource);
|
|
78
|
+
const skillRoot = await realpath(resolve(root, name));
|
|
79
|
+
const candidate = resolve(skillRoot, normalized);
|
|
80
|
+
const candidateRelative = relative(skillRoot, candidate);
|
|
81
|
+
if (candidateRelative.startsWith(`..${sep}`) || candidateRelative === '..') {
|
|
82
|
+
throw new CliError('Skill resource path escapes the bundled Skill.', { code: 'SKILL_PATH_INVALID', exitCode: EXIT_CODES.validation });
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const info = await stat(candidate);
|
|
86
|
+
if (!info.isFile())
|
|
87
|
+
throw new Error('not a file');
|
|
88
|
+
const canonical = await realpath(candidate);
|
|
89
|
+
const canonicalRelative = relative(skillRoot, canonical);
|
|
90
|
+
if (canonicalRelative.startsWith(`..${sep}`) || canonicalRelative === '..')
|
|
91
|
+
throw new Error('link escapes Skill');
|
|
92
|
+
return { content: await readFile(canonical, 'utf8'), name, resource: normalized };
|
|
93
|
+
}
|
|
94
|
+
catch (cause) {
|
|
95
|
+
throw new CliError('Bundled Skill resource was not found or is not readable.', {
|
|
96
|
+
cause,
|
|
97
|
+
code: 'SKILL_RESOURCE_NOT_FOUND',
|
|
98
|
+
exitCode: EXIT_CODES.validation,
|
|
99
|
+
safeDetails: { name, resource: normalized },
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/skills/content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { BundledSkill } from './content.js';
|
|
3
|
+
declare const skillsStateSchema: z.ZodObject<{
|
|
4
|
+
cliVersion: z.ZodString;
|
|
5
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
6
|
+
skills: z.ZodArray<z.ZodObject<{
|
|
7
|
+
checksum: z.ZodString;
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
source: z.ZodEnum<{
|
|
11
|
+
install: "install";
|
|
12
|
+
sync: "sync";
|
|
13
|
+
update: "update";
|
|
14
|
+
}>;
|
|
15
|
+
syncedAt: z.ZodString;
|
|
16
|
+
}, z.core.$strict>;
|
|
17
|
+
export type SkillsState = z.infer<typeof skillsStateSchema>;
|
|
18
|
+
export declare function defaultSkillsStatePath(): string;
|
|
19
|
+
export declare function readSkillsState(path?: string): Promise<SkillsState | undefined>;
|
|
20
|
+
export declare function writeSkillsState(cliVersion: string, skills: BundledSkill[], source: SkillsState['source'], path?: string): Promise<SkillsState>;
|
|
21
|
+
export declare function skillsStatus(cliVersion: string, bundled: BundledSkill[], path?: string): Promise<{
|
|
22
|
+
bundled: {
|
|
23
|
+
checksum: string;
|
|
24
|
+
name: string;
|
|
25
|
+
}[];
|
|
26
|
+
cliVersion: string;
|
|
27
|
+
inSync: boolean;
|
|
28
|
+
stateRecorded: boolean;
|
|
29
|
+
state?: {
|
|
30
|
+
cliVersion: string;
|
|
31
|
+
schemaVersion: 1;
|
|
32
|
+
skills: {
|
|
33
|
+
checksum: string;
|
|
34
|
+
name: string;
|
|
35
|
+
}[];
|
|
36
|
+
source: "install" | "sync" | "update";
|
|
37
|
+
syncedAt: string;
|
|
38
|
+
};
|
|
39
|
+
skillsMatch: boolean;
|
|
40
|
+
versionMatch: boolean;
|
|
41
|
+
}>;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/skills/state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;kBAQZ,CAAC;AAEZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAsB,eAAe,CAAC,IAAI,SAA2B,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAOvG;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,EAAE,EACtB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,EAC7B,IAAI,SAA2B,GAC9B,OAAO,CAAC,WAAW,CAAC,CAatB;AAED,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,SAA2B;;;;;;;;;;;;;;;;;;;;GAc9G"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { configDirectory, resolveConfigPath } from '../config/paths.js';
|
|
5
|
+
const skillsStateSchema = z
|
|
6
|
+
.object({
|
|
7
|
+
cliVersion: z.string().min(1),
|
|
8
|
+
schemaVersion: z.literal(1),
|
|
9
|
+
skills: z.array(z.object({ checksum: z.string().regex(/^[a-f0-9]{64}$/), name: z.string().min(1) })),
|
|
10
|
+
source: z.enum(['install', 'sync', 'update']),
|
|
11
|
+
syncedAt: z.string().datetime(),
|
|
12
|
+
})
|
|
13
|
+
.strict();
|
|
14
|
+
export function defaultSkillsStatePath() {
|
|
15
|
+
return join(configDirectory(resolveConfigPath()), 'skills-state.json');
|
|
16
|
+
}
|
|
17
|
+
export async function readSkillsState(path = defaultSkillsStatePath()) {
|
|
18
|
+
try {
|
|
19
|
+
return skillsStateSchema.parse(JSON.parse(await readFile(path, 'utf8')));
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
|
|
23
|
+
return undefined;
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function writeSkillsState(cliVersion, skills, source, path = defaultSkillsStatePath()) {
|
|
28
|
+
const state = skillsStateSchema.parse({
|
|
29
|
+
cliVersion,
|
|
30
|
+
schemaVersion: 1,
|
|
31
|
+
skills: skills.map(({ checksum, name }) => ({ checksum, name })),
|
|
32
|
+
source,
|
|
33
|
+
syncedAt: new Date().toISOString(),
|
|
34
|
+
});
|
|
35
|
+
await mkdir(dirname(path), { mode: 0o700, recursive: true });
|
|
36
|
+
const temporary = `${path}.tmp-${process.pid}-${Date.now()}`;
|
|
37
|
+
await writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
|
|
38
|
+
await rename(temporary, path);
|
|
39
|
+
return state;
|
|
40
|
+
}
|
|
41
|
+
export async function skillsStatus(cliVersion, bundled, path = defaultSkillsStatePath()) {
|
|
42
|
+
const state = await readSkillsState(path);
|
|
43
|
+
const expected = bundled.map(({ checksum, name }) => ({ checksum, name }));
|
|
44
|
+
const versionMatch = state?.cliVersion === cliVersion;
|
|
45
|
+
const skillsMatch = state ? JSON.stringify(state.skills) === JSON.stringify(expected) : false;
|
|
46
|
+
return {
|
|
47
|
+
bundled: expected,
|
|
48
|
+
cliVersion,
|
|
49
|
+
inSync: Boolean(state && versionMatch && skillsMatch),
|
|
50
|
+
stateRecorded: Boolean(state),
|
|
51
|
+
...(state ? { state } : {}),
|
|
52
|
+
skillsMatch,
|
|
53
|
+
versionMatch,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/skills/state.ts"],"names":[],"mappings":"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"}
|