syntra 0.1.2

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 (170) hide show
  1. package/README.md +239 -0
  2. package/dist/adapters/claude.d.ts +3 -0
  3. package/dist/adapters/claude.d.ts.map +1 -0
  4. package/dist/adapters/claude.js +19 -0
  5. package/dist/adapters/claude.js.map +1 -0
  6. package/dist/adapters/common.d.ts +14 -0
  7. package/dist/adapters/common.d.ts.map +1 -0
  8. package/dist/adapters/common.js +38 -0
  9. package/dist/adapters/common.js.map +1 -0
  10. package/dist/adapters/copilot.d.ts +5 -0
  11. package/dist/adapters/copilot.d.ts.map +1 -0
  12. package/dist/adapters/copilot.js +25 -0
  13. package/dist/adapters/copilot.js.map +1 -0
  14. package/dist/adapters/cursor.d.ts +3 -0
  15. package/dist/adapters/cursor.d.ts.map +1 -0
  16. package/dist/adapters/cursor.js +26 -0
  17. package/dist/adapters/cursor.js.map +1 -0
  18. package/dist/adapters/index.d.ts +12 -0
  19. package/dist/adapters/index.d.ts.map +1 -0
  20. package/dist/adapters/index.js +27 -0
  21. package/dist/adapters/index.js.map +1 -0
  22. package/dist/commands/add.d.ts +2 -0
  23. package/dist/commands/add.d.ts.map +1 -0
  24. package/dist/commands/add.js +154 -0
  25. package/dist/commands/add.js.map +1 -0
  26. package/dist/commands/done.d.ts +2 -0
  27. package/dist/commands/done.d.ts.map +1 -0
  28. package/dist/commands/done.js +20 -0
  29. package/dist/commands/done.js.map +1 -0
  30. package/dist/commands/init.d.ts +2 -0
  31. package/dist/commands/init.d.ts.map +1 -0
  32. package/dist/commands/init.js +129 -0
  33. package/dist/commands/init.js.map +1 -0
  34. package/dist/commands/sync.d.ts +8 -0
  35. package/dist/commands/sync.d.ts.map +1 -0
  36. package/dist/commands/sync.js +31 -0
  37. package/dist/commands/sync.js.map +1 -0
  38. package/dist/commands/template.d.ts +3 -0
  39. package/dist/commands/template.d.ts.map +1 -0
  40. package/dist/commands/template.js +51 -0
  41. package/dist/commands/template.js.map +1 -0
  42. package/dist/commands/validate.d.ts +6 -0
  43. package/dist/commands/validate.d.ts.map +1 -0
  44. package/dist/commands/validate.js +101 -0
  45. package/dist/commands/validate.js.map +1 -0
  46. package/dist/detectors/cicd.d.ts +2 -0
  47. package/dist/detectors/cicd.d.ts.map +1 -0
  48. package/dist/detectors/cicd.js +24 -0
  49. package/dist/detectors/cicd.js.map +1 -0
  50. package/dist/detectors/existingAi.d.ts +6 -0
  51. package/dist/detectors/existingAi.d.ts.map +1 -0
  52. package/dist/detectors/existingAi.js +10 -0
  53. package/dist/detectors/existingAi.js.map +1 -0
  54. package/dist/detectors/framework.d.ts +3 -0
  55. package/dist/detectors/framework.d.ts.map +1 -0
  56. package/dist/detectors/framework.js +75 -0
  57. package/dist/detectors/framework.js.map +1 -0
  58. package/dist/detectors/index.d.ts +9 -0
  59. package/dist/detectors/index.d.ts.map +1 -0
  60. package/dist/detectors/index.js +29 -0
  61. package/dist/detectors/index.js.map +1 -0
  62. package/dist/detectors/language.d.ts +3 -0
  63. package/dist/detectors/language.d.ts.map +1 -0
  64. package/dist/detectors/language.js +34 -0
  65. package/dist/detectors/language.js.map +1 -0
  66. package/dist/detectors/monorepo.d.ts +2 -0
  67. package/dist/detectors/monorepo.d.ts.map +1 -0
  68. package/dist/detectors/monorepo.js +31 -0
  69. package/dist/detectors/monorepo.js.map +1 -0
  70. package/dist/detectors/packageManager.d.ts +3 -0
  71. package/dist/detectors/packageManager.d.ts.map +1 -0
  72. package/dist/detectors/packageManager.js +42 -0
  73. package/dist/detectors/packageManager.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +125 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/templates/agents/bugFixer.d.ts +2 -0
  79. package/dist/templates/agents/bugFixer.d.ts.map +1 -0
  80. package/dist/templates/agents/bugFixer.js +37 -0
  81. package/dist/templates/agents/bugFixer.js.map +1 -0
  82. package/dist/templates/agents/codeGenerator.d.ts +2 -0
  83. package/dist/templates/agents/codeGenerator.d.ts.map +1 -0
  84. package/dist/templates/agents/codeGenerator.js +41 -0
  85. package/dist/templates/agents/codeGenerator.js.map +1 -0
  86. package/dist/templates/agents/codeReviewer.d.ts +2 -0
  87. package/dist/templates/agents/codeReviewer.d.ts.map +1 -0
  88. package/dist/templates/agents/codeReviewer.js +43 -0
  89. package/dist/templates/agents/codeReviewer.js.map +1 -0
  90. package/dist/templates/agents/index.d.ts +5 -0
  91. package/dist/templates/agents/index.d.ts.map +1 -0
  92. package/dist/templates/agents/index.js +5 -0
  93. package/dist/templates/agents/index.js.map +1 -0
  94. package/dist/templates/agents/taskPlanner.d.ts +2 -0
  95. package/dist/templates/agents/taskPlanner.d.ts.map +1 -0
  96. package/dist/templates/agents/taskPlanner.js +47 -0
  97. package/dist/templates/agents/taskPlanner.js.map +1 -0
  98. package/dist/templates/engine.d.ts +9 -0
  99. package/dist/templates/engine.d.ts.map +1 -0
  100. package/dist/templates/engine.js +16 -0
  101. package/dist/templates/engine.js.map +1 -0
  102. package/dist/templates/files/index.d.ts +3 -0
  103. package/dist/templates/files/index.d.ts.map +1 -0
  104. package/dist/templates/files/index.js +51 -0
  105. package/dist/templates/files/index.js.map +1 -0
  106. package/dist/templates/instructions/architecture.d.ts +2 -0
  107. package/dist/templates/instructions/architecture.d.ts.map +1 -0
  108. package/dist/templates/instructions/architecture.js +50 -0
  109. package/dist/templates/instructions/architecture.js.map +1 -0
  110. package/dist/templates/instructions/deploy.d.ts +2 -0
  111. package/dist/templates/instructions/deploy.d.ts.map +1 -0
  112. package/dist/templates/instructions/deploy.js +53 -0
  113. package/dist/templates/instructions/deploy.js.map +1 -0
  114. package/dist/templates/instructions/index.d.ts +6 -0
  115. package/dist/templates/instructions/index.d.ts.map +1 -0
  116. package/dist/templates/instructions/index.js +6 -0
  117. package/dist/templates/instructions/index.js.map +1 -0
  118. package/dist/templates/instructions/security.d.ts +2 -0
  119. package/dist/templates/instructions/security.d.ts.map +1 -0
  120. package/dist/templates/instructions/security.js +43 -0
  121. package/dist/templates/instructions/security.js.map +1 -0
  122. package/dist/templates/instructions/style.d.ts +2 -0
  123. package/dist/templates/instructions/style.d.ts.map +1 -0
  124. package/dist/templates/instructions/style.js +45 -0
  125. package/dist/templates/instructions/style.js.map +1 -0
  126. package/dist/templates/instructions/testing.d.ts +2 -0
  127. package/dist/templates/instructions/testing.d.ts.map +1 -0
  128. package/dist/templates/instructions/testing.js +61 -0
  129. package/dist/templates/instructions/testing.js.map +1 -0
  130. package/dist/templates/registry.d.ts +13 -0
  131. package/dist/templates/registry.d.ts.map +1 -0
  132. package/dist/templates/registry.js +89 -0
  133. package/dist/templates/registry.js.map +1 -0
  134. package/dist/utils/fs.d.ts +16 -0
  135. package/dist/utils/fs.d.ts.map +1 -0
  136. package/dist/utils/fs.js +88 -0
  137. package/dist/utils/fs.js.map +1 -0
  138. package/dist/utils/logger.d.ts +16 -0
  139. package/dist/utils/logger.d.ts.map +1 -0
  140. package/dist/utils/logger.js +68 -0
  141. package/dist/utils/logger.js.map +1 -0
  142. package/dist/utils/prompt.d.ts +9 -0
  143. package/dist/utils/prompt.d.ts.map +1 -0
  144. package/dist/utils/prompt.js +48 -0
  145. package/dist/utils/prompt.js.map +1 -0
  146. package/dist/utils/types.d.ts +68 -0
  147. package/dist/utils/types.d.ts.map +1 -0
  148. package/dist/utils/types.js +2 -0
  149. package/dist/utils/types.js.map +1 -0
  150. package/dist/validators/agents.d.ts +3 -0
  151. package/dist/validators/agents.d.ts.map +1 -0
  152. package/dist/validators/agents.js +40 -0
  153. package/dist/validators/agents.js.map +1 -0
  154. package/dist/validators/config.d.ts +12 -0
  155. package/dist/validators/config.d.ts.map +1 -0
  156. package/dist/validators/config.js +114 -0
  157. package/dist/validators/config.js.map +1 -0
  158. package/dist/validators/instructions.d.ts +10 -0
  159. package/dist/validators/instructions.d.ts.map +1 -0
  160. package/dist/validators/instructions.js +34 -0
  161. package/dist/validators/instructions.js.map +1 -0
  162. package/dist/validators/syncStatus.d.ts +9 -0
  163. package/dist/validators/syncStatus.d.ts.map +1 -0
  164. package/dist/validators/syncStatus.js +92 -0
  165. package/dist/validators/syncStatus.js.map +1 -0
  166. package/dist/validators/tasks.d.ts +3 -0
  167. package/dist/validators/tasks.d.ts.map +1 -0
  168. package/dist/validators/tasks.js +72 -0
  169. package/dist/validators/tasks.js.map +1 -0
  170. package/package.json +52 -0
@@ -0,0 +1,68 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ let currentSpinner = null;
4
+ export const logger = {
5
+ success: (message) => {
6
+ if (currentSpinner)
7
+ currentSpinner.stop();
8
+ console.log(chalk.green('✔'), message);
9
+ currentSpinner = null;
10
+ },
11
+ error: (message) => {
12
+ if (currentSpinner)
13
+ currentSpinner.stop();
14
+ console.log(chalk.red('✖'), message);
15
+ currentSpinner = null;
16
+ },
17
+ warn: (message) => {
18
+ if (currentSpinner)
19
+ currentSpinner.stop();
20
+ console.log(chalk.yellow('⚠'), message);
21
+ currentSpinner = null;
22
+ },
23
+ info: (message) => {
24
+ if (currentSpinner)
25
+ currentSpinner.stop();
26
+ console.log(chalk.blue('ℹ'), message);
27
+ currentSpinner = null;
28
+ },
29
+ dim: (message) => {
30
+ console.log(chalk.dim(message));
31
+ },
32
+ bold: (message) => {
33
+ console.log(chalk.bold(message));
34
+ },
35
+ section: (title) => {
36
+ console.log();
37
+ console.log(chalk.bold.cyan(title));
38
+ },
39
+ spinner: (message) => {
40
+ if (currentSpinner)
41
+ currentSpinner.stop();
42
+ currentSpinner = ora(message).start();
43
+ return {
44
+ succeed: () => {
45
+ if (currentSpinner) {
46
+ currentSpinner.succeed(message);
47
+ currentSpinner = null;
48
+ }
49
+ },
50
+ fail: () => {
51
+ if (currentSpinner) {
52
+ currentSpinner.fail(message);
53
+ currentSpinner = null;
54
+ }
55
+ },
56
+ stop: () => {
57
+ if (currentSpinner) {
58
+ currentSpinner.stop();
59
+ currentSpinner = null;
60
+ }
61
+ },
62
+ };
63
+ },
64
+ newline: () => {
65
+ console.log();
66
+ },
67
+ };
68
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAItB,IAAI,cAAc,GAA2B,IAAI,CAAC;AAElD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,IAAI,cAAc;YAAE,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACvC,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,IAAI,cAAc;YAAE,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACrC,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,IAAI,cAAc;YAAE,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACxC,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,IAAI,cAAc;YAAE,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACtC,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,EAAE,CAAC,KAAa,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,IAAI,cAAc;YAAE,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1C,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAChC,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,IAAI,EAAE,GAAG,EAAE;gBACT,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC7B,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,IAAI,EAAE,GAAG,EAAE;gBACT,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,IAAI,EAAE,CAAC;oBACtB,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface PromptOptions {
2
+ message: string;
3
+ choices?: string[];
4
+ default?: string | boolean;
5
+ validate?: (value: string) => boolean | string;
6
+ checkbox?: boolean;
7
+ }
8
+ export declare function prompt(options: PromptOptions): Promise<string | string[] | boolean>;
9
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,CAgDzF"}
@@ -0,0 +1,48 @@
1
+ import inquirer from 'inquirer';
2
+ export async function prompt(options) {
3
+ if (options.checkbox) {
4
+ const answer = await inquirer.prompt([
5
+ {
6
+ type: 'checkbox',
7
+ name: 'selected',
8
+ message: options.message,
9
+ choices: options.choices || [],
10
+ },
11
+ ]);
12
+ return answer.selected;
13
+ }
14
+ if (options.choices) {
15
+ const answer = await inquirer.prompt([
16
+ {
17
+ type: 'list',
18
+ name: 'selected',
19
+ message: options.message,
20
+ choices: options.choices,
21
+ default: options.default,
22
+ },
23
+ ]);
24
+ return answer.selected;
25
+ }
26
+ if (typeof options.default === 'boolean') {
27
+ const answer = await inquirer.prompt([
28
+ {
29
+ type: 'confirm',
30
+ name: 'confirmed',
31
+ message: options.message,
32
+ default: options.default,
33
+ },
34
+ ]);
35
+ return answer.confirmed;
36
+ }
37
+ const answer = await inquirer.prompt([
38
+ {
39
+ type: 'input',
40
+ name: 'value',
41
+ message: options.message,
42
+ default: options.default,
43
+ validate: options.validate,
44
+ },
45
+ ]);
46
+ return answer.value;
47
+ }
48
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAUhC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB;IACjD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACnC;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;aAC/B;SACF,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACnC;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB;SACF,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACnC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB;SACF,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACnC;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAiB;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B;KACF,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC"}
@@ -0,0 +1,68 @@
1
+ export interface ProjectProfile {
2
+ language: 'typescript' | 'javascript' | 'python' | 'go' | 'rust' | 'other';
3
+ framework: string;
4
+ packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun' | 'python' | 'other';
5
+ monorepo: boolean;
6
+ cicd: string[];
7
+ existingAi: {
8
+ copilot: boolean;
9
+ claude: boolean;
10
+ cursor: boolean;
11
+ };
12
+ }
13
+ export interface Config {
14
+ version: number;
15
+ project: {
16
+ name: string;
17
+ language: ProjectProfile['language'];
18
+ framework: string;
19
+ packageManager: ProjectProfile['packageManager'];
20
+ monorepo: boolean;
21
+ };
22
+ adapters: {
23
+ copilot: {
24
+ enabled: boolean;
25
+ instructionsMode: 'concatenated' | 'referenced';
26
+ };
27
+ claude: {
28
+ enabled: boolean;
29
+ instructionsMode: 'concatenated' | 'referenced';
30
+ };
31
+ cursor: {
32
+ enabled: boolean;
33
+ instructionsMode: 'concatenated' | 'individual';
34
+ };
35
+ };
36
+ sync: {
37
+ autoSync: boolean;
38
+ warnManualEdits: boolean;
39
+ };
40
+ tasks: {
41
+ idPrefix: string;
42
+ activeDir: string;
43
+ doneDir: string;
44
+ };
45
+ language: string;
46
+ }
47
+ export interface TaskFile {
48
+ id: string;
49
+ description: string;
50
+ instructions: string[];
51
+ agent: string;
52
+ steps: string[];
53
+ acceptanceCriteria: string[];
54
+ status: 'in-progress' | 'human-review' | 'done';
55
+ }
56
+ export interface InstructionFile {
57
+ name: string;
58
+ title: string;
59
+ content: string;
60
+ }
61
+ export interface AgentFile {
62
+ name: string;
63
+ title: string;
64
+ description: string;
65
+ content: string;
66
+ instructionReferences: string[];
67
+ }
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrE,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;QACjD,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,OAAO,CAAC;YACjB,gBAAgB,EAAE,cAAc,GAAG,YAAY,CAAC;SACjD,CAAC;QACF,MAAM,EAAE;YACN,OAAO,EAAE,OAAO,CAAC;YACjB,gBAAgB,EAAE,cAAc,GAAG,YAAY,CAAC;SACjD,CAAC;QACF,MAAM,EAAE;YACN,OAAO,EAAE,OAAO,CAAC;YACjB,gBAAgB,EAAE,cAAc,GAAG,YAAY,CAAC;SACjD,CAAC;KACH,CAAC;IACF,IAAI,EAAE;QACJ,QAAQ,EAAE,OAAO,CAAC;QAClB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,aAAa,GAAG,cAAc,GAAG,MAAM,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { ValidationSummary } from './instructions.js';
2
+ export declare function validateAgents(rootPath: string): ValidationSummary;
3
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/validators/agents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAO5E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAwClE"}
@@ -0,0 +1,40 @@
1
+ import path from 'path';
2
+ import { fsUtils } from '../utils/fs.js';
3
+ function extractInstructionReferences(markdown) {
4
+ const matches = markdown.match(/([a-z0-9-]+)\.instructions\.md/gi) || [];
5
+ return [...new Set(matches.map((entry) => entry.replace(/\.instructions\.md$/i, '').toLowerCase()))];
6
+ }
7
+ export function validateAgents(rootPath) {
8
+ const agentsDir = path.join(rootPath, 'ai', 'agents');
9
+ const instructionsDir = path.join(rootPath, 'ai', 'instructions');
10
+ const instructionNames = new Set(fsUtils
11
+ .listFiles(instructionsDir)
12
+ .filter((file) => file.endsWith('.instructions.md'))
13
+ .map((file) => path.basename(file, '.instructions.md').toLowerCase()));
14
+ const files = fsUtils.listFiles(agentsDir).filter((file) => file.endsWith('.agent.md'));
15
+ const issues = [];
16
+ for (const filePath of files) {
17
+ const fileName = path.basename(filePath);
18
+ const content = fsUtils.readFile(filePath);
19
+ if (!content.trim().startsWith('# ')) {
20
+ issues.push({
21
+ level: 'error',
22
+ message: `${fileName} must start with a level-1 heading (# Title).`,
23
+ });
24
+ }
25
+ const refs = extractInstructionReferences(content);
26
+ for (const ref of refs) {
27
+ if (!instructionNames.has(ref)) {
28
+ issues.push({
29
+ level: 'warning',
30
+ message: `${fileName} references missing instruction: ${ref}.instructions.md`,
31
+ });
32
+ }
33
+ }
34
+ }
35
+ return {
36
+ checked: files.length,
37
+ issues,
38
+ };
39
+ }
40
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/validators/agents.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,SAAS,4BAA4B,CAAC,QAAgB;IAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,kCAAkC,CAAC,IAAI,EAAE,CAAC;IACzE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAElE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC5B,OAAO;SACF,SAAS,CAAC,eAAe,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;SACnD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAC5E,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACxF,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,GAAG,QAAQ,+CAA+C;aACtE,CAAC,CAAC;QACP,CAAC;QAED,MAAM,IAAI,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;QACnD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC;oBACR,KAAK,EAAE,SAAS;oBAChB,OAAO,EAAE,GAAG,QAAQ,oCAAoC,GAAG,kBAAkB;iBAChF,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO;QACH,OAAO,EAAE,KAAK,CAAC,MAAM;QACrB,MAAM;KACT,CAAC;AACN,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Config, ProjectProfile } from '../utils/types.js';
2
+ import type { ValidationIssue } from './instructions.js';
3
+ export declare function createConfig(projectName: string, profile: ProjectProfile, aiToolChoices?: {
4
+ copilot?: boolean;
5
+ claude?: boolean;
6
+ cursor?: boolean;
7
+ }): Config;
8
+ export declare function loadConfig(rootPath: string): Config | null;
9
+ export declare function saveConfig(rootPath: string, config: Config): void;
10
+ export declare function getConfigPath(rootPath: string): string;
11
+ export declare function validateConfigSchema(config: Config | null): ValidationIssue[];
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/validators/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAqCzD,wBAAgB,YAAY,CACxB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,EACvB,aAAa,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1E,MAAM,CAyBR;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY1D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAIjE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,eAAe,EAAE,CAoC7E"}
@@ -0,0 +1,114 @@
1
+ import { fsUtils } from '../utils/fs.js';
2
+ import { parse, stringify } from 'yaml';
3
+ import path from 'path';
4
+ const DEFAULT_CONFIG = {
5
+ version: 1,
6
+ project: {
7
+ name: 'my-project',
8
+ language: 'typescript',
9
+ framework: 'react',
10
+ packageManager: 'npm',
11
+ monorepo: false,
12
+ },
13
+ adapters: {
14
+ copilot: {
15
+ enabled: true,
16
+ instructionsMode: 'concatenated',
17
+ },
18
+ claude: {
19
+ enabled: true,
20
+ instructionsMode: 'concatenated',
21
+ },
22
+ cursor: {
23
+ enabled: true,
24
+ instructionsMode: 'individual',
25
+ },
26
+ },
27
+ sync: {
28
+ autoSync: false,
29
+ warnManualEdits: true,
30
+ },
31
+ tasks: {
32
+ idPrefix: 'TASK-',
33
+ activeDir: 'active',
34
+ doneDir: 'done',
35
+ },
36
+ language: 'en',
37
+ };
38
+ export function createConfig(projectName, profile, aiToolChoices) {
39
+ return {
40
+ ...DEFAULT_CONFIG,
41
+ project: {
42
+ name: projectName,
43
+ language: profile.language,
44
+ framework: profile.framework,
45
+ packageManager: profile.packageManager,
46
+ monorepo: profile.monorepo,
47
+ },
48
+ adapters: {
49
+ copilot: {
50
+ enabled: aiToolChoices?.copilot ?? true,
51
+ instructionsMode: 'concatenated',
52
+ },
53
+ claude: {
54
+ enabled: aiToolChoices?.claude ?? true,
55
+ instructionsMode: 'concatenated',
56
+ },
57
+ cursor: {
58
+ enabled: aiToolChoices?.cursor ?? true,
59
+ instructionsMode: 'individual',
60
+ },
61
+ },
62
+ };
63
+ }
64
+ export function loadConfig(rootPath) {
65
+ const configPath = path.join(rootPath, 'ai', 'config.yml');
66
+ if (!fsUtils.exists(configPath)) {
67
+ return null;
68
+ }
69
+ try {
70
+ const content = fsUtils.readFile(configPath);
71
+ return parse(content);
72
+ }
73
+ catch (e) {
74
+ throw new Error(`Failed to parse config: ${e}`);
75
+ }
76
+ }
77
+ export function saveConfig(rootPath, config) {
78
+ const configPath = path.join(rootPath, 'ai', 'config.yml');
79
+ const yaml = stringify(config);
80
+ fsUtils.writeFile(configPath, yaml);
81
+ }
82
+ export function getConfigPath(rootPath) {
83
+ return path.join(rootPath, 'ai', 'config.yml');
84
+ }
85
+ export function validateConfigSchema(config) {
86
+ const issues = [];
87
+ if (!config) {
88
+ issues.push({
89
+ level: 'error',
90
+ message: 'ai/config.yml is missing or invalid YAML.',
91
+ });
92
+ return issues;
93
+ }
94
+ if (typeof config.version !== 'number') {
95
+ issues.push({ level: 'error', message: 'ai/config.yml: version must be a number.' });
96
+ }
97
+ if (!config.project?.name) {
98
+ issues.push({ level: 'error', message: 'ai/config.yml: project.name is required.' });
99
+ }
100
+ if (!config.project?.language) {
101
+ issues.push({ level: 'error', message: 'ai/config.yml: project.language is required.' });
102
+ }
103
+ if (!config.adapters) {
104
+ issues.push({ level: 'error', message: 'ai/config.yml: adapters section is required.' });
105
+ }
106
+ if (!config.sync) {
107
+ issues.push({ level: 'error', message: 'ai/config.yml: sync section is required.' });
108
+ }
109
+ if (!config.tasks) {
110
+ issues.push({ level: 'error', message: 'ai/config.yml: tasks section is required.' });
111
+ }
112
+ return issues;
113
+ }
114
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/validators/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface ValidationIssue {
2
+ level: 'error' | 'warning';
3
+ message: string;
4
+ }
5
+ export interface ValidationSummary {
6
+ checked: number;
7
+ issues: ValidationIssue[];
8
+ }
9
+ export declare function validateInstructions(rootPath: string): ValidationSummary;
10
+ //# sourceMappingURL=instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/validators/instructions.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAmCxE"}
@@ -0,0 +1,34 @@
1
+ import path from 'path';
2
+ import { fsUtils } from '../utils/fs.js';
3
+ export function validateInstructions(rootPath) {
4
+ const instructionsDir = path.join(rootPath, 'ai', 'instructions');
5
+ const files = fsUtils.listFiles(instructionsDir).filter((file) => file.endsWith('.instructions.md'));
6
+ const issues = [];
7
+ for (const filePath of files) {
8
+ const fileName = path.basename(filePath);
9
+ const content = fsUtils.readFile(filePath);
10
+ if (!fileName.match(/^[a-z0-9-]+\.instructions\.md$/)) {
11
+ issues.push({
12
+ level: 'warning',
13
+ message: `Instruction file name should be kebab-case: ${fileName}`,
14
+ });
15
+ }
16
+ if (!content.trim().startsWith('# ')) {
17
+ issues.push({
18
+ level: 'error',
19
+ message: `${fileName} must start with a level-1 heading (# Title).`,
20
+ });
21
+ }
22
+ if (!content.includes('\n## ')) {
23
+ issues.push({
24
+ level: 'warning',
25
+ message: `${fileName} should include at least one section heading (## ...).`,
26
+ });
27
+ }
28
+ }
29
+ return {
30
+ checked: files.length,
31
+ issues,
32
+ };
33
+ }
34
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/validators/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAYzC,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACjD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACrG,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,+CAA+C,QAAQ,EAAE;aACrE,CAAC,CAAC;QACP,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,GAAG,QAAQ,+CAA+C;aACtE,CAAC,CAAC;QACP,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,GAAG,QAAQ,wDAAwD;aAC/E,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO;QACH,OAAO,EAAE,KAAK,CAAC,MAAM;QACrB,MAAM;KACT,CAAC;AACN,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Config } from '../utils/types.js';
2
+ import type { ValidationIssue } from './instructions.js';
3
+ export interface SyncState {
4
+ lastSyncAt: string;
5
+ }
6
+ export declare function writeSyncState(rootPath: string): void;
7
+ export declare function readSyncState(rootPath: string): SyncState | null;
8
+ export declare function validateSyncStatus(rootPath: string, config: Config): ValidationIssue[];
9
+ //# sourceMappingURL=syncStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncStatus.d.ts","sourceRoot":"","sources":["../../src/validators/syncStatus.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,SAAS;IACtB,UAAU,EAAE,MAAM,CAAC;CACtB;AAuCD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGrD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAehE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,CA6CtF"}
@@ -0,0 +1,92 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { fsUtils } from '../utils/fs.js';
4
+ const SYNC_STATE_PATH = path.join('ai', '.sync-state.json');
5
+ function getMtime(filePath) {
6
+ return fs.statSync(filePath).mtimeMs;
7
+ }
8
+ function listAdapterFiles(rootPath, config) {
9
+ const files = [];
10
+ if (config.adapters.copilot.enabled) {
11
+ const githubDir = path.join(rootPath, '.github');
12
+ files.push(...fsUtils.listFiles(githubDir));
13
+ files.push(...fsUtils.listFiles(path.join(githubDir, 'agents')));
14
+ }
15
+ if (config.adapters.claude.enabled) {
16
+ files.push(...fsUtils.listFiles(path.join(rootPath, '.claude')));
17
+ }
18
+ if (config.adapters.cursor.enabled) {
19
+ files.push(...fsUtils.listFiles(path.join(rootPath, '.cursor', 'rules')));
20
+ }
21
+ return files.filter((filePath) => fsUtils.exists(filePath));
22
+ }
23
+ function listCanonicalFiles(rootPath) {
24
+ return [
25
+ path.join(rootPath, 'ai', 'config.yml'),
26
+ ...fsUtils.listFiles(path.join(rootPath, 'ai', 'instructions')).filter((file) => file.endsWith('.instructions.md')),
27
+ ...fsUtils.listFiles(path.join(rootPath, 'ai', 'agents')).filter((file) => file.endsWith('.agent.md')),
28
+ ...fsUtils.listFiles(path.join(rootPath, 'ai', 'skills')).filter((file) => file.endsWith('.skill.md')),
29
+ ...fsUtils.listFiles(path.join(rootPath, 'ai', 'tasks', 'active')).filter((file) => file.endsWith('.task.md')),
30
+ ...fsUtils.listFiles(path.join(rootPath, 'ai', 'tasks', 'done')).filter((file) => file.endsWith('.task.md')),
31
+ ].filter((filePath) => fsUtils.exists(filePath));
32
+ }
33
+ export function writeSyncState(rootPath) {
34
+ const absolute = path.join(rootPath, SYNC_STATE_PATH);
35
+ fsUtils.writeJSON(absolute, { lastSyncAt: new Date().toISOString() });
36
+ }
37
+ export function readSyncState(rootPath) {
38
+ const absolute = path.join(rootPath, SYNC_STATE_PATH);
39
+ if (!fsUtils.exists(absolute)) {
40
+ return null;
41
+ }
42
+ try {
43
+ const parsed = fsUtils.readJSON(absolute);
44
+ if (typeof parsed.lastSyncAt !== 'string' || !parsed.lastSyncAt) {
45
+ return null;
46
+ }
47
+ return { lastSyncAt: parsed.lastSyncAt };
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ export function validateSyncStatus(rootPath, config) {
54
+ const issues = [];
55
+ const adapterFiles = listAdapterFiles(rootPath, config);
56
+ const canonicalFiles = listCanonicalFiles(rootPath);
57
+ const enabledAdapters = [
58
+ config.adapters.copilot.enabled ? '.github/' : null,
59
+ config.adapters.claude.enabled ? '.claude/' : null,
60
+ config.adapters.cursor.enabled ? '.cursor/' : null,
61
+ ].filter(Boolean);
62
+ if (enabledAdapters.length > 0 && adapterFiles.length === 0) {
63
+ issues.push({
64
+ level: 'warning',
65
+ message: `Sync status: adapters enabled (${enabledAdapters.join(', ')}) but no adapter files were found.`,
66
+ });
67
+ return issues;
68
+ }
69
+ if (adapterFiles.length > 0 && canonicalFiles.length > 0) {
70
+ const newestCanonical = Math.max(...canonicalFiles.map(getMtime));
71
+ const oldestAdapter = Math.min(...adapterFiles.map(getMtime));
72
+ if (newestCanonical > oldestAdapter) {
73
+ issues.push({
74
+ level: 'warning',
75
+ message: 'Sync status: adapter files may be out of date. Run `syntra sync`.',
76
+ });
77
+ }
78
+ }
79
+ const syncState = readSyncState(rootPath);
80
+ if (syncState) {
81
+ const lastSyncMs = Date.parse(syncState.lastSyncAt);
82
+ const manuallyEdited = adapterFiles.some((filePath) => getMtime(filePath) > lastSyncMs + 1000);
83
+ if (manuallyEdited) {
84
+ issues.push({
85
+ level: 'warning',
86
+ message: 'Sync status: adapter files appear manually edited and may be overwritten on next sync.',
87
+ });
88
+ }
89
+ }
90
+ return issues;
91
+ }
92
+ //# sourceMappingURL=syncStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncStatus.js","sourceRoot":"","sources":["../../src/validators/syncStatus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ValidationSummary } from './instructions.js';
2
+ export declare function validateTasks(rootPath: string): ValidationSummary;
3
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/validators/tasks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAoB5E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAiEjE"}