@miranda0808/maya-claude 0.1.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 (270) hide show
  1. package/README.md +30 -0
  2. package/bin/maya-claude.js +36 -0
  3. package/package.json +19 -0
  4. package/payload/.agents/skills/ab-test-setup/SKILL.md +266 -0
  5. package/payload/.agents/skills/ab-test-setup/evals/evals.json +105 -0
  6. package/payload/.agents/skills/ab-test-setup/references/sample-size-guide.md +263 -0
  7. package/payload/.agents/skills/ab-test-setup/references/test-templates.md +277 -0
  8. package/payload/.agents/skills/ad-creative/SKILL.md +362 -0
  9. package/payload/.agents/skills/ad-creative/evals/evals.json +90 -0
  10. package/payload/.agents/skills/ad-creative/references/generative-tools.md +637 -0
  11. package/payload/.agents/skills/ad-creative/references/platform-specs.md +213 -0
  12. package/payload/.agents/skills/ai-seo/SKILL.md +398 -0
  13. package/payload/.agents/skills/ai-seo/evals/evals.json +90 -0
  14. package/payload/.agents/skills/ai-seo/references/content-patterns.md +285 -0
  15. package/payload/.agents/skills/ai-seo/references/platform-ranking-factors.md +152 -0
  16. package/payload/.agents/skills/analytics-tracking/SKILL.md +309 -0
  17. package/payload/.agents/skills/analytics-tracking/evals/evals.json +90 -0
  18. package/payload/.agents/skills/analytics-tracking/references/event-library.md +260 -0
  19. package/payload/.agents/skills/analytics-tracking/references/ga4-implementation.md +300 -0
  20. package/payload/.agents/skills/analytics-tracking/references/gtm-implementation.md +390 -0
  21. package/payload/.agents/skills/churn-prevention/SKILL.md +424 -0
  22. package/payload/.agents/skills/churn-prevention/evals/evals.json +93 -0
  23. package/payload/.agents/skills/churn-prevention/references/cancel-flow-patterns.md +316 -0
  24. package/payload/.agents/skills/churn-prevention/references/dunning-playbook.md +408 -0
  25. package/payload/.agents/skills/cold-email/SKILL.md +158 -0
  26. package/payload/.agents/skills/cold-email/evals/evals.json +94 -0
  27. package/payload/.agents/skills/cold-email/references/benchmarks.md +83 -0
  28. package/payload/.agents/skills/cold-email/references/follow-up-sequences.md +81 -0
  29. package/payload/.agents/skills/cold-email/references/frameworks.md +90 -0
  30. package/payload/.agents/skills/cold-email/references/personalization.md +79 -0
  31. package/payload/.agents/skills/cold-email/references/subject-lines.md +53 -0
  32. package/payload/.agents/skills/competitor-alternatives/SKILL.md +256 -0
  33. package/payload/.agents/skills/competitor-alternatives/evals/evals.json +93 -0
  34. package/payload/.agents/skills/competitor-alternatives/references/content-architecture.md +271 -0
  35. package/payload/.agents/skills/competitor-alternatives/references/templates.md +223 -0
  36. package/payload/.agents/skills/content-strategy/SKILL.md +359 -0
  37. package/payload/.agents/skills/content-strategy/evals/evals.json +90 -0
  38. package/payload/.agents/skills/copy-editing/SKILL.md +447 -0
  39. package/payload/.agents/skills/copy-editing/evals/evals.json +89 -0
  40. package/payload/.agents/skills/copy-editing/references/plain-english-alternatives.md +394 -0
  41. package/payload/.agents/skills/copywriting/SKILL.md +252 -0
  42. package/payload/.agents/skills/copywriting/evals/evals.json +111 -0
  43. package/payload/.agents/skills/copywriting/references/copy-frameworks.md +344 -0
  44. package/payload/.agents/skills/copywriting/references/natural-transitions.md +272 -0
  45. package/payload/.agents/skills/email-sequence/SKILL.md +309 -0
  46. package/payload/.agents/skills/email-sequence/evals/evals.json +93 -0
  47. package/payload/.agents/skills/email-sequence/references/copy-guidelines.md +113 -0
  48. package/payload/.agents/skills/email-sequence/references/email-types.md +515 -0
  49. package/payload/.agents/skills/email-sequence/references/sequence-templates.md +168 -0
  50. package/payload/.agents/skills/form-cro/SKILL.md +429 -0
  51. package/payload/.agents/skills/form-cro/evals/evals.json +90 -0
  52. package/payload/.agents/skills/free-tool-strategy/SKILL.md +178 -0
  53. package/payload/.agents/skills/free-tool-strategy/evals/evals.json +90 -0
  54. package/payload/.agents/skills/free-tool-strategy/references/tool-types.md +217 -0
  55. package/payload/.agents/skills/launch-strategy/SKILL.md +353 -0
  56. package/payload/.agents/skills/launch-strategy/evals/evals.json +91 -0
  57. package/payload/.agents/skills/marketing-ideas/SKILL.md +167 -0
  58. package/payload/.agents/skills/marketing-ideas/evals/evals.json +90 -0
  59. package/payload/.agents/skills/marketing-ideas/references/ideas-by-category.md +366 -0
  60. package/payload/.agents/skills/marketing-psychology/SKILL.md +455 -0
  61. package/payload/.agents/skills/marketing-psychology/evals/evals.json +88 -0
  62. package/payload/.agents/skills/onboarding-cro/SKILL.md +220 -0
  63. package/payload/.agents/skills/onboarding-cro/evals/evals.json +92 -0
  64. package/payload/.agents/skills/onboarding-cro/references/experiments.md +258 -0
  65. package/payload/.agents/skills/page-cro/SKILL.md +182 -0
  66. package/payload/.agents/skills/page-cro/evals/evals.json +111 -0
  67. package/payload/.agents/skills/page-cro/references/experiments.md +248 -0
  68. package/payload/.agents/skills/paid-ads/SKILL.md +315 -0
  69. package/payload/.agents/skills/paid-ads/evals/evals.json +90 -0
  70. package/payload/.agents/skills/paid-ads/references/ad-copy-templates.md +207 -0
  71. package/payload/.agents/skills/paid-ads/references/audience-targeting.md +243 -0
  72. package/payload/.agents/skills/paid-ads/references/platform-setup-checklists.md +277 -0
  73. package/payload/.agents/skills/paywall-upgrade-cro/SKILL.md +227 -0
  74. package/payload/.agents/skills/paywall-upgrade-cro/evals/evals.json +93 -0
  75. package/payload/.agents/skills/paywall-upgrade-cro/references/experiments.md +164 -0
  76. package/payload/.agents/skills/popup-cro/SKILL.md +453 -0
  77. package/payload/.agents/skills/popup-cro/evals/evals.json +94 -0
  78. package/payload/.agents/skills/pricing-strategy/SKILL.md +231 -0
  79. package/payload/.agents/skills/pricing-strategy/evals/evals.json +90 -0
  80. package/payload/.agents/skills/pricing-strategy/references/research-methods.md +152 -0
  81. package/payload/.agents/skills/pricing-strategy/references/tier-structure.md +232 -0
  82. package/payload/.agents/skills/product-marketing-context/SKILL.md +27 -0
  83. package/payload/.agents/skills/product-marketing-context/evals/evals.json +40 -0
  84. package/payload/.agents/skills/programmatic-seo/SKILL.md +238 -0
  85. package/payload/.agents/skills/programmatic-seo/evals/evals.json +94 -0
  86. package/payload/.agents/skills/programmatic-seo/references/playbooks.md +308 -0
  87. package/payload/.agents/skills/referral-program/SKILL.md +255 -0
  88. package/payload/.agents/skills/referral-program/evals/evals.json +89 -0
  89. package/payload/.agents/skills/referral-program/references/affiliate-programs.md +164 -0
  90. package/payload/.agents/skills/referral-program/references/program-examples.md +143 -0
  91. package/payload/.agents/skills/revops/SKILL.md +343 -0
  92. package/payload/.agents/skills/revops/evals/evals.json +91 -0
  93. package/payload/.agents/skills/revops/references/automation-playbooks.md +290 -0
  94. package/payload/.agents/skills/revops/references/lifecycle-definitions.md +278 -0
  95. package/payload/.agents/skills/revops/references/routing-rules.md +203 -0
  96. package/payload/.agents/skills/revops/references/scoring-models.md +247 -0
  97. package/payload/.agents/skills/sales-enablement/SKILL.md +349 -0
  98. package/payload/.agents/skills/sales-enablement/evals/evals.json +91 -0
  99. package/payload/.agents/skills/sales-enablement/references/deck-frameworks.md +263 -0
  100. package/payload/.agents/skills/sales-enablement/references/demo-scripts.md +355 -0
  101. package/payload/.agents/skills/sales-enablement/references/objection-library.md +270 -0
  102. package/payload/.agents/skills/sales-enablement/references/one-pager-templates.md +208 -0
  103. package/payload/.agents/skills/schema-markup/SKILL.md +179 -0
  104. package/payload/.agents/skills/schema-markup/evals/evals.json +87 -0
  105. package/payload/.agents/skills/schema-markup/references/schema-examples.md +398 -0
  106. package/payload/.agents/skills/seo-audit/SKILL.md +412 -0
  107. package/payload/.agents/skills/seo-audit/evals/evals.json +136 -0
  108. package/payload/.agents/skills/seo-audit/references/ai-writing-detection.md +200 -0
  109. package/payload/.agents/skills/signup-flow-cro/SKILL.md +359 -0
  110. package/payload/.agents/skills/signup-flow-cro/evals/evals.json +88 -0
  111. package/payload/.agents/skills/site-architecture/SKILL.md +357 -0
  112. package/payload/.agents/skills/site-architecture/evals/evals.json +88 -0
  113. package/payload/.agents/skills/site-architecture/references/mermaid-templates.md +216 -0
  114. package/payload/.agents/skills/site-architecture/references/navigation-patterns.md +305 -0
  115. package/payload/.agents/skills/site-architecture/references/site-type-templates.md +293 -0
  116. package/payload/.agents/skills/social-content/SKILL.md +278 -0
  117. package/payload/.agents/skills/social-content/evals/evals.json +92 -0
  118. package/payload/.agents/skills/social-content/references/platforms.md +170 -0
  119. package/payload/.agents/skills/social-content/references/post-templates.md +177 -0
  120. package/payload/.agents/skills/social-content/references/reverse-engineering.md +195 -0
  121. package/payload/.maya/executor.md +79 -0
  122. package/payload/.maya/meta-api-agent.md +48 -0
  123. package/payload/.maya/modes/consult.md +63 -0
  124. package/payload/.maya/modes/task.md +97 -0
  125. package/payload/.maya/planner.md +69 -0
  126. package/payload/.maya/researcher.md +51 -0
  127. package/payload/.maya/templates/plan.md +77 -0
  128. package/payload/.maya/templates/state.md +87 -0
  129. package/payload/.maya/templates/task-packet.md +75 -0
  130. package/payload/MAYA-CATALOG.md +115 -0
  131. package/payload/MAYA-DEPENDENCIES.md +58 -0
  132. package/payload/MAYA.md +151 -0
  133. package/payload/campaigns/README.md +14 -0
  134. package/payload/commands/maya-consult.md +28 -0
  135. package/payload/commands/maya-task.md +38 -0
  136. package/payload/commands/product.md +55 -0
  137. package/payload/research/README.md +14 -0
  138. package/payload/templates/README.md +15 -0
  139. package/payload/templates/plan.md +77 -0
  140. package/payload/templates/state.md +87 -0
  141. package/payload/templates/task-packet.md +75 -0
  142. package/payload/tools/REGISTRY.md +368 -0
  143. package/payload/tools/clis/README.md +187 -0
  144. package/payload/tools/clis/activecampaign.js +435 -0
  145. package/payload/tools/clis/adobe-analytics.js +161 -0
  146. package/payload/tools/clis/ahrefs.js +192 -0
  147. package/payload/tools/clis/amplitude.js +182 -0
  148. package/payload/tools/clis/apollo.js +142 -0
  149. package/payload/tools/clis/beehiiv.js +245 -0
  150. package/payload/tools/clis/brevo.js +368 -0
  151. package/payload/tools/clis/buffer.js +260 -0
  152. package/payload/tools/clis/calendly.js +253 -0
  153. package/payload/tools/clis/clearbit.js +163 -0
  154. package/payload/tools/clis/customer-io.js +205 -0
  155. package/payload/tools/clis/dataforseo.js +257 -0
  156. package/payload/tools/clis/demio.js +149 -0
  157. package/payload/tools/clis/dub.js +158 -0
  158. package/payload/tools/clis/g2.js +186 -0
  159. package/payload/tools/clis/ga4.js +194 -0
  160. package/payload/tools/clis/google-ads.js +189 -0
  161. package/payload/tools/clis/google-search-console.js +166 -0
  162. package/payload/tools/clis/hotjar.js +167 -0
  163. package/payload/tools/clis/hunter.js +249 -0
  164. package/payload/tools/clis/instantly.js +270 -0
  165. package/payload/tools/clis/intercom.js +399 -0
  166. package/payload/tools/clis/keywords-everywhere.js +185 -0
  167. package/payload/tools/clis/kit.js +232 -0
  168. package/payload/tools/clis/klaviyo.js +348 -0
  169. package/payload/tools/clis/lemlist.js +221 -0
  170. package/payload/tools/clis/linkedin-ads.js +185 -0
  171. package/payload/tools/clis/livestorm.js +292 -0
  172. package/payload/tools/clis/mailchimp.js +220 -0
  173. package/payload/tools/clis/mention-me.js +161 -0
  174. package/payload/tools/clis/meta-ads.js +181 -0
  175. package/payload/tools/clis/mixpanel.js +248 -0
  176. package/payload/tools/clis/onesignal.js +241 -0
  177. package/payload/tools/clis/optimizely.js +233 -0
  178. package/payload/tools/clis/paddle.js +385 -0
  179. package/payload/tools/clis/partnerstack.js +382 -0
  180. package/payload/tools/clis/plausible.js +249 -0
  181. package/payload/tools/clis/postmark.js +375 -0
  182. package/payload/tools/clis/resend.js +370 -0
  183. package/payload/tools/clis/rewardful.js +160 -0
  184. package/payload/tools/clis/savvycal.js +223 -0
  185. package/payload/tools/clis/segment.js +192 -0
  186. package/payload/tools/clis/semrush.js +207 -0
  187. package/payload/tools/clis/sendgrid.js +211 -0
  188. package/payload/tools/clis/snov.js +237 -0
  189. package/payload/tools/clis/tiktok-ads.js +190 -0
  190. package/payload/tools/clis/tolt.js +153 -0
  191. package/payload/tools/clis/trustpilot.js +276 -0
  192. package/payload/tools/clis/typeform.js +269 -0
  193. package/payload/tools/clis/wistia.js +256 -0
  194. package/payload/tools/clis/zapier.js +160 -0
  195. package/payload/tools/integrations/activecampaign.md +337 -0
  196. package/payload/tools/integrations/adobe-analytics.md +156 -0
  197. package/payload/tools/integrations/ahrefs.md +142 -0
  198. package/payload/tools/integrations/amplitude.md +135 -0
  199. package/payload/tools/integrations/apollo.md +148 -0
  200. package/payload/tools/integrations/beehiiv.md +157 -0
  201. package/payload/tools/integrations/brevo.md +268 -0
  202. package/payload/tools/integrations/buffer.md +138 -0
  203. package/payload/tools/integrations/calendly.md +161 -0
  204. package/payload/tools/integrations/clearbit.md +142 -0
  205. package/payload/tools/integrations/customer-io.md +187 -0
  206. package/payload/tools/integrations/dataforseo.md +165 -0
  207. package/payload/tools/integrations/demio.md +182 -0
  208. package/payload/tools/integrations/dub-co.md +160 -0
  209. package/payload/tools/integrations/g2.md +179 -0
  210. package/payload/tools/integrations/ga4.md +126 -0
  211. package/payload/tools/integrations/google-ads.md +159 -0
  212. package/payload/tools/integrations/google-search-console.md +147 -0
  213. package/payload/tools/integrations/hotjar.md +147 -0
  214. package/payload/tools/integrations/hubspot.md +178 -0
  215. package/payload/tools/integrations/hunter.md +90 -0
  216. package/payload/tools/integrations/instantly.md +104 -0
  217. package/payload/tools/integrations/intercom.md +292 -0
  218. package/payload/tools/integrations/keywords-everywhere.md +207 -0
  219. package/payload/tools/integrations/kit.md +167 -0
  220. package/payload/tools/integrations/klaviyo.md +228 -0
  221. package/payload/tools/integrations/lemlist.md +110 -0
  222. package/payload/tools/integrations/linkedin-ads.md +164 -0
  223. package/payload/tools/integrations/livestorm.md +313 -0
  224. package/payload/tools/integrations/mailchimp.md +150 -0
  225. package/payload/tools/integrations/mention-me.md +160 -0
  226. package/payload/tools/integrations/meta-ads.md +147 -0
  227. package/payload/tools/integrations/mixpanel.md +137 -0
  228. package/payload/tools/integrations/onesignal.md +229 -0
  229. package/payload/tools/integrations/optimizely.md +171 -0
  230. package/payload/tools/integrations/paddle.md +212 -0
  231. package/payload/tools/integrations/partnerstack.md +222 -0
  232. package/payload/tools/integrations/plausible.md +177 -0
  233. package/payload/tools/integrations/posthog.md +151 -0
  234. package/payload/tools/integrations/postmark.md +234 -0
  235. package/payload/tools/integrations/resend.md +168 -0
  236. package/payload/tools/integrations/rewardful.md +147 -0
  237. package/payload/tools/integrations/salesforce.md +150 -0
  238. package/payload/tools/integrations/savvycal.md +181 -0
  239. package/payload/tools/integrations/segment.md +159 -0
  240. package/payload/tools/integrations/semrush.md +121 -0
  241. package/payload/tools/integrations/sendgrid.md +161 -0
  242. package/payload/tools/integrations/shopify.md +176 -0
  243. package/payload/tools/integrations/snov.md +94 -0
  244. package/payload/tools/integrations/stripe.md +148 -0
  245. package/payload/tools/integrations/tiktok-ads.md +161 -0
  246. package/payload/tools/integrations/tolt.md +144 -0
  247. package/payload/tools/integrations/trustpilot.md +191 -0
  248. package/payload/tools/integrations/typeform.md +190 -0
  249. package/payload/tools/integrations/webflow.md +198 -0
  250. package/payload/tools/integrations/wistia.md +164 -0
  251. package/payload/tools/integrations/wordpress.md +175 -0
  252. package/payload/tools/integrations/zapier.md +150 -0
  253. package/payload/tools/meta/README.md +55 -0
  254. package/payload/tools/meta/meta-cache-schema.md +65 -0
  255. package/payload/tools/meta/meta-fetch.ps1 +324 -0
  256. package/payload/tools/meta/meta-fetch.test.ps1 +38 -0
  257. package/vendor/shared-installer/manifests/claude-files.json +13 -0
  258. package/vendor/shared-installer/manifests/codex-files.json +13 -0
  259. package/vendor/shared-installer/manifests/common-files.json +13 -0
  260. package/vendor/shared-installer/package.json +15 -0
  261. package/vendor/shared-installer/src/bootstrap.js +12 -0
  262. package/vendor/shared-installer/src/cli-options.js +53 -0
  263. package/vendor/shared-installer/src/fs.js +105 -0
  264. package/vendor/shared-installer/src/index.js +44 -0
  265. package/vendor/shared-installer/src/install.js +157 -0
  266. package/vendor/shared-installer/src/manifest.js +52 -0
  267. package/vendor/shared-installer/templates/claude/.claude/skills/.gitkeep +1 -0
  268. package/vendor/shared-installer/templates/claude/CLAUDE.md +27 -0
  269. package/vendor/shared-installer/templates/codex/.agent/skills/.gitkeep +1 -0
  270. package/vendor/shared-installer/templates/codex/AGENTS.md +27 -0
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ function parseCliArgs(argv = []) {
4
+ const options = {
5
+ command: null,
6
+ dryRun: false,
7
+ force: false,
8
+ target: undefined,
9
+ };
10
+
11
+ for (let index = 0; index < argv.length; index += 1) {
12
+ const token = argv[index];
13
+
14
+ if (token === "--dry-run") {
15
+ options.dryRun = true;
16
+ continue;
17
+ }
18
+
19
+ if (token === "--force") {
20
+ options.force = true;
21
+ continue;
22
+ }
23
+
24
+ if (token === "--target") {
25
+ const target = argv[index + 1];
26
+
27
+ if (!target) {
28
+ throw new Error("Missing value for --target");
29
+ }
30
+
31
+ options.target = target;
32
+ index += 1;
33
+ continue;
34
+ }
35
+
36
+ if (token.startsWith("--")) {
37
+ throw new Error(`Unknown option: ${token}`);
38
+ }
39
+
40
+ if (!options.command) {
41
+ options.command = token;
42
+ continue;
43
+ }
44
+
45
+ throw new Error(`Unexpected argument: ${token}`);
46
+ }
47
+
48
+ return options;
49
+ }
50
+
51
+ module.exports = {
52
+ parseCliArgs,
53
+ };
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+
3
+ const { access, copyFile, mkdir, readdir, readFile, stat, writeFile } = require("node:fs/promises");
4
+ const path = require("node:path");
5
+
6
+ function toPosixPath(value) {
7
+ return value.split(path.sep).join("/");
8
+ }
9
+
10
+ function fromPosixPath(basePath, relativePath) {
11
+ const segments = relativePath.split("/").filter(Boolean);
12
+ return path.join(basePath, ...segments);
13
+ }
14
+
15
+ function joinPosixPath(...segments) {
16
+ return segments.filter(Boolean).join("/").replace(/\/+/g, "/");
17
+ }
18
+
19
+ function resolveTargetDirectory(options = {}) {
20
+ const cwd = options.cwd || process.cwd();
21
+ const target = options.target || ".";
22
+
23
+ return path.resolve(cwd, target);
24
+ }
25
+
26
+ async function pathExists(targetPath) {
27
+ try {
28
+ await access(targetPath);
29
+ return true;
30
+ } catch (error) {
31
+ if (error && error.code === "ENOENT") {
32
+ return false;
33
+ }
34
+
35
+ throw error;
36
+ }
37
+ }
38
+
39
+ async function assertExistingDirectory(targetPath) {
40
+ let details;
41
+
42
+ try {
43
+ details = await stat(targetPath);
44
+ } catch (error) {
45
+ if (error && error.code === "ENOENT") {
46
+ throw new Error(`Target directory does not exist: ${targetPath}`);
47
+ }
48
+
49
+ throw error;
50
+ }
51
+
52
+ if (!details.isDirectory()) {
53
+ throw new Error(`Target path is not a directory: ${targetPath}`);
54
+ }
55
+ }
56
+
57
+ async function ensureDirectory(targetPath) {
58
+ await mkdir(targetPath, { recursive: true });
59
+ }
60
+
61
+ async function listFilesRecursive(rootPath, currentRelative = "") {
62
+ const entries = await readdir(rootPath, { withFileTypes: true });
63
+ const files = [];
64
+
65
+ for (const entry of entries) {
66
+ const entryRelative = currentRelative ? joinPosixPath(currentRelative, entry.name) : entry.name;
67
+ const entryPath = path.join(rootPath, entry.name);
68
+
69
+ if (entry.isDirectory()) {
70
+ files.push(...(await listFilesRecursive(entryPath, entryRelative)));
71
+ continue;
72
+ }
73
+
74
+ files.push(entryRelative);
75
+ }
76
+
77
+ return files.sort();
78
+ }
79
+
80
+ function normalizeLineEndings(content) {
81
+ return content.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
82
+ }
83
+
84
+ async function writeTextFile(targetPath, content) {
85
+ await writeFile(targetPath, normalizeLineEndings(content), "utf8");
86
+ }
87
+
88
+ async function copyOpaqueFile(sourcePath, destinationPath) {
89
+ await copyFile(sourcePath, destinationPath);
90
+ }
91
+
92
+ module.exports = {
93
+ assertExistingDirectory,
94
+ copyOpaqueFile,
95
+ ensureDirectory,
96
+ fromPosixPath,
97
+ joinPosixPath,
98
+ listFilesRecursive,
99
+ normalizeLineEndings,
100
+ pathExists,
101
+ readFile,
102
+ resolveTargetDirectory,
103
+ toPosixPath,
104
+ writeTextFile,
105
+ };
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ const { parseCliArgs } = require("./cli-options");
4
+ const { buildInstallPlan, installMaya } = require("./install");
5
+ const { resolveTargetDirectory } = require("./fs");
6
+ const { loadManifest } = require("./manifest");
7
+
8
+ async function runInstallerCli(options = {}) {
9
+ const stdout = options.stdout || process.stdout;
10
+ const argv = options.argv || [];
11
+ const parsed = parseCliArgs(argv);
12
+
13
+ if (parsed.command !== "init") {
14
+ throw new Error("Expected the install command: init");
15
+ }
16
+
17
+ const summary = await installMaya({
18
+ cwd: options.cwd,
19
+ dryRun: parsed.dryRun,
20
+ force: parsed.force,
21
+ host: options.host,
22
+ installerRoot: options.installerRoot,
23
+ payloadRoot: options.payloadRoot,
24
+ repoRoot: options.repoRoot,
25
+ target: parsed.target,
26
+ });
27
+
28
+ if (summary.dryRun) {
29
+ stdout.write(`Planned ${summary.operations.length} Maya files for ${summary.host}.\n`);
30
+ } else {
31
+ stdout.write(`Installed Maya for ${summary.host} into ${summary.targetDirectory}.\n`);
32
+ }
33
+
34
+ return summary;
35
+ }
36
+
37
+ module.exports = {
38
+ buildInstallPlan,
39
+ installMaya,
40
+ loadManifest,
41
+ parseCliArgs,
42
+ resolveTargetDirectory,
43
+ runInstallerCli,
44
+ };
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+
3
+ const path = require("node:path");
4
+ const { renderBootstrap } = require("./bootstrap");
5
+ const {
6
+ assertExistingDirectory,
7
+ copyOpaqueFile,
8
+ ensureDirectory,
9
+ fromPosixPath,
10
+ joinPosixPath,
11
+ listFilesRecursive,
12
+ pathExists,
13
+ resolveTargetDirectory,
14
+ toPosixPath,
15
+ writeTextFile,
16
+ } = require("./fs");
17
+ const { loadManifest, resolveInstallerRoot, resolvePayloadRoot } = require("./manifest");
18
+
19
+ async function expandManifestFiles(files, context) {
20
+ const operations = [];
21
+
22
+ for (const entry of files) {
23
+ const sourceBase = entry.template ? context.installerRoot : context.payloadRoot;
24
+ const sourceRoot = fromPosixPath(sourceBase, entry.source);
25
+ const sourceDetails = await require("node:fs/promises").stat(sourceRoot);
26
+
27
+ if (sourceDetails.isDirectory()) {
28
+ const children = await listFilesRecursive(sourceRoot);
29
+
30
+ for (const child of children) {
31
+ const destinationRelative = joinPosixPath(entry.destination, child);
32
+ operations.push({
33
+ destinationPath: fromPosixPath(context.targetDirectory, destinationRelative),
34
+ destinationRelative,
35
+ sourcePath: path.join(sourceRoot, ...child.split("/")),
36
+ sourceRelative: joinPosixPath(entry.source, child),
37
+ template: false,
38
+ });
39
+ }
40
+
41
+ continue;
42
+ }
43
+
44
+ operations.push({
45
+ destinationPath: fromPosixPath(context.targetDirectory, entry.destination),
46
+ destinationRelative: entry.destination,
47
+ sourcePath: sourceRoot,
48
+ sourceRelative: entry.source,
49
+ template: entry.template,
50
+ });
51
+ }
52
+
53
+ return operations;
54
+ }
55
+
56
+ async function buildInstallPlan(options = {}) {
57
+ if (!options.host) {
58
+ throw new Error("A host id is required.");
59
+ }
60
+
61
+ const installerRoot = resolveInstallerRoot(options);
62
+ const payloadRoot = resolvePayloadRoot(options);
63
+ const targetDirectory = resolveTargetDirectory({ cwd: options.cwd, target: options.target });
64
+ await assertExistingDirectory(targetDirectory);
65
+
66
+ const commonManifest = await loadManifest("common", { installerRoot });
67
+ const hostManifest = await loadManifest(options.host, { installerRoot });
68
+ const operations = [
69
+ ...(await expandManifestFiles(commonManifest.files, { installerRoot, payloadRoot, targetDirectory })),
70
+ ...(await expandManifestFiles(hostManifest.files, { installerRoot, payloadRoot, targetDirectory })),
71
+ ];
72
+
73
+ const plannedOperations = [];
74
+
75
+ for (const operation of operations) {
76
+ plannedOperations.push({
77
+ ...operation,
78
+ exists: await pathExists(operation.destinationPath),
79
+ });
80
+ }
81
+
82
+ const conflicts = plannedOperations
83
+ .filter((operation) => operation.exists)
84
+ .map((operation) => operation.destinationRelative);
85
+
86
+ return {
87
+ conflicts,
88
+ dryRun: Boolean(options.dryRun),
89
+ force: Boolean(options.force),
90
+ host: options.host,
91
+ installerRoot,
92
+ manifests: {
93
+ common: commonManifest.manifestPath,
94
+ host: hostManifest.manifestPath,
95
+ },
96
+ operations: plannedOperations,
97
+ payloadRoot,
98
+ targetDirectory,
99
+ };
100
+ }
101
+
102
+ function summarizePlan(plan) {
103
+ return {
104
+ conflicts: [...plan.conflicts],
105
+ dryRun: plan.dryRun,
106
+ force: plan.force,
107
+ host: plan.host,
108
+ manifests: { ...plan.manifests },
109
+ operations: plan.operations.map((operation) => ({
110
+ destinationRelative: operation.destinationRelative,
111
+ exists: operation.exists,
112
+ mode: operation.template ? "template" : "copy",
113
+ sourceRelative: operation.sourceRelative,
114
+ })),
115
+ targetDirectory: plan.targetDirectory,
116
+ };
117
+ }
118
+
119
+ async function installMaya(options = {}) {
120
+ const plan = await buildInstallPlan(options);
121
+
122
+ if (plan.conflicts.length > 0 && !plan.force && !plan.dryRun) {
123
+ throw new Error(
124
+ `Refusing to overwrite files that already exists without --force: ${plan.conflicts.join(", ")}`,
125
+ );
126
+ }
127
+
128
+ if (plan.dryRun) {
129
+ return summarizePlan(plan);
130
+ }
131
+
132
+ const writtenFiles = [];
133
+
134
+ for (const operation of plan.operations) {
135
+ await ensureDirectory(path.dirname(operation.destinationPath));
136
+
137
+ if (operation.template) {
138
+ const content = await renderBootstrap(operation, { host: plan.host });
139
+ await writeTextFile(operation.destinationPath, content);
140
+ } else {
141
+ await copyOpaqueFile(operation.sourcePath, operation.destinationPath);
142
+ }
143
+
144
+ writtenFiles.push(operation.destinationRelative);
145
+ }
146
+
147
+ return {
148
+ ...summarizePlan(plan),
149
+ writtenFiles,
150
+ };
151
+ }
152
+
153
+ module.exports = {
154
+ buildInstallPlan,
155
+ installMaya,
156
+ summarizePlan,
157
+ };
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ const path = require("node:path");
4
+ const { readFile } = require("./fs");
5
+
6
+ function resolveInstallerRoot(options = {}) {
7
+ return options.installerRoot || path.resolve(__dirname, "..");
8
+ }
9
+
10
+ function resolvePayloadRoot(options = {}) {
11
+ return options.payloadRoot || options.repoRoot || path.resolve(__dirname, "..", "..", "..");
12
+ }
13
+
14
+ function getManifestPath(name, options = {}) {
15
+ return path.join(resolveInstallerRoot(options), "manifests", `${name}-files.json`);
16
+ }
17
+
18
+ function normalizeEntry(entry) {
19
+ if (typeof entry === "string") {
20
+ return {
21
+ source: entry,
22
+ destination: entry,
23
+ template: false,
24
+ };
25
+ }
26
+
27
+ return {
28
+ source: entry.source,
29
+ destination: entry.destination || entry.source,
30
+ template: Boolean(entry.template),
31
+ };
32
+ }
33
+
34
+ async function loadManifest(name, options = {}) {
35
+ const manifestPath = getManifestPath(name, options);
36
+ const content = await readFile(manifestPath, "utf8");
37
+ const manifest = JSON.parse(content);
38
+
39
+ return {
40
+ name,
41
+ manifestPath,
42
+ files: manifest.files.map(normalizeEntry),
43
+ };
44
+ }
45
+
46
+ module.exports = {
47
+ getManifestPath,
48
+ loadManifest,
49
+ normalizeEntry,
50
+ resolveInstallerRoot,
51
+ resolvePayloadRoot,
52
+ };
@@ -0,0 +1,27 @@
1
+ # Maya
2
+
3
+ Maya is the repo-local marketing department for this repository.
4
+
5
+ ## Runtime Rules
6
+
7
+ - Address the user as `Justin`.
8
+ - Only open Maya when Justin explicitly asks for Maya or starts a marketing workflow.
9
+ - Use only `/maya:consult` and `/maya:task` as Maya entrypoints.
10
+ - Keep Maya repo-local in this project.
11
+ - In task mode, show the proposed specialist chain for approval before any specialists execute.
12
+
13
+ ## Runtime Files
14
+
15
+ Use these repo-local Maya files and folders:
16
+ - `MAYA.md`
17
+ - `MAYA-CATALOG.md`
18
+ - `MAYA-DEPENDENCIES.md`
19
+ - `commands/`
20
+ - `.maya/`
21
+ - `.claude/skills/`
22
+
23
+ ## Mode Rules
24
+
25
+ - `/maya:consult` is advisory and lower-cost.
26
+ - `/maya:task` is approval-gated execution.
27
+ - Maya never silently switches modes.
@@ -0,0 +1,27 @@
1
+ # Maya
2
+
3
+ Maya is the repo-local marketing department for this repository.
4
+
5
+ ## Runtime Rules
6
+
7
+ - Address the user as `Justin`.
8
+ - Only open Maya when Justin explicitly asks for Maya or starts a marketing workflow.
9
+ - Use only `/maya:consult` and `/maya:task` as Maya entrypoints.
10
+ - Keep Maya repo-local in this project.
11
+ - In task mode, show the proposed specialist chain for approval before any specialists execute.
12
+
13
+ ## Runtime Files
14
+
15
+ Use these repo-local Maya files and folders:
16
+ - `MAYA.md`
17
+ - `MAYA-CATALOG.md`
18
+ - `MAYA-DEPENDENCIES.md`
19
+ - `commands/`
20
+ - `.maya/`
21
+ - `.agent/skills/`
22
+
23
+ ## Mode Rules
24
+
25
+ - `/maya:consult` is advisory and lower-cost.
26
+ - `/maya:task` is approval-gated execution.
27
+ - Maya never silently switches modes.