@frankzhang2026/opencode-android-orchestrator 0.1.0 → 0.3.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 +92 -2
  2. package/LICENSE +21 -0
  3. package/README.md +402 -6
  4. package/THIRD_PARTY_NOTICES.md +119 -0
  5. package/dist/cli.js +360 -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 +497 -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 +78 -0
  28. package/dist/installer/adaptive-templates.d.ts.map +1 -0
  29. package/dist/installer/adaptive-templates.js +233 -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 +68 -0
  44. package/dist/installer/init.d.ts.map +1 -0
  45. package/dist/installer/init.js +398 -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 +32 -0
  52. package/dist/installer/opencode-config.d.ts.map +1 -0
  53. package/dist/installer/opencode-config.js +302 -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 +101 -0
  60. package/dist/installer/upgrade.d.ts.map +1 -0
  61. package/dist/installer/upgrade.js +1140 -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 +184 -0
  76. package/docs/SECURITY.md +219 -0
  77. package/docs/TROUBLESHOOTING.md +171 -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 +55 -9
  91. package/templates/automation/config.json +67 -0
  92. package/templates/automation/config.schema.json +194 -0
  93. package/templates/automation/task-contract.schema.json +92 -0
  94. package/templates/automation/tasks/TASK-TEMPLATE.json.example +56 -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 +815 -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 +55 -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 +716 -0
  121. package/templates/scripts/automation/transition-state.sh +21 -0
  122. package/templates/scripts/automation/validate-contract.sh +98 -0
  123. package/templates/scripts/automation/verify-integration.sh +38 -0
  124. package/templates/scripts/automation/verify-task.sh +39 -0
@@ -0,0 +1,78 @@
1
+ import { type AndroidModuleType, type AndroidProjectDetection, type GradleDsl } from "./android-project.js";
2
+ export type AdaptiveProjectTemplateErrorCode = "INVALID_ANDROID_PROJECT" | "MODULE_SCOPE_INVALID" | "NESTED_GRADLE_ROOT_UNSUPPORTED" | "PRIMARY_MODULE_AMBIGUOUS" | "PRIMARY_MODULE_NOT_FOUND" | "PROJECT_PATH_OUTSIDE_GIT_ROOT" | "TEMPLATE_INVALID";
3
+ export declare class AdaptiveProjectTemplateError extends Error {
4
+ readonly code: AdaptiveProjectTemplateErrorCode;
5
+ readonly details: readonly string[];
6
+ constructor(code: AdaptiveProjectTemplateErrorCode, message: string, details?: readonly string[]);
7
+ }
8
+ export interface AdaptiveProjectTemplateOptions {
9
+ /** Select whether generated task contracts can modify every detected module or one primary module. */
10
+ moduleScope?: ModuleScope;
11
+ /** Select the only editable module in primary scope or the focused-test default in all scope. */
12
+ primaryModule?: string;
13
+ /** Override the packaged Gradle quality-gate task matrix. */
14
+ gradleVerification?: GradleVerificationConfiguration;
15
+ }
16
+ export type ModuleScope = "all" | "primary";
17
+ export declare const DEFAULT_MODULE_SCOPE: ModuleScope;
18
+ export declare function isModuleScope(value: unknown): value is ModuleScope;
19
+ export interface GradleVerificationConfiguration {
20
+ fullUnitTestTasks: readonly string[];
21
+ focusedTestTasks: readonly string[];
22
+ assembleTasks: readonly string[];
23
+ lintTasks: readonly string[];
24
+ deviceTestTasks: readonly string[];
25
+ }
26
+ export interface AdaptiveAndroidModuleConfiguration {
27
+ gradlePath: string;
28
+ directory: string;
29
+ buildFile: string;
30
+ dsl: "kotlin" | "groovy";
31
+ type: AndroidModuleType;
32
+ namespace: string | null;
33
+ applicationId: string | null;
34
+ }
35
+ export interface AdaptiveAndroidProjectConfiguration {
36
+ name: string;
37
+ gradleDsl: Exclude<GradleDsl, "unknown">;
38
+ settingsFile: string;
39
+ moduleScope: ModuleScope;
40
+ /** Default module for focused-test rendering; it does not narrow all-module scope. */
41
+ primaryModule: string;
42
+ modules: readonly AdaptiveAndroidModuleConfiguration[];
43
+ productionPaths: readonly string[];
44
+ testPaths: readonly string[];
45
+ }
46
+ export interface AdaptiveAutomationConfiguration {
47
+ readonly [key: string]: unknown;
48
+ schemaVersion: 3;
49
+ androidProject: AdaptiveAndroidProjectConfiguration;
50
+ gradleVerification: GradleVerificationConfiguration;
51
+ plugins: Readonly<{
52
+ superpowers: string;
53
+ }>;
54
+ protectedPaths: readonly string[];
55
+ }
56
+ export interface AdaptiveTargetTest {
57
+ gradleTask: string;
58
+ filter: string;
59
+ }
60
+ export interface AdaptiveTaskContractExample {
61
+ readonly [key: string]: unknown;
62
+ schemaVersion: 1;
63
+ allowedPaths: readonly string[];
64
+ forbiddenPaths: readonly string[];
65
+ targetTests: readonly AdaptiveTargetTest[];
66
+ }
67
+ export interface AdaptiveProjectTemplatePlan {
68
+ detection: AndroidProjectDetection;
69
+ projectRoot: string;
70
+ moduleScope: ModuleScope;
71
+ primaryModule: AdaptiveAndroidModuleConfiguration;
72
+ automationConfig: AdaptiveAutomationConfiguration;
73
+ automationConfigContent: string;
74
+ taskContractExample: AdaptiveTaskContractExample;
75
+ taskContractExampleContent: string;
76
+ }
77
+ export declare function planAdaptiveProjectTemplates(targetDirectory: string, options?: AdaptiveProjectTemplateOptions): AdaptiveProjectTemplatePlan;
78
+ //# sourceMappingURL=adaptive-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive-templates.d.ts","sourceRoot":"","sources":["../../src/installer/adaptive-templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,233 @@
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
+ export const DEFAULT_MODULE_SCOPE = "all";
15
+ export function isModuleScope(value) {
16
+ return value === "all" || value === "primary";
17
+ }
18
+ function isRecord(value) {
19
+ return typeof value === "object" && value !== null && !Array.isArray(value);
20
+ }
21
+ function readObjectTemplate(relativePath) {
22
+ const templateUrl = new URL(`../../templates/${relativePath}`, import.meta.url);
23
+ let value;
24
+ try {
25
+ value = JSON.parse(readFileSync(templateUrl, "utf8"));
26
+ }
27
+ catch (error) {
28
+ throw new AdaptiveProjectTemplateError("TEMPLATE_INVALID", `Unable to parse packaged template: ${relativePath}`, [error instanceof Error ? error.message : String(error)]);
29
+ }
30
+ if (!isRecord(value)) {
31
+ throw new AdaptiveProjectTemplateError("TEMPLATE_INVALID", `Packaged template must contain a JSON object: ${relativePath}`);
32
+ }
33
+ return value;
34
+ }
35
+ function stringArrayProperty(value, propertyName, relativePath) {
36
+ const property = value[propertyName];
37
+ if (!Array.isArray(property) ||
38
+ property.length === 0 ||
39
+ property.some((entry) => typeof entry !== "string" || entry.length === 0)) {
40
+ throw new AdaptiveProjectTemplateError("TEMPLATE_INVALID", `Packaged template property ${propertyName} must be a non-empty string array: ${relativePath}`);
41
+ }
42
+ return property;
43
+ }
44
+ function repositoryPath(gitRoot, absolutePath) {
45
+ const relativePath = relative(gitRoot, absolutePath);
46
+ if (isAbsolute(relativePath) ||
47
+ relativePath === ".." ||
48
+ relativePath.startsWith(`..${sep}`)) {
49
+ throw new AdaptiveProjectTemplateError("PROJECT_PATH_OUTSIDE_GIT_ROOT", "Detected Android project paths must remain inside the Git root.", [absolutePath]);
50
+ }
51
+ return relativePath.length === 0
52
+ ? "."
53
+ : relativePath.split(sep).join("/");
54
+ }
55
+ function unique(values) {
56
+ return [...new Set(values)];
57
+ }
58
+ const GRADLE_TASK_PATTERN = /^(?:[A-Za-z][A-Za-z0-9_.-]*|(?::[A-Za-z0-9_.-]+)+)$/;
59
+ const GRADLE_VERIFICATION_PROPERTIES = [
60
+ "fullUnitTestTasks",
61
+ "focusedTestTasks",
62
+ "assembleTasks",
63
+ "lintTasks",
64
+ "deviceTestTasks",
65
+ ];
66
+ function gradleTaskList(value, propertyName, source) {
67
+ const property = value[propertyName];
68
+ if (!Array.isArray(property) ||
69
+ property.length === 0 ||
70
+ property.some((entry) => typeof entry !== "string" ||
71
+ !GRADLE_TASK_PATTERN.test(entry)) ||
72
+ new Set(property).size !== property.length) {
73
+ throw new AdaptiveProjectTemplateError("TEMPLATE_INVALID", `Gradle verification property ${propertyName} must be a non-empty unique task array: ${source}`);
74
+ }
75
+ return property;
76
+ }
77
+ function gradleVerificationConfiguration(value, source) {
78
+ if (!isRecord(value)) {
79
+ throw new AdaptiveProjectTemplateError("TEMPLATE_INVALID", `Gradle verification configuration must be an object: ${source}`);
80
+ }
81
+ const actualKeys = Object.keys(value).sort();
82
+ const expectedKeys = [...GRADLE_VERIFICATION_PROPERTIES].sort();
83
+ if (actualKeys.length !== expectedKeys.length ||
84
+ actualKeys.some((key, index) => key !== expectedKeys[index])) {
85
+ throw new AdaptiveProjectTemplateError("TEMPLATE_INVALID", `Gradle verification configuration has unexpected or missing properties: ${source}`, actualKeys);
86
+ }
87
+ return {
88
+ fullUnitTestTasks: gradleTaskList(value, "fullUnitTestTasks", source),
89
+ focusedTestTasks: gradleTaskList(value, "focusedTestTasks", source),
90
+ assembleTasks: gradleTaskList(value, "assembleTasks", source),
91
+ lintTasks: gradleTaskList(value, "lintTasks", source),
92
+ deviceTestTasks: gradleTaskList(value, "deviceTestTasks", source),
93
+ };
94
+ }
95
+ function sourcePattern(directory, sourceSet) {
96
+ const prefix = directory === "." ? "" : `${directory}/`;
97
+ return `${prefix}src/${sourceSet}/**`;
98
+ }
99
+ function selectPrimaryModule(modules, requestedGradlePath, moduleScope) {
100
+ if (requestedGradlePath !== undefined) {
101
+ const selected = modules.find((module) => module.gradlePath === requestedGradlePath);
102
+ if (selected === undefined) {
103
+ throw new AdaptiveProjectTemplateError("PRIMARY_MODULE_NOT_FOUND", `Primary Android module was not detected: ${requestedGradlePath}`, modules.map((module) => module.gradlePath));
104
+ }
105
+ return selected;
106
+ }
107
+ const applications = modules.filter((module) => module.type === "application");
108
+ if (applications.length === 1) {
109
+ return applications[0];
110
+ }
111
+ if (applications.length === 0 && modules.length === 1) {
112
+ return modules[0];
113
+ }
114
+ const defaultModule = applications[0] ?? modules[0];
115
+ if (moduleScope === "all" && defaultModule !== undefined) {
116
+ return defaultModule;
117
+ }
118
+ throw new AdaptiveProjectTemplateError("PRIMARY_MODULE_AMBIGUOUS", "Primary-module scope requires an explicit Android module before rendering templates.", (applications.length > 1 ? applications : modules).map((module) => module.gradlePath));
119
+ }
120
+ function taskTestFilter(module) {
121
+ const packageName = [module.namespace, module.applicationId].find((candidate) => candidate !== null &&
122
+ /^[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)+$/.test(candidate));
123
+ return packageName !== undefined
124
+ ? `${packageName}.ReplaceWithFocusedTest`
125
+ : "*ReplaceWithFocusedTest";
126
+ }
127
+ function taskForbiddenPath(protectedPath) {
128
+ return protectedPath.endsWith("/")
129
+ ? `${protectedPath}**`
130
+ : protectedPath;
131
+ }
132
+ function serialize(value) {
133
+ return `${JSON.stringify(value, null, 2)}\n`;
134
+ }
135
+ export function planAdaptiveProjectTemplates(targetDirectory, options = {}) {
136
+ const detection = detectAndroidProject(targetDirectory);
137
+ if (!detection.isAndroidProject ||
138
+ detection.gitRoot === null ||
139
+ detection.projectRoot === null ||
140
+ detection.projectName === null ||
141
+ detection.settingsFile === null ||
142
+ detection.dsl === "unknown") {
143
+ throw new AdaptiveProjectTemplateError("INVALID_ANDROID_PROJECT", "A Git-backed Android Gradle project is required to render templates.", [...detection.errors, ...detection.warnings]);
144
+ }
145
+ if (detection.projectRoot !== detection.gitRoot) {
146
+ throw new AdaptiveProjectTemplateError("NESTED_GRADLE_ROOT_UNSUPPORTED", "The Gradle settings root must currently match the Git root.", [detection.gitRoot, detection.projectRoot]);
147
+ }
148
+ const gitRoot = detection.gitRoot;
149
+ const moduleScope = options.moduleScope ?? DEFAULT_MODULE_SCOPE;
150
+ if (!isModuleScope(moduleScope)) {
151
+ throw new AdaptiveProjectTemplateError("MODULE_SCOPE_INVALID", `Unsupported Android module scope: ${String(moduleScope)}`, ["Expected one of: all, primary"]);
152
+ }
153
+ const selectedModule = selectPrimaryModule(detection.modules, options.primaryModule, moduleScope);
154
+ const modules = detection.modules.map((module) => ({
155
+ gradlePath: module.gradlePath,
156
+ directory: repositoryPath(gitRoot, module.directory),
157
+ buildFile: repositoryPath(gitRoot, module.buildFile),
158
+ dsl: module.dsl,
159
+ type: module.type,
160
+ namespace: module.namespace,
161
+ applicationId: module.applicationId,
162
+ }));
163
+ const primaryModule = modules.find((module) => module.gradlePath === selectedModule.gradlePath);
164
+ if (primaryModule === undefined) {
165
+ throw new AdaptiveProjectTemplateError("PRIMARY_MODULE_NOT_FOUND", `Primary Android module was not rendered: ${selectedModule.gradlePath}`);
166
+ }
167
+ const productionPaths = unique(modules.map((module) => sourcePattern(module.directory, "main")));
168
+ const testPaths = unique(modules.flatMap((module) => [
169
+ sourcePattern(module.directory, "test"),
170
+ sourcePattern(module.directory, "androidTest"),
171
+ ]));
172
+ const androidProject = {
173
+ name: detection.projectName,
174
+ gradleDsl: detection.dsl,
175
+ settingsFile: repositoryPath(gitRoot, detection.settingsFile),
176
+ moduleScope,
177
+ primaryModule: primaryModule.gradlePath,
178
+ modules,
179
+ productionPaths,
180
+ testPaths,
181
+ };
182
+ const configTemplatePath = "automation/config.json";
183
+ const configTemplate = readObjectTemplate(configTemplatePath);
184
+ const gradleVerification = gradleVerificationConfiguration(options.gradleVerification ?? configTemplate.gradleVerification, options.gradleVerification === undefined
185
+ ? configTemplatePath
186
+ : "AdaptiveProjectTemplateOptions.gradleVerification");
187
+ const baseProtectedPaths = stringArrayProperty(configTemplate, "protectedPaths", configTemplatePath);
188
+ const protectedPaths = unique([
189
+ ...baseProtectedPaths,
190
+ androidProject.settingsFile,
191
+ ...modules.map((module) => module.buildFile),
192
+ ]);
193
+ const automationConfig = {
194
+ ...configTemplate,
195
+ gradleVerification,
196
+ androidProject,
197
+ protectedPaths,
198
+ };
199
+ const taskTemplatePath = "automation/tasks/TASK-TEMPLATE.json.example";
200
+ const taskTemplate = readObjectTemplate(taskTemplatePath);
201
+ const defaultFocusedTestTask = gradleVerification.focusedTestTasks[0];
202
+ if (defaultFocusedTestTask === undefined) {
203
+ throw new AdaptiveProjectTemplateError("TEMPLATE_INVALID", "Gradle verification configuration has no focused test task.");
204
+ }
205
+ const taskContractExample = {
206
+ ...taskTemplate,
207
+ allowedPaths: moduleScope === "all"
208
+ ? [...productionPaths, ...testPaths]
209
+ : [
210
+ sourcePattern(primaryModule.directory, "main"),
211
+ sourcePattern(primaryModule.directory, "test"),
212
+ sourcePattern(primaryModule.directory, "androidTest"),
213
+ ],
214
+ forbiddenPaths: protectedPaths.map(taskForbiddenPath),
215
+ targetTests: [
216
+ {
217
+ gradleTask: defaultFocusedTestTask,
218
+ filter: taskTestFilter(primaryModule),
219
+ },
220
+ ],
221
+ };
222
+ return {
223
+ detection,
224
+ projectRoot: detection.projectRoot,
225
+ moduleScope,
226
+ primaryModule,
227
+ automationConfig,
228
+ automationConfigContent: serialize(automationConfig),
229
+ taskContractExample,
230
+ taskContractExampleContent: serialize(taskContractExample),
231
+ };
232
+ }
233
+ //# sourceMappingURL=adaptive-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive-templates.js","sourceRoot":"","sources":["../../src/installer/adaptive-templates.ts"],"names":[],"mappings":"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"}
@@ -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"}