@open-agent-toolkit/cli 0.2.41 → 0.2.45
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/agents/oat-phase-implementer.md +11 -1
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/configuration.md +11 -1
- package/assets/docs/quickstart.md +9 -0
- package/assets/docs/reference/cli-reference.md +56 -1
- package/assets/docs/reference/file-locations.md +18 -1
- package/assets/docs/reference/oat-directory-structure.md +20 -4
- package/assets/docs/workflows/projects/artifacts.md +27 -1
- package/assets/docs/workflows/projects/implementation-execution.md +22 -0
- package/assets/docs/workflows/projects/index.md +6 -0
- package/assets/docs/workflows/projects/lifecycle.md +19 -5
- package/assets/docs/workflows/projects/picking-up-projects.md +75 -0
- package/assets/docs/workflows/projects/pr-flow.md +22 -1
- package/assets/docs/workflows/projects/reviewing-oat-prs.md +60 -0
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-brainstorm/SKILL.md +135 -32
- package/assets/skills/oat-brainstorm/references/destinations.md +9 -6
- package/assets/skills/oat-cursor-cloud-projects/SKILL.md +11 -1
- package/assets/skills/oat-doctor/SKILL.md +8 -1
- package/assets/skills/oat-project-autonomous/SKILL.md +45 -1
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +8 -8
- package/assets/skills/oat-project-capture/SKILL.md +29 -9
- package/assets/skills/oat-project-complete/SKILL.md +610 -38
- package/assets/skills/oat-project-complete/scripts/parse-completion-retry-fields.mjs +265 -0
- package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +764 -0
- package/assets/skills/oat-project-complete/scripts/resolve-completion-retry.mjs +134 -0
- package/assets/skills/oat-project-complete/scripts/validate-nonarchive-lifecycle-receipt.mjs +160 -0
- package/assets/skills/oat-project-design/SKILL.md +33 -9
- package/assets/skills/oat-project-discover/SKILL.md +16 -3
- package/assets/skills/oat-project-document/SKILL.md +10 -4
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +8 -8
- package/assets/skills/oat-project-implement/SKILL.md +14 -3
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +18 -6
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +8 -8
- package/assets/skills/oat-project-implement/references/phase-execution.md +9 -3
- package/assets/skills/oat-project-implement/references/plan-and-resume.md +3 -0
- package/assets/skills/oat-project-import-plan/SKILL.md +15 -9
- package/assets/skills/oat-project-new/SKILL.md +7 -5
- package/assets/skills/oat-project-next/SKILL.md +32 -10
- package/assets/skills/oat-project-plan/SKILL.md +18 -3
- package/assets/skills/oat-project-pr-final/SKILL.md +23 -2
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +8 -8
- package/assets/skills/oat-project-pr-progress/SKILL.md +23 -2
- package/assets/skills/oat-project-progress/SKILL.md +23 -9
- package/assets/skills/oat-project-promote-spec-driven/SKILL.md +20 -2
- package/assets/skills/oat-project-quick-start/SKILL.md +48 -18
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +8 -8
- package/assets/skills/oat-project-reconcile/SKILL.md +14 -10
- package/assets/skills/oat-project-retro/SKILL.md +3 -3
- package/assets/skills/oat-project-retro/references/apply-procedure.md +102 -6
- package/assets/skills/oat-project-retro-file/SKILL.md +57 -6
- package/assets/skills/oat-project-review-provide/SKILL.md +45 -4
- package/assets/skills/oat-project-review-receive/SKILL.md +16 -7
- package/assets/skills/oat-project-review-receive-remote/SKILL.md +9 -3
- package/assets/skills/oat-project-revise/SKILL.md +12 -3
- package/assets/skills/oat-project-spec/SKILL.md +16 -3
- package/assets/skills/oat-project-summary/SKILL.md +113 -13
- package/assets/skills/oat-wave-execute/SKILL.md +34 -2
- package/assets/skills/oat-worktree-bootstrap/SKILL.md +13 -1
- package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +13 -1
- package/dist/commands/config/index.d.ts +1 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +30 -2
- package/dist/commands/doctor/index.d.ts +2 -0
- package/dist/commands/doctor/index.d.ts.map +1 -1
- package/dist/commands/doctor/index.js +27 -3
- package/dist/commands/doctor/synced-projects.d.ts +12 -0
- package/dist/commands/doctor/synced-projects.d.ts.map +1 -0
- package/dist/commands/doctor/synced-projects.js +208 -0
- package/dist/commands/init/gitattributes.d.ts +4 -0
- package/dist/commands/init/gitattributes.d.ts.map +1 -0
- package/dist/commands/init/gitattributes.js +12 -0
- package/dist/commands/init/gitignore.d.ts +8 -1
- package/dist/commands/init/gitignore.d.ts.map +1 -1
- package/dist/commands/init/gitignore.js +146 -41
- package/dist/commands/init/index.d.ts +2 -0
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +3 -0
- package/dist/commands/init/managed-block.d.ts +10 -0
- package/dist/commands/init/managed-block.d.ts.map +1 -0
- package/dist/commands/init/managed-block.js +40 -0
- package/dist/commands/init/tools/workflows/install-workflows.js +1 -1
- package/dist/commands/local/index.d.ts.map +1 -1
- package/dist/commands/local/index.js +5 -1
- package/dist/commands/local/sync.d.ts +4 -0
- package/dist/commands/local/sync.d.ts.map +1 -1
- package/dist/commands/local/sync.js +123 -2
- package/dist/commands/pjm/adoption.d.ts +2 -0
- package/dist/commands/pjm/adoption.d.ts.map +1 -1
- package/dist/commands/pjm/adoption.js +1 -1
- package/dist/commands/project/archive/archive-utils.d.ts +24 -0
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +349 -22
- package/dist/commands/project/archive/index.d.ts.map +1 -1
- package/dist/commands/project/archive/index.js +1 -0
- package/dist/commands/project/archive/push-runner.d.ts +5 -1
- package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
- package/dist/commands/project/archive/push-runner.js +33 -4
- package/dist/commands/project/complete-state/index.d.ts.map +1 -1
- package/dist/commands/project/complete-state/index.js +3 -1
- package/dist/commands/project/index.d.ts.map +1 -1
- package/dist/commands/project/index.js +12 -0
- package/dist/commands/project/links/compute.d.ts +9 -0
- package/dist/commands/project/links/compute.d.ts.map +1 -0
- package/dist/commands/project/links/compute.js +27 -0
- package/dist/commands/project/links/index.d.ts +17 -0
- package/dist/commands/project/links/index.d.ts.map +1 -0
- package/dist/commands/project/links/index.js +72 -0
- package/dist/commands/project/links/refresh.d.ts +26 -0
- package/dist/commands/project/links/refresh.d.ts.map +1 -0
- package/dist/commands/project/links/refresh.js +92 -0
- package/dist/commands/project/links/render.d.ts +24 -0
- package/dist/commands/project/links/render.d.ts.map +1 -0
- package/dist/commands/project/links/render.js +68 -0
- package/dist/commands/project/list.d.ts +5 -0
- package/dist/commands/project/list.d.ts.map +1 -1
- package/dist/commands/project/list.js +182 -9
- package/dist/commands/project/migrate/index.d.ts +22 -0
- package/dist/commands/project/migrate/index.d.ts.map +1 -0
- package/dist/commands/project/migrate/index.js +79 -0
- package/dist/commands/project/new/index.d.ts +2 -0
- package/dist/commands/project/new/index.d.ts.map +1 -1
- package/dist/commands/project/new/index.js +14 -2
- package/dist/commands/project/new/scaffold.d.ts +22 -1
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +287 -69
- package/dist/commands/project/open/index.d.ts +16 -0
- package/dist/commands/project/open/index.d.ts.map +1 -1
- package/dist/commands/project/open/index.js +151 -19
- package/dist/commands/project/pause/index.d.ts +8 -0
- package/dist/commands/project/pause/index.d.ts.map +1 -1
- package/dist/commands/project/pause/index.js +129 -19
- package/dist/commands/project/prune/index.d.ts +21 -0
- package/dist/commands/project/prune/index.d.ts.map +1 -0
- package/dist/commands/project/prune/index.js +95 -0
- package/dist/commands/project/pull/index.d.ts +28 -0
- package/dist/commands/project/pull/index.d.ts.map +1 -0
- package/dist/commands/project/pull/index.js +157 -0
- package/dist/commands/project/push/index.d.ts +22 -0
- package/dist/commands/project/push/index.d.ts.map +1 -0
- package/dist/commands/project/push/index.js +100 -0
- package/dist/commands/project/scope/index.d.ts +17 -0
- package/dist/commands/project/scope/index.d.ts.map +1 -0
- package/dist/commands/project/scope/index.js +107 -0
- package/dist/commands/project/split/run.d.ts +4 -0
- package/dist/commands/project/split/run.d.ts.map +1 -1
- package/dist/commands/project/split/run.js +48 -10
- package/dist/commands/project/sync/git.d.ts +18 -0
- package/dist/commands/project/sync/git.d.ts.map +1 -0
- package/dist/commands/project/sync/git.js +60 -0
- package/dist/commands/project/sync/record.d.ts +22 -0
- package/dist/commands/project/sync/record.d.ts.map +1 -0
- package/dist/commands/project/sync/record.js +133 -0
- package/dist/commands/project/sync/ref-sync.d.ts +120 -0
- package/dist/commands/project/sync/ref-sync.d.ts.map +1 -0
- package/dist/commands/project/sync/ref-sync.js +962 -0
- package/dist/commands/project/sync/resolve-target.d.ts +27 -0
- package/dist/commands/project/sync/resolve-target.d.ts.map +1 -0
- package/dist/commands/project/sync/resolve-target.js +159 -0
- package/dist/commands/shared/oat-paths.d.ts +4 -1
- package/dist/commands/shared/oat-paths.d.ts.map +1 -1
- package/dist/commands/shared/oat-paths.js +2 -2
- package/dist/commands/shared/project-scope.d.ts +23 -0
- package/dist/commands/shared/project-scope.d.ts.map +1 -0
- package/dist/commands/shared/project-scope.js +106 -0
- package/dist/commands/tools/migrate/index.js +1 -1
- package/dist/commands/tools/shared/pack-inventory.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-inventory.js +11 -0
- package/dist/commands/tools/shared/pack-lifecycle.js +1 -1
- package/dist/commands/tools/shared/pack-reconcile.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-reconcile.js +4 -1
- package/dist/commands/tools/update/index.d.ts.map +1 -1
- package/dist/commands/tools/update/index.js +20 -10
- package/dist/commands/tools/update/update-tools.d.ts +2 -0
- package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
- package/dist/config/oat-config.d.ts +6 -3
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +41 -7
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +2 -1
- package/dist/fs/io.d.ts +2 -1
- package/dist/fs/io.d.ts.map +1 -1
- package/dist/fs/io.js +5 -2
- package/dist/projects/split/finalize.d.ts.map +1 -1
- package/dist/projects/split/finalize.js +55 -2
- package/dist/projects/split/resume.d.ts +3 -0
- package/dist/projects/split/resume.d.ts.map +1 -1
- package/dist/projects/split/resume.js +34 -7
- package/dist/projects/split/seed-children.d.ts.map +1 -1
- package/dist/projects/split/seed-children.js +6 -0
- package/dist/projects/split/write-parent.d.ts +7 -0
- package/dist/projects/split/write-parent.d.ts.map +1 -1
- package/dist/projects/split/write-parent.js +7 -4
- package/dist/release/public-package-contract.d.ts.map +1 -1
- package/dist/release/public-package-contract.js +1 -0
- package/dist/validation/skills.d.ts.map +1 -1
- package/dist/validation/skills.js +434 -0
- package/package.json +4 -4
- package/dist/__tests__/skills/split-flow-fixtures.d.ts +0 -50
- package/dist/__tests__/skills/split-flow-fixtures.d.ts.map +0 -1
- package/dist/__tests__/skills/split-flow-fixtures.js +0 -161
- package/dist/commands/__tests__/helpers.d.ts +0 -12
- package/dist/commands/__tests__/helpers.d.ts.map +0 -1
- package/dist/commands/__tests__/helpers.js +0 -36
|
@@ -23,6 +23,7 @@ interface DoctorDependencies {
|
|
|
23
23
|
readFile: (path: string) => Promise<string>;
|
|
24
24
|
resolveAssetsRoot: () => Promise<string>;
|
|
25
25
|
readOatConfig: (repoRoot: string) => Promise<OatConfig>;
|
|
26
|
+
readOatConfigForDefaultScopeRepair: (repoRoot: string) => Promise<OatConfig>;
|
|
26
27
|
readOatLocalConfig: (repoRoot: string) => Promise<OatLocalConfig>;
|
|
27
28
|
readUserConfig: (userConfigDir: string) => Promise<UserConfig>;
|
|
28
29
|
validateMatrixCell: (provider: string, value: string, options: ValidateMatrixCellOptions) => Promise<MatrixCellAvailabilityResponse>;
|
|
@@ -35,6 +36,7 @@ interface DoctorDependencies {
|
|
|
35
36
|
inventoryPack: (input: InventoryPackInput) => Promise<PackInventory>;
|
|
36
37
|
checkSkillVersions: (scopeRoot: string, assetsRoot: string, pathExists: (path: string) => Promise<boolean>) => Promise<SkillVersionReport>;
|
|
37
38
|
checkStaleInvocations: (repoRoot: string) => Promise<DoctorCheck>;
|
|
39
|
+
checkSyncedProjects: (repoRoot: string) => Promise<DoctorCheck[]>;
|
|
38
40
|
}
|
|
39
41
|
interface OutdatedSkillVersion {
|
|
40
42
|
skill: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,uCAAuC,CAAC;AAa/C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ import { hasScopedPackPlacementEvidence, inventoryPack, } from '../tools/shared/
|
|
|
12
12
|
import { PACK_NAMES } from '../tools/shared/pack-manifest.js';
|
|
13
13
|
import { formatPackPaths, updatePackRecovery, } from '../tools/shared/pack-paths.js';
|
|
14
14
|
import { walkDispatchMatrix, } from '../../config/dispatch-matrix.js';
|
|
15
|
-
import { readOatConfig, readOatLocalConfig, readUserConfig, } from '../../config/oat-config.js';
|
|
15
|
+
import { readOatConfig, readOatConfigForDefaultScopeRepair, readOatLocalConfig, readUserConfig, } from '../../config/oat-config.js';
|
|
16
16
|
import { resolveAssetsRoot } from '../../fs/assets.js';
|
|
17
17
|
import { resolveProjectRoot, resolveScopeRoot } from '../../fs/paths.js';
|
|
18
18
|
import TOML from '@iarna/toml';
|
|
@@ -29,6 +29,7 @@ import { createDispatchValidationPassContext, validateDispatchMatrixRefs, } from
|
|
|
29
29
|
import { formatDoctorResults } from '../../ui/output.js';
|
|
30
30
|
import { Command } from 'commander';
|
|
31
31
|
import { checkStaleInvocations } from './stale-invocations.js';
|
|
32
|
+
import { checkSyncedProjects } from './synced-projects.js';
|
|
32
33
|
async function pathExistsDefault(path) {
|
|
33
34
|
try {
|
|
34
35
|
await access(path);
|
|
@@ -139,6 +140,7 @@ function createDependencies() {
|
|
|
139
140
|
readFile: async (path) => readFile(path, 'utf8'),
|
|
140
141
|
resolveAssetsRoot,
|
|
141
142
|
readOatConfig,
|
|
143
|
+
readOatConfigForDefaultScopeRepair,
|
|
142
144
|
readOatLocalConfig,
|
|
143
145
|
readUserConfig,
|
|
144
146
|
validateMatrixCell,
|
|
@@ -153,6 +155,7 @@ function createDependencies() {
|
|
|
153
155
|
// provided pathExists dependency from runChecksForScope when available.
|
|
154
156
|
checkSkillVersions: (scopeRoot, assetsRoot, pathExists = pathExistsDefault) => checkSkillVersionsDefault(scopeRoot, assetsRoot, pathExists),
|
|
155
157
|
checkStaleInvocations,
|
|
158
|
+
checkSyncedProjects,
|
|
156
159
|
};
|
|
157
160
|
}
|
|
158
161
|
async function createCursorMaterializedModelsCheck(scopeRoot, dependencies) {
|
|
@@ -763,6 +766,7 @@ async function runChecksForScope(scope, scopeRoot, userConfigDir, dependencies)
|
|
|
763
766
|
checks.push(...(await runCodexChecksForScope(scope, scopeRoot, dirname(userConfigDir), dependencies)));
|
|
764
767
|
if (scope === 'project') {
|
|
765
768
|
checks.push(await dependencies.checkStaleInvocations(scopeRoot));
|
|
769
|
+
checks.push(...(await dependencies.checkSyncedProjects(scopeRoot)));
|
|
766
770
|
try {
|
|
767
771
|
const assetsRoot = await dependencies.resolveAssetsRoot();
|
|
768
772
|
const skillVersions = await dependencies.checkSkillVersions(scopeRoot, assetsRoot, dependencies.pathExists);
|
|
@@ -812,11 +816,30 @@ async function runChecksForScope(scope, scopeRoot, userConfigDir, dependencies)
|
|
|
812
816
|
});
|
|
813
817
|
}
|
|
814
818
|
const repoReferenceRoot = join(scopeRoot, '.oat', 'repo');
|
|
815
|
-
const [userConfig,
|
|
819
|
+
const [userConfig, configResult, localConfig] = await Promise.all([
|
|
816
820
|
dependencies.readUserConfig(userConfigDir),
|
|
817
|
-
dependencies.readOatConfig(scopeRoot),
|
|
821
|
+
dependencies.readOatConfig(scopeRoot).then((config) => ({ config }), async (error) => {
|
|
822
|
+
if (!(error instanceof Error) ||
|
|
823
|
+
!error.message.startsWith('Invalid projects.defaultScope in ')) {
|
|
824
|
+
throw error;
|
|
825
|
+
}
|
|
826
|
+
return {
|
|
827
|
+
config: await dependencies.readOatConfigForDefaultScopeRepair(scopeRoot),
|
|
828
|
+
defaultScopeError: error.message,
|
|
829
|
+
};
|
|
830
|
+
}),
|
|
818
831
|
dependencies.readOatLocalConfig(scopeRoot),
|
|
819
832
|
]);
|
|
833
|
+
if ('defaultScopeError' in configResult) {
|
|
834
|
+
checks.push({
|
|
835
|
+
name: 'project:projects_default_scope',
|
|
836
|
+
description: 'Project creation default scope',
|
|
837
|
+
status: 'fail',
|
|
838
|
+
message: configResult.defaultScopeError,
|
|
839
|
+
fix: 'Run `oat config set projects.defaultScope <shared|local|synced>`.',
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
const config = configResult.config;
|
|
820
843
|
checks.push(await createDispatchMatrixDoctorCheck(scopeRoot, [
|
|
821
844
|
{ source: 'user-config', config: userConfig },
|
|
822
845
|
{ source: 'repo-config', config },
|
|
@@ -834,6 +857,7 @@ async function runChecksForScope(scope, scopeRoot, userConfigDir, dependencies)
|
|
|
834
857
|
const adoption = await dependencies.resolvePjmAdoption({
|
|
835
858
|
projectRoot: scopeRoot,
|
|
836
859
|
repoRoot: repoReferenceRoot,
|
|
860
|
+
config,
|
|
837
861
|
});
|
|
838
862
|
if (adoption.state !== 'none') {
|
|
839
863
|
checks.push(...(await dependencies.runPjmDoctorChecks(repoReferenceRoot, {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type GitRunner } from '../project/sync/git.js';
|
|
2
|
+
import { resolveProjectsRoot } from '../shared/oat-paths.js';
|
|
3
|
+
import type { DoctorCheck } from '../../ui/output.js';
|
|
4
|
+
interface SyncedDoctorDependencies {
|
|
5
|
+
git: GitRunner;
|
|
6
|
+
resolveProjectsRoot: typeof resolveProjectsRoot;
|
|
7
|
+
env: NodeJS.ProcessEnv;
|
|
8
|
+
}
|
|
9
|
+
export declare function syncedRecordSlug(recordPath: string): string;
|
|
10
|
+
export declare function checkSyncedProjects(repoRoot: string, overrides?: Partial<SyncedDoctorDependencies>): Promise<DoctorCheck[]>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=synced-projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synced-projects.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/synced-projects.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAK9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,UAAU,wBAAwB;IAChC,GAAG,EAAE,SAAS,CAAC;IACf,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAsBD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAqDD,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAChD,OAAO,CAAC,WAAW,EAAE,CAAC,CAsMxB"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { basename, join, relative, resolve, sep } from 'node:path';
|
|
3
|
+
import { defaultGitRunner } from '../project/sync/git.js';
|
|
4
|
+
import { readSyncedRecord, } from '../project/sync/record.js';
|
|
5
|
+
import { resolveProjectsRoot } from '../shared/oat-paths.js';
|
|
6
|
+
import { resolveScopeRoot } from '../shared/project-scope.js';
|
|
7
|
+
import { readOatConfigForDefaultScopeRepair } from '../../config/oat-config.js';
|
|
8
|
+
const DEFAULT_DEPENDENCIES = {
|
|
9
|
+
git: defaultGitRunner,
|
|
10
|
+
resolveProjectsRoot: (repoRoot, env) => resolveProjectsRoot(repoRoot, env, readOatConfigForDefaultScopeRepair),
|
|
11
|
+
env: process.env,
|
|
12
|
+
};
|
|
13
|
+
async function pathExists(path) {
|
|
14
|
+
try {
|
|
15
|
+
await stat(path);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function repoRelative(repoRoot, path) {
|
|
23
|
+
return relative(resolve(repoRoot), resolve(path)).split(sep).join('/');
|
|
24
|
+
}
|
|
25
|
+
export function syncedRecordSlug(recordPath) {
|
|
26
|
+
return basename(recordPath.replaceAll('\\', sep), '.json');
|
|
27
|
+
}
|
|
28
|
+
function check(slug, kind, status, message, fix) {
|
|
29
|
+
return {
|
|
30
|
+
name: `project:synced_${slug}_${kind}`,
|
|
31
|
+
description: `Synced project ${slug}: ${kind.replaceAll('_', ' ')}`,
|
|
32
|
+
status,
|
|
33
|
+
message,
|
|
34
|
+
...(fix ? { fix } : {}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function recordEntries(syncedRoot) {
|
|
38
|
+
try {
|
|
39
|
+
return (await readdir(syncedRoot, { withFileTypes: true }))
|
|
40
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith('.json'))
|
|
41
|
+
.map((entry) => join(syncedRoot, entry.name))
|
|
42
|
+
.sort();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function editorHint(repoRoot) {
|
|
49
|
+
for (const editorDirectory of ['.vscode', '.cursor']) {
|
|
50
|
+
const directory = join(repoRoot, editorDirectory);
|
|
51
|
+
if (!(await pathExists(directory)))
|
|
52
|
+
continue;
|
|
53
|
+
let settings = {};
|
|
54
|
+
try {
|
|
55
|
+
settings = JSON.parse(await readFile(join(directory, 'settings.json'), 'utf8'));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Missing or non-JSON settings still receive the non-blocking hint.
|
|
59
|
+
}
|
|
60
|
+
if (!('git.scanRepositories' in settings)) {
|
|
61
|
+
return {
|
|
62
|
+
name: 'project:synced_editor_hint',
|
|
63
|
+
description: 'Nested synced-project repository discovery',
|
|
64
|
+
status: 'pass',
|
|
65
|
+
message: `${editorDirectory} can set git.scanRepositories to include nested synced project checkouts.`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
export async function checkSyncedProjects(repoRoot, overrides = {}) {
|
|
72
|
+
const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
|
|
73
|
+
const projectsRoot = await dependencies.resolveProjectsRoot(repoRoot, dependencies.env);
|
|
74
|
+
const syncedRoot = resolveScopeRoot(repoRoot, projectsRoot, 'synced');
|
|
75
|
+
const syncedRelative = repoRelative(repoRoot, syncedRoot);
|
|
76
|
+
const checks = [];
|
|
77
|
+
const tracked = await dependencies.git.run(['ls-files', '--', syncedRelative], { cwd: repoRoot, allowFailure: true });
|
|
78
|
+
const missingRepository = tracked.code !== 0 &&
|
|
79
|
+
/not a git repository/i.test(`${tracked.stderr}\n${tracked.stdout}`);
|
|
80
|
+
const trackedCheckoutArtifacts = tracked.stdout
|
|
81
|
+
.split('\n')
|
|
82
|
+
.map((path) => path.trim())
|
|
83
|
+
.filter((path) => {
|
|
84
|
+
const nestedPath = path.slice(`${syncedRelative}/`.length);
|
|
85
|
+
return path.startsWith(`${syncedRelative}/`) && nestedPath.includes('/');
|
|
86
|
+
});
|
|
87
|
+
if (tracked.code !== 0 && !missingRepository) {
|
|
88
|
+
checks.push({
|
|
89
|
+
name: 'project:synced_tracked_artifacts',
|
|
90
|
+
description: 'Synced artifacts excluded from the parent branch',
|
|
91
|
+
status: 'fail',
|
|
92
|
+
message: `Unable to inspect tracked synced artifacts: ${tracked.stderr || tracked.stdout || `git ls-files exited ${tracked.code}`}.`,
|
|
93
|
+
fix: 'Resolve the Git error, then rerun `oat doctor --scope project`.',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
else if (tracked.code === 0 && trackedCheckoutArtifacts.length > 0) {
|
|
97
|
+
checks.push({
|
|
98
|
+
name: 'project:synced_tracked_artifacts',
|
|
99
|
+
description: 'Synced artifacts excluded from the parent branch',
|
|
100
|
+
status: 'fail',
|
|
101
|
+
message: `Tracked synced artifact files: ${trackedCheckoutArtifacts.join(', ')}`,
|
|
102
|
+
fix: 'Run `oat project migrate` or remove them with `git rm --cached`.',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
const entries = (await pathExists(syncedRoot))
|
|
106
|
+
? await recordEntries(syncedRoot)
|
|
107
|
+
: [];
|
|
108
|
+
const ignoreProbeSlug = entries[0]
|
|
109
|
+
? syncedRecordSlug(entries[0])
|
|
110
|
+
: '__probe__';
|
|
111
|
+
const ignored = await dependencies.git.run([
|
|
112
|
+
'check-ignore',
|
|
113
|
+
'--quiet',
|
|
114
|
+
'--no-index',
|
|
115
|
+
`${syncedRelative}/${ignoreProbeSlug}/`,
|
|
116
|
+
], { cwd: repoRoot, allowFailure: true });
|
|
117
|
+
if (ignored.code === 1) {
|
|
118
|
+
checks.push({
|
|
119
|
+
name: 'project:synced_gitignore',
|
|
120
|
+
description: 'Managed synced-project gitignore rule',
|
|
121
|
+
status: 'warn',
|
|
122
|
+
message: 'The managed gitignore block does not ignore synced project directories.',
|
|
123
|
+
fix: 'Run `oat tools update`.',
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
const hint = await editorHint(repoRoot);
|
|
127
|
+
if (hint)
|
|
128
|
+
checks.push(hint);
|
|
129
|
+
if (entries.length === 0 && checks.length === 0) {
|
|
130
|
+
return [
|
|
131
|
+
{
|
|
132
|
+
name: 'project:synced_projects',
|
|
133
|
+
description: 'Synced project health',
|
|
134
|
+
status: 'pass',
|
|
135
|
+
message: 'No synced projects found.',
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
}
|
|
139
|
+
const records = [];
|
|
140
|
+
for (const entry of entries) {
|
|
141
|
+
const slug = syncedRecordSlug(entry);
|
|
142
|
+
try {
|
|
143
|
+
const record = await readSyncedRecord(entry);
|
|
144
|
+
if (record)
|
|
145
|
+
records.push(record);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
checks.push(check(slug, 'record_schema', 'fail', error instanceof Error ? error.message : String(error), 'Upgrade the OAT CLI before reading this synced project record.'));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
for (const record of records) {
|
|
152
|
+
const checkoutPath = join(syncedRoot, record.slug);
|
|
153
|
+
const checkoutExists = await pathExists(checkoutPath);
|
|
154
|
+
if (!checkoutExists) {
|
|
155
|
+
checks.push(check(record.slug, 'checkout', 'warn', `Synced project ${record.slug} checkout is absent.`, `Run \`oat project pull ${record.slug}\`.`));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const status = await dependencies.git.run(['status', '--porcelain'], {
|
|
159
|
+
cwd: checkoutPath,
|
|
160
|
+
allowFailure: true,
|
|
161
|
+
});
|
|
162
|
+
if (status.code === 0 && status.stdout.trim()) {
|
|
163
|
+
checks.push(check(record.slug, 'working_tree', 'warn', `Synced project ${record.slug} has uncommitted changes.`, `Run \`oat project push ${record.slug}\`.`));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const [local, remote] = await Promise.all([
|
|
167
|
+
dependencies.git.run(['show-ref', '--hash', record.ref], {
|
|
168
|
+
cwd: repoRoot,
|
|
169
|
+
allowFailure: true,
|
|
170
|
+
}),
|
|
171
|
+
dependencies.git.run(['ls-remote', record.remote, record.ref], {
|
|
172
|
+
cwd: repoRoot,
|
|
173
|
+
allowFailure: true,
|
|
174
|
+
}),
|
|
175
|
+
]);
|
|
176
|
+
const localQuerySucceeded = local.code === 0 || local.code === 1;
|
|
177
|
+
if (!localQuerySucceeded) {
|
|
178
|
+
checks.push(check(record.slug, 'local_ref', 'pass', `Local ref comparison skipped: ${local.stderr || local.stdout || `git show-ref exited ${local.code}`}.`));
|
|
179
|
+
}
|
|
180
|
+
if (remote.code !== 0) {
|
|
181
|
+
checks.push(check(record.slug, 'remote_ref', 'pass', `Remote comparison skipped: ${remote.stderr || remote.stdout || 'offline'}.`));
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
const remoteSha = remote.stdout.trim().split(/\s+/)[0] ?? '';
|
|
185
|
+
const localSha = local.code === 0 ? local.stdout.trim() : '';
|
|
186
|
+
if (localQuerySucceeded &&
|
|
187
|
+
(localSha || remoteSha) &&
|
|
188
|
+
localSha !== remoteSha) {
|
|
189
|
+
const relation = localSha
|
|
190
|
+
? remoteSha
|
|
191
|
+
? 'differs from origin'
|
|
192
|
+
: 'exists locally but is absent from origin'
|
|
193
|
+
: 'is absent locally but exists on origin';
|
|
194
|
+
checks.push(check(record.slug, 'ref_sync', 'warn', `Local ref for ${record.slug} ${relation}.`, `Run \`oat project pull ${record.slug}\` or \`oat project push ${record.slug}\`.`));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return checks.length > 0
|
|
199
|
+
? checks
|
|
200
|
+
: [
|
|
201
|
+
{
|
|
202
|
+
name: 'project:synced_projects',
|
|
203
|
+
description: 'Synced project health',
|
|
204
|
+
status: 'pass',
|
|
205
|
+
message: `Checked ${records.length} synced project(s).`,
|
|
206
|
+
},
|
|
207
|
+
];
|
|
208
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ApplyManagedBlockResult } from './managed-block.js';
|
|
2
|
+
export type ApplyOatCoreGitattributesResult = ApplyManagedBlockResult;
|
|
3
|
+
export declare function applyOatCoreGitattributes(repoRoot: string): Promise<ApplyOatCoreGitattributesResult>;
|
|
4
|
+
//# sourceMappingURL=gitattributes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitattributes.d.ts","sourceRoot":"","sources":["../../../src/commands/init/gitattributes.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,iBAAiB,CAAC;AAMzB,MAAM,MAAM,+BAA+B,GAAG,uBAAuB,CAAC;AAEtE,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,+BAA+B,CAAC,CAM1C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { applyManagedBlock, } from './managed-block.js';
|
|
3
|
+
const GITATTRIBUTES_ENTRIES = [
|
|
4
|
+
'.oat/projects/shared/** linguist-generated=true',
|
|
5
|
+
];
|
|
6
|
+
export async function applyOatCoreGitattributes(repoRoot) {
|
|
7
|
+
return applyManagedBlock(join(repoRoot, '.gitattributes'), {
|
|
8
|
+
start: '# OAT core',
|
|
9
|
+
end: '# END OAT core',
|
|
10
|
+
entries: GITATTRIBUTES_ENTRIES,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
import type { GitRunner } from '../project/sync/git.js';
|
|
1
2
|
export interface ApplyOatCoreResult {
|
|
2
3
|
action: 'created' | 'updated' | 'no-change';
|
|
3
4
|
entries: string[];
|
|
4
5
|
stateDashboardIndexAction: 'untracked' | 'not-tracked' | 'not-git-repo';
|
|
5
6
|
}
|
|
6
|
-
export
|
|
7
|
+
export interface EnsureScopedRootGitignoreResult {
|
|
8
|
+
before: string | null | undefined;
|
|
9
|
+
changed: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function isSyncedRuleApplied(repoRoot: string): Promise<boolean>;
|
|
12
|
+
export declare function applyOatCoreGitignore(repoRoot: string, additionalEntries?: readonly string[]): Promise<ApplyOatCoreResult>;
|
|
13
|
+
export declare function ensureScopedRootGitignore(repoRoot: string, scopeRoot: string, scope: 'local' | 'synced', git: GitRunner, dirtyMessage?: string | null): Promise<EnsureScopedRootGitignoreResult>;
|
|
7
14
|
/**
|
|
8
15
|
* Removes the generated repo dashboard from the git index once the OAT core
|
|
9
16
|
* ignore rule is present, while leaving the working-tree file intact.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../../src/commands/init/gitignore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../../src/commands/init/gitignore.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAkC5D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yBAAyB,EAAE,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;CACzE;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;CAClB;AA0BD,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB5E;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,GAAE,SAAS,MAAM,EAAO,GACxC,OAAO,CAAC,kBAAkB,CAAC,CAoB7B;AAED,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GAAG,QAAQ,EACzB,GAAG,EAAE,SAAS,EACd,YAAY,GACR,MAAM,GACN,IAAqJ,GACxJ,OAAO,CAAC,+BAA+B,CAAC,CAyG1C;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,CAAC,CAyB1D"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { execFile } from 'node:child_process';
|
|
2
|
-
import { readFile, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { join } from 'node:path';
|
|
2
|
+
import { readFile, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, isAbsolute, join, relative } from 'node:path';
|
|
4
4
|
import { promisify } from 'node:util';
|
|
5
|
-
import {
|
|
5
|
+
import { canonicalizePath } from '../shared/project-scope.js';
|
|
6
|
+
import { CliError } from '../../errors/cli-error.js';
|
|
7
|
+
import { applyManagedBlock } from './managed-block.js';
|
|
6
8
|
const SECTION_START = '# OAT core';
|
|
7
9
|
const SECTION_END = '# END OAT core';
|
|
8
10
|
const OAT_STATE_DASHBOARD_PATH = '.oat/state.md';
|
|
@@ -12,53 +14,156 @@ const CORE_ENTRIES = [
|
|
|
12
14
|
'.oat/state.md',
|
|
13
15
|
'.oat/projects/local/**',
|
|
14
16
|
'.oat/projects/archived/**',
|
|
17
|
+
'.oat/projects/synced/*/',
|
|
15
18
|
'!.oat/projects/local/.gitkeep',
|
|
16
19
|
'!.oat/projects/archived/.gitkeep',
|
|
17
20
|
];
|
|
18
|
-
function
|
|
19
|
-
|
|
21
|
+
function managedScopedRules(content) {
|
|
22
|
+
if (content === null)
|
|
23
|
+
return [];
|
|
24
|
+
const startIndex = content.indexOf(SECTION_START);
|
|
25
|
+
const endIndex = content.indexOf(SECTION_END);
|
|
26
|
+
if (startIndex === -1 || endIndex < startIndex)
|
|
27
|
+
return [];
|
|
28
|
+
return content
|
|
29
|
+
.slice(startIndex + SECTION_START.length, endIndex)
|
|
30
|
+
.split('\n')
|
|
31
|
+
.filter((line) => /^\/(?:.+\/)?(?:local\/\*\*|synced\/\*\/|archived\/\*\*)$/.test(line));
|
|
20
32
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
action: 'created',
|
|
29
|
-
entries: CORE_ENTRIES,
|
|
30
|
-
stateDashboardIndexAction: await untrackOatStateDashboard(repoRoot),
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
const content = await readFile(gitignorePath, 'utf8');
|
|
34
|
-
const startIdx = content.indexOf(SECTION_START);
|
|
35
|
-
const endIdx = content.indexOf(SECTION_END);
|
|
36
|
-
if (startIdx !== -1 && endIdx !== -1) {
|
|
37
|
-
const existingSection = content.slice(startIdx, endIdx + SECTION_END.length);
|
|
38
|
-
if (existingSection === section) {
|
|
39
|
-
return {
|
|
40
|
-
action: 'no-change',
|
|
41
|
-
entries: CORE_ENTRIES,
|
|
42
|
-
stateDashboardIndexAction: await untrackOatStateDashboard(repoRoot),
|
|
43
|
-
};
|
|
33
|
+
async function readOptionalFile(path) {
|
|
34
|
+
try {
|
|
35
|
+
return await readFile(path, 'utf8');
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
39
|
+
return null;
|
|
44
40
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function removeUnmanagedRule(content, rule) {
|
|
45
|
+
let inManagedBlock = false;
|
|
46
|
+
return content
|
|
47
|
+
.split('\n')
|
|
48
|
+
.filter((line) => {
|
|
49
|
+
if (line === SECTION_START)
|
|
50
|
+
inManagedBlock = true;
|
|
51
|
+
const keep = line !== rule || inManagedBlock;
|
|
52
|
+
if (line === SECTION_END)
|
|
53
|
+
inManagedBlock = false;
|
|
54
|
+
return keep;
|
|
55
|
+
})
|
|
56
|
+
.join('\n');
|
|
57
|
+
}
|
|
58
|
+
export async function isSyncedRuleApplied(repoRoot) {
|
|
59
|
+
try {
|
|
60
|
+
await execFileAsync('git', [
|
|
61
|
+
'check-ignore',
|
|
62
|
+
'--quiet',
|
|
63
|
+
'--no-index',
|
|
64
|
+
'.oat/projects/synced/__probe__/',
|
|
65
|
+
], { cwd: repoRoot });
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function applyOatCoreGitignore(repoRoot, additionalEntries = []) {
|
|
73
|
+
const gitignorePath = join(repoRoot, '.gitignore');
|
|
74
|
+
const existingScopedRules = managedScopedRules(await readOptionalFile(gitignorePath));
|
|
75
|
+
const result = await applyManagedBlock(gitignorePath, {
|
|
76
|
+
start: SECTION_START,
|
|
77
|
+
end: SECTION_END,
|
|
78
|
+
entries: [
|
|
79
|
+
...new Set([
|
|
80
|
+
...CORE_ENTRIES,
|
|
81
|
+
...existingScopedRules,
|
|
82
|
+
...additionalEntries,
|
|
83
|
+
]),
|
|
84
|
+
],
|
|
85
|
+
});
|
|
56
86
|
return {
|
|
57
|
-
|
|
58
|
-
entries: CORE_ENTRIES,
|
|
87
|
+
...result,
|
|
59
88
|
stateDashboardIndexAction: await untrackOatStateDashboard(repoRoot),
|
|
60
89
|
};
|
|
61
90
|
}
|
|
91
|
+
export async function ensureScopedRootGitignore(repoRoot, scopeRoot, scope, git, dirtyMessage = 'Cannot repair the configured project-root rule because .gitignore has staged or unstaged changes; commit or stash those changes, then retry.') {
|
|
92
|
+
const canonicalRepoRoot = canonicalizePath(repoRoot);
|
|
93
|
+
const canonicalScopeRoot = canonicalizePath(scopeRoot);
|
|
94
|
+
const scopeRelative = relative(canonicalRepoRoot, canonicalScopeRoot);
|
|
95
|
+
if (scopeRelative === '..' ||
|
|
96
|
+
scopeRelative.startsWith('../') ||
|
|
97
|
+
scopeRelative.startsWith('..\\') ||
|
|
98
|
+
isAbsolute(scopeRelative)) {
|
|
99
|
+
return { changed: false, before: undefined };
|
|
100
|
+
}
|
|
101
|
+
const normalizedRoot = scopeRelative.split('\\').join('/');
|
|
102
|
+
const scopeRule = scope === 'local' ? `/${normalizedRoot}/**` : `/${normalizedRoot}/*/`;
|
|
103
|
+
const defaultRoot = `.oat/projects/${scope}`;
|
|
104
|
+
const customRules = normalizedRoot === defaultRoot ? [] : [scopeRule];
|
|
105
|
+
if (scope === 'synced') {
|
|
106
|
+
const archiveRoot = `${normalizedRoot.slice(0, normalizedRoot.lastIndexOf('/') + 1)}archived`;
|
|
107
|
+
if (archiveRoot !== '.oat/projects/archived') {
|
|
108
|
+
customRules.push(`/${archiveRoot}/**`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const gitignorePath = join(repoRoot, '.gitignore');
|
|
112
|
+
const current = await readOptionalFile(gitignorePath);
|
|
113
|
+
const sectionStart = current?.indexOf(SECTION_START) ?? -1;
|
|
114
|
+
const sectionEnd = current?.indexOf(SECTION_END) ?? -1;
|
|
115
|
+
const managedSection = current && sectionStart !== -1 && sectionEnd >= sectionStart
|
|
116
|
+
? current.slice(sectionStart, sectionEnd)
|
|
117
|
+
: '';
|
|
118
|
+
const managedLines = managedSection.split('\n');
|
|
119
|
+
const customRulesManaged = customRules.every((rule) => managedLines.includes(rule));
|
|
120
|
+
const probes = [join(canonicalScopeRoot, '__probe__', 'artifact.md')];
|
|
121
|
+
if (scope === 'synced') {
|
|
122
|
+
probes.push(join(dirname(canonicalScopeRoot), 'archived', '__probe__', 'artifact.md'));
|
|
123
|
+
}
|
|
124
|
+
const ignoredResults = await Promise.all(probes.map((probe) => git.run(['check-ignore', '--quiet', '--no-index', probe], {
|
|
125
|
+
cwd: repoRoot,
|
|
126
|
+
allowFailure: true,
|
|
127
|
+
})));
|
|
128
|
+
if (ignoredResults.every((result) => result.code === 0) &&
|
|
129
|
+
customRulesManaged) {
|
|
130
|
+
return { changed: false, before: undefined };
|
|
131
|
+
}
|
|
132
|
+
const failedProbe = ignoredResults.find((result) => result.code !== 0 && result.code !== 1);
|
|
133
|
+
if (failedProbe) {
|
|
134
|
+
throw new CliError(`git check-ignore failed (exit ${failedProbe.code}): ${failedProbe.stderr || failedProbe.stdout || 'unknown Git error'}`, 2);
|
|
135
|
+
}
|
|
136
|
+
if (dirtyMessage !== null) {
|
|
137
|
+
const gitignoreStatus = await git.run(['status', '--porcelain=v1', '--', '.gitignore'], { cwd: repoRoot });
|
|
138
|
+
if (gitignoreStatus.stdout !== '')
|
|
139
|
+
throw new CliError(dirtyMessage, 1);
|
|
140
|
+
}
|
|
141
|
+
const before = await readOptionalFile(gitignorePath);
|
|
142
|
+
if (before !== null && customRules.length > 0) {
|
|
143
|
+
const cleaned = customRules.reduce(removeUnmanagedRule, before);
|
|
144
|
+
if (cleaned !== before)
|
|
145
|
+
await writeFile(gitignorePath, cleaned, 'utf8');
|
|
146
|
+
}
|
|
147
|
+
await applyOatCoreGitignore(repoRoot, customRules);
|
|
148
|
+
const verifiedResults = await Promise.all(probes.map((probe) => git.run(['check-ignore', '--quiet', '--no-index', probe], {
|
|
149
|
+
cwd: repoRoot,
|
|
150
|
+
allowFailure: true,
|
|
151
|
+
})));
|
|
152
|
+
const unverified = verifiedResults.find((result) => result.code !== 0);
|
|
153
|
+
if (unverified) {
|
|
154
|
+
if (before === null) {
|
|
155
|
+
await rm(gitignorePath, { force: true });
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
await writeFile(gitignorePath, before, 'utf8');
|
|
159
|
+
}
|
|
160
|
+
throw new CliError(`git check-ignore failed after applying the managed block (exit ${unverified.code}): ${unverified.stderr || unverified.stdout || 'configured rule did not match'}`, 2);
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
before,
|
|
164
|
+
changed: (await readOptionalFile(gitignorePath)) !== before,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
62
167
|
/**
|
|
63
168
|
* Removes the generated repo dashboard from the git index once the OAT core
|
|
64
169
|
* ignore rule is present, while leaving the working-tree file intact.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CommandContext, type GlobalOptions } from '../../app/command-context.js';
|
|
2
|
+
import { type ApplyOatCoreGitattributesResult } from '../init/gitattributes.js';
|
|
2
3
|
import { type ApplyOatCoreResult } from '../init/gitignore.js';
|
|
3
4
|
import { type NativeSkillDisposition } from '../shared/native-skill-disposition.js';
|
|
4
5
|
import { type MultiSelectChoice, type PromptContext, type SelectChoice } from '../shared/shared.prompts.js';
|
|
@@ -47,6 +48,7 @@ interface InitDependencies {
|
|
|
47
48
|
saveSyncConfig: (configPath: string, config: SyncConfig) => Promise<SyncConfig>;
|
|
48
49
|
getConfigAwareAdapters: (adapters: ProviderAdapter[], scopeRoot: string, config: SyncConfig) => Promise<ConfigAwareAdaptersResult>;
|
|
49
50
|
applyOatCoreGitignore: (repoRoot: string) => Promise<ApplyOatCoreResult>;
|
|
51
|
+
applyOatCoreGitattributes: (repoRoot: string) => Promise<ApplyOatCoreGitattributesResult>;
|
|
50
52
|
dirExists: (dirPath: string) => Promise<boolean>;
|
|
51
53
|
readOatConfig: (repoRoot: string) => Promise<OatConfig>;
|
|
52
54
|
resolveLocalPaths: (config: OatConfig) => string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"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"}
|