aodw-skill 0.7.3

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 (188) hide show
  1. package/.aodw/01-core/ai-interaction-rules.md +218 -0
  2. package/.aodw/01-core/ai-knowledge-rules.md +302 -0
  3. package/.aodw/01-core/ai-project-overview-rules.md +284 -0
  4. package/.aodw/01-core/aodw-constitution-summary.md +20 -0
  5. package/.aodw/01-core/aodw-constitution.md +419 -0
  6. package/.aodw/01-core/csf-thinking-framework.md +373 -0
  7. package/.aodw/01-core/git-discipline.md +226 -0
  8. package/.aodw/01-core/module-doc-rules.md +90 -0
  9. package/.aodw/02-workflow/aodw-development-stages.md +235 -0
  10. package/.aodw/02-workflow/rt-id-generation-rules.md +267 -0
  11. package/.aodw/02-workflow/rt-manager-summary.md +15 -0
  12. package/.aodw/02-workflow/rt-manager.md +399 -0
  13. package/.aodw/02-workflow/spec-full-profile-summary.md +13 -0
  14. package/.aodw/02-workflow/spec-full-profile.md +391 -0
  15. package/.aodw/02-workflow/spec-lite-profile.md +313 -0
  16. package/.aodw/02-workflow/ui-workflow-rules.md +334 -0
  17. package/.aodw/03-standards/ai-coding-rules-common.md +89 -0
  18. package/.aodw/03-standards/ai-coding-rules.md +370 -0
  19. package/.aodw/03-standards/stacks/java-springboot/ai-coding-rules-backend.md +100 -0
  20. package/.aodw/03-standards/stacks/python-fastapi/ai-coding-rules-backend.md +612 -0
  21. package/.aodw/03-standards/stacks/react-typescript/ai-coding-rules-frontend.md +291 -0
  22. package/.aodw/03-standards/stacks/vue2/ai-coding-rules-frontend.md +97 -0
  23. package/.aodw/03-standards/ui-kit/ui-kit.md +163 -0
  24. package/.aodw/04-auditors/aodw-development-auditor-rules.md +470 -0
  25. package/.aodw/04-auditors/aodw-full-auditor-rules.md +365 -0
  26. package/.aodw/04-auditors/aodw-requirement-auditor-rules.md +408 -0
  27. package/.aodw/05-tooling/ai-tools-init-rules.md +465 -0
  28. package/.aodw/06-project/ai-overview.md +116 -0
  29. package/.aodw/06-project/modules-index.yaml +11 -0
  30. package/.aodw/07-optimization/token-usage-analysis.md +253 -0
  31. package/.aodw/README.md +26 -0
  32. package/.aodw/RELEASE-CHECKLIST.md +144 -0
  33. package/.aodw/config.yaml +2 -0
  34. package/.aodw/manifest.yaml +98 -0
  35. package/.aodw/templates/SOURCE-TO-DISTRIBUTION-GUIDE.md +276 -0
  36. package/.aodw/templates/TEMPLATE-APPLICATION-GUIDE.md +246 -0
  37. package/.aodw/templates/aodw-kernel-loader-template.md +70 -0
  38. package/.aodw/templates/audit-report-template.md +232 -0
  39. package/.aodw/templates/changelog-template.md +16 -0
  40. package/.aodw/templates/checklists/coding-standards-template.md +110 -0
  41. package/.aodw/templates/csf-review-template.md +201 -0
  42. package/.aodw/templates/impact-template.md +17 -0
  43. package/.aodw/templates/invariants-template.md +12 -0
  44. package/.aodw/templates/module-readme-template.md +39 -0
  45. package/.aodw/templates/plan-lite-template.md +11 -0
  46. package/.aodw/templates/rt-decision-template.md +13 -0
  47. package/.aodw/templates/rt-intake-template.md +33 -0
  48. package/.aodw/templates/rt-meta-template.yaml +43 -0
  49. package/.aodw/templates/spec-lite-template.md +17 -0
  50. package/.aodw/templates/tests-template.md +13 -0
  51. package/.aodw/templates/tools-config/README.md +80 -0
  52. package/.aodw/templates/tools-config/backend/black.config.template.toml +6 -0
  53. package/.aodw/templates/tools-config/backend/pre-commit.config.template.yaml +16 -0
  54. package/.aodw/templates/tools-config/backend/ruff.config.template.toml +23 -0
  55. package/.aodw/templates/tools-config/frontend/eslint.config.template.json +113 -0
  56. package/.aodw/templates/tools-config/frontend/prettier.config.template.json +10 -0
  57. package/.aodw/templates/tools-config/frontend/tsconfig.paths.template.json +11 -0
  58. package/.aodw/workflow-guide.md +51 -0
  59. package/AODW_Adapters/README.md +143 -0
  60. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-check.md +7 -0
  61. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-done.md +7 -0
  62. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-full.md +7 -0
  63. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-governance.md +7 -0
  64. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-impact.md +7 -0
  65. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-init.md +7 -0
  66. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-invariants.md +7 -0
  67. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-lite.md +7 -0
  68. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-module.md +7 -0
  69. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-new.md +7 -0
  70. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-open.md +7 -0
  71. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-pause.md +7 -0
  72. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-resume.md +7 -0
  73. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-tests.md +7 -0
  74. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw-upgrade.md +7 -0
  75. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/.agent/rules/aodw.md +35 -0
  76. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-check.md +16 -0
  77. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-done.md +16 -0
  78. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-full.md +14 -0
  79. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-governance.md +13 -0
  80. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-impact.md +13 -0
  81. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-init.md +13 -0
  82. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-invariants.md +13 -0
  83. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-lite.md +14 -0
  84. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-module.md +13 -0
  85. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-new.md +30 -0
  86. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-open.md +10 -0
  87. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-pause.md +12 -0
  88. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-resume.md +12 -0
  89. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-tests.md +13 -0
  90. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw-upgrade.md +12 -0
  91. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/antigravity/global_workflows/aodw.md +18 -0
  92. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/claude/CLAUDE.md +17 -0
  93. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-check.md +30 -0
  94. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-done.md +52 -0
  95. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-full.md +31 -0
  96. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-governance.md +34 -0
  97. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-impact.md +25 -0
  98. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-init.md +75 -0
  99. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-invariants.md +29 -0
  100. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-lite.md +23 -0
  101. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-module.md +24 -0
  102. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-new.md +70 -0
  103. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-open.md +19 -0
  104. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-pause.md +19 -0
  105. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-resume.md +20 -0
  106. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-tests.md +26 -0
  107. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw-upgrade.md +27 -0
  108. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/aodw.md +69 -0
  109. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/deploypromote.md +20 -0
  110. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/commands/featuretotester.md +32 -0
  111. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/deploy/feature_to_master_push_test_local.sh +390 -0
  112. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/deploy/promote_only.sh +210 -0
  113. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/deploy/rollback_prod.sh +99 -0
  114. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/cursor/.cursor/rules/aodw.mdc +26 -0
  115. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-check.md +29 -0
  116. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-done.md +52 -0
  117. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-full.md +30 -0
  118. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-governance.md +33 -0
  119. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-impact.md +24 -0
  120. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-init.md +75 -0
  121. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-invariants.md +28 -0
  122. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-lite.md +22 -0
  123. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-module.md +23 -0
  124. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-new.md +92 -0
  125. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-open.md +18 -0
  126. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-pause.md +18 -0
  127. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-resume.md +19 -0
  128. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-tests.md +25 -0
  129. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw-upgrade.md +26 -0
  130. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/.agent/rules/aodw.md +68 -0
  131. package/AODW_Adapters/_backup/v3.1.0-pre-refactor/gemini/GEMINI.md +17 -0
  132. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-analyze.md +15 -0
  133. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-complete.md +15 -0
  134. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-control.md +14 -0
  135. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-decide.md +16 -0
  136. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-governance.md +7 -0
  137. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-implement.md +16 -0
  138. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-init.md +7 -0
  139. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-intake.md +15 -0
  140. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-open.md +7 -0
  141. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-simplified.md +107 -0
  142. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/.agent/rules/aodw-verify.md +14 -0
  143. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw-analyze.md +24 -0
  144. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw-complete.md +23 -0
  145. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw-control.md +21 -0
  146. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw-decide.md +26 -0
  147. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw-governance.md +13 -0
  148. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw-implement.md +21 -0
  149. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw-init.md +13 -0
  150. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw-intake.md +28 -0
  151. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw-open.md +10 -0
  152. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw-verify.md +20 -0
  153. package/AODW_Adapters/_backup/v4.0.0-simplified/antigravity/global_workflows/aodw.md +18 -0
  154. package/AODW_Adapters/antigravity/.agent/rules/aodw.md +74 -0
  155. package/AODW_Adapters/claude/CLAUDE.md +70 -0
  156. package/AODW_Adapters/cursor/.cursor/commands/README.md +37 -0
  157. package/AODW_Adapters/cursor/.cursor/rules/aodw.mdc +77 -0
  158. package/AODW_Adapters/gemini/.agent/rules/aodw-analyze.md +15 -0
  159. package/AODW_Adapters/gemini/.agent/rules/aodw-complete.md +15 -0
  160. package/AODW_Adapters/gemini/.agent/rules/aodw-control.md +14 -0
  161. package/AODW_Adapters/gemini/.agent/rules/aodw-decide.md +16 -0
  162. package/AODW_Adapters/gemini/.agent/rules/aodw-governance.md +33 -0
  163. package/AODW_Adapters/gemini/.agent/rules/aodw-implement.md +16 -0
  164. package/AODW_Adapters/gemini/.agent/rules/aodw-init.md +75 -0
  165. package/AODW_Adapters/gemini/.agent/rules/aodw-intake.md +15 -0
  166. package/AODW_Adapters/gemini/.agent/rules/aodw-open.md +18 -0
  167. package/AODW_Adapters/gemini/.agent/rules/aodw-verify.md +14 -0
  168. package/AODW_Adapters/gemini/.agent/rules/aodw.md +70 -0
  169. package/AODW_Adapters/gemini/GEMINI.md +17 -0
  170. package/AODW_Adapters/general/.github/copilot-instructions.md +34 -0
  171. package/AODW_Adapters/general/AGENTS.md +70 -0
  172. package/README.md +118 -0
  173. package/bin/aodw.js +627 -0
  174. package/bin/commands/init-overview.js +801 -0
  175. package/bin/commands/init-tools.js +811 -0
  176. package/bin/commands/new.js +235 -0
  177. package/bin/commands/serve.js +79 -0
  178. package/bin/processors/index.js +109 -0
  179. package/bin/update-adapters-from-template.js +89 -0
  180. package/bin/utils/config.js +56 -0
  181. package/docs/README.md +26 -0
  182. package/docs/adapter-evaluation.md +55 -0
  183. package/docs/backend-guidelines.md +335 -0
  184. package/docs/frontend-guidelines.md +266 -0
  185. package/docs/installation-variants.md +88 -0
  186. package/docs/migration-guide-0.2.0.md +250 -0
  187. package/docs/platform-matrix.md +83 -0
  188. package/package.json +40 -0
@@ -0,0 +1,235 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import http from 'http';
4
+ import https from 'https';
5
+ import { URL } from 'url';
6
+ import inquirer from 'inquirer';
7
+ import chalk from 'chalk';
8
+ import { getProjectConfig, getUserConfig } from '../utils/config.js';
9
+
10
+ function getProjectName() {
11
+ // 1. Try .aodw/project.yaml
12
+ const projectConfig = getProjectConfig();
13
+ if (projectConfig.project_name) return projectConfig.project_name;
14
+
15
+ // 2. Try package.json
16
+ try {
17
+ const pkgPath = path.join(process.cwd(), 'package.json');
18
+ if (fs.existsSync(pkgPath)) {
19
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
20
+ if (pkg.name) return pkg.name;
21
+ }
22
+ } catch (e) {
23
+ // ignore
24
+ }
25
+ return path.basename(process.cwd());
26
+ }
27
+
28
+ function fetchIdFromServer(serverUrl, project) {
29
+ return new Promise((resolve, reject) => {
30
+ const url = new URL('/api/next-id', serverUrl);
31
+ url.searchParams.set('project', project);
32
+
33
+ const client = url.protocol === 'https:' ? https : http;
34
+
35
+ const req = client.get(url.toString(), (res) => {
36
+ if (res.statusCode !== 200) {
37
+ reject(new Error(`Server returned status ${res.statusCode}`));
38
+ return;
39
+ }
40
+
41
+ let data = '';
42
+ res.on('data', (chunk) => data += chunk);
43
+ res.on('end', () => {
44
+ try {
45
+ const json = JSON.parse(data);
46
+ resolve(json.id);
47
+ } catch (e) {
48
+ reject(e);
49
+ }
50
+ });
51
+ });
52
+
53
+ req.on('error', (e) => reject(e));
54
+ });
55
+ }
56
+
57
+ function getLocalMaxSeq() {
58
+ const rtDir = path.join(process.cwd(), 'RT');
59
+ if (!fs.existsSync(rtDir)) return 0;
60
+
61
+ const dirs = fs.readdirSync(rtDir);
62
+ let maxSeq = 0;
63
+
64
+ for (const dir of dirs) {
65
+ const match = dir.match(/^RT-(\d+)$/);
66
+ if (match) {
67
+ const seq = parseInt(match[1], 10);
68
+ if (seq > maxSeq) maxSeq = seq;
69
+ }
70
+ }
71
+
72
+ return maxSeq;
73
+ }
74
+
75
+ function getLocalNextId() {
76
+ const maxSeq = getLocalMaxSeq();
77
+ return `RT-${String(maxSeq + 1).padStart(3, '0')}`;
78
+ }
79
+
80
+ function syncIdToServer(serverUrl, project, seq) {
81
+ return new Promise((resolve, reject) => {
82
+ const url = new URL('/api/sync-id', serverUrl);
83
+ url.searchParams.set('project', project);
84
+ url.searchParams.set('seq', seq.toString());
85
+
86
+ const client = url.protocol === 'https:' ? https : http;
87
+
88
+ const req = client.request(url.toString(), { method: 'POST' }, (res) => {
89
+ if (res.statusCode === 200) {
90
+ resolve(true);
91
+ } else {
92
+ reject(new Error(`Server returned status ${res.statusCode}`));
93
+ }
94
+ });
95
+
96
+ req.on('error', (e) => reject(e));
97
+ req.end();
98
+ });
99
+ }
100
+
101
+
102
+ export async function createNewRT(options) {
103
+ const userConfig = getUserConfig();
104
+
105
+ // Determine Server URL: Flag > Config > Env Var
106
+ const serverUrl = options.server || userConfig.server_url || process.env.AODW_ID_SERVER;
107
+
108
+ // Determine Project Name: Flag > Config/Package/Dir
109
+ const project = options.project || getProjectName();
110
+
111
+ let title = options.title;
112
+
113
+ if (!title) {
114
+ const answers = await inquirer.prompt([{
115
+ type: 'input',
116
+ name: 'title',
117
+ message: 'Enter the title for this Request Ticket (RT):',
118
+ validate: input => input.trim().length > 0 ? true : 'Title is required'
119
+ }]);
120
+ title = answers.title;
121
+ }
122
+
123
+ let id;
124
+ // Check if user has configured collaborative mode
125
+ const isCollaborativeMode = userConfig.mode === 'collaborative';
126
+
127
+ if (isCollaborativeMode) {
128
+ // In collaborative mode, server URL is required
129
+ if (!serverUrl || serverUrl.trim() === '') {
130
+ console.error(chalk.red('Error: Collaborative mode requires a server URL.'));
131
+ console.error(chalk.yellow('Please configure the server URL by running: aodw config'));
132
+ console.error(chalk.yellow('Or set the AODW_ID_SERVER environment variable.'));
133
+ process.exit(1);
134
+ }
135
+
136
+ try {
137
+ console.log(chalk.blue(`Fetching ID from server (${serverUrl})...`));
138
+ const serverId = await fetchIdFromServer(serverUrl, project);
139
+ const serverSeq = parseInt(serverId.replace('RT-', ''), 10);
140
+
141
+ // Get local max ID and compare
142
+ const localMaxSeq = getLocalMaxSeq();
143
+
144
+ if (serverSeq <= localMaxSeq) {
145
+ // Server ID is outdated, use local max + 1
146
+ const finalSeq = localMaxSeq + 1;
147
+ id = `RT-${String(finalSeq).padStart(3, '0')}`;
148
+ console.log(chalk.yellow(`⚠ Server ID (${serverId}) ≤ local max (RT-${String(localMaxSeq).padStart(3, '0')})`));
149
+ console.log(chalk.green(`Using local ID: ${id}`));
150
+
151
+ // Sync to server
152
+ try {
153
+ await syncIdToServer(serverUrl, project, finalSeq);
154
+ console.log(chalk.blue(`✔ Synced ID to server: ${id}`));
155
+ } catch (syncErr) {
156
+ console.warn(chalk.yellow(`⚠ Failed to sync ID to server: ${syncErr.message}`));
157
+ console.warn(chalk.yellow(' The server may not support sync-id API, but RT creation will continue.'));
158
+ }
159
+ } else {
160
+ id = serverId;
161
+ console.log(chalk.green(`Obtained ID: ${id}`));
162
+ }
163
+ } catch (e) {
164
+ console.error(chalk.red(`Failed to fetch ID from server: ${e.message}`));
165
+ const { useLocal } = await inquirer.prompt([{
166
+ type: 'confirm',
167
+ name: 'useLocal',
168
+ message: 'Do you want to fall back to local ID generation? (Warning: Risk of collision)',
169
+ default: false
170
+ }]);
171
+ if (!useLocal) process.exit(1);
172
+ id = getLocalNextId();
173
+ }
174
+ } else {
175
+ // Independent mode: always use local generation, ignore server_url
176
+ // This ensures that when user chooses independent mode, no network request is made
177
+ id = getLocalNextId();
178
+ console.log(chalk.yellow(`Using local ID generation: ${id}`));
179
+ if (serverUrl) {
180
+ console.log(chalk.gray(`Note: server_url is configured but ignored in independent mode`));
181
+ }
182
+ }
183
+
184
+ // Create Directory
185
+ const rtPath = path.join(process.cwd(), 'RT', id);
186
+ if (fs.existsSync(rtPath)) {
187
+ console.error(chalk.red(`Error: Directory ${rtPath} already exists!`));
188
+ process.exit(1);
189
+ }
190
+ fs.ensureDirSync(rtPath);
191
+
192
+ // Create meta.yaml
193
+ const now = new Date().toISOString();
194
+ const metaContent = `id: ${id}
195
+ title: "${title}"
196
+ type: Feature # Default, update after intake
197
+ profile: Spec-Lite # Default, update after decision
198
+ status: created
199
+ created_at: "${now}"
200
+ updated_at: "${now}"
201
+ owner: "${process.env.USER || 'unknown'}"
202
+ modules: []
203
+ `;
204
+ fs.writeFileSync(path.join(rtPath, 'meta.yaml'), metaContent);
205
+
206
+ // Create intake.md
207
+ const intakeContent = `# Intake: ${title}
208
+
209
+ ## 1. 原始需求
210
+ > ${title}
211
+
212
+ ## 2. 澄清问题
213
+ (AI 将在此处添加澄清问题)
214
+
215
+ ## 3. 风险与影响
216
+ - 类型: Feature
217
+ - 风险: Low
218
+ `;
219
+ fs.writeFileSync(path.join(rtPath, 'intake.md'), intakeContent);
220
+
221
+ // Create decision.md
222
+ const decisionContent = `# Decision: ${id}
223
+
224
+ ## Profile Selection
225
+ - [ ] Spec-Lite (Recommended for most tasks)
226
+ - [ ] Spec-Full (For complex/risky tasks)
227
+
228
+ ## Rationale
229
+ (AI will fill this)
230
+ `;
231
+ fs.writeFileSync(path.join(rtPath, 'decision.md'), decisionContent);
232
+
233
+ console.log(chalk.green(`\n✔ Created RT ${id} at ./RT/${id}`));
234
+ console.log(chalk.white(`Next step: Open ./RT/${id}/intake.md and start the intake process.`));
235
+ }
@@ -0,0 +1,79 @@
1
+ import http from 'http';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { URL } from 'url';
5
+
6
+ const STORE_FILE = process.env.AODW_ID_STORE_PATH || path.join(process.cwd(), 'aodw-id-store.json');
7
+ const PORT = process.env.PORT || 2005;
8
+
9
+ function loadStore() {
10
+ if (fs.existsSync(STORE_FILE)) {
11
+ try {
12
+ return JSON.parse(fs.readFileSync(STORE_FILE, 'utf8'));
13
+ } catch (e) {
14
+ console.error('Error reading store file:', e);
15
+ return {};
16
+ }
17
+ }
18
+ return {};
19
+ }
20
+
21
+ function saveStore(data) {
22
+ fs.writeFileSync(STORE_FILE, JSON.stringify(data, null, 2));
23
+ }
24
+
25
+ export async function serve(options) {
26
+ const port = options.port || PORT;
27
+
28
+ const server = http.createServer((req, res) => {
29
+ // CORS headers
30
+ res.setHeader('Access-Control-Allow-Origin', '*');
31
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
32
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
33
+
34
+ if (req.method === 'OPTIONS') {
35
+ res.writeHead(204);
36
+ res.end();
37
+ return;
38
+ }
39
+
40
+ const url = new URL(req.url, `http://${req.headers.host}`);
41
+
42
+ if (req.method === 'GET' && url.pathname === '/api/health') {
43
+ res.writeHead(200, { 'Content-Type': 'application/json' });
44
+ res.end(JSON.stringify({ status: 'ok' }));
45
+ return;
46
+ }
47
+
48
+ if (req.method === 'GET' && url.pathname === '/api/next-id') {
49
+ const project = url.searchParams.get('project') || 'default';
50
+
51
+ // Atomic-like operation (Node.js is single threaded for this)
52
+ const store = loadStore();
53
+
54
+ if (!store[project]) {
55
+ store[project] = 0;
56
+ }
57
+
58
+ store[project]++;
59
+ saveStore(store);
60
+
61
+ const seq = String(store[project]).padStart(3, '0');
62
+ const id = `RT-${seq}`;
63
+
64
+ console.log(`[${new Date().toISOString()}] Issued ${id} for project '${project}'`);
65
+
66
+ res.writeHead(200, { 'Content-Type': 'application/json' });
67
+ res.end(JSON.stringify({ id, project }));
68
+ return;
69
+ }
70
+
71
+ res.writeHead(404, { 'Content-Type': 'application/json' });
72
+ res.end(JSON.stringify({ error: 'Not Found' }));
73
+ });
74
+
75
+ server.listen(port, () => {
76
+ console.log(`AODW ID Server running on port ${port}`);
77
+ console.log(`Store file: ${STORE_FILE}`);
78
+ });
79
+ }
@@ -0,0 +1,109 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import os from 'os';
4
+
5
+ export class BaseProcessor {
6
+ constructor(sourcePath, targetPath) {
7
+ this.sourcePath = sourcePath;
8
+ this.targetPath = targetPath;
9
+ }
10
+
11
+ async process() {
12
+ const content = await fs.readFile(this.sourcePath, 'utf8');
13
+ const processed = this.transform(content);
14
+ await fs.ensureDir(path.dirname(this.targetPath));
15
+ await fs.writeFile(this.targetPath, processed, 'utf8');
16
+ }
17
+
18
+ transform(content) {
19
+ return content;
20
+ }
21
+
22
+ // Helper to inject or replace frontmatter
23
+ injectFrontmatter(content, key, value) {
24
+ const frontmatterRegex = /^---\n([\s\S]*?)\n---/;
25
+ const match = content.match(frontmatterRegex);
26
+
27
+ if (match) {
28
+ let fm = match[1];
29
+ if (!fm.includes(`${key}:`)) {
30
+ fm += `\n${key}: ${value}`;
31
+ return content.replace(frontmatterRegex, `---\n${fm}\n---`);
32
+ }
33
+ return content; // Key already exists, don't overwrite
34
+ } else {
35
+ return `---\n${key}: ${value}\n---\n\n${content}`;
36
+ }
37
+ }
38
+ }
39
+
40
+ export class AntigravityProcessor extends BaseProcessor {
41
+ transform(content) {
42
+ // Replace template placeholders
43
+ let processed = content.replace(/\{\{REF_PREFIX\}\}/g, '');
44
+
45
+ // For Rules: Inject trigger: always_on (for kernel loader)
46
+ if (this.targetPath.includes('.agent/rules') && /aodw(-next)?\.md$/.test(this.targetPath)) {
47
+ processed = this.injectFrontmatter(processed, 'trigger', 'always_on');
48
+ } else if (this.targetPath.includes('.agent/rules')) {
49
+ // For other rules: Inject trigger: model_decision
50
+ processed = this.injectFrontmatter(processed, 'trigger', 'model_decision');
51
+ }
52
+ return processed;
53
+ }
54
+ }
55
+
56
+ export class CursorProcessor extends BaseProcessor {
57
+ transform(content) {
58
+ // Replace template placeholders: @ for Cursor
59
+ let processed = content.replace(/\{\{REF_PREFIX\}\}/g, '@');
60
+
61
+ // For Rules (.mdc): Inject globs and alwaysApply
62
+ if (this.targetPath.endsWith('.mdc')) {
63
+ processed = this.injectFrontmatter(processed, 'globs', '*');
64
+ processed = this.injectFrontmatter(processed, 'alwaysApply', 'true');
65
+ processed = this.injectFrontmatter(processed, 'description', 'AI 编排开发工作流 (AODW) — Kernel Loader');
66
+ processed = this.injectFrontmatter(processed, 'tags', 'aodw, kernel');
67
+ }
68
+ return processed;
69
+ }
70
+ }
71
+
72
+ export class CopilotProcessor extends BaseProcessor {
73
+ transform(content) {
74
+ // For Prompts: Inject model and mode
75
+ if (this.targetPath.endsWith('.prompt.md')) {
76
+ let newContent = this.injectFrontmatter(content, 'model', 'gpt-4o');
77
+ newContent = this.injectFrontmatter(newContent, 'mode', 'chat');
78
+ return newContent;
79
+ }
80
+ return content;
81
+ }
82
+ }
83
+
84
+ export class ClaudeProcessor extends BaseProcessor {
85
+ transform(content) {
86
+ // Replace template placeholders: empty for Claude
87
+ let processed = content.replace(/\{\{REF_PREFIX\}\}/g, '');
88
+ // Claude uses standard markdown, no frontmatter needed
89
+ return processed;
90
+ }
91
+ }
92
+
93
+ export class GeminiProcessor extends BaseProcessor {
94
+ transform(content) {
95
+ // Replace template placeholders: empty for Gemini
96
+ let processed = content.replace(/\{\{REF_PREFIX\}\}/g, '');
97
+ // Gemini uses standard markdown, no frontmatter needed
98
+ return processed;
99
+ }
100
+ }
101
+
102
+ export class GeneralProcessor extends BaseProcessor {
103
+ transform(content) {
104
+ // Replace template placeholders: empty for General
105
+ let processed = content.replace(/\{\{REF_PREFIX\}\}/g, '');
106
+ // General uses standard markdown, no frontmatter needed
107
+ return processed;
108
+ }
109
+ }
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * 从模板更新适配器文件
5
+ *
6
+ * 这个脚本用于从统一模板 `.aodw/templates/aodw-kernel-loader-template.md`
7
+ * 生成各个平台的适配器文件到 `templates/AODW_Adapters/` 目录
8
+ *
9
+ * 使用方法:
10
+ * node cli/bin/update-adapters-from-template.js
11
+ */
12
+
13
+ import fs from 'fs-extra';
14
+ import path from 'path';
15
+ import { fileURLToPath } from 'url';
16
+ import {
17
+ AntigravityProcessor,
18
+ CursorProcessor,
19
+ ClaudeProcessor,
20
+ GeminiProcessor,
21
+ GeneralProcessor
22
+ } from './processors/index.js';
23
+
24
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
25
+ const ROOT_DIR = path.join(__dirname, '../..');
26
+
27
+ // 模板路径
28
+ const SOURCE_TEMPLATE = path.join(ROOT_DIR, '.aodw/templates/aodw-kernel-loader-template.md');
29
+
30
+ // 目标适配器路径
31
+ const TARGET_ADAPTERS = path.join(ROOT_DIR, 'templates/AODW_Adapters');
32
+
33
+ // 安装文件(使用 Processor)
34
+ async function installFile(source, target, processorClass) {
35
+ const processor = new processorClass(source, target);
36
+ await processor.process();
37
+ console.log(` ✓ Generated: ${path.relative(ROOT_DIR, target)}`);
38
+ }
39
+
40
+ async function updateAdapters() {
41
+ console.log('🔄 Updating adapters from template...\n');
42
+
43
+ // 检查模板是否存在
44
+ if (!fs.existsSync(SOURCE_TEMPLATE)) {
45
+ console.error(`❌ Template not found: ${SOURCE_TEMPLATE}`);
46
+ process.exit(1);
47
+ }
48
+
49
+ console.log(`📄 Source template: ${path.relative(ROOT_DIR, SOURCE_TEMPLATE)}\n`);
50
+
51
+ // Antigravity
52
+ console.log('📦 Updating Antigravity adapter...');
53
+ const antigravityTarget = path.join(TARGET_ADAPTERS, 'antigravity/.agent/rules/aodw.md');
54
+ await fs.ensureDir(path.dirname(antigravityTarget));
55
+ await installFile(SOURCE_TEMPLATE, antigravityTarget, AntigravityProcessor);
56
+
57
+ // Cursor
58
+ console.log('\n📦 Updating Cursor adapter...');
59
+ const cursorTarget = path.join(TARGET_ADAPTERS, 'cursor/.cursor/rules/aodw.mdc');
60
+ await fs.ensureDir(path.dirname(cursorTarget));
61
+ await installFile(SOURCE_TEMPLATE, cursorTarget, CursorProcessor);
62
+
63
+ // Claude
64
+ console.log('\n📦 Updating Claude adapter...');
65
+ const claudeTarget = path.join(TARGET_ADAPTERS, 'claude/CLAUDE.md');
66
+ await fs.ensureDir(path.dirname(claudeTarget));
67
+ await installFile(SOURCE_TEMPLATE, claudeTarget, ClaudeProcessor);
68
+
69
+ // Gemini
70
+ console.log('\n📦 Updating Gemini adapter...');
71
+ const geminiTarget = path.join(TARGET_ADAPTERS, 'gemini/.agent/rules/aodw.md');
72
+ await fs.ensureDir(path.dirname(geminiTarget));
73
+ await installFile(SOURCE_TEMPLATE, geminiTarget, GeminiProcessor);
74
+
75
+ // General
76
+ console.log('\n📦 Updating General adapter...');
77
+ const generalTarget = path.join(TARGET_ADAPTERS, 'general/AGENTS.md');
78
+ await fs.ensureDir(path.dirname(generalTarget));
79
+ await installFile(SOURCE_TEMPLATE, generalTarget, GeneralProcessor);
80
+
81
+ console.log('\n✅ All adapters updated successfully!');
82
+ console.log('\n📝 Note: These files are fallback files for CLI installation.');
83
+ console.log(' CLI will use the template directly if available.');
84
+ }
85
+
86
+ updateAdapters().catch(err => {
87
+ console.error('❌ Error:', err);
88
+ process.exit(1);
89
+ });
@@ -0,0 +1,56 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import yaml from 'js-yaml';
4
+
5
+ function getCoreDir() {
6
+ return process.env.AODW_CORE_DIR || '.aodw';
7
+ }
8
+
9
+ function getProjectConfigFile() {
10
+ return path.join(getCoreDir(), 'project.yaml');
11
+ }
12
+
13
+ function getUserConfigFile() {
14
+ return path.join(getCoreDir(), 'config.yaml');
15
+ }
16
+
17
+ export function getProjectConfig() {
18
+ const filepath = path.join(process.cwd(), getProjectConfigFile());
19
+ if (fs.existsSync(filepath)) {
20
+ try {
21
+ return yaml.load(fs.readFileSync(filepath, 'utf8')) || {};
22
+ } catch (e) {
23
+ return {};
24
+ }
25
+ }
26
+ return {};
27
+ }
28
+
29
+ export function getUserConfig() {
30
+ const filepath = path.join(process.cwd(), getUserConfigFile());
31
+ if (fs.existsSync(filepath)) {
32
+ try {
33
+ return yaml.load(fs.readFileSync(filepath, 'utf8')) || {};
34
+ } catch (e) {
35
+ return {};
36
+ }
37
+ }
38
+ return {};
39
+ }
40
+
41
+ export async function saveProjectConfig(config) {
42
+ const filepath = path.join(process.cwd(), getProjectConfigFile());
43
+ await fs.ensureDir(path.dirname(filepath));
44
+ // Read existing to preserve other fields if any
45
+ const existing = getProjectConfig();
46
+ const newConfig = { ...existing, ...config };
47
+ await fs.writeFile(filepath, yaml.dump(newConfig), 'utf8');
48
+ }
49
+
50
+ export async function saveUserConfig(config) {
51
+ const filepath = path.join(process.cwd(), getUserConfigFile());
52
+ await fs.ensureDir(path.dirname(filepath));
53
+ const existing = getUserConfig();
54
+ const newConfig = { ...existing, ...config };
55
+ await fs.writeFile(filepath, yaml.dump(newConfig), 'utf8');
56
+ }
package/docs/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # AODW 用户文档
2
+
3
+ 本目录包含 **AODW 用户文档**,这些文档会随 CLI 一起发布,安装到用户项目的 `.aodw/docs/` 目录。
4
+
5
+ ## 📚 文档列表
6
+
7
+ ### 平台评估与选择
8
+ - **adapter-evaluation.md** - 各平台能力评估和对比
9
+ - **platform-matrix.md** - 平台功能矩阵
10
+
11
+ ### 迁移与升级
12
+ - **migration-guide-0.2.0.md** - v0.1.x → v0.2.0 迁移指南
13
+ - **installation-variants.md** - legacy 与 next 双版本安装方案
14
+
15
+ ---
16
+
17
+ ## 🔧 开发者文档
18
+
19
+ 如果你是 AODW 维护者或想深入了解架构,请查看 `/dev-docs/` 目录:
20
+
21
+ - 架构分析
22
+ - 实施计划
23
+ - 完成报告
24
+ - 跨平台配置指南
25
+
26
+ 这些文档不会被发布到 NPM 包中。
@@ -0,0 +1,55 @@
1
+ # AODW 平台适配器能力评估报告
2
+
3
+ ## 1. 评估目标
4
+ 验证在 RT-010 实施“轻量级引用模式”后,各开发平台(Cursor, Claude, Gemini, General)是否仍能完整执行 AODW 流程(Intake -> Decision -> Spec -> Plan -> Execution -> Verification)。
5
+
6
+ ## 2. Cursor (aodw.mdc)
7
+ - **机制**: `.cursor/rules` (Globs: `*`, AlwaysApply: `true`)
8
+ - **引用方式**: 显式列出 `@.aodw/xxx.md`。
9
+ - **执行逻辑**:
10
+ - Cursor 的 Composer/Agent 模式在看到 `@file` 语法时,通常会尝试解析或提示用户引用。
11
+ - 即使不自动展开,`aodw.mdc` 中的指令 "You MUST read..." 会促使具备文件读取工具(如 `grep`, `read_file`)的 Agent 主动获取内容。
12
+ - **覆盖度**: **高**。
13
+ - Cursor 具备强大的工具调用能力,"引用模式"非常适合它。它不需要将所有规则塞入 System Prompt,而是按需读取。
14
+ - **潜在风险**: 如果用户使用的是不支持工具的旧版 Cursor 模型,或者禁用了文件读取,AI 可能无法获取核心规则。
15
+ - **结论**: **完全可行**,且更优(节省上下文)。
16
+
17
+ ## 3. Claude (CLAUDE.md)
18
+ - **机制**: Claude Projects (Project Instructions + Project Knowledge)。
19
+ - **引用方式**: `CLAUDE.md` 作为 Instructions,核心规则文件作为 Project Knowledge。
20
+ - **执行逻辑**:
21
+ - 用户必须将 `.aodw/` 目录下的核心文件添加到 "Project Knowledge" 中。
22
+ - 只要文件在 Knowledge 中,Claude 就能通过 RAG 或长上下文完美检索到。
23
+ - `CLAUDE.md` 中的 "Required Reading" 清单起到了索引的作用,引导 Claude 去 Knowledge 中查找。
24
+ - **覆盖度**: **高** (前提是配置正确)。
25
+ - **潜在风险**: 用户忘记将 `.aodw/` 文件添加到 Project Knowledge。
26
+ - **结论**: **可行**,依赖用户配置。
27
+
28
+ ## 4. Gemini (GEMINI.md)
29
+ - **机制**: Long Context Window (1M+ tokens)。
30
+ - **引用方式**: `GEMINI.md` 指示 "You MUST load and follow..."。
31
+ - **执行逻辑**:
32
+ - Gemini 通常用于一次性加载整个仓库或大量文件。
33
+ - 只要 `.aodw/` 目录在上传/加载的文件列表中,Gemini 就能理解并执行。
34
+ - 它的超长上下文使得"引用"和"内联"在理解上几乎没有区别,但"引用"能让 Prompt 更清晰。
35
+ - **覆盖度**: **极高**。
36
+ - **结论**: **完全可行**。
37
+
38
+ ## 5. General Agents (AGENTS.md)
39
+ - **机制**: System Prompt / User Prompt。
40
+ - **引用方式**: 文本指令 "You must read..."。
41
+ - **执行逻辑**:
42
+ - 这是一个通用回退方案。
43
+ - 如果 Agent 有文件访问权限(如 AutoGPT, LangChain agent),它会去读取。
44
+ - 如果 Agent 是网页版聊天框(无文件权限),用户需要手动粘贴核心规则内容。
45
+ - **覆盖度**: **中** (取决于 Agent 能力)。
46
+ - **结论**: **可行**,作为标准协议存在。
47
+
48
+ ## 6. 总体结论
49
+ "轻量级引用模式"将 AODW 的执行压力从 **Prompt 长度** 转移到了 **AI 的上下文获取能力** (工具调用、RAG、长窗口) 上。
50
+ 鉴于当前主流 AI 编码工具(Cursor, Claude Projects, Gemini 1.5)都具备极强的文件感知能力,这种转移是符合技术趋势的,能带来更低的 Token 消耗和更高的规则一致性。
51
+
52
+ ## 7. 建议改进
53
+ 为了降低 Claude 和 General 模式下的配置风险,建议在适配器中增加一行:
54
+ > "If you cannot read these files directly, ask the user to provide them."
55
+ > (如果无法直接读取这些文件,请要求用户提供。)