@open-agent-toolkit/cli 0.2.35 → 0.2.37

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 (183) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/backlog-lifecycle.md +18 -0
  3. package/assets/docs/cli-utilities/bootstrap.md +6 -3
  4. package/assets/docs/cli-utilities/config-and-local-state.md +26 -12
  5. package/assets/docs/cli-utilities/configuration.md +36 -13
  6. package/assets/docs/cli-utilities/tool-packs.md +423 -51
  7. package/assets/docs/provider-sync/scope-and-surface.md +4 -1
  8. package/assets/docs/reference/cli-reference.md +5 -3
  9. package/assets/docs/reference/file-locations.md +28 -4
  10. package/assets/docs/reference/troubleshooting.md +132 -2
  11. package/assets/docs/workflows/projects/lifecycle.md +21 -2
  12. package/assets/public-package-versions.json +4 -4
  13. package/assets/scripts/generate-oat-state.sh +441 -0
  14. package/assets/scripts/generate-thin-index.sh +200 -0
  15. package/assets/skills/oat-agent-instructions-analyze/SKILL.md +10 -5
  16. package/assets/skills/oat-agent-instructions-apply/SKILL.md +30 -5
  17. package/assets/skills/oat-brainstorm/SKILL.md +34 -8
  18. package/assets/skills/oat-brainstorm/references/destinations.md +6 -1
  19. package/assets/skills/oat-docs-analyze/SKILL.md +9 -4
  20. package/assets/skills/oat-docs-apply/SKILL.md +6 -3
  21. package/assets/skills/oat-pjm-add-backlog-item/SKILL.md +14 -1
  22. package/assets/skills/oat-pjm-decision/SKILL.md +22 -10
  23. package/assets/skills/oat-pjm-review-backlog/SKILL.md +20 -3
  24. package/assets/skills/oat-pjm-update-repo-reference/SKILL.md +20 -10
  25. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
  26. package/assets/skills/oat-project-document/SKILL.md +21 -3
  27. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
  28. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
  29. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
  30. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
  31. package/assets/skills/oat-project-summary/SKILL.md +23 -11
  32. package/assets/skills/oat-repo-knowledge-index/SKILL.md +6 -3
  33. package/dist/commands/backlog/index.d.ts +2 -0
  34. package/dist/commands/backlog/index.d.ts.map +1 -1
  35. package/dist/commands/backlog/index.js +67 -23
  36. package/dist/commands/backlog/new.d.ts +3 -0
  37. package/dist/commands/backlog/new.d.ts.map +1 -1
  38. package/dist/commands/backlog/new.js +8 -21
  39. package/dist/commands/decision/agents-guidance.d.ts.map +1 -1
  40. package/dist/commands/decision/agents-guidance.js +2 -1
  41. package/dist/commands/decision/index.d.ts +2 -0
  42. package/dist/commands/decision/index.d.ts.map +1 -1
  43. package/dist/commands/decision/index.js +19 -3
  44. package/dist/commands/decision/new.d.ts +4 -0
  45. package/dist/commands/decision/new.d.ts.map +1 -1
  46. package/dist/commands/decision/new.js +11 -30
  47. package/dist/commands/doctor/index.d.ts +4 -0
  48. package/dist/commands/doctor/index.d.ts.map +1 -1
  49. package/dist/commands/doctor/index.js +254 -9
  50. package/dist/commands/init/tools/brainstorm/index.d.ts.map +1 -1
  51. package/dist/commands/init/tools/brainstorm/index.js +20 -6
  52. package/dist/commands/init/tools/docs/index.d.ts.map +1 -1
  53. package/dist/commands/init/tools/docs/index.js +4 -1
  54. package/dist/commands/init/tools/ideas/index.d.ts.map +1 -1
  55. package/dist/commands/init/tools/ideas/index.js +4 -1
  56. package/dist/commands/init/tools/index.d.ts +11 -2
  57. package/dist/commands/init/tools/index.d.ts.map +1 -1
  58. package/dist/commands/init/tools/index.js +459 -351
  59. package/dist/commands/init/tools/install-state.d.ts +2 -0
  60. package/dist/commands/init/tools/install-state.d.ts.map +1 -1
  61. package/dist/commands/init/tools/install-state.js +11 -0
  62. package/dist/commands/init/tools/project-management/agents-guidance.d.ts.map +1 -1
  63. package/dist/commands/init/tools/project-management/agents-guidance.js +3 -1
  64. package/dist/commands/init/tools/project-management/index.d.ts +1 -0
  65. package/dist/commands/init/tools/project-management/index.d.ts.map +1 -1
  66. package/dist/commands/init/tools/project-management/index.js +24 -55
  67. package/dist/commands/init/tools/project-management/install-project-management.d.ts +4 -0
  68. package/dist/commands/init/tools/project-management/install-project-management.d.ts.map +1 -1
  69. package/dist/commands/init/tools/project-management/install-project-management.js +4 -1
  70. package/dist/commands/init/tools/research/index.d.ts.map +1 -1
  71. package/dist/commands/init/tools/research/index.js +4 -1
  72. package/dist/commands/init/tools/shared/copy-helpers.d.ts.map +1 -1
  73. package/dist/commands/init/tools/shared/copy-helpers.js +10 -0
  74. package/dist/commands/init/tools/shared/skill-manifest.d.ts +15 -15
  75. package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
  76. package/dist/commands/init/tools/shared/skill-manifest.js +17 -122
  77. package/dist/commands/init/tools/utility/index.d.ts.map +1 -1
  78. package/dist/commands/init/tools/utility/index.js +4 -1
  79. package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
  80. package/dist/commands/init/tools/workflows/index.js +4 -1
  81. package/dist/commands/init/tools/workflows/install-workflows.d.ts.map +1 -1
  82. package/dist/commands/init/tools/workflows/install-workflows.js +2 -4
  83. package/dist/commands/pjm/adoption.d.ts +12 -0
  84. package/dist/commands/pjm/adoption.d.ts.map +1 -0
  85. package/dist/commands/pjm/adoption.js +47 -0
  86. package/dist/commands/pjm/doctor.d.ts +3 -2
  87. package/dist/commands/pjm/doctor.d.ts.map +1 -1
  88. package/dist/commands/pjm/doctor.js +28 -13
  89. package/dist/commands/pjm/index.d.ts +2 -0
  90. package/dist/commands/pjm/index.d.ts.map +1 -1
  91. package/dist/commands/pjm/index.js +11 -3
  92. package/dist/commands/pjm/init.d.ts +3 -0
  93. package/dist/commands/pjm/init.d.ts.map +1 -1
  94. package/dist/commands/pjm/init.js +37 -32
  95. package/dist/commands/pjm/migrate.d.ts +1 -0
  96. package/dist/commands/pjm/migrate.d.ts.map +1 -1
  97. package/dist/commands/pjm/migrate.js +1 -0
  98. package/dist/commands/pjm/template-source.d.ts +14 -0
  99. package/dist/commands/pjm/template-source.d.ts.map +1 -0
  100. package/dist/commands/pjm/template-source.js +56 -0
  101. package/dist/commands/remove/skills/remove-skills.d.ts.map +1 -1
  102. package/dist/commands/remove/skills/remove-skills.js +10 -19
  103. package/dist/commands/status/index.d.ts +5 -0
  104. package/dist/commands/status/index.d.ts.map +1 -1
  105. package/dist/commands/status/index.js +203 -2
  106. package/dist/commands/sync/index.d.ts.map +1 -1
  107. package/dist/commands/sync/index.js +40 -7
  108. package/dist/commands/sync/sync.types.d.ts +4 -0
  109. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  110. package/dist/commands/tools/has/has-pack.d.ts +11 -2
  111. package/dist/commands/tools/has/has-pack.d.ts.map +1 -1
  112. package/dist/commands/tools/has/has-pack.js +33 -20
  113. package/dist/commands/tools/index.d.ts.map +1 -1
  114. package/dist/commands/tools/index.js +3 -1
  115. package/dist/commands/tools/info/info-tool.d.ts +3 -0
  116. package/dist/commands/tools/info/info-tool.d.ts.map +1 -1
  117. package/dist/commands/tools/info/info-tool.js +29 -4
  118. package/dist/commands/tools/list/list-tools.d.ts +3 -0
  119. package/dist/commands/tools/list/list-tools.d.ts.map +1 -1
  120. package/dist/commands/tools/list/list-tools.js +31 -4
  121. package/dist/commands/tools/migrate/index.d.ts +26 -0
  122. package/dist/commands/tools/migrate/index.d.ts.map +1 -0
  123. package/dist/commands/tools/migrate/index.js +312 -0
  124. package/dist/commands/tools/migrate/migrate-pack.d.ts +81 -0
  125. package/dist/commands/tools/migrate/migrate-pack.d.ts.map +1 -0
  126. package/dist/commands/tools/migrate/migrate-pack.js +324 -0
  127. package/dist/commands/tools/outdated/outdated-tools.d.ts +11 -0
  128. package/dist/commands/tools/outdated/outdated-tools.d.ts.map +1 -1
  129. package/dist/commands/tools/outdated/outdated-tools.js +33 -5
  130. package/dist/commands/tools/remove/index.d.ts.map +1 -1
  131. package/dist/commands/tools/remove/index.js +73 -20
  132. package/dist/commands/tools/remove/remove-tools.d.ts +28 -0
  133. package/dist/commands/tools/remove/remove-tools.d.ts.map +1 -1
  134. package/dist/commands/tools/remove/remove-tools.js +156 -26
  135. package/dist/commands/tools/shared/apply-pack-reconcile.d.ts +41 -0
  136. package/dist/commands/tools/shared/apply-pack-reconcile.d.ts.map +1 -0
  137. package/dist/commands/tools/shared/apply-pack-reconcile.js +126 -0
  138. package/dist/commands/tools/shared/auto-sync.d.ts +5 -2
  139. package/dist/commands/tools/shared/auto-sync.d.ts.map +1 -1
  140. package/dist/commands/tools/shared/auto-sync.js +1 -0
  141. package/dist/commands/tools/shared/content-digest.d.ts +3 -0
  142. package/dist/commands/tools/shared/content-digest.d.ts.map +1 -0
  143. package/dist/commands/tools/shared/content-digest.js +57 -0
  144. package/dist/commands/tools/shared/format-pack-inventory.d.ts +3 -0
  145. package/dist/commands/tools/shared/format-pack-inventory.d.ts.map +1 -0
  146. package/dist/commands/tools/shared/format-pack-inventory.js +21 -0
  147. package/dist/commands/tools/shared/install-sync-context.d.ts.map +1 -1
  148. package/dist/commands/tools/shared/install-sync-context.js +2 -25
  149. package/dist/commands/tools/shared/pack-inventory.d.ts +46 -0
  150. package/dist/commands/tools/shared/pack-inventory.d.ts.map +1 -0
  151. package/dist/commands/tools/shared/pack-inventory.js +207 -0
  152. package/dist/commands/tools/shared/pack-lifecycle.d.ts +34 -0
  153. package/dist/commands/tools/shared/pack-lifecycle.d.ts.map +1 -0
  154. package/dist/commands/tools/shared/pack-lifecycle.js +67 -0
  155. package/dist/commands/tools/shared/pack-manifest.d.ts +11 -0
  156. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -0
  157. package/dist/commands/tools/shared/pack-manifest.js +384 -0
  158. package/dist/commands/tools/shared/pack-paths.d.ts +21 -0
  159. package/dist/commands/tools/shared/pack-paths.d.ts.map +1 -0
  160. package/dist/commands/tools/shared/pack-paths.js +35 -0
  161. package/dist/commands/tools/shared/pack-reconcile.d.ts +64 -0
  162. package/dist/commands/tools/shared/pack-reconcile.d.ts.map +1 -0
  163. package/dist/commands/tools/shared/pack-reconcile.js +158 -0
  164. package/dist/commands/tools/shared/project-tools-config.d.ts.map +1 -1
  165. package/dist/commands/tools/shared/project-tools-config.js +12 -38
  166. package/dist/commands/tools/shared/scan-tools.js +2 -2
  167. package/dist/commands/tools/shared/scoped-pack-intent.d.ts +34 -0
  168. package/dist/commands/tools/shared/scoped-pack-intent.d.ts.map +1 -0
  169. package/dist/commands/tools/shared/scoped-pack-intent.js +116 -0
  170. package/dist/commands/tools/shared/types.d.ts +22 -0
  171. package/dist/commands/tools/shared/types.d.ts.map +1 -1
  172. package/dist/commands/tools/update/index.d.ts.map +1 -1
  173. package/dist/commands/tools/update/index.js +30 -5
  174. package/dist/commands/tools/update/update-tools.d.ts +9 -1
  175. package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
  176. package/dist/commands/tools/update/update-tools.js +176 -64
  177. package/dist/config/oat-config.d.ts +6 -0
  178. package/dist/config/oat-config.d.ts.map +1 -1
  179. package/dist/config/oat-config.js +49 -20
  180. package/dist/fs/paths.d.ts +12 -0
  181. package/dist/fs/paths.d.ts.map +1 -1
  182. package/dist/fs/paths.js +87 -1
  183. package/package.json +2 -2
@@ -1,40 +1,12 @@
1
1
  import { readOatConfig, writeOatConfig, } from '../../../config/oat-config.js';
2
2
  import { resolveAssetsRoot } from '../../../fs/assets.js';
3
3
  import { scanTools } from './scan-tools.js';
4
- const ALL_PACKS = [
5
- 'core',
6
- 'ideas',
7
- 'docs',
8
- 'workflows',
9
- 'utility',
10
- 'project-management',
11
- 'research',
12
- 'brainstorm',
13
- ];
14
4
  const defaultDependencies = {
15
5
  resolveAssetsRoot,
16
6
  scanTools,
17
7
  readOatConfig,
18
8
  writeOatConfig,
19
9
  };
20
- function buildProjectToolsConfig(tools) {
21
- const installedPacks = new Set(tools
22
- .filter((tool) => tool.scope === 'project' && tool.pack !== 'custom')
23
- .map((tool) => tool.pack));
24
- if (installedPacks.size === 0) {
25
- return undefined;
26
- }
27
- return Object.fromEntries(ALL_PACKS.map((pack) => [pack, installedPacks.has(pack)]));
28
- }
29
- function toolsConfigEquals(left, right) {
30
- if (left === undefined || right === undefined) {
31
- return left === right;
32
- }
33
- const leftKeys = Object.keys(left);
34
- const rightKeys = Object.keys(right);
35
- return (leftKeys.length === rightKeys.length &&
36
- ALL_PACKS.every((pack) => left[pack] === right[pack]));
37
- }
38
10
  export async function reconcileProjectToolsConfig(options, dependencies = defaultDependencies) {
39
11
  const assetsRoot = await dependencies.resolveAssetsRoot();
40
12
  const projectTools = await dependencies.scanTools({
@@ -43,17 +15,19 @@ export async function reconcileProjectToolsConfig(options, dependencies = defaul
43
15
  assetsRoot,
44
16
  });
45
17
  const config = await dependencies.readOatConfig(options.repoRoot);
46
- const tools = buildProjectToolsConfig(projectTools);
47
- if (toolsConfigEquals(config.tools, tools)) {
48
- return 'unchanged';
49
- }
50
- const nextConfig = { ...config };
51
- if (tools === undefined) {
52
- delete nextConfig.tools;
18
+ const tools = { ...config.tools };
19
+ let changed = false;
20
+ for (const tool of projectTools) {
21
+ if (tool.scope === 'project' &&
22
+ tool.pack !== 'custom' &&
23
+ tools[tool.pack] !== true) {
24
+ tools[tool.pack] = true;
25
+ changed = true;
26
+ }
53
27
  }
54
- else {
55
- nextConfig.tools = tools;
28
+ if (!changed) {
29
+ return 'unchanged';
56
30
  }
57
- await dependencies.writeOatConfig(options.repoRoot, nextConfig);
31
+ await dependencies.writeOatConfig(options.repoRoot, { ...config, tools });
58
32
  return 'written';
59
33
  }
@@ -96,8 +96,8 @@ export async function scanTools(options) {
96
96
  : 'not-bundled',
97
97
  });
98
98
  }
99
- // Scan agents (project scope only)
100
- if (options.scope === 'project') {
99
+ // Scan agents at both concrete scopes.
100
+ {
101
101
  const agentsDir = join(options.scopeRoot, '.agents', 'agents');
102
102
  const agentsDirExists = await deps.dirExists(agentsDir);
103
103
  if (agentsDirExists) {
@@ -0,0 +1,34 @@
1
+ import type { ConcreteScope } from '../../../shared/types.js';
2
+ import type { PackName } from './types.js';
3
+ export type PackIntentSource = 'declared' | 'inferred-legacy' | 'none';
4
+ export interface ScopedPackIntent {
5
+ pack: PackName;
6
+ scope: ConcreteScope;
7
+ enabled: boolean;
8
+ source: PackIntentSource;
9
+ configPath: string;
10
+ diagnostics: PackIntentDiagnostic[];
11
+ }
12
+ export interface PackIntentDiagnostic {
13
+ code: 'legacy-false-conflict';
14
+ message: string;
15
+ paths: string[];
16
+ }
17
+ export interface IntentReadInput {
18
+ pack: PackName;
19
+ scope: ConcreteScope;
20
+ scopeRoot: string;
21
+ }
22
+ export interface IntentWriteInput extends IntentReadInput {
23
+ enabled: boolean;
24
+ }
25
+ /**
26
+ * Returns ownership evidence that is safe to use when deciding whether a
27
+ * shared managed asset must be retained. A shared asset cannot prove that any
28
+ * one of its possible owners is installed, so only declared intent or a
29
+ * non-shared managed asset is considered.
30
+ */
31
+ export declare function hasScopedPackOwnershipEvidence(input: IntentReadInput): Promise<boolean>;
32
+ export declare function readScopedPackIntent(input: IntentReadInput): Promise<ScopedPackIntent>;
33
+ export declare function writeScopedPackIntent(input: IntentWriteInput): Promise<void>;
34
+ //# sourceMappingURL=scoped-pack-intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped-pack-intent.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/scoped-pack-intent.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,iBAAiB,GAAG,MAAM,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,OAAO,EAAE,OAAO,CAAC;CAClB;AAoDD;;;;;GAKG;AACH,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAsB3B;AAgBD,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -0,0 +1,116 @@
1
+ import { lstat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { readOatConfig, readUserConfig, writeOatConfig, writeUserConfig, } from '../../../config/oat-config.js';
4
+ import { getPackDefinition } from './pack-manifest.js';
5
+ function configPathForScope(scopeRoot) {
6
+ return join(scopeRoot, '.oat', 'config.json');
7
+ }
8
+ function userConfigDir(scopeRoot) {
9
+ return join(scopeRoot, '.oat');
10
+ }
11
+ async function readConcreteConfig(input) {
12
+ return input.scope === 'project'
13
+ ? readOatConfig(input.scopeRoot)
14
+ : readUserConfig(userConfigDir(input.scopeRoot));
15
+ }
16
+ async function pathExists(path) {
17
+ try {
18
+ await lstat(path);
19
+ return true;
20
+ }
21
+ catch (error) {
22
+ if (typeof error === 'object' &&
23
+ error !== null &&
24
+ 'code' in error &&
25
+ error.code === 'ENOENT') {
26
+ return false;
27
+ }
28
+ throw error;
29
+ }
30
+ }
31
+ async function findPhysicalManagedAssets(input) {
32
+ const paths = getPackDefinition(input.pack)
33
+ .assets.filter((asset) => asset.sharedOwner === undefined &&
34
+ asset.scopes.includes(input.scope) &&
35
+ asset.ownership[input.scope] === 'managed')
36
+ .map(({ destination }) => join(input.scopeRoot, destination));
37
+ const observed = await Promise.all(paths.map(async (path) => ((await pathExists(path)) ? path : null)));
38
+ return observed.filter((path) => path !== null);
39
+ }
40
+ /**
41
+ * Returns ownership evidence that is safe to use when deciding whether a
42
+ * shared managed asset must be retained. A shared asset cannot prove that any
43
+ * one of its possible owners is installed, so only declared intent or a
44
+ * non-shared managed asset is considered.
45
+ */
46
+ export async function hasScopedPackOwnershipEvidence(input) {
47
+ const config = await readConcreteConfig(input);
48
+ if (config.tools?.[input.pack] === true) {
49
+ return true;
50
+ }
51
+ const paths = getPackDefinition(input.pack)
52
+ .assets.filter((asset) => asset.sharedOwner === undefined &&
53
+ asset.scopes.includes(input.scope) &&
54
+ asset.ownership[input.scope] === 'managed')
55
+ .map(({ destination }) => join(input.scopeRoot, destination));
56
+ return (await Promise.all(paths.map(pathExists))).some(Boolean);
57
+ }
58
+ export async function readScopedPackIntent(input) {
59
+ const config = await readConcreteConfig(input);
60
+ const declared = config.tools?.[input.pack] === true;
61
+ const legacyFalse = config.tools?.[input.pack] === false;
62
+ const physicalAssets = declared ? [] : await findPhysicalManagedAssets(input);
63
+ const inferred = physicalAssets.length > 0;
64
+ const diagnostics = [];
65
+ if (legacyFalse && inferred) {
66
+ diagnostics.push({
67
+ code: 'legacy-false-conflict',
68
+ message: `Pack ${input.pack} has legacy false intent but managed assets exist at ${input.scope} scope`,
69
+ paths: physicalAssets,
70
+ });
71
+ }
72
+ return {
73
+ pack: input.pack,
74
+ scope: input.scope,
75
+ enabled: declared || inferred,
76
+ source: declared ? 'declared' : inferred ? 'inferred-legacy' : 'none',
77
+ configPath: configPathForScope(input.scopeRoot),
78
+ diagnostics,
79
+ };
80
+ }
81
+ function updateTools(tools, pack, enabled) {
82
+ const next = { ...tools };
83
+ if (enabled) {
84
+ next[pack] = true;
85
+ }
86
+ else {
87
+ delete next[pack];
88
+ }
89
+ return Object.keys(next).length > 0 ? next : undefined;
90
+ }
91
+ export async function writeScopedPackIntent(input) {
92
+ if (input.scope === 'project') {
93
+ const config = await readOatConfig(input.scopeRoot);
94
+ const tools = updateTools(config.tools, input.pack, input.enabled);
95
+ const next = { ...config };
96
+ if (tools) {
97
+ next.tools = tools;
98
+ }
99
+ else {
100
+ delete next.tools;
101
+ }
102
+ await writeOatConfig(input.scopeRoot, next);
103
+ return;
104
+ }
105
+ const configDir = userConfigDir(input.scopeRoot);
106
+ const config = await readUserConfig(configDir);
107
+ const tools = updateTools(config.tools, input.pack, input.enabled);
108
+ const next = { ...config };
109
+ if (tools) {
110
+ next.tools = tools;
111
+ }
112
+ else {
113
+ delete next.tools;
114
+ }
115
+ await writeUserConfig(configDir, next);
116
+ }
@@ -1,5 +1,27 @@
1
1
  import type { ConcreteScope } from '../../../shared/types.js';
2
2
  export type PackName = 'core' | 'ideas' | 'docs' | 'workflows' | 'utility' | 'project-management' | 'research' | 'brainstorm';
3
+ export type PackAssetKind = 'skill' | 'agent' | 'template' | 'script' | 'directory' | 'seed';
4
+ export type PackAssetOwnership = 'managed' | 'seed-if-missing';
5
+ export type PackAssetGeneration = 'projects-root-default' | 'projects-config-default' | 'empty-file';
6
+ export interface PackAssetDefinition {
7
+ id: string;
8
+ kind: PackAssetKind;
9
+ source?: string;
10
+ generation?: PackAssetGeneration;
11
+ destination: string;
12
+ scopes: readonly ConcreteScope[];
13
+ ownership: Partial<Record<ConcreteScope, PackAssetOwnership>>;
14
+ executable?: boolean;
15
+ sharedOwner?: string;
16
+ }
17
+ export interface PackDefinition {
18
+ name: PackName;
19
+ allowedScopes: readonly ConcreteScope[];
20
+ defaultScope: ConcreteScope;
21
+ assets: readonly PackAssetDefinition[];
22
+ }
23
+ export type PackAssetStatus = 'missing' | 'current' | 'outdated' | 'newer' | 'present';
24
+ export type PackCompleteness = 'complete' | 'partial' | 'absent';
3
25
  export interface ToolInfo {
4
26
  name: string;
5
27
  type: 'skill' | 'agent';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,OAAO,GACP,MAAM,GACN,WAAW,GACX,SAAS,GACT,oBAAoB,GACpB,UAAU,GACV,YAAY,CAAC;AAEjB,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,CAAC;CAC1D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,OAAO,GACP,MAAM,GACN,WAAW,GACX,SAAS,GACT,oBAAoB,GACpB,UAAU,GACV,YAAY,CAAC;AAEjB,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,OAAO,GACP,UAAU,GACV,QAAQ,GACR,WAAW,GACX,MAAM,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAE/D,MAAM,MAAM,mBAAmB,GAC3B,uBAAuB,GACvB,yBAAyB,GACzB,YAAY,CAAC;AAEjB,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,aAAa,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,YAAY,EAAE,aAAa,CAAC;IAC5B,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACxC;AAED,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,SAAS,GACT,UAAU,GACV,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,CAAC;CAC1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/index.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAG1C,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;AAgBxB,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GAClD,MAAM,EAAE,CAaV;AAgCD,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CAmJT;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAI7E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAOT;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAMR"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/index.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAK1C,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;AAkBxB,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GAClD,MAAM,EAAE,CAaV;AAgCD,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CAoLT;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAI7E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAOT;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAMR"}
@@ -7,6 +7,8 @@ import { copyDirWithStatus, copyFileWithStatus, } from '../../init/tools/shared/
7
7
  import { withScopeOption } from '../../shared/scope-option.js';
8
8
  import { readGlobalOptions, resolveConcreteScopes, } from '../../shared/shared.utils.js';
9
9
  import { autoSync, } from '../../tools/shared/auto-sync.js';
10
+ import { inventoryScopedPack } from '../../tools/shared/pack-inventory.js';
11
+ import { reconcilePackLifecycles } from '../../tools/shared/pack-lifecycle.js';
10
12
  import { reconcileProjectToolsConfig } from '../../tools/shared/project-tools-config.js';
11
13
  import { scanTools } from '../../tools/shared/scan-tools.js';
12
14
  import { readOatConfig, writeOatConfig } from '../../../config/oat-config.js';
@@ -28,6 +30,8 @@ const defaultDependencies = {
28
30
  fileExists,
29
31
  chmod,
30
32
  applyOatCoreGitignore,
33
+ inventoryScopedPack,
34
+ reconcilePacks: reconcilePackLifecycles,
31
35
  };
32
36
  export function buildSyncSubprocessArgs(entrypoint, execArgv, options) {
33
37
  // `--scope` is a per-command option on `sync` (not a global flag), so it must
@@ -106,13 +110,20 @@ export function createToolsUpdateCommand(dependencies = defaultDependencies, syn
106
110
  }
107
111
  // Refresh ~/.oat/docs/ when the core pack is explicitly updated or
108
112
  // reconciled through --all (D3 requirement).
109
- if (shouldRefreshCoreDocs(target, result) && assetsRoot) {
113
+ if (!dependencies.reconcilePacks &&
114
+ shouldRefreshCoreDocs(target, result) &&
115
+ assetsRoot) {
110
116
  const userRoot = await dependencies.resolveScopeRoot('user', context.cwd, context.home);
111
117
  const docsSource = join(assetsRoot, 'docs');
112
118
  const docsDestination = join(userRoot, '.oat', 'docs');
113
119
  await dependencies.copyDirWithStatus(docsSource, docsDestination, true);
114
120
  }
115
- if (assetsRoot && result.notInstalled.length === 0) {
121
+ const changedProjectScope = [...result.updated, ...result.current, ...result.newer].some(({ scope }) => scope === 'project') ||
122
+ result.assetRefreshes.some(({ scope }) => scope === 'project') ||
123
+ result.plans.some(({ scope }) => scope === 'project');
124
+ if (assetsRoot &&
125
+ result.notInstalled.length === 0 &&
126
+ changedProjectScope) {
116
127
  const repoRoot = await resolveProjectRoot(context.cwd);
117
128
  await reconcileProjectToolsConfig({
118
129
  repoRoot,
@@ -136,9 +147,18 @@ export function createToolsUpdateCommand(dependencies = defaultDependencies, syn
136
147
  return;
137
148
  }
138
149
  // Auto-sync after mutations (before output so sync errors are captured)
139
- if (result.updated.length > 0 && !dryRun && opts.sync !== false) {
140
- const affectedScopes = [...new Set(result.updated.map((t) => t.scope))];
141
- await autoSync(affectedScopes, context.cwd, context.home, logger, syncDependencies);
150
+ if (!dryRun && opts.sync !== false) {
151
+ for (const scope of scopes) {
152
+ const installedCanonicalPaths = [
153
+ ...new Set(result.plans
154
+ .filter((plan) => plan.scope === scope)
155
+ .flatMap((plan) => plan.changedCanonicalPaths)),
156
+ ];
157
+ const updatedAtScope = result.updated.some((tool) => tool.scope === scope);
158
+ if (!updatedAtScope && installedCanonicalPaths.length === 0)
159
+ continue;
160
+ await autoSync([scope], context.cwd, context.home, logger, syncDependencies, { installedCanonicalPaths });
161
+ }
142
162
  }
143
163
  if (context.json) {
144
164
  logger.json({ target: describeTarget(target), dryRun, result });
@@ -162,6 +182,11 @@ export function createToolsUpdateCommand(dependencies = defaultDependencies, syn
162
182
  const action = asset.status === 'planned' ? 'Would refresh' : 'Refreshed';
163
183
  logger.info(`${action} ${asset.type}: ${asset.name} (${asset.scope} ${asset.pack} pack)`);
164
184
  }
185
+ if (dryRun) {
186
+ for (const plan of result.plans) {
187
+ logger.info(JSON.stringify(plan, null, 2));
188
+ }
189
+ }
165
190
  if (result.updated.length === 0 && result.assetRefreshes.length === 0) {
166
191
  logger.info('No tools to update.');
167
192
  }
@@ -1,5 +1,8 @@
1
1
  import type { ApplyOatCoreResult } from '../../init/gitignore.js';
2
2
  import type { CopyStatus } from '../../init/tools/shared/copy-helpers.js';
3
+ import type { InventoryScopedPackInput, ScopedPackInventory } from '../../tools/shared/pack-inventory.js';
4
+ import { type PackLifecycleRequest, type PackLifecycleResult } from '../../tools/shared/pack-lifecycle.js';
5
+ import type { PackReconcilePlan } from '../../tools/shared/pack-reconcile.js';
3
6
  import type { ScanToolsOptions } from '../../tools/shared/scan-tools.js';
4
7
  import type { PackName, ToolInfo } from '../../tools/shared/types.js';
5
8
  import type { ConcreteScope } from '../../../shared/types.js';
@@ -14,7 +17,7 @@ export type UpdateTarget = {
14
17
  };
15
18
  export interface PackAssetRefresh {
16
19
  name: string;
17
- type: 'template' | 'script';
20
+ type: 'template' | 'script' | 'directory' | 'seed';
18
21
  pack: PackName;
19
22
  scope: ConcreteScope;
20
23
  status: 'planned' | 'refreshed';
@@ -26,6 +29,7 @@ export interface UpdateResult {
26
29
  notInstalled: string[];
27
30
  notBundled: ToolInfo[];
28
31
  assetRefreshes: PackAssetRefresh[];
32
+ plans: PackReconcilePlan[];
29
33
  }
30
34
  export interface UpdateToolsDependencies {
31
35
  scanTools: (options: ScanToolsOptions) => Promise<ToolInfo[]>;
@@ -36,6 +40,10 @@ export interface UpdateToolsDependencies {
36
40
  fileExists: (path: string) => Promise<boolean>;
37
41
  chmod: (path: string, mode: number) => Promise<void>;
38
42
  applyOatCoreGitignore?: (repoRoot: string) => Promise<ApplyOatCoreResult>;
43
+ inventoryScopedPack?: (input: InventoryScopedPackInput) => Promise<ScopedPackInventory>;
44
+ reconcilePacks?: (requests: readonly PackLifecycleRequest[], options?: {
45
+ dryRun?: boolean;
46
+ }) => Promise<PackLifecycleResult[]>;
39
47
  }
40
48
  export declare function updateTools(target: UpdateTarget, scopes: ConcreteScope[], cwd: string, home: string, dryRun: boolean, dependencies: UpdateToolsDependencies): Promise<UpdateResult>;
41
49
  //# 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,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAkB3E,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,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;CACjC;AAED,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;IACvB,cAAc,EAAE,gBAAgB,EAAE,CAAC;CACpC;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;IAC/C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC3E;AAoFD,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,CA8HvB"}
1
+ {"version":3,"file":"update-tools.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/update-tools.ts"],"names":[],"mappings":"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"}