@open-agent-toolkit/cli 0.0.33 → 0.0.35

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 (42) hide show
  1. package/assets/docs/cli-utilities/tool-packs.md +3 -0
  2. package/assets/docs/provider-sync/manifest-and-drift.md +2 -0
  3. package/assets/docs/workflows/projects/lifecycle.md +1 -1
  4. package/assets/docs/workflows/skills/index.md +1 -1
  5. package/assets/public-package-versions.json +4 -4
  6. package/assets/skills/oat-docs/SKILL.md +5 -3
  7. package/assets/skills/oat-project-quick-start/SKILL.md +9 -3
  8. package/dist/commands/init/tools/core/index.d.ts.map +1 -1
  9. package/dist/commands/init/tools/core/index.js +7 -1
  10. package/dist/commands/init/tools/docs/index.d.ts.map +1 -1
  11. package/dist/commands/init/tools/docs/index.js +4 -2
  12. package/dist/commands/init/tools/ideas/index.d.ts.map +1 -1
  13. package/dist/commands/init/tools/ideas/index.js +8 -2
  14. package/dist/commands/init/tools/index.d.ts.map +1 -1
  15. package/dist/commands/init/tools/index.js +3 -1
  16. package/dist/commands/init/tools/project-management/index.d.ts.map +1 -1
  17. package/dist/commands/init/tools/project-management/index.js +6 -0
  18. package/dist/commands/init/tools/research/index.d.ts.map +1 -1
  19. package/dist/commands/init/tools/research/index.js +8 -3
  20. package/dist/commands/init/tools/utility/index.d.ts.map +1 -1
  21. package/dist/commands/init/tools/utility/index.js +4 -2
  22. package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
  23. package/dist/commands/init/tools/workflows/index.js +8 -2
  24. package/dist/commands/sync/index.d.ts.map +1 -1
  25. package/dist/commands/sync/index.js +27 -5
  26. package/dist/commands/sync/sync.types.d.ts +1 -0
  27. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  28. package/dist/commands/tools/install/index.d.ts +1 -1
  29. package/dist/commands/tools/install/index.d.ts.map +1 -1
  30. package/dist/commands/tools/install/index.js +17 -5
  31. package/dist/commands/tools/shared/auto-sync.d.ts +4 -1
  32. package/dist/commands/tools/shared/auto-sync.d.ts.map +1 -1
  33. package/dist/commands/tools/shared/auto-sync.js +7 -2
  34. package/dist/commands/tools/shared/install-sync-context.d.ts +9 -0
  35. package/dist/commands/tools/shared/install-sync-context.d.ts.map +1 -0
  36. package/dist/commands/tools/shared/install-sync-context.js +45 -0
  37. package/dist/engine/compute-plan.d.ts +2 -1
  38. package/dist/engine/compute-plan.d.ts.map +1 -1
  39. package/dist/engine/compute-plan.js +8 -1
  40. package/dist/validation/skills.d.ts.map +1 -1
  41. package/dist/validation/skills.js +9 -0
  42. package/package.json +2 -2
@@ -77,6 +77,7 @@ Key behavior:
77
77
  - Records installed pack state in shared repo config as `tools.<pack>: true` so other OAT workflows can detect installed capabilities without relying on filesystem heuristics
78
78
  - Interactive runs can prompt to update selected outdated skills
79
79
  - Auto-sync runs automatically after successful install (provider views are updated)
80
+ - Install-triggered auto-sync limits removal planning to the canonical entries from the pack that was just installed, so stale manifest drift in unrelated packs does not delete other provider views
80
81
  - Use `--no-sync` to skip auto-sync
81
82
 
82
83
  ### `oat tools update`
@@ -164,6 +165,8 @@ All mutation commands (`install`, `update`, `remove`) automatically run `oat syn
164
165
 
165
166
  Use `--no-sync` on any mutation command to skip this step.
166
167
 
168
+ For `oat tools install`, the follow-up sync still refreshes provider views immediately, but its removal pass is scoped to the canonical entries that were just installed. This avoids deleting unrelated provider views when a worktree has stale manifest entries for packs whose canonical content is absent locally.
169
+
167
170
  ## Legacy commands
168
171
 
169
172
  ### `oat init tools`
@@ -26,6 +26,8 @@ Tracks managed mappings so the CLI can:
26
26
  - avoid deleting unmanaged provider content
27
27
  - execute scoped removals only for managed entries
28
28
 
29
+ Install-triggered auto-sync narrows that removal scope further: after `oat tools install <pack>`, the follow-up sync only plans removals for canonical entries from the installed pack. This protects unrelated provider views if the current worktree has stale manifest entries for other packs whose canonical assets are missing locally.
30
+
29
31
  For transformed mappings such as project-scoped rules, the manifest stores hashes for the rendered provider output that was actually written, not the canonical source markdown. This keeps drift detection aligned with the on-disk managed file.
30
32
 
31
33
  ## Drift states
@@ -104,7 +104,7 @@ When `autoReviewAtCheckpoints` is enabled (via `.oat/config.json` or `plan.md` f
104
104
 
105
105
  ### Quick lane diagram
106
106
 
107
- 1. `oat-project-quick-start` (adaptive discovery — well-understood requests synthesize quickly, exploratory requests invest in solution space exploration)
107
+ 1. `oat-project-quick-start` (adaptive discovery — provide a project name and optional description; if only the name is provided, quick-start asks for the missing description before discovery. Well-understood requests synthesize quickly, exploratory requests invest in solution space exploration)
108
108
  2. Decision point: straight to plan, optional lightweight `design.md`, or promote to spec-driven
109
109
  3. Implement:
110
110
  - `oat-project-implement` (sequential)
@@ -14,7 +14,7 @@ Use this section when you want to choose the right OAT skill for a task. If you
14
14
 
15
15
  ## Key Skills by Use Case
16
16
 
17
- - Start a new tracked project: `oat-project-new` or `oat-project-quick-start`
17
+ - Start a new tracked project: `oat-project-new` or `oat-project-quick-start` (quick start accepts a project name plus optional description; if you omit the description it should ask before discovery begins)
18
18
  - Resume an existing project: `oat-project-open` and `oat-project-progress`
19
19
  - Execute a ready plan: `oat-project-implement`
20
20
  - Import an existing plan: `oat-project-import-plan`
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.0.33",
3
- "docs-config": "0.0.33",
4
- "docs-theme": "0.0.33",
5
- "docs-transforms": "0.0.33"
2
+ "cli": "0.0.35",
3
+ "docs-config": "0.0.35",
4
+ "docs-theme": "0.0.35",
5
+ "docs-transforms": "0.0.35"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-docs
3
- version: 1.0.0
3
+ version: 1.0.1
4
4
  description: Use when a user asks questions about OAT workflows, CLI commands, skill authoring, configuration, or project lifecycle. Answers questions by reading locally-bundled OAT documentation.
5
5
  argument-hint: '[question]'
6
6
  disable-model-invocation: false
@@ -161,13 +161,15 @@ Would you like me to:
161
161
  To create a new OAT project, you have two main approaches:
162
162
 
163
163
  1. **Quick mode** (recommended for most tasks):
164
- oat-project-quick-start <project-name>
164
+ oat-project-quick-start <project-name> "project description"
165
165
 
166
166
  2. **Spec-driven mode** (for complex features):
167
167
  oat-project-new <project-name>
168
168
 
169
169
  Quick mode goes straight from discovery to plan. Spec-driven mode adds
170
- formal spec and design phases.
170
+ formal spec and design phases. If you invoke quick mode with only a
171
+ project name, it should ask you for the missing project description
172
+ before discovery starts.
171
173
 
172
174
  Both create a project directory under your projects root
173
175
  (default: .oat/projects/shared/<project-name>/) with standard artifacts:
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: oat-project-quick-start
3
- version: 1.3.1
3
+ version: 1.3.3
4
4
  description: Use when a task is small enough for quick mode or rapid iteration is preferred. Scaffolds a lightweight OAT project from discovery directly to a runnable plan, with optional brainstorming and lightweight design.
5
- argument-hint: '<project-name>'
5
+ argument-hint: '<project-name> ["project description"]'
6
6
  disable-model-invocation: true
7
7
  user-invocable: true
8
8
  allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
@@ -83,7 +83,11 @@ PROJECTS_ROOT="${PROJECTS_ROOT%/}"
83
83
 
84
84
  If no valid active project exists:
85
85
 
86
- - Read `{project-name}` from `$ARGUMENTS`, or ask user.
86
+ - Resolve startup input from `$ARGUMENTS` before doing any discovery work:
87
+ - Accept `{project-name}` plus an optional `{project-description}`.
88
+ - If `$ARGUMENTS` contains only a bare `{project-name}` (for example a slug or short title) without a substantive description, ask the user for a short project description before scanning the repo or drafting discovery.
89
+ - Do not infer requirements from the project name alone or go exploring the codebase to guess what the project means.
90
+ - If neither field is available, ask for both the project name and a short project description. One or two sentences is enough for the description.
87
91
  - Create project via the same scaffolding path used by `oat-project-new`:
88
92
 
89
93
  ```bash
@@ -116,6 +120,8 @@ If `"$PROJECT_PATH/discovery.md"` is missing, create it from `.oat/templates/dis
116
120
 
117
121
  Before asking questions, classify the request:
118
122
 
123
+ - Base this classification on the user's project description plus session context. A bare project name by itself is not enough context to start discovery.
124
+
119
125
  - **Well-understood** — the user has a clear mental model, requirements are specific, approach is obvious. Examples: "add a CLI flag for verbose output", "rename X to Y across the codebase."
120
126
  → Synthesize `discovery.md` from available session context quickly when enough detail is already available. Ask only the minimum additional questions needed to remove blockers for a quality plan.
121
127
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,WAAW,EAEX,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAMxB,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,gBAAgB,EAAE,CAChB,KAAK,EAAE,SAAS,GAAG,MAAM,EACzB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC1E;AAmED,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAeT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,WAAW,EAEX,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAMxB,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,gBAAgB,EAAE,CAChB,KAAK,EAAE,SAAS,GAAG,MAAM,EACzB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC1E;AAqED,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAkBT"}
@@ -1,5 +1,6 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
3
+ import { canonicalPathsForPack, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
3
4
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
4
5
  import { resolveScopeRoot } from '../../../../fs/paths.js';
5
6
  import { Command } from 'commander';
@@ -39,6 +40,7 @@ async function runInitToolsCore(context, options, dependencies) {
39
40
  });
40
41
  reportSuccess(context, targetRoot, result);
41
42
  process.exitCode = 0;
43
+ return true;
42
44
  }
43
45
  catch (error) {
44
46
  const message = error instanceof Error ? error.message : String(error);
@@ -49,6 +51,7 @@ async function runInitToolsCore(context, options, dependencies) {
49
51
  context.logger.error(message);
50
52
  }
51
53
  process.exitCode = 1;
54
+ return false;
52
55
  }
53
56
  }
54
57
  export { CORE_SKILLS };
@@ -62,6 +65,9 @@ export function createInitToolsCoreCommand(overrides = {}) {
62
65
  .option('--force', 'Overwrite existing files where applicable')
63
66
  .action(async (options, command) => {
64
67
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
65
- await runInitToolsCore(context, options, dependencies);
68
+ const didInstall = await runInitToolsCore(context, options, dependencies);
69
+ if (didInstall) {
70
+ setInstalledCanonicalPaths(command, canonicalPathsForPack('core'));
71
+ }
66
72
  });
67
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/docs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAMxB,KAAK,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzE,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,EACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC/B,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACzB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAqID,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAeT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/docs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAMxB,KAAK,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzE,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,EACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC/B,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACzB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAuID,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAeT"}
@@ -1,6 +1,7 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { confirmAction, selectManyWithAbort, } from '../../../shared/shared.prompts.js';
3
3
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
4
+ import { canonicalSkillPaths, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
4
5
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
5
6
  import { resolveProjectRoot, resolveScopeRoot } from '../../../../fs/paths.js';
6
7
  import { Command } from 'commander';
@@ -37,7 +38,7 @@ function reportSuccess(context, scope, targetRoot, assetsRoot, selectedSkills, r
37
38
  context.logger.info(`Scripts: copied=${result.copiedScripts.length}, updated=${result.updatedScripts.length}, skipped=${result.skippedScripts.length}`);
38
39
  context.logger.info(`Run: oat sync --scope ${scope}`);
39
40
  }
40
- async function runInitToolsDocs(context, options, dependencies) {
41
+ async function runInitToolsDocs(context, options, dependencies, command) {
41
42
  try {
42
43
  const scope = resolveScope(context);
43
44
  const targetRoot = scope === 'project'
@@ -81,6 +82,7 @@ async function runInitToolsDocs(context, options, dependencies) {
81
82
  skills: selectedSkills,
82
83
  force: options.force,
83
84
  });
85
+ setInstalledCanonicalPaths(command, canonicalSkillPaths(selectedSkills));
84
86
  reportSuccess(context, scope, targetRoot, assetsRoot, selectedSkills, result);
85
87
  process.exitCode = 0;
86
88
  }
@@ -105,6 +107,6 @@ export function createInitToolsDocsCommand(overrides = {}) {
105
107
  .option('--force', 'Overwrite existing files where applicable')
106
108
  .action(async (options, command) => {
107
109
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
108
- await runInitToolsDocs(context, options, dependencies);
110
+ await runInitToolsDocs(context, options, dependencies, command);
109
111
  });
110
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/ideas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AAMzB,KAAK,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvC,UAAU,0BAA0B;IAClC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,YAAY,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5E,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAqGD,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,OAAO,CAeT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/ideas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AAMzB,KAAK,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvC,UAAU,0BAA0B;IAClC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,YAAY,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5E,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAuGD,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,OAAO,CAsBT"}
@@ -1,6 +1,7 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { confirmAction, } from '../../../shared/shared.prompts.js';
3
3
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
4
+ import { canonicalPathsForPack, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
4
5
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
5
6
  import { resolveProjectRoot, resolveScopeRoot } from '../../../../fs/paths.js';
6
7
  import { Command } from 'commander';
@@ -56,7 +57,7 @@ async function runInitToolsIdeas(context, options, dependencies) {
56
57
  context.logger.info('Cancelled: no files were overwritten.');
57
58
  }
58
59
  process.exitCode = 0;
59
- return;
60
+ return false;
60
61
  }
61
62
  }
62
63
  const assetsRoot = await dependencies.resolveAssetsRoot();
@@ -67,6 +68,7 @@ async function runInitToolsIdeas(context, options, dependencies) {
67
68
  });
68
69
  reportSuccess(context, scope, targetRoot, assetsRoot, result);
69
70
  process.exitCode = 0;
71
+ return true;
70
72
  }
71
73
  catch (error) {
72
74
  const message = error instanceof Error ? error.message : String(error);
@@ -77,6 +79,7 @@ async function runInitToolsIdeas(context, options, dependencies) {
77
79
  context.logger.error(message);
78
80
  }
79
81
  process.exitCode = 1;
82
+ return false;
80
83
  }
81
84
  }
82
85
  export function createInitToolsIdeasCommand(overrides = {}) {
@@ -89,6 +92,9 @@ export function createInitToolsIdeasCommand(overrides = {}) {
89
92
  .option('--force', 'Overwrite existing files where applicable')
90
93
  .action(async (options, command) => {
91
94
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
92
- await runInitToolsIdeas(context, options, dependencies);
95
+ const didInstall = await runInitToolsIdeas(context, options, dependencies);
96
+ if (didInstall) {
97
+ setInstalledCanonicalPaths(command, canonicalPathsForPack('ideas'));
98
+ }
93
99
  });
94
100
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/tools/index.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ import { addLocalPaths } from '../../local/manage.js';
6
6
  import { removeAgentsMdSection, upsertAgentsMdSection, } from '../../shared/agents-md.js';
7
7
  import { selectManyWithAbort, selectWithAbort, } from '../../shared/shared.prompts.js';
8
8
  import { readGlobalOptions } from '../../shared/shared.utils.js';
9
+ import { canonicalPathsForPacks, setInstalledCanonicalPaths, } from '../../tools/shared/install-sync-context.js';
9
10
  import { readOatConfig, resolveLocalPaths, writeOatConfig, } from '../../../config/oat-config.js';
10
11
  import { resolveAssetsRoot } from '../../../fs/assets.js';
11
12
  import { resolveProjectRoot, resolveScopeRoot } from '../../../fs/paths.js';
@@ -389,6 +390,7 @@ export function createInitToolsCommand(overrides = {}) {
389
390
  .addCommand(createInitToolsResearchCommand())
390
391
  .action(async (_options, command) => {
391
392
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
392
- await runInitTools(context, dependencies);
393
+ const selectedPacks = await runInitTools(context, dependencies);
394
+ setInstalledCanonicalPaths(command, canonicalPathsForPacks(selectedPacks));
393
395
  });
394
396
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/project-management/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AAMtC,UAAU,sCAAsC;IAC9C,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,wBAAwB,EAAE,CACxB,OAAO,EAAE,+BAA+B,KACrC,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC9C;AASD,wBAAgB,uCAAuC,CACrD,SAAS,GAAE,OAAO,CAAC,sCAAsC,CAAM,GAC9D,OAAO,CA0DT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/project-management/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AAMtC,UAAU,sCAAsC;IAC9C,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,wBAAwB,EAAE,CACxB,OAAO,EAAE,+BAA+B,KACrC,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC9C;AASD,wBAAgB,uCAAuC,CACrD,SAAS,GAAE,OAAO,CAAC,sCAAsC,CAAM,GAC9D,OAAO,CAmET"}
@@ -1,5 +1,6 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
3
+ import { canonicalPathsForPack, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
3
4
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
4
5
  import { resolveProjectRoot } from '../../../../fs/paths.js';
5
6
  import { Command } from 'commander';
@@ -19,6 +20,7 @@ export function createInitToolsProjectManagementCommand(overrides = {}) {
19
20
  .description('Install OAT project-management skills and templates')
20
21
  .option('--force', 'Overwrite existing files where applicable')
21
22
  .action(async (options, command) => {
23
+ let didInstall = false;
22
24
  try {
23
25
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
24
26
  const targetRoot = await dependencies.resolveProjectRoot(context.cwd);
@@ -44,6 +46,7 @@ export function createInitToolsProjectManagementCommand(overrides = {}) {
44
46
  context.logger.info(`Templates: copied=${result.copiedTemplates.length}, updated=${result.updatedTemplates.length}, skipped=${result.skippedTemplates.length}`);
45
47
  context.logger.info('Run: oat sync --scope project');
46
48
  }
49
+ didInstall = true;
47
50
  process.exitCode = 0;
48
51
  }
49
52
  catch (error) {
@@ -57,5 +60,8 @@ export function createInitToolsProjectManagementCommand(overrides = {}) {
57
60
  }
58
61
  process.exitCode = 1;
59
62
  }
63
+ if (didInstall) {
64
+ setInstalledCanonicalPaths(command, canonicalPathsForPack('project-management'));
65
+ }
60
66
  });
61
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/research/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAE3B,MAAM,oBAAoB,CAAC;AAM5B,KAAK,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;AAExC,UAAU,6BAA6B;IACrC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,CACf,OAAO,EAAE,sBAAsB,KAC5B,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACpC,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,EACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC/B,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACzB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAqID,wBAAgB,8BAA8B,CAC5C,SAAS,GAAE,OAAO,CAAC,6BAA6B,CAAM,GACrD,OAAO,CAeT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/research/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AASzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAG3B,MAAM,oBAAoB,CAAC;AAM5B,KAAK,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;AAExC,UAAU,6BAA6B;IACrC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,CACf,OAAO,EAAE,sBAAsB,KAC5B,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACpC,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,EACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC/B,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACzB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AA0ID,wBAAgB,8BAA8B,CAC5C,SAAS,GAAE,OAAO,CAAC,6BAA6B,CAAM,GACrD,OAAO,CAeT"}
@@ -1,10 +1,11 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { confirmAction, selectManyWithAbort, } from '../../../shared/shared.prompts.js';
3
3
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
4
+ import { canonicalAgentPaths, canonicalSkillPaths, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
4
5
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
5
6
  import { resolveProjectRoot, resolveScopeRoot } from '../../../../fs/paths.js';
6
7
  import { Command } from 'commander';
7
- import { installResearch as defaultInstallResearch, RESEARCH_SKILLS, } from './install-research.js';
8
+ import { installResearch as defaultInstallResearch, RESEARCH_AGENTS, RESEARCH_SKILLS, } from './install-research.js';
8
9
  const DEFAULT_DEPENDENCIES = {
9
10
  buildCommandContext,
10
11
  resolveProjectRoot,
@@ -37,7 +38,7 @@ function reportSuccess(context, scope, targetRoot, assetsRoot, selectedSkills, r
37
38
  context.logger.info(`Agents: copied=${result.copiedAgents.length}, updated=${result.updatedAgents.length}, skipped=${result.skippedAgents.length}`);
38
39
  context.logger.info(`Run: oat sync --scope ${scope}`);
39
40
  }
40
- async function runInitToolsResearch(context, options, dependencies) {
41
+ async function runInitToolsResearch(context, options, dependencies, command) {
41
42
  try {
42
43
  const scope = resolveScope(context);
43
44
  const targetRoot = scope === 'project'
@@ -81,6 +82,10 @@ async function runInitToolsResearch(context, options, dependencies) {
81
82
  skills: selectedSkills,
82
83
  force: options.force,
83
84
  });
85
+ setInstalledCanonicalPaths(command, [
86
+ ...canonicalSkillPaths(selectedSkills),
87
+ ...canonicalAgentPaths(RESEARCH_AGENTS),
88
+ ]);
84
89
  reportSuccess(context, scope, targetRoot, assetsRoot, selectedSkills, result);
85
90
  process.exitCode = 0;
86
91
  }
@@ -105,6 +110,6 @@ export function createInitToolsResearchCommand(overrides = {}) {
105
110
  .option('--force', 'Overwrite existing files where applicable')
106
111
  .action(async (options, command) => {
107
112
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
108
- await runInitToolsResearch(context, options, dependencies);
113
+ await runInitToolsResearch(context, options, dependencies, command);
109
114
  });
110
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/utility/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAE1B,MAAM,mBAAmB,CAAC;AAM3B,KAAK,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvC,UAAU,4BAA4B;IACpC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,cAAc,EAAE,CACd,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,EACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC/B,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACzB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAkID,wBAAgB,6BAA6B,CAC3C,SAAS,GAAE,OAAO,CAAC,4BAA4B,CAAM,GACpD,OAAO,CAeT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/utility/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAE1B,MAAM,mBAAmB,CAAC;AAM3B,KAAK,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvC,UAAU,4BAA4B;IACpC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,cAAc,EAAE,CACd,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,EACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC/B,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACzB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAoID,wBAAgB,6BAA6B,CAC3C,SAAS,GAAE,OAAO,CAAC,4BAA4B,CAAM,GACpD,OAAO,CAeT"}
@@ -1,6 +1,7 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { confirmAction, selectManyWithAbort, } from '../../../shared/shared.prompts.js';
3
3
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
4
+ import { canonicalSkillPaths, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
4
5
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
5
6
  import { resolveProjectRoot, resolveScopeRoot } from '../../../../fs/paths.js';
6
7
  import { Command } from 'commander';
@@ -36,7 +37,7 @@ function reportSuccess(context, scope, targetRoot, assetsRoot, selectedSkills, r
36
37
  context.logger.info(`Skills: copied=${result.copiedSkills.length}, updated=${result.updatedSkills.length}, skipped=${result.skippedSkills.length}`);
37
38
  context.logger.info(`Run: oat sync --scope ${scope}`);
38
39
  }
39
- async function runInitToolsUtility(context, options, dependencies) {
40
+ async function runInitToolsUtility(context, options, dependencies, command) {
40
41
  try {
41
42
  const scope = resolveScope(context);
42
43
  const targetRoot = scope === 'project'
@@ -80,6 +81,7 @@ async function runInitToolsUtility(context, options, dependencies) {
80
81
  skills: selectedSkills,
81
82
  force: options.force,
82
83
  });
84
+ setInstalledCanonicalPaths(command, canonicalSkillPaths(selectedSkills));
83
85
  reportSuccess(context, scope, targetRoot, assetsRoot, selectedSkills, result);
84
86
  process.exitCode = 0;
85
87
  }
@@ -104,6 +106,6 @@ export function createInitToolsUtilityCommand(overrides = {}) {
104
106
  .option('--force', 'Overwrite existing files where applicable')
105
107
  .action(async (options, command) => {
106
108
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
107
- await runInitToolsUtility(context, options, dependencies);
109
+ await runInitToolsUtility(context, options, dependencies, command);
108
110
  });
109
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/workflows/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAM7B,UAAU,8BAA8B;IACtC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,gBAAgB,EAAE,CAChB,OAAO,EAAE,uBAAuB,KAC7B,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACrC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAgGD,wBAAgB,+BAA+B,CAC7C,SAAS,GAAE,OAAO,CAAC,8BAA8B,CAAM,GACtD,OAAO,CAeT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/workflows/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAM7B,UAAU,8BAA8B;IACtC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,gBAAgB,EAAE,CAChB,OAAO,EAAE,uBAAuB,KAC7B,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACrC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAkGD,wBAAgB,+BAA+B,CAC7C,SAAS,GAAE,OAAO,CAAC,8BAA8B,CAAM,GACtD,OAAO,CAsBT"}
@@ -1,6 +1,7 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { confirmAction, } from '../../../shared/shared.prompts.js';
3
3
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
4
+ import { canonicalPathsForPack, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
4
5
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
5
6
  import { resolveProjectRoot } from '../../../../fs/paths.js';
6
7
  import { Command } from 'commander';
@@ -46,7 +47,7 @@ async function runInitToolsWorkflows(context, options, dependencies) {
46
47
  context.logger.info('Cancelled: no files were overwritten.');
47
48
  }
48
49
  process.exitCode = 0;
49
- return;
50
+ return false;
50
51
  }
51
52
  }
52
53
  const assetsRoot = await dependencies.resolveAssetsRoot();
@@ -57,6 +58,7 @@ async function runInitToolsWorkflows(context, options, dependencies) {
57
58
  });
58
59
  reportSuccess(context, targetRoot, assetsRoot, result);
59
60
  process.exitCode = 0;
61
+ return true;
60
62
  }
61
63
  catch (error) {
62
64
  const message = error instanceof Error ? error.message : String(error);
@@ -67,6 +69,7 @@ async function runInitToolsWorkflows(context, options, dependencies) {
67
69
  context.logger.error(message);
68
70
  }
69
71
  process.exitCode = 1;
72
+ return false;
70
73
  }
71
74
  }
72
75
  export function createInitToolsWorkflowsCommand(overrides = {}) {
@@ -79,6 +82,9 @@ export function createInitToolsWorkflowsCommand(overrides = {}) {
79
82
  .option('--force', 'Overwrite existing files where applicable')
80
83
  .action(async (options, command) => {
81
84
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
82
- await runInitToolsWorkflows(context, options, dependencies);
85
+ const didInstall = await runInitToolsWorkflows(context, options, dependencies);
86
+ if (didInstall) {
87
+ setInstalledCanonicalPaths(command, canonicalPathsForPack('workflows'));
88
+ }
83
89
  });
84
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,cAAc,CAAC;AAyRtB,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CAeT"}
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;AAmTtB,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CA6BT"}
@@ -5,6 +5,7 @@ import { selectManyWithAbort, } from '../shared/shared.prompts.js';
5
5
  import { readGlobalOptions, resolveConcreteScopes, } from '../shared/shared.utils.js';
6
6
  import { DEFAULT_SYNC_CONFIG, loadSyncConfig, saveSyncConfig, } from '../../config/index.js';
7
7
  import { computeSyncPlan, executeSyncPlan, scanCanonical } from '../../engine/index.js';
8
+ import { CliError } from '../../errors/index.js';
8
9
  import { resolveProjectRoot, resolveScopeRoot } from '../../fs/paths.js';
9
10
  import { loadManifest } from '../../manifest/index.js';
10
11
  import { claudeAdapter } from '../../providers/claude/index.js';
@@ -15,7 +16,7 @@ import { cursorAdapter } from '../../providers/cursor/index.js';
15
16
  import { geminiAdapter } from '../../providers/gemini/index.js';
16
17
  import { getConfigAwareAdapters, } from '../../providers/shared/index.js';
17
18
  import { formatSyncPlan } from '../../ui/output.js';
18
- import { Command } from 'commander';
19
+ import { Command, Option } from 'commander';
19
20
  import { runSyncApply } from './apply.js';
20
21
  import { runSyncDryRun } from './dry-run.js';
21
22
  function defaultDependencies() {
@@ -53,6 +54,18 @@ function defaultDependencies() {
53
54
  formatSyncPlan,
54
55
  };
55
56
  }
57
+ const INSTALL_CANONICAL_PATH_PATTERN = /^\.agents\/(skills|agents|rules)\/[^/\\]+$/;
58
+ function validateInstallCanonicalPaths(paths) {
59
+ if (!paths?.length) {
60
+ return undefined;
61
+ }
62
+ for (const path of paths) {
63
+ if (!INSTALL_CANONICAL_PATH_PATTERN.test(path)) {
64
+ throw new CliError(`Invalid --install-canonical path: ${path}`, 1);
65
+ }
66
+ }
67
+ return paths;
68
+ }
56
69
  function hasProviderMismatches(mismatches) {
57
70
  return (mismatches.detectedUnset.length > 0 ||
58
71
  mismatches.detectedDisabled.length > 0);
@@ -125,7 +138,7 @@ async function maybeResolveProviderMismatches(context, scope, scopeRoot, configP
125
138
  activeAdapters: resolution.activeAdapters,
126
139
  };
127
140
  }
128
- async function computePlans(context, dependencies) {
141
+ async function computePlans(context, dependencies, allowedRemovalCanonicalPaths) {
129
142
  const scopePlans = [];
130
143
  for (const scope of resolveConcreteScopes(context.scope)) {
131
144
  const scopeRoot = await dependencies.resolveScopeRoot(scope, context);
@@ -149,6 +162,7 @@ async function computePlans(context, dependencies) {
149
162
  scope,
150
163
  config: resolved.config,
151
164
  scopeRoot,
165
+ allowedRemovalCanonicalPaths,
152
166
  });
153
167
  let codexExtensionPlan;
154
168
  let codexExtension;
@@ -201,8 +215,8 @@ function logNonInteractiveMismatchGuidance(context, scopePlans) {
201
215
  }
202
216
  }
203
217
  }
204
- async function runSyncCommand(context, dependencies) {
205
- const scopePlans = await computePlans(context, dependencies);
218
+ async function runSyncCommand(context, dependencies, allowedRemovalCanonicalPaths) {
219
+ const scopePlans = await computePlans(context, dependencies, allowedRemovalCanonicalPaths);
206
220
  logNonInteractiveMismatchGuidance(context, scopePlans);
207
221
  if (context.dryRun) {
208
222
  runSyncDryRun(context, scopePlans, dependencies);
@@ -218,8 +232,16 @@ export function createSyncCommand(overrides = {}) {
218
232
  return new Command('sync')
219
233
  .description('Sync canonical content to provider views')
220
234
  .option('--dry-run', 'Preview sync changes without applying')
235
+ .addOption(new Option('--install-canonical <path>', 'Internal install sync filter')
236
+ .hideHelp()
237
+ .default([])
238
+ .argParser((value, previous) => [
239
+ ...(previous ?? []),
240
+ value,
241
+ ]))
221
242
  .action(async (_options, command) => {
222
243
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
223
- await runSyncCommand(context, dependencies);
244
+ const options = command.opts();
245
+ await runSyncCommand(context, dependencies, validateInstallCanonicalPaths(options.installCanonical));
224
246
  });
225
247
  }
@@ -70,6 +70,7 @@ export interface SyncCommandDependencies {
70
70
  scope: ConcreteScope;
71
71
  config: SyncConfig;
72
72
  scopeRoot: string;
73
+ allowedRemovalCanonicalPaths?: string[];
73
74
  }) => Promise<SyncPlan>;
74
75
  executeSyncPlan: (plan: SyncPlan, manifest: Manifest, manifestPath: string) => Promise<SyncResult>;
75
76
  computeCodexProjectExtensionPlan: (scopeRoot: string, canonicalEntries: CanonicalEntry[]) => Promise<CodexExtensionPlan>;
@@ -1 +1 @@
1
- {"version":3,"file":"sync.types.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/sync.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.types.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/sync.types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import { type AutoSyncDependencies } from '../../tools/shared/auto-sync.js';
2
2
  import type { Command } from 'commander';
3
- export declare function createToolsInstallCommand(syncDependencies?: AutoSyncDependencies): Command;
3
+ export declare function createToolsInstallCommand(syncDependencies?: AutoSyncDependencies, createBaseCommand?: () => Command): Command;
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/install/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,yBAAyB,CACvC,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CAyBT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/install/index.ts"],"names":[],"mappings":"AAQA,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,iBAAiB,GAAE,MAAM,OAAgC,GACxD,OAAO,CA2BT"}
@@ -3,10 +3,21 @@ import { buildCommandContext } from '../../../app/command-context.js';
3
3
  import { createInitToolsCommand } from '../../init/tools/index.js';
4
4
  import { readGlobalOptions, resolveConcreteScopes, } from '../../shared/shared.utils.js';
5
5
  import { autoSync, } from '../../tools/shared/auto-sync.js';
6
+ import { getInstalledCanonicalPaths as getInstallSyncCanonicalPaths } from '../../tools/shared/install-sync-context.js';
6
7
  const defaultSyncDependencies = {
7
- runSync: async ({ scope, cwd }) => {
8
+ runSync: async ({ scope, cwd, installedCanonicalPaths }) => {
9
+ const syncArgs = [
10
+ ...process.execArgv,
11
+ process.argv[1],
12
+ 'sync',
13
+ '--scope',
14
+ scope,
15
+ ];
16
+ for (const canonicalPath of installedCanonicalPaths ?? []) {
17
+ syncArgs.push('--install-canonical', canonicalPath);
18
+ }
8
19
  await new Promise((resolve, reject) => {
9
- execFile(process.execPath, [...process.execArgv, process.argv[1], 'sync', '--scope', scope], { cwd }, (error) => {
20
+ execFile(process.execPath, syncArgs, { cwd }, (error) => {
10
21
  if (error)
11
22
  reject(error);
12
23
  else
@@ -15,8 +26,8 @@ const defaultSyncDependencies = {
15
26
  });
16
27
  },
17
28
  };
18
- export function createToolsInstallCommand(syncDependencies = defaultSyncDependencies) {
19
- const cmd = createInitToolsCommand();
29
+ export function createToolsInstallCommand(syncDependencies = defaultSyncDependencies, createBaseCommand = createInitToolsCommand) {
30
+ const cmd = createBaseCommand();
20
31
  cmd.name('install');
21
32
  cmd.option('--no-sync', 'Skip auto-sync after install');
22
33
  cmd.hook('postAction', async (thisCommand, actionCommand) => {
@@ -28,7 +39,8 @@ export function createToolsInstallCommand(syncDependencies = defaultSyncDependen
28
39
  const globalOptions = readGlobalOptions(actionCommand);
29
40
  const context = buildCommandContext(globalOptions);
30
41
  const scopes = resolveConcreteScopes(context.scope);
31
- await autoSync(scopes, context.cwd, context.home, context.logger, syncDependencies);
42
+ const installedCanonicalPaths = getInstallSyncCanonicalPaths(actionCommand);
43
+ await autoSync(scopes, context.cwd, context.home, context.logger, syncDependencies, { installedCanonicalPaths });
32
44
  });
33
45
  return cmd;
34
46
  }
@@ -5,6 +5,7 @@ export interface AutoSyncDependencies {
5
5
  scope: ConcreteScope;
6
6
  cwd: string;
7
7
  home: string;
8
+ installedCanonicalPaths?: string[];
8
9
  }) => Promise<void>;
9
10
  }
10
11
  export interface AutoSyncResult {
@@ -12,5 +13,7 @@ export interface AutoSyncResult {
12
13
  scopes: ConcreteScope[];
13
14
  error: string | null;
14
15
  }
15
- export declare function autoSync(scopes: ConcreteScope[], cwd: string, home: string, logger: CliLogger, dependencies: AutoSyncDependencies): Promise<AutoSyncResult>;
16
+ export declare function autoSync(scopes: ConcreteScope[], cwd: string, home: string, logger: CliLogger, dependencies: AutoSyncDependencies, options?: {
17
+ installedCanonicalPaths?: string[];
18
+ }): Promise<AutoSyncResult>;
16
19
  //# sourceMappingURL=auto-sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auto-sync.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/auto-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,OAAO,EAAE;QACjB,KAAK,EAAE,aAAa,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,cAAc,CAAC,CAgBzB"}
1
+ {"version":3,"file":"auto-sync.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/auto-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,OAAO,EAAE;QACjB,KAAK,EAAE,aAAa,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;KACpC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,oBAAoB,EAClC,OAAO,CAAC,EAAE;IAAE,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/C,OAAO,CAAC,cAAc,CAAC,CAqBzB"}
@@ -1,10 +1,15 @@
1
- export async function autoSync(scopes, cwd, home, logger, dependencies) {
1
+ export async function autoSync(scopes, cwd, home, logger, dependencies, options) {
2
2
  if (scopes.length === 0) {
3
3
  return { synced: false, scopes: [], error: null };
4
4
  }
5
5
  try {
6
6
  for (const scope of scopes) {
7
- await dependencies.runSync({ scope, cwd, home });
7
+ await dependencies.runSync({
8
+ scope,
9
+ cwd,
10
+ home,
11
+ installedCanonicalPaths: options?.installedCanonicalPaths,
12
+ });
8
13
  }
9
14
  logger.info('Auto-sync completed.');
10
15
  return { synced: true, scopes, error: null };
@@ -0,0 +1,9 @@
1
+ import type { PackName } from '../../tools/shared/types.js';
2
+ import type { Command } from 'commander';
3
+ export declare function canonicalSkillPaths(skillNames: readonly string[]): string[];
4
+ export declare function canonicalAgentPaths(agentNames: readonly string[]): string[];
5
+ export declare function canonicalPathsForPack(pack: PackName): string[];
6
+ export declare function canonicalPathsForPacks(packs: readonly PackName[]): string[];
7
+ export declare function setInstalledCanonicalPaths(command: Command, canonicalPaths: readonly string[]): void;
8
+ export declare function getInstalledCanonicalPaths(command: Command): string[];
9
+ //# sourceMappingURL=install-sync-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-sync-context.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/install-sync-context.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAI3E;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAI3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAuB9D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,EAAE,CAI3E;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,IAAI,CAMN;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAGrE"}
@@ -0,0 +1,45 @@
1
+ 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
+ const INSTALL_SYNC_CANONICAL_PATHS = Symbol('oat.installSyncCanonicalPaths');
3
+ function uniqueCanonicalPaths(paths) {
4
+ return [...new Set(paths)];
5
+ }
6
+ export function canonicalSkillPaths(skillNames) {
7
+ return uniqueCanonicalPaths(skillNames.map((skillName) => `.agents/skills/${skillName}`));
8
+ }
9
+ export function canonicalAgentPaths(agentNames) {
10
+ return uniqueCanonicalPaths(agentNames.map((agentName) => `.agents/agents/${agentName}`));
11
+ }
12
+ export function canonicalPathsForPack(pack) {
13
+ switch (pack) {
14
+ case 'core':
15
+ return canonicalSkillPaths(CORE_SKILLS);
16
+ case 'ideas':
17
+ return canonicalSkillPaths(IDEA_SKILLS);
18
+ case 'docs':
19
+ return canonicalSkillPaths(DOCS_SKILLS);
20
+ case 'workflows':
21
+ return uniqueCanonicalPaths([
22
+ ...canonicalSkillPaths(WORKFLOW_SKILLS),
23
+ ...canonicalAgentPaths(WORKFLOW_AGENTS),
24
+ ]);
25
+ case 'utility':
26
+ return canonicalSkillPaths(UTILITY_SKILLS);
27
+ case 'project-management':
28
+ return canonicalSkillPaths(PROJECT_MANAGEMENT_SKILLS);
29
+ case 'research':
30
+ return uniqueCanonicalPaths([
31
+ ...canonicalSkillPaths(RESEARCH_SKILLS),
32
+ ...canonicalAgentPaths(RESEARCH_AGENTS),
33
+ ]);
34
+ }
35
+ }
36
+ export function canonicalPathsForPacks(packs) {
37
+ return uniqueCanonicalPaths(packs.flatMap((pack) => canonicalPathsForPack(pack)));
38
+ }
39
+ export function setInstalledCanonicalPaths(command, canonicalPaths) {
40
+ Reflect.set(command, INSTALL_SYNC_CANONICAL_PATHS, uniqueCanonicalPaths(canonicalPaths));
41
+ }
42
+ export function getInstalledCanonicalPaths(command) {
43
+ const value = Reflect.get(command, INSTALL_SYNC_CANONICAL_PATHS);
44
+ return Array.isArray(value) ? uniqueCanonicalPaths(value) : [];
45
+ }
@@ -10,7 +10,8 @@ interface ComputeSyncPlanArgs {
10
10
  scope: EngineScope;
11
11
  config: SyncConfig;
12
12
  scopeRoot?: string;
13
+ allowedRemovalCanonicalPaths?: string[];
13
14
  }
14
- export declare function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, }: ComputeSyncPlanArgs): Promise<SyncPlan>;
15
+ export declare function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, allowedRemovalCanonicalPaths, }: ComputeSyncPlanArgs): Promise<SyncPlan>;
15
16
  export {};
16
17
  //# sourceMappingURL=compute-plan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compute-plan.d.ts","sourceRoot":"","sources":["../../src/engine/compute-plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,OAAO,KAAK,EACV,WAAW,EAEX,QAAQ,EAET,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,UAAU,mBAAmB;IAC3B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoPD,wBAAsB,eAAe,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,EAAE,iBAAiB,GAC7B,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyGzC"}
1
+ {"version":3,"file":"compute-plan.d.ts","sourceRoot":"","sources":["../../src/engine/compute-plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,OAAO,KAAK,EACV,WAAW,EAEX,QAAQ,EAET,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,UAAU,mBAAmB;IAC3B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC;CACzC;AAoPD,wBAAsB,eAAe,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,EAAE,iBAAiB,EAC5B,4BAA4B,GAC7B,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsHzC"}
@@ -168,12 +168,15 @@ function resolveScopeRoot(canonical, explicitScopeRoot) {
168
168
  function entryContentTypeMatches(entry, contentType) {
169
169
  return entry.type === contentType;
170
170
  }
171
- export async function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, }) {
171
+ export async function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, allowedRemovalCanonicalPaths, }) {
172
172
  const entries = [];
173
173
  const removals = [];
174
174
  const scopeRoot = resolveScopeRoot(canonical, explicitScopeRoot);
175
175
  const seenCanonicalKeys = new Set();
176
176
  const activeProviderNames = new Set();
177
+ const removalFilter = allowedRemovalCanonicalPaths
178
+ ? new Set(allowedRemovalCanonicalPaths.map((canonicalPath) => normalize(canonicalPath)))
179
+ : null;
177
180
  for (const adapter of adapters) {
178
181
  for (const mapping of getSyncMappings(adapter, scope)) {
179
182
  const mappingStrategy = resolveStrategy(adapter, config, Boolean(mapping.transformCanonical));
@@ -228,6 +231,10 @@ export async function computeSyncPlan({ canonical, adapters, manifest, scope, co
228
231
  if (seenCanonicalKeys.has(canonicalKey)) {
229
232
  continue;
230
233
  }
234
+ if (removalFilter &&
235
+ !removalFilter.has(normalize(manifestEntry.canonicalPath))) {
236
+ continue;
237
+ }
231
238
  removals.push(createRemovalEntry(manifestEntry, scopeRoot));
232
239
  }
233
240
  return { scope, entries, removals };
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/validation/skills.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,uCAAuC;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sCAAsC;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAChD,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B,UAAU,6BAA6B;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAgOD,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,uCAAuC,EAChD,YAAY,GAAE,6BAAkC,GAC/C,OAAO,CAAC,sCAAsC,CAAC,CAoBjD;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,EACtC,YAAY,GAAE,6BAAkC,GAC/C,OAAO,CAAC,uBAAuB,CAAC,CA6HlC"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/validation/skills.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,uCAAuC;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sCAAsC;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAChD,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B,UAAU,6BAA6B;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAmPD,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,uCAAuC,EAChD,YAAY,GAAE,6BAAkC,GAC/C,OAAO,CAAC,sCAAsC,CAAC,CAoBjD;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,EACtC,YAAY,GAAE,6BAAkC,GAC/C,OAAO,CAAC,uBAAuB,CAAC,CA6HlC"}
@@ -77,6 +77,15 @@ function validateQuickStartSemantics(skillPath, content, findings) {
77
77
  message: 'Quick-start must limit follow-up questions to the minimum needed to remove blockers',
78
78
  });
79
79
  }
80
+ if (!(/(project description|project brief)/i.test(content) &&
81
+ /(project name alone|bare .*project-name|only a bare .*project-name)/i.test(content) &&
82
+ /(ask the user|ask for)/i.test(content) &&
83
+ /(do not infer requirements from the project name alone|not enough context to start discovery)/i.test(content))) {
84
+ findings.push({
85
+ file: skillPath,
86
+ message: 'Quick-start must treat a bare project name as insufficient input, ask for a project description, and avoid inferring scope from the repo',
87
+ });
88
+ }
80
89
  }
81
90
  async function listChangedSkillFiles(repoRoot, baseRef, dependencies) {
82
91
  const execFile = dependencies.gitExecFile ?? execFileAsync;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.0.33",
3
+ "version": "0.0.35",
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.33"
36
+ "@open-agent-toolkit/control-plane": "0.0.35"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^22.10.0",