@ai-dossier/cli 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +419 -0
  2. package/bin/ai-dossier +3 -0
  3. package/bin/dossier-verify +435 -0
  4. package/dist/cli.d.ts +6 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +77 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/cache.d.ts +3 -0
  9. package/dist/commands/cache.d.ts.map +1 -0
  10. package/dist/commands/cache.js +239 -0
  11. package/dist/commands/cache.js.map +1 -0
  12. package/dist/commands/checksum.d.ts +3 -0
  13. package/dist/commands/checksum.d.ts.map +1 -0
  14. package/dist/commands/checksum.js +116 -0
  15. package/dist/commands/checksum.js.map +1 -0
  16. package/dist/commands/config-cmd.d.ts +3 -0
  17. package/dist/commands/config-cmd.d.ts.map +1 -0
  18. package/dist/commands/config-cmd.js +117 -0
  19. package/dist/commands/config-cmd.js.map +1 -0
  20. package/dist/commands/create.d.ts +3 -0
  21. package/dist/commands/create.d.ts.map +1 -0
  22. package/dist/commands/create.js +130 -0
  23. package/dist/commands/create.js.map +1 -0
  24. package/dist/commands/export.d.ts +3 -0
  25. package/dist/commands/export.d.ts.map +1 -0
  26. package/dist/commands/export.js +55 -0
  27. package/dist/commands/export.js.map +1 -0
  28. package/dist/commands/format.d.ts +3 -0
  29. package/dist/commands/format.d.ts.map +1 -0
  30. package/dist/commands/format.js +66 -0
  31. package/dist/commands/format.js.map +1 -0
  32. package/dist/commands/from-file.d.ts +3 -0
  33. package/dist/commands/from-file.d.ts.map +1 -0
  34. package/dist/commands/from-file.js +136 -0
  35. package/dist/commands/from-file.js.map +1 -0
  36. package/dist/commands/get.d.ts +3 -0
  37. package/dist/commands/get.d.ts.map +1 -0
  38. package/dist/commands/get.js +65 -0
  39. package/dist/commands/get.js.map +1 -0
  40. package/dist/commands/info.d.ts +3 -0
  41. package/dist/commands/info.d.ts.map +1 -0
  42. package/dist/commands/info.js +159 -0
  43. package/dist/commands/info.js.map +1 -0
  44. package/dist/commands/init.d.ts +3 -0
  45. package/dist/commands/init.d.ts.map +1 -0
  46. package/dist/commands/init.js +98 -0
  47. package/dist/commands/init.js.map +1 -0
  48. package/dist/commands/install-skill.d.ts +3 -0
  49. package/dist/commands/install-skill.d.ts.map +1 -0
  50. package/dist/commands/install-skill.js +131 -0
  51. package/dist/commands/install-skill.js.map +1 -0
  52. package/dist/commands/keys.d.ts +3 -0
  53. package/dist/commands/keys.d.ts.map +1 -0
  54. package/dist/commands/keys.js +170 -0
  55. package/dist/commands/keys.js.map +1 -0
  56. package/dist/commands/lint.d.ts +3 -0
  57. package/dist/commands/lint.d.ts.map +1 -0
  58. package/dist/commands/lint.js +105 -0
  59. package/dist/commands/lint.js.map +1 -0
  60. package/dist/commands/list.d.ts +3 -0
  61. package/dist/commands/list.d.ts.map +1 -0
  62. package/dist/commands/list.js +173 -0
  63. package/dist/commands/list.js.map +1 -0
  64. package/dist/commands/login.d.ts +3 -0
  65. package/dist/commands/login.d.ts.map +1 -0
  66. package/dist/commands/login.js +33 -0
  67. package/dist/commands/login.js.map +1 -0
  68. package/dist/commands/logout.d.ts +3 -0
  69. package/dist/commands/logout.d.ts.map +1 -0
  70. package/dist/commands/logout.js +19 -0
  71. package/dist/commands/logout.js.map +1 -0
  72. package/dist/commands/prompt-hook.d.ts +3 -0
  73. package/dist/commands/prompt-hook.d.ts.map +1 -0
  74. package/dist/commands/prompt-hook.js +101 -0
  75. package/dist/commands/prompt-hook.js.map +1 -0
  76. package/dist/commands/publish.d.ts +3 -0
  77. package/dist/commands/publish.d.ts.map +1 -0
  78. package/dist/commands/publish.js +142 -0
  79. package/dist/commands/publish.js.map +1 -0
  80. package/dist/commands/pull.d.ts +3 -0
  81. package/dist/commands/pull.d.ts.map +1 -0
  82. package/dist/commands/pull.js +69 -0
  83. package/dist/commands/pull.js.map +1 -0
  84. package/dist/commands/remove.d.ts +3 -0
  85. package/dist/commands/remove.d.ts.map +1 -0
  86. package/dist/commands/remove.js +65 -0
  87. package/dist/commands/remove.js.map +1 -0
  88. package/dist/commands/reset-hooks.d.ts +3 -0
  89. package/dist/commands/reset-hooks.d.ts.map +1 -0
  90. package/dist/commands/reset-hooks.js +52 -0
  91. package/dist/commands/reset-hooks.js.map +1 -0
  92. package/dist/commands/run.d.ts +3 -0
  93. package/dist/commands/run.d.ts.map +1 -0
  94. package/dist/commands/run.js +281 -0
  95. package/dist/commands/run.js.map +1 -0
  96. package/dist/commands/search.d.ts +3 -0
  97. package/dist/commands/search.d.ts.map +1 -0
  98. package/dist/commands/search.js +137 -0
  99. package/dist/commands/search.js.map +1 -0
  100. package/dist/commands/sign.d.ts +3 -0
  101. package/dist/commands/sign.d.ts.map +1 -0
  102. package/dist/commands/sign.js +143 -0
  103. package/dist/commands/sign.js.map +1 -0
  104. package/dist/commands/validate.d.ts +3 -0
  105. package/dist/commands/validate.d.ts.map +1 -0
  106. package/dist/commands/validate.js +152 -0
  107. package/dist/commands/validate.js.map +1 -0
  108. package/dist/commands/verify.d.ts +3 -0
  109. package/dist/commands/verify.d.ts.map +1 -0
  110. package/dist/commands/verify.js +41 -0
  111. package/dist/commands/verify.js.map +1 -0
  112. package/dist/commands/whoami.d.ts +3 -0
  113. package/dist/commands/whoami.d.ts.map +1 -0
  114. package/dist/commands/whoami.js +28 -0
  115. package/dist/commands/whoami.js.map +1 -0
  116. package/dist/config.d.ts +35 -0
  117. package/dist/config.d.ts.map +1 -0
  118. package/dist/config.js +87 -0
  119. package/dist/config.js.map +1 -0
  120. package/dist/credentials.d.ts +29 -0
  121. package/dist/credentials.d.ts.map +1 -0
  122. package/dist/credentials.js +98 -0
  123. package/dist/credentials.js.map +1 -0
  124. package/dist/github-url.d.ts +22 -0
  125. package/dist/github-url.d.ts.map +1 -0
  126. package/dist/github-url.js +34 -0
  127. package/dist/github-url.js.map +1 -0
  128. package/dist/helpers.d.ts +145 -0
  129. package/dist/helpers.d.ts.map +1 -0
  130. package/dist/helpers.js +597 -0
  131. package/dist/helpers.js.map +1 -0
  132. package/dist/hooks.d.ts +38 -0
  133. package/dist/hooks.d.ts.map +1 -0
  134. package/dist/hooks.js +155 -0
  135. package/dist/hooks.js.map +1 -0
  136. package/dist/oauth.d.ts +22 -0
  137. package/dist/oauth.d.ts.map +1 -0
  138. package/dist/oauth.js +118 -0
  139. package/dist/oauth.js.map +1 -0
  140. package/dist/registry-client.d.ts +86 -0
  141. package/dist/registry-client.d.ts.map +1 -0
  142. package/dist/registry-client.js +225 -0
  143. package/dist/registry-client.js.map +1 -0
  144. package/package.json +58 -0
package/dist/hooks.js ADDED
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ /**
3
+ * Claude Code hook integration for Dossier CLI.
4
+ * Manages the UserPromptSubmit hook that triggers automatic dossier discovery.
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CACHE_TTL_MS = exports.DOSSIER_LIST_CACHE_FILE = exports.CLAUDE_SETTINGS_FILE = exports.DOSSIER_HOOK_PATTERN = exports.DOSSIER_HOOK_COMMAND = exports.DOSSIER_HOOK_ID = void 0;
11
+ exports.installClaudeHook = installClaudeHook;
12
+ exports.removeClaudeHook = removeClaudeHook;
13
+ exports.matchesHookPattern = matchesHookPattern;
14
+ exports.getCachedDossierList = getCachedDossierList;
15
+ exports.saveDossierListCache = saveDossierListCache;
16
+ const node_fs_1 = __importDefault(require("node:fs"));
17
+ const node_os_1 = __importDefault(require("node:os"));
18
+ const node_path_1 = __importDefault(require("node:path"));
19
+ const config_1 = require("./config");
20
+ const DOSSIER_HOOK_ID = 'dossier-discovery-hook';
21
+ exports.DOSSIER_HOOK_ID = DOSSIER_HOOK_ID;
22
+ const DOSSIER_HOOK_COMMAND = 'dossier prompt-hook';
23
+ exports.DOSSIER_HOOK_COMMAND = DOSSIER_HOOK_COMMAND;
24
+ const DOSSIER_HOOK_PATTERN = /\b(workflow|setup|deploy|migrate|refactor|ci\/?cd|pipeline|create\s+(script|automation|process)|sync\s+worktree|onboard|initialize|configure)\b/i;
25
+ exports.DOSSIER_HOOK_PATTERN = DOSSIER_HOOK_PATTERN;
26
+ const CLAUDE_SETTINGS_FILE = node_path_1.default.join(node_os_1.default.homedir(), '.claude', 'settings.json');
27
+ exports.CLAUDE_SETTINGS_FILE = CLAUDE_SETTINGS_FILE;
28
+ const DOSSIER_LIST_CACHE_FILE = node_path_1.default.join(config_1.CONFIG_DIR, 'dossier-list-cache.json');
29
+ exports.DOSSIER_LIST_CACHE_FILE = DOSSIER_LIST_CACHE_FILE;
30
+ const CACHE_TTL_MS = 300_000; // 5 minutes
31
+ exports.CACHE_TTL_MS = CACHE_TTL_MS;
32
+ /**
33
+ * Install the Dossier discovery hook into Claude Code settings.
34
+ * Returns true if newly installed, false if already present.
35
+ */
36
+ function installClaudeHook() {
37
+ let settings = {};
38
+ // Ensure ~/.claude/ directory exists
39
+ const claudeDir = node_path_1.default.dirname(CLAUDE_SETTINGS_FILE);
40
+ if (!node_fs_1.default.existsSync(claudeDir)) {
41
+ node_fs_1.default.mkdirSync(claudeDir, { recursive: true, mode: 0o700 });
42
+ }
43
+ // Read existing settings
44
+ if (node_fs_1.default.existsSync(CLAUDE_SETTINGS_FILE)) {
45
+ try {
46
+ settings = JSON.parse(node_fs_1.default.readFileSync(CLAUDE_SETTINGS_FILE, 'utf8'));
47
+ }
48
+ catch {
49
+ settings = {};
50
+ }
51
+ }
52
+ // Ensure hooks.UserPromptSubmit exists
53
+ if (!settings.hooks) {
54
+ settings.hooks = {};
55
+ }
56
+ if (!Array.isArray(settings.hooks.UserPromptSubmit)) {
57
+ settings.hooks.UserPromptSubmit = [];
58
+ }
59
+ const hooks = settings.hooks.UserPromptSubmit;
60
+ // Check if already installed (by id, by command string, or nested hooks format)
61
+ const matchesHook = (h) => {
62
+ if (h.id === DOSSIER_HOOK_ID || h.command === DOSSIER_HOOK_COMMAND)
63
+ return true;
64
+ // Handle nested format: { hooks: [{ type, command }] }
65
+ if (Array.isArray(h.hooks)) {
66
+ return h.hooks.some((inner) => inner.command === DOSSIER_HOOK_COMMAND);
67
+ }
68
+ return false;
69
+ };
70
+ const alreadyInstalled = hooks.some(matchesHook);
71
+ if (alreadyInstalled) {
72
+ return false;
73
+ }
74
+ // Install the hook
75
+ hooks.push({
76
+ type: 'command',
77
+ command: DOSSIER_HOOK_COMMAND,
78
+ id: DOSSIER_HOOK_ID,
79
+ });
80
+ node_fs_1.default.writeFileSync(CLAUDE_SETTINGS_FILE, JSON.stringify(settings, null, 2), 'utf8');
81
+ return true;
82
+ }
83
+ /**
84
+ * Remove the Dossier discovery hook from Claude Code settings.
85
+ * Returns true if found and removed, false if not found.
86
+ */
87
+ function removeClaudeHook() {
88
+ if (!node_fs_1.default.existsSync(CLAUDE_SETTINGS_FILE)) {
89
+ return false;
90
+ }
91
+ let settings;
92
+ try {
93
+ settings = JSON.parse(node_fs_1.default.readFileSync(CLAUDE_SETTINGS_FILE, 'utf8'));
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ const hooks = settings.hooks?.UserPromptSubmit;
99
+ if (!Array.isArray(hooks)) {
100
+ return false;
101
+ }
102
+ const originalLength = hooks.length;
103
+ const matchesHook = (h) => {
104
+ if (h.id === DOSSIER_HOOK_ID || h.command === DOSSIER_HOOK_COMMAND)
105
+ return true;
106
+ if (Array.isArray(h.hooks)) {
107
+ return h.hooks.some((inner) => inner.command === DOSSIER_HOOK_COMMAND);
108
+ }
109
+ return false;
110
+ };
111
+ const filteredHooks = hooks.filter((h) => !matchesHook(h));
112
+ settings.hooks = { ...settings.hooks, UserPromptSubmit: filteredHooks };
113
+ if (filteredHooks.length === originalLength) {
114
+ return false;
115
+ }
116
+ node_fs_1.default.writeFileSync(CLAUDE_SETTINGS_FILE, JSON.stringify(settings, null, 2), 'utf8');
117
+ return true;
118
+ }
119
+ /**
120
+ * Test whether a user prompt matches the dossier discovery pattern.
121
+ */
122
+ function matchesHookPattern(prompt) {
123
+ return DOSSIER_HOOK_PATTERN.test(prompt);
124
+ }
125
+ /**
126
+ * Return cached dossier list if fresh (< 5 minutes), null otherwise.
127
+ */
128
+ function getCachedDossierList() {
129
+ if (!node_fs_1.default.existsSync(DOSSIER_LIST_CACHE_FILE)) {
130
+ return null;
131
+ }
132
+ try {
133
+ const data = JSON.parse(node_fs_1.default.readFileSync(DOSSIER_LIST_CACHE_FILE, 'utf8'));
134
+ if (Date.now() - data.timestamp < CACHE_TTL_MS) {
135
+ return data.dossiers;
136
+ }
137
+ }
138
+ catch {
139
+ // Corrupt cache — treat as miss
140
+ }
141
+ return null;
142
+ }
143
+ /**
144
+ * Write dossier list to cache file.
145
+ */
146
+ function saveDossierListCache(dossiers) {
147
+ try {
148
+ const data = { timestamp: Date.now(), dossiers };
149
+ node_fs_1.default.writeFileSync(DOSSIER_LIST_CACHE_FILE, JSON.stringify(data), 'utf8');
150
+ }
151
+ catch {
152
+ // Best-effort caching — ignore write errors
153
+ }
154
+ }
155
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * OAuth authentication flow for registry login.
3
+ * Opens browser for GitHub authentication, prompts user for code,
4
+ * decodes JWT token to extract user info.
5
+ */
6
+ export interface OAuthResult {
7
+ token: string;
8
+ username: string;
9
+ orgs: string[];
10
+ email: string | null;
11
+ }
12
+ declare class OAuthError extends Error {
13
+ constructor(message: string);
14
+ }
15
+ /**
16
+ * Run the OAuth flow using copy/paste method.
17
+ * Opens a browser for GitHub authentication. The registry displays a code
18
+ * that the user copies and pastes back into the CLI.
19
+ */
20
+ declare function runOAuthFlow(registryUrl: string): Promise<OAuthResult>;
21
+ export { OAuthError, runOAuthFlow };
22
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAQD,cAAM,UAAW,SAAQ,KAAK;gBAChB,OAAO,EAAE,MAAM;CAI5B;AAuDD;;;;GAIG;AACH,iBAAe,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA8CrE;AAED,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC"}
package/dist/oauth.js ADDED
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * OAuth authentication flow for registry login.
4
+ * Opens browser for GitHub authentication, prompts user for code,
5
+ * decodes JWT token to extract user info.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.OAuthError = void 0;
12
+ exports.runOAuthFlow = runOAuthFlow;
13
+ const node_child_process_1 = require("node:child_process");
14
+ const node_readline_1 = __importDefault(require("node:readline"));
15
+ class OAuthError extends Error {
16
+ constructor(message) {
17
+ super(message);
18
+ this.name = 'OAuthError';
19
+ }
20
+ }
21
+ exports.OAuthError = OAuthError;
22
+ /**
23
+ * Decode a base64url-encoded string, adding padding if needed.
24
+ */
25
+ function decodeBase64Url(data) {
26
+ // Replace URL-safe chars with standard base64 chars
27
+ let base64 = data.replace(/-/g, '+').replace(/_/g, '/');
28
+ // Add padding
29
+ const padding = 4 - (base64.length % 4);
30
+ if (padding !== 4) {
31
+ base64 += '='.repeat(padding);
32
+ }
33
+ return Buffer.from(base64, 'base64').toString('utf8');
34
+ }
35
+ /**
36
+ * Open a URL in the user's default browser (platform-aware).
37
+ */
38
+ function openBrowser(url) {
39
+ const platform = process.platform;
40
+ let cmd;
41
+ let args;
42
+ if (platform === 'darwin') {
43
+ cmd = 'open';
44
+ args = [url];
45
+ }
46
+ else if (platform === 'win32') {
47
+ cmd = 'cmd';
48
+ args = ['/c', 'start', '', url];
49
+ }
50
+ else {
51
+ cmd = 'xdg-open';
52
+ args = [url];
53
+ }
54
+ (0, node_child_process_1.execFile)(cmd, args, (_err) => {
55
+ // Browser failed to open — URL is already printed for the user
56
+ });
57
+ }
58
+ /**
59
+ * Prompt the user for input via stdin.
60
+ */
61
+ function prompt(question) {
62
+ const rl = node_readline_1.default.createInterface({
63
+ input: process.stdin,
64
+ output: process.stderr,
65
+ });
66
+ return new Promise((resolve) => {
67
+ rl.question(question, (answer) => {
68
+ rl.close();
69
+ resolve(answer);
70
+ });
71
+ });
72
+ }
73
+ /**
74
+ * Run the OAuth flow using copy/paste method.
75
+ * Opens a browser for GitHub authentication. The registry displays a code
76
+ * that the user copies and pastes back into the CLI.
77
+ */
78
+ async function runOAuthFlow(registryUrl) {
79
+ const authUrl = `${registryUrl}/auth/login`;
80
+ console.log(`\n🔐 Opening browser for GitHub authentication...`);
81
+ console.log(` If it doesn't open automatically, visit:\n ${authUrl}\n`);
82
+ openBrowser(authUrl);
83
+ const code = (await prompt('Enter the code from your browser: ')).trim();
84
+ if (!code) {
85
+ throw new OAuthError('No code provided');
86
+ }
87
+ // The code is a base64url-encoded JWT
88
+ let token;
89
+ try {
90
+ token = decodeBase64Url(code);
91
+ }
92
+ catch (err) {
93
+ throw new OAuthError(`Invalid code format: ${err.message}`);
94
+ }
95
+ // Decode JWT payload (middle part) to get user info
96
+ const parts = token.split('.');
97
+ if (parts.length !== 3) {
98
+ throw new OAuthError('Invalid token format');
99
+ }
100
+ let payload;
101
+ try {
102
+ payload = JSON.parse(decodeBase64Url(parts[1]));
103
+ }
104
+ catch (err) {
105
+ throw new OAuthError(`Invalid token: ${err.message}`);
106
+ }
107
+ const username = payload.sub;
108
+ if (!username) {
109
+ throw new OAuthError('Invalid token: missing username');
110
+ }
111
+ return {
112
+ token,
113
+ username,
114
+ orgs: payload.orgs || [],
115
+ email: payload.email || null,
116
+ };
117
+ }
118
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * HTTP client for the Dossier Registry API.
3
+ * Uses Node.js built-in fetch (Node 18+).
4
+ */
5
+ declare const DEFAULT_REGISTRY_URL = "https://dossier-registry.vercel.app";
6
+ declare class RegistryError extends Error {
7
+ statusCode: number | null;
8
+ code: string | null;
9
+ constructor(message: string, statusCode?: number | null, code?: string | null);
10
+ }
11
+ interface ListDossiersOptions {
12
+ category?: string;
13
+ page?: number;
14
+ perPage?: number;
15
+ }
16
+ interface SearchOptions {
17
+ page?: number;
18
+ perPage?: number;
19
+ }
20
+ interface DossierContentResult {
21
+ content: string;
22
+ digest: string | null;
23
+ }
24
+ declare class RegistryClient {
25
+ private baseUrl;
26
+ private token;
27
+ constructor(baseUrl: string, token?: string | null);
28
+ /**
29
+ * Build request headers.
30
+ */
31
+ private _buildHeaders;
32
+ /**
33
+ * Handle API response, throwing on errors.
34
+ */
35
+ private _handleResponse;
36
+ /**
37
+ * Build URL with query parameters.
38
+ */
39
+ private _buildUrl;
40
+ /**
41
+ * List dossiers from the registry.
42
+ */
43
+ listDossiers(options?: ListDossiersOptions): Promise<unknown>;
44
+ /**
45
+ * Get metadata for a dossier.
46
+ */
47
+ getDossier(name: string, version?: string | null): Promise<unknown>;
48
+ /**
49
+ * Download dossier content.
50
+ */
51
+ getDossierContent(name: string, version?: string | null): Promise<DossierContentResult>;
52
+ /**
53
+ * Search dossiers.
54
+ */
55
+ searchDossiers(query: string, options?: SearchOptions): Promise<unknown>;
56
+ /**
57
+ * Publish a dossier to the registry.
58
+ */
59
+ publishDossier(namespace: string, content: string, changelog?: string | null): Promise<unknown>;
60
+ /**
61
+ * Delete a dossier from the registry.
62
+ */
63
+ removeDossier(name: string, version?: string | null): Promise<unknown>;
64
+ /**
65
+ * Get current user info.
66
+ */
67
+ getMe(): Promise<unknown>;
68
+ /**
69
+ * Exchange OAuth code for access token.
70
+ */
71
+ exchangeCode(code: string, redirectUri: string): Promise<unknown>;
72
+ }
73
+ /**
74
+ * Get registry URL from environment or use default.
75
+ */
76
+ declare function getRegistryUrl(): string;
77
+ /**
78
+ * Create a registry client from environment configuration.
79
+ */
80
+ declare function getClient(token?: string | null): RegistryClient;
81
+ /**
82
+ * Parse a name@version string.
83
+ */
84
+ declare function parseNameVersion(name: string): [string, string | null];
85
+ export { RegistryClient, RegistryError, getRegistryUrl, getClient, parseNameVersion, DEFAULT_REGISTRY_URL, };
86
+ //# sourceMappingURL=registry-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.d.ts","sourceRoot":"","sources":["../src/registry-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,QAAA,MAAM,oBAAoB,wCAAwC,CAAC;AAEnE,cAAM,aAAc,SAAQ,KAAK;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;gBAER,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,GAAG,IAAW,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW;CAM1F;AAED,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,cAAM,cAAc;IAClB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAgB;gBAEjB,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,GAAG,IAAW;IAKxD;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;YACW,eAAe;IAsB7B;;OAEG;IACH,OAAO,CAAC,SAAS;IAUjB;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAevE;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAY/E;;OAEG;IACG,iBAAiB,CACrB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,GAAG,IAAW,GAC5B,OAAO,CAAC,oBAAoB,CAAC;IAkChC;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAalF;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAM,GAAG,IAAW,GAC9B,OAAO,CAAC,OAAO,CAAC;IAcnB;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAalF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAO/B;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQxE;AAED;;GAEG;AACH,iBAAS,cAAc,IAAI,MAAM,CAEhC;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,KAAK,GAAE,MAAM,GAAG,IAAW,GAAG,cAAc,CAE9D;AAED;;GAEG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAM/D;AAED,OAAO,EACL,cAAc,EACd,aAAa,EACb,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,oBAAoB,GACrB,CAAC"}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ /**
3
+ * HTTP client for the Dossier Registry API.
4
+ * Uses Node.js built-in fetch (Node 18+).
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DEFAULT_REGISTRY_URL = exports.RegistryError = exports.RegistryClient = void 0;
8
+ exports.getRegistryUrl = getRegistryUrl;
9
+ exports.getClient = getClient;
10
+ exports.parseNameVersion = parseNameVersion;
11
+ const DEFAULT_REGISTRY_URL = 'https://dossier-registry.vercel.app';
12
+ exports.DEFAULT_REGISTRY_URL = DEFAULT_REGISTRY_URL;
13
+ class RegistryError extends Error {
14
+ statusCode;
15
+ code;
16
+ constructor(message, statusCode = null, code = null) {
17
+ super(message);
18
+ this.name = 'RegistryError';
19
+ this.statusCode = statusCode;
20
+ this.code = code;
21
+ }
22
+ }
23
+ exports.RegistryError = RegistryError;
24
+ class RegistryClient {
25
+ baseUrl;
26
+ token;
27
+ constructor(baseUrl, token = null) {
28
+ this.baseUrl = `${baseUrl.replace(/\/+$/, '')}/api/v1`;
29
+ this.token = token;
30
+ }
31
+ /**
32
+ * Build request headers.
33
+ */
34
+ _buildHeaders(contentType = null) {
35
+ const headers = { Accept: 'application/json' };
36
+ if (this.token) {
37
+ headers.Authorization = `Bearer ${this.token}`;
38
+ }
39
+ if (contentType) {
40
+ headers['Content-Type'] = contentType;
41
+ }
42
+ return headers;
43
+ }
44
+ /**
45
+ * Handle API response, throwing on errors.
46
+ */
47
+ async _handleResponse(response) {
48
+ if (!response.ok) {
49
+ let message = `Registry request failed: ${response.status} ${response.statusText}`;
50
+ let code = null;
51
+ try {
52
+ const body = (await response.json());
53
+ const errorData = body.error || {};
54
+ if (errorData.message) {
55
+ message = errorData.message;
56
+ }
57
+ code = errorData.code || null;
58
+ }
59
+ catch {
60
+ // Could not parse error body
61
+ }
62
+ throw new RegistryError(message, response.status, code);
63
+ }
64
+ return response.json();
65
+ }
66
+ /**
67
+ * Build URL with query parameters.
68
+ */
69
+ _buildUrl(path, params = {}) {
70
+ const url = new URL(`${this.baseUrl}${path}`);
71
+ for (const [key, value] of Object.entries(params)) {
72
+ if (value != null) {
73
+ url.searchParams.set(key, String(value));
74
+ }
75
+ }
76
+ return url.toString();
77
+ }
78
+ /**
79
+ * List dossiers from the registry.
80
+ */
81
+ async listDossiers(options = {}) {
82
+ const params = {
83
+ page: options.page || 1,
84
+ per_page: options.perPage || 20,
85
+ };
86
+ if (options.category) {
87
+ params.category = options.category;
88
+ }
89
+ const response = await fetch(this._buildUrl('/dossiers', params), {
90
+ headers: this._buildHeaders(),
91
+ });
92
+ return this._handleResponse(response);
93
+ }
94
+ /**
95
+ * Get metadata for a dossier.
96
+ */
97
+ async getDossier(name, version = null) {
98
+ const params = {};
99
+ if (version) {
100
+ params.version = version;
101
+ }
102
+ const response = await fetch(this._buildUrl(`/dossiers/${name}`, params), {
103
+ headers: this._buildHeaders(),
104
+ });
105
+ return this._handleResponse(response);
106
+ }
107
+ /**
108
+ * Download dossier content.
109
+ */
110
+ async getDossierContent(name, version = null) {
111
+ const params = {};
112
+ if (version) {
113
+ params.version = version;
114
+ }
115
+ const response = await fetch(this._buildUrl(`/dossiers/${name}/content`, params), {
116
+ headers: this._buildHeaders(),
117
+ });
118
+ if (!response.ok) {
119
+ let message = `Failed to download dossier '${name}': ${response.status} ${response.statusText}`;
120
+ let code = null;
121
+ try {
122
+ const body = (await response.json());
123
+ const errorData = body.error || {};
124
+ if (errorData.message) {
125
+ message = errorData.message;
126
+ }
127
+ code = errorData.code || null;
128
+ }
129
+ catch {
130
+ // Could not parse error body
131
+ }
132
+ throw new RegistryError(message, response.status, code);
133
+ }
134
+ const content = await response.text();
135
+ const digest = response.headers.get('X-Dossier-Digest');
136
+ return { content, digest };
137
+ }
138
+ /**
139
+ * Search dossiers.
140
+ */
141
+ async searchDossiers(query, options = {}) {
142
+ const params = {
143
+ q: query,
144
+ page: options.page || 1,
145
+ per_page: options.perPage || 20,
146
+ };
147
+ const response = await fetch(this._buildUrl('/search', params), {
148
+ headers: this._buildHeaders(),
149
+ });
150
+ return this._handleResponse(response);
151
+ }
152
+ /**
153
+ * Publish a dossier to the registry.
154
+ */
155
+ async publishDossier(namespace, content, changelog = null) {
156
+ const data = { namespace, content };
157
+ if (changelog) {
158
+ data.changelog = changelog;
159
+ }
160
+ const response = await fetch(this._buildUrl('/dossiers'), {
161
+ method: 'POST',
162
+ headers: this._buildHeaders('application/json'),
163
+ body: JSON.stringify(data),
164
+ });
165
+ return this._handleResponse(response);
166
+ }
167
+ /**
168
+ * Delete a dossier from the registry.
169
+ */
170
+ async removeDossier(name, version = null) {
171
+ const params = {};
172
+ if (version) {
173
+ params.version = version;
174
+ }
175
+ const response = await fetch(this._buildUrl(`/dossiers/${name}`, params), {
176
+ method: 'DELETE',
177
+ headers: this._buildHeaders(),
178
+ });
179
+ return this._handleResponse(response);
180
+ }
181
+ /**
182
+ * Get current user info.
183
+ */
184
+ async getMe() {
185
+ const response = await fetch(this._buildUrl('/me'), {
186
+ headers: this._buildHeaders(),
187
+ });
188
+ return this._handleResponse(response);
189
+ }
190
+ /**
191
+ * Exchange OAuth code for access token.
192
+ */
193
+ async exchangeCode(code, redirectUri) {
194
+ const response = await fetch(this._buildUrl('/auth/token'), {
195
+ method: 'POST',
196
+ headers: this._buildHeaders('application/json'),
197
+ body: JSON.stringify({ code, redirect_uri: redirectUri }),
198
+ });
199
+ return this._handleResponse(response);
200
+ }
201
+ }
202
+ exports.RegistryClient = RegistryClient;
203
+ /**
204
+ * Get registry URL from environment or use default.
205
+ */
206
+ function getRegistryUrl() {
207
+ return process.env.DOSSIER_REGISTRY_URL || DEFAULT_REGISTRY_URL;
208
+ }
209
+ /**
210
+ * Create a registry client from environment configuration.
211
+ */
212
+ function getClient(token = null) {
213
+ return new RegistryClient(getRegistryUrl(), token);
214
+ }
215
+ /**
216
+ * Parse a name@version string.
217
+ */
218
+ function parseNameVersion(name) {
219
+ if (name.includes('@')) {
220
+ const idx = name.lastIndexOf('@');
221
+ return [name.slice(0, idx), name.slice(idx + 1)];
222
+ }
223
+ return [name, null];
224
+ }
225
+ //# sourceMappingURL=registry-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.js","sourceRoot":"","sources":["../src/registry-client.ts"],"names":[],"mappings":"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"}