@invinite-org/invinite-data-cli 0.13.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +35 -3
  2. package/claude-plugin/agents/invinite-data.md +1 -1
  3. package/claude-plugin/skills/invinite-data-cli/SKILL.md +131 -27
  4. package/dist/src/cli.js +3 -1
  5. package/dist/src/cli.js.map +1 -1
  6. package/dist/src/client/api-client.d.ts +8 -0
  7. package/dist/src/client/api-client.js +16 -1
  8. package/dist/src/client/api-client.js.map +1 -1
  9. package/dist/src/client/download.d.ts +33 -0
  10. package/dist/src/client/download.js +101 -1
  11. package/dist/src/client/download.js.map +1 -1
  12. package/dist/src/commands/sec.d.ts +47 -0
  13. package/dist/src/commands/sec.js +191 -0
  14. package/dist/src/commands/sec.js.map +1 -0
  15. package/dist/src/formatters/table-formatter.d.ts +1 -0
  16. package/dist/src/formatters/table-formatter.js +12 -2
  17. package/dist/src/formatters/table-formatter.js.map +1 -1
  18. package/dist/src/generated/cli-manifest.json +1685 -217
  19. package/dist/src/hand-written-commands.d.ts +9 -0
  20. package/dist/src/hand-written-commands.js +3 -0
  21. package/dist/src/hand-written-commands.js.map +1 -1
  22. package/dist/src/shared/errors.d.ts +24 -1
  23. package/dist/src/shared/errors.js +41 -3
  24. package/dist/src/shared/errors.js.map +1 -1
  25. package/dist/src/shared/json-mode.d.ts +2 -0
  26. package/dist/src/shared/json-mode.js +12 -0
  27. package/dist/src/shared/json-mode.js.map +1 -0
  28. package/dist/src/shared/readiness.d.ts +4 -0
  29. package/dist/src/shared/readiness.js +35 -0
  30. package/dist/src/shared/readiness.js.map +1 -0
  31. package/dist/src/shared/spinner.js +2 -0
  32. package/dist/src/shared/spinner.js.map +1 -1
  33. package/dist/src/spec-commands.js +5 -1
  34. package/dist/src/spec-commands.js.map +1 -1
  35. package/package.json +1 -1
@@ -0,0 +1,47 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * The hand-written `sec` downloads (`src/hand-written-commands.ts`); every other `sec` action is generated from the
4
+ * spec and attaches to the same group. Two kinds of bytes, never mixed up:
5
+ * - originals and figures are PERMANENT PUBLIC objects: fetched from their stated `url` without the API key;
6
+ * - a metric export is private: streamed from the key-authorized `GET /v1/sec/exports/{export_id}/file`.
7
+ * Each download verifies what the API stated (size, SHA-256, media type) before the file appears; nothing ever
8
+ * fetches the SEC's own site. A saved citation is the immutable version / block, never a URL carrying a key.
9
+ */
10
+ /** Exit code when a command finished but left documents unsaved (stated per document, never skipped silently). */
11
+ export declare const INCOMPLETE_EXIT_CODE = 3;
12
+ interface ManifestDocument {
13
+ filename: string;
14
+ role?: string | null;
15
+ doc_type?: string | null;
16
+ mime_type?: string | null;
17
+ availability?: string | null;
18
+ quarantine_reason?: string | null;
19
+ too_large?: boolean | null;
20
+ sha256?: string | null;
21
+ size_bytes?: number | null;
22
+ canonical?: {
23
+ status?: string | null;
24
+ version_id?: string | null;
25
+ text_ready?: boolean;
26
+ visual_ready?: boolean;
27
+ } | null;
28
+ source?: {
29
+ url?: string | null;
30
+ } | null;
31
+ }
32
+ export interface SavedDocument {
33
+ filename: string;
34
+ role: string | null;
35
+ mime_type: string | null;
36
+ size_bytes: number | null;
37
+ sha256: string | null;
38
+ version_id: string | null;
39
+ status: 'saved' | 'already_complete' | 'not_saved';
40
+ path: string | null;
41
+ url: string | null;
42
+ reason: string | null;
43
+ }
44
+ /** Why a manifest document has no public original to fetch (the API's own words, no guess). */
45
+ export declare function notSavedReason(document: ManifestDocument): string;
46
+ export declare function registerSecCommands(program: Command): void;
47
+ export {};
@@ -0,0 +1,191 @@
1
+ import { stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import { apiDownload, apiGet } from '../client/api-client.js';
5
+ import { dispositionFileName, ensureDir, safeFileName, saveVerified } from '../client/download.js';
6
+ import { formatKeyValue, formatTable } from '../formatters/table-formatter.js';
7
+ import { apiErrorHint, withErrorHandling } from '../shared/errors.js';
8
+ import { output } from '../shared/output.js';
9
+ import { printReadinessNotes } from '../shared/readiness.js';
10
+ import { setJsonMode } from '../shared/spinner.js';
11
+ /**
12
+ * The hand-written `sec` downloads (`src/hand-written-commands.ts`); every other `sec` action is generated from the
13
+ * spec and attaches to the same group. Two kinds of bytes, never mixed up:
14
+ * - originals and figures are PERMANENT PUBLIC objects: fetched from their stated `url` without the API key;
15
+ * - a metric export is private: streamed from the key-authorized `GET /v1/sec/exports/{export_id}/file`.
16
+ * Each download verifies what the API stated (size, SHA-256, media type) before the file appears; nothing ever
17
+ * fetches the SEC's own site. A saved citation is the immutable version / block, never a URL carrying a key.
18
+ */
19
+ /** Exit code when a command finished but left documents unsaved (stated per document, never skipped silently). */
20
+ export const INCOMPLETE_EXIT_CODE = 3;
21
+ const EXPORT_CONTENT_TYPES = ['application/gzip', 'application/x-gzip'];
22
+ const httpsUrl = (value) => {
23
+ if (typeof value !== 'string')
24
+ return null;
25
+ try {
26
+ return new URL(value).protocol === 'https:' ? value : null;
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ };
32
+ /** Why a manifest document has no public original to fetch (the API's own words, no guess). */
33
+ export function notSavedReason(document) {
34
+ if (document.availability && document.availability !== 'stored') {
35
+ return `availability ${document.availability}${document.quarantine_reason ? ` (${document.quarantine_reason})` : ''}`;
36
+ }
37
+ if (document.too_large)
38
+ return 'too_large';
39
+ return 'no permanent public copy yet';
40
+ }
41
+ /** `-o`: an existing directory or a path ending in `/` is a directory; anything else a file. */
42
+ async function isDirectoryTarget(target) {
43
+ if (/[\\/]$/.test(target))
44
+ return true;
45
+ try {
46
+ return (await stat(target)).isDirectory();
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ const publicFetch = (url) => (signal) => fetch(url, { signal });
53
+ const savedLine = (file) => file.skipped
54
+ ? `Already complete: ${file.path} (sha256 ${file.sha256})`
55
+ : `Saved ${file.path} (${file.bytes.toLocaleString('en-US')} bytes, sha256 ${file.sha256})`;
56
+ async function saveOriginal(document, dir, opts) {
57
+ const url = httpsUrl(document.source?.url);
58
+ const base = {
59
+ filename: document.filename,
60
+ role: document.role ?? null,
61
+ mime_type: document.mime_type ?? null,
62
+ size_bytes: document.size_bytes ?? null,
63
+ sha256: document.sha256 ?? null,
64
+ version_id: document.canonical?.version_id ?? null,
65
+ status: 'not_saved',
66
+ path: null,
67
+ url,
68
+ reason: null,
69
+ };
70
+ if (!url)
71
+ return { ...base, reason: notSavedReason(document) };
72
+ const file = await saveVerified(publicFetch(url), join(dir, safeFileName(document.filename, 'document')), {
73
+ force: opts.force,
74
+ expected: {
75
+ ...(document.sha256 ? { sha256: document.sha256 } : {}),
76
+ ...(typeof document.size_bytes === 'number' ? { bytes: document.size_bytes } : {}),
77
+ },
78
+ spinnerText: `Downloading ${document.filename}...`,
79
+ });
80
+ return { ...base, status: file.skipped ? 'already_complete' : 'saved', path: file.path };
81
+ }
82
+ export function registerSecCommands(program) {
83
+ const sec = program.commands.find(command => command.name() === 'sec') ?? program.command('sec');
84
+ sec.command('save')
85
+ .description("Save a filing's original documents from their permanent public copies (lists every one it cannot save, with why)")
86
+ .requiredOption('--accession <accession>', 'Accession number (dashed)')
87
+ .option('--filename <filename>', 'Only this document of the filing (default: every document)')
88
+ .option('-o, --output <dir>', 'Directory to save into', '.')
89
+ .option('--force', 'Overwrite existing files')
90
+ .action(withErrorHandling(async (cmdOpts) => {
91
+ const opts = program.opts();
92
+ if (opts.json)
93
+ setJsonMode(true);
94
+ const manifest = await apiGet({ path: `/v1/sec/filings/${encodeURIComponent(cmdOpts.accession)}` });
95
+ const documents = (manifest.documents ?? [])
96
+ .filter(document => !cmdOpts.filename || document.filename === cmdOpts.filename);
97
+ if (cmdOpts.filename && documents.length === 0 && manifest.readiness?.status === 'ready') {
98
+ throw new Error(`${cmdOpts.filename} is not a document of ${cmdOpts.accession} (see: invd sec filing --accession ${cmdOpts.accession})`);
99
+ }
100
+ const dir = await ensureDir(cmdOpts.output);
101
+ const results = [];
102
+ for (const document of documents)
103
+ results.push(await saveOriginal(document, dir, cmdOpts));
104
+ const complete = manifest.readiness?.status === 'ready' && results.every(result => result.status !== 'not_saved');
105
+ const report = { accession: cmdOpts.accession, readiness: manifest.readiness ?? null, complete, documents: results };
106
+ output(report, opts, () => {
107
+ formatTable(results.map(result => ({
108
+ filename: result.filename,
109
+ role: result.role ?? '',
110
+ size_bytes: result.size_bytes ?? '',
111
+ status: result.status,
112
+ detail: result.path ?? result.reason ?? '',
113
+ })), ['filename', 'role', 'size_bytes', 'status', 'detail']);
114
+ printReadinessNotes(manifest);
115
+ const missing = results.filter(result => result.status === 'not_saved').length;
116
+ if (missing > 0) {
117
+ console.error(chalk.yellow(`${missing} of ${results.length} documents not saved (reason per row); canonical text: invd sec document --accession ${cmdOpts.accession} --filename <filename>`));
118
+ }
119
+ });
120
+ if (!complete)
121
+ process.exitCode = INCOMPLETE_EXIT_CODE;
122
+ }, apiErrorHint));
123
+ sec.command('save-figure')
124
+ .description("Save a cited figure's image from its permanent public URL")
125
+ .requiredOption('--version-id <version_id>', 'Document version id (immutable)')
126
+ .requiredOption('--block-id <block_id>', 'Figure block id')
127
+ .option('-o, --output <path>', 'File or directory to save into', '.')
128
+ .option('--force', 'Overwrite an existing file')
129
+ .action(withErrorHandling(async (cmdOpts) => {
130
+ const opts = program.opts();
131
+ if (opts.json)
132
+ setJsonMode(true);
133
+ const answer = await apiGet({
134
+ path: `/v1/sec/versions/${encodeURIComponent(cmdOpts.versionId)}/figures/${encodeURIComponent(cmdOpts.blockId)}`,
135
+ });
136
+ const url = httpsUrl(answer.image?.url);
137
+ if (!url) {
138
+ printReadinessNotes(answer);
139
+ const reason = answer.readiness?.reason ?? 'no public image';
140
+ throw new Error(`No public image for block ${cmdOpts.blockId} of version ${cmdOpts.versionId} (${reason})`);
141
+ }
142
+ const name = safeFileName(new URL(url).pathname.split('/').pop(), `${cmdOpts.blockId}.img`);
143
+ const target = await isDirectoryTarget(cmdOpts.output) ? join(await ensureDir(cmdOpts.output), name) : cmdOpts.output;
144
+ const file = await saveVerified(publicFetch(url), target, { force: cmdOpts.force, spinnerText: 'Downloading figure...' });
145
+ const citation = { version_id: cmdOpts.versionId, block_id: cmdOpts.blockId };
146
+ output({ citation, path: file.path, bytes: file.bytes, sha256: file.sha256, url }, opts, () => {
147
+ console.log(chalk.green(savedLine(file)));
148
+ formatKeyValue({ citation: `${citation.version_id}#${citation.block_id}` });
149
+ });
150
+ }, apiErrorHint));
151
+ sec.command('export-file')
152
+ .description('Download a metric export (.csv.gz, key-authorized), verified against its SHA-256')
153
+ .requiredOption('--export-id <export_id>', 'Export id (from invd sec metric-export / sec export)')
154
+ .option('-o, --output <path>', 'File or directory to save into (default: the server-named file in .)', '.')
155
+ .option('--sha256 <hex>', "The export's sha256 (from invd sec export): verified, and an identical existing file counts as complete without a request")
156
+ .option('--force', 'Overwrite an existing file')
157
+ .action(withErrorHandling(async (cmdOpts) => {
158
+ const opts = program.opts();
159
+ if (opts.json)
160
+ setJsonMode(true);
161
+ if (cmdOpts.sha256 && !/^[0-9a-f]{64}$/i.test(cmdOpts.sha256))
162
+ throw new Error('--sha256 expects 64 hex characters');
163
+ const request = { path: `/v1/sec/exports/${encodeURIComponent(cmdOpts.exportId)}/file`, accept: 'application/gzip' };
164
+ const expected = { ...(cmdOpts.sha256 ? { sha256: cmdOpts.sha256 } : {}), contentTypes: EXPORT_CONTENT_TYPES };
165
+ let file;
166
+ if (await isDirectoryTarget(cmdOpts.output)) {
167
+ // The name comes from the answer's Content-Disposition, so the request opens first.
168
+ const response = await apiDownload(request);
169
+ const name = safeFileName(dispositionFileName(response.headers.get('Content-Disposition')), `${cmdOpts.exportId}.csv.gz`);
170
+ const headerSha = response.headers.get('X-Content-SHA256') ?? undefined;
171
+ file = await saveVerified(async () => response, join(await ensureDir(cmdOpts.output), name), {
172
+ force: cmdOpts.force,
173
+ expected: { ...expected, ...(expected.sha256 ?? headerSha ? { sha256: expected.sha256 ?? headerSha } : {}) },
174
+ spinnerText: 'Downloading export...',
175
+ });
176
+ if (file.skipped)
177
+ await response.body?.cancel();
178
+ }
179
+ else {
180
+ file = await saveVerified(signal => apiDownload({ ...request, signal }), cmdOpts.output, {
181
+ force: cmdOpts.force,
182
+ expected,
183
+ spinnerText: 'Downloading export...',
184
+ });
185
+ }
186
+ output({ export_id: cmdOpts.exportId, path: file.path, bytes: file.bytes, sha256: file.sha256, skipped: file.skipped }, opts, () => {
187
+ console.log(chalk.green(savedLine(file)));
188
+ });
189
+ }, apiErrorHint));
190
+ }
191
+ //# sourceMappingURL=sec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sec.js","sourceRoot":"","sources":["../../../src/commands/sec.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export declare function formatTable(rows: Record<string, unknown>[], columns?: string[]): void;
2
2
  export declare function formatKeyValue(data: Record<string, unknown>): void;
3
+ /** One dim line under a table that has a next page: a cursor-paged route names its `--cursor`, else offset/limit. */
3
4
  export declare function printPaginationHint(nextUrl?: string): void;
@@ -55,9 +55,19 @@ export function formatKeyValue(data) {
55
55
  console.log(` ${label} ${formatValue(value)}`);
56
56
  }
57
57
  }
58
+ /** One dim line under a table that has a next page: a cursor-paged route names its `--cursor`, else offset/limit. */
58
59
  export function printPaginationHint(nextUrl) {
59
- if (nextUrl) {
60
- console.log(chalk.dim('\nMore results available. Use --all to fetch all pages, or --offset/--limit to paginate.'));
60
+ if (!nextUrl)
61
+ return;
62
+ let cursor = null;
63
+ try {
64
+ cursor = new URL(nextUrl).searchParams.get('cursor');
65
+ }
66
+ catch {
67
+ // not a URL: the offset hint
61
68
  }
69
+ console.log(chalk.dim(cursor
70
+ ? `\nMore results available. Use --all to fetch all pages, or --cursor ${cursor} (same filters) for the next one.`
71
+ : '\nMore results available. Use --all to fetch all pages, or --offset/--limit to paginate.'));
62
72
  }
63
73
  //# sourceMappingURL=table-formatter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table-formatter.js","sourceRoot":"","sources":["../../../src/formatters/table-formatter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table-formatter.js","sourceRoot":"","sources":["../../../src/formatters/table-formatter.ts"],"names":[],"mappings":"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"}