@skrr-ai/cli 0.1.99 → 0.1.101

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.
@@ -3,9 +3,8 @@ import { BaseCommand } from '../../../base-command';
3
3
  * `skrr commitments analytics detail <id>` — per-commitment analytics.
4
4
  *
5
5
  * Distinct from `skrr commitments show` (the contract) and from
6
- * `skrr commitments ledger` (the raw durable runs): this is the JOINED
7
- * projection — checks correlated with their outcomes, runs and deliveries over a
8
- * window.
6
+ * `skrr commitments ledger` (the raw durable runs): the default rolls up daily
7
+ * Check/outcome metrics. Only --ledger joins checks, native Runs and deliveries.
9
8
  */
10
9
  export default class CommitmentsAnalyticsDetail extends BaseCommand {
11
10
  static description: string;
@@ -7,12 +7,11 @@ const commitment_analytics_1 = require("../../../lib/commitment-analytics");
7
7
  * `skrr commitments analytics detail <id>` — per-commitment analytics.
8
8
  *
9
9
  * Distinct from `skrr commitments show` (the contract) and from
10
- * `skrr commitments ledger` (the raw durable runs): this is the JOINED
11
- * projection — checks correlated with their outcomes, runs and deliveries over a
12
- * window.
10
+ * `skrr commitments ledger` (the raw durable runs): the default rolls up daily
11
+ * Check/outcome metrics. Only --ledger joins checks, native Runs and deliveries.
13
12
  */
14
13
  class CommitmentsAnalyticsDetail extends base_command_1.BaseCommand {
15
- static description = 'Per-commitment analytics (joined checks, outcomes, runs)';
14
+ static description = 'Daily Check/outcome analytics; use --ledger for joined native Runs. Legacy totals.autoRuns is not a native Run count';
16
15
  static examples = [
17
16
  '<%= config.bin %> commitments analytics detail obj_abc123',
18
17
  '<%= config.bin %> commitments analytics detail obj_abc123 --days 30',
@@ -24,7 +23,7 @@ class CommitmentsAnalyticsDetail extends base_command_1.BaseCommand {
24
23
  static flags = {
25
24
  json: core_1.Flags.boolean({ description: 'Output as JSON' }),
26
25
  days: core_1.Flags.integer({ description: 'Lookback window in days', min: 1, max: 365 }),
27
- ledger: core_1.Flags.boolean({ description: 'Show the joined ledger projection instead' }),
26
+ ledger: core_1.Flags.boolean({ description: 'Show joined checks, native Runs and deliveries instead of daily Check/outcome metrics' }),
28
27
  limit: core_1.Flags.integer({ description: 'Max rows (ledger)', min: 1, max: 200 }),
29
28
  'check-limit': core_1.Flags.integer({ description: 'Max checks (ledger)', min: 1, max: 200 }),
30
29
  'run-limit': core_1.Flags.integer({ description: 'Max runs (ledger)', min: 1, max: 200 }),
@@ -45,6 +45,26 @@ function preflightGateLines(gate, verbose = false) {
45
45
  if (hasNote) {
46
46
  lines.push(` ${String(note).trim()}`);
47
47
  }
48
+ if (gate.id === 'owner_rules') {
49
+ const status = gate.detail?.status;
50
+ const count = gate.detail?.activeRules;
51
+ if (status === 'not_bound') {
52
+ lines.push(' Owner rules: no Compass bound.');
53
+ }
54
+ else if (status === 'unreadable') {
55
+ lines.push(' Active owner rules: unknown (Compass unreadable).');
56
+ }
57
+ else if (status === 'invalid') {
58
+ lines.push(' Active owner rules: unknown (stored rules invalid).');
59
+ }
60
+ else if (status === 'available' && typeof count === 'number' &&
61
+ Number.isSafeInteger(count) && count >= 0) {
62
+ lines.push(` Active owner rules: ${count}${count === 0 ? ' (no active rules configured)' : ''}.`);
63
+ }
64
+ else {
65
+ lines.push(' Active owner rules: unknown (count not reported).');
66
+ }
67
+ }
48
68
  // `detail.hint` is the actionable plain-words sentence — why the gate is
49
69
  // capped and the exact command to lift it. It lived only in --json, so the
50
70
  // human view printed the machine code (`autonomy_capped_by_initiative_policy`)
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
4
  const scoped_memory_command_1 = require("../../../lib/scoped-memory-command");
5
5
  class MemoryMountsResolve extends scoped_memory_command_1.ScopedMemoryCommand {
6
- static description = 'Resolve the ACL-aware Memory mounts for an Agent session';
6
+ static description = 'Resolve ACL-aware Memory mounts; discovery may initialize default Store metadata';
7
7
  static flags = {
8
8
  agent: core_1.Flags.string({ required: true }),
9
9
  space: core_1.Flags.string({ description: 'Current Space context' }),
@@ -13,9 +13,15 @@ class MemoryMountsResolve extends scoped_memory_command_1.ScopedMemoryCommand {
13
13
  this.requireAuth();
14
14
  const { flags } = await this.parse(MemoryMountsResolve);
15
15
  const response = await this.memoryApi(flags.agent, `/mounts${this.query(flags)}`);
16
- const result = { mounts: response.mounts.map(scoped_memory_command_1.parseMemoryMount) };
16
+ const storeResolutions = (0, scoped_memory_command_1.parseMemoryStoreResolutions)(response.storeResolutions);
17
+ const result = {
18
+ mounts: response.mounts.map(scoped_memory_command_1.parseMemoryMount),
19
+ ...(storeResolutions !== undefined ? { storeResolutions } : {}),
20
+ };
17
21
  if (flags.json)
18
22
  return this.log(JSON.stringify(result, null, 2));
23
+ for (const line of (0, scoped_memory_command_1.memoryStoreResolutionLines)(storeResolutions))
24
+ this.log(line);
19
25
  for (const mount of result.mounts) {
20
26
  this.log(`${mount.source} ${mount.uri} ${mount.access} store=${mount.storeId} r${mount.storeRevision} cursor=${mount.cursor}`);
21
27
  }
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
4
  const scoped_memory_command_1 = require("../../../lib/scoped-memory-command");
5
5
  class MemoryStoresList extends scoped_memory_command_1.ScopedMemoryCommand {
6
- static description = 'List Memory Stores mounted for an Agent session';
6
+ static description = 'List mounted Memory Stores; discovery may initialize default Store metadata';
7
7
  static flags = {
8
8
  agent: core_1.Flags.string({ required: true }),
9
9
  space: core_1.Flags.string({ description: 'Current Space context' }),
@@ -13,11 +13,15 @@ class MemoryStoresList extends scoped_memory_command_1.ScopedMemoryCommand {
13
13
  this.requireAuth();
14
14
  const { flags } = await this.parse(MemoryStoresList);
15
15
  const response = await this.memoryApi(flags.agent, `/stores${this.query(flags)}`);
16
+ const storeResolutions = (0, scoped_memory_command_1.parseMemoryStoreResolutions)(response.storeResolutions);
16
17
  const result = {
17
18
  stores: response.stores.map(scoped_memory_command_1.parseMountedMemoryStore),
19
+ ...(storeResolutions !== undefined ? { storeResolutions } : {}),
18
20
  };
19
21
  if (flags.json)
20
22
  return this.log(JSON.stringify(result, null, 2));
23
+ for (const line of (0, scoped_memory_command_1.memoryStoreResolutionLines)(storeResolutions))
24
+ this.log(line);
21
25
  for (const store of result.stores) {
22
26
  this.log(`${store.id} ${store.owner.kind}:${store.owner.id} ${store.mount.access} r${store.revision}`);
23
27
  }
@@ -47,6 +47,8 @@ class ProposalsList extends base_command_1.BaseCommand {
47
47
  this.log(JSON.stringify(result, null, 2));
48
48
  return;
49
49
  }
50
+ if (!result.data.length)
51
+ this.log('No proposals returned on this page.');
50
52
  (0, format_1.renderTable)(result.data.map((row) => ({
51
53
  id: row.id,
52
54
  title: row.title,
@@ -5,7 +5,7 @@ const signal_command_1 = require("../../../signal-command");
5
5
  const signals_1 = require("../../../lib/signals");
6
6
  const prompt_1 = require("../../../lib/prompt");
7
7
  class MonitorsValidate extends signal_command_1.SignalCommand {
8
- static description = 'Compile-only check of a Monitor definition; nothing is persisted';
8
+ static description = 'Compile-only check of a Monitor definition; nothing is persisted. Requires active Signal Sources owned by you in the selected workspace. Inspect each source with signals sources show before validating.';
9
9
  static flags = {
10
10
  json: core_1.Flags.boolean({ description: 'Output as JSON' }),
11
11
  'from-json': core_1.Flags.string({
@@ -29,7 +29,7 @@ class SpacesWorkflowsCreate extends base_command_1.BaseCommand {
29
29
  title: core_1.Flags.string({ required: true, description: 'Workflow title' }),
30
30
  description: core_1.Flags.string({ description: 'Optional description' }),
31
31
  graph: core_1.Flags.string({
32
- description: 'Required exactly once with --draft/--starter: path to graph JSON ({ nodes, edges })',
32
+ description: 'Required exactly once with --draft/--starter: path to graph JSON ({ nodes, edges }); inspect config with spaces workflows node-types',
33
33
  exactlyOne: ['graph', 'draft', 'starter'],
34
34
  }),
35
35
  draft: core_1.Flags.string({
@@ -0,0 +1,45 @@
1
+ import { type WorkflowNodeType } from '@skrr-ai/data-provider';
2
+ import { BaseCommand } from '../../../base-command';
3
+ export declare function workflowNodeTypeReference(type: WorkflowNodeType): {
4
+ type: WorkflowNodeType;
5
+ typeVersion: number;
6
+ label: string;
7
+ description: string;
8
+ requiredConfig: string[];
9
+ fields: {
10
+ path: string;
11
+ name: string;
12
+ label: string;
13
+ kind: import("@skrr-ai/data-provider").WorkflowNodeFieldKind;
14
+ placeholder?: string;
15
+ help?: string;
16
+ showWhen?: {
17
+ field: string;
18
+ equals: unknown;
19
+ };
20
+ options?: Array<{
21
+ value: string;
22
+ label: string;
23
+ }>;
24
+ }[];
25
+ defaultNode: {
26
+ key: string;
27
+ type: WorkflowNodeType;
28
+ typeVersion: number;
29
+ config: Record<string, unknown>;
30
+ join: "all";
31
+ bindings: {};
32
+ };
33
+ outcomes: import("@skrr-ai/data-provider").WorkflowOutcomeSpec[];
34
+ };
35
+ export default class SpacesWorkflowsNodeTypes extends BaseCommand {
36
+ static description: string;
37
+ static examples: string[];
38
+ static args: {
39
+ type: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
40
+ };
41
+ static flags: {
42
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
43
+ };
44
+ run(): Promise<void>;
45
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.workflowNodeTypeReference = workflowNodeTypeReference;
4
+ const core_1 = require("@oclif/core");
5
+ const data_provider_1 = require("@skrr-ai/data-provider");
6
+ const base_command_1 = require("../../../base-command");
7
+ function workflowNodeTypeReference(type) {
8
+ const definition = data_provider_1.WORKFLOW_NODE_TYPES[type];
9
+ const node = {
10
+ key: `${definition.keyPrefix}_1`,
11
+ type,
12
+ typeVersion: definition.version,
13
+ config: definition.defaultConfig(),
14
+ join: 'all',
15
+ bindings: {},
16
+ };
17
+ return {
18
+ type,
19
+ typeVersion: definition.version,
20
+ label: definition.label,
21
+ description: definition.description,
22
+ requiredConfig: definition.requiredConfig,
23
+ fields: definition.fields.map((field) => ({
24
+ ...field,
25
+ path: field.name === 'join' ? 'join' : `config.${field.name}`,
26
+ })),
27
+ defaultNode: node,
28
+ outcomes: definition.outcomes(node),
29
+ };
30
+ }
31
+ class SpacesWorkflowsNodeTypes extends base_command_1.BaseCommand {
32
+ static description = 'Read node config fields, defaults and review lens preset choices from the installed CLI catalog (no server requests)';
33
+ static examples = [
34
+ '<%= config.bin %> spaces workflows node-types',
35
+ '<%= config.bin %> spaces workflows node-types loop --json',
36
+ '<%= config.bin %> spaces workflows node-types review_loop --json',
37
+ ];
38
+ static args = {
39
+ type: core_1.Args.string({ description: 'Node type; omit to list all types', ignoreStdin: true }),
40
+ };
41
+ static flags = {
42
+ json: core_1.Flags.boolean({ description: 'Output node fields, choices and default node JSON' }),
43
+ };
44
+ async run() {
45
+ const { args, flags } = await this.parse(SpacesWorkflowsNodeTypes);
46
+ if (args.type && !(0, data_provider_1.isWorkflowNodeType)(args.type)) {
47
+ this.failWithCliError({
48
+ message: `Unknown node type: ${args.type}. Run skrr spaces workflows node-types to list types.`,
49
+ code: 'WORKFLOW_NODE_TYPE_UNKNOWN',
50
+ exit: 2,
51
+ retryable: false,
52
+ });
53
+ return;
54
+ }
55
+ const types = args.type
56
+ ? [args.type]
57
+ : Object.keys(data_provider_1.WORKFLOW_NODE_TYPES);
58
+ const references = types.map(workflowNodeTypeReference);
59
+ const note = 'Installed CLI authoring reference. Defaults may require configuration; fill required fields and agent choices, then validate the draft against your server before publishing.';
60
+ if (flags.json) {
61
+ this.log(JSON.stringify({
62
+ object: 'workflow_node_catalog', source: 'installed_cli', note, nodeTypes: references,
63
+ }, null, 2));
64
+ return;
65
+ }
66
+ this.log(note);
67
+ for (const reference of references) {
68
+ this.log(`\n${reference.type} · ${reference.label} · v${reference.typeVersion}`);
69
+ if (!args.type)
70
+ continue;
71
+ this.log(reference.description);
72
+ this.log(`Required config keys: ${reference.requiredConfig.join(', ') || 'none declared'}`);
73
+ for (const field of reference.fields) {
74
+ const choices = field.options?.length
75
+ ? ` (${field.options.map((option) => option.value).join(', ')})` : '';
76
+ this.log(` ${field.path}: ${field.label}${choices}`);
77
+ if (field.help)
78
+ this.log(` ${field.help}`);
79
+ }
80
+ this.log(`Default node: ${JSON.stringify(reference.defaultNode, null, 2)}`);
81
+ }
82
+ if (!args.type)
83
+ this.log('\nRead one type: skrr spaces workflows node-types <type> --json');
84
+ }
85
+ }
86
+ exports.default = SpacesWorkflowsNodeTypes;
@@ -51,19 +51,21 @@ class SpacesWorkflowsUpdate extends base_command_1.BaseCommand {
51
51
  title: core_1.Flags.string({ description: 'New workflow title' }),
52
52
  description: core_1.Flags.string({ description: 'New workflow description' }),
53
53
  'clear-description': core_1.Flags.boolean({ description: 'Remove the workflow description' }),
54
- graph: core_1.Flags.string({ description: 'Path to graph JSON ({ nodes, edges })' }),
54
+ graph: core_1.Flags.string({
55
+ description: 'Path to graph JSON ({ nodes, edges }); inspect config with spaces workflows node-types',
56
+ }),
55
57
  draft: core_1.Flags.string({
56
58
  description: 'Path to complete draft JSON ({ semantic, presentation })',
57
59
  }),
58
60
  'semantic-revision': core_1.Flags.integer({
59
- description: 'Expected semantic revision; defaults to the latest server value',
61
+ description: 'Expected semantic revision; pass with --presentation-revision. For graph/draft writes, omit both to fetch the latest server revisions',
60
62
  }),
61
63
  'max-duration': core_1.Flags.string({
62
- description: 'Run duration limit, e.g. 90m, 4h or 2d. A run still open past it is cancelled with WORKFLOW_RUN_DEADLINE. Applies from the next publish; runs already started keep their deadline',
64
+ description: 'Run duration limit from 5m to 90d inclusive, e.g. 90m, 4h or 2d. A run still open past it is cancelled with WORKFLOW_RUN_DEADLINE. Applies from the next publish; runs already started keep their deadline',
63
65
  }),
64
66
  'clear-max-duration': core_1.Flags.boolean({ description: 'Remove the run duration limit' }),
65
67
  'presentation-revision': core_1.Flags.integer({
66
- description: 'Expected presentation revision; defaults to the latest server value',
68
+ description: 'Expected presentation revision; pass with --semantic-revision. For graph/draft writes, omit both to fetch the latest server revisions',
67
69
  }),
68
70
  };
69
71
  async run() {
@@ -18,7 +18,7 @@ class TasksSchedule extends base_command_1.BaseCommand {
18
18
  static flags = {
19
19
  json: core_1.Flags.boolean({ description: 'Output as JSON' }),
20
20
  at: core_1.Flags.string({
21
- description: 'First fire time as ISO-8601 UTC (e.g. 2026-06-01T15:30:00Z)',
21
+ description: 'First fire time as ISO-8601 UTC ending in Z (e.g. 2026-06-01T15:30:00Z); numeric offsets such as +00:00 are not accepted',
22
22
  }),
23
23
  cron: core_1.Flags.string({
24
24
  description: 'Recurrence cron pattern (UTC unless --timezone is set)',
@@ -36,7 +36,7 @@ class TasksSchedule extends base_command_1.BaseCommand {
36
36
  dependsOn: ['cron'],
37
37
  }),
38
38
  'from-json': core_1.Flags.string({
39
- description: 'Path to a JSON file (or "-" for stdin) with the schedule body',
39
+ description: 'Path to a JSON file (or "-" for stdin) with the schedule body; scheduledFor must use ISO-8601 UTC ending in Z',
40
40
  }),
41
41
  };
42
42
  async run() {
@@ -63,7 +63,7 @@ class TasksSchedule extends base_command_1.BaseCommand {
63
63
  recurrence,
64
64
  });
65
65
  if (!payload.scheduledFor || typeof payload.scheduledFor !== 'string') {
66
- this.error('A first-fire time is required. Pass --at <ISO-8601> or include scheduledFor in --from-json.', { exit: 1 });
66
+ this.error('A first-fire time is required. Pass --at <ISO-8601 UTC ending in Z> or include scheduledFor in --from-json using the same format.', { exit: 1 });
67
67
  }
68
68
  let result;
69
69
  try {
@@ -82,7 +82,7 @@ function renderCommitmentTerms(commitment, log) {
82
82
  ? `${subject.type} ${subject.label || subject.externalKey}`
83
83
  : 'standing (not about one instance)'}`);
84
84
  const sensors = commitment.sensors ?? [];
85
- log(`Watches: ${sensors.length
85
+ log(`Sensors: ${sensors.length
86
86
  ? sensors
87
87
  .map((s) => `${sensorRefKey(s)}${s.sensorType ? ` (${s.sensorType})` : ''}`)
88
88
  .join(', ')
@@ -5,6 +5,13 @@ export type MemoryMount = SharedMemoryMount;
5
5
  export type MemoryStore = SharedMemoryStore & {
6
6
  mount: SharedMemoryMount;
7
7
  };
8
+ export type MemoryStoreResolution = {
9
+ storeId: string;
10
+ outcome: 'existing' | 'created' | 'adopted' | 'existing_after_race' | 'unconfirmed';
11
+ metadataChanged: boolean | null;
12
+ };
13
+ export declare function parseMemoryStoreResolutions(value: unknown): MemoryStoreResolution[] | undefined;
14
+ export declare function memoryStoreResolutionLines(resolutions?: MemoryStoreResolution[]): string[];
8
15
  export declare function parseMemoryMount(value: unknown): MemoryMount;
9
16
  export declare function parseMountedMemoryStore(value: unknown): MemoryStore;
10
17
  export declare const scopedMemoryFlags: {
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ScopedMemoryCommand = exports.versionedMutationFlags = exports.mutationFlags = exports.scopedMemoryFlags = void 0;
4
+ exports.parseMemoryStoreResolutions = parseMemoryStoreResolutions;
5
+ exports.memoryStoreResolutionLines = memoryStoreResolutionLines;
4
6
  exports.parseMemoryMount = parseMemoryMount;
5
7
  exports.parseMountedMemoryStore = parseMountedMemoryStore;
6
8
  exports.parseMemoryApiError = parseMemoryApiError;
@@ -8,6 +10,40 @@ const core_1 = require("@oclif/core");
8
10
  const node_crypto_1 = require("node:crypto");
9
11
  const base_command_1 = require("../base-command");
10
12
  const api_fetch_1 = require("./api-fetch");
13
+ function parseMemoryStoreResolutions(value) {
14
+ if (value === undefined)
15
+ return undefined;
16
+ if (!Array.isArray(value))
17
+ throw new Error('Invalid Memory Store resolution response from server');
18
+ return value.map((entry) => {
19
+ const resolution = entry;
20
+ const changed = resolution?.outcome === 'created' || resolution?.outcome === 'adopted';
21
+ const expectedChange = resolution?.outcome === 'unconfirmed' ? null : changed;
22
+ if (!resolution || typeof resolution.storeId !== 'string' || !resolution.storeId ||
23
+ !['existing', 'created', 'adopted', 'existing_after_race', 'unconfirmed']
24
+ .includes(String(resolution.outcome)) || resolution.metadataChanged !== expectedChange) {
25
+ throw new Error('Invalid Memory Store resolution response from server');
26
+ }
27
+ return {
28
+ storeId: resolution.storeId,
29
+ outcome: resolution.outcome,
30
+ metadataChanged: resolution.metadataChanged,
31
+ };
32
+ });
33
+ }
34
+ function memoryStoreResolutionLines(resolutions) {
35
+ if (!resolutions) {
36
+ return ['Store initialization outcome was not reported by this server; discovery may create default Store metadata or adopt a legacy Store into this workspace.'];
37
+ }
38
+ const labels = {
39
+ existing: 'Reused existing Store metadata',
40
+ created: 'Created default Store metadata',
41
+ adopted: 'Adopted legacy Store metadata into this workspace',
42
+ existing_after_race: 'Reused Store metadata from a concurrent creator',
43
+ unconfirmed: 'Store metadata initialization outcome is unconfirmed',
44
+ };
45
+ return resolutions.map((resolution) => `${labels[resolution.outcome]}: ${resolution.storeId}`);
46
+ }
11
47
  // The public CLI must not load the private data-schemas package at runtime.
12
48
  // The API validates the full wire contract; check the fields used by CLI commands
13
49
  // before treating a response as a mounted Store or mount.
@@ -27199,7 +27199,7 @@
27199
27199
  "required": true
27200
27200
  }
27201
27201
  },
27202
- "description": "Per-commitment analytics (joined checks, outcomes, runs)",
27202
+ "description": "Daily Check/outcome analytics; use --ledger for joined native Runs. Legacy totals.autoRuns is not a native Run count",
27203
27203
  "examples": [
27204
27204
  "<%= config.bin %> commitments analytics detail obj_abc123",
27205
27205
  "<%= config.bin %> commitments analytics detail obj_abc123 --days 30",
@@ -27253,7 +27253,7 @@
27253
27253
  "type": "option"
27254
27254
  },
27255
27255
  "ledger": {
27256
- "description": "Show the joined ledger projection instead",
27256
+ "description": "Show joined checks, native Runs and deliveries instead of daily Check/outcome metrics",
27257
27257
  "name": "ledger",
27258
27258
  "allowNo": false,
27259
27259
  "type": "boolean"
@@ -63745,7 +63745,7 @@
63745
63745
  "memory:mounts:resolve": {
63746
63746
  "aliases": [],
63747
63747
  "args": {},
63748
- "description": "Resolve the ACL-aware Memory mounts for an Agent session",
63748
+ "description": "Resolve ACL-aware Memory mounts; discovery may initialize default Store metadata",
63749
63749
  "flags": {
63750
63750
  "bare": {
63751
63751
  "description": "Bare mode — ignore keychain/file credential sources. Token must come from env or --token.",
@@ -65674,7 +65674,7 @@
65674
65674
  "memory:stores:list": {
65675
65675
  "aliases": [],
65676
65676
  "args": {},
65677
- "description": "List Memory Stores mounted for an Agent session",
65677
+ "description": "List mounted Memory Stores; discovery may initialize default Store metadata",
65678
65678
  "flags": {
65679
65679
  "bare": {
65680
65680
  "description": "Bare mode — ignore keychain/file credential sources. Token must come from env or --token.",
@@ -78431,7 +78431,7 @@
78431
78431
  "signals:monitors:validate": {
78432
78432
  "aliases": [],
78433
78433
  "args": {},
78434
- "description": "Compile-only check of a Monitor definition; nothing is persisted",
78434
+ "description": "Compile-only check of a Monitor definition; nothing is persisted. Requires active Signal Sources owned by you in the selected workspace. Inspect each source with signals sources show before validating.",
78435
78435
  "flags": {
78436
78436
  "bare": {
78437
78437
  "description": "Bare mode — ignore keychain/file credential sources. Token must come from env or --token.",
@@ -94243,7 +94243,7 @@
94243
94243
  "type": "option"
94244
94244
  },
94245
94245
  "graph": {
94246
- "description": "Required exactly once with --draft/--starter: path to graph JSON ({ nodes, edges })",
94246
+ "description": "Required exactly once with --draft/--starter: path to graph JSON ({ nodes, edges }); inspect config with spaces workflows node-types",
94247
94247
  "name": "graph",
94248
94248
  "hasDynamicHelp": false,
94249
94249
  "multiple": false,
@@ -94726,6 +94726,80 @@
94726
94726
  "list.js"
94727
94727
  ]
94728
94728
  },
94729
+ "spaces:workflows:node-types": {
94730
+ "aliases": [],
94731
+ "args": {
94732
+ "type": {
94733
+ "description": "Node type; omit to list all types",
94734
+ "name": "type"
94735
+ }
94736
+ },
94737
+ "description": "Read node config fields, defaults and review lens preset choices from the installed CLI catalog (no server requests)",
94738
+ "examples": [
94739
+ "<%= config.bin %> spaces workflows node-types",
94740
+ "<%= config.bin %> spaces workflows node-types loop --json",
94741
+ "<%= config.bin %> spaces workflows node-types review_loop --json"
94742
+ ],
94743
+ "flags": {
94744
+ "bare": {
94745
+ "description": "Bare mode — ignore keychain/file credential sources. Token must come from env or --token.",
94746
+ "name": "bare",
94747
+ "allowNo": false,
94748
+ "type": "boolean"
94749
+ },
94750
+ "token": {
94751
+ "description": "Bearer token for this invocation (debugging/impersonation). Overrides env and stored creds.",
94752
+ "name": "token",
94753
+ "hasDynamicHelp": false,
94754
+ "multiple": false,
94755
+ "type": "option"
94756
+ },
94757
+ "workspace": {
94758
+ "description": "Workspace ID for workspace-scoped requests (also sets X-Workspace-Id).",
94759
+ "name": "workspace",
94760
+ "hasDynamicHelp": false,
94761
+ "multiple": false,
94762
+ "type": "option"
94763
+ },
94764
+ "profile": {
94765
+ "description": "Which stored session to use. Each profile keeps its own credential and deployment, so signing into one does not sign you out of another. Also OVERSKY_PROFILE. List them with `profiles list`.",
94766
+ "name": "profile",
94767
+ "hasDynamicHelp": false,
94768
+ "multiple": false,
94769
+ "type": "option"
94770
+ },
94771
+ "raw": {
94772
+ "description": "With --json, keep the Mongo storage fields (_id next to id, __v) that the CLI otherwise strips. Also OVERSKY_CLI_RAW=1.",
94773
+ "name": "raw",
94774
+ "allowNo": false,
94775
+ "type": "boolean"
94776
+ },
94777
+ "json": {
94778
+ "description": "Output node fields, choices and default node JSON",
94779
+ "name": "json",
94780
+ "allowNo": false,
94781
+ "type": "boolean"
94782
+ }
94783
+ },
94784
+ "hasDynamicHelp": false,
94785
+ "hiddenAliases": [],
94786
+ "id": "spaces:workflows:node-types",
94787
+ "pluginAlias": "@skrr-ai/cli",
94788
+ "pluginName": "@skrr-ai/cli",
94789
+ "pluginType": "core",
94790
+ "strict": true,
94791
+ "enableJsonFlag": false,
94792
+ "autonomousCredentialPolicy": "delegated",
94793
+ "resolveSpaceFlag": true,
94794
+ "isESM": false,
94795
+ "relativePath": [
94796
+ "dist",
94797
+ "commands",
94798
+ "spaces",
94799
+ "workflows",
94800
+ "node-types.js"
94801
+ ]
94802
+ },
94729
94803
  "spaces:workflows:pause": {
94730
94804
  "aliases": [],
94731
94805
  "args": {
@@ -96892,7 +96966,7 @@
96892
96966
  "type": "boolean"
96893
96967
  },
96894
96968
  "graph": {
96895
- "description": "Path to graph JSON ({ nodes, edges })",
96969
+ "description": "Path to graph JSON ({ nodes, edges }); inspect config with spaces workflows node-types",
96896
96970
  "name": "graph",
96897
96971
  "hasDynamicHelp": false,
96898
96972
  "multiple": false,
@@ -96906,14 +96980,14 @@
96906
96980
  "type": "option"
96907
96981
  },
96908
96982
  "semantic-revision": {
96909
- "description": "Expected semantic revision; defaults to the latest server value",
96983
+ "description": "Expected semantic revision; pass with --presentation-revision. For graph/draft writes, omit both to fetch the latest server revisions",
96910
96984
  "name": "semantic-revision",
96911
96985
  "hasDynamicHelp": false,
96912
96986
  "multiple": false,
96913
96987
  "type": "option"
96914
96988
  },
96915
96989
  "max-duration": {
96916
- "description": "Run duration limit, e.g. 90m, 4h or 2d. A run still open past it is cancelled with WORKFLOW_RUN_DEADLINE. Applies from the next publish; runs already started keep their deadline",
96990
+ "description": "Run duration limit from 5m to 90d inclusive, e.g. 90m, 4h or 2d. A run still open past it is cancelled with WORKFLOW_RUN_DEADLINE. Applies from the next publish; runs already started keep their deadline",
96917
96991
  "name": "max-duration",
96918
96992
  "hasDynamicHelp": false,
96919
96993
  "multiple": false,
@@ -96926,7 +97000,7 @@
96926
97000
  "type": "boolean"
96927
97001
  },
96928
97002
  "presentation-revision": {
96929
- "description": "Expected presentation revision; defaults to the latest server value",
97003
+ "description": "Expected presentation revision; pass with --semantic-revision. For graph/draft writes, omit both to fetch the latest server revisions",
96930
97004
  "name": "presentation-revision",
96931
97005
  "hasDynamicHelp": false,
96932
97006
  "multiple": false,
@@ -117133,7 +117207,7 @@
117133
117207
  "type": "boolean"
117134
117208
  },
117135
117209
  "at": {
117136
- "description": "First fire time as ISO-8601 UTC (e.g. 2026-06-01T15:30:00Z)",
117210
+ "description": "First fire time as ISO-8601 UTC ending in Z (e.g. 2026-06-01T15:30:00Z); numeric offsets such as +00:00 are not accepted",
117137
117211
  "name": "at",
117138
117212
  "hasDynamicHelp": false,
117139
117213
  "multiple": false,
@@ -117177,7 +117251,7 @@
117177
117251
  "type": "option"
117178
117252
  },
117179
117253
  "from-json": {
117180
- "description": "Path to a JSON file (or \"-\" for stdin) with the schedule body",
117254
+ "description": "Path to a JSON file (or \"-\" for stdin) with the schedule body; scheduledFor must use ISO-8601 UTC ending in Z",
117181
117255
  "name": "from-json",
117182
117256
  "hasDynamicHelp": false,
117183
117257
  "multiple": false,
@@ -131288,5 +131362,5 @@
131288
131362
  ]
131289
131363
  }
131290
131364
  },
131291
- "version": "0.1.99"
131365
+ "version": "0.1.101"
131292
131366
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skrr-ai/cli",
3
- "version": "0.1.99",
3
+ "version": "0.1.101",
4
4
  "description": "Command-line interface for skrr",
5
5
  "license": "ISC",
6
6
  "author": "skrr",