@eide/foir-cli 0.1.28 → 0.1.30

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.
@@ -1 +1 @@
1
- {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/commands/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AActD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAkKN"}
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/commands/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAetD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CA6NN"}
@@ -2,7 +2,8 @@ import { withErrorHandler } from '../lib/errors.js';
2
2
  import { createClient } from '../lib/client.js';
3
3
  import { formatOutput, formatList, success } from '../lib/output.js';
4
4
  import { parseInputData, isUUID } from '../lib/input.js';
5
- import { ListExtensionsDocument, GetExtensionDocument, GetExtensionByKeyDocument, RegisterExtensionDocument, TriggerExtensionSyncDocument, InstallExtensionDocument, } from '../graphql/generated.js';
5
+ import { ListExtensionsDocument, GetExtensionDocument, GetExtensionByKeyDocument, RegisterExtensionDocument, TriggerExtensionSyncDocument, InstallExtensionDocument, UnregisterExtensionDocument, // Still used by uninstall command
6
+ } from '../graphql/generated.js';
6
7
  export function registerExtensionsCommands(program, globalOpts) {
7
8
  const extensions = program
8
9
  .command('extensions')
@@ -80,10 +81,11 @@ export function registerExtensionsCommands(program, globalOpts) {
80
81
  .option('-d, --data <json>', 'Extension manifest as JSON')
81
82
  .option('-f, --file <path>', 'Read manifest from file (.ts, .js, or .json)')
82
83
  .option('-k, --key <key>', 'Extension key (overrides manifest)')
84
+ .option('--force', 'Uninstall existing extension before installing (fresh install)')
83
85
  .addHelpText('after', `
84
86
  Examples:
85
87
  $ foir extensions install -f install.config.ts
86
- $ foir extensions install -f install.json
88
+ $ foir extensions install -f install.json --force
87
89
  $ foir extensions install -d '{"key":"my-ext","name":"My Extension",...}'
88
90
  `)
89
91
  .action(withErrorHandler(globalOpts, async (cmdOpts) => {
@@ -94,6 +96,10 @@ Examples:
94
96
  if (cmdOpts.key) {
95
97
  input.key = cmdOpts.key;
96
98
  }
99
+ // Add force flag to input if --force is specified
100
+ if (cmdOpts.force) {
101
+ input.force = true;
102
+ }
97
103
  const data = await client.request(InstallExtensionDocument, { input });
98
104
  const result = data.installExtension;
99
105
  if (opts.json || opts.jsonl || opts.quiet) {
@@ -125,6 +131,52 @@ Examples:
125
131
  }
126
132
  }
127
133
  }));
134
+ // uninstall
135
+ extensions
136
+ .command('uninstall <keyOrId>')
137
+ .description('Uninstall an extension by key or ID')
138
+ .addHelpText('after', `
139
+ Examples:
140
+ $ foir extensions uninstall tilly
141
+ $ foir extensions uninstall c7a3f8b0-1234-5678-90ab-cdef12345678
142
+ `)
143
+ .action(withErrorHandler(globalOpts, async (keyOrId) => {
144
+ const opts = globalOpts();
145
+ const client = await createClient(opts);
146
+ // Resolve key to ID if needed
147
+ let extensionId;
148
+ let extensionKey;
149
+ if (isUUID(keyOrId)) {
150
+ extensionId = keyOrId;
151
+ const data = await client.request(GetExtensionDocument, { id: keyOrId });
152
+ if (!data.extension) {
153
+ throw new Error(`Extension "${keyOrId}" not found.`);
154
+ }
155
+ extensionKey = data.extension.key;
156
+ }
157
+ else {
158
+ const data = await client.request(GetExtensionByKeyDocument, {
159
+ key: keyOrId,
160
+ });
161
+ if (!data.extensionByKey) {
162
+ throw new Error(`Extension "${keyOrId}" not found.`);
163
+ }
164
+ extensionId = data.extensionByKey.id;
165
+ extensionKey = data.extensionByKey.key;
166
+ }
167
+ // Unregister the extension
168
+ await client.request(UnregisterExtensionDocument, { id: extensionId });
169
+ if (opts.json || opts.jsonl) {
170
+ formatOutput({ success: true, extensionId, extensionKey }, opts);
171
+ }
172
+ else if (opts.quiet) {
173
+ console.log(extensionId);
174
+ }
175
+ else {
176
+ success(`Uninstalled extension "${extensionKey}"`);
177
+ console.log(` Extension ID: ${extensionId}`);
178
+ }
179
+ }));
128
180
  // sync
129
181
  extensions
130
182
  .command('sync <id>')
@@ -1859,6 +1859,8 @@ export type InstallExtensionInput = {
1859
1859
  description?: InputMaybe<Scalars['String']['input']>;
1860
1860
  direction?: InputMaybe<Scalars['String']['input']>;
1861
1861
  extensionType?: InputMaybe<Scalars['String']['input']>;
1862
+ /** If true, delete existing extension before installing (force reinstall) */
1863
+ force?: InputMaybe<Scalars['Boolean']['input']>;
1862
1864
  key: Scalars['String']['input'];
1863
1865
  models?: InputMaybe<Array<InstallExtensionModelInput>>;
1864
1866
  name: Scalars['String']['input'];
@@ -6674,6 +6676,12 @@ export type InstallExtensionMutation = {
6674
6676
  } | null;
6675
6677
  };
6676
6678
  };
6679
+ export type UnregisterExtensionMutationVariables = Exact<{
6680
+ id: Scalars['ID']['input'];
6681
+ }>;
6682
+ export type UnregisterExtensionMutation = {
6683
+ unregisterExtension: boolean;
6684
+ };
6677
6685
  export type ListFilesQueryVariables = Exact<{
6678
6686
  folder?: InputMaybe<Scalars['String']['input']>;
6679
6687
  mimeType?: InputMaybe<Scalars['String']['input']>;
@@ -8168,6 +8176,7 @@ export declare const GetExtensionByKeyDocument: DocumentNode<GetExtensionByKeyQu
8168
8176
  export declare const RegisterExtensionDocument: DocumentNode<RegisterExtensionMutation, RegisterExtensionMutationVariables>;
8169
8177
  export declare const TriggerExtensionSyncDocument: DocumentNode<TriggerExtensionSyncMutation, TriggerExtensionSyncMutationVariables>;
8170
8178
  export declare const InstallExtensionDocument: DocumentNode<InstallExtensionMutation, InstallExtensionMutationVariables>;
8179
+ export declare const UnregisterExtensionDocument: DocumentNode<UnregisterExtensionMutation, UnregisterExtensionMutationVariables>;
8171
8180
  export declare const ListFilesDocument: DocumentNode<ListFilesQuery, ListFilesQueryVariables>;
8172
8181
  export declare const GetFileDocument: DocumentNode<GetFileQuery, GetFileQueryVariables>;
8173
8182
  export declare const FileStorageUsageDocument: DocumentNode<FileStorageUsageQuery, FileStorageUsageQueryVariables>;