@frankzhang2026/opencode-android-orchestrator 0.1.0 → 0.2.0

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 (124) hide show
  1. package/CHANGELOG.md +75 -2
  2. package/LICENSE +21 -0
  3. package/README.md +391 -6
  4. package/THIRD_PARTY_NOTICES.md +119 -0
  5. package/dist/cli.js +243 -1
  6. package/dist/cli.js.map +1 -1
  7. package/dist/compatibility/hooks.d.ts +23 -0
  8. package/dist/compatibility/hooks.d.ts.map +1 -0
  9. package/dist/compatibility/hooks.js +44 -0
  10. package/dist/compatibility/hooks.js.map +1 -0
  11. package/dist/compatibility/versions.d.ts +19 -0
  12. package/dist/compatibility/versions.d.ts.map +1 -1
  13. package/dist/compatibility/versions.js +116 -0
  14. package/dist/compatibility/versions.js.map +1 -1
  15. package/dist/doctor/index.d.ts +36 -0
  16. package/dist/doctor/index.d.ts.map +1 -0
  17. package/dist/doctor/index.js +289 -0
  18. package/dist/doctor/index.js.map +1 -0
  19. package/dist/doctor/installation.d.ts +4 -0
  20. package/dist/doctor/installation.d.ts.map +1 -0
  21. package/dist/doctor/installation.js +472 -0
  22. package/dist/doctor/installation.js.map +1 -0
  23. package/dist/index.d.ts +13 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +13 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/installer/adaptive-templates.d.ts +56 -0
  28. package/dist/installer/adaptive-templates.d.ts.map +1 -0
  29. package/dist/installer/adaptive-templates.js +167 -0
  30. package/dist/installer/adaptive-templates.js.map +1 -0
  31. package/dist/installer/agents-config.d.ts +19 -0
  32. package/dist/installer/agents-config.d.ts.map +1 -0
  33. package/dist/installer/agents-config.js +147 -0
  34. package/dist/installer/agents-config.js.map +1 -0
  35. package/dist/installer/android-project.d.ts +36 -0
  36. package/dist/installer/android-project.d.ts.map +1 -0
  37. package/dist/installer/android-project.js +418 -0
  38. package/dist/installer/android-project.js.map +1 -0
  39. package/dist/installer/index.d.ts +8 -0
  40. package/dist/installer/index.d.ts.map +1 -1
  41. package/dist/installer/index.js +8 -1
  42. package/dist/installer/index.js.map +1 -1
  43. package/dist/installer/init.d.ts +67 -0
  44. package/dist/installer/init.d.ts.map +1 -0
  45. package/dist/installer/init.js +389 -0
  46. package/dist/installer/init.js.map +1 -0
  47. package/dist/installer/install-manifest.d.ts +132 -0
  48. package/dist/installer/install-manifest.d.ts.map +1 -0
  49. package/dist/installer/install-manifest.js +1047 -0
  50. package/dist/installer/install-manifest.js.map +1 -0
  51. package/dist/installer/opencode-config.d.ts +31 -0
  52. package/dist/installer/opencode-config.d.ts.map +1 -0
  53. package/dist/installer/opencode-config.js +296 -0
  54. package/dist/installer/opencode-config.js.map +1 -0
  55. package/dist/installer/uninstall.d.ts +70 -0
  56. package/dist/installer/uninstall.d.ts.map +1 -0
  57. package/dist/installer/uninstall.js +770 -0
  58. package/dist/installer/uninstall.js.map +1 -0
  59. package/dist/installer/upgrade.d.ts +96 -0
  60. package/dist/installer/upgrade.d.ts.map +1 -0
  61. package/dist/installer/upgrade.js +1106 -0
  62. package/dist/installer/upgrade.js.map +1 -0
  63. package/dist/opencode-plugin.d.ts +2 -0
  64. package/dist/opencode-plugin.d.ts.map +1 -0
  65. package/dist/opencode-plugin.js +4 -0
  66. package/dist/opencode-plugin.js.map +1 -0
  67. package/dist/plugin/index.d.ts +7 -2
  68. package/dist/plugin/index.d.ts.map +1 -1
  69. package/dist/plugin/index.js +23 -6
  70. package/dist/plugin/index.js.map +1 -1
  71. package/dist/tools/index.d.ts +35 -1
  72. package/dist/tools/index.d.ts.map +1 -1
  73. package/dist/tools/index.js +197 -1
  74. package/dist/tools/index.js.map +1 -1
  75. package/docs/MIGRATION.md +173 -0
  76. package/docs/SECURITY.md +212 -0
  77. package/docs/TROUBLESHOOTING.md +172 -0
  78. package/package.json +23 -5
  79. package/templates/.opencode/agents/scheduled-coder.md +115 -0
  80. package/templates/.opencode/agents/scheduled-planner.md +166 -0
  81. package/templates/.opencode/agents/scheduled-reviewer.md +88 -0
  82. package/templates/.opencode/commands/abort-task.md +20 -0
  83. package/templates/.opencode/commands/acceptance.md +20 -0
  84. package/templates/.opencode/commands/change.md +23 -0
  85. package/templates/.opencode/commands/resume-review.md +19 -0
  86. package/templates/.opencode/skills/scheduled-quality-coder/SKILL.md +93 -0
  87. package/templates/.opencode/skills/scheduled-quality-orchestrator/SKILL.md +216 -0
  88. package/templates/.opencode/skills/scheduled-quality-reviewer/SKILL.md +68 -0
  89. package/templates/AGENTS.md.fragment +19 -0
  90. package/templates/README.md +52 -9
  91. package/templates/automation/config.json +50 -0
  92. package/templates/automation/config.schema.json +163 -0
  93. package/templates/automation/task-contract.schema.json +71 -0
  94. package/templates/automation/tasks/TASK-TEMPLATE.json.example +53 -0
  95. package/templates/docs/plans/README.md +26 -0
  96. package/templates/installation-manifest.schema.json +201 -0
  97. package/templates/scripts/automation/abort-task.sh +171 -0
  98. package/templates/scripts/automation/accept-and-integrate.sh +263 -0
  99. package/templates/scripts/automation/acceptance-report.sh +132 -0
  100. package/templates/scripts/automation/approve-and-run.sh +175 -0
  101. package/templates/scripts/automation/begin-review.sh +18 -0
  102. package/templates/scripts/automation/block-task.sh +26 -0
  103. package/templates/scripts/automation/claim-task.sh +74 -0
  104. package/templates/scripts/automation/integration-scope-gate.sh +103 -0
  105. package/templates/scripts/automation/lib.sh +697 -0
  106. package/templates/scripts/automation/orchestrate-task.sh +119 -0
  107. package/templates/scripts/automation/preflight.sh +206 -0
  108. package/templates/scripts/automation/prepare-contract-review.sh +101 -0
  109. package/templates/scripts/automation/quality-gate.sh +72 -0
  110. package/templates/scripts/automation/queue-task.sh +35 -0
  111. package/templates/scripts/automation/record-red.sh +57 -0
  112. package/templates/scripts/automation/resume-review-fix.sh +32 -0
  113. package/templates/scripts/automation/resume-review.sh +120 -0
  114. package/templates/scripts/automation/scope-gate.sh +110 -0
  115. package/templates/scripts/automation/select-task.sh +34 -0
  116. package/templates/scripts/automation/shadow-run.sh +24 -0
  117. package/templates/scripts/automation/show-acceptance-review.sh +111 -0
  118. package/templates/scripts/automation/status.sh +125 -0
  119. package/templates/scripts/automation/submit-review.sh +73 -0
  120. package/templates/scripts/automation/tests/run-tests.sh +699 -0
  121. package/templates/scripts/automation/transition-state.sh +21 -0
  122. package/templates/scripts/automation/validate-contract.sh +87 -0
  123. package/templates/scripts/automation/verify-integration.sh +37 -0
  124. package/templates/scripts/automation/verify-task.sh +54 -0
@@ -0,0 +1,167 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { isAbsolute, relative, sep, } from "node:path";
3
+ import { detectAndroidProject, } from "./android-project.js";
4
+ export class AdaptiveProjectTemplateError extends Error {
5
+ code;
6
+ details;
7
+ constructor(code, message, details = []) {
8
+ super(message);
9
+ this.name = "AdaptiveProjectTemplateError";
10
+ this.code = code;
11
+ this.details = details;
12
+ }
13
+ }
14
+ function isRecord(value) {
15
+ return typeof value === "object" && value !== null && !Array.isArray(value);
16
+ }
17
+ function readObjectTemplate(relativePath) {
18
+ const templateUrl = new URL(`../../templates/${relativePath}`, import.meta.url);
19
+ let value;
20
+ try {
21
+ value = JSON.parse(readFileSync(templateUrl, "utf8"));
22
+ }
23
+ catch (error) {
24
+ throw new AdaptiveProjectTemplateError("TEMPLATE_INVALID", `Unable to parse packaged template: ${relativePath}`, [error instanceof Error ? error.message : String(error)]);
25
+ }
26
+ if (!isRecord(value)) {
27
+ throw new AdaptiveProjectTemplateError("TEMPLATE_INVALID", `Packaged template must contain a JSON object: ${relativePath}`);
28
+ }
29
+ return value;
30
+ }
31
+ function stringArrayProperty(value, propertyName, relativePath) {
32
+ const property = value[propertyName];
33
+ if (!Array.isArray(property) ||
34
+ property.length === 0 ||
35
+ property.some((entry) => typeof entry !== "string" || entry.length === 0)) {
36
+ throw new AdaptiveProjectTemplateError("TEMPLATE_INVALID", `Packaged template property ${propertyName} must be a non-empty string array: ${relativePath}`);
37
+ }
38
+ return property;
39
+ }
40
+ function repositoryPath(gitRoot, absolutePath) {
41
+ const relativePath = relative(gitRoot, absolutePath);
42
+ if (isAbsolute(relativePath) ||
43
+ relativePath === ".." ||
44
+ relativePath.startsWith(`..${sep}`)) {
45
+ throw new AdaptiveProjectTemplateError("PROJECT_PATH_OUTSIDE_GIT_ROOT", "Detected Android project paths must remain inside the Git root.", [absolutePath]);
46
+ }
47
+ return relativePath.length === 0
48
+ ? "."
49
+ : relativePath.split(sep).join("/");
50
+ }
51
+ function unique(values) {
52
+ return [...new Set(values)];
53
+ }
54
+ function sourcePattern(directory, sourceSet) {
55
+ const prefix = directory === "." ? "" : `${directory}/`;
56
+ return `${prefix}src/${sourceSet}/**`;
57
+ }
58
+ function selectPrimaryModule(modules, requestedGradlePath) {
59
+ if (requestedGradlePath !== undefined) {
60
+ const selected = modules.find((module) => module.gradlePath === requestedGradlePath);
61
+ if (selected === undefined) {
62
+ throw new AdaptiveProjectTemplateError("PRIMARY_MODULE_NOT_FOUND", `Primary Android module was not detected: ${requestedGradlePath}`, modules.map((module) => module.gradlePath));
63
+ }
64
+ return selected;
65
+ }
66
+ const applications = modules.filter((module) => module.type === "application");
67
+ if (applications.length === 1) {
68
+ return applications[0];
69
+ }
70
+ if (applications.length === 0 && modules.length === 1) {
71
+ return modules[0];
72
+ }
73
+ throw new AdaptiveProjectTemplateError("PRIMARY_MODULE_AMBIGUOUS", "Select a primary Android module explicitly before rendering templates.", (applications.length > 1 ? applications : modules).map((module) => module.gradlePath));
74
+ }
75
+ function taskTestFilter(module) {
76
+ const packageName = [module.namespace, module.applicationId].find((candidate) => candidate !== null &&
77
+ /^[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)+$/.test(candidate));
78
+ return packageName !== undefined
79
+ ? `${packageName}.ReplaceWithFocusedTest`
80
+ : "*ReplaceWithFocusedTest";
81
+ }
82
+ function taskForbiddenPath(protectedPath) {
83
+ return protectedPath.endsWith("/")
84
+ ? `${protectedPath}**`
85
+ : protectedPath;
86
+ }
87
+ function serialize(value) {
88
+ return `${JSON.stringify(value, null, 2)}\n`;
89
+ }
90
+ export function planAdaptiveProjectTemplates(targetDirectory, options = {}) {
91
+ const detection = detectAndroidProject(targetDirectory);
92
+ if (!detection.isAndroidProject ||
93
+ detection.gitRoot === null ||
94
+ detection.projectRoot === null ||
95
+ detection.projectName === null ||
96
+ detection.settingsFile === null ||
97
+ detection.dsl === "unknown") {
98
+ throw new AdaptiveProjectTemplateError("INVALID_ANDROID_PROJECT", "A Git-backed Android Gradle project is required to render templates.", [...detection.errors, ...detection.warnings]);
99
+ }
100
+ if (detection.projectRoot !== detection.gitRoot) {
101
+ throw new AdaptiveProjectTemplateError("NESTED_GRADLE_ROOT_UNSUPPORTED", "The Gradle settings root must currently match the Git root.", [detection.gitRoot, detection.projectRoot]);
102
+ }
103
+ const gitRoot = detection.gitRoot;
104
+ const selectedModule = selectPrimaryModule(detection.modules, options.primaryModule);
105
+ const modules = detection.modules.map((module) => ({
106
+ gradlePath: module.gradlePath,
107
+ directory: repositoryPath(gitRoot, module.directory),
108
+ buildFile: repositoryPath(gitRoot, module.buildFile),
109
+ dsl: module.dsl,
110
+ type: module.type,
111
+ namespace: module.namespace,
112
+ applicationId: module.applicationId,
113
+ }));
114
+ const primaryModule = modules.find((module) => module.gradlePath === selectedModule.gradlePath);
115
+ if (primaryModule === undefined) {
116
+ throw new AdaptiveProjectTemplateError("PRIMARY_MODULE_NOT_FOUND", `Primary Android module was not rendered: ${selectedModule.gradlePath}`);
117
+ }
118
+ const productionPaths = unique(modules.map((module) => sourcePattern(module.directory, "main")));
119
+ const testPaths = unique(modules.flatMap((module) => [
120
+ sourcePattern(module.directory, "test"),
121
+ sourcePattern(module.directory, "androidTest"),
122
+ ]));
123
+ const androidProject = {
124
+ name: detection.projectName,
125
+ gradleDsl: detection.dsl,
126
+ settingsFile: repositoryPath(gitRoot, detection.settingsFile),
127
+ primaryModule: primaryModule.gradlePath,
128
+ modules,
129
+ productionPaths,
130
+ testPaths,
131
+ };
132
+ const configTemplatePath = "automation/config.json";
133
+ const configTemplate = readObjectTemplate(configTemplatePath);
134
+ const baseProtectedPaths = stringArrayProperty(configTemplate, "protectedPaths", configTemplatePath);
135
+ const protectedPaths = unique([
136
+ ...baseProtectedPaths,
137
+ androidProject.settingsFile,
138
+ ...modules.map((module) => module.buildFile),
139
+ ]);
140
+ const automationConfig = {
141
+ ...configTemplate,
142
+ androidProject,
143
+ protectedPaths,
144
+ };
145
+ const taskTemplatePath = "automation/tasks/TASK-TEMPLATE.json.example";
146
+ const taskTemplate = readObjectTemplate(taskTemplatePath);
147
+ const taskContractExample = {
148
+ ...taskTemplate,
149
+ allowedPaths: [
150
+ sourcePattern(primaryModule.directory, "main"),
151
+ sourcePattern(primaryModule.directory, "test"),
152
+ sourcePattern(primaryModule.directory, "androidTest"),
153
+ ],
154
+ forbiddenPaths: protectedPaths.map(taskForbiddenPath),
155
+ targetTests: [taskTestFilter(primaryModule)],
156
+ };
157
+ return {
158
+ detection,
159
+ projectRoot: detection.projectRoot,
160
+ primaryModule,
161
+ automationConfig,
162
+ automationConfigContent: serialize(automationConfig),
163
+ taskContractExample,
164
+ taskContractExampleContent: serialize(taskContractExample),
165
+ };
166
+ }
167
+ //# sourceMappingURL=adaptive-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive-templates.js","sourceRoot":"","sources":["../../src/installer/adaptive-templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,GAAG,GACJ,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,oBAAoB,GAKrB,MAAM,sBAAsB,CAAC;AAU9B,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAC5C,IAAI,CAAmC;IACvC,OAAO,CAAoB;IAEpC,YACE,IAAsC,EACtC,OAAe,EACf,UAA6B,EAAE;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAqDD,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAoB;IAC9C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,mBAAmB,YAAY,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChF,IAAI,KAAc,CAAC;IAEnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAY,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,4BAA4B,CACpC,kBAAkB,EAClB,sCAAsC,YAAY,EAAE,EACpD,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CACzD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,4BAA4B,CACpC,kBAAkB,EAClB,iDAAiD,YAAY,EAAE,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA8B,EAC9B,YAAoB,EACpB,YAAoB;IAEpB,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACrC,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxB,QAAQ,CAAC,MAAM,KAAK,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EACzE,CAAC;QACD,MAAM,IAAI,4BAA4B,CACpC,kBAAkB,EAClB,8BAA8B,YAAY,sCAAsC,YAAY,EAAE,CAC/F,CAAC;IACJ,CAAC;IACD,OAAO,QAA6B,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,YAAoB;IAC3D,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACrD,IACE,UAAU,CAAC,YAAY,CAAC;QACxB,YAAY,KAAK,IAAI;QACrB,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,EACnC,CAAC;QACD,MAAM,IAAI,4BAA4B,CACpC,+BAA+B,EAC/B,iEAAiE,EACjE,CAAC,YAAY,CAAC,CACf,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CAAC,MAAM,KAAK,CAAC;QAC9B,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,MAAM,CAAC,MAAyB;IACvC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB,EAAE,SAAiB;IACzD,MAAM,MAAM,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC;IACxD,OAAO,GAAG,MAAM,OAAO,SAAS,KAAK,CAAC;AACxC,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAA0C,EAC1C,mBAAuC;IAEvC,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAC3B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,mBAAmB,CACtD,CAAC;QACF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,4BAA4B,CACpC,0BAA0B,EAC1B,4CAA4C,mBAAmB,EAAE,EACjE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAC3C,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CACjC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,CAC1C,CAAC;IACF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,CAAC,CAA2B,CAAC;IACnD,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC,CAAC,CAA2B,CAAC;IAC9C,CAAC;IAED,MAAM,IAAI,4BAA4B,CACpC,0BAA0B,EAC1B,wEAAwE,EACxE,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CACpD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAC9B,CACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAA0C;IAChE,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAC/D,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,KAAK,IAAI;QAClB,mCAAmC,CAAC,IAAI,CAAC,SAAS,CAAC,CACtD,CAAC;IACF,OAAO,WAAW,KAAK,SAAS;QAC9B,CAAC,CAAC,GAAG,WAAW,yBAAyB;QACzC,CAAC,CAAC,yBAAyB,CAAC;AAChC,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB;IAC9C,OAAO,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;QAChC,CAAC,CAAC,GAAG,aAAa,IAAI;QACtB,CAAC,CAAC,aAAa,CAAC;AACpB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,eAAuB,EACvB,UAA0C,EAAE;IAE5C,MAAM,SAAS,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;IACxD,IACE,CAAC,SAAS,CAAC,gBAAgB;QAC3B,SAAS,CAAC,OAAO,KAAK,IAAI;QAC1B,SAAS,CAAC,WAAW,KAAK,IAAI;QAC9B,SAAS,CAAC,WAAW,KAAK,IAAI;QAC9B,SAAS,CAAC,YAAY,KAAK,IAAI;QAC/B,SAAS,CAAC,GAAG,KAAK,SAAS,EAC3B,CAAC;QACD,MAAM,IAAI,4BAA4B,CACpC,yBAAyB,EACzB,sEAAsE,EACtE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAC7C,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,WAAW,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,4BAA4B,CACpC,gCAAgC,EAChC,6DAA6D,EAC7D,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,CAC3C,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IAElC,MAAM,cAAc,GAAG,mBAAmB,CACxC,SAAS,CAAC,OAAO,EACjB,OAAO,CAAC,aAAa,CACtB,CAAC;IACF,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CACnC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACX,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC;QACpD,SAAS,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC;QACpD,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC,CACH,CAAC;IACF,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAChC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,cAAc,CAAC,UAAU,CAC5D,CAAC;IACF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,4BAA4B,CACpC,0BAA0B,EAC1B,4CAA4C,cAAc,CAAC,UAAU,EAAE,CACxE,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CACjE,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CACtB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1B,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;QACvC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC;KAC/C,CAAC,CACH,CAAC;IACF,MAAM,cAAc,GAAwC;QAC1D,IAAI,EAAE,SAAS,CAAC,WAAW;QAC3B,SAAS,EAAE,SAAS,CAAC,GAAG;QACxB,YAAY,EAAE,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,YAAY,CAAC;QAC7D,aAAa,EAAE,aAAa,CAAC,UAAU;QACvC,OAAO;QACP,eAAe;QACf,SAAS;KACV,CAAC;IAEF,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;IACpD,MAAM,cAAc,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IAC9D,MAAM,kBAAkB,GAAG,mBAAmB,CAC5C,cAAc,EACd,gBAAgB,EAChB,kBAAkB,CACnB,CAAC;IACF,MAAM,cAAc,GAAG,MAAM,CAAC;QAC5B,GAAG,kBAAkB;QACrB,cAAc,CAAC,YAAY;QAC3B,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;KAC7C,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG;QACvB,GAAG,cAAc;QACjB,cAAc;QACd,cAAc;KAC+B,CAAC;IAEhD,MAAM,gBAAgB,GACpB,6CAA6C,CAAC;IAChD,MAAM,YAAY,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC1D,MAAM,mBAAmB,GAAG;QAC1B,GAAG,YAAY;QACf,YAAY,EAAE;YACZ,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC;YAC9C,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC;YAC9C,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC;SACtD;QACD,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACrD,WAAW,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;KACH,CAAC;IAE5C,OAAO;QACL,SAAS;QACT,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,aAAa;QACb,gBAAgB;QAChB,uBAAuB,EAAE,SAAS,CAAC,gBAAgB,CAAC;QACpD,mBAAmB;QACnB,0BAA0B,EAAE,SAAS,CAAC,mBAAmB,CAAC;KAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const AGENTS_MANAGED_BLOCK_BEGIN = "<!-- opencode-android-orchestrator:begin -->";
2
+ export declare const AGENTS_MANAGED_BLOCK_END = "<!-- opencode-android-orchestrator:end -->";
3
+ export type AgentsConfigMergeErrorCode = "AGENTS_BLOCK_CONFLICT" | "AGENTS_MARKERS_INVALID" | "AGENTS_NOT_FILE" | "AGENTS_READ_FAILED" | "AGENTS_SYMLINK" | "TARGET_NOT_DIRECTORY" | "TEMPLATE_INVALID";
4
+ export declare class AgentsConfigMergeError extends Error {
5
+ readonly code: AgentsConfigMergeErrorCode;
6
+ readonly details: readonly string[];
7
+ constructor(code: AgentsConfigMergeErrorCode, message: string, details?: readonly string[]);
8
+ }
9
+ export interface AgentsConfigMergePlan {
10
+ targetDirectory: string;
11
+ agentsPath: string;
12
+ existed: boolean;
13
+ originalContent: string;
14
+ content: string;
15
+ changed: boolean;
16
+ }
17
+ export declare function mergeAgentsConfigText(source: string): string;
18
+ export declare function planAgentsConfigMerge(directory: string): AgentsConfigMergePlan;
19
+ //# sourceMappingURL=agents-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-config.d.ts","sourceRoot":"","sources":["../../src/installer/agents-config.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,0BAA0B,iDACS,CAAC;AACjD,eAAO,MAAM,wBAAwB,+CACS,CAAC;AAE/C,MAAM,MAAM,0BAA0B,GAClC,uBAAuB,GACvB,wBAAwB,GACxB,iBAAiB,GACjB,oBAAoB,GACpB,gBAAgB,GAChB,sBAAsB,GACtB,kBAAkB,CAAC;AAEvB,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;gBAGlC,IAAI,EAAE,0BAA0B,EAChC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,SAAS,MAAM,EAAO;CAOlC;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AA4HD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,GAChB,qBAAqB,CA8DvB"}
@@ -0,0 +1,147 @@
1
+ import { lstatSync, readFileSync, } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ export const AGENTS_MANAGED_BLOCK_BEGIN = "<!-- opencode-android-orchestrator:begin -->";
4
+ export const AGENTS_MANAGED_BLOCK_END = "<!-- opencode-android-orchestrator:end -->";
5
+ export class AgentsConfigMergeError extends Error {
6
+ code;
7
+ details;
8
+ constructor(code, message, details = []) {
9
+ super(message);
10
+ this.name = "AgentsConfigMergeError";
11
+ this.code = code;
12
+ this.details = details;
13
+ }
14
+ }
15
+ function filesystemErrorCode(error) {
16
+ if (typeof error === "object" &&
17
+ error !== null &&
18
+ "code" in error &&
19
+ typeof error.code === "string") {
20
+ return error.code;
21
+ }
22
+ return null;
23
+ }
24
+ function markerCount(content, marker) {
25
+ let count = 0;
26
+ let offset = 0;
27
+ while (true) {
28
+ const index = content.indexOf(marker, offset);
29
+ if (index < 0) {
30
+ return count;
31
+ }
32
+ count += 1;
33
+ offset = index + marker.length;
34
+ }
35
+ }
36
+ function packagedFragment() {
37
+ const fragmentUrl = new URL("../../templates/AGENTS.md.fragment", import.meta.url);
38
+ let fragment;
39
+ try {
40
+ fragment = readFileSync(fragmentUrl, "utf8");
41
+ }
42
+ catch (error) {
43
+ throw new AgentsConfigMergeError("TEMPLATE_INVALID", "Unable to read the packaged AGENTS managed block.", [error instanceof Error ? error.message : String(error)]);
44
+ }
45
+ if (markerCount(fragment, AGENTS_MANAGED_BLOCK_BEGIN) !== 1 ||
46
+ markerCount(fragment, AGENTS_MANAGED_BLOCK_END) !== 1 ||
47
+ !fragment.startsWith(`${AGENTS_MANAGED_BLOCK_BEGIN}\n`) ||
48
+ !fragment.endsWith(`${AGENTS_MANAGED_BLOCK_END}\n`)) {
49
+ throw new AgentsConfigMergeError("TEMPLATE_INVALID", "The packaged AGENTS managed block markers are invalid.");
50
+ }
51
+ return fragment;
52
+ }
53
+ function lineEnding(content) {
54
+ const withoutCrLf = content.replaceAll("\r\n", "");
55
+ return content.includes("\r\n") && !withoutCrLf.includes("\n")
56
+ ? "\r\n"
57
+ : "\n";
58
+ }
59
+ function convertLineEndings(content, ending) {
60
+ return ending === "\n"
61
+ ? content
62
+ : content.replaceAll("\n", "\r\n");
63
+ }
64
+ function appendManagedBlock(original, fragment) {
65
+ if (original.length === 0) {
66
+ return fragment;
67
+ }
68
+ const ending = lineEnding(original);
69
+ const convertedFragment = convertLineEndings(fragment, ending);
70
+ const separator = original.endsWith(`${ending}${ending}`)
71
+ ? ""
72
+ : original.endsWith(ending)
73
+ ? ending
74
+ : `${ending}${ending}`;
75
+ return `${original}${separator}${convertedFragment}`;
76
+ }
77
+ function mergeAgentsContent(original, fragment) {
78
+ const beginCount = markerCount(original, AGENTS_MANAGED_BLOCK_BEGIN);
79
+ const endCount = markerCount(original, AGENTS_MANAGED_BLOCK_END);
80
+ if (beginCount === 0 && endCount === 0) {
81
+ return appendManagedBlock(original, fragment);
82
+ }
83
+ if (beginCount !== 1 || endCount !== 1) {
84
+ throw new AgentsConfigMergeError("AGENTS_MARKERS_INVALID", "AGENTS.md contains partial or duplicate orchestrator markers.");
85
+ }
86
+ const begin = original.indexOf(AGENTS_MANAGED_BLOCK_BEGIN);
87
+ const end = original.indexOf(AGENTS_MANAGED_BLOCK_END);
88
+ if (begin < 0 || end < begin) {
89
+ throw new AgentsConfigMergeError("AGENTS_MARKERS_INVALID", "AGENTS.md orchestrator markers are out of order.");
90
+ }
91
+ const existingBlock = original.slice(begin, end + AGENTS_MANAGED_BLOCK_END.length);
92
+ const expectedBlock = convertLineEndings(fragment.trimEnd(), lineEnding(original));
93
+ if (existingBlock !== expectedBlock) {
94
+ throw new AgentsConfigMergeError("AGENTS_BLOCK_CONFLICT", "The existing orchestrator block in AGENTS.md differs from this package.", ["Refusing to overwrite a modified managed block."]);
95
+ }
96
+ return original;
97
+ }
98
+ export function mergeAgentsConfigText(source) {
99
+ return mergeAgentsContent(source, packagedFragment());
100
+ }
101
+ export function planAgentsConfigMerge(directory) {
102
+ const targetDirectory = resolve(directory);
103
+ try {
104
+ const stats = lstatSync(targetDirectory);
105
+ if (stats.isSymbolicLink() || !stats.isDirectory()) {
106
+ throw new AgentsConfigMergeError("TARGET_NOT_DIRECTORY", `Target is not a regular directory: ${targetDirectory}`);
107
+ }
108
+ }
109
+ catch (error) {
110
+ if (error instanceof AgentsConfigMergeError) {
111
+ throw error;
112
+ }
113
+ throw new AgentsConfigMergeError("TARGET_NOT_DIRECTORY", `Target directory does not exist or cannot be read: ${targetDirectory}`, [error instanceof Error ? error.message : String(error)]);
114
+ }
115
+ const agentsPath = join(targetDirectory, "AGENTS.md");
116
+ let existed = false;
117
+ let originalContent = "";
118
+ try {
119
+ const stats = lstatSync(agentsPath);
120
+ if (stats.isSymbolicLink()) {
121
+ throw new AgentsConfigMergeError("AGENTS_SYMLINK", `Refusing to merge a symbolic-link AGENTS.md: ${agentsPath}`);
122
+ }
123
+ if (!stats.isFile()) {
124
+ throw new AgentsConfigMergeError("AGENTS_NOT_FILE", `AGENTS.md is not a regular file: ${agentsPath}`);
125
+ }
126
+ existed = true;
127
+ originalContent = readFileSync(agentsPath, "utf8");
128
+ }
129
+ catch (error) {
130
+ if (error instanceof AgentsConfigMergeError) {
131
+ throw error;
132
+ }
133
+ if (filesystemErrorCode(error) !== "ENOENT") {
134
+ throw new AgentsConfigMergeError("AGENTS_READ_FAILED", `Unable to read AGENTS.md: ${agentsPath}`, [error instanceof Error ? error.message : String(error)]);
135
+ }
136
+ }
137
+ const content = mergeAgentsConfigText(originalContent);
138
+ return {
139
+ targetDirectory,
140
+ agentsPath,
141
+ existed,
142
+ originalContent,
143
+ content,
144
+ changed: content !== originalContent,
145
+ };
146
+ }
147
+ //# sourceMappingURL=agents-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-config.js","sourceRoot":"","sources":["../../src/installer/agents-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export type GradleDsl = "kotlin" | "groovy" | "mixed" | "unknown";
2
+ export type AndroidModuleType = "application" | "library" | "dynamic-feature" | "test" | "asset-pack";
3
+ export interface AndroidModuleDetection {
4
+ gradlePath: string;
5
+ directory: string;
6
+ buildFile: string;
7
+ dsl: Exclude<GradleDsl, "mixed" | "unknown">;
8
+ type: AndroidModuleType;
9
+ pluginIds: readonly string[];
10
+ namespace: string | null;
11
+ applicationId: string | null;
12
+ }
13
+ export interface GradleWrapperDetection {
14
+ script: string;
15
+ properties: string;
16
+ scriptPresent: boolean;
17
+ propertiesPresent: boolean;
18
+ executable: boolean;
19
+ complete: boolean;
20
+ }
21
+ export interface AndroidProjectDetection {
22
+ requestedDirectory: string;
23
+ gitRoot: string | null;
24
+ projectRoot: string | null;
25
+ projectName: string | null;
26
+ settingsFile: string | null;
27
+ dsl: GradleDsl;
28
+ gradleWrapper: GradleWrapperDetection | null;
29
+ modules: readonly AndroidModuleDetection[];
30
+ isGitRepository: boolean;
31
+ isAndroidProject: boolean;
32
+ warnings: readonly string[];
33
+ errors: readonly string[];
34
+ }
35
+ export declare function detectAndroidProject(targetDirectory: string): AndroidProjectDetection;
36
+ //# sourceMappingURL=android-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android-project.d.ts","sourceRoot":"","sources":["../../src/installer/android-project.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAClE,MAAM,MAAM,iBAAiB,GACzB,aAAa,GACb,SAAS,GACT,iBAAiB,GACjB,MAAM,GACN,YAAY,CAAC;AAEjB,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;IAC7C,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,aAAa,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC7C,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC3C,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAsWD,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,GACtB,uBAAuB,CAwKzB"}