@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.
Files changed (204) hide show
  1. package/assets/agents/oat-phase-implementer.md +11 -1
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/docs/cli-utilities/configuration.md +11 -1
  4. package/assets/docs/quickstart.md +9 -0
  5. package/assets/docs/reference/cli-reference.md +56 -1
  6. package/assets/docs/reference/file-locations.md +18 -1
  7. package/assets/docs/reference/oat-directory-structure.md +20 -4
  8. package/assets/docs/workflows/projects/artifacts.md +27 -1
  9. package/assets/docs/workflows/projects/implementation-execution.md +22 -0
  10. package/assets/docs/workflows/projects/index.md +6 -0
  11. package/assets/docs/workflows/projects/lifecycle.md +19 -5
  12. package/assets/docs/workflows/projects/picking-up-projects.md +75 -0
  13. package/assets/docs/workflows/projects/pr-flow.md +22 -1
  14. package/assets/docs/workflows/projects/reviewing-oat-prs.md +60 -0
  15. package/assets/public-package-versions.json +4 -4
  16. package/assets/skills/oat-brainstorm/SKILL.md +135 -32
  17. package/assets/skills/oat-brainstorm/references/destinations.md +9 -6
  18. package/assets/skills/oat-cursor-cloud-projects/SKILL.md +11 -1
  19. package/assets/skills/oat-doctor/SKILL.md +8 -1
  20. package/assets/skills/oat-project-autonomous/SKILL.md +45 -1
  21. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +8 -8
  22. package/assets/skills/oat-project-capture/SKILL.md +29 -9
  23. package/assets/skills/oat-project-complete/SKILL.md +610 -38
  24. package/assets/skills/oat-project-complete/scripts/parse-completion-retry-fields.mjs +265 -0
  25. package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +764 -0
  26. package/assets/skills/oat-project-complete/scripts/resolve-completion-retry.mjs +134 -0
  27. package/assets/skills/oat-project-complete/scripts/validate-nonarchive-lifecycle-receipt.mjs +160 -0
  28. package/assets/skills/oat-project-design/SKILL.md +33 -9
  29. package/assets/skills/oat-project-discover/SKILL.md +16 -3
  30. package/assets/skills/oat-project-document/SKILL.md +10 -4
  31. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +8 -8
  32. package/assets/skills/oat-project-implement/SKILL.md +14 -3
  33. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +18 -6
  34. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +8 -8
  35. package/assets/skills/oat-project-implement/references/phase-execution.md +9 -3
  36. package/assets/skills/oat-project-implement/references/plan-and-resume.md +3 -0
  37. package/assets/skills/oat-project-import-plan/SKILL.md +15 -9
  38. package/assets/skills/oat-project-new/SKILL.md +7 -5
  39. package/assets/skills/oat-project-next/SKILL.md +32 -10
  40. package/assets/skills/oat-project-plan/SKILL.md +18 -3
  41. package/assets/skills/oat-project-pr-final/SKILL.md +23 -2
  42. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +8 -8
  43. package/assets/skills/oat-project-pr-progress/SKILL.md +23 -2
  44. package/assets/skills/oat-project-progress/SKILL.md +23 -9
  45. package/assets/skills/oat-project-promote-spec-driven/SKILL.md +20 -2
  46. package/assets/skills/oat-project-quick-start/SKILL.md +48 -18
  47. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +8 -8
  48. package/assets/skills/oat-project-reconcile/SKILL.md +14 -10
  49. package/assets/skills/oat-project-retro/SKILL.md +3 -3
  50. package/assets/skills/oat-project-retro/references/apply-procedure.md +102 -6
  51. package/assets/skills/oat-project-retro-file/SKILL.md +57 -6
  52. package/assets/skills/oat-project-review-provide/SKILL.md +45 -4
  53. package/assets/skills/oat-project-review-receive/SKILL.md +16 -7
  54. package/assets/skills/oat-project-review-receive-remote/SKILL.md +9 -3
  55. package/assets/skills/oat-project-revise/SKILL.md +12 -3
  56. package/assets/skills/oat-project-spec/SKILL.md +16 -3
  57. package/assets/skills/oat-project-summary/SKILL.md +113 -13
  58. package/assets/skills/oat-wave-execute/SKILL.md +34 -2
  59. package/assets/skills/oat-worktree-bootstrap/SKILL.md +13 -1
  60. package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +13 -1
  61. package/dist/commands/config/index.d.ts +1 -0
  62. package/dist/commands/config/index.d.ts.map +1 -1
  63. package/dist/commands/config/index.js +30 -2
  64. package/dist/commands/doctor/index.d.ts +2 -0
  65. package/dist/commands/doctor/index.d.ts.map +1 -1
  66. package/dist/commands/doctor/index.js +27 -3
  67. package/dist/commands/doctor/synced-projects.d.ts +12 -0
  68. package/dist/commands/doctor/synced-projects.d.ts.map +1 -0
  69. package/dist/commands/doctor/synced-projects.js +208 -0
  70. package/dist/commands/init/gitattributes.d.ts +4 -0
  71. package/dist/commands/init/gitattributes.d.ts.map +1 -0
  72. package/dist/commands/init/gitattributes.js +12 -0
  73. package/dist/commands/init/gitignore.d.ts +8 -1
  74. package/dist/commands/init/gitignore.d.ts.map +1 -1
  75. package/dist/commands/init/gitignore.js +146 -41
  76. package/dist/commands/init/index.d.ts +2 -0
  77. package/dist/commands/init/index.d.ts.map +1 -1
  78. package/dist/commands/init/index.js +3 -0
  79. package/dist/commands/init/managed-block.d.ts +10 -0
  80. package/dist/commands/init/managed-block.d.ts.map +1 -0
  81. package/dist/commands/init/managed-block.js +40 -0
  82. package/dist/commands/init/tools/workflows/install-workflows.js +1 -1
  83. package/dist/commands/local/index.d.ts.map +1 -1
  84. package/dist/commands/local/index.js +5 -1
  85. package/dist/commands/local/sync.d.ts +4 -0
  86. package/dist/commands/local/sync.d.ts.map +1 -1
  87. package/dist/commands/local/sync.js +123 -2
  88. package/dist/commands/pjm/adoption.d.ts +2 -0
  89. package/dist/commands/pjm/adoption.d.ts.map +1 -1
  90. package/dist/commands/pjm/adoption.js +1 -1
  91. package/dist/commands/project/archive/archive-utils.d.ts +24 -0
  92. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  93. package/dist/commands/project/archive/archive-utils.js +349 -22
  94. package/dist/commands/project/archive/index.d.ts.map +1 -1
  95. package/dist/commands/project/archive/index.js +1 -0
  96. package/dist/commands/project/archive/push-runner.d.ts +5 -1
  97. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  98. package/dist/commands/project/archive/push-runner.js +33 -4
  99. package/dist/commands/project/complete-state/index.d.ts.map +1 -1
  100. package/dist/commands/project/complete-state/index.js +3 -1
  101. package/dist/commands/project/index.d.ts.map +1 -1
  102. package/dist/commands/project/index.js +12 -0
  103. package/dist/commands/project/links/compute.d.ts +9 -0
  104. package/dist/commands/project/links/compute.d.ts.map +1 -0
  105. package/dist/commands/project/links/compute.js +27 -0
  106. package/dist/commands/project/links/index.d.ts +17 -0
  107. package/dist/commands/project/links/index.d.ts.map +1 -0
  108. package/dist/commands/project/links/index.js +72 -0
  109. package/dist/commands/project/links/refresh.d.ts +26 -0
  110. package/dist/commands/project/links/refresh.d.ts.map +1 -0
  111. package/dist/commands/project/links/refresh.js +92 -0
  112. package/dist/commands/project/links/render.d.ts +24 -0
  113. package/dist/commands/project/links/render.d.ts.map +1 -0
  114. package/dist/commands/project/links/render.js +68 -0
  115. package/dist/commands/project/list.d.ts +5 -0
  116. package/dist/commands/project/list.d.ts.map +1 -1
  117. package/dist/commands/project/list.js +182 -9
  118. package/dist/commands/project/migrate/index.d.ts +22 -0
  119. package/dist/commands/project/migrate/index.d.ts.map +1 -0
  120. package/dist/commands/project/migrate/index.js +79 -0
  121. package/dist/commands/project/new/index.d.ts +2 -0
  122. package/dist/commands/project/new/index.d.ts.map +1 -1
  123. package/dist/commands/project/new/index.js +14 -2
  124. package/dist/commands/project/new/scaffold.d.ts +22 -1
  125. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  126. package/dist/commands/project/new/scaffold.js +287 -69
  127. package/dist/commands/project/open/index.d.ts +16 -0
  128. package/dist/commands/project/open/index.d.ts.map +1 -1
  129. package/dist/commands/project/open/index.js +151 -19
  130. package/dist/commands/project/pause/index.d.ts +8 -0
  131. package/dist/commands/project/pause/index.d.ts.map +1 -1
  132. package/dist/commands/project/pause/index.js +129 -19
  133. package/dist/commands/project/prune/index.d.ts +21 -0
  134. package/dist/commands/project/prune/index.d.ts.map +1 -0
  135. package/dist/commands/project/prune/index.js +95 -0
  136. package/dist/commands/project/pull/index.d.ts +28 -0
  137. package/dist/commands/project/pull/index.d.ts.map +1 -0
  138. package/dist/commands/project/pull/index.js +157 -0
  139. package/dist/commands/project/push/index.d.ts +22 -0
  140. package/dist/commands/project/push/index.d.ts.map +1 -0
  141. package/dist/commands/project/push/index.js +100 -0
  142. package/dist/commands/project/scope/index.d.ts +17 -0
  143. package/dist/commands/project/scope/index.d.ts.map +1 -0
  144. package/dist/commands/project/scope/index.js +107 -0
  145. package/dist/commands/project/split/run.d.ts +4 -0
  146. package/dist/commands/project/split/run.d.ts.map +1 -1
  147. package/dist/commands/project/split/run.js +48 -10
  148. package/dist/commands/project/sync/git.d.ts +18 -0
  149. package/dist/commands/project/sync/git.d.ts.map +1 -0
  150. package/dist/commands/project/sync/git.js +60 -0
  151. package/dist/commands/project/sync/record.d.ts +22 -0
  152. package/dist/commands/project/sync/record.d.ts.map +1 -0
  153. package/dist/commands/project/sync/record.js +133 -0
  154. package/dist/commands/project/sync/ref-sync.d.ts +120 -0
  155. package/dist/commands/project/sync/ref-sync.d.ts.map +1 -0
  156. package/dist/commands/project/sync/ref-sync.js +962 -0
  157. package/dist/commands/project/sync/resolve-target.d.ts +27 -0
  158. package/dist/commands/project/sync/resolve-target.d.ts.map +1 -0
  159. package/dist/commands/project/sync/resolve-target.js +159 -0
  160. package/dist/commands/shared/oat-paths.d.ts +4 -1
  161. package/dist/commands/shared/oat-paths.d.ts.map +1 -1
  162. package/dist/commands/shared/oat-paths.js +2 -2
  163. package/dist/commands/shared/project-scope.d.ts +23 -0
  164. package/dist/commands/shared/project-scope.d.ts.map +1 -0
  165. package/dist/commands/shared/project-scope.js +106 -0
  166. package/dist/commands/tools/migrate/index.js +1 -1
  167. package/dist/commands/tools/shared/pack-inventory.d.ts.map +1 -1
  168. package/dist/commands/tools/shared/pack-inventory.js +11 -0
  169. package/dist/commands/tools/shared/pack-lifecycle.js +1 -1
  170. package/dist/commands/tools/shared/pack-reconcile.d.ts.map +1 -1
  171. package/dist/commands/tools/shared/pack-reconcile.js +4 -1
  172. package/dist/commands/tools/update/index.d.ts.map +1 -1
  173. package/dist/commands/tools/update/index.js +20 -10
  174. package/dist/commands/tools/update/update-tools.d.ts +2 -0
  175. package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
  176. package/dist/config/oat-config.d.ts +6 -3
  177. package/dist/config/oat-config.d.ts.map +1 -1
  178. package/dist/config/oat-config.js +41 -7
  179. package/dist/config/resolve.d.ts.map +1 -1
  180. package/dist/config/resolve.js +2 -1
  181. package/dist/fs/io.d.ts +2 -1
  182. package/dist/fs/io.d.ts.map +1 -1
  183. package/dist/fs/io.js +5 -2
  184. package/dist/projects/split/finalize.d.ts.map +1 -1
  185. package/dist/projects/split/finalize.js +55 -2
  186. package/dist/projects/split/resume.d.ts +3 -0
  187. package/dist/projects/split/resume.d.ts.map +1 -1
  188. package/dist/projects/split/resume.js +34 -7
  189. package/dist/projects/split/seed-children.d.ts.map +1 -1
  190. package/dist/projects/split/seed-children.js +6 -0
  191. package/dist/projects/split/write-parent.d.ts +7 -0
  192. package/dist/projects/split/write-parent.d.ts.map +1 -1
  193. package/dist/projects/split/write-parent.js +7 -4
  194. package/dist/release/public-package-contract.d.ts.map +1 -1
  195. package/dist/release/public-package-contract.js +1 -0
  196. package/dist/validation/skills.d.ts.map +1 -1
  197. package/dist/validation/skills.js +434 -0
  198. package/package.json +4 -4
  199. package/dist/__tests__/skills/split-flow-fixtures.d.ts +0 -50
  200. package/dist/__tests__/skills/split-flow-fixtures.d.ts.map +0 -1
  201. package/dist/__tests__/skills/split-flow-fixtures.js +0 -161
  202. package/dist/commands/__tests__/helpers.d.ts +0 -12
  203. package/dist/commands/__tests__/helpers.d.ts.map +0 -1
  204. 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":"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"}
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, config, localConfig] = await Promise.all([
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 declare function applyOatCoreGitignore(repoRoot: string): Promise<ApplyOatCoreResult>;
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":"AAqBA,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;AAMD,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,CAgD7B;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,CAAC,CAyB1D"}
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 { fileExists } from '../../fs/io.js';
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 buildSection() {
19
- return `${SECTION_START}\n${CORE_ENTRIES.join('\n')}\n${SECTION_END}`;
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
- export async function applyOatCoreGitignore(repoRoot) {
22
- const gitignorePath = join(repoRoot, '.gitignore');
23
- const exists = await fileExists(gitignorePath);
24
- const section = buildSection();
25
- if (!exists) {
26
- await writeFile(gitignorePath, `${section}\n`, 'utf8');
27
- return {
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
- const before = content.slice(0, startIdx);
46
- const after = content.slice(endIdx + SECTION_END.length);
47
- await writeFile(gitignorePath, `${before}${section}${after}`, 'utf8');
48
- return {
49
- action: 'updated',
50
- entries: CORE_ENTRIES,
51
- stateDashboardIndexAction: await untrackOatStateDashboard(repoRoot),
52
- };
53
- }
54
- const separator = content.endsWith('\n') ? '\n' : '\n\n';
55
- await writeFile(gitignorePath, `${content}${separator}${section}\n`, 'utf8');
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
- action: 'updated',
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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"}