@open-agent-toolkit/cli 0.1.34 → 0.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/assets/agents/oat-reviewer.md +22 -2
  2. package/assets/docs/cli-utilities/config-and-local-state.md +11 -5
  3. package/assets/docs/cli-utilities/tool-packs.md +1 -1
  4. package/assets/docs/cli-utilities/workflow-gates.md +103 -19
  5. package/assets/docs/contributing/design-principles.md +1 -1
  6. package/assets/docs/reference/cli-reference.md +4 -3
  7. package/assets/public-package-versions.json +4 -4
  8. package/assets/skills/oat-project-implement/SKILL.md +7 -3
  9. package/assets/skills/oat-project-import-plan/SKILL.md +53 -9
  10. package/assets/skills/oat-project-plan/SKILL.md +7 -3
  11. package/assets/skills/oat-project-quick-start/SKILL.md +37 -9
  12. package/assets/skills/oat-project-review-provide/SKILL.md +12 -4
  13. package/assets/skills/oat-project-review-receive/SKILL.md +3 -1
  14. package/dist/app/create-program.d.ts.map +1 -1
  15. package/dist/app/create-program.js +3 -6
  16. package/dist/app/help-config.d.ts +12 -0
  17. package/dist/app/help-config.d.ts.map +1 -0
  18. package/dist/app/help-config.js +15 -0
  19. package/dist/commands/doctor/index.d.ts.map +1 -1
  20. package/dist/commands/doctor/index.js +2 -1
  21. package/dist/commands/gate/index.d.ts.map +1 -1
  22. package/dist/commands/gate/index.js +352 -16
  23. package/dist/commands/gate/review-verdict.d.ts +15 -0
  24. package/dist/commands/gate/review-verdict.d.ts.map +1 -0
  25. package/dist/commands/gate/review-verdict.js +180 -0
  26. package/dist/commands/index.d.ts.map +1 -1
  27. package/dist/commands/index.js +4 -0
  28. package/dist/commands/init/index.d.ts.map +1 -1
  29. package/dist/commands/init/index.js +2 -1
  30. package/dist/commands/init/tools/brainstorm/index.d.ts.map +1 -1
  31. package/dist/commands/init/tools/brainstorm/index.js +2 -1
  32. package/dist/commands/init/tools/core/index.d.ts.map +1 -1
  33. package/dist/commands/init/tools/core/index.js +18 -0
  34. package/dist/commands/init/tools/docs/index.d.ts.map +1 -1
  35. package/dist/commands/init/tools/docs/index.js +2 -1
  36. package/dist/commands/init/tools/ideas/index.d.ts.map +1 -1
  37. package/dist/commands/init/tools/ideas/index.js +2 -1
  38. package/dist/commands/init/tools/project-management/index.d.ts.map +1 -1
  39. package/dist/commands/init/tools/project-management/index.js +19 -0
  40. package/dist/commands/init/tools/research/index.d.ts.map +1 -1
  41. package/dist/commands/init/tools/research/index.js +2 -1
  42. package/dist/commands/init/tools/utility/index.d.ts.map +1 -1
  43. package/dist/commands/init/tools/utility/index.js +2 -1
  44. package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
  45. package/dist/commands/init/tools/workflows/index.js +2 -1
  46. package/dist/commands/project/split/evaluate-signals.d.ts.map +1 -1
  47. package/dist/commands/project/split/evaluate-signals.js +11 -1
  48. package/dist/commands/project/split/run.d.ts.map +1 -1
  49. package/dist/commands/project/split/run.js +14 -0
  50. package/dist/commands/project/split/validate-plan.d.ts.map +1 -1
  51. package/dist/commands/project/split/validate-plan.js +30 -6
  52. package/dist/commands/project/validate-plan/index.d.ts +6 -1
  53. package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
  54. package/dist/commands/project/validate-plan/index.js +36 -9
  55. package/dist/commands/providers/inspect/inspect.d.ts.map +1 -1
  56. package/dist/commands/providers/inspect/inspect.js +2 -1
  57. package/dist/commands/providers/list/list.d.ts.map +1 -1
  58. package/dist/commands/providers/list/list.js +2 -1
  59. package/dist/commands/providers/set/index.d.ts.map +1 -1
  60. package/dist/commands/providers/set/index.js +6 -2
  61. package/dist/commands/remove/skill/remove-skill.d.ts.map +1 -1
  62. package/dist/commands/remove/skill/remove-skill.js +2 -1
  63. package/dist/commands/remove/skills/remove-skills.d.ts.map +1 -1
  64. package/dist/commands/remove/skills/remove-skills.js +2 -1
  65. package/dist/commands/repo/pr-comments/triage-collection/triage-comments.d.ts +1 -0
  66. package/dist/commands/repo/pr-comments/triage-collection/triage-comments.d.ts.map +1 -1
  67. package/dist/commands/repo/pr-comments/triage-collection/triage-comments.js +25 -13
  68. package/dist/commands/shared/scope-option.d.ts +21 -0
  69. package/dist/commands/shared/scope-option.d.ts.map +1 -0
  70. package/dist/commands/shared/scope-option.js +24 -0
  71. package/dist/commands/status/index.d.ts.map +1 -1
  72. package/dist/commands/status/index.js +2 -1
  73. package/dist/commands/sync/index.d.ts.map +1 -1
  74. package/dist/commands/sync/index.js +2 -1
  75. package/dist/commands/tools/info/index.d.ts.map +1 -1
  76. package/dist/commands/tools/info/index.js +2 -1
  77. package/dist/commands/tools/install/index.d.ts.map +1 -1
  78. package/dist/commands/tools/install/index.js +2 -0
  79. package/dist/commands/tools/list/index.d.ts.map +1 -1
  80. package/dist/commands/tools/list/index.js +2 -1
  81. package/dist/commands/tools/outdated/index.d.ts.map +1 -1
  82. package/dist/commands/tools/outdated/index.js +2 -1
  83. package/dist/commands/tools/remove/index.d.ts.map +1 -1
  84. package/dist/commands/tools/remove/index.js +2 -1
  85. package/dist/commands/tools/update/index.d.ts.map +1 -1
  86. package/dist/commands/tools/update/index.js +6 -2
  87. package/dist/config/oat-config.js +1 -1
  88. package/package.json +2 -2
@@ -1,15 +1,19 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { buildCommandContext } from '../../../app/command-context.js';
3
+ import { buildCommandContext, } from '../../../app/command-context.js';
4
4
  import { readGlobalOptions } from '../../shared/shared.utils.js';
5
5
  import { Command } from 'commander';
6
6
  import { extractPhaseIdsFromPlan, parseFrontmatterFromContent, validateParallelGroups, } from './validate-plan.js';
7
- export function createProjectValidatePlanCommand() {
7
+ const DEFAULT_DEPENDENCIES = {
8
+ buildCommandContext,
9
+ };
10
+ export function createProjectValidatePlanCommand(overrides = {}) {
11
+ const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
8
12
  return new Command('validate-plan')
9
13
  .description('Validate plan.md parallelism metadata against the plan phase list')
10
14
  .option('--project-path <path>', 'project directory containing plan.md', process.cwd())
11
15
  .action((options, command) => {
12
- const context = buildCommandContext(readGlobalOptions(command));
16
+ const context = dependencies.buildCommandContext(readGlobalOptions(command));
13
17
  const planPath = join(options.projectPath, 'plan.md');
14
18
  let content;
15
19
  try {
@@ -17,13 +21,26 @@ export function createProjectValidatePlanCommand() {
17
21
  }
18
22
  catch (err) {
19
23
  const message = err instanceof Error ? err.message : String(err);
20
- context.logger.error(`Failed to read plan.md: ${message}`);
24
+ if (context.json) {
25
+ context.logger.json({ valid: false, errors: [message] });
26
+ }
27
+ else {
28
+ context.logger.error(`Failed to read plan.md: ${message}`);
29
+ }
21
30
  process.exitCode = 2;
22
31
  return;
23
32
  }
24
33
  const frontmatterResult = parseFrontmatterFromContent(content);
25
34
  if (frontmatterResult.kind === 'invalid') {
26
- context.logger.error(frontmatterResult.message);
35
+ if (context.json) {
36
+ context.logger.json({
37
+ valid: false,
38
+ errors: [frontmatterResult.message],
39
+ });
40
+ }
41
+ else {
42
+ context.logger.error(frontmatterResult.message);
43
+ }
27
44
  process.exitCode = 1;
28
45
  return;
29
46
  }
@@ -31,13 +48,23 @@ export function createProjectValidatePlanCommand() {
31
48
  const phaseIds = extractPhaseIdsFromPlan(content);
32
49
  const result = validateParallelGroups(groups, phaseIds);
33
50
  if (result.valid) {
34
- context.logger.success('Plan validation passed.');
51
+ if (context.json) {
52
+ context.logger.json({ valid: true });
53
+ }
54
+ else {
55
+ context.logger.success('Plan validation passed.');
56
+ }
35
57
  process.exitCode = 0;
36
58
  return;
37
59
  }
38
- context.logger.error('Plan validation failed:');
39
- for (const err of result.errors) {
40
- context.logger.error(` - ${err}`);
60
+ if (context.json) {
61
+ context.logger.json({ valid: false, errors: result.errors });
62
+ }
63
+ else {
64
+ context.logger.error('Plan validation failed:');
65
+ for (const err of result.errors) {
66
+ context.logger.error(` - ${err}`);
67
+ }
41
68
  }
42
69
  process.exitCode = 1;
43
70
  });
@@ -1 +1 @@
1
- {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../../src/commands/providers/inspect/inspect.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,4BAA4B,EAC7B,MAAM,qCAAqC,CAAC;AAmB7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuLpC,wBAAgB,6BAA6B,CAC3C,SAAS,GAAE,OAAO,CAAC,4BAA4B,CAAM,GACpD,OAAO,CAiBT"}
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../../src/commands/providers/inspect/inspect.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,4BAA4B,EAC7B,MAAM,qCAAqC,CAAC;AAoB7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuLpC,wBAAgB,6BAA6B,CAC3C,SAAS,GAAE,OAAO,CAAC,4BAA4B,CAAM,GACpD,OAAO,CAiBT"}
@@ -1,5 +1,6 @@
1
1
  import { join } from 'node:path';
2
2
  import { buildCommandContext } from '../../../app/command-context.js';
3
+ import { withScopeOption } from '../../shared/scope-option.js';
3
4
  import { readGlobalOptions, resolveConcreteScopes, } from '../../shared/shared.utils.js';
4
5
  import { detectDrift } from '../../../drift/index.js';
5
6
  import { normalizeToPosixPath, resolveProjectRoot, resolveScopeRoot, } from '../../../fs/paths.js';
@@ -149,7 +150,7 @@ export function createProvidersInspectCommand(overrides = {}) {
149
150
  ...createDependencies(),
150
151
  ...overrides,
151
152
  };
152
- return new Command('inspect')
153
+ return withScopeOption(new Command('inspect'))
153
154
  .description('Inspect provider details and mapping state')
154
155
  .argument('<provider>', 'Provider name')
155
156
  .action(async (providerName, _options, command) => {
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/commands/providers/list/list.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,yBAAyB,EAC1B,MAAM,qCAAqC,CAAC;AAmB7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwMpC,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAcT"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/commands/providers/list/list.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,yBAAyB,EAC1B,MAAM,qCAAqC,CAAC;AAoB7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwMpC,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAcT"}
@@ -1,5 +1,6 @@
1
1
  import { join } from 'node:path';
2
2
  import { buildCommandContext } from '../../../app/command-context.js';
3
+ import { withScopeOption } from '../../shared/scope-option.js';
3
4
  import { readGlobalOptions, resolveConcreteScopes, } from '../../shared/shared.utils.js';
4
5
  import { detectDrift } from '../../../drift/index.js';
5
6
  import { normalizeToPosixPath, resolveProjectRoot, resolveScopeRoot, } from '../../../fs/paths.js';
@@ -166,7 +167,7 @@ export function createProvidersListCommand(overrides = {}) {
166
167
  ...createDependencies(),
167
168
  ...overrides,
168
169
  };
169
- return new Command('list')
170
+ return withScopeOption(new Command('list'))
170
171
  .description('List provider adapters and sync summary')
171
172
  .action(async (_options, command) => {
172
173
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/providers/set/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAcpF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+JpC,wBAAgB,yBAAyB,CACvC,SAAS,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAChD,OAAO,CAgBT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/providers/set/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAepF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+JpC,wBAAgB,yBAAyB,CACvC,SAAS,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAChD,OAAO,CAmBT"}
@@ -1,5 +1,6 @@
1
1
  import { join } from 'node:path';
2
2
  import { buildCommandContext } from '../../../app/command-context.js';
3
+ import { withScopeOption } from '../../shared/scope-option.js';
3
4
  import { readGlobalOptions } from '../../shared/shared.utils.js';
4
5
  import { DEFAULT_SYNC_CONFIG, loadSyncConfig, saveSyncConfig, } from '../../../config/index.js';
5
6
  import { resolveProjectRoot } from '../../../fs/paths.js';
@@ -9,7 +10,7 @@ import { copilotAdapter } from '../../../providers/copilot/index.js';
9
10
  import { cursorAdapter } from '../../../providers/cursor/index.js';
10
11
  import { geminiAdapter } from '../../../providers/gemini/index.js';
11
12
  import { Command } from 'commander';
12
- const PROJECT_SCOPE_ONLY_MESSAGE = 'oat providers set currently supports only --scope project. Re-run with --scope project.';
13
+ const PROJECT_SCOPE_ONLY_MESSAGE = 'oat providers set only supports project scope. Remove --scope or pass --scope project.';
13
14
  function parseCsvList(raw) {
14
15
  if (!raw) {
15
16
  return [];
@@ -127,7 +128,10 @@ export function createProvidersSetCommand(overrides = {}) {
127
128
  ...createDependencies(),
128
129
  ...overrides,
129
130
  };
130
- return new Command('set')
131
+ // Default to 'project' scope: providers set only supports project scope, so
132
+ // a bare `oat providers set --enabled X` should succeed without requiring
133
+ // an explicit --scope project flag.
134
+ return withScopeOption(new Command('set'), 'project')
131
135
  .description('Enable or disable project providers in sync config')
132
136
  .option('--enabled <providers>', 'Comma-separated providers to enable')
133
137
  .option('--disabled <providers>', 'Comma-separated providers to disable')
@@ -1 +1 @@
1
- {"version":3,"file":"remove-skill.d.ts","sourceRoot":"","sources":["../../../../src/commands/remove/skill/remove-skill.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EACL,iBAAiB,EAElB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EACL,KAAK,yBAAyB,EAG9B,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,KAC1C,cAAc,CAAC;IACpB,gBAAgB,EAAE,CAChB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5D,WAAW,EAAE,MAAM,eAAe,EAAE,CAAC;IACrC,sBAAsB,EAAE,CACtB,QAAQ,EAAE,eAAe,EAAE,EAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,KACf,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACxC,eAAe,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;IAC3E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED,wBAAgB,oCAAoC,IAAI,uBAAuB,CAgC9E;AAgKD,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,uBAAuB,GACpC,OAAO,CAAC,OAAO,CAAC,CAsDlB;AAED,wBAAgB,wBAAwB,CACtC,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CAwCT"}
1
+ {"version":3,"file":"remove-skill.d.ts","sourceRoot":"","sources":["../../../../src/commands/remove/skill/remove-skill.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EACL,iBAAiB,EAElB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EACL,KAAK,yBAAyB,EAG9B,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,KAC1C,cAAc,CAAC;IACpB,gBAAgB,EAAE,CAChB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5D,WAAW,EAAE,MAAM,eAAe,EAAE,CAAC;IACrC,sBAAsB,EAAE,CACtB,QAAQ,EAAE,eAAe,EAAE,EAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,KACf,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACxC,eAAe,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;IAC3E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED,wBAAgB,oCAAoC,IAAI,uBAAuB,CAgC9E;AAgKD,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,uBAAuB,GACpC,OAAO,CAAC,OAAO,CAAC,CAsDlB;AAED,wBAAgB,wBAAwB,CACtC,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CAwCT"}
@@ -1,6 +1,7 @@
1
1
  import { rm } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
3
  import { buildCommandContext } from '../../../app/command-context.js';
4
+ import { withScopeOption } from '../../shared/scope-option.js';
4
5
  import { readGlobalOptions, resolveConcreteScopes, } from '../../shared/shared.utils.js';
5
6
  import { DEFAULT_SYNC_CONFIG, loadSyncConfig, } from '../../../config/sync-config.js';
6
7
  import { dirExists, fileExists } from '../../../fs/io.js';
@@ -207,7 +208,7 @@ export function createRemoveSkillCommand(overrides = {}) {
207
208
  ...createDefaultRemoveSkillDependencies(),
208
209
  ...overrides,
209
210
  };
210
- return new Command('skill')
211
+ return withScopeOption(new Command('skill'))
211
212
  .description('Remove a single installed skill by name')
212
213
  .argument('<name>', 'Skill name (e.g., oat-idea-scratchpad)')
213
214
  .option('--dry-run', 'Preview removal without applying')
@@ -1 +1 @@
1
- {"version":3,"file":"remove-skills.d.ts","sourceRoot":"","sources":["../../../../src/commands/remove/skills/remove-skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,uBAAuB,EAE7B,MAAM,uBAAuB,CAAC;AAiB/B,UAAU,wBAAwB;IAChC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,KAC1C,cAAc,CAAC;IACpB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,cAAc,EAAE,CACd,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,uBAAuB,KAClC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,uBAAuB,EAAE,uBAAuB,CAAC;CAClD;AAqBD,wBAAgB,yBAAyB,CACvC,SAAS,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAChD,OAAO,CAsFT"}
1
+ {"version":3,"file":"remove-skills.d.ts","sourceRoot":"","sources":["../../../../src/commands/remove/skills/remove-skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAOhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,uBAAuB,EAE7B,MAAM,uBAAuB,CAAC;AAiB/B,UAAU,wBAAwB;IAChC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,KAC1C,cAAc,CAAC;IACpB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,cAAc,EAAE,CACd,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,uBAAuB,KAClC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,uBAAuB,EAAE,uBAAuB,CAAC;CAClD;AAqBD,wBAAgB,yBAAyB,CACvC,SAAS,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAChD,OAAO,CAsFT"}
@@ -4,6 +4,7 @@ import { IDEA_SKILLS } from '../../init/tools/ideas/install-ideas.js';
4
4
  import { RESEARCH_SKILLS } from '../../init/tools/research/install-research.js';
5
5
  import { UTILITY_SKILLS } from '../../init/tools/utility/install-utility.js';
6
6
  import { WORKFLOW_SKILLS } from '../../init/tools/workflows/install-workflows.js';
7
+ import { withScopeOption } from '../../shared/scope-option.js';
7
8
  import { confirmAction, } from '../../shared/shared.prompts.js';
8
9
  import { readGlobalOptions } from '../../shared/shared.utils.js';
9
10
  import { Command } from 'commander';
@@ -35,7 +36,7 @@ export function createRemoveSkillsCommand(overrides = {}) {
35
36
  ...createDependencies(),
36
37
  ...overrides,
37
38
  };
38
- return new Command('skills')
39
+ return withScopeOption(new Command('skills'))
39
40
  .description('Remove installed skills by pack')
40
41
  .requiredOption('--pack <pack>', 'Skill pack to remove (ideas|docs|workflows|utility|research)')
41
42
  .option('--dry-run', 'Preview removal without applying')
@@ -7,6 +7,7 @@ export interface TriageOptions {
7
7
  }
8
8
  export interface TriageDependencies {
9
9
  readJsonFile: (path: string) => Promise<CollectionChunk>;
10
+ fileExists: (path: string) => Promise<boolean>;
10
11
  }
11
12
  export declare const defaultTriageDependencies: TriageDependencies;
12
13
  export declare function runTriageComments(context: CommandContext, options: TriageOptions, deps?: TriageDependencies): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"triage-comments.d.ts","sourceRoot":"","sources":["../../../../../src/commands/repo/pr-comments/triage-collection/triage-comments.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;CAC1D;AAED,eAAO,MAAM,yBAAyB,EAAE,kBAKvC,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,kBAA8C,GACnD,OAAO,CAAC,IAAI,CAAC,CAsEf"}
1
+ {"version":3,"file":"triage-comments.d.ts","sourceRoot":"","sources":["../../../../../src/commands/repo/pr-comments/triage-collection/triage-comments.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACzD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,yBAAyB,EAAE,kBAMvC,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,kBAA8C,GACnD,OAAO,CAAC,IAAI,CAAC,CAgFf"}
@@ -8,22 +8,44 @@ export const defaultTriageDependencies = {
8
8
  const content = await readFile(path, 'utf8');
9
9
  return JSON.parse(content);
10
10
  },
11
+ fileExists,
11
12
  };
12
13
  export async function runTriageComments(context, options, deps = defaultTriageDependencies) {
13
14
  const { logger } = context;
14
15
  const { inputDir, outputDir, month } = options;
15
16
  const inputPath = join(inputDir, `${month}.json`);
16
- if (!(await fileExists(inputPath))) {
17
+ if (!(await deps.fileExists(inputPath))) {
17
18
  throw new CliError(`Collection file not found: ${inputPath}`);
18
19
  }
19
20
  const chunk = await deps.readJsonFile(inputPath);
20
21
  if (chunk.comments.length === 0) {
21
- logger.warn(`No comments in ${month} to triage.`);
22
+ if (context.json) {
23
+ logger.json({ status: 'ok', month, total: 0, comments: [] });
24
+ }
25
+ else {
26
+ logger.warn(`No comments in ${month} to triage.`);
27
+ }
22
28
  return;
23
29
  }
30
+ // Non-interactive path: emit collection state without prompting.
31
+ // This is the code path reached when --json is set or when running
32
+ // outside a TTY. Interactive triage is reserved for TTY sessions only.
24
33
  if (!context.interactive) {
25
- throw new CliError('Triage requires an interactive terminal. Remove --json flag or run in a TTY.');
34
+ if (context.json) {
35
+ logger.json({
36
+ status: 'ok',
37
+ month,
38
+ total: chunk.comments.length,
39
+ comments: chunk.comments,
40
+ });
41
+ }
42
+ else {
43
+ logger.info(`Collection ${month}: ${chunk.comments.length} comment(s) pending triage.`);
44
+ logger.info('Re-run in an interactive terminal to triage, or pass --json to retrieve the collection state.');
45
+ }
46
+ return;
26
47
  }
48
+ // Interactive path: prompt for each comment (TTY sessions only).
27
49
  logger.info(`Triaging ${chunk.comments.length} comments from ${month}...`);
28
50
  logger.info('For each comment, enter [k]eep or [d]iscard (default: keep).\n');
29
51
  const kept = [];
@@ -51,16 +73,6 @@ export async function runTriageComments(context, options, deps = defaultTriageDe
51
73
  const outputPath = join(outputDir, `${month}.triaged.json`);
52
74
  await writeFile(outputPath, `${JSON.stringify(outputChunk, null, 2)}\n`, 'utf8');
53
75
  logger.success(`Triage complete: kept ${kept.length}/${chunk.comments.length} comments → ${outputPath}`);
54
- if (context.json) {
55
- logger.json({
56
- status: 'ok',
57
- month,
58
- total: chunk.comments.length,
59
- kept: kept.length,
60
- discarded: chunk.comments.length - kept.length,
61
- outputPath,
62
- });
63
- }
64
76
  }
65
77
  function printCommentSummary(comment) {
66
78
  const lines = [
@@ -0,0 +1,21 @@
1
+ import type { Command } from 'commander';
2
+ /**
3
+ * Adds a local `--scope <scope>` option to the given command.
4
+ *
5
+ * `--scope` is deliberately NOT a global option because only a subset of
6
+ * commands consume it. Attaching it here (as a per-command option) means it
7
+ * appears in the command's own Options section and is rejected with an
8
+ * "unknown option" error on commands that do not call this helper.
9
+ *
10
+ * `readGlobalOptions` uses `command.optsWithGlobals()` which merges local and
11
+ * parent options, so `context.scope` is populated correctly with no changes to
12
+ * `buildCommandContext`.
13
+ *
14
+ * @param cmd - The Commander command to add the option to.
15
+ * @param defaultScope - The default scope value. Defaults to `'all'` for most
16
+ * commands. Use `'project'` for commands that only support project scope
17
+ * (e.g. `providers set`) so bare invocations succeed without requiring an
18
+ * explicit `--scope project` flag.
19
+ */
20
+ export declare function withScopeOption(cmd: Command, defaultScope?: 'project' | 'user' | 'all'): Command;
21
+ //# sourceMappingURL=scope-option.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-option.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/scope-option.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,YAAY,GAAE,SAAS,GAAG,MAAM,GAAG,KAAa,GAC/C,OAAO,CAMT"}
@@ -0,0 +1,24 @@
1
+ import { Option } from 'commander';
2
+ /**
3
+ * Adds a local `--scope <scope>` option to the given command.
4
+ *
5
+ * `--scope` is deliberately NOT a global option because only a subset of
6
+ * commands consume it. Attaching it here (as a per-command option) means it
7
+ * appears in the command's own Options section and is rejected with an
8
+ * "unknown option" error on commands that do not call this helper.
9
+ *
10
+ * `readGlobalOptions` uses `command.optsWithGlobals()` which merges local and
11
+ * parent options, so `context.scope` is populated correctly with no changes to
12
+ * `buildCommandContext`.
13
+ *
14
+ * @param cmd - The Commander command to add the option to.
15
+ * @param defaultScope - The default scope value. Defaults to `'all'` for most
16
+ * commands. Use `'project'` for commands that only support project scope
17
+ * (e.g. `providers set`) so bare invocations succeed without requiring an
18
+ * explicit `--scope project` flag.
19
+ */
20
+ export function withScopeOption(cmd, defaultScope = 'all') {
21
+ return cmd.addOption(new Option('--scope <scope>', 'Limit execution scope')
22
+ .choices(['project', 'user', 'all'])
23
+ .default(defaultScope));
24
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/status/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/status/index.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { basename, join, relative } from 'node:path';
2
2
  import { buildCommandContext, } from '../../app/command-context.js';
3
3
  import { adoptStrayToCanonical, isAdoptionConflictError, } from '../shared/adopt-stray.js';
4
4
  import { detectCodexRoleStrays, regenerateCodexAfterAdoption, } from '../shared/codex-strays.js';
5
+ import { withScopeOption } from '../shared/scope-option.js';
5
6
  import { confirmAction, selectManyWithAbort, } from '../shared/shared.prompts.js';
6
7
  import { readGlobalOptions, resolveConcreteScopes, } from '../shared/shared.utils.js';
7
8
  import { detectDrift, detectStrays, } from '../../drift/index.js';
@@ -350,7 +351,7 @@ export function createStatusCommand(overrides = {}) {
350
351
  ...DEFAULT_DEPENDENCIES,
351
352
  ...overrides,
352
353
  };
353
- return new Command('status')
354
+ return withScopeOption(new Command('status'))
354
355
  .description('Report provider sync and drift status')
355
356
  .option('--hook', 'Emit a minimal pre-commit message: warn on managed drift, info on strays')
356
357
  .action(async (options, command) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,cAAc,CAAC;AAoTtB,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CA6BT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,cAAc,CAAC;AAoTtB,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CA6BT"}
@@ -1,6 +1,7 @@
1
1
  import { join } from 'node:path';
2
2
  import { buildCommandContext } from '../../app/command-context.js';
3
3
  import { PROVIDER_CONFIG_REMEDIATION } from '../shared/messages.js';
4
+ import { withScopeOption } from '../shared/scope-option.js';
4
5
  import { selectManyWithAbort, } from '../shared/shared.prompts.js';
5
6
  import { readGlobalOptions, resolveConcreteScopes, } from '../shared/shared.utils.js';
6
7
  import { DEFAULT_SYNC_CONFIG, loadSyncConfig, saveSyncConfig, } from '../../config/index.js';
@@ -229,7 +230,7 @@ export function createSyncCommand(overrides = {}) {
229
230
  ...defaultDependencies(),
230
231
  ...overrides,
231
232
  };
232
- return new Command('sync')
233
+ return withScopeOption(new Command('sync'))
233
234
  .description('Sync canonical content to provider views')
234
235
  .option('--dry-run', 'Preview sync changes without applying')
235
236
  .addOption(new Option('--install-canonical <path>', 'Internal install sync filter')
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/info/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,oBAAoB,EAG1B,MAAM,aAAa,CAAC;AA2DrB,wBAAgB,sBAAsB,CACpC,YAAY,GAAE,oBAA0C,GACvD,OAAO,CAYT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/info/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,oBAAoB,EAG1B,MAAM,aAAa,CAAC;AA2DrB,wBAAgB,sBAAsB,CACpC,YAAY,GAAE,oBAA0C,GACvD,OAAO,CAYT"}
@@ -2,6 +2,7 @@ import { readFile } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
3
  import { buildCommandContext } from '../../../app/command-context.js';
4
4
  import { getFrontmatterBlock, getFrontmatterField, parseFrontmatterField, } from '../../shared/frontmatter.js';
5
+ import { withScopeOption } from '../../shared/scope-option.js';
5
6
  import { readGlobalOptions } from '../../shared/shared.utils.js';
6
7
  import { scanTools } from '../../tools/shared/scan-tools.js';
7
8
  import { resolveAssetsRoot } from '../../../fs/assets.js';
@@ -60,7 +61,7 @@ const defaultDependencies = {
60
61
  getToolDetail,
61
62
  };
62
63
  export function createToolsInfoCommand(dependencies = defaultDependencies) {
63
- return new Command('info')
64
+ return withScopeOption(new Command('info'))
64
65
  .description('Show details for an installed tool')
65
66
  .argument('<name>', 'Tool name')
66
67
  .action(async (name, _opts, command) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/install/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBzC,wBAAgB,yBAAyB,CACvC,gBAAgB,GAAE,oBAA8C,EAChE,aAAa,GAAE,OAAO,CAAC,qBAAqB,CAAM,EAClD,iBAAiB,CAAC,EAAE,MAAM,OAAO,GAChC,OAAO,CAoCT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/install/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBzC,wBAAgB,yBAAyB,CACvC,gBAAgB,GAAE,oBAA8C,EAChE,aAAa,GAAE,OAAO,CAAC,qBAAqB,CAAM,EAClD,iBAAiB,CAAC,EAAE,MAAM,OAAO,GAChC,OAAO,CAqCT"}
@@ -1,6 +1,7 @@
1
1
  import { execFile } from 'node:child_process';
2
2
  import { buildCommandContext } from '../../../app/command-context.js';
3
3
  import { consumeInitToolsRunMetadata, createInitToolsCommand, } from '../../init/tools/index.js';
4
+ import { withScopeOption } from '../../shared/scope-option.js';
4
5
  import { readGlobalOptions, resolveConcreteScopes, } from '../../shared/shared.utils.js';
5
6
  import { autoSync, } from '../../tools/shared/auto-sync.js';
6
7
  import { getInstalledCanonicalPaths as getInstallSyncCanonicalPaths } from '../../tools/shared/install-sync-context.js';
@@ -31,6 +32,7 @@ export function createToolsInstallCommand(syncDependencies = defaultSyncDependen
31
32
  ? createInitToolsCommand(initOverrides)
32
33
  : createBaseCommand();
33
34
  cmd.name('install');
35
+ withScopeOption(cmd);
34
36
  cmd.option('--no-sync', 'Skip auto-sync after install');
35
37
  cmd.hook('postAction', async (thisCommand, actionCommand) => {
36
38
  if (process.exitCode !== 0 && process.exitCode !== undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/list/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,qBAAqB,EAAgB,MAAM,cAAc,CAAC;AAWxE,wBAAgB,sBAAsB,CACpC,YAAY,GAAE,qBAA2C,GACxD,OAAO,CAQT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/list/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,qBAAqB,EAAgB,MAAM,cAAc,CAAC;AAWxE,wBAAgB,sBAAsB,CACpC,YAAY,GAAE,qBAA2C,GACxD,OAAO,CAQT"}
@@ -1,4 +1,5 @@
1
1
  import { buildCommandContext } from '../../../app/command-context.js';
2
+ import { withScopeOption } from '../../shared/scope-option.js';
2
3
  import { readGlobalOptions } from '../../shared/shared.utils.js';
3
4
  import { scanTools } from '../../tools/shared/scan-tools.js';
4
5
  import { resolveAssetsRoot } from '../../../fs/assets.js';
@@ -15,7 +16,7 @@ const defaultDependencies = {
15
16
  resolveAssetsRoot,
16
17
  };
17
18
  export function createToolsListCommand(dependencies = defaultDependencies) {
18
- return new Command('list')
19
+ return withScopeOption(new Command('list'))
19
20
  .description('List installed tools with version and status')
20
21
  .action(async (_opts, command) => {
21
22
  const globalOptions = readGlobalOptions(command);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/outdated/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,yBAAyB,EAE/B,MAAM,kBAAkB,CAAC;AAW1B,wBAAgB,0BAA0B,CACxC,YAAY,GAAE,yBAA+C,GAC5D,OAAO,CAQT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/outdated/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,yBAAyB,EAE/B,MAAM,kBAAkB,CAAC;AAW1B,wBAAgB,0BAA0B,CACxC,YAAY,GAAE,yBAA+C,GAC5D,OAAO,CAQT"}
@@ -1,4 +1,5 @@
1
1
  import { buildCommandContext } from '../../../app/command-context.js';
2
+ import { withScopeOption } from '../../shared/scope-option.js';
2
3
  import { readGlobalOptions } from '../../shared/shared.utils.js';
3
4
  import { scanTools } from '../../tools/shared/scan-tools.js';
4
5
  import { resolveAssetsRoot } from '../../../fs/assets.js';
@@ -15,7 +16,7 @@ const defaultDependencies = {
15
16
  resolveAssetsRoot,
16
17
  };
17
18
  export function createToolsOutdatedCommand(dependencies = defaultDependencies) {
18
- return new Command('outdated')
19
+ return withScopeOption(new Command('outdated'))
19
20
  .description('Show tools with available updates')
20
21
  .action(async (_opts, command) => {
21
22
  const globalOptions = readGlobalOptions(command);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/remove/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAM1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AA4CxB,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CAwGT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/remove/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAM1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AA4CxB,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CAwGT"}
@@ -1,6 +1,7 @@
1
1
  import { execFile } from 'node:child_process';
2
2
  import { rm, unlink } from 'node:fs/promises';
3
3
  import { buildCommandContext } from '../../../app/command-context.js';
4
+ import { withScopeOption } from '../../shared/scope-option.js';
4
5
  import { readGlobalOptions, resolveConcreteScopes, } from '../../shared/shared.utils.js';
5
6
  import { autoSync, } from '../../tools/shared/auto-sync.js';
6
7
  import { scanTools } from '../../tools/shared/scan-tools.js';
@@ -47,7 +48,7 @@ const VALID_PACKS = [
47
48
  'brainstorm',
48
49
  ];
49
50
  export function createToolsRemoveCommand(dependencies = defaultDependencies, syncDependencies = defaultSyncDependencies) {
50
- return new Command('remove')
51
+ return withScopeOption(new Command('remove'))
51
52
  .description('Remove installed tools')
52
53
  .argument('[name]', 'Tool name to remove')
53
54
  .option('--pack <pack>', 'Remove all tools in a pack (core|ideas|docs|workflows|utility|project-management|research|brainstorm)')
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAKvE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AAexB,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GAClD,MAAM,EAAE,CAUV;AAgCD,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CA4JT;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAI7E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAOT;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAMR"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAKvE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AAexB,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GAClD,MAAM,EAAE,CAaV;AAgCD,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CA4JT;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAI7E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAOT;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAMR"}
@@ -3,6 +3,7 @@ import { join } from 'node:path';
3
3
  import { buildCommandContext } from '../../../app/command-context.js';
4
4
  import { applyOatCoreGitignore } from '../../init/gitignore.js';
5
5
  import { copyDirWithStatus, copyFileWithStatus, } from '../../init/tools/shared/copy-helpers.js';
6
+ import { withScopeOption } from '../../shared/scope-option.js';
6
7
  import { readGlobalOptions, resolveConcreteScopes, } from '../../shared/shared.utils.js';
7
8
  import { autoSync, } from '../../tools/shared/auto-sync.js';
8
9
  import { scanTools } from '../../tools/shared/scan-tools.js';
@@ -26,14 +27,17 @@ const defaultDependencies = {
26
27
  applyOatCoreGitignore,
27
28
  };
28
29
  export function buildSyncSubprocessArgs(entrypoint, execArgv, options) {
30
+ // `--scope` is a per-command option on `sync` (not a global flag), so it must
31
+ // come AFTER the `sync` subcommand token. `--cwd` remains a global flag and
32
+ // can precede the subcommand.
29
33
  return [
30
34
  ...execArgv,
31
35
  entrypoint,
32
36
  '--cwd',
33
37
  options.cwd,
38
+ 'sync',
34
39
  '--scope',
35
40
  options.scope,
36
- 'sync',
37
41
  ];
38
42
  }
39
43
  const defaultSyncDependencies = {
@@ -62,7 +66,7 @@ const VALID_PACKS = [
62
66
  'brainstorm',
63
67
  ];
64
68
  export function createToolsUpdateCommand(dependencies = defaultDependencies, syncDependencies = defaultSyncDependencies) {
65
- return new Command('update')
69
+ return withScopeOption(new Command('update'))
66
70
  .description('Update installed tools to bundled versions')
67
71
  .argument('[name]', 'Tool name to update')
68
72
  .option('--pack <pack>', 'Update all tools in a pack (core|ideas|docs|workflows|utility|project-management|research|brainstorm)')
@@ -45,7 +45,7 @@ export const BUILTIN_EXEC_TARGETS = {
45
45
  },
46
46
  'cursor-default': {
47
47
  runtime: 'cursor',
48
- baseCommand: ['cursor-agent', '-p', '--force'],
48
+ baseCommand: ['cursor-agent', '-p'],
49
49
  hostDetectionCommand: ['sh', '-c', 'test -n "$CURSOR_AGENT"'],
50
50
  availabilityCommand: ['cursor-agent', '--version'],
51
51
  priority: 70,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.1.34",
3
+ "version": "0.1.36",
4
4
  "private": false,
5
5
  "description": "Open Agent Toolkit CLI",
6
6
  "homepage": "https://github.com/voxmedia/open-agent-toolkit/tree/main/packages/cli",
@@ -34,7 +34,7 @@
34
34
  "ora": "^9.0.0",
35
35
  "yaml": "2.8.2",
36
36
  "zod": "^3.25.76",
37
- "@open-agent-toolkit/control-plane": "0.1.34"
37
+ "@open-agent-toolkit/control-plane": "0.1.36"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.10.0",