@open-agent-toolkit/cli 0.2.36 → 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.
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/backlog-lifecycle.md +18 -0
- package/assets/docs/cli-utilities/bootstrap.md +6 -3
- package/assets/docs/cli-utilities/config-and-local-state.md +26 -12
- package/assets/docs/cli-utilities/configuration.md +36 -13
- package/assets/docs/cli-utilities/tool-packs.md +423 -51
- package/assets/docs/provider-sync/scope-and-surface.md +4 -1
- package/assets/docs/reference/cli-reference.md +5 -3
- package/assets/docs/reference/file-locations.md +28 -4
- package/assets/docs/reference/troubleshooting.md +132 -2
- package/assets/docs/workflows/projects/lifecycle.md +21 -2
- package/assets/public-package-versions.json +4 -4
- package/assets/scripts/generate-oat-state.sh +441 -0
- package/assets/scripts/generate-thin-index.sh +200 -0
- package/assets/skills/oat-agent-instructions-analyze/SKILL.md +10 -5
- package/assets/skills/oat-agent-instructions-apply/SKILL.md +30 -5
- package/assets/skills/oat-brainstorm/SKILL.md +34 -8
- package/assets/skills/oat-brainstorm/references/destinations.md +6 -1
- package/assets/skills/oat-docs-analyze/SKILL.md +9 -4
- package/assets/skills/oat-docs-apply/SKILL.md +6 -3
- package/assets/skills/oat-pjm-add-backlog-item/SKILL.md +14 -1
- package/assets/skills/oat-pjm-decision/SKILL.md +22 -10
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +20 -3
- package/assets/skills/oat-pjm-update-repo-reference/SKILL.md +20 -10
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
- package/assets/skills/oat-project-document/SKILL.md +21 -3
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-summary/SKILL.md +23 -11
- package/assets/skills/oat-repo-knowledge-index/SKILL.md +6 -3
- package/dist/commands/backlog/index.d.ts +2 -0
- package/dist/commands/backlog/index.d.ts.map +1 -1
- package/dist/commands/backlog/index.js +67 -23
- package/dist/commands/backlog/new.d.ts +3 -0
- package/dist/commands/backlog/new.d.ts.map +1 -1
- package/dist/commands/backlog/new.js +8 -21
- package/dist/commands/decision/agents-guidance.d.ts.map +1 -1
- package/dist/commands/decision/agents-guidance.js +2 -1
- package/dist/commands/decision/index.d.ts +2 -0
- package/dist/commands/decision/index.d.ts.map +1 -1
- package/dist/commands/decision/index.js +19 -3
- package/dist/commands/decision/new.d.ts +4 -0
- package/dist/commands/decision/new.d.ts.map +1 -1
- package/dist/commands/decision/new.js +11 -30
- package/dist/commands/doctor/index.d.ts +4 -0
- package/dist/commands/doctor/index.d.ts.map +1 -1
- package/dist/commands/doctor/index.js +254 -9
- package/dist/commands/init/tools/brainstorm/index.d.ts.map +1 -1
- package/dist/commands/init/tools/brainstorm/index.js +20 -6
- package/dist/commands/init/tools/docs/index.d.ts.map +1 -1
- package/dist/commands/init/tools/docs/index.js +4 -1
- package/dist/commands/init/tools/ideas/index.d.ts.map +1 -1
- package/dist/commands/init/tools/ideas/index.js +4 -1
- package/dist/commands/init/tools/index.d.ts +11 -2
- package/dist/commands/init/tools/index.d.ts.map +1 -1
- package/dist/commands/init/tools/index.js +459 -351
- package/dist/commands/init/tools/install-state.d.ts +2 -0
- package/dist/commands/init/tools/install-state.d.ts.map +1 -1
- package/dist/commands/init/tools/install-state.js +11 -0
- package/dist/commands/init/tools/project-management/agents-guidance.d.ts.map +1 -1
- package/dist/commands/init/tools/project-management/agents-guidance.js +3 -1
- package/dist/commands/init/tools/project-management/index.d.ts +1 -0
- package/dist/commands/init/tools/project-management/index.d.ts.map +1 -1
- package/dist/commands/init/tools/project-management/index.js +24 -55
- package/dist/commands/init/tools/project-management/install-project-management.d.ts +4 -0
- package/dist/commands/init/tools/project-management/install-project-management.d.ts.map +1 -1
- package/dist/commands/init/tools/project-management/install-project-management.js +4 -1
- package/dist/commands/init/tools/research/index.d.ts.map +1 -1
- package/dist/commands/init/tools/research/index.js +4 -1
- package/dist/commands/init/tools/shared/copy-helpers.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/copy-helpers.js +10 -0
- package/dist/commands/init/tools/shared/skill-manifest.d.ts +15 -15
- package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/skill-manifest.js +17 -122
- package/dist/commands/init/tools/utility/index.d.ts.map +1 -1
- package/dist/commands/init/tools/utility/index.js +4 -1
- package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
- package/dist/commands/init/tools/workflows/index.js +4 -1
- package/dist/commands/init/tools/workflows/install-workflows.d.ts.map +1 -1
- package/dist/commands/init/tools/workflows/install-workflows.js +2 -4
- package/dist/commands/pjm/adoption.d.ts +12 -0
- package/dist/commands/pjm/adoption.d.ts.map +1 -0
- package/dist/commands/pjm/adoption.js +47 -0
- package/dist/commands/pjm/doctor.d.ts +3 -2
- package/dist/commands/pjm/doctor.d.ts.map +1 -1
- package/dist/commands/pjm/doctor.js +28 -13
- package/dist/commands/pjm/index.d.ts +2 -0
- package/dist/commands/pjm/index.d.ts.map +1 -1
- package/dist/commands/pjm/index.js +11 -3
- package/dist/commands/pjm/init.d.ts +3 -0
- package/dist/commands/pjm/init.d.ts.map +1 -1
- package/dist/commands/pjm/init.js +37 -32
- package/dist/commands/pjm/migrate.d.ts +1 -0
- package/dist/commands/pjm/migrate.d.ts.map +1 -1
- package/dist/commands/pjm/migrate.js +1 -0
- package/dist/commands/pjm/template-source.d.ts +14 -0
- package/dist/commands/pjm/template-source.d.ts.map +1 -0
- package/dist/commands/pjm/template-source.js +56 -0
- package/dist/commands/remove/skills/remove-skills.d.ts.map +1 -1
- package/dist/commands/remove/skills/remove-skills.js +10 -19
- package/dist/commands/status/index.d.ts +5 -0
- package/dist/commands/status/index.d.ts.map +1 -1
- package/dist/commands/status/index.js +203 -2
- package/dist/commands/sync/index.d.ts.map +1 -1
- package/dist/commands/sync/index.js +40 -7
- package/dist/commands/sync/sync.types.d.ts +4 -0
- package/dist/commands/sync/sync.types.d.ts.map +1 -1
- package/dist/commands/tools/has/has-pack.d.ts +11 -2
- package/dist/commands/tools/has/has-pack.d.ts.map +1 -1
- package/dist/commands/tools/has/has-pack.js +33 -20
- package/dist/commands/tools/index.d.ts.map +1 -1
- package/dist/commands/tools/index.js +3 -1
- package/dist/commands/tools/info/info-tool.d.ts +3 -0
- package/dist/commands/tools/info/info-tool.d.ts.map +1 -1
- package/dist/commands/tools/info/info-tool.js +29 -4
- package/dist/commands/tools/list/list-tools.d.ts +3 -0
- package/dist/commands/tools/list/list-tools.d.ts.map +1 -1
- package/dist/commands/tools/list/list-tools.js +31 -4
- package/dist/commands/tools/migrate/index.d.ts +26 -0
- package/dist/commands/tools/migrate/index.d.ts.map +1 -0
- package/dist/commands/tools/migrate/index.js +312 -0
- package/dist/commands/tools/migrate/migrate-pack.d.ts +81 -0
- package/dist/commands/tools/migrate/migrate-pack.d.ts.map +1 -0
- package/dist/commands/tools/migrate/migrate-pack.js +324 -0
- package/dist/commands/tools/outdated/outdated-tools.d.ts +11 -0
- package/dist/commands/tools/outdated/outdated-tools.d.ts.map +1 -1
- package/dist/commands/tools/outdated/outdated-tools.js +33 -5
- package/dist/commands/tools/remove/index.d.ts.map +1 -1
- package/dist/commands/tools/remove/index.js +73 -20
- package/dist/commands/tools/remove/remove-tools.d.ts +28 -0
- package/dist/commands/tools/remove/remove-tools.d.ts.map +1 -1
- package/dist/commands/tools/remove/remove-tools.js +156 -26
- package/dist/commands/tools/shared/apply-pack-reconcile.d.ts +41 -0
- package/dist/commands/tools/shared/apply-pack-reconcile.d.ts.map +1 -0
- package/dist/commands/tools/shared/apply-pack-reconcile.js +126 -0
- package/dist/commands/tools/shared/auto-sync.d.ts +5 -2
- package/dist/commands/tools/shared/auto-sync.d.ts.map +1 -1
- package/dist/commands/tools/shared/auto-sync.js +1 -0
- package/dist/commands/tools/shared/content-digest.d.ts +3 -0
- package/dist/commands/tools/shared/content-digest.d.ts.map +1 -0
- package/dist/commands/tools/shared/content-digest.js +57 -0
- package/dist/commands/tools/shared/format-pack-inventory.d.ts +3 -0
- package/dist/commands/tools/shared/format-pack-inventory.d.ts.map +1 -0
- package/dist/commands/tools/shared/format-pack-inventory.js +21 -0
- package/dist/commands/tools/shared/install-sync-context.d.ts.map +1 -1
- package/dist/commands/tools/shared/install-sync-context.js +2 -25
- package/dist/commands/tools/shared/pack-inventory.d.ts +46 -0
- package/dist/commands/tools/shared/pack-inventory.d.ts.map +1 -0
- package/dist/commands/tools/shared/pack-inventory.js +207 -0
- package/dist/commands/tools/shared/pack-lifecycle.d.ts +34 -0
- package/dist/commands/tools/shared/pack-lifecycle.d.ts.map +1 -0
- package/dist/commands/tools/shared/pack-lifecycle.js +67 -0
- package/dist/commands/tools/shared/pack-manifest.d.ts +11 -0
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -0
- package/dist/commands/tools/shared/pack-manifest.js +384 -0
- package/dist/commands/tools/shared/pack-paths.d.ts +21 -0
- package/dist/commands/tools/shared/pack-paths.d.ts.map +1 -0
- package/dist/commands/tools/shared/pack-paths.js +35 -0
- package/dist/commands/tools/shared/pack-reconcile.d.ts +64 -0
- package/dist/commands/tools/shared/pack-reconcile.d.ts.map +1 -0
- package/dist/commands/tools/shared/pack-reconcile.js +158 -0
- package/dist/commands/tools/shared/project-tools-config.d.ts.map +1 -1
- package/dist/commands/tools/shared/project-tools-config.js +12 -38
- package/dist/commands/tools/shared/scan-tools.js +2 -2
- package/dist/commands/tools/shared/scoped-pack-intent.d.ts +34 -0
- package/dist/commands/tools/shared/scoped-pack-intent.d.ts.map +1 -0
- package/dist/commands/tools/shared/scoped-pack-intent.js +116 -0
- package/dist/commands/tools/shared/types.d.ts +22 -0
- package/dist/commands/tools/shared/types.d.ts.map +1 -1
- package/dist/commands/tools/update/index.d.ts.map +1 -1
- package/dist/commands/tools/update/index.js +30 -5
- package/dist/commands/tools/update/update-tools.d.ts +9 -1
- package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
- package/dist/commands/tools/update/update-tools.js +176 -64
- package/dist/config/oat-config.d.ts +6 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +49 -20
- package/dist/fs/paths.d.ts +12 -0
- package/dist/fs/paths.d.ts.map +1 -1
- package/dist/fs/paths.js +87 -1
- 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 =
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
55
|
-
|
|
28
|
+
if (!changed) {
|
|
29
|
+
return 'unchanged';
|
|
56
30
|
}
|
|
57
|
-
await dependencies.writeOatConfig(options.repoRoot,
|
|
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
|
|
100
|
-
|
|
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;
|
|
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 (
|
|
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
|
-
|
|
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 (
|
|
140
|
-
const
|
|
141
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"update-tools.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/update-tools.ts"],"names":[],"mappings":"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"}
|