@open-agent-toolkit/cli 0.0.43 → 0.0.51

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 (63) hide show
  1. package/assets/agents/oat-phase-implementer.md +230 -0
  2. package/assets/agents/oat-reviewer.md +3 -3
  3. package/assets/docs/cli-utilities/configuration.md +15 -3
  4. package/assets/docs/reference/cli-reference.md +17 -14
  5. package/assets/docs/reference/oat-directory-structure.md +17 -17
  6. package/assets/docs/workflows/projects/artifacts.md +34 -0
  7. package/assets/docs/workflows/projects/implementation-execution.md +161 -0
  8. package/assets/docs/workflows/projects/lifecycle.md +22 -29
  9. package/assets/docs/workflows/projects/reviews.md +4 -2
  10. package/assets/docs/workflows/skills/index.md +0 -1
  11. package/assets/public-package-versions.json +4 -4
  12. package/assets/skills/oat-doctor/SKILL.md +3 -3
  13. package/assets/skills/oat-project-implement/SKILL.md +363 -126
  14. package/assets/skills/oat-project-import-plan/SKILL.md +2 -3
  15. package/assets/skills/oat-project-next/SKILL.md +11 -12
  16. package/assets/skills/oat-project-plan/SKILL.md +23 -5
  17. package/assets/skills/oat-project-plan-writing/SKILL.md +2 -2
  18. package/assets/skills/oat-project-progress/SKILL.md +29 -35
  19. package/assets/skills/oat-project-quick-start/SKILL.md +13 -3
  20. package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +2 -2
  21. package/assets/templates/implementation.md +8 -3
  22. package/assets/templates/plan.md +24 -3
  23. package/assets/templates/state.md +1 -1
  24. package/dist/commands/config/index.d.ts.map +1 -1
  25. package/dist/commands/config/index.js +17 -4
  26. package/dist/commands/init/tools/index.js +1 -1
  27. package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
  28. package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
  29. package/dist/commands/init/tools/shared/skill-manifest.js +1 -1
  30. package/dist/commands/project/index.d.ts.map +1 -1
  31. package/dist/commands/project/index.js +3 -1
  32. package/dist/commands/project/set-mode/index.d.ts +0 -6
  33. package/dist/commands/project/set-mode/index.d.ts.map +1 -1
  34. package/dist/commands/project/set-mode/index.js +16 -96
  35. package/dist/commands/project/validate-plan/index.d.ts +3 -0
  36. package/dist/commands/project/validate-plan/index.d.ts.map +1 -0
  37. package/dist/commands/project/validate-plan/index.js +44 -0
  38. package/dist/commands/project/validate-plan/validate-plan.d.ts +20 -0
  39. package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -0
  40. package/dist/commands/project/validate-plan/validate-plan.js +77 -0
  41. package/dist/commands/tools/update/index.d.ts +4 -0
  42. package/dist/commands/tools/update/index.d.ts.map +1 -1
  43. package/dist/commands/tools/update/index.js +17 -1
  44. package/dist/commands/tools/update/update-tools.d.ts +1 -0
  45. package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
  46. package/dist/commands/tools/update/update-tools.js +80 -1
  47. package/dist/config/oat-config.d.ts +1 -0
  48. package/dist/config/oat-config.d.ts.map +1 -1
  49. package/dist/config/oat-config.js +3 -0
  50. package/dist/config/resolve.d.ts.map +1 -1
  51. package/dist/config/resolve.js +9 -0
  52. package/package.json +2 -2
  53. package/assets/skills/oat-project-subagent-implement/SKILL.md +0 -549
  54. package/assets/skills/oat-project-subagent-implement/examples/pattern-hill-checkpoint.md +0 -110
  55. package/assets/skills/oat-project-subagent-implement/examples/pattern-parallel-phases.md +0 -118
  56. package/assets/skills/oat-project-subagent-implement/scripts/dispatch.sh +0 -133
  57. package/assets/skills/oat-project-subagent-implement/scripts/reconcile.sh +0 -182
  58. package/assets/skills/oat-project-subagent-implement/scripts/review-gate.sh +0 -187
  59. package/assets/skills/oat-project-subagent-implement/tests/fixtures/sample-plan.md +0 -234
  60. package/assets/skills/oat-project-subagent-implement/tests/test-dry-run.sh +0 -126
  61. package/assets/skills/oat-project-subagent-implement/tests/test-hill-checkpoint.sh +0 -127
  62. package/assets/skills/oat-project-subagent-implement/tests/test-reconcile.sh +0 -254
  63. package/assets/skills/oat-project-subagent-implement/tests/test-review-gate.sh +0 -220
@@ -1,104 +1,24 @@
1
- import { readFile as defaultReadFile, writeFile as defaultWriteFile, } from 'node:fs/promises';
2
- import { join } from 'node:path';
3
1
  import { buildCommandContext } from '../../../app/command-context.js';
4
- import { getFrontmatterBlock, getFrontmatterField, } from '../../shared/frontmatter.js';
5
- import { replaceFrontmatter, upsertFrontmatterField, } from '../../shared/frontmatter-write.js';
6
2
  import { readGlobalOptions } from '../../shared/shared.utils.js';
7
- import { readOatLocalConfig } from '../../../config/oat-config.js';
8
- import { resolveProjectRoot } from '../../../fs/paths.js';
9
3
  import { Command } from 'commander';
10
- const ORCHESTRATION_DEFAULTS = [
11
- { field: 'oat_orchestration_merge_strategy', value: 'merge' },
12
- { field: 'oat_orchestration_retry_limit', value: '2' },
13
- { field: 'oat_orchestration_baseline_policy', value: 'strict' },
14
- { field: 'oat_orchestration_unit_granularity', value: 'phase' },
15
- ];
16
4
  const DEFAULT_DEPENDENCIES = {
17
5
  buildCommandContext,
18
- resolveProjectRoot,
19
- readFile: defaultReadFile,
20
- writeFile: defaultWriteFile,
21
- now: () => new Date(),
22
6
  };
23
- function isExecutionMode(value) {
24
- return value === 'single-thread' || value === 'subagent-driven';
25
- }
26
- async function runSetMode(modeArg, context, dependencies) {
27
- try {
28
- if (!isExecutionMode(modeArg)) {
29
- throw new Error(`Invalid mode: ${modeArg}. Expected one of: single-thread, subagent-driven.`);
30
- }
31
- const repoRoot = await dependencies.resolveProjectRoot(context.cwd);
32
- const localConfig = await readOatLocalConfig(repoRoot);
33
- const activeProject = localConfig.activeProject?.trim();
34
- if (!activeProject) {
35
- throw new Error('No active project found (.oat/config.local.json has no activeProject).');
36
- }
37
- const activeProjectPath = join(repoRoot, activeProject);
38
- const statePath = join(activeProjectPath, 'state.md');
39
- let stateContent;
40
- try {
41
- stateContent = await dependencies.readFile(statePath, 'utf8');
42
- }
43
- catch {
44
- throw new Error(`Active project state.md not found: ${statePath}`);
45
- }
46
- const frontmatterBlock = getFrontmatterBlock(stateContent);
47
- if (!frontmatterBlock) {
48
- throw new Error(`state.md is missing frontmatter: ${statePath}`);
49
- }
50
- const previousMode = getFrontmatterField(frontmatterBlock, 'oat_execution_mode');
51
- let currentBlock = frontmatterBlock;
52
- const modeUpdate = upsertFrontmatterField(currentBlock, 'oat_execution_mode', modeArg, true);
53
- currentBlock = modeUpdate.nextBlock;
54
- const defaultsAdded = [];
55
- if (modeArg === 'subagent-driven') {
56
- for (const entry of ORCHESTRATION_DEFAULTS) {
57
- const update = upsertFrontmatterField(currentBlock, entry.field, entry.value, false);
58
- currentBlock = update.nextBlock;
59
- if (update.added) {
60
- defaultsAdded.push(entry.field);
61
- }
62
- }
63
- }
64
- currentBlock = upsertFrontmatterField(currentBlock, 'oat_project_state_updated', dependencies.now().toISOString(), true).nextBlock;
65
- const updatedState = replaceFrontmatter(stateContent, currentBlock);
66
- await dependencies.writeFile(statePath, updatedState, 'utf8');
67
- if (context.json) {
68
- context.logger.json({
69
- status: 'ok',
70
- mode: modeArg,
71
- previousMode: previousMode || null,
72
- statePath,
73
- projectPath: activeProjectPath,
74
- defaultsAdded,
75
- });
76
- }
77
- else {
78
- context.logger.info(`Set execution mode to ${modeArg}`);
79
- context.logger.info(`Project: ${activeProjectPath}`);
80
- context.logger.info(`State: ${statePath}`);
81
- if (modeArg === 'subagent-driven') {
82
- if (defaultsAdded.length > 0) {
83
- context.logger.info(`Added orchestration defaults: ${defaultsAdded.join(', ')}`);
84
- }
85
- else {
86
- context.logger.info('Orchestration defaults already present; no defaults added.');
87
- }
88
- }
89
- }
7
+ const DEPRECATION_MESSAGE = 'Execution mode is no longer user-selectable; oat-project-implement is the single execution skill. No changes were made. This command will be removed in a future release.';
8
+ async function runSetMode(_modeArg, context) {
9
+ if (context.json) {
10
+ context.logger.json({
11
+ status: 'deprecated',
12
+ command: 'oat project set-mode',
13
+ message: DEPRECATION_MESSAGE,
14
+ noop: true,
15
+ });
90
16
  process.exitCode = 0;
17
+ return;
91
18
  }
92
- catch (error) {
93
- const message = error instanceof Error ? error.message : String(error);
94
- if (context.json) {
95
- context.logger.json({ status: 'error', message });
96
- }
97
- else {
98
- context.logger.error(message);
99
- }
100
- process.exitCode = 1;
101
- }
19
+ context.logger.warn("[deprecated] 'oat project set-mode' is a no-op.\n" +
20
+ `${DEPRECATION_MESSAGE}`);
21
+ process.exitCode = 0;
102
22
  }
103
23
  export function createProjectSetModeCommand(overrides = {}) {
104
24
  const dependencies = {
@@ -106,10 +26,10 @@ export function createProjectSetModeCommand(overrides = {}) {
106
26
  ...overrides,
107
27
  };
108
28
  return new Command('set-mode')
109
- .description('Set project implementation execution mode')
110
- .argument('<mode>', 'Execution mode: single-thread or subagent-driven')
29
+ .description('[deprecated] No-op. Execution mode is no longer selectable.')
30
+ .argument('<mode>', 'Ignored. Execution mode is no longer selectable.')
111
31
  .action(async (mode, _options, command) => {
112
32
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
113
- await runSetMode(mode, context, dependencies);
33
+ await runSetMode(mode, context);
114
34
  });
115
35
  }
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createProjectValidatePlanCommand(): Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/validate-plan/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,gCAAgC,IAAI,OAAO,CAgD1D"}
@@ -0,0 +1,44 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { buildCommandContext } from '../../../app/command-context.js';
4
+ import { readGlobalOptions } from '../../shared/shared.utils.js';
5
+ import { Command } from 'commander';
6
+ import { extractPhaseIdsFromPlan, parseFrontmatterFromContent, validateParallelGroups, } from './validate-plan.js';
7
+ export function createProjectValidatePlanCommand() {
8
+ return new Command('validate-plan')
9
+ .description('Validate plan.md parallelism metadata against the plan phase list')
10
+ .option('--project-path <path>', 'project directory containing plan.md', process.cwd())
11
+ .action((options, command) => {
12
+ const context = buildCommandContext(readGlobalOptions(command));
13
+ const planPath = join(options.projectPath, 'plan.md');
14
+ let content;
15
+ try {
16
+ content = readFileSync(planPath, 'utf-8');
17
+ }
18
+ catch (err) {
19
+ const message = err instanceof Error ? err.message : String(err);
20
+ context.logger.error(`Failed to read plan.md: ${message}`);
21
+ process.exitCode = 2;
22
+ return;
23
+ }
24
+ const frontmatterResult = parseFrontmatterFromContent(content);
25
+ if (frontmatterResult.kind === 'invalid') {
26
+ context.logger.error(frontmatterResult.message);
27
+ process.exitCode = 1;
28
+ return;
29
+ }
30
+ const groups = frontmatterResult.data['oat_plan_parallel_groups'];
31
+ const phaseIds = extractPhaseIdsFromPlan(content);
32
+ const result = validateParallelGroups(groups, phaseIds);
33
+ if (result.valid) {
34
+ context.logger.success('Plan validation passed.');
35
+ process.exitCode = 0;
36
+ return;
37
+ }
38
+ context.logger.error('Plan validation failed:');
39
+ for (const err of result.errors) {
40
+ context.logger.error(` - ${err}`);
41
+ }
42
+ process.exitCode = 1;
43
+ });
44
+ }
@@ -0,0 +1,20 @@
1
+ export type FrontmatterResult = {
2
+ kind: 'ok';
3
+ data: Record<string, unknown>;
4
+ } | {
5
+ kind: 'no-frontmatter';
6
+ data: Record<string, unknown>;
7
+ } | {
8
+ kind: 'invalid';
9
+ message: string;
10
+ };
11
+ export declare function parseFrontmatterFromContent(content: string): FrontmatterResult;
12
+ export type ValidationResult = {
13
+ valid: true;
14
+ } | {
15
+ valid: false;
16
+ errors: string[];
17
+ };
18
+ export declare function validateParallelGroups(groups: unknown, phaseIds: readonly string[]): ValidationResult;
19
+ export declare function extractPhaseIdsFromPlan(planContent: string): string[];
20
+ //# sourceMappingURL=validate-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-plan.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/validate-plan/validate-plan.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,GACd,iBAAiB,CAyBnB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEvC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B,gBAAgB,CAgDlB;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAOrE"}
@@ -0,0 +1,77 @@
1
+ import YAML from 'yaml';
2
+ const FRONTMATTER_PATTERN = /^---\s*\n([\s\S]*?)\n---\s*(?:\n|$)/;
3
+ export function parseFrontmatterFromContent(content) {
4
+ const match = content.match(FRONTMATTER_PATTERN);
5
+ if (!match?.[1]) {
6
+ return { kind: 'no-frontmatter', data: {} };
7
+ }
8
+ try {
9
+ const parsed = YAML.parse(match[1]);
10
+ if (parsed !== null &&
11
+ typeof parsed === 'object' &&
12
+ !Array.isArray(parsed)) {
13
+ return { kind: 'ok', data: parsed };
14
+ }
15
+ return {
16
+ kind: 'invalid',
17
+ message: 'Frontmatter did not parse as an object',
18
+ };
19
+ }
20
+ catch (err) {
21
+ const message = err instanceof Error ? err.message : String(err);
22
+ return {
23
+ kind: 'invalid',
24
+ message: `Malformed YAML in frontmatter: ${message}`,
25
+ };
26
+ }
27
+ }
28
+ export function validateParallelGroups(groups, phaseIds) {
29
+ // Missing or empty → valid (sequential execution, no parallelism declared)
30
+ if (groups === undefined || groups === null) {
31
+ return { valid: true };
32
+ }
33
+ if (Array.isArray(groups) && groups.length === 0) {
34
+ return { valid: true };
35
+ }
36
+ const errors = [];
37
+ if (!Array.isArray(groups)) {
38
+ return {
39
+ valid: false,
40
+ errors: [
41
+ 'oat_plan_parallel_groups must be an array of arrays of phase IDs',
42
+ ],
43
+ };
44
+ }
45
+ const seen = new Set();
46
+ for (const [i, group] of groups.entries()) {
47
+ if (!Array.isArray(group)) {
48
+ errors.push(`group[${i}] must be an array of phase IDs`);
49
+ continue;
50
+ }
51
+ if (group.length < 2) {
52
+ errors.push(`group[${i}] must contain at least 2 phase IDs (singleton groups are not allowed)`);
53
+ }
54
+ for (const phaseId of group) {
55
+ if (typeof phaseId !== 'string') {
56
+ errors.push(`group[${i}] contains a non-string value`);
57
+ continue;
58
+ }
59
+ if (!phaseIds.includes(phaseId)) {
60
+ errors.push(`group[${i}] references unknown phase: ${phaseId}`);
61
+ }
62
+ if (seen.has(phaseId)) {
63
+ errors.push(`phase ${phaseId} appears in multiple groups`);
64
+ }
65
+ seen.add(phaseId);
66
+ }
67
+ }
68
+ return errors.length > 0 ? { valid: false, errors } : { valid: true };
69
+ }
70
+ export function extractPhaseIdsFromPlan(planContent) {
71
+ const matches = planContent.match(/### Task (p\d+)-t\d+/g) ?? [];
72
+ const ids = matches.map((m) => {
73
+ const parts = m.split(' ');
74
+ return parts[2].split('-')[0];
75
+ });
76
+ return Array.from(new Set(ids)).sort();
77
+ }
@@ -2,6 +2,10 @@ import { type AutoSyncDependencies } from '../../tools/shared/auto-sync.js';
2
2
  import type { ToolInfo } from '../../tools/shared/types.js';
3
3
  import { Command } from 'commander';
4
4
  import { type UpdateTarget, type UpdateResult, type UpdateToolsDependencies } from './update-tools.js';
5
+ export declare function buildSyncSubprocessArgs(entrypoint: string, execArgv: string[], options: {
6
+ cwd: string;
7
+ scope: 'project' | 'user';
8
+ }): string[];
5
9
  export declare function createToolsUpdateCommand(dependencies?: UpdateToolsDependencies, syncDependencies?: AutoSyncDependencies): Command;
6
10
  export declare function shouldRefreshCoreDocs(target: UpdateTarget, result: UpdateResult): boolean;
7
11
  export declare function formatUpdatedToolMessage(tool: ToolInfo, dryRun: boolean): string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAIvE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AAuCxB,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CAsIT;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":"AAYA,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;AAcxB,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;AA+BD,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CAsIT;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"}
@@ -7,6 +7,7 @@ import { autoSync, } from '../../tools/shared/auto-sync.js';
7
7
  import { scanTools } from '../../tools/shared/scan-tools.js';
8
8
  import { readOatConfig, writeOatConfig } from '../../../config/oat-config.js';
9
9
  import { resolveAssetsRoot } from '../../../fs/assets.js';
10
+ import { fileExists } from '../../../fs/io.js';
10
11
  import { resolveProjectRoot, resolveScopeRoot } from '../../../fs/paths.js';
11
12
  import { Command } from 'commander';
12
13
  import { updateTools, } from './update-tools.js';
@@ -20,11 +21,26 @@ const defaultDependencies = {
20
21
  resolveAssetsRoot,
21
22
  copyDirWithStatus,
22
23
  copyFileWithStatus,
24
+ fileExists,
23
25
  };
26
+ export function buildSyncSubprocessArgs(entrypoint, execArgv, options) {
27
+ return [
28
+ ...execArgv,
29
+ entrypoint,
30
+ '--cwd',
31
+ options.cwd,
32
+ '--scope',
33
+ options.scope,
34
+ 'sync',
35
+ ];
36
+ }
24
37
  const defaultSyncDependencies = {
25
38
  runSync: async ({ scope, cwd }) => {
26
39
  await new Promise((resolve, reject) => {
27
- execFile(process.execPath, [...process.execArgv, process.argv[1], 'sync', '--scope', scope], { cwd }, (error) => {
40
+ execFile(process.execPath, buildSyncSubprocessArgs(process.argv[1], process.execArgv, {
41
+ cwd,
42
+ scope,
43
+ }), { cwd: process.cwd() }, (error) => {
28
44
  if (error)
29
45
  reject(error);
30
46
  else
@@ -24,6 +24,7 @@ export interface UpdateToolsDependencies {
24
24
  resolveAssetsRoot: () => Promise<string>;
25
25
  copyDirWithStatus: (source: string, destination: string, force: boolean) => Promise<CopyStatus>;
26
26
  copyFileWithStatus: (source: string, destination: string, force: boolean) => Promise<CopyStatus>;
27
+ fileExists: (path: string) => Promise<boolean>;
27
28
  }
28
29
  export declare function updateTools(target: UpdateTarget, scopes: ConcreteScope[], cwd: string, home: string, dryRun: boolean, dependencies: UpdateToolsDependencies): Promise<UpdateResult>;
29
30
  //# sourceMappingURL=update-tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-tools.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/update-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAY3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,gBAAgB,EAAE,CAChB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,iBAAiB,EAAE,CACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,kBAAkB,EAAE,CAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;CAC1B;AAqCD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,aAAa,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,uBAAuB,GACpC,OAAO,CAAC,YAAY,CAAC,CA6EvB"}
1
+ {"version":3,"file":"update-tools.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/update-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAiB3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,gBAAgB,EAAE,CAChB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,iBAAiB,EAAE,CACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,kBAAkB,EAAE,CAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChD;AA8ED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,aAAa,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,uBAAuB,GACpC,OAAO,CAAC,YAAY,CAAC,CA0GvB"}
@@ -1,5 +1,5 @@
1
1
  import { join } from 'node:path';
2
- import { CORE_SKILLS, DOCS_SKILLS, IDEA_SKILLS, PROJECT_MANAGEMENT_SKILLS, RESEARCH_AGENTS, RESEARCH_SKILLS, UTILITY_SKILLS, WORKFLOW_AGENTS, WORKFLOW_SKILLS, } from '../../init/tools/shared/skill-manifest.js';
2
+ import { CORE_SKILLS, DOCS_SKILLS, DOCS_SCRIPTS, IDEA_SKILLS, PROJECT_MANAGEMENT_SKILLS, PROJECT_MANAGEMENT_SCRIPTS, PROJECT_MANAGEMENT_TEMPLATES, RESEARCH_AGENTS, RESEARCH_SKILLS, UTILITY_SKILLS, WORKFLOW_AGENTS, WORKFLOW_SKILLS, WORKFLOW_SCRIPTS, WORKFLOW_TEMPLATES, } from '../../init/tools/shared/skill-manifest.js';
3
3
  const BUNDLED_PACK_MEMBERS = {
4
4
  core: CORE_SKILLS.map((name) => ({ name, type: 'skill' })),
5
5
  ideas: IDEA_SKILLS.map((name) => ({ name, type: 'skill' })),
@@ -24,6 +24,36 @@ const BUNDLED_PACK_MEMBERS = {
24
24
  })),
25
25
  ],
26
26
  };
27
+ const BUNDLED_PACK_ASSETS = {
28
+ core: {
29
+ templates: [],
30
+ scripts: [],
31
+ },
32
+ ideas: {
33
+ templates: [],
34
+ scripts: [],
35
+ },
36
+ docs: {
37
+ templates: [],
38
+ scripts: DOCS_SCRIPTS,
39
+ },
40
+ workflows: {
41
+ templates: WORKFLOW_TEMPLATES,
42
+ scripts: WORKFLOW_SCRIPTS,
43
+ },
44
+ utility: {
45
+ templates: [],
46
+ scripts: [],
47
+ },
48
+ 'project-management': {
49
+ templates: PROJECT_MANAGEMENT_TEMPLATES,
50
+ scripts: PROJECT_MANAGEMENT_SCRIPTS,
51
+ },
52
+ research: {
53
+ templates: [],
54
+ scripts: [],
55
+ },
56
+ };
27
57
  export async function updateTools(target, scopes, cwd, home, dryRun, dependencies) {
28
58
  const assetsRoot = await dependencies.resolveAssetsRoot();
29
59
  const result = {
@@ -86,6 +116,22 @@ export async function updateTools(target, scopes, cwd, home, dryRun, dependencie
86
116
  }
87
117
  result.updated.push(tool);
88
118
  }
119
+ for (const assetTarget of resolvePackAssetTargets(target, allTools)) {
120
+ const assets = BUNDLED_PACK_ASSETS[assetTarget.pack];
121
+ for (const template of assets.templates) {
122
+ const source = join(assetsRoot, 'templates', template);
123
+ const destination = join(assetTarget.scopeRoot, '.oat', 'templates', template);
124
+ await dependencies.copyFileWithStatus(source, destination, true);
125
+ }
126
+ for (const script of assets.scripts) {
127
+ const source = join(assetsRoot, 'scripts', script);
128
+ if (!(await dependencies.fileExists(source))) {
129
+ continue;
130
+ }
131
+ const destination = join(assetTarget.scopeRoot, '.oat', 'scripts', script);
132
+ await dependencies.copyFileWithStatus(source, destination, true);
133
+ }
134
+ }
89
135
  return result;
90
136
  }
91
137
  function expandInstalledPackEntries(target, installedEntries) {
@@ -133,6 +179,39 @@ function expandInstalledPackEntries(target, installedEntries) {
133
179
  function getBundledPackMembers(pack, scope) {
134
180
  return BUNDLED_PACK_MEMBERS[pack].filter((member) => scope === 'project' || member.type === 'skill');
135
181
  }
182
+ function resolvePackAssetTargets(target, installedEntries) {
183
+ if (target.kind === 'name') {
184
+ return [];
185
+ }
186
+ const entriesByScope = new Map();
187
+ for (const entry of installedEntries) {
188
+ const scopeEntries = entriesByScope.get(entry.tool.scope) ?? [];
189
+ scopeEntries.push(entry);
190
+ entriesByScope.set(entry.tool.scope, scopeEntries);
191
+ }
192
+ const targets = [];
193
+ for (const scopeEntries of entriesByScope.values()) {
194
+ const scopeRoot = scopeEntries[0]?.scopeRoot;
195
+ if (!scopeRoot)
196
+ continue;
197
+ const installedPacks = new Set(scopeEntries
198
+ .map((entry) => entry.tool.pack)
199
+ .filter((pack) => pack !== 'custom'));
200
+ const packsToExpand = target.kind === 'pack'
201
+ ? installedPacks.has(target.pack)
202
+ ? [target.pack]
203
+ : []
204
+ : [...installedPacks];
205
+ for (const pack of packsToExpand) {
206
+ const assets = BUNDLED_PACK_ASSETS[pack];
207
+ if (assets.templates.length === 0 && assets.scripts.length === 0) {
208
+ continue;
209
+ }
210
+ targets.push({ pack, scopeRoot });
211
+ }
212
+ }
213
+ return targets;
214
+ }
136
215
  function buildEntryKey(tool) {
137
216
  return [tool.scope, tool.type, tool.name].join(':');
138
217
  }
@@ -23,6 +23,7 @@ export interface OatWorkflowConfig {
23
23
  createPrOnComplete?: boolean;
24
24
  postImplementSequence?: WorkflowPostImplementSequence;
25
25
  reviewExecutionModel?: WorkflowReviewExecutionModel;
26
+ autoReviewAtHillCheckpoints?: boolean;
26
27
  autoNarrowReReviewScope?: boolean;
27
28
  }
28
29
  export type OatToolsConfig = Partial<Record<'core' | 'ideas' | 'docs' | 'workflows' | 'utility' | 'project-management' | 'research', boolean>>;
@@ -1 +1 @@
1
- {"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,9 @@ function normalizeWorkflowConfig(parsed) {
36
36
  next.reviewExecutionModel =
37
37
  parsed.reviewExecutionModel;
38
38
  }
39
+ if (typeof parsed.autoReviewAtHillCheckpoints === 'boolean') {
40
+ next.autoReviewAtHillCheckpoints = parsed.autoReviewAtHillCheckpoints;
41
+ }
39
42
  if (typeof parsed.autoNarrowReReviewScope === 'boolean') {
40
43
  next.autoNarrowReReviewScope = parsed.autoNarrowReReviewScope;
41
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kCAAkC;IACjD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AA+DD,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,CAAC,kCAAkC,CAAM,GAC1D,OAAO,CAAC,cAAc,CAAC,CAqEzB"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kCAAkC;IACjD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AAgED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,CAAC,kCAAkC,CAAM,GAC1D,OAAO,CAAC,cAAc,CAAC,CAgFzB"}
@@ -47,6 +47,7 @@ const DEFAULT_WORKFLOW_CONFIG = {
47
47
  createPrOnComplete: null,
48
48
  postImplementSequence: null,
49
49
  reviewExecutionModel: null,
50
+ autoReviewAtHillCheckpoints: null,
50
51
  autoNarrowReReviewScope: null,
51
52
  },
52
53
  };
@@ -108,6 +109,14 @@ export async function resolveEffectiveConfig(repoRoot, userConfigDir, env = proc
108
109
  };
109
110
  }
110
111
  }
112
+ const hillAutoReview = resolved['workflow.autoReviewAtHillCheckpoints'];
113
+ if (hillAutoReview?.source === 'default' &&
114
+ shared.autoReviewAtCheckpoints !== undefined) {
115
+ resolved['workflow.autoReviewAtHillCheckpoints'] = {
116
+ value: shared.autoReviewAtCheckpoints,
117
+ source: 'shared',
118
+ };
119
+ }
111
120
  return {
112
121
  shared,
113
122
  local,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.0.43",
3
+ "version": "0.0.51",
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",
@@ -33,7 +33,7 @@
33
33
  "ora": "^9.0.0",
34
34
  "yaml": "2.8.2",
35
35
  "zod": "^3.25.76",
36
- "@open-agent-toolkit/control-plane": "0.0.43"
36
+ "@open-agent-toolkit/control-plane": "0.0.51"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^22.10.0",