@odla-ai/cli 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -254,6 +254,46 @@ type Output = Pick<typeof console, "log">;
254
254
  /** Print the stable responsibility boundary for humans or agent tooling. */
255
255
  declare function printCapabilities(json?: boolean, out?: Output): void;
256
256
 
257
+ /** A node in the invocation tree. An empty node is a leaf: everything after it
258
+ * is arguments, not sub-actions, and is not validated here. */
259
+ interface SurfaceNode {
260
+ readonly [word: string]: SurfaceNode;
261
+ }
262
+ /**
263
+ * Every invocation the CLI dispatches, as a tree of words.
264
+ *
265
+ * Keyed by the word at that position; the value is what may follow it. A leaf
266
+ * (`{}`) means the command takes arguments from there on, so `odla-ai runbook
267
+ * get release` validates `runbook get` and leaves `release` alone.
268
+ */
269
+ declare const COMMAND_SURFACE: SurfaceNode;
270
+ /** The words accepted at a path, sorted for stable messages. */
271
+ declare function acceptedAfter(path: readonly string[]): string[];
272
+ /** One rejected invocation: where it went wrong and what was accepted there. */
273
+ interface InvocationProblem {
274
+ /** The words that were valid, joined — `runbook` for `runbook imapct`. */
275
+ validPrefix: string;
276
+ /** The word that was not accepted. */
277
+ word: string;
278
+ /** What could have appeared instead. */
279
+ accepted: string[];
280
+ }
281
+ /**
282
+ * Check an invocation's words against the surface.
283
+ *
284
+ * Returns null when the words name a real command path. Validation stops at the
285
+ * first leaf — arguments are not sub-actions — so an unknown *argument* is never
286
+ * reported as an unknown command.
287
+ */
288
+ declare function validateInvocation(words: readonly string[]): InvocationProblem | null;
289
+ /** Render a problem as the sentence a dispatcher throws, so the message a user
290
+ * sees and the message a gate prints come from the same place. */
291
+ declare function describeProblem(problem: InvocationProblem): string;
292
+ /** Every complete path through the surface, as word arrays. Used by the test
293
+ * that drives each one through the real dispatcher, and by the published-surface
294
+ * gate to know what a version is expected to carry. */
295
+ declare function surfacePaths(node?: SurfaceNode, prefix?: readonly string[]): string[][];
296
+
257
297
  declare const CALENDAR_STATES: readonly ["not_connected", "authorizing", "healthy", "degraded", "disconnected", "failed"];
258
298
  /** Connection lifecycle reported by the registry; mirrors the platform's
259
299
  * calendar states. `degraded` means connected but re-consent is required. */
@@ -1002,4 +1042,4 @@ declare function installSkill(options?: SkillInstallOptions): SkillInstallResult
1002
1042
  */
1003
1043
  declare function smoke(options: SmokeOptions): Promise<void>;
1004
1044
 
1005
- export { AGENT_HARNESSES, type AdminAiOptions, type AgentHarness, type AgentHarnessSelector, type AvailableGoogleCalendar, CAPABILITIES, CODE_BUILD_RECIPES, CODE_PI_IMAGE, type CalendarConfig, type CalendarConnectionState, type CalendarLifecycleOptions, type CalendarServiceConfig, type CalendarStatus, type CliDependencies, type CodeBuildRule, type CodeConnectOptions, type CodeContainerEngine, type CodeHostCapabilities, type CodeLocalSourceDescriptor, type CodeRuntimeInput, type ConnectGitHubSecuritySourceOptions, type DisconnectGitHubSecuritySourceOptions, type FollowHostedSecurityJobOptions, GOOGLE_CALENDAR_EVENTS_SCOPE, type GetHostedSecurityIntentOptions, type GetHostedSecurityJobOptions, type GoogleCalendarConfig, type HarnessInstallResult, type HostedSecurityProfile, type HostedSecurityResult, type HostedSecurityTokenRequest, type IntegrationProbe, type IntegrationSeed, type ListGitHubSecuritySourcesOptions, type ListHostedSecurityJobsOptions, type LoadedProjectConfig, type LocalCredentials, type OdlaIntegration, type OdlaProjectConfig, type ProvisionOptions, type ProvisionPlan, type RunHostedSecurityOptions, SYSTEM_AI_PURPOSES, type ScopedPlatformTokenOptions, type SecretsPushOptions, type SecretsSetOptions, type SkillInstallOptions, type SkillInstallResult, type SmokeOptions, type StartHostedSecurityJobOptions, type SystemAiPurpose, adminAi, calendarBookingPageUrl, calendarCalendars, calendarConnect, calendarDisconnect, calendarServiceConfig, calendarStatus, codeConnect, connectGitHubSecuritySource, disconnectGitHubSecuritySource, doctor, exitCodeFor, followHostedSecurityJob, getHostedSecurityIntent, getHostedSecurityJob, getHostedSecurityPlan, getHostedSecurityReport, getScopedPlatformToken, inferGitHubRepository, initProject, installSkill, isTerminalHostedSecurityStatus, listGitHubSecuritySources, listHostedSecurityJobs, prepareCodeImages, printCapabilities, provision, redactSecrets, repositoryFromGitRemote, runCli, runCodeRuntime, runHostedSecurity, secretsPush, secretsSet, secretsSetClerkKey, smoke, startHostedSecurityJob };
1045
+ export { AGENT_HARNESSES, type AdminAiOptions, type AgentHarness, type AgentHarnessSelector, type AvailableGoogleCalendar, CAPABILITIES, CODE_BUILD_RECIPES, CODE_PI_IMAGE, COMMAND_SURFACE, type CalendarConfig, type CalendarConnectionState, type CalendarLifecycleOptions, type CalendarServiceConfig, type CalendarStatus, type CliDependencies, type CodeBuildRule, type CodeConnectOptions, type CodeContainerEngine, type CodeHostCapabilities, type CodeLocalSourceDescriptor, type CodeRuntimeInput, type ConnectGitHubSecuritySourceOptions, type DisconnectGitHubSecuritySourceOptions, type FollowHostedSecurityJobOptions, GOOGLE_CALENDAR_EVENTS_SCOPE, type GetHostedSecurityIntentOptions, type GetHostedSecurityJobOptions, type GoogleCalendarConfig, type HarnessInstallResult, type HostedSecurityProfile, type HostedSecurityResult, type HostedSecurityTokenRequest, type IntegrationProbe, type IntegrationSeed, type InvocationProblem, type ListGitHubSecuritySourcesOptions, type ListHostedSecurityJobsOptions, type LoadedProjectConfig, type LocalCredentials, type OdlaIntegration, type OdlaProjectConfig, type ProvisionOptions, type ProvisionPlan, type RunHostedSecurityOptions, SYSTEM_AI_PURPOSES, type ScopedPlatformTokenOptions, type SecretsPushOptions, type SecretsSetOptions, type SkillInstallOptions, type SkillInstallResult, type SmokeOptions, type StartHostedSecurityJobOptions, type SurfaceNode, type SystemAiPurpose, acceptedAfter, adminAi, calendarBookingPageUrl, calendarCalendars, calendarConnect, calendarDisconnect, calendarServiceConfig, calendarStatus, codeConnect, connectGitHubSecuritySource, describeProblem, disconnectGitHubSecuritySource, doctor, exitCodeFor, followHostedSecurityJob, getHostedSecurityIntent, getHostedSecurityJob, getHostedSecurityPlan, getHostedSecurityReport, getScopedPlatformToken, inferGitHubRepository, initProject, installSkill, isTerminalHostedSecurityStatus, listGitHubSecuritySources, listHostedSecurityJobs, prepareCodeImages, printCapabilities, provision, redactSecrets, repositoryFromGitRemote, runCli, runCodeRuntime, runHostedSecurity, secretsPush, secretsSet, secretsSetClerkKey, smoke, startHostedSecurityJob, surfacePaths, validateInvocation };
package/dist/index.d.ts CHANGED
@@ -254,6 +254,46 @@ type Output = Pick<typeof console, "log">;
254
254
  /** Print the stable responsibility boundary for humans or agent tooling. */
255
255
  declare function printCapabilities(json?: boolean, out?: Output): void;
256
256
 
257
+ /** A node in the invocation tree. An empty node is a leaf: everything after it
258
+ * is arguments, not sub-actions, and is not validated here. */
259
+ interface SurfaceNode {
260
+ readonly [word: string]: SurfaceNode;
261
+ }
262
+ /**
263
+ * Every invocation the CLI dispatches, as a tree of words.
264
+ *
265
+ * Keyed by the word at that position; the value is what may follow it. A leaf
266
+ * (`{}`) means the command takes arguments from there on, so `odla-ai runbook
267
+ * get release` validates `runbook get` and leaves `release` alone.
268
+ */
269
+ declare const COMMAND_SURFACE: SurfaceNode;
270
+ /** The words accepted at a path, sorted for stable messages. */
271
+ declare function acceptedAfter(path: readonly string[]): string[];
272
+ /** One rejected invocation: where it went wrong and what was accepted there. */
273
+ interface InvocationProblem {
274
+ /** The words that were valid, joined — `runbook` for `runbook imapct`. */
275
+ validPrefix: string;
276
+ /** The word that was not accepted. */
277
+ word: string;
278
+ /** What could have appeared instead. */
279
+ accepted: string[];
280
+ }
281
+ /**
282
+ * Check an invocation's words against the surface.
283
+ *
284
+ * Returns null when the words name a real command path. Validation stops at the
285
+ * first leaf — arguments are not sub-actions — so an unknown *argument* is never
286
+ * reported as an unknown command.
287
+ */
288
+ declare function validateInvocation(words: readonly string[]): InvocationProblem | null;
289
+ /** Render a problem as the sentence a dispatcher throws, so the message a user
290
+ * sees and the message a gate prints come from the same place. */
291
+ declare function describeProblem(problem: InvocationProblem): string;
292
+ /** Every complete path through the surface, as word arrays. Used by the test
293
+ * that drives each one through the real dispatcher, and by the published-surface
294
+ * gate to know what a version is expected to carry. */
295
+ declare function surfacePaths(node?: SurfaceNode, prefix?: readonly string[]): string[][];
296
+
257
297
  declare const CALENDAR_STATES: readonly ["not_connected", "authorizing", "healthy", "degraded", "disconnected", "failed"];
258
298
  /** Connection lifecycle reported by the registry; mirrors the platform's
259
299
  * calendar states. `degraded` means connected but re-consent is required. */
@@ -1002,4 +1042,4 @@ declare function installSkill(options?: SkillInstallOptions): SkillInstallResult
1002
1042
  */
1003
1043
  declare function smoke(options: SmokeOptions): Promise<void>;
1004
1044
 
1005
- export { AGENT_HARNESSES, type AdminAiOptions, type AgentHarness, type AgentHarnessSelector, type AvailableGoogleCalendar, CAPABILITIES, CODE_BUILD_RECIPES, CODE_PI_IMAGE, type CalendarConfig, type CalendarConnectionState, type CalendarLifecycleOptions, type CalendarServiceConfig, type CalendarStatus, type CliDependencies, type CodeBuildRule, type CodeConnectOptions, type CodeContainerEngine, type CodeHostCapabilities, type CodeLocalSourceDescriptor, type CodeRuntimeInput, type ConnectGitHubSecuritySourceOptions, type DisconnectGitHubSecuritySourceOptions, type FollowHostedSecurityJobOptions, GOOGLE_CALENDAR_EVENTS_SCOPE, type GetHostedSecurityIntentOptions, type GetHostedSecurityJobOptions, type GoogleCalendarConfig, type HarnessInstallResult, type HostedSecurityProfile, type HostedSecurityResult, type HostedSecurityTokenRequest, type IntegrationProbe, type IntegrationSeed, type ListGitHubSecuritySourcesOptions, type ListHostedSecurityJobsOptions, type LoadedProjectConfig, type LocalCredentials, type OdlaIntegration, type OdlaProjectConfig, type ProvisionOptions, type ProvisionPlan, type RunHostedSecurityOptions, SYSTEM_AI_PURPOSES, type ScopedPlatformTokenOptions, type SecretsPushOptions, type SecretsSetOptions, type SkillInstallOptions, type SkillInstallResult, type SmokeOptions, type StartHostedSecurityJobOptions, type SystemAiPurpose, adminAi, calendarBookingPageUrl, calendarCalendars, calendarConnect, calendarDisconnect, calendarServiceConfig, calendarStatus, codeConnect, connectGitHubSecuritySource, disconnectGitHubSecuritySource, doctor, exitCodeFor, followHostedSecurityJob, getHostedSecurityIntent, getHostedSecurityJob, getHostedSecurityPlan, getHostedSecurityReport, getScopedPlatformToken, inferGitHubRepository, initProject, installSkill, isTerminalHostedSecurityStatus, listGitHubSecuritySources, listHostedSecurityJobs, prepareCodeImages, printCapabilities, provision, redactSecrets, repositoryFromGitRemote, runCli, runCodeRuntime, runHostedSecurity, secretsPush, secretsSet, secretsSetClerkKey, smoke, startHostedSecurityJob };
1045
+ export { AGENT_HARNESSES, type AdminAiOptions, type AgentHarness, type AgentHarnessSelector, type AvailableGoogleCalendar, CAPABILITIES, CODE_BUILD_RECIPES, CODE_PI_IMAGE, COMMAND_SURFACE, type CalendarConfig, type CalendarConnectionState, type CalendarLifecycleOptions, type CalendarServiceConfig, type CalendarStatus, type CliDependencies, type CodeBuildRule, type CodeConnectOptions, type CodeContainerEngine, type CodeHostCapabilities, type CodeLocalSourceDescriptor, type CodeRuntimeInput, type ConnectGitHubSecuritySourceOptions, type DisconnectGitHubSecuritySourceOptions, type FollowHostedSecurityJobOptions, GOOGLE_CALENDAR_EVENTS_SCOPE, type GetHostedSecurityIntentOptions, type GetHostedSecurityJobOptions, type GoogleCalendarConfig, type HarnessInstallResult, type HostedSecurityProfile, type HostedSecurityResult, type HostedSecurityTokenRequest, type IntegrationProbe, type IntegrationSeed, type InvocationProblem, type ListGitHubSecuritySourcesOptions, type ListHostedSecurityJobsOptions, type LoadedProjectConfig, type LocalCredentials, type OdlaIntegration, type OdlaProjectConfig, type ProvisionOptions, type ProvisionPlan, type RunHostedSecurityOptions, SYSTEM_AI_PURPOSES, type ScopedPlatformTokenOptions, type SecretsPushOptions, type SecretsSetOptions, type SkillInstallOptions, type SkillInstallResult, type SmokeOptions, type StartHostedSecurityJobOptions, type SurfaceNode, type SystemAiPurpose, acceptedAfter, adminAi, calendarBookingPageUrl, calendarCalendars, calendarConnect, calendarDisconnect, calendarServiceConfig, calendarStatus, codeConnect, connectGitHubSecuritySource, describeProblem, disconnectGitHubSecuritySource, doctor, exitCodeFor, followHostedSecurityJob, getHostedSecurityIntent, getHostedSecurityJob, getHostedSecurityPlan, getHostedSecurityReport, getScopedPlatformToken, inferGitHubRepository, initProject, installSkill, isTerminalHostedSecurityStatus, listGitHubSecuritySources, listHostedSecurityJobs, prepareCodeImages, printCapabilities, provision, redactSecrets, repositoryFromGitRemote, runCli, runCodeRuntime, runHostedSecurity, secretsPush, secretsSet, secretsSetClerkKey, smoke, startHostedSecurityJob, surfacePaths, validateInvocation };
package/dist/index.js CHANGED
@@ -4,8 +4,10 @@ import {
4
4
  CAPABILITIES,
5
5
  CODE_BUILD_RECIPES,
6
6
  CODE_PI_IMAGE,
7
+ COMMAND_SURFACE,
7
8
  GOOGLE_CALENDAR_EVENTS_SCOPE,
8
9
  SYSTEM_AI_PURPOSES,
10
+ acceptedAfter,
9
11
  adminAi,
10
12
  calendarBookingPageUrl,
11
13
  calendarCalendars,
@@ -15,6 +17,7 @@ import {
15
17
  calendarStatus,
16
18
  codeConnect,
17
19
  connectGitHubSecuritySource,
20
+ describeProblem,
18
21
  disconnectGitHubSecuritySource,
19
22
  doctor,
20
23
  exitCodeFor,
@@ -42,15 +45,19 @@ import {
42
45
  secretsSet,
43
46
  secretsSetClerkKey,
44
47
  smoke,
45
- startHostedSecurityJob
46
- } from "./chunk-TOSMNGGQ.js";
48
+ startHostedSecurityJob,
49
+ surfacePaths,
50
+ validateInvocation
51
+ } from "./chunk-I4XURPUK.js";
47
52
  export {
48
53
  AGENT_HARNESSES,
49
54
  CAPABILITIES,
50
55
  CODE_BUILD_RECIPES,
51
56
  CODE_PI_IMAGE,
57
+ COMMAND_SURFACE,
52
58
  GOOGLE_CALENDAR_EVENTS_SCOPE,
53
59
  SYSTEM_AI_PURPOSES,
60
+ acceptedAfter,
54
61
  adminAi,
55
62
  calendarBookingPageUrl,
56
63
  calendarCalendars,
@@ -60,6 +67,7 @@ export {
60
67
  calendarStatus,
61
68
  codeConnect,
62
69
  connectGitHubSecuritySource,
70
+ describeProblem,
63
71
  disconnectGitHubSecuritySource,
64
72
  doctor,
65
73
  exitCodeFor,
@@ -87,6 +95,8 @@ export {
87
95
  secretsSet,
88
96
  secretsSetClerkKey,
89
97
  smoke,
90
- startHostedSecurityJob
98
+ startHostedSecurityJob,
99
+ surfacePaths,
100
+ validateInvocation
91
101
  };
92
102
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odla-ai/cli",
3
- "version": "0.18.0",
3
+ "version": "0.20.0",
4
4
  "description": "Agent-operable CLI for odla provisioning, calendar consent and sync lifecycle, System AI administration, Worker secrets, security jobs, and smoke checks.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://odla.ai/docs/packages/cli",
@@ -214,6 +214,20 @@ the database, so no build, test, or CI gate in the repository can see it drift
214
214
  from your code. Reread what it names and fix any step your change made wrong,
215
215
  in the same piece of work.
216
216
 
217
+ The other direction — are the runbooks themselves still true?
218
+
219
+ ```cmd
220
+ npx @odla-ai/cli runbook lint
221
+ ```
222
+
223
+ Every `odla-ai …` command the runbooks name is held against this CLI's real
224
+ command surface, and against the minimum versions each runbook declares. Because
225
+ a runbook is edited without a release, its text can name a command only a newer
226
+ package has; a runbook records that as `requires` (`@odla-ai/cli@0.18.0`), and
227
+ `runbook get` warns on stderr when yours is older. If you add a command and then
228
+ tell a runbook to use it, set `requires` in the same edit — otherwise the first
229
+ reader on an older CLI gets an "unknown action" error instead of an explanation.
230
+
217
231
  Found a wrong step? Fix an app runbook directly. For a platform runbook,
218
232
  `runbook edit` requests an admin-approved capability — a plain handshake token is
219
233
  never admin, and `npx @odla-ai/cli whoami` tells you what you hold.