@skrr-ai/cli 0.1.46 → 0.1.48
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 +1 -1
- package/dist/base-command.d.ts +18 -0
- package/dist/base-command.js +61 -1
- package/dist/commands/agents/chat.d.ts +21 -0
- package/dist/commands/agents/chat.js +26 -9
- package/dist/commands/balance/usage/breakdown.d.ts +14 -0
- package/dist/commands/balance/usage/breakdown.js +68 -0
- package/dist/commands/balance/usage.js +24 -0
- package/dist/commands/code/handover.d.ts +2 -2
- package/dist/commands/code/handover.js +12 -13
- package/dist/commands/code/install.js +31 -0
- package/dist/commands/code/update.d.ts +46 -0
- package/dist/commands/code/update.js +242 -0
- package/dist/commands/commerce/entitlements/explain.d.ts +22 -0
- package/dist/commands/commerce/entitlements/explain.js +40 -0
- package/dist/commands/commerce/incidents/audit.d.ts +20 -0
- package/dist/commands/commerce/incidents/audit.js +37 -0
- package/dist/commands/commerce/incidents/list.d.ts +22 -0
- package/dist/commands/commerce/incidents/list.js +49 -0
- package/dist/commands/commerce/incidents/resolve.d.ts +23 -0
- package/dist/commands/commerce/incidents/resolve.js +45 -0
- package/dist/commands/commerce/incidents/retry.d.ts +22 -0
- package/dist/commands/commerce/incidents/retry.js +45 -0
- package/dist/commands/commerce/incidents/show.d.ts +13 -0
- package/dist/commands/commerce/incidents/show.js +30 -0
- package/dist/commands/commerce/offers/approve.d.ts +17 -0
- package/dist/commands/commerce/offers/approve.js +33 -0
- package/dist/commands/commerce/offers/create.d.ts +18 -0
- package/dist/commands/commerce/offers/create.js +34 -0
- package/dist/commands/commerce/offers/publish.d.ts +13 -0
- package/dist/commands/commerce/offers/publish.js +28 -0
- package/dist/commands/commerce/offers/retire.d.ts +17 -0
- package/dist/commands/commerce/offers/retire.js +32 -0
- package/dist/commands/commerce/offers/validate.d.ts +18 -0
- package/dist/commands/commerce/offers/validate.js +33 -0
- package/dist/commands/commerce/products/create.d.ts +10 -0
- package/dist/commands/commerce/products/create.js +25 -0
- package/dist/commands/commerce/promotions/redeem.d.ts +13 -0
- package/dist/commands/commerce/promotions/redeem.js +32 -0
- package/dist/commands/commerce/terms/accept.d.ts +18 -0
- package/dist/commands/commerce/terms/accept.js +39 -0
- package/dist/commands/commerce/terms/show.d.ts +10 -0
- package/dist/commands/commerce/terms/show.js +34 -0
- package/dist/commands/commerce/trials/conversion-preview.d.ts +18 -0
- package/dist/commands/commerce/trials/conversion-preview.js +39 -0
- package/dist/commands/commerce/trials/start.d.ts +23 -0
- package/dist/commands/commerce/trials/start.js +58 -0
- package/dist/commands/commitments/accounting.d.ts +39 -0
- package/dist/commands/commitments/accounting.js +116 -0
- package/dist/commands/commitments/action-history.d.ts +1 -0
- package/dist/commands/commitments/action-history.js +8 -1
- package/dist/commands/commitments/case.d.ts +1 -0
- package/dist/commands/commitments/case.js +19 -3
- package/dist/commands/commitments/cases.d.ts +1 -0
- package/dist/commands/commitments/cases.js +11 -1
- package/dist/commands/commitments/checks.d.ts +1 -0
- package/dist/commands/commitments/checks.js +5 -1
- package/dist/commands/commitments/cost.d.ts +62 -0
- package/dist/commands/commitments/cost.js +130 -0
- package/dist/commands/commitments/create.js +1 -1
- package/dist/commands/commitments/delete.d.ts +1 -0
- package/dist/commands/commitments/delete.js +56 -6
- package/dist/commands/commitments/feedback.js +9 -1
- package/dist/commands/commitments/handover.js +16 -0
- package/dist/commands/commitments/hypotheses.d.ts +1 -0
- package/dist/commands/commitments/hypotheses.js +17 -2
- package/dist/commands/commitments/links/list.js +4 -1
- package/dist/commands/commitments/liveness.d.ts +18 -0
- package/dist/commands/commitments/liveness.js +80 -0
- package/dist/commands/commitments/metrics.d.ts +1 -0
- package/dist/commands/commitments/metrics.js +8 -1
- package/dist/commands/commitments/next-tick.d.ts +39 -0
- package/dist/commands/commitments/next-tick.js +122 -0
- package/dist/commands/commitments/observations.d.ts +1 -0
- package/dist/commands/commitments/observations.js +19 -2
- package/dist/commands/commitments/pause.js +12 -0
- package/dist/commands/commitments/receipt.d.ts +2 -0
- package/dist/commands/commitments/receipt.js +16 -2
- package/dist/commands/commitments/remediation-proposal.js +6 -2
- package/dist/commands/commitments/remediation-proposals.js +5 -1
- package/dist/commands/commitments/restore.d.ts +25 -0
- package/dist/commands/commitments/restore.js +46 -0
- package/dist/commands/commitments/show.js +32 -0
- package/dist/commands/commitments/trigger-status.js +33 -0
- package/dist/commands/commitments/update.d.ts +1 -0
- package/dist/commands/commitments/update.js +31 -5
- package/dist/commands/commitments/wake-capabilities.d.ts +0 -1
- package/dist/commands/commitments/wake-capabilities.js +8 -4
- package/dist/commands/convos/handover.d.ts +1 -0
- package/dist/commands/convos/handover.js +4 -0
- package/dist/commands/daemon/index.js +2 -0
- package/dist/commands/daemon/update.d.ts +19 -0
- package/dist/commands/daemon/update.js +48 -0
- package/dist/commands/enterprise/budgets/create.d.ts +11 -0
- package/dist/commands/enterprise/budgets/create.js +27 -0
- package/dist/commands/enterprise/budgets/evaluate.d.ts +17 -0
- package/dist/commands/enterprise/budgets/evaluate.js +32 -0
- package/dist/commands/enterprise/budgets/publish.d.ts +14 -0
- package/dist/commands/enterprise/budgets/publish.js +30 -0
- package/dist/commands/enterprise/contracts/activate.d.ts +14 -0
- package/dist/commands/enterprise/contracts/activate.js +30 -0
- package/dist/commands/enterprise/contracts/create.d.ts +14 -0
- package/dist/commands/enterprise/contracts/create.js +32 -0
- package/dist/commands/enterprise/contracts/issue.d.ts +18 -0
- package/dist/commands/enterprise/contracts/issue.js +34 -0
- package/dist/commands/enterprise/domains/begin.d.ts +20 -0
- package/dist/commands/enterprise/domains/begin.js +39 -0
- package/dist/commands/enterprise/domains/verify.d.ts +14 -0
- package/dist/commands/enterprise/domains/verify.js +32 -0
- package/dist/commands/enterprise/external-config/activate.d.ts +22 -0
- package/dist/commands/enterprise/external-config/activate.js +49 -0
- package/dist/commands/enterprise/external-config/set.d.ts +25 -0
- package/dist/commands/enterprise/external-config/set.js +123 -0
- package/dist/commands/enterprise/external-config/show.d.ts +12 -0
- package/dist/commands/enterprise/external-config/show.js +39 -0
- package/dist/commands/enterprise/external-config/suspend.d.ts +13 -0
- package/dist/commands/enterprise/external-config/suspend.js +41 -0
- package/dist/commands/enterprise/finance/close-snapshot.d.ts +11 -0
- package/dist/commands/enterprise/finance/close-snapshot.js +28 -0
- package/dist/commands/enterprise/finance/record-document.d.ts +18 -0
- package/dist/commands/enterprise/finance/record-document.js +35 -0
- package/dist/commands/enterprise/profile.d.ts +20 -0
- package/dist/commands/enterprise/profile.js +38 -0
- package/dist/commands/login.d.ts +13 -0
- package/dist/commands/login.js +77 -0
- package/dist/commands/machines/dedicated/index.js +3 -0
- package/dist/commands/machines/dedicated/service/apply.d.ts +23 -0
- package/dist/commands/machines/dedicated/service/apply.js +99 -0
- package/dist/commands/machines/dedicated/service/approve.d.ts +23 -0
- package/dist/commands/machines/dedicated/service/approve.js +52 -0
- package/dist/commands/machines/dedicated/service/create.d.ts +55 -0
- package/dist/commands/machines/dedicated/service/create.js +222 -0
- package/dist/commands/machines/dedicated/service/edit.d.ts +30 -0
- package/dist/commands/machines/dedicated/service/edit.js +146 -0
- package/dist/commands/machines/dedicated/service/exec.d.ts +26 -0
- package/dist/commands/machines/dedicated/service/exec.js +92 -0
- package/dist/commands/machines/dedicated/service/export.d.ts +29 -0
- package/dist/commands/machines/dedicated/service/export.js +106 -0
- package/dist/commands/machines/dedicated/service/index.d.ts +14 -0
- package/dist/commands/machines/dedicated/service/index.js +49 -0
- package/dist/commands/machines/dedicated/service/logs.d.ts +33 -0
- package/dist/commands/machines/dedicated/service/logs.js +148 -0
- package/dist/commands/machines/dedicated/service/ls.d.ts +20 -0
- package/dist/commands/machines/dedicated/service/ls.js +80 -0
- package/dist/commands/machines/dedicated/service/restart.d.ts +14 -0
- package/dist/commands/machines/dedicated/service/restart.js +29 -0
- package/dist/commands/machines/dedicated/service/rm.d.ts +20 -0
- package/dist/commands/machines/dedicated/service/rm.js +33 -0
- package/dist/commands/machines/dedicated/service/secret/index.d.ts +14 -0
- package/dist/commands/machines/dedicated/service/secret/index.js +25 -0
- package/dist/commands/machines/dedicated/service/secret/rm.d.ts +22 -0
- package/dist/commands/machines/dedicated/service/secret/rm.js +54 -0
- package/dist/commands/machines/dedicated/service/secret/set.d.ts +22 -0
- package/dist/commands/machines/dedicated/service/secret/set.js +93 -0
- package/dist/commands/machines/dedicated/service/start.d.ts +14 -0
- package/dist/commands/machines/dedicated/service/start.js +29 -0
- package/dist/commands/machines/dedicated/service/status.d.ts +21 -0
- package/dist/commands/machines/dedicated/service/status.js +85 -0
- package/dist/commands/machines/dedicated/service/stop.d.ts +20 -0
- package/dist/commands/machines/dedicated/service/stop.js +35 -0
- package/dist/commands/machines/dedicated/service/top.d.ts +22 -0
- package/dist/commands/machines/dedicated/service/top.js +120 -0
- package/dist/commands/machines/dedicated/sign-in-status.d.ts +22 -0
- package/dist/commands/machines/dedicated/sign-in-status.js +79 -0
- package/dist/commands/machines/dedicated/ssh-config.d.ts +28 -0
- package/dist/commands/machines/dedicated/ssh-config.js +66 -0
- package/dist/commands/machines/dedicated/ssh-proxy.d.ts +22 -0
- package/dist/commands/machines/dedicated/ssh-proxy.js +62 -0
- package/dist/commands/machines/dedicated/ssh.d.ts +29 -0
- package/dist/commands/machines/dedicated/ssh.js +121 -0
- package/dist/commands/native/allow-all.d.ts +14 -0
- package/dist/commands/native/allow-all.js +25 -0
- package/dist/commands/native/allow.d.ts +24 -0
- package/dist/commands/native/allow.js +45 -0
- package/dist/commands/native/deny.d.ts +24 -0
- package/dist/commands/native/deny.js +43 -0
- package/dist/commands/native/disable.d.ts +17 -0
- package/dist/commands/native/disable.js +28 -0
- package/dist/commands/native/enable.d.ts +12 -0
- package/dist/commands/native/enable.js +29 -0
- package/dist/commands/native/list-apps.d.ts +19 -0
- package/dist/commands/native/list-apps.js +30 -0
- package/dist/commands/native/restrict-to.d.ts +22 -0
- package/dist/commands/native/restrict-to.js +41 -0
- package/dist/commands/native/status.d.ts +19 -0
- package/dist/commands/native/status.js +33 -0
- package/dist/commands/native.d.ts +39 -0
- package/dist/commands/native.js +76 -0
- package/dist/commands/service/index.d.ts +14 -0
- package/dist/commands/service/index.js +31 -0
- package/dist/commands/service/logs.d.ts +18 -0
- package/dist/commands/service/logs.js +53 -0
- package/dist/commands/service/ls.d.ts +13 -0
- package/dist/commands/service/ls.js +48 -0
- package/dist/commands/service/propose.d.ts +34 -0
- package/dist/commands/service/propose.js +113 -0
- package/dist/commands/service/status.d.ts +17 -0
- package/dist/commands/service/status.js +56 -0
- package/dist/commands/spaces/auto-executor/runs.d.ts +13 -0
- package/dist/commands/spaces/auto-executor/runs.js +56 -0
- package/dist/commands/spaces/briefs/get.js +8 -0
- package/dist/commands/spaces/briefs/list.js +2 -0
- package/dist/commands/spaces/briefs/set.d.ts +3 -0
- package/dist/commands/spaces/briefs/set.js +78 -13
- package/dist/commands/spaces/expertise-suggestions.d.ts +12 -0
- package/dist/commands/spaces/expertise-suggestions.js +71 -0
- package/dist/commands/spaces/members/add.d.ts +1 -0
- package/dist/commands/spaces/members/add.js +11 -3
- package/dist/commands/spaces/members/list.js +11 -0
- package/dist/commands/store/governance/artifacts.d.ts +25 -0
- package/dist/commands/store/governance/artifacts.js +55 -0
- package/dist/commands/store/governance/assign.d.ts +16 -0
- package/dist/commands/store/governance/assign.js +54 -0
- package/dist/commands/store/governance/create-license.d.ts +18 -0
- package/dist/commands/store/governance/create-license.js +35 -0
- package/dist/commands/store/governance/install-plan.d.ts +25 -0
- package/dist/commands/store/governance/install-plan.js +56 -0
- package/dist/commands/store/governance/license-policy.d.ts +30 -0
- package/dist/commands/store/governance/license-policy.js +69 -0
- package/dist/commands/store/governance/policy.d.ts +25 -0
- package/dist/commands/store/governance/policy.js +65 -0
- package/dist/commands/store/governance/publish-release.d.ts +17 -0
- package/dist/commands/store/governance/publish-release.js +34 -0
- package/dist/commands/tasks/assign.d.ts +9 -0
- package/dist/commands/tasks/assign.js +108 -1
- package/dist/commands/tasks/deliverable/add.d.ts +15 -0
- package/dist/commands/tasks/deliverable/add.js +174 -0
- package/dist/commands/tasks/deliverable/archive.d.ts +35 -0
- package/dist/commands/tasks/deliverable/archive.js +205 -0
- package/dist/commands/tasks/labels/detach.js +3 -0
- package/dist/commands/tasks/labels/suggest.d.ts +24 -0
- package/dist/commands/tasks/labels/suggest.js +69 -0
- package/dist/commands/tasks/list.d.ts +16 -2
- package/dist/commands/tasks/list.js +100 -24
- package/dist/commands/tasks/show.d.ts +23 -0
- package/dist/commands/tasks/show.js +51 -1
- package/dist/commands/wiki/rm.d.ts +22 -1
- package/dist/commands/wiki/rm.js +52 -3
- package/dist/lib/agentic-stream.js +10 -2
- package/dist/lib/assignee-resolver.d.ts +22 -0
- package/dist/lib/assignee-resolver.js +26 -0
- package/dist/lib/balance.d.ts +6 -1
- package/dist/lib/balance.js +15 -0
- package/dist/lib/code-handover.d.ts +0 -10
- package/dist/lib/code-handover.js +20 -5
- package/dist/lib/commerce-command.d.ts +48 -0
- package/dist/lib/commerce-command.js +70 -0
- package/dist/lib/commerce.d.ts +93 -0
- package/dist/lib/commerce.js +129 -0
- package/dist/lib/commitment-product.js +1 -1
- package/dist/lib/commitments.d.ts +202 -29
- package/dist/lib/commitments.js +300 -33
- package/dist/lib/dedicated-lease-command.js +10 -0
- package/dist/lib/dedicated-machines.d.ts +37 -0
- package/dist/lib/dedicated-machines.js +47 -0
- package/dist/lib/dedicated-service-command.d.ts +60 -0
- package/dist/lib/dedicated-service-command.js +182 -0
- package/dist/lib/dedicated-service.d.ts +342 -0
- package/dist/lib/dedicated-service.js +741 -0
- package/dist/lib/dedicated-ssh.d.ts +136 -0
- package/dist/lib/dedicated-ssh.js +387 -0
- package/dist/lib/delegated-cli.js +51 -13
- package/dist/lib/enterprise-commerce.d.ts +67 -0
- package/dist/lib/enterprise-commerce.js +112 -0
- package/dist/lib/enterprise-external-configuration.d.ts +60 -0
- package/dist/lib/enterprise-external-configuration.js +58 -0
- package/dist/lib/first-party-harness.js +17 -3
- package/dist/lib/governed-store.d.ts +110 -0
- package/dist/lib/governed-store.js +79 -0
- package/dist/lib/guest-service-command.d.ts +16 -0
- package/dist/lib/guest-service-command.js +32 -0
- package/dist/lib/guest-service.d.ts +67 -0
- package/dist/lib/guest-service.js +112 -0
- package/dist/lib/prompt.d.ts +1 -0
- package/dist/lib/prompt.js +1 -0
- package/dist/lib/task-asset-upload.d.ts +20 -0
- package/dist/lib/task-asset-upload.js +30 -8
- package/dist/lib/task-extras.d.ts +23 -0
- package/dist/lib/task-extras.js +6 -0
- package/dist/lib/update-check.d.ts +80 -7
- package/dist/lib/update-check.js +365 -33
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonScopes.d.ts +9 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonScopes.js +10 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarness.d.ts +9 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarness.js +8 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +6 -5
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/messages.d.ts +16 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/messages.js +21 -4
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/spawnEnv.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/spawnEnv.js +24 -2
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonScopes.d.ts +9 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonScopes.js +10 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarness.d.ts +9 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarness.js +8 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/messages.d.ts +16 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/messages.js +20 -4
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/spawnEnv.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/spawnEnv.js +24 -2
- package/dist/node_modules/@skrr-ai/auth-core/package.json +1 -1
- package/dist/node_modules/@skrr-ai/data-provider/index.js +5067 -4821
- package/oclif.manifest.json +34877 -28659
- package/package.json +43 -1
|
@@ -45,6 +45,7 @@ class SpacesMembersAdd extends base_command_1.BaseCommand {
|
|
|
45
45
|
'<%= config.bin %> spaces members add <space-id> --user <user-id>',
|
|
46
46
|
'<%= config.bin %> spaces members add <space-id> --agent <agent-id> --role editor',
|
|
47
47
|
'<%= config.bin %> spaces members add <space-id> --agent <agent-id> --brief "Owns QA tasks"',
|
|
48
|
+
'<%= config.bin %> spaces members add <space-id> --agent <agent-id> --expertise browser --expertise frontend',
|
|
48
49
|
'<%= config.bin %> spaces members add <space-id> --user <user-id> --agent <agent-id> --json',
|
|
49
50
|
];
|
|
50
51
|
static args = {
|
|
@@ -67,6 +68,10 @@ class SpacesMembersAdd extends base_command_1.BaseCommand {
|
|
|
67
68
|
}),
|
|
68
69
|
brief: core_1.Flags.string({ description: 'Member brief to save for every added principal' }),
|
|
69
70
|
'brief-file': core_1.Flags.string({ description: 'Path to a markdown/text brief file' }),
|
|
71
|
+
expertise: core_1.Flags.string({
|
|
72
|
+
description: 'Domain label the added members are best suited for (repeatable, ≤20 items, ≤40 chars each)',
|
|
73
|
+
multiple: true,
|
|
74
|
+
}),
|
|
70
75
|
};
|
|
71
76
|
async run() {
|
|
72
77
|
this.requireAuth();
|
|
@@ -108,19 +113,22 @@ class SpacesMembersAdd extends base_command_1.BaseCommand {
|
|
|
108
113
|
public: Boolean(current.public),
|
|
109
114
|
publicAccessRoleId: current.publicAccessRoleId,
|
|
110
115
|
});
|
|
111
|
-
|
|
116
|
+
const expertise = flags.expertise;
|
|
117
|
+
if ((brief && brief.trim().length > 0) || (expertise && expertise.length > 0)) {
|
|
112
118
|
const saves = [
|
|
113
119
|
...userIds.map((principalId) => data_provider_1.dataService.upsertSpaceBrief({
|
|
114
120
|
spaceId: args.id,
|
|
115
121
|
principalType: 'user',
|
|
116
122
|
principalId,
|
|
117
|
-
content: brief,
|
|
123
|
+
content: brief && brief.trim().length > 0 ? brief : undefined,
|
|
124
|
+
expertise,
|
|
118
125
|
})),
|
|
119
126
|
...agentIds.map((principalId) => data_provider_1.dataService.upsertSpaceBrief({
|
|
120
127
|
spaceId: args.id,
|
|
121
128
|
principalType: 'agent',
|
|
122
129
|
principalId,
|
|
123
|
-
content: brief,
|
|
130
|
+
content: brief && brief.trim().length > 0 ? brief : undefined,
|
|
131
|
+
expertise,
|
|
124
132
|
})),
|
|
125
133
|
];
|
|
126
134
|
await Promise.all(saves);
|
|
@@ -22,8 +22,10 @@ class SpacesMembersList extends base_command_1.BaseCommand {
|
|
|
22
22
|
this.requireAuth();
|
|
23
23
|
const { args, flags } = await this.parse(SpacesMembersList);
|
|
24
24
|
let response;
|
|
25
|
+
let briefs = [];
|
|
25
26
|
try {
|
|
26
27
|
response = await data_provider_1.dataService.getResourcePermissions(data_provider_1.ResourceType.SPACE, args.id);
|
|
28
|
+
briefs = (await data_provider_1.dataService.listSpaceBriefs(args.id).catch(() => [])).filter((b) => Array.isArray(b.expertise) && b.expertise.length > 0);
|
|
27
29
|
}
|
|
28
30
|
catch (err) {
|
|
29
31
|
this.handleApiError(err);
|
|
@@ -41,14 +43,23 @@ class SpacesMembersList extends base_command_1.BaseCommand {
|
|
|
41
43
|
type: String(p.type ?? '-'),
|
|
42
44
|
name: String(p.name ?? p.email ?? '-'),
|
|
43
45
|
role: (0, space_members_1.spaceRoleLabel)(String(p.accessRoleId ?? '')),
|
|
46
|
+
expertise: expertiseForPrincipal(briefs, p),
|
|
44
47
|
id: (0, space_members_1.principalIdForDisplay)(p),
|
|
45
48
|
}));
|
|
46
49
|
(0, format_1.renderTable)(rows, [
|
|
47
50
|
{ key: 'type', header: 'TYPE' },
|
|
48
51
|
{ key: 'name', header: 'NAME', maxWidth: 36 },
|
|
49
52
|
{ key: 'role', header: 'ROLE' },
|
|
53
|
+
{ key: 'expertise', header: 'EXPERTISE', maxWidth: 32 },
|
|
50
54
|
{ key: 'id', header: 'ID', verbatim: true },
|
|
51
55
|
], (line) => this.log(line));
|
|
52
56
|
}
|
|
53
57
|
}
|
|
54
58
|
exports.default = SpacesMembersList;
|
|
59
|
+
/** Brief principalId can be an agent UUID or a Mongo _id; match against both. */
|
|
60
|
+
function expertiseForPrincipal(briefs, principal) {
|
|
61
|
+
const type = String(principal.type ?? '').toLowerCase();
|
|
62
|
+
const ids = new Set([principal.id, principal.idOnTheSource].filter((v) => v !== undefined).map(String));
|
|
63
|
+
const brief = briefs.find((b) => String(b.principalType ?? '').toLowerCase() === type && ids.has(String(b.principalId ?? '')));
|
|
64
|
+
return brief ? brief.expertise.join(', ') : '-';
|
|
65
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
/**
|
|
3
|
+
* `skrr store governance artifacts` — the catalogue, searched by what an
|
|
4
|
+
* artifact CAN DO rather than what it is called.
|
|
5
|
+
*
|
|
6
|
+
* Distinct from `skrr store browse`, which finds published agents to install.
|
|
7
|
+
* This searches every governed entity type by capability, permission,
|
|
8
|
+
* verified outcome and cost — the questions you ask when deciding what a
|
|
9
|
+
* workspace should be licensed for, not which agent you personally want.
|
|
10
|
+
*/
|
|
11
|
+
export default class StoreGovernanceArtifacts extends BaseCommand {
|
|
12
|
+
static description: string;
|
|
13
|
+
static examples: string[];
|
|
14
|
+
static flags: {
|
|
15
|
+
'entity-type': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
16
|
+
capability: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
17
|
+
permission: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
18
|
+
'verified-outcome': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
19
|
+
'min-cost-micros': import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
20
|
+
'max-cost-micros': import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
21
|
+
limit: import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
22
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
23
|
+
};
|
|
24
|
+
run(): Promise<void>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_command_1 = require("../../../base-command");
|
|
5
|
+
const governed_store_1 = require("../../../lib/governed-store");
|
|
6
|
+
/**
|
|
7
|
+
* `skrr store governance artifacts` — the catalogue, searched by what an
|
|
8
|
+
* artifact CAN DO rather than what it is called.
|
|
9
|
+
*
|
|
10
|
+
* Distinct from `skrr store browse`, which finds published agents to install.
|
|
11
|
+
* This searches every governed entity type by capability, permission,
|
|
12
|
+
* verified outcome and cost — the questions you ask when deciding what a
|
|
13
|
+
* workspace should be licensed for, not which agent you personally want.
|
|
14
|
+
*/
|
|
15
|
+
class StoreGovernanceArtifacts extends base_command_1.BaseCommand {
|
|
16
|
+
static description = 'Search the governed store catalogue by capability, permission, verified outcome and cost. For finding an agent to install, use `store browse`.';
|
|
17
|
+
static examples = [
|
|
18
|
+
'<%= config.bin %> store governance artifacts --capability code_review',
|
|
19
|
+
'<%= config.bin %> store governance artifacts --entity-type skill --max-cost-micros 500000',
|
|
20
|
+
];
|
|
21
|
+
static flags = {
|
|
22
|
+
'entity-type': core_1.Flags.string({
|
|
23
|
+
description: 'agent, skill, action, service, team, bundle, space_template or connector',
|
|
24
|
+
}),
|
|
25
|
+
capability: core_1.Flags.string({ description: 'Capability the artifact provides' }),
|
|
26
|
+
permission: core_1.Flags.string({ description: 'Permission the artifact requires' }),
|
|
27
|
+
'verified-outcome': core_1.Flags.string({ description: 'A verified outcome key it claims' }),
|
|
28
|
+
'min-cost-micros': core_1.Flags.integer({ description: 'Lower bound on cost, in micros' }),
|
|
29
|
+
'max-cost-micros': core_1.Flags.integer({ description: 'Upper bound on cost, in micros' }),
|
|
30
|
+
limit: core_1.Flags.integer({ description: 'Maximum rows (1-100)' }),
|
|
31
|
+
json: core_1.Flags.boolean({ description: 'Output as JSON' }),
|
|
32
|
+
};
|
|
33
|
+
async run() {
|
|
34
|
+
this.requireAuth();
|
|
35
|
+
const { flags } = await this.parse(StoreGovernanceArtifacts);
|
|
36
|
+
let result;
|
|
37
|
+
try {
|
|
38
|
+
result = await (0, governed_store_1.searchGovernedStoreArtifacts)({
|
|
39
|
+
entityType: flags['entity-type'],
|
|
40
|
+
capability: flags.capability,
|
|
41
|
+
permission: flags.permission,
|
|
42
|
+
verifiedOutcome: flags['verified-outcome'],
|
|
43
|
+
minCostMicros: flags['min-cost-micros'],
|
|
44
|
+
maxCostMicros: flags['max-cost-micros'],
|
|
45
|
+
limit: flags.limit,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
this.handleApiError(error);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.log(JSON.stringify(result, null, 2));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.default = StoreGovernanceArtifacts;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
/** Give a workspace-held license to a member or a Space. */
|
|
3
|
+
export default class StoreGovernanceAssign extends BaseCommand {
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static args: {
|
|
7
|
+
workspace: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
license: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
11
|
+
to: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
12
|
+
'assignment-id': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
13
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_command_1 = require("../../../base-command");
|
|
5
|
+
const governed_store_1 = require("../../../lib/governed-store");
|
|
6
|
+
/** Give a workspace-held license to a member or a Space. */
|
|
7
|
+
class StoreGovernanceAssign extends base_command_1.BaseCommand {
|
|
8
|
+
static description = 'Assign a workspace-held license to a member or a Space — who actually gets to run it.';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> store governance assign <workspace-id> --license <id> --to member:<user-id>',
|
|
11
|
+
'<%= config.bin %> store governance assign <workspace-id> --license <id> --to space:<space-id>',
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
workspace: core_1.Args.string({ description: 'Workspace id', required: true, ignoreStdin: true }),
|
|
15
|
+
};
|
|
16
|
+
static flags = {
|
|
17
|
+
license: core_1.Flags.string({ description: 'License to assign', required: true }),
|
|
18
|
+
to: core_1.Flags.string({
|
|
19
|
+
description: 'member:<user-id> or space:<space-id>',
|
|
20
|
+
required: true,
|
|
21
|
+
}),
|
|
22
|
+
'assignment-id': core_1.Flags.string({ description: 'Assignment id, for a deterministic retry' }),
|
|
23
|
+
json: core_1.Flags.boolean({ description: 'Output as JSON' }),
|
|
24
|
+
};
|
|
25
|
+
async run() {
|
|
26
|
+
this.requireAuth();
|
|
27
|
+
const { args, flags } = await this.parse(StoreGovernanceAssign);
|
|
28
|
+
// `member:` / `space:` rather than two flags, because the two are mutually
|
|
29
|
+
// exclusive and a pair of optional flags lets you pass both or neither.
|
|
30
|
+
const separator = flags.to.indexOf(':');
|
|
31
|
+
const assigneeType = separator > 0 ? flags.to.slice(0, separator) : '';
|
|
32
|
+
const assigneeId = separator > 0 ? flags.to.slice(separator + 1) : '';
|
|
33
|
+
if (!['member', 'space'].includes(assigneeType) || !assigneeId) {
|
|
34
|
+
this.error(`--to must be member:<user-id> or space:<space-id>, got "${flags.to}"`, {
|
|
35
|
+
exit: 2,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
let result;
|
|
39
|
+
try {
|
|
40
|
+
result = await (0, governed_store_1.assignWorkspaceStoreLicense)(args.workspace, {
|
|
41
|
+
licenseId: flags.license,
|
|
42
|
+
assigneeType: assigneeType,
|
|
43
|
+
assigneeId,
|
|
44
|
+
...(flags['assignment-id'] ? { assignmentId: flags['assignment-id'] } : {}),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
this.handleApiError(error);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this.log(JSON.stringify(result, null, 2));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.default = StoreGovernanceAssign;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
/**
|
|
3
|
+
* Mint a bundle license against an acquisition (admin).
|
|
4
|
+
*
|
|
5
|
+
* A license always cites WHAT paid for it — a commercial order or a contract —
|
|
6
|
+
* so the body carries that acquisition source. That link is the reason a
|
|
7
|
+
* license can be audited at all, and it is not something a CLI should let you
|
|
8
|
+
* omit by defaulting.
|
|
9
|
+
*/
|
|
10
|
+
export default class StoreGovernanceCreateLicense extends BaseCommand {
|
|
11
|
+
static description: string;
|
|
12
|
+
static examples: string[];
|
|
13
|
+
static flags: {
|
|
14
|
+
file: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
15
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
};
|
|
17
|
+
run(): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const base_command_1 = require("../../../base-command");
|
|
4
|
+
const governed_store_1 = require("../../../lib/governed-store");
|
|
5
|
+
const commerce_command_1 = require("../../../lib/commerce-command");
|
|
6
|
+
/**
|
|
7
|
+
* Mint a bundle license against an acquisition (admin).
|
|
8
|
+
*
|
|
9
|
+
* A license always cites WHAT paid for it — a commercial order or a contract —
|
|
10
|
+
* so the body carries that acquisition source. That link is the reason a
|
|
11
|
+
* license can be audited at all, and it is not something a CLI should let you
|
|
12
|
+
* omit by defaulting.
|
|
13
|
+
*/
|
|
14
|
+
class StoreGovernanceCreateLicense extends base_command_1.BaseCommand {
|
|
15
|
+
static description = 'Mint a bundle license against a commercial order or contract (admin).';
|
|
16
|
+
static examples = [
|
|
17
|
+
'<%= config.bin %> store governance create-license --file ./license.json',
|
|
18
|
+
];
|
|
19
|
+
static flags = { ...commerce_command_1.jsonBodyFlags };
|
|
20
|
+
async run() {
|
|
21
|
+
this.requireAuth();
|
|
22
|
+
const { flags } = await this.parse(StoreGovernanceCreateLicense);
|
|
23
|
+
const body = await (0, commerce_command_1.jsonBodyFrom)(this, flags.file);
|
|
24
|
+
let result;
|
|
25
|
+
try {
|
|
26
|
+
result = await (0, governed_store_1.createGovernedStoreLicense)(body);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
this.handleApiError(error);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
this.log(JSON.stringify(result, null, 2));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.default = StoreGovernanceCreateLicense;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
/**
|
|
3
|
+
* `skrr store governance install-plan` — what installing this release WOULD do.
|
|
4
|
+
*
|
|
5
|
+
* A plan, not an install, and the name says so. It resolves the release
|
|
6
|
+
* against a license, the workspace policy and the environment you declare, and
|
|
7
|
+
* answers whether it is permitted and what it would pull. That is the read an
|
|
8
|
+
* operator wants before spending anything — and the reason it is here rather
|
|
9
|
+
* than folded into `store install`, which installs.
|
|
10
|
+
*/
|
|
11
|
+
export default class StoreGovernanceInstallPlan extends BaseCommand {
|
|
12
|
+
static description: string;
|
|
13
|
+
static examples: string[];
|
|
14
|
+
static args: {
|
|
15
|
+
release: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
16
|
+
};
|
|
17
|
+
static flags: {
|
|
18
|
+
license: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
19
|
+
workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
20
|
+
space: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
21
|
+
file: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
22
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
23
|
+
};
|
|
24
|
+
run(): Promise<void>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_command_1 = require("../../../base-command");
|
|
5
|
+
const governed_store_1 = require("../../../lib/governed-store");
|
|
6
|
+
const commerce_command_1 = require("../../../lib/commerce-command");
|
|
7
|
+
/**
|
|
8
|
+
* `skrr store governance install-plan` — what installing this release WOULD do.
|
|
9
|
+
*
|
|
10
|
+
* A plan, not an install, and the name says so. It resolves the release
|
|
11
|
+
* against a license, the workspace policy and the environment you declare, and
|
|
12
|
+
* answers whether it is permitted and what it would pull. That is the read an
|
|
13
|
+
* operator wants before spending anything — and the reason it is here rather
|
|
14
|
+
* than folded into `store install`, which installs.
|
|
15
|
+
*/
|
|
16
|
+
class StoreGovernanceInstallPlan extends base_command_1.BaseCommand {
|
|
17
|
+
static description = 'Resolve what installing a governed release would do — license, workspace policy and environment. Installs nothing.';
|
|
18
|
+
static examples = [
|
|
19
|
+
'<%= config.bin %> store governance install-plan <release-id>',
|
|
20
|
+
'<%= config.bin %> store governance install-plan <release-id> --workspace <id> --license <id>',
|
|
21
|
+
'<%= config.bin %> store governance install-plan <release-id> --file ./environment.json',
|
|
22
|
+
];
|
|
23
|
+
static args = {
|
|
24
|
+
release: core_1.Args.string({ description: 'Release id', required: true, ignoreStdin: true }),
|
|
25
|
+
};
|
|
26
|
+
static flags = {
|
|
27
|
+
license: core_1.Flags.string({ description: 'License to resolve against' }),
|
|
28
|
+
workspace: core_1.Flags.string({ description: 'Workspace whose policy applies' }),
|
|
29
|
+
space: core_1.Flags.string({ description: 'Space the install would land in' }),
|
|
30
|
+
file: core_1.Flags.string({
|
|
31
|
+
description: 'JSON with an `environment` object (platformVersion, runtimeKind, …), or -',
|
|
32
|
+
}),
|
|
33
|
+
json: core_1.Flags.boolean({ description: 'Output as JSON' }),
|
|
34
|
+
};
|
|
35
|
+
async run() {
|
|
36
|
+
this.requireAuth();
|
|
37
|
+
const { args, flags } = await this.parse(StoreGovernanceInstallPlan);
|
|
38
|
+
const extra = await (0, commerce_command_1.jsonBodyFrom)(this, flags.file, { required: false });
|
|
39
|
+
let result;
|
|
40
|
+
try {
|
|
41
|
+
result = await (0, governed_store_1.resolveGovernedStoreInstallPlan)({
|
|
42
|
+
...extra,
|
|
43
|
+
releaseId: args.release,
|
|
44
|
+
...(flags.license ? { licenseId: flags.license } : {}),
|
|
45
|
+
...(flags.workspace ? { workspaceId: flags.workspace } : {}),
|
|
46
|
+
...(flags.space ? { spaceId: flags.space } : {}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
this.handleApiError(error);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.log(JSON.stringify(result, null, 2));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.default = StoreGovernanceInstallPlan;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
/**
|
|
3
|
+
* `skrr store governance license-policy` — how a license takes updates.
|
|
4
|
+
*
|
|
5
|
+
* ONE command over two endpoints, because the only difference between them is
|
|
6
|
+
* WHOSE license it is: yours, or the workspace's. `--workspace` picks the
|
|
7
|
+
* second, and the server resolves the actor from the route rather than from
|
|
8
|
+
* anything the caller asserts. Two owners can hold licenses over the same
|
|
9
|
+
* release and may change different things, so the distinction is real — it is
|
|
10
|
+
* just not a reason to make an operator remember two verb names.
|
|
11
|
+
*
|
|
12
|
+
* `--expect-revision` is REQUIRED by the API, not by convenience: an update
|
|
13
|
+
* policy decides which releases run, and a blind write could silently move a
|
|
14
|
+
* workspace onto a release somebody else had just pinned away from.
|
|
15
|
+
*/
|
|
16
|
+
export default class StoreGovernanceLicensePolicy extends BaseCommand {
|
|
17
|
+
static description: string;
|
|
18
|
+
static examples: string[];
|
|
19
|
+
static args: {
|
|
20
|
+
license: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
21
|
+
};
|
|
22
|
+
static flags: {
|
|
23
|
+
policy: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
24
|
+
'expect-revision': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
25
|
+
release: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
26
|
+
workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
27
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
28
|
+
};
|
|
29
|
+
run(): Promise<void>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_command_1 = require("../../../base-command");
|
|
5
|
+
const governed_store_1 = require("../../../lib/governed-store");
|
|
6
|
+
/**
|
|
7
|
+
* `skrr store governance license-policy` — how a license takes updates.
|
|
8
|
+
*
|
|
9
|
+
* ONE command over two endpoints, because the only difference between them is
|
|
10
|
+
* WHOSE license it is: yours, or the workspace's. `--workspace` picks the
|
|
11
|
+
* second, and the server resolves the actor from the route rather than from
|
|
12
|
+
* anything the caller asserts. Two owners can hold licenses over the same
|
|
13
|
+
* release and may change different things, so the distinction is real — it is
|
|
14
|
+
* just not a reason to make an operator remember two verb names.
|
|
15
|
+
*
|
|
16
|
+
* `--expect-revision` is REQUIRED by the API, not by convenience: an update
|
|
17
|
+
* policy decides which releases run, and a blind write could silently move a
|
|
18
|
+
* workspace onto a release somebody else had just pinned away from.
|
|
19
|
+
*/
|
|
20
|
+
class StoreGovernanceLicensePolicy extends base_command_1.BaseCommand {
|
|
21
|
+
static description = 'Set how a bundle license takes updates (manual, pinned or compatible), fenced on the revision you read. Without --workspace it changes a license you hold personally.';
|
|
22
|
+
static examples = [
|
|
23
|
+
'<%= config.bin %> store governance license-policy <license-id> --policy pinned --expect-revision 2',
|
|
24
|
+
'<%= config.bin %> store governance license-policy <license-id> --policy compatible --expect-revision 5 --workspace <workspace-id>',
|
|
25
|
+
];
|
|
26
|
+
static args = {
|
|
27
|
+
license: core_1.Args.string({ description: 'License id', required: true, ignoreStdin: true }),
|
|
28
|
+
};
|
|
29
|
+
static flags = {
|
|
30
|
+
policy: core_1.Flags.string({
|
|
31
|
+
description: 'How the license takes updates',
|
|
32
|
+
options: ['manual', 'pinned', 'compatible'],
|
|
33
|
+
required: true,
|
|
34
|
+
}),
|
|
35
|
+
'expect-revision': core_1.Flags.integer({
|
|
36
|
+
description: 'The license revision you are changing (compare-and-set)',
|
|
37
|
+
required: true,
|
|
38
|
+
}),
|
|
39
|
+
release: core_1.Flags.string({
|
|
40
|
+
description: 'Pin to these release ids (repeatable); only meaningful with --policy pinned',
|
|
41
|
+
multiple: true,
|
|
42
|
+
}),
|
|
43
|
+
workspace: core_1.Flags.string({
|
|
44
|
+
description: 'Change the license the WORKSPACE holds, rather than your own',
|
|
45
|
+
}),
|
|
46
|
+
json: core_1.Flags.boolean({ description: 'Output as JSON' }),
|
|
47
|
+
};
|
|
48
|
+
async run() {
|
|
49
|
+
this.requireAuth();
|
|
50
|
+
const { args, flags } = await this.parse(StoreGovernanceLicensePolicy);
|
|
51
|
+
const body = {
|
|
52
|
+
updatePolicy: flags.policy,
|
|
53
|
+
expectedRevision: flags['expect-revision'],
|
|
54
|
+
...(flags.release?.length ? { selectedReleaseIds: flags.release } : {}),
|
|
55
|
+
};
|
|
56
|
+
let result;
|
|
57
|
+
try {
|
|
58
|
+
result = flags.workspace
|
|
59
|
+
? await (0, governed_store_1.updateWorkspaceLicensePolicy)(flags.workspace, args.license, body)
|
|
60
|
+
: await (0, governed_store_1.updateOwnLicensePolicy)(args.license, body);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
this.handleApiError(error);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.log(JSON.stringify(result, null, 2));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.default = StoreGovernanceLicensePolicy;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
/**
|
|
3
|
+
* `skrr store governance policy` — which releases a workspace may run at all.
|
|
4
|
+
*
|
|
5
|
+
* `deny_all` and `allowlist` are the two modes the server accepts, and the
|
|
6
|
+
* command refuses an allowlist with nothing in it: an empty allowlist and
|
|
7
|
+
* `deny_all` have the same effect but say different things, and a workspace
|
|
8
|
+
* that reads "allowlist" while permitting nothing is a policy nobody can
|
|
9
|
+
* explain six months later. If you mean deny everything, say `deny_all`.
|
|
10
|
+
*/
|
|
11
|
+
export default class StoreGovernancePolicy extends BaseCommand {
|
|
12
|
+
static description: string;
|
|
13
|
+
static examples: string[];
|
|
14
|
+
static args: {
|
|
15
|
+
workspace: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
16
|
+
};
|
|
17
|
+
static flags: {
|
|
18
|
+
mode: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
19
|
+
release: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
20
|
+
'policy-id': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
21
|
+
'expect-revision': import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
22
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
23
|
+
};
|
|
24
|
+
run(): Promise<void>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_command_1 = require("../../../base-command");
|
|
5
|
+
const governed_store_1 = require("../../../lib/governed-store");
|
|
6
|
+
/**
|
|
7
|
+
* `skrr store governance policy` — which releases a workspace may run at all.
|
|
8
|
+
*
|
|
9
|
+
* `deny_all` and `allowlist` are the two modes the server accepts, and the
|
|
10
|
+
* command refuses an allowlist with nothing in it: an empty allowlist and
|
|
11
|
+
* `deny_all` have the same effect but say different things, and a workspace
|
|
12
|
+
* that reads "allowlist" while permitting nothing is a policy nobody can
|
|
13
|
+
* explain six months later. If you mean deny everything, say `deny_all`.
|
|
14
|
+
*/
|
|
15
|
+
class StoreGovernancePolicy extends base_command_1.BaseCommand {
|
|
16
|
+
static description = 'Set which governed releases a workspace may run. `deny_all`, or an allowlist of release ids.';
|
|
17
|
+
static examples = [
|
|
18
|
+
'<%= config.bin %> store governance policy <workspace-id> --mode deny_all',
|
|
19
|
+
'<%= config.bin %> store governance policy <workspace-id> --mode allowlist --release <id> --release <id>',
|
|
20
|
+
];
|
|
21
|
+
static args = {
|
|
22
|
+
workspace: core_1.Args.string({ description: 'Workspace id', required: true, ignoreStdin: true }),
|
|
23
|
+
};
|
|
24
|
+
static flags = {
|
|
25
|
+
mode: core_1.Flags.string({
|
|
26
|
+
description: 'deny_all, or allowlist the releases named by --release',
|
|
27
|
+
options: ['deny_all', 'allowlist'],
|
|
28
|
+
required: true,
|
|
29
|
+
}),
|
|
30
|
+
release: core_1.Flags.string({
|
|
31
|
+
description: 'Release id to allow (repeatable). Required with --mode allowlist.',
|
|
32
|
+
multiple: true,
|
|
33
|
+
}),
|
|
34
|
+
'policy-id': core_1.Flags.string({ description: 'Policy id, when replacing a specific one' }),
|
|
35
|
+
'expect-revision': core_1.Flags.integer({
|
|
36
|
+
description: 'The policy revision you are replacing (compare-and-set)',
|
|
37
|
+
}),
|
|
38
|
+
json: core_1.Flags.boolean({ description: 'Output as JSON' }),
|
|
39
|
+
};
|
|
40
|
+
async run() {
|
|
41
|
+
this.requireAuth();
|
|
42
|
+
const { args, flags } = await this.parse(StoreGovernancePolicy);
|
|
43
|
+
const releases = flags.release ?? [];
|
|
44
|
+
if (flags.mode === 'allowlist' && releases.length === 0) {
|
|
45
|
+
this.error('An allowlist with no --release permits nothing, which is what --mode deny_all says plainly. Pass at least one release, or say deny_all.', { exit: 2 });
|
|
46
|
+
}
|
|
47
|
+
let result;
|
|
48
|
+
try {
|
|
49
|
+
result = await (0, governed_store_1.setWorkspaceStorePolicy)(args.workspace, {
|
|
50
|
+
mode: flags.mode,
|
|
51
|
+
allowedReleaseIds: releases,
|
|
52
|
+
...(flags['policy-id'] ? { policyId: flags['policy-id'] } : {}),
|
|
53
|
+
...(flags['expect-revision'] !== undefined
|
|
54
|
+
? { expectedRevision: flags['expect-revision'] }
|
|
55
|
+
: {}),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
this.handleApiError(error);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.log(JSON.stringify(result, null, 2));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.default = StoreGovernancePolicy;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseCommand } from '../../../base-command';
|
|
2
|
+
/**
|
|
3
|
+
* Publish one artifact release into the governed catalogue (admin).
|
|
4
|
+
*
|
|
5
|
+
* The body carries verified-outcome evidence, which is why it is a file rather
|
|
6
|
+
* than flags: evidence is a list of records with sources and timestamps, and
|
|
7
|
+
* assembling that from a command line is how a claim loses its provenance.
|
|
8
|
+
*/
|
|
9
|
+
export default class StoreGovernancePublishRelease extends BaseCommand {
|
|
10
|
+
static description: string;
|
|
11
|
+
static examples: string[];
|
|
12
|
+
static flags: {
|
|
13
|
+
file: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
14
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
};
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const base_command_1 = require("../../../base-command");
|
|
4
|
+
const governed_store_1 = require("../../../lib/governed-store");
|
|
5
|
+
const commerce_command_1 = require("../../../lib/commerce-command");
|
|
6
|
+
/**
|
|
7
|
+
* Publish one artifact release into the governed catalogue (admin).
|
|
8
|
+
*
|
|
9
|
+
* The body carries verified-outcome evidence, which is why it is a file rather
|
|
10
|
+
* than flags: evidence is a list of records with sources and timestamps, and
|
|
11
|
+
* assembling that from a command line is how a claim loses its provenance.
|
|
12
|
+
*/
|
|
13
|
+
class StoreGovernancePublishRelease extends base_command_1.BaseCommand {
|
|
14
|
+
static description = 'Publish an artifact release into the governed store catalogue (admin).';
|
|
15
|
+
static examples = [
|
|
16
|
+
'<%= config.bin %> store governance publish-release --file ./release.json',
|
|
17
|
+
];
|
|
18
|
+
static flags = { ...commerce_command_1.jsonBodyFlags };
|
|
19
|
+
async run() {
|
|
20
|
+
this.requireAuth();
|
|
21
|
+
const { flags } = await this.parse(StoreGovernancePublishRelease);
|
|
22
|
+
const body = await (0, commerce_command_1.jsonBodyFrom)(this, flags.file);
|
|
23
|
+
let result;
|
|
24
|
+
try {
|
|
25
|
+
result = await (0, governed_store_1.publishGovernedStoreRelease)(body);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
this.handleApiError(error);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.log(JSON.stringify(result, null, 2));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.default = StoreGovernancePublishRelease;
|
|
@@ -34,8 +34,17 @@ export default class TasksAssign extends BaseCommand {
|
|
|
34
34
|
'repair-release-pins': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
35
35
|
'execution-mode': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
36
36
|
list: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
37
|
+
suggest: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
37
38
|
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
38
39
|
};
|
|
39
40
|
run(): Promise<void>;
|
|
40
41
|
private renderMembers;
|
|
42
|
+
/**
|
|
43
|
+
* `--suggest`: a deterministic LOOKUP, not a routing decision. Declared
|
|
44
|
+
* member expertise is intersected with the task's tags (strong match) and
|
|
45
|
+
* its title/description text (weak match); the caller still chooses the
|
|
46
|
+
* assignee. This mirrors how the contract stays advisory everywhere else —
|
|
47
|
+
* the data is shown, the judgment stays with whoever is assigning.
|
|
48
|
+
*/
|
|
49
|
+
private renderSuggestions;
|
|
41
50
|
}
|