@ai-dossier/cli 0.3.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +56 -25
  2. package/bin/dossier-verify +6 -432
  3. package/dist/cli.js +82 -21
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/cache.d.ts.map +1 -1
  6. package/dist/commands/cache.js +5 -1
  7. package/dist/commands/cache.js.map +1 -1
  8. package/dist/commands/checksum.d.ts.map +1 -1
  9. package/dist/commands/checksum.js +6 -8
  10. package/dist/commands/checksum.js.map +1 -1
  11. package/dist/commands/commands.d.ts +3 -0
  12. package/dist/commands/commands.d.ts.map +1 -0
  13. package/dist/commands/commands.js +73 -0
  14. package/dist/commands/commands.js.map +1 -0
  15. package/dist/commands/config-cmd.d.ts.map +1 -1
  16. package/dist/commands/config-cmd.js +170 -7
  17. package/dist/commands/config-cmd.js.map +1 -1
  18. package/dist/commands/create.d.ts.map +1 -1
  19. package/dist/commands/create.js +25 -10
  20. package/dist/commands/create.js.map +1 -1
  21. package/dist/commands/export.d.ts.map +1 -1
  22. package/dist/commands/export.js +16 -6
  23. package/dist/commands/export.js.map +1 -1
  24. package/dist/commands/format.d.ts.map +1 -1
  25. package/dist/commands/format.js.map +1 -1
  26. package/dist/commands/from-file.d.ts.map +1 -1
  27. package/dist/commands/from-file.js +4 -3
  28. package/dist/commands/from-file.js.map +1 -1
  29. package/dist/commands/get.d.ts.map +1 -1
  30. package/dist/commands/get.js +19 -6
  31. package/dist/commands/get.js.map +1 -1
  32. package/dist/commands/info.d.ts.map +1 -1
  33. package/dist/commands/info.js +28 -58
  34. package/dist/commands/info.js.map +1 -1
  35. package/dist/commands/install-skill.d.ts.map +1 -1
  36. package/dist/commands/install-skill.js +98 -29
  37. package/dist/commands/install-skill.js.map +1 -1
  38. package/dist/commands/keys.js +1 -1
  39. package/dist/commands/keys.js.map +1 -1
  40. package/dist/commands/lint.d.ts.map +1 -1
  41. package/dist/commands/lint.js.map +1 -1
  42. package/dist/commands/list.d.ts.map +1 -1
  43. package/dist/commands/list.js +58 -41
  44. package/dist/commands/list.js.map +1 -1
  45. package/dist/commands/login.d.ts.map +1 -1
  46. package/dist/commands/login.js +32 -6
  47. package/dist/commands/login.js.map +1 -1
  48. package/dist/commands/logout.d.ts.map +1 -1
  49. package/dist/commands/logout.js +22 -5
  50. package/dist/commands/logout.js.map +1 -1
  51. package/dist/commands/prompt-hook.d.ts.map +1 -1
  52. package/dist/commands/prompt-hook.js +4 -13
  53. package/dist/commands/prompt-hook.js.map +1 -1
  54. package/dist/commands/publish.d.ts.map +1 -1
  55. package/dist/commands/publish.js +131 -51
  56. package/dist/commands/publish.js.map +1 -1
  57. package/dist/commands/pull.d.ts.map +1 -1
  58. package/dist/commands/pull.js +23 -8
  59. package/dist/commands/pull.js.map +1 -1
  60. package/dist/commands/remove.d.ts.map +1 -1
  61. package/dist/commands/remove.js +61 -11
  62. package/dist/commands/remove.js.map +1 -1
  63. package/dist/commands/reset-hooks.js +1 -1
  64. package/dist/commands/reset-hooks.js.map +1 -1
  65. package/dist/commands/run.d.ts.map +1 -1
  66. package/dist/commands/run.js +88 -73
  67. package/dist/commands/run.js.map +1 -1
  68. package/dist/commands/search.d.ts.map +1 -1
  69. package/dist/commands/search.js +30 -28
  70. package/dist/commands/search.js.map +1 -1
  71. package/dist/commands/sign.d.ts.map +1 -1
  72. package/dist/commands/sign.js +71 -45
  73. package/dist/commands/sign.js.map +1 -1
  74. package/dist/commands/skill-export.d.ts +3 -0
  75. package/dist/commands/skill-export.d.ts.map +1 -0
  76. package/dist/commands/skill-export.js +218 -0
  77. package/dist/commands/skill-export.js.map +1 -0
  78. package/dist/commands/validate.d.ts.map +1 -1
  79. package/dist/commands/validate.js +12 -33
  80. package/dist/commands/validate.js.map +1 -1
  81. package/dist/commands/verify.d.ts.map +1 -1
  82. package/dist/commands/verify.js +6 -8
  83. package/dist/commands/verify.js.map +1 -1
  84. package/dist/commands/whoami.d.ts.map +1 -1
  85. package/dist/commands/whoami.js +115 -12
  86. package/dist/commands/whoami.js.map +1 -1
  87. package/dist/config.d.ts +38 -1
  88. package/dist/config.d.ts.map +1 -1
  89. package/dist/config.js +128 -1
  90. package/dist/config.js.map +1 -1
  91. package/dist/credentials.d.ts +14 -8
  92. package/dist/credentials.d.ts.map +1 -1
  93. package/dist/credentials.js +119 -39
  94. package/dist/credentials.js.map +1 -1
  95. package/dist/help.d.ts +7 -0
  96. package/dist/help.d.ts.map +1 -0
  97. package/dist/help.js +86 -0
  98. package/dist/help.js.map +1 -0
  99. package/dist/helpers.d.ts +4 -18
  100. package/dist/helpers.d.ts.map +1 -1
  101. package/dist/helpers.js +35 -147
  102. package/dist/helpers.js.map +1 -1
  103. package/dist/multi-registry.d.ts +71 -0
  104. package/dist/multi-registry.d.ts.map +1 -0
  105. package/dist/multi-registry.js +136 -0
  106. package/dist/multi-registry.js.map +1 -0
  107. package/dist/oauth.d.ts +1 -0
  108. package/dist/oauth.d.ts.map +1 -1
  109. package/dist/oauth.js +1 -0
  110. package/dist/oauth.js.map +1 -1
  111. package/dist/registry-client.d.ts +64 -8
  112. package/dist/registry-client.d.ts.map +1 -1
  113. package/dist/registry-client.js +13 -0
  114. package/dist/registry-client.js.map +1 -1
  115. package/dist/verify-dossier.d.ts +28 -0
  116. package/dist/verify-dossier.d.ts.map +1 -0
  117. package/dist/verify-dossier.js +329 -0
  118. package/dist/verify-dossier.js.map +1 -0
  119. package/package.json +3 -3
@@ -1,28 +1,131 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerWhoamiCommand = registerWhoamiCommand;
4
+ const config_1 = require("../config");
4
5
  const credentials_1 = require("../credentials");
5
6
  function registerWhoamiCommand(program) {
6
7
  program
7
8
  .command('whoami')
8
9
  .description('Show current registry user')
9
- .action(() => {
10
- const credentials = (0, credentials_1.loadCredentials)();
11
- if (!credentials) {
12
- console.log('\nℹ️ Not logged in');
13
- console.log(' Run `dossier login` to authenticate\n');
14
- process.exit(1);
15
- }
16
- if ((0, credentials_1.isExpired)(credentials)) {
17
- console.log('\n⚠️ Credentials expired');
18
- console.log(' Run `dossier login` to re-authenticate\n');
19
- process.exit(1);
10
+ .option('--registry <name>', 'Show credentials for a specific registry')
11
+ .option('--json', 'Output as JSON')
12
+ .action((options) => {
13
+ if (options.registry) {
14
+ showSingleRegistry(options.registry, options.json);
20
15
  }
16
+ else {
17
+ const credRegistries = (0, credentials_1.listCredentialRegistries)();
18
+ if (credRegistries.length === 0) {
19
+ if (options.json) {
20
+ console.log(JSON.stringify({ logged_in: false, error: 'Not logged in', code: 'not_logged_in' }, null, 2));
21
+ }
22
+ else {
23
+ console.log('\nℹ️ Not logged in');
24
+ console.log(' Run `dossier login` to authenticate\n');
25
+ }
26
+ process.exit(1);
27
+ }
28
+ // Show all registries with credentials
29
+ if (credRegistries.length === 1) {
30
+ showSingleRegistry(credRegistries[0], options.json);
31
+ }
32
+ else {
33
+ showAllRegistries(credRegistries, options.json);
34
+ }
35
+ }
36
+ });
37
+ }
38
+ function showSingleRegistry(registryName, json) {
39
+ const credentials = (0, credentials_1.loadCredentials)(registryName);
40
+ if (!credentials) {
41
+ if (json) {
42
+ console.log(JSON.stringify({
43
+ logged_in: false,
44
+ registry: registryName,
45
+ error: 'Not logged in',
46
+ code: 'not_logged_in',
47
+ }, null, 2));
48
+ }
49
+ else {
50
+ console.log(`\nℹ️ Not logged in to registry '${registryName}'`);
51
+ console.log(` Run \`dossier login --registry ${registryName}\` to authenticate\n`);
52
+ }
53
+ process.exit(1);
54
+ }
55
+ if ((0, credentials_1.isExpired)(credentials)) {
56
+ if (json) {
57
+ console.log(JSON.stringify({
58
+ logged_in: false,
59
+ registry: registryName,
60
+ error: 'Credentials expired',
61
+ code: 'expired',
62
+ }, null, 2));
63
+ }
64
+ else {
65
+ console.log(`\n⚠️ Credentials expired for registry '${registryName}'`);
66
+ console.log(` Run \`dossier login --registry ${registryName}\` to re-authenticate\n`);
67
+ }
68
+ process.exit(1);
69
+ }
70
+ if (json) {
71
+ console.log(JSON.stringify({
72
+ logged_in: true,
73
+ registry: registryName,
74
+ username: credentials.username,
75
+ orgs: credentials.orgs,
76
+ }, null, 2));
77
+ }
78
+ else {
79
+ const allRegistries = (0, config_1.resolveRegistries)();
21
80
  console.log(`\n👤 ${credentials.username}`);
81
+ if (allRegistries.length > 1) {
82
+ console.log(` Registry: ${registryName}`);
83
+ }
22
84
  if (credentials.orgs.length > 0) {
23
85
  console.log(` Organizations: ${credentials.orgs.join(', ')}`);
24
86
  }
25
87
  console.log('');
26
- });
88
+ }
89
+ }
90
+ function showAllRegistries(registryNames, json) {
91
+ const entries = [];
92
+ for (const name of registryNames) {
93
+ const creds = (0, credentials_1.loadCredentials)(name);
94
+ if (!creds) {
95
+ entries.push({ registry: name, logged_in: false });
96
+ }
97
+ else if ((0, credentials_1.isExpired)(creds)) {
98
+ entries.push({ registry: name, logged_in: false, expired: true, username: creds.username });
99
+ }
100
+ else {
101
+ entries.push({
102
+ registry: name,
103
+ logged_in: true,
104
+ username: creds.username,
105
+ orgs: creds.orgs,
106
+ });
107
+ }
108
+ }
109
+ if (json) {
110
+ console.log(JSON.stringify({ registries: entries }, null, 2));
111
+ }
112
+ else {
113
+ console.log('\n👤 Registry Credentials:\n');
114
+ for (const e of entries) {
115
+ if (e.logged_in) {
116
+ console.log(` ${e.registry}: ${e.username}`);
117
+ if (e.orgs && e.orgs.length > 0) {
118
+ console.log(` Organizations: ${e.orgs.join(', ')}`);
119
+ }
120
+ }
121
+ else if (e.expired) {
122
+ console.log(` ${e.registry}: ${e.username} (expired)`);
123
+ }
124
+ else {
125
+ console.log(` ${e.registry}: not logged in`);
126
+ }
127
+ }
128
+ console.log('');
129
+ }
27
130
  }
28
131
  //# sourceMappingURL=whoami.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":";;AAGA,sDAwBC;AA1BD,gDAA4D;AAE5D,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,WAAW,GAAG,IAAA,6BAAe,GAAE,CAAC;QACtC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAA,uBAAS,EAAC,WAAW,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,QAAQ,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5C,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,qBAAqB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,13 +1,27 @@
1
1
  /**
2
2
  * Configuration management for Dossier CLI
3
3
  * Handles reading and writing user preferences to ~/.dossier/config.json
4
+ * and multi-registry configuration.
4
5
  */
6
+ export interface RegistryEntry {
7
+ url: string;
8
+ default?: boolean;
9
+ readonly?: boolean;
10
+ }
5
11
  export interface DossierConfig {
6
12
  defaultLlm: string;
7
13
  theme: string;
8
14
  auditLog: boolean;
15
+ registries?: Record<string, RegistryEntry>;
16
+ defaultRegistry?: string;
9
17
  [key: string]: unknown;
10
18
  }
19
+ export interface ResolvedRegistry {
20
+ name: string;
21
+ url: string;
22
+ readonly?: boolean;
23
+ }
24
+ declare const DEFAULT_REGISTRY_URL = "https://dossier-registry.vercel.app";
11
25
  declare const CONFIG_DIR: string;
12
26
  declare const CONFIG_FILE: string;
13
27
  declare const DEFAULT_CONFIG: DossierConfig;
@@ -31,5 +45,28 @@ declare function getConfig(key: string): unknown;
31
45
  * Set a specific config value
32
46
  */
33
47
  declare function setConfig(key: string, value: unknown): boolean;
34
- export { ensureConfigDir, loadConfig, saveConfig, getConfig, setConfig, CONFIG_DIR, CONFIG_FILE, DEFAULT_CONFIG, };
48
+ /**
49
+ * Load project-level .dossierrc.json by walking up from cwd.
50
+ */
51
+ declare function loadProjectConfig(): DossierConfig | null;
52
+ /**
53
+ * Resolve all configured registries, merging user + project config.
54
+ * Resolution priority:
55
+ * 1. CLI --registry flag (handled by caller)
56
+ * 2. DOSSIER_REGISTRY_URL env var → virtual "env" registry
57
+ * 3. Project-level .dossierrc.json
58
+ * 4. User-level ~/.dossier/config.json
59
+ * 5. Hardcoded default (public registry)
60
+ */
61
+ declare function resolveRegistries(): ResolvedRegistry[];
62
+ /**
63
+ * Resolve which single registry to use for write operations.
64
+ * Priority: --registry flag > defaultRegistry (project > user) > first registry
65
+ */
66
+ declare function resolveWriteRegistry(registryFlag?: string): ResolvedRegistry;
67
+ /**
68
+ * Resolve a single registry by name (for auth commands).
69
+ */
70
+ declare function resolveRegistryByName(name: string): ResolvedRegistry;
71
+ export { ensureConfigDir, loadConfig, saveConfig, getConfig, setConfig, loadProjectConfig, resolveRegistries, resolveWriteRegistry, resolveRegistryByName, CONFIG_DIR, CONFIG_FILE, DEFAULT_CONFIG, DEFAULT_REGISTRY_URL, };
35
72
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,QAAA,MAAM,UAAU,QAAsC,CAAC;AACvD,QAAA,MAAM,WAAW,QAAuC,CAAC;AAEzD,QAAA,MAAM,cAAc,EAAE,aAIrB,CAAC;AAEF;;GAEG;AACH,iBAAS,eAAe,IAAI,IAAI,CAI/B;AAED;;GAEG;AACH,iBAAS,UAAU,IAAI,aAAa,CAenC;AAED;;GAEG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAYlD;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGvC;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAIvD;AAED,OAAO,EACL,eAAe,EACf,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,cAAc,GACf,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,oBAAoB,wCAAwC,CAAC;AAEnE,QAAA,MAAM,UAAU,QAAsC,CAAC;AACvD,QAAA,MAAM,WAAW,QAAuC,CAAC;AAEzD,QAAA,MAAM,cAAc,EAAE,aAIrB,CAAC;AAEF;;GAEG;AACH,iBAAS,eAAe,IAAI,IAAI,CAI/B;AAED;;GAEG;AACH,iBAAS,UAAU,IAAI,aAAa,CAenC;AAED;;GAEG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAYlD;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGvC;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAIvD;AAED;;GAEG;AACH,iBAAS,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAiBjD;AAED;;;;;;;;GAQG;AACH,iBAAS,iBAAiB,IAAI,gBAAgB,EAAE,CAuC/C;AAED;;;GAGG;AACH,iBAAS,oBAAoB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA4CrE;AAED;;GAEG;AACH,iBAAS,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAQ7D;AAED,OAAO,EACL,eAAe,EACf,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,UAAU,EACV,WAAW,EACX,cAAc,EACd,oBAAoB,GACrB,CAAC"}
package/dist/config.js CHANGED
@@ -2,20 +2,27 @@
2
2
  /**
3
3
  * Configuration management for Dossier CLI
4
4
  * Handles reading and writing user preferences to ~/.dossier/config.json
5
+ * and multi-registry configuration.
5
6
  */
6
7
  var __importDefault = (this && this.__importDefault) || function (mod) {
7
8
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
9
  };
9
10
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.DEFAULT_CONFIG = exports.CONFIG_FILE = exports.CONFIG_DIR = void 0;
11
+ exports.DEFAULT_REGISTRY_URL = exports.DEFAULT_CONFIG = exports.CONFIG_FILE = exports.CONFIG_DIR = void 0;
11
12
  exports.ensureConfigDir = ensureConfigDir;
12
13
  exports.loadConfig = loadConfig;
13
14
  exports.saveConfig = saveConfig;
14
15
  exports.getConfig = getConfig;
15
16
  exports.setConfig = setConfig;
17
+ exports.loadProjectConfig = loadProjectConfig;
18
+ exports.resolveRegistries = resolveRegistries;
19
+ exports.resolveWriteRegistry = resolveWriteRegistry;
20
+ exports.resolveRegistryByName = resolveRegistryByName;
16
21
  const node_fs_1 = __importDefault(require("node:fs"));
17
22
  const node_os_1 = __importDefault(require("node:os"));
18
23
  const node_path_1 = __importDefault(require("node:path"));
24
+ const DEFAULT_REGISTRY_URL = 'https://dossier-registry.vercel.app';
25
+ exports.DEFAULT_REGISTRY_URL = DEFAULT_REGISTRY_URL;
19
26
  const CONFIG_DIR = node_path_1.default.join(node_os_1.default.homedir(), '.dossier');
20
27
  exports.CONFIG_DIR = CONFIG_DIR;
21
28
  const CONFIG_FILE = node_path_1.default.join(CONFIG_DIR, 'config.json');
@@ -84,4 +91,124 @@ function setConfig(key, value) {
84
91
  config[key] = value;
85
92
  return saveConfig(config);
86
93
  }
94
+ /**
95
+ * Load project-level .dossierrc.json by walking up from cwd.
96
+ */
97
+ function loadProjectConfig() {
98
+ let dir = process.cwd();
99
+ const root = node_path_1.default.parse(dir).root;
100
+ while (dir !== root) {
101
+ const rcFile = node_path_1.default.join(dir, '.dossierrc.json');
102
+ if (node_fs_1.default.existsSync(rcFile)) {
103
+ try {
104
+ return JSON.parse(node_fs_1.default.readFileSync(rcFile, 'utf8'));
105
+ }
106
+ catch {
107
+ console.error(`⚠️ Warning: Invalid .dossierrc.json at ${rcFile}`);
108
+ return null;
109
+ }
110
+ }
111
+ dir = node_path_1.default.dirname(dir);
112
+ }
113
+ return null;
114
+ }
115
+ /**
116
+ * Resolve all configured registries, merging user + project config.
117
+ * Resolution priority:
118
+ * 1. CLI --registry flag (handled by caller)
119
+ * 2. DOSSIER_REGISTRY_URL env var → virtual "env" registry
120
+ * 3. Project-level .dossierrc.json
121
+ * 4. User-level ~/.dossier/config.json
122
+ * 5. Hardcoded default (public registry)
123
+ */
124
+ function resolveRegistries() {
125
+ const userConfig = loadConfig();
126
+ const projectConfig = loadProjectConfig();
127
+ // Merge registries: project overlays user (project wins on name conflicts)
128
+ const merged = {};
129
+ if (userConfig.registries) {
130
+ for (const [name, entry] of Object.entries(userConfig.registries)) {
131
+ merged[name] = entry;
132
+ }
133
+ }
134
+ if (projectConfig?.registries) {
135
+ for (const [name, entry] of Object.entries(projectConfig.registries)) {
136
+ if (name in merged) {
137
+ // Project config cannot override user-configured registries (credential exfiltration vector)
138
+ continue;
139
+ }
140
+ merged[name] = entry;
141
+ }
142
+ }
143
+ // DOSSIER_REGISTRY_URL env var creates a virtual "env" registry
144
+ const envUrl = process.env.DOSSIER_REGISTRY_URL;
145
+ if (envUrl) {
146
+ merged.env = { url: envUrl };
147
+ }
148
+ // If no registries configured at all, use hardcoded default
149
+ if (Object.keys(merged).length === 0) {
150
+ return [{ name: 'public', url: DEFAULT_REGISTRY_URL }];
151
+ }
152
+ return Object.entries(merged).map(([name, entry]) => ({
153
+ name,
154
+ url: entry.url,
155
+ readonly: entry.readonly,
156
+ }));
157
+ }
158
+ /**
159
+ * Resolve which single registry to use for write operations.
160
+ * Priority: --registry flag > defaultRegistry (project > user) > first registry
161
+ */
162
+ function resolveWriteRegistry(registryFlag) {
163
+ const registries = resolveRegistries();
164
+ if (registryFlag) {
165
+ const found = registries.find((r) => r.name === registryFlag);
166
+ if (!found) {
167
+ const names = registries.map((r) => r.name).join(', ');
168
+ throw new Error(`Registry '${registryFlag}' not found. Available: ${names}`);
169
+ }
170
+ if (found.readonly) {
171
+ throw new Error(`Registry '${registryFlag}' is read-only`);
172
+ }
173
+ return found;
174
+ }
175
+ // Check defaultRegistry in project config first, then user config
176
+ const projectConfig = loadProjectConfig();
177
+ const userConfig = loadConfig();
178
+ const defaultName = projectConfig?.defaultRegistry || userConfig.defaultRegistry;
179
+ if (defaultName) {
180
+ const found = registries.find((r) => r.name === defaultName);
181
+ if (found) {
182
+ if (found.readonly) {
183
+ throw new Error(`Default registry '${defaultName}' is read-only`);
184
+ }
185
+ return found;
186
+ }
187
+ }
188
+ // Find first registry marked as default
189
+ for (const reg of registries) {
190
+ const allConfigs = { ...userConfig.registries, ...projectConfig?.registries };
191
+ const entry = allConfigs[reg.name];
192
+ if (entry?.default && !reg.readonly) {
193
+ return reg;
194
+ }
195
+ }
196
+ // Fall back to first non-readonly registry
197
+ const writable = registries.find((r) => !r.readonly);
198
+ if (writable)
199
+ return writable;
200
+ throw new Error('No writable registry configured. All registries are read-only.');
201
+ }
202
+ /**
203
+ * Resolve a single registry by name (for auth commands).
204
+ */
205
+ function resolveRegistryByName(name) {
206
+ const registries = resolveRegistries();
207
+ const found = registries.find((r) => r.name === name);
208
+ if (!found) {
209
+ const names = registries.map((r) => r.name).join(', ');
210
+ throw new Error(`Registry '${name}' not found. Available: ${names}`);
211
+ }
212
+ return found;
213
+ }
87
214
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAsFD,0CAAe;AACf,gCAAU;AACV,gCAAU;AACV,8BAAS;AACT,8BAAS;AAxFX,sDAAyB;AACzB,sDAAyB;AACzB,0DAA6B;AAS7B,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AA8ErD,gCAAU;AA7EZ,MAAM,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AA8EvD,kCAAW;AA5Eb,MAAM,cAAc,GAAkB;IACpC,UAAU,EAAE,MAAM;IAClB,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,IAAI;CACf,CAAC;AAyEA,wCAAc;AAvEhB;;GAEG;AACH,SAAS,eAAe;IACtB,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,iBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,iBAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEtC,+CAA+C;QAC/C,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,MAAqB;IACvC,IAAI,CAAC;QACH,eAAe,EAAE,CAAC;QAClB,iBAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;YAC7D,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAChF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW,EAAE,KAAc;IAC5C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Credential storage for Dossier registry authentication.
3
- * Stores credentials at ~/.dossier/credentials.json with secure file permissions.
3
+ * Stores per-registry credentials at ~/.dossier/credentials.json with secure file permissions.
4
+ * Auto-migrates old flat format to keyed-by-registry format.
4
5
  */
5
6
  export interface Credentials {
6
7
  token: string;
@@ -10,20 +11,25 @@ export interface Credentials {
10
11
  }
11
12
  declare const CREDENTIALS_FILE: string;
12
13
  /**
13
- * Save credentials to file with secure permissions (0600).
14
+ * Save credentials for a specific registry.
14
15
  */
15
- declare function saveCredentials(credentials: Credentials): void;
16
+ declare function saveCredentials(credentials: Credentials, registryName?: string): void;
16
17
  /**
17
- * Load credentials from file.
18
+ * Load credentials for a specific registry.
19
+ * Falls back to "public" for backward compatibility.
18
20
  */
19
- declare function loadCredentials(): Credentials | null;
21
+ declare function loadCredentials(registryName?: string): Credentials | null;
20
22
  /**
21
- * Delete the credentials file.
23
+ * Delete credentials for a specific registry, or all if no name given.
22
24
  */
23
- declare function deleteCredentials(): boolean;
25
+ declare function deleteCredentials(registryName?: string): boolean;
24
26
  /**
25
27
  * Check if credentials are expired.
26
28
  */
27
29
  declare function isExpired(credentials: Pick<Credentials, 'expiresAt'>): boolean;
28
- export { CREDENTIALS_FILE, saveCredentials, loadCredentials, deleteCredentials, isExpired };
30
+ /**
31
+ * List all registries that have stored credentials.
32
+ */
33
+ declare function listCredentialRegistries(): string[];
34
+ export { CREDENTIALS_FILE, saveCredentials, loadCredentials, deleteCredentials, isExpired, listCredentialRegistries, };
29
35
  //# sourceMappingURL=credentials.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,QAAA,MAAM,gBAAgB,QAA4C,CAAC;AAWnE;;GAEG;AACH,iBAAS,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CASvD;AAED;;GAEG;AACH,iBAAS,eAAe,IAAI,WAAW,GAAG,IAAI,CA8B7C;AAED;;GAEG;AACH,iBAAS,iBAAiB,IAAI,OAAO,CAMpC;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,OAAO,CAUvE;AAED,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAID,QAAA,MAAM,gBAAgB,QAA4C,CAAC;AA8GnE;;GAEG;AACH,iBAAS,eAAe,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,SAAW,GAAG,IAAI,CAIhF;AAED;;;GAGG;AACH,iBAAS,eAAe,CAAC,YAAY,SAAW,GAAG,WAAW,GAAG,IAAI,CAGpE;AAED;;GAEG;AACH,iBAAS,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAiBzD;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,OAAO,CASvE;AAED;;GAEG;AACH,iBAAS,wBAAwB,IAAI,MAAM,EAAE,CAG5C;AAED,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,wBAAwB,GACzB,CAAC"}
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Credential storage for Dossier registry authentication.
4
- * Stores credentials at ~/.dossier/credentials.json with secure file permissions.
4
+ * Stores per-registry credentials at ~/.dossier/credentials.json with secure file permissions.
5
+ * Auto-migrates old flat format to keyed-by-registry format.
5
6
  */
6
7
  var __importDefault = (this && this.__importDefault) || function (mod) {
7
8
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -12,6 +13,7 @@ exports.saveCredentials = saveCredentials;
12
13
  exports.loadCredentials = loadCredentials;
13
14
  exports.deleteCredentials = deleteCredentials;
14
15
  exports.isExpired = isExpired;
16
+ exports.listCredentialRegistries = listCredentialRegistries;
15
17
  const node_fs_1 = __importDefault(require("node:fs"));
16
18
  const node_path_1 = __importDefault(require("node:path"));
17
19
  const config_1 = require("./config");
@@ -26,22 +28,9 @@ function ensureConfigDir() {
26
28
  }
27
29
  }
28
30
  /**
29
- * Save credentials to file with secure permissions (0600).
31
+ * Read and parse the credentials file, returning the raw JSON.
30
32
  */
31
- function saveCredentials(credentials) {
32
- ensureConfigDir();
33
- const data = {
34
- token: credentials.token,
35
- username: credentials.username,
36
- orgs: credentials.orgs || [],
37
- expires_at: credentials.expiresAt || null,
38
- };
39
- node_fs_1.default.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });
40
- }
41
- /**
42
- * Load credentials from file.
43
- */
44
- function loadCredentials() {
33
+ function readCredentialsFile() {
45
34
  if (!node_fs_1.default.existsSync(CREDENTIALS_FILE)) {
46
35
  return null;
47
36
  }
@@ -54,31 +43,117 @@ function loadCredentials() {
54
43
  `Expected 0600. Credentials may have been compromised. Fixing permissions.`);
55
44
  node_fs_1.default.chmodSync(CREDENTIALS_FILE, 0o600);
56
45
  }
57
- const raw = node_fs_1.default.readFileSync(CREDENTIALS_FILE, 'utf8');
58
- const data = JSON.parse(raw);
59
- if (!data.token || !data.username) {
60
- return null;
61
- }
62
- return {
63
- token: data.token,
64
- username: data.username,
65
- orgs: data.orgs || [],
66
- expiresAt: data.expires_at || null,
67
- };
46
+ return JSON.parse(node_fs_1.default.readFileSync(CREDENTIALS_FILE, 'utf8'));
68
47
  }
69
48
  catch {
70
49
  return null;
71
50
  }
72
51
  }
73
52
  /**
74
- * Delete the credentials file.
53
+ * Detect whether the credentials file uses old flat format.
54
+ * Old format has `token` and `username` at the top level.
75
55
  */
76
- function deleteCredentials() {
77
- if (node_fs_1.default.existsSync(CREDENTIALS_FILE)) {
78
- node_fs_1.default.unlinkSync(CREDENTIALS_FILE);
79
- return true;
56
+ function isOldFormat(data) {
57
+ return typeof data.token === 'string' && typeof data.username === 'string';
58
+ }
59
+ /**
60
+ * Load the full credentials store, auto-migrating old format if needed.
61
+ */
62
+ function loadCredentialsStore() {
63
+ // Check env var first — creates virtual credentials for "env" registry
64
+ const envToken = process.env.DOSSIER_REGISTRY_TOKEN;
65
+ const raw = readCredentialsFile();
66
+ const store = {};
67
+ if (raw) {
68
+ if (isOldFormat(raw)) {
69
+ // Auto-migrate: flat → keyed by "public"
70
+ store.public = {
71
+ token: raw.token,
72
+ username: raw.username,
73
+ orgs: raw.orgs || [],
74
+ expiresAt: raw.expires_at || null,
75
+ };
76
+ // Write back migrated format
77
+ saveCredentialsStore(store);
78
+ }
79
+ else {
80
+ // New format: each key is a registry name
81
+ for (const [name, value] of Object.entries(raw)) {
82
+ const entry = value;
83
+ if (entry && typeof entry.token === 'string' && typeof entry.username === 'string') {
84
+ store[name] = {
85
+ token: entry.token,
86
+ username: entry.username,
87
+ orgs: entry.orgs || [],
88
+ expiresAt: entry.expires_at || entry.expiresAt || null,
89
+ };
90
+ }
91
+ }
92
+ }
93
+ }
94
+ if (envToken) {
95
+ store.env = {
96
+ token: envToken,
97
+ username: process.env.DOSSIER_REGISTRY_USER || 'token-auth',
98
+ orgs: process.env.DOSSIER_REGISTRY_ORGS ? process.env.DOSSIER_REGISTRY_ORGS.split(',') : [],
99
+ expiresAt: null,
100
+ };
101
+ }
102
+ return store;
103
+ }
104
+ /**
105
+ * Save the full credentials store to file.
106
+ */
107
+ function saveCredentialsStore(store) {
108
+ ensureConfigDir();
109
+ const data = {};
110
+ for (const [name, creds] of Object.entries(store)) {
111
+ if (name === 'env')
112
+ continue; // Don't persist env-var credentials
113
+ data[name] = {
114
+ token: creds.token,
115
+ username: creds.username,
116
+ orgs: creds.orgs || [],
117
+ expires_at: creds.expiresAt || null,
118
+ };
119
+ }
120
+ node_fs_1.default.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });
121
+ }
122
+ /**
123
+ * Save credentials for a specific registry.
124
+ */
125
+ function saveCredentials(credentials, registryName = 'public') {
126
+ const store = loadCredentialsStore();
127
+ store[registryName] = credentials;
128
+ saveCredentialsStore(store);
129
+ }
130
+ /**
131
+ * Load credentials for a specific registry.
132
+ * Falls back to "public" for backward compatibility.
133
+ */
134
+ function loadCredentials(registryName = 'public') {
135
+ const store = loadCredentialsStore();
136
+ return store[registryName] || null;
137
+ }
138
+ /**
139
+ * Delete credentials for a specific registry, or all if no name given.
140
+ */
141
+ function deleteCredentials(registryName) {
142
+ if (!registryName) {
143
+ // Delete entire file (backward compat)
144
+ if (node_fs_1.default.existsSync(CREDENTIALS_FILE)) {
145
+ node_fs_1.default.unlinkSync(CREDENTIALS_FILE);
146
+ return true;
147
+ }
148
+ return false;
149
+ }
150
+ const store = loadCredentialsStore();
151
+ if (!(registryName in store)) {
152
+ return false;
80
153
  }
81
- return false;
154
+ delete store[registryName];
155
+ saveCredentialsStore(store);
156
+ return true;
82
157
  }
83
158
  /**
84
159
  * Check if credentials are expired.
@@ -87,12 +162,17 @@ function isExpired(credentials) {
87
162
  if (!credentials.expiresAt) {
88
163
  return false;
89
164
  }
90
- try {
91
- const expires = new Date(credentials.expiresAt);
92
- return Date.now() > expires.getTime();
93
- }
94
- catch {
95
- return false;
165
+ const expires = new Date(credentials.expiresAt);
166
+ if (Number.isNaN(expires.getTime())) {
167
+ return true;
96
168
  }
169
+ return Date.now() > expires.getTime();
170
+ }
171
+ /**
172
+ * List all registries that have stored credentials.
173
+ */
174
+ function listCredentialRegistries() {
175
+ const store = loadCredentialsStore();
176
+ return Object.keys(store);
97
177
  }
98
178
  //# sourceMappingURL=credentials.js.map