@gadgetinc/ggt 2.2.0 → 2.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 (127) hide show
  1. package/README.md +26 -1
  2. package/dist/{add-TWLGKL2T.js → add-7MLI3TCY.js} +8 -8
  3. package/dist/add-7MLI3TCY.js.map +7 -0
  4. package/dist/agent-plugin-543K6WBH.js +11 -0
  5. package/dist/agent-plugin-543K6WBH.js.map +7 -0
  6. package/dist/chunk-2HJS3KFB.js +2 -0
  7. package/dist/{chunk-T6UHSWMT.js.map → chunk-2HJS3KFB.js.map} +2 -2
  8. package/dist/{chunk-3OM5WM7E.js → chunk-3WKH3DJL.js} +2 -2
  9. package/dist/chunk-577KP32Z.js +8 -0
  10. package/dist/chunk-577KP32Z.js.map +7 -0
  11. package/dist/{chunk-R6KJLEKY.js → chunk-6FVHOLT7.js} +2 -2
  12. package/dist/chunk-6FVHOLT7.js.map +7 -0
  13. package/dist/{chunk-HCULGPBH.js → chunk-72J7X5LR.js} +2 -2
  14. package/dist/{chunk-HCULGPBH.js.map → chunk-72J7X5LR.js.map} +2 -2
  15. package/dist/{chunk-JG2QCDK2.js → chunk-ALSXPCRD.js} +5 -5
  16. package/dist/{chunk-JG2QCDK2.js.map → chunk-ALSXPCRD.js.map} +4 -4
  17. package/dist/{chunk-SIR6HLN3.js → chunk-CNNOPE5K.js} +22 -22
  18. package/dist/chunk-CNNOPE5K.js.map +7 -0
  19. package/dist/chunk-ETKWDO4V.js +2 -0
  20. package/dist/chunk-ETKWDO4V.js.map +7 -0
  21. package/dist/{chunk-DR4CXBD6.js → chunk-F6BGQ4LG.js} +2 -2
  22. package/dist/{chunk-DR4CXBD6.js.map → chunk-F6BGQ4LG.js.map} +2 -2
  23. package/dist/{chunk-SVWK2NXG.js → chunk-FE5O5VX4.js} +2 -2
  24. package/dist/chunk-FE5O5VX4.js.map +7 -0
  25. package/dist/{chunk-F255O64V.js → chunk-GZTHIOXS.js} +2 -2
  26. package/dist/chunk-GZTHIOXS.js.map +7 -0
  27. package/dist/chunk-IQSZEOYY.js +283 -0
  28. package/dist/{chunk-442CSROP.js.map → chunk-IQSZEOYY.js.map} +4 -4
  29. package/dist/chunk-N5FFICAP.js +9 -0
  30. package/dist/chunk-N5FFICAP.js.map +7 -0
  31. package/dist/chunk-TGCJ6TMW.js +10 -0
  32. package/dist/chunk-TGCJ6TMW.js.map +7 -0
  33. package/dist/{chunk-XC4F2TLW.js → chunk-ULJYEUQG.js} +19 -19
  34. package/dist/chunk-ULJYEUQG.js.map +7 -0
  35. package/dist/{chunk-2742UPMB.js → chunk-UVVKKUYG.js} +2 -2
  36. package/dist/chunk-UVVKKUYG.js.map +7 -0
  37. package/dist/{chunk-WB6O2V5D.js → chunk-WZ2PO6H2.js} +2 -2
  38. package/dist/{chunk-OUIZQC4D.js → chunk-X4XSYLCE.js} +2 -2
  39. package/dist/{chunk-OUIZQC4D.js.map → chunk-X4XSYLCE.js.map} +2 -2
  40. package/dist/{configure-UJS7V2JX.js → configure-PYRXYNGZ.js} +2 -2
  41. package/dist/configure-PYRXYNGZ.js.map +7 -0
  42. package/dist/{debugger-QN2MCLBL.js → debugger-VKLUEWIN.js} +2 -2
  43. package/dist/debugger-VKLUEWIN.js.map +7 -0
  44. package/dist/{deploy-J74PHPQA.js → deploy-JCREEGBA.js} +3 -3
  45. package/dist/deploy-JCREEGBA.js.map +7 -0
  46. package/dist/{dev-GGUSOOYP.js → dev-Y2GLI7EH.js} +3 -3
  47. package/dist/{dev-GGUSOOYP.js.map → dev-Y2GLI7EH.js.map} +3 -3
  48. package/dist/env-5OPHX3MC.js +135 -0
  49. package/dist/env-5OPHX3MC.js.map +7 -0
  50. package/dist/esm-3JVXH7DT.js +37 -0
  51. package/dist/esm-3JVXH7DT.js.map +7 -0
  52. package/dist/{eval-L6WHUFLU.js → eval-LZPZ6PBQ.js} +3 -3
  53. package/dist/{eval-L6WHUFLU.js.map → eval-LZPZ6PBQ.js.map} +2 -2
  54. package/dist/ggt-KUAF6WUA.js +45 -0
  55. package/dist/ggt-KUAF6WUA.js.map +7 -0
  56. package/dist/{list-756D46N5.js → list-IANT7SNF.js} +2 -2
  57. package/dist/list-IANT7SNF.js.map +7 -0
  58. package/dist/login-TYRZLN5S.js +2 -0
  59. package/dist/{logout-LQABTJFD.js → logout-P75XYYZ6.js} +2 -2
  60. package/dist/logout-P75XYYZ6.js.map +7 -0
  61. package/dist/{logs-AQZB272X.js → logs-SBMD6JSR.js} +2 -2
  62. package/dist/logs-SBMD6JSR.js.map +7 -0
  63. package/dist/main.js +1 -1
  64. package/dist/{open-OMZWPQ66.js → open-JPAMII4K.js} +2 -2
  65. package/dist/open-JPAMII4K.js.map +7 -0
  66. package/dist/problems-EZRSHLZT.js +14 -0
  67. package/dist/problems-EZRSHLZT.js.map +7 -0
  68. package/dist/{pull-XYCYN7QN.js → pull-R3PMBVOT.js} +2 -2
  69. package/dist/pull-R3PMBVOT.js.map +7 -0
  70. package/dist/push-5XEEESQQ.js +2 -0
  71. package/dist/{status-PWAXNK5G.js → status-RJN5ES6S.js} +2 -2
  72. package/dist/status-RJN5ES6S.js.map +7 -0
  73. package/dist/update-X7YS3MNH.js +2 -0
  74. package/dist/{var-N4WGGJXZ.js → var-PC6KQUPF.js} +4 -4
  75. package/dist/var-PC6KQUPF.js.map +7 -0
  76. package/dist/{version-AJKSJJDC.js → version-GZJOU2CV.js} +2 -2
  77. package/dist/version-GZJOU2CV.js.map +7 -0
  78. package/dist/{whoami-KJYDSQSD.js → whoami-GKPGPZ3B.js} +2 -2
  79. package/dist/whoami-GKPGPZ3B.js.map +7 -0
  80. package/package.json +6 -6
  81. package/dist/add-TWLGKL2T.js.map +0 -7
  82. package/dist/agent-plugin-TN24O7FB.js +0 -10
  83. package/dist/agent-plugin-TN24O7FB.js.map +0 -7
  84. package/dist/chunk-2742UPMB.js.map +0 -7
  85. package/dist/chunk-442CSROP.js +0 -66
  86. package/dist/chunk-F255O64V.js.map +0 -7
  87. package/dist/chunk-JKZNSRLU.js +0 -8
  88. package/dist/chunk-JKZNSRLU.js.map +0 -7
  89. package/dist/chunk-JYE5LLIF.js +0 -9
  90. package/dist/chunk-JYE5LLIF.js.map +0 -7
  91. package/dist/chunk-MW6MXMSN.js +0 -2
  92. package/dist/chunk-MW6MXMSN.js.map +0 -7
  93. package/dist/chunk-R6KJLEKY.js.map +0 -7
  94. package/dist/chunk-SIR6HLN3.js.map +0 -7
  95. package/dist/chunk-SVWK2NXG.js.map +0 -7
  96. package/dist/chunk-T6UHSWMT.js +0 -2
  97. package/dist/chunk-XC4F2TLW.js.map +0 -7
  98. package/dist/chunk-YFUOXDPK.js +0 -10
  99. package/dist/chunk-YFUOXDPK.js.map +0 -7
  100. package/dist/chunk-ZSREFZXV.js +0 -211
  101. package/dist/chunk-ZSREFZXV.js.map +0 -7
  102. package/dist/configure-UJS7V2JX.js.map +0 -7
  103. package/dist/debugger-QN2MCLBL.js.map +0 -7
  104. package/dist/deploy-J74PHPQA.js.map +0 -7
  105. package/dist/esm-D77XRR65.js +0 -38
  106. package/dist/esm-D77XRR65.js.map +0 -7
  107. package/dist/ggt-5XNRJZSW.js +0 -44
  108. package/dist/ggt-5XNRJZSW.js.map +0 -7
  109. package/dist/list-756D46N5.js.map +0 -7
  110. package/dist/login-GMWQRH7V.js +0 -2
  111. package/dist/logout-LQABTJFD.js.map +0 -7
  112. package/dist/logs-AQZB272X.js.map +0 -7
  113. package/dist/open-OMZWPQ66.js.map +0 -7
  114. package/dist/problems-FZJKH52E.js +0 -14
  115. package/dist/problems-FZJKH52E.js.map +0 -7
  116. package/dist/pull-XYCYN7QN.js.map +0 -7
  117. package/dist/push-3QM7ZFTC.js +0 -2
  118. package/dist/status-PWAXNK5G.js.map +0 -7
  119. package/dist/update-QIQFJFRQ.js +0 -2
  120. package/dist/var-N4WGGJXZ.js.map +0 -7
  121. package/dist/version-AJKSJJDC.js.map +0 -7
  122. package/dist/whoami-KJYDSQSD.js.map +0 -7
  123. /package/dist/{chunk-3OM5WM7E.js.map → chunk-3WKH3DJL.js.map} +0 -0
  124. /package/dist/{chunk-WB6O2V5D.js.map → chunk-WZ2PO6H2.js.map} +0 -0
  125. /package/dist/{login-GMWQRH7V.js.map → login-TYRZLN5S.js.map} +0 -0
  126. /package/dist/{push-3QM7ZFTC.js.map → push-5XEEESQQ.js.map} +0 -0
  127. /package/dist/{update-QIQFJFRQ.js.map → update-X7YS3MNH.js.map} +0 -0
@@ -1,10 +0,0 @@
1
- import{a as I}from"./chunk-L2XBSR7G.js";import{M as L,x as T}from"./chunk-442CSROP.js";import{K as M,ha as f,ma as S,ra as a,ta as o}from"./chunk-JG2QCDK2.js";import{a as W}from"./chunk-GFQYFEEH.js";import{a as m,f as $,h as A}from"./chunk-7DYQUG5M.js";A();var e=$(M(),1),G=$(W(),1);import O from"node:crypto";import U from"node:os";import i from"node:path";var g="AGENTS.md",y="CLAUDE.md",H="https://raw.githubusercontent.com/gadget-inc/skills/main/agents/AGENTS.md",j="gadget-best-practices",N="gadget-inc/skills",D="skills/gadget/",P=(0,G.default)("10s"),K=m(n=>{let t=i.resolve(n.path);return O.createHash("md5").update(f.windows?t.toLowerCase():t).digest("hex").slice(0,16)},"projectHash"),F=m((n,t)=>i.join(f.cacheDir,`${t}${K(n)}`),"optOutPath"),q=m(async({ctx:n,directory:t,force:r})=>{let p=t.absolute(g),w=t.absolute(y),E=await e.default.pathExists(p),s=await e.default.lstat(w).then(()=>!0,()=>!1);if(!r&&(E||s)){o({content:a`{gray ✓} Agent scaffold already exists (reinstall with {cyanBright ggt agent-plugin install --force})`});return}try{let u=await L({context:{ctx:n},method:"GET",url:H,headers:{Accept:"text/plain"},timeout:{request:P}}).text();await e.default.outputFile(p,u.endsWith(`
2
- `)?u:`${u}
3
- `)}catch{o({ensureEmptyLineAbove:!0,content:a`{red Failed to install AGENTS.md.} Try again: {cyanBright ggt agent-plugin install}`});return}o({content:a`{greenBright ✓} AGENTS.md installed`});try{r&&await e.default.remove(w),await e.default.symlink(g,w)}catch{f.windows?o({content:a`To link {cyanBright ${y}} → {cyanBright ${g}} on Windows, you may need Developer Mode.
4
-
5
- Try in PowerShell:
6
- {cyanBright New-Item -ItemType SymbolicLink -Path ${y} -Target ${g}}`}):o({content:a`Couldn't create {cyanBright ${y}} symlink.
7
-
8
- Try:
9
- {cyanBright ln -sf ${g} ${y}}`})}},"installAgentsMdScaffold"),rt=m(async({ctx:n,directory:t})=>{if(!S.isInteractive||f.logFormat==="json"||!await B(t)||await e.default.pathExists(t.absolute(g))||await e.default.lstat(t.absolute(y)).then(()=>!0,()=>!1))return;let r=F(t,"opt_out-agents-md-hint-");if(await e.default.pathExists(r))return;if(!await T({exitWhenNo:!1,ensureEmptyLineAbove:!0,ensureNewLine:!0,content:`Add ${g} to this project for your coding agent?`})){await e.default.outputFile(r,"1").catch(()=>{});return}await q({ctx:n,directory:t})},"maybePromptAgentsMd"),R=m(async({ctx:n,directory:t,ref:r="main",force:p})=>{let w=t.absolute(".agents/skills",j,"SKILL.md");if(!p&&await e.default.pathExists(w)){o({content:a`{gray ✓} Gadget skills already installed (reinstall with {cyanBright ggt agent-plugin install --force})`});return}let E;try{let s=`https://api.github.com/repos/${N}/git/trees/${r}?recursive=1`,u=await L({context:{ctx:n},method:"GET",url:s,headers:{Accept:"application/vnd.github+json"},responseType:"json",resolveBodyOnly:!0,timeout:{request:P}}),{tree:k}=u,l=k.filter(h=>h.type==="blob"&&h.path.startsWith(D));if(l.length===0)throw new Error("No skills found in repository.");let x=new Set;for(let h of l){let c=h.path.slice(D.length);c.includes("..")||c.startsWith("/")||x.add(c.split("/")[0])}let b=t.absolute(".agents",`.tmp-gadget-skills-${Date.now()}`);await e.default.ensureDir(b);try{await I(l,async c=>{let v=c.path.slice(D.length);if(v.includes("..")||v.startsWith("/"))return;let d=i.join(b,v);if(!i.resolve(d).startsWith(i.resolve(b)))return;let _=`https://raw.githubusercontent.com/${N}/${r}/${c.path}`,C=await L({context:{ctx:n},method:"GET",url:_,timeout:{request:P}}).text();await e.default.ensureDir(i.dirname(d)),await e.default.writeFile(d,C)},{concurrency:5});let h=t.absolute(".agents/skills");for(let c of x){let v=i.join(b,c),d=i.join(h,c);await e.default.remove(d),await e.default.move(v,d,{overwrite:!0})}}finally{await e.default.remove(b).catch(()=>{})}E=[...x]}catch(s){o({ensureEmptyLineAbove:!0,content:a`{red Failed to install skills.} ${s instanceof Error?s.message:String(s)}`});return}o({content:a`{greenBright ✓} Installed skills: ${E.join(", ")}`});try{let s=t.absolute(".claude/skills");await e.default.ensureDir(s);for(let u of E){let k=t.absolute(".agents/skills",u),l=i.join(s,u);try{let x=await e.default.readlink(l);if(i.resolve(i.dirname(l),x)===i.resolve(k))continue}catch{}await e.default.remove(l),U.platform()==="win32"?await e.default.symlink(k,l,"junction"):await e.default.symlink(i.relative(i.dirname(l),k),l)}o({content:a`{greenBright ✓} Symlinks created in .claude/skills/`})}catch(s){o({content:a`{yellow ⚠} Failed to create .claude/skills/ symlinks: ${s instanceof Error?s.message:String(s)}`})}},"installGadgetSkillsIntoProject"),B=m(async n=>{try{for await(let t of n.walk())if(!t.startsWith(".gadget"))return!0}catch{return!1}return!1},"hasNonGadgetFiles"),at=m(async({ctx:n,directory:t})=>{if(!S.isInteractive||f.logFormat==="json"||!await B(t)||await e.default.pathExists(t.absolute(".agents/skills",j,"SKILL.md")))return;let r=F(t,"opt_out-gadget-skills-hint-");if(await e.default.pathExists(r))return;if(!await T({exitWhenNo:!1,ensureEmptyLineAbove:!0,ensureNewLine:!0,content:"Install Gadget agent skills for your coding agent?"})){await e.default.outputFile(r,"1").catch(()=>{});return}await R({ctx:n,directory:t,force:!0})},"maybePromptGadgetSkills");export{q as a,rt as b,R as c,at as d};
10
- //# sourceMappingURL=chunk-YFUOXDPK.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/services/output/agent-plugin.ts"],
4
- "sourcesContent": ["import fs from \"fs-extra\";\nimport ms from \"ms\";\nimport crypto from \"node:crypto\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport pMap from \"p-map\";\n\nimport type { Context } from \"../command/context.js\";\n\nimport { config } from \"../config/config.js\";\nimport { Directory } from \"../filesync/directory.js\";\nimport { http } from \"../http/http.js\";\nimport { confirm } from \"./confirm.js\";\nimport { output } from \"./output.js\";\nimport { println } from \"./print.js\";\nimport { sprint } from \"./sprint.js\";\n\nconst AGENTS_FILE = \"AGENTS.md\";\nconst CLAUDE_FILE = \"CLAUDE.md\";\nconst AGENTS_MD_URL = \"https://raw.githubusercontent.com/gadget-inc/skills/main/agents/AGENTS.md\";\n\nconst SENTINEL_SKILL = \"gadget-best-practices\";\nconst SKILLS_REPO = \"gadget-inc/skills\";\nconst SKILLS_PREFIX = \"skills/gadget/\";\n\nconst HTTP_TIMEOUT = ms(\"10s\");\n\nconst projectHash = (directory: Directory): string => {\n const root = path.resolve(directory.path);\n return crypto\n .createHash(\"md5\")\n .update(config.windows ? root.toLowerCase() : root)\n .digest(\"hex\")\n .slice(0, 16);\n};\n\nconst optOutPath = (directory: Directory, prefix: string): string => {\n return path.join(config.cacheDir, `${prefix}${projectHash(directory)}`);\n};\n\nexport const installAgentsMdScaffold = async ({\n ctx,\n directory,\n force,\n}: {\n ctx: Context;\n directory: Directory;\n force?: boolean;\n}): Promise<void> => {\n const agentsPath = directory.absolute(AGENTS_FILE);\n const claudePath = directory.absolute(CLAUDE_FILE);\n\n const agentsExists = await fs.pathExists(agentsPath);\n const claudeExists = await fs.lstat(claudePath).then(\n () => true,\n () => false,\n );\n\n if (!force && (agentsExists || claudeExists)) {\n println({\n content: sprint`{gray \u2713} Agent scaffold already exists (reinstall with {cyanBright ggt agent-plugin install --force})`,\n });\n return;\n }\n\n try {\n const text = await http({\n context: { ctx },\n method: \"GET\",\n url: AGENTS_MD_URL,\n headers: { Accept: \"text/plain\" },\n timeout: { request: HTTP_TIMEOUT },\n }).text();\n await fs.outputFile(agentsPath, text.endsWith(\"\\n\") ? text : `${text}\\n`);\n } catch {\n println({\n ensureEmptyLineAbove: true,\n content: sprint`{red Failed to install AGENTS.md.} Try again: {cyanBright ggt agent-plugin install}`,\n });\n return;\n }\n\n println({ content: sprint`{greenBright \u2713} AGENTS.md installed` });\n\n try {\n if (force) await fs.remove(claudePath);\n await fs.symlink(AGENTS_FILE, claudePath);\n } catch {\n if (config.windows) {\n println({\n content: sprint`To link {cyanBright ${CLAUDE_FILE}} \u2192 {cyanBright ${AGENTS_FILE}} on Windows, you may need Developer Mode.\n\nTry in PowerShell:\n {cyanBright New-Item -ItemType SymbolicLink -Path ${CLAUDE_FILE} -Target ${AGENTS_FILE}}`,\n });\n } else {\n println({\n content: sprint`Couldn't create {cyanBright ${CLAUDE_FILE}} symlink.\n\nTry:\n {cyanBright ln -sf ${AGENTS_FILE} ${CLAUDE_FILE}}`,\n });\n }\n }\n};\n\nexport const maybePromptAgentsMd = async ({ ctx, directory }: { ctx: Context; directory: Directory }): Promise<void> => {\n if (!output.isInteractive || config.logFormat === \"json\") return;\n // don't prompt to add AGENTS.md if the directory doesn't contain any user files\n // this means the first sync has not happened so we don't know yet if the user has\n // their own AGENTS.md already\n if (!(await hasNonGadgetFiles(directory))) return;\n if (await fs.pathExists(directory.absolute(AGENTS_FILE))) return;\n if (\n await fs.lstat(directory.absolute(CLAUDE_FILE)).then(\n () => true,\n () => false,\n )\n )\n return;\n\n const optOut = optOutPath(directory, \"opt_out-agents-md-hint-\");\n if (await fs.pathExists(optOut)) return;\n\n const yes = await confirm({\n exitWhenNo: false,\n ensureEmptyLineAbove: true,\n ensureNewLine: true,\n content: `Add ${AGENTS_FILE} to this project for your coding agent?`,\n });\n\n if (!yes) {\n await fs.outputFile(optOut, \"1\").catch(() => undefined);\n return;\n }\n\n await installAgentsMdScaffold({ ctx, directory });\n};\n\ntype GitHubTreeEntry = {\n path: string;\n type: string;\n sha: string;\n};\n\nexport const installGadgetSkillsIntoProject = async ({\n ctx,\n directory,\n ref = \"main\",\n force,\n}: {\n ctx: Context;\n directory: Directory;\n ref?: string;\n force?: boolean;\n}): Promise<void> => {\n const sentinelPath = directory.absolute(\".agents/skills\", SENTINEL_SKILL, \"SKILL.md\");\n\n if (!force && (await fs.pathExists(sentinelPath))) {\n println({\n content: sprint`{gray \u2713} Gadget skills already installed (reinstall with {cyanBright ggt agent-plugin install --force})`,\n });\n return;\n }\n\n let skillNames: string[];\n\n try {\n const treeUrl = `https://api.github.com/repos/${SKILLS_REPO}/git/trees/${ref}?recursive=1`;\n const treeData = await http({\n context: { ctx },\n method: \"GET\",\n url: treeUrl,\n headers: { Accept: \"application/vnd.github+json\" },\n responseType: \"json\",\n resolveBodyOnly: true,\n timeout: { request: HTTP_TIMEOUT },\n });\n\n const { tree } = treeData as { tree: GitHubTreeEntry[] };\n const blobs = tree.filter((e) => e.type === \"blob\" && e.path.startsWith(SKILLS_PREFIX));\n if (blobs.length === 0) {\n throw new Error(\"No skills found in repository.\");\n }\n\n const names = new Set<string>();\n for (const blob of blobs) {\n const relative = blob.path.slice(SKILLS_PREFIX.length);\n if (relative.includes(\"..\") || relative.startsWith(\"/\")) continue;\n names.add(relative.split(\"/\")[0] as string);\n }\n\n const tmpDir = directory.absolute(\".agents\", `.tmp-gadget-skills-${Date.now()}`);\n await fs.ensureDir(tmpDir);\n\n try {\n await pMap(\n blobs,\n async (blob) => {\n const relative = blob.path.slice(SKILLS_PREFIX.length);\n if (relative.includes(\"..\") || relative.startsWith(\"/\")) return;\n\n const destPath = path.join(tmpDir, relative);\n if (!path.resolve(destPath).startsWith(path.resolve(tmpDir))) return;\n\n const rawUrl = `https://raw.githubusercontent.com/${SKILLS_REPO}/${ref}/${blob.path}`;\n const text = await http({\n context: { ctx },\n method: \"GET\",\n url: rawUrl,\n timeout: { request: HTTP_TIMEOUT },\n }).text();\n\n await fs.ensureDir(path.dirname(destPath));\n await fs.writeFile(destPath, text);\n },\n { concurrency: 5 },\n );\n\n const skillsDir = directory.absolute(\".agents/skills\");\n for (const name of names) {\n const src = path.join(tmpDir, name);\n const dest = path.join(skillsDir, name);\n await fs.remove(dest);\n await fs.move(src, dest, { overwrite: true });\n }\n } finally {\n await fs.remove(tmpDir).catch(() => undefined);\n }\n\n skillNames = [...names];\n } catch (error) {\n println({\n ensureEmptyLineAbove: true,\n content: sprint`{red Failed to install skills.} ${error instanceof Error ? error.message : String(error)}`,\n });\n return;\n }\n\n println({\n content: sprint`{greenBright \u2713} Installed skills: ${skillNames.join(\", \")}`,\n });\n\n try {\n const claudeSkillsDir = directory.absolute(\".claude/skills\");\n await fs.ensureDir(claudeSkillsDir);\n\n for (const skillName of skillNames) {\n const target = directory.absolute(\".agents/skills\", skillName);\n const linkPath = path.join(claudeSkillsDir, skillName);\n\n try {\n const existing = await fs.readlink(linkPath);\n if (path.resolve(path.dirname(linkPath), existing) === path.resolve(target)) continue;\n } catch {}\n\n await fs.remove(linkPath);\n\n if (os.platform() === \"win32\") {\n await fs.symlink(target, linkPath, \"junction\");\n } else {\n await fs.symlink(path.relative(path.dirname(linkPath), target), linkPath);\n }\n }\n\n println({\n content: sprint`{greenBright \u2713} Symlinks created in .claude/skills/`,\n });\n } catch (error) {\n println({\n content: sprint`{yellow \u26A0} Failed to create .claude/skills/ symlinks: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n};\n\nconst hasNonGadgetFiles = async (directory: Directory): Promise<boolean> => {\n try {\n for await (const normalizedPath of directory.walk()) {\n if (!normalizedPath.startsWith(\".gadget\")) {\n return true;\n }\n }\n } catch {\n // on error, skip the prompt\n return false;\n }\n\n return false;\n};\n\nexport const maybePromptGadgetSkills = async ({ ctx, directory }: { ctx: Context; directory: Directory }): Promise<void> => {\n if (!output.isInteractive || config.logFormat === \"json\") return;\n // don't prompt to add skills if the directory doesn't contain any user files\n // this means the first sync has not happened so we don't know yet if the user has\n // their own skills already\n if (!(await hasNonGadgetFiles(directory))) return;\n if (await fs.pathExists(directory.absolute(\".agents/skills\", SENTINEL_SKILL, \"SKILL.md\"))) return;\n\n const optOut = optOutPath(directory, \"opt_out-gadget-skills-hint-\");\n if (await fs.pathExists(optOut)) return;\n\n const yes = await confirm({\n exitWhenNo: false,\n ensureEmptyLineAbove: true,\n ensureNewLine: true,\n content: \"Install Gadget agent skills for your coding agent?\",\n });\n\n if (!yes) {\n await fs.outputFile(optOut, \"1\").catch(() => undefined);\n return;\n }\n\n await installGadgetSkillsIntoProject({ ctx, directory, force: true });\n};\n"],
5
- "mappings": "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",
6
- "names": ["init_cjs", "import_fs_extra", "import_ms", "crypto", "os", "path", "AGENTS_FILE", "CLAUDE_FILE", "AGENTS_MD_URL", "SENTINEL_SKILL", "SKILLS_REPO", "SKILLS_PREFIX", "HTTP_TIMEOUT", "ms", "projectHash", "__name", "directory", "root", "path", "crypto", "config", "optOutPath", "prefix", "installAgentsMdScaffold", "ctx", "force", "agentsPath", "claudePath", "agentsExists", "fs", "claudeExists", "println", "sprint", "text", "http", "maybePromptAgentsMd", "output", "hasNonGadgetFiles", "optOut", "confirm", "installGadgetSkillsIntoProject", "ref", "sentinelPath", "skillNames", "treeUrl", "treeData", "tree", "blobs", "e", "names", "blob", "relative", "tmpDir", "pMap", "destPath", "rawUrl", "skillsDir", "name", "src", "dest", "error", "claudeSkillsDir", "skillName", "target", "linkPath", "existing", "os", "normalizedPath", "maybePromptGadgetSkills"]
7
- }
@@ -1,211 +0,0 @@
1
- import{ra as e}from"./chunk-JG2QCDK2.js";import{h as t}from"./chunk-7DYQUG5M.js";t();var i=e(`
2
- subscription EnvironmentLogs($query: String!, $start: DateTime, $limit: Int) {
3
- logsSearchV2(query: $query, start: $start, limit: $limit) {
4
- status
5
- data
6
- }
7
- }
8
- `),s=e(`
9
- subscription RemoteFileSyncEvents($localFilesVersion: String!) {
10
- remoteFileSyncEvents(localFilesVersion: $localFilesVersion, encoding: base64) {
11
- remoteFilesVersion
12
- changed {
13
- path
14
- mode
15
- content
16
- encoding
17
- }
18
- deleted {
19
- path
20
- }
21
- }
22
- }
23
- `),o=e(`
24
- query RemoteFilesVersion {
25
- remoteFilesVersion
26
- }
27
- `),a=e(`
28
- mutation PublishFileSyncEvents($input: PublishFileSyncEventsInput!) {
29
- publishFileSyncEvents(input: $input) {
30
- remoteFilesVersion
31
- problems {
32
- level
33
- message
34
- path
35
- type
36
- }
37
- }
38
- }
39
- `),r=e(`
40
- query FileSyncFiles($paths: [String!]!, $filesVersion: String, $encoding: FileSyncEncoding) {
41
- fileSyncFiles(paths: $paths, filesVersion: $filesVersion, encoding: $encoding) {
42
- filesVersion
43
- files {
44
- path
45
- mode
46
- content
47
- encoding
48
- }
49
- }
50
- }
51
- `),l=e(`
52
- query FileSyncHashes($filesVersion: String) {
53
- fileSyncHashes(filesVersion: $filesVersion) {
54
- filesVersion
55
- hashes
56
- }
57
- }
58
- `),E=e(`
59
- query FileSyncComparisonHashes($filesVersion: String!) {
60
- fileSyncComparisonHashes(filesVersion: $filesVersion) {
61
- filesVersionHashes {
62
- filesVersion
63
- hashes
64
- }
65
- latestFilesVersionHashes {
66
- filesVersion
67
- hashes
68
- }
69
- }
70
- }
71
- `),p=e(`
72
- subscription PublishStatus($localFilesVersion: String!, $force: Boolean, $allowCharges: Boolean, $allowDeletedData: Boolean) {
73
- publishStatus(localFilesVersion: $localFilesVersion, force: $force, allowCharges: $allowCharges, allowDeletedData: $allowDeletedData) {
74
- publishStarted
75
- remoteFilesVersion
76
- progress
77
- issues {
78
- severity
79
- message
80
- node {
81
- type
82
- key
83
- apiIdentifier
84
- name
85
- fieldType
86
- parentKey
87
- parentApiIdentifier
88
- }
89
- nodeLabels {
90
- type
91
- identifier
92
- }
93
- }
94
- deletedModelsAndFields {
95
- deletedModels
96
- deletedModelFields {
97
- modelIdentifier
98
- fields
99
- }
100
- }
101
- status {
102
- code
103
- message
104
- output
105
- }
106
- }
107
- }
108
- `),u=e(`
109
- mutation createModel($path: String!, $fields: [CreateModelFieldsInput!]) {
110
- createModel(path: $path, fields: $fields) {
111
- remoteFilesVersion
112
- changed {
113
- path
114
- mode
115
- content
116
- encoding
117
- }
118
- }
119
- }
120
- `),S=e(`
121
- mutation createAction($path: String!) {
122
- createAction(path: $path) {
123
- remoteFilesVersion
124
- changed {
125
- path
126
- mode
127
- content
128
- encoding
129
- }
130
- }
131
- }
132
- `),c=e(`
133
- mutation createRoute($method: String!, $path: String!) {
134
- createRoute(method: $method, path: $path) {
135
- remoteFilesVersion
136
- changed {
137
- path
138
- mode
139
- content
140
- encoding
141
- }
142
- }
143
- }
144
- `),_=e(`
145
- mutation createModelFields($path: String!, $fields: [CreateModelFieldsInput!]!) {
146
- createModelFields(path: $path, fields: $fields) {
147
- remoteFilesVersion
148
- changed {
149
- path
150
- mode
151
- content
152
- encoding
153
- }
154
- }
155
- }
156
- `),y=e(`
157
- mutation CreateEnvironment($environment: EnvironmentInput!) {
158
- createEnvironment(environment: $environment) {
159
- slug
160
- status
161
- }
162
- }
163
- `),V=e(`
164
- mutation UnpauseEnvironment {
165
- unpauseEnvironment {
166
- success
167
- alreadyActive
168
- }
169
- }
170
- `),I=e(`
171
- query PublishIssues {
172
- publishIssues {
173
- severity
174
- message
175
- node {
176
- type
177
- key
178
- apiIdentifier
179
- name
180
- fieldType
181
- parentKey
182
- parentApiIdentifier
183
- }
184
- nodeLabels {
185
- type
186
- identifier
187
- }
188
- }
189
- }
190
- `),T=e(`
191
- query EnvironmentVariables {
192
- environmentVariables {
193
- key
194
- value
195
- isSecret
196
- }
197
- }
198
- `),b=e(`
199
- mutation SetEnvironmentVariable($input: SetEnvironmentVariableInput!) {
200
- setEnvironmentVariable(input: $input) {
201
- remoteFilesVersion
202
- }
203
- }
204
- `),N=e(`
205
- mutation DeleteEnvironmentVariable($key: String!) {
206
- deleteEnvironmentVariable(key: $key) {
207
- remoteFilesVersion
208
- }
209
- }
210
- `);export{i as a,s as b,a as c,r as d,l as e,E as f,p as g,u as h,S as i,c as j,_ as k,y as l,V as m,I as n,T as o,b as p,N as q};
211
- //# sourceMappingURL=chunk-ZSREFZXV.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/services/app/edit/operation.ts"],
4
- "sourcesContent": ["import type { ExecutionResult } from \"graphql-ws\";\nimport type { JsonObject } from \"type-fest\";\n\nimport type {\n CreateActionMutation,\n CreateActionMutationVariables,\n CreateEnvironmentMutation,\n CreateEnvironmentMutationVariables,\n CreateModelFieldsMutation,\n CreateModelMutation,\n CreateModelMutationVariables,\n CreateRouteMutation,\n CreateRouteMutationVariables,\n DeleteEnvironmentVariableMutation,\n DeleteEnvironmentVariableMutationVariables,\n EnvironmentLogsSubscription,\n EnvironmentLogsSubscriptionVariables,\n EnvironmentVariablesQuery,\n EnvironmentVariablesQueryVariables,\n FileSyncComparisonHashesQuery,\n FileSyncComparisonHashesQueryVariables,\n FileSyncFilesQuery,\n FileSyncFilesQueryVariables,\n FileSyncHashesQuery,\n FileSyncHashesQueryVariables,\n PublishFileSyncEventsMutation,\n PublishFileSyncEventsMutationVariables,\n PublishIssuesQuery,\n PublishIssuesQueryVariables,\n PublishStatusSubscription,\n PublishStatusSubscriptionVariables,\n RemoteFilesVersionQuery,\n RemoteFilesVersionQueryVariables,\n RemoteFileSyncEventsSubscription,\n RemoteFileSyncEventsSubscriptionVariables,\n SetEnvironmentVariableMutation,\n SetEnvironmentVariableMutationVariables,\n UnpauseEnvironmentMutation,\n UnpauseEnvironmentMutationVariables,\n} from \"../../../__generated__/graphql.js\";\n\nimport { sprint } from \"../../output/sprint.js\";\n\n/**\n * A GraphQL query with its associated types.\n *\n * At runtime, this is just a string.\n */\nexport type GraphQLQuery<\n Data extends JsonObject = JsonObject,\n Variables extends JsonObject = JsonObject,\n Extensions extends JsonObject = JsonObject,\n Response extends ExecutionResult<Data, Extensions> = ExecutionResult<Data, Extensions>,\n> = string & { type: \"query\"; Data: Data; Variables: Variables; Extensions: Extensions; Response: Response };\n\n/**\n * A GraphQL mutation with its associated types.\n *\n * At runtime, this is just a string.\n */\nexport type GraphQLMutation<\n Data extends JsonObject = JsonObject,\n Variables extends JsonObject = JsonObject,\n Extensions extends JsonObject = JsonObject,\n Response extends ExecutionResult<Data, Extensions> = ExecutionResult<Data, Extensions>,\n> = string & { type: \"mutation\"; Data: Data; Variables: Variables; Extensions: Extensions; Response: Response };\n\n/**\n * A GraphQL subscription with its associated types.\n *\n * At runtime, this is just a string.\n */\nexport type GraphQLSubscription<\n Data extends JsonObject = JsonObject,\n Variables extends JsonObject = JsonObject,\n Extensions extends JsonObject = JsonObject,\n Response extends ExecutionResult<Data, Extensions> = ExecutionResult<Data, Extensions>,\n> = string & { type: \"subscription\"; Data: Data; Variables: Variables; Extensions: Extensions; Response: Response };\n\nexport const ENVIRONMENT_LOGS_SUBSCRIPTION = sprint(/* GraphQL */ `\n subscription EnvironmentLogs($query: String!, $start: DateTime, $limit: Int) {\n logsSearchV2(query: $query, start: $start, limit: $limit) {\n status\n data\n }\n }\n`) as GraphQLSubscription<EnvironmentLogsSubscription, EnvironmentLogsSubscriptionVariables>;\n\nexport type ENVIRONMENT_LOGS_SUBSCRIPTION = typeof ENVIRONMENT_LOGS_SUBSCRIPTION;\n\nexport const REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION = sprint(/* GraphQL */ `\n subscription RemoteFileSyncEvents($localFilesVersion: String!) {\n remoteFileSyncEvents(localFilesVersion: $localFilesVersion, encoding: base64) {\n remoteFilesVersion\n changed {\n path\n mode\n content\n encoding\n }\n deleted {\n path\n }\n }\n }\n`) as GraphQLSubscription<RemoteFileSyncEventsSubscription, RemoteFileSyncEventsSubscriptionVariables>;\n\nexport type REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION = typeof REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION;\n\nexport const REMOTE_FILES_VERSION_QUERY = sprint(/* GraphQL */ `\n query RemoteFilesVersion {\n remoteFilesVersion\n }\n`) as GraphQLQuery<RemoteFilesVersionQuery, RemoteFilesVersionQueryVariables>;\n\nexport type REMOTE_FILES_VERSION_QUERY = typeof REMOTE_FILES_VERSION_QUERY;\n\nexport const PUBLISH_FILE_SYNC_EVENTS_MUTATION = sprint(/* GraphQL */ `\n mutation PublishFileSyncEvents($input: PublishFileSyncEventsInput!) {\n publishFileSyncEvents(input: $input) {\n remoteFilesVersion\n problems {\n level\n message\n path\n type\n }\n }\n }\n`) as GraphQLMutation<PublishFileSyncEventsMutation, PublishFileSyncEventsMutationVariables>;\n\nexport type PUBLISH_FILE_SYNC_EVENTS_MUTATION = typeof PUBLISH_FILE_SYNC_EVENTS_MUTATION;\n\nexport const FILE_SYNC_FILES_QUERY = sprint(/* GraphQL */ `\n query FileSyncFiles($paths: [String!]!, $filesVersion: String, $encoding: FileSyncEncoding) {\n fileSyncFiles(paths: $paths, filesVersion: $filesVersion, encoding: $encoding) {\n filesVersion\n files {\n path\n mode\n content\n encoding\n }\n }\n }\n`) as GraphQLQuery<FileSyncFilesQuery, FileSyncFilesQueryVariables>;\n\nexport type FILE_SYNC_FILES_QUERY = typeof FILE_SYNC_FILES_QUERY;\n\nexport const FILE_SYNC_HASHES_QUERY = sprint(/* GraphQL */ `\n query FileSyncHashes($filesVersion: String) {\n fileSyncHashes(filesVersion: $filesVersion) {\n filesVersion\n hashes\n }\n }\n`) as GraphQLQuery<FileSyncHashesQuery, FileSyncHashesQueryVariables>;\n\nexport type FILE_SYNC_HASHES_QUERY = typeof FILE_SYNC_HASHES_QUERY;\n\nexport const FILE_SYNC_COMPARISON_HASHES_QUERY = sprint(/* GraphQL */ `\n query FileSyncComparisonHashes($filesVersion: String!) {\n fileSyncComparisonHashes(filesVersion: $filesVersion) {\n filesVersionHashes {\n filesVersion\n hashes\n }\n latestFilesVersionHashes {\n filesVersion\n hashes\n }\n }\n }\n`) as GraphQLQuery<FileSyncComparisonHashesQuery, FileSyncComparisonHashesQueryVariables>;\n\nexport type FILE_SYNC_COMPARISON_HASHES_QUERY = typeof FILE_SYNC_COMPARISON_HASHES_QUERY;\n\nexport const PUBLISH_STATUS_SUBSCRIPTION = sprint(/* GraphQL */ `\n subscription PublishStatus($localFilesVersion: String!, $force: Boolean, $allowCharges: Boolean, $allowDeletedData: Boolean) {\n publishStatus(localFilesVersion: $localFilesVersion, force: $force, allowCharges: $allowCharges, allowDeletedData: $allowDeletedData) {\n publishStarted\n remoteFilesVersion\n progress\n issues {\n severity\n message\n node {\n type\n key\n apiIdentifier\n name\n fieldType\n parentKey\n parentApiIdentifier\n }\n nodeLabels {\n type\n identifier\n }\n }\n deletedModelsAndFields {\n deletedModels\n deletedModelFields {\n modelIdentifier\n fields\n }\n }\n status {\n code\n message\n output\n }\n }\n }\n`) as GraphQLSubscription<PublishStatusSubscription, PublishStatusSubscriptionVariables>;\n\nexport type PUBLISH_STATUS_SUBSCRIPTION = typeof PUBLISH_STATUS_SUBSCRIPTION;\n\nexport const CREATE_MODEL_MUTATION = sprint(/* GraphQL */ `\n mutation createModel($path: String!, $fields: [CreateModelFieldsInput!]) {\n createModel(path: $path, fields: $fields) {\n remoteFilesVersion\n changed {\n path\n mode\n content\n encoding\n }\n }\n }\n`) as GraphQLMutation<CreateModelMutation, CreateModelMutationVariables>;\n\nexport type CREATE_MODEL_MUTATION = typeof CREATE_MODEL_MUTATION;\n\nexport const CREATE_ACTION_MUTATION = sprint(/* GraphQL */ `\n mutation createAction($path: String!) {\n createAction(path: $path) {\n remoteFilesVersion\n changed {\n path\n mode\n content\n encoding\n }\n }\n }\n`) as GraphQLMutation<CreateActionMutation, CreateActionMutationVariables>;\n\nexport type CREATE_ACTION_MUTATION = typeof CREATE_ACTION_MUTATION;\n\nexport const CREATE_ROUTE_MUTATION = sprint(/* GraphQL */ `\n mutation createRoute($method: String!, $path: String!) {\n createRoute(method: $method, path: $path) {\n remoteFilesVersion\n changed {\n path\n mode\n content\n encoding\n }\n }\n }\n`) as GraphQLMutation<CreateRouteMutation, CreateRouteMutationVariables>;\n\nexport type CREATE_ROUTE_MUTATION = typeof CREATE_ROUTE_MUTATION;\n\nexport const CREATE_MODEL_FIELDS_MUTATION = sprint(/* GraphQL */ `\n mutation createModelFields($path: String!, $fields: [CreateModelFieldsInput!]!) {\n createModelFields(path: $path, fields: $fields) {\n remoteFilesVersion\n changed {\n path\n mode\n content\n encoding\n }\n }\n }\n`) as GraphQLMutation<CreateModelFieldsMutation, CreateModelMutationVariables>;\n\nexport type CREATE_MODEL_FIELDS_MUTATION = typeof CREATE_MODEL_FIELDS_MUTATION;\n\nexport const CREATE_ENVIRONMENT_MUTATION = sprint(/* GraphQL */ `\n mutation CreateEnvironment($environment: EnvironmentInput!) {\n createEnvironment(environment: $environment) {\n slug\n status\n }\n }\n`) as GraphQLMutation<CreateEnvironmentMutation, CreateEnvironmentMutationVariables>;\n\nexport type CREATE_ENVIRONMENT_MUTATION = typeof CREATE_ENVIRONMENT_MUTATION;\n\nexport const UNPAUSE_ENVIRONMENT_MUTATION = sprint(/* GraphQL */ `\n mutation UnpauseEnvironment {\n unpauseEnvironment {\n success\n alreadyActive\n }\n }\n`) as GraphQLMutation<UnpauseEnvironmentMutation, UnpauseEnvironmentMutationVariables>;\n\nexport type UNPAUSE_ENVIRONMENT_MUTATION = typeof UNPAUSE_ENVIRONMENT_MUTATION;\n\nexport const PUBLISH_ISSUES_QUERY = sprint(/* GraphQL */ `\n query PublishIssues {\n publishIssues {\n severity\n message\n node {\n type\n key\n apiIdentifier\n name\n fieldType\n parentKey\n parentApiIdentifier\n }\n nodeLabels {\n type\n identifier\n }\n }\n }\n`) as GraphQLQuery<PublishIssuesQuery, PublishIssuesQueryVariables>;\n\nexport type PUBLISH_ISSUES_QUERY = typeof PUBLISH_ISSUES_QUERY;\n\nexport const ENVIRONMENT_VARIABLES_QUERY = sprint(/* GraphQL */ `\n query EnvironmentVariables {\n environmentVariables {\n key\n value\n isSecret\n }\n }\n`) as GraphQLQuery<EnvironmentVariablesQuery, EnvironmentVariablesQueryVariables>;\n\nexport type ENVIRONMENT_VARIABLES_QUERY = typeof ENVIRONMENT_VARIABLES_QUERY;\n\nexport const SET_ENVIRONMENT_VARIABLE_MUTATION = sprint(/* GraphQL */ `\n mutation SetEnvironmentVariable($input: SetEnvironmentVariableInput!) {\n setEnvironmentVariable(input: $input) {\n remoteFilesVersion\n }\n }\n`) as GraphQLMutation<SetEnvironmentVariableMutation, SetEnvironmentVariableMutationVariables>;\n\nexport type SET_ENVIRONMENT_VARIABLE_MUTATION = typeof SET_ENVIRONMENT_VARIABLE_MUTATION;\n\nexport const DELETE_ENVIRONMENT_VARIABLE_MUTATION = sprint(/* GraphQL */ `\n mutation DeleteEnvironmentVariable($key: String!) {\n deleteEnvironmentVariable(key: $key) {\n remoteFilesVersion\n }\n }\n`) as GraphQLMutation<DeleteEnvironmentVariableMutation, DeleteEnvironmentVariableMutationVariables>;\n\nexport type DELETE_ENVIRONMENT_VARIABLE_MUTATION = typeof DELETE_ENVIRONMENT_VARIABLE_MUTATION;\n"],
5
- "mappings": "iFAAAA,IA+EO,IAAMC,EAAgCC,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOjE,EAIYC,EAAuCD,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAexE,EAIYE,EAA6BF,EAAqB;AAAA;AAAA;AAAA;AAAA,CAI9D,EAIYG,EAAoCH,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAYrE,EAIYI,EAAwBJ,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAYzD,EAIYK,EAAyBL,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAO1D,EAIYM,EAAoCN,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAarE,EAIYO,EAA8BP,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAqC/D,EAIYQ,EAAwBR,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAYzD,EAIYS,EAAyBT,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAY1D,EAIYU,EAAwBV,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAYzD,EAIYW,EAA+BX,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAYhE,EAIYY,EAA8BZ,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAO/D,EAIYa,EAA+Bb,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOhE,EAIYc,EAAuBd,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAoBxD,EAIYe,EAA8Bf,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAQ/D,EAIYgB,EAAoChB,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAMrE,EAIYiB,EAAuCjB,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAMxE",
6
- "names": ["init_cjs", "ENVIRONMENT_LOGS_SUBSCRIPTION", "sprint", "REMOTE_FILE_SYNC_EVENTS_SUBSCRIPTION", "REMOTE_FILES_VERSION_QUERY", "PUBLISH_FILE_SYNC_EVENTS_MUTATION", "FILE_SYNC_FILES_QUERY", "FILE_SYNC_HASHES_QUERY", "FILE_SYNC_COMPARISON_HASHES_QUERY", "PUBLISH_STATUS_SUBSCRIPTION", "CREATE_MODEL_MUTATION", "CREATE_ACTION_MUTATION", "CREATE_ROUTE_MUTATION", "CREATE_MODEL_FIELDS_MUTATION", "CREATE_ENVIRONMENT_MUTATION", "UNPAUSE_ENVIRONMENT_MUTATION", "PUBLISH_ISSUES_QUERY", "ENVIRONMENT_VARIABLES_QUERY", "SET_ENVIRONMENT_VARIABLE_MUTATION", "DELETE_ENVIRONMENT_VARIABLE_MUTATION"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/commands/configure.ts"],
4
- "sourcesContent": ["import type { Run, Usage } from \"../services/command/command.js\";\n\nimport { clearDefaultsConfig, type DefaultsConfigData, loadDefaultsConfig, promptDefaultsConfig } from \"../services/config/defaults.js\";\nimport { println } from \"../services/output/print.js\";\nimport { sprint } from \"../services/output/sprint.js\";\nimport { printTable } from \"../services/output/table.js\";\n\nconst printDefaultsConfig = (defaults: DefaultsConfigData): void => {\n printTable({\n json: defaults,\n headers: [\"Option\", \"Configured Value\"],\n rows: [\n [\"telemetry\", String(defaults.telemetry)],\n [\"json\", String(defaults.json)],\n ],\n borders: \"thick\",\n });\n};\n\nexport const usage: Usage = (_ctx) => {\n return sprint`\n Make changes to the configured defaults. This allows you to set an option on every ggt command by default without\n needing to set a flag on every command.\n\n {gray Usage}\n ggt configure show\n \n ggt configure change\n \n ggt configure clear\n `;\n};\n\nexport const run: Run = async (ctx, args): Promise<void> => {\n switch (args._[0]) {\n case \"show\":\n printDefaultsConfig(await loadDefaultsConfig(ctx, false));\n break;\n case \"change\":\n await promptDefaultsConfig(ctx);\n break;\n case \"clear\":\n await clearDefaultsConfig(ctx);\n break;\n default:\n println(usage(ctx));\n return;\n }\n};\n"],
5
- "mappings": "kRAAAA,IAOA,IAAMC,EAAsBC,EAACC,GAAuC,CAClEC,EAAW,CACT,KAAMD,EACN,QAAS,CAAC,SAAU,kBAAkB,EACtC,KAAM,CACJ,CAAC,YAAa,OAAOA,EAAS,SAAS,CAAC,EACxC,CAAC,OAAQ,OAAOA,EAAS,IAAI,CAAC,CAChC,EACA,QAAS,OACX,CAAC,CACH,EAV4B,uBAYfE,EAAeH,EAACI,GACpBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IADmB,SAcfC,EAAWN,EAAA,MAAOO,EAAKC,IAAwB,CAC1D,OAAQA,EAAK,EAAE,CAAC,EAAG,CACjB,IAAK,OACHT,EAAoB,MAAMU,EAAmBF,EAAK,EAAK,CAAC,EACxD,MACF,IAAK,SACH,MAAMG,EAAqBH,CAAG,EAC9B,MACF,IAAK,QACH,MAAMI,EAAoBJ,CAAG,EAC7B,MACF,QACEK,EAAQT,EAAMI,CAAG,CAAC,EAClB,MACJ,CACF,EAfwB",
6
- "names": ["init_cjs", "printDefaultsConfig", "__name", "defaults", "printTable", "usage", "_ctx", "sprint", "run", "ctx", "args", "loadDefaultsConfig", "promptDefaultsConfig", "clearDefaultsConfig", "println"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/commands/debugger.ts"],
4
- "sourcesContent": ["import type { Server as HttpServer, IncomingMessage, ServerResponse } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\n\nimport chalk from \"chalk\";\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { createServer } from \"node:http\";\nimport path from \"node:path\";\nimport process, { nextTick } from \"node:process\";\nimport { WebSocket, WebSocketServer, type RawData } from \"ws\";\n\nimport type { ArgsDefinition } from \"../services/command/arg.js\";\nimport type { Run, Usage } from \"../services/command/command.js\";\nimport type { Context } from \"../services/command/context.js\";\n\nimport { AppIdentity, AppIdentityArgs } from \"../services/command/app-identity.js\";\nimport { config } from \"../services/config/config.js\";\nimport { loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { loadAuthHeaders } from \"../services/http/auth.js\";\nimport { http } from \"../services/http/http.js\";\nimport { LoggingArgs } from \"../services/output/log/structured.js\";\nimport { println } from \"../services/output/print.js\";\nimport { reportErrorAndExit } from \"../services/output/report.js\";\nimport { spin } from \"../services/output/spinner.js\";\nimport { sprint } from \"../services/output/sprint.js\";\nimport { symbol } from \"../services/output/symbols.js\";\n\nexport type DebuggerArgs = typeof args;\n\nconst StartingMessage = \"Starting ggt debugger\";\nconst RunningMessage = \"ggt debugger running on\";\n\nexport const args = {\n ...AppIdentityArgs,\n ...LoggingArgs,\n \"--port\": {\n type: Number,\n alias: [\"-p\"],\n },\n \"--configure\": {\n type: String,\n },\n} satisfies ArgsDefinition;\n\nconst SupportedEditors = [\"vscode\", \"cursor\"] as const;\n\nexport const usage: Usage = (_ctx) => {\n return sprint`\n Start a Chrome DevTools Protocol proxy server that connects to the Gadget debugger.\n This allows you to debug your Gadget app using VS Code, Chrome DevTools, or any other\n CDP-compatible debugger client.\n\n {gray Usage}\n $ ggt debugger [DIRECTORY] [options]\n\n DIRECTORY: The directory containing your Gadget app (default: current directory)\n\n {gray Options}\n -a, --app <app_name> Selects the app to debug. Defaults to the app synced to the current directory, if there is one.\n -e, --env <env_name> Selects the environment to debug. Defaults to the environment synced to the current directory, if there is one.\n -p, --port <port> Local port for the inspector proxy (default: 9229)\n --configure <editor> Configure debugger for ${SupportedEditors.join(\", \")}\n\n {gray Examples}\n start debugger proxy for current environment\n {cyanBright $ ggt debugger}\n\n use a custom port\n {cyanBright $ ggt debugger --port 9230}\n\n debug a specific app and environment\n {cyanBright $ ggt debugger --app myApp --env development}\n\n configure VS Code debugger\n {cyanBright $ ggt debugger --configure vscode}\n `;\n};\n\ntype DebuggerSessionResponse = {\n wsUrl: string;\n lease: {\n sessionId: string;\n startedAt: string;\n expiresAt: string;\n };\n};\n\nexport const run: Run<DebuggerArgs> = async (ctx, args) => {\n const directory = await loadSyncJsonDirectory(args._[0] || process.cwd());\n const appIdentity = await AppIdentity.load(ctx, { command: \"debugger\", args, directory });\n\n // Handle --configure option\n if (args[\"--configure\"]) {\n const editor = args[\"--configure\"].toLowerCase();\n if (!SupportedEditors.includes(editor as (typeof SupportedEditors)[number])) {\n throw new Error(`Invalid editor \"${args[\"--configure\"]}\". Supported editors: ${SupportedEditors.join(\", \")}`);\n }\n\n const configurator = new DebuggerConfigurator(directory.path);\n const port = args[\"--port\"] ?? 9229;\n configurator.configure(port);\n\n println({\n ensureEmptyLineAbove: true,\n content: chalk.green(`${symbol.tick} Configured ${editor} debugger`),\n });\n println({\n content: sprint`\n Added configuration to:\n \u2022 ${configurator.launchJsonPath}\n \u2022 ${configurator.tasksJsonPath}\n\n You can now start debugging by running the \"Gadget debugger\" launch configuration.\n `,\n });\n return;\n }\n\n const spinner = spin(`${StartingMessage} for ${appIdentity.environment.name} environment`);\n ctx.log.info(\"debugger command started\");\n\n ctx.log.trace(\"sync json loaded\", {\n app: appIdentity.environment.application.slug,\n environment: appIdentity.environment.name,\n });\n\n const authHeaders = loadAuthHeaders(ctx);\n const port = args[\"--port\"] ?? 9229;\n const sessionId = randomUUID();\n\n // Check if VS Code launch configuration exists\n const configurator = new DebuggerConfigurator(directory.path);\n if (!configurator.hasLaunchConfiguration()) {\n ctx.log.warn(\"vscode/cursor debugger configuration not found\");\n println({\n ensureEmptyLineAbove: true,\n content: chalk.yellow(\n `\u26A0 Gadget debugger not configured. Run \"${chalk.bold(`ggt debugger --configure ${SupportedEditors[0]}`)}\" to set up.`,\n ),\n });\n }\n\n const proxy = new DebuggerProxy(ctx, {\n appIdentity,\n authHeaders,\n sessionId,\n port,\n });\n\n try {\n await proxy.start();\n\n spinner.succeed();\n println({ ensureEmptyLineAbove: true, content: chalk.green(`${symbol.tick} ${RunningMessage} ws://localhost:${port}/${sessionId}`) });\n println({ content: chalk.gray(\"Press Ctrl+C to stop\") });\n\n await new Promise<void>((resolve) => {\n ctx.onAbort(() => {\n ctx.log.info(\"abort signal received\");\n resolve();\n });\n });\n\n proxy.stop();\n println({ ensureEmptyLineAbove: true, content: `${symbol.tick} Proxy server stopped` });\n } catch (error) {\n ctx.log.error(\"debugger command failed\", { error });\n await reportErrorAndExit(ctx, error);\n }\n};\n\ntype DebuggerProxyOptions = {\n appIdentity: AppIdentity;\n authHeaders: Record<string, string>;\n sessionId: string;\n port: number;\n};\n\n/**\n * Manages the local debugger proxy server that connects CDP clients to the remote Gadget debugger.\n */\nclass DebuggerProxy {\n private readonly _ctx: Context;\n private readonly _appIdentity: AppIdentity;\n private readonly _authHeaders: Record<string, string>;\n private readonly _sessionId: string;\n private readonly _port: number;\n private readonly _subdomain: string;\n\n private _httpServer?: HttpServer;\n private _wsServer?: WebSocketServer;\n private _sessionManager?: DebuggerSessionManager;\n\n constructor(ctx: Context, options: DebuggerProxyOptions) {\n this._ctx = ctx;\n this._appIdentity = options.appIdentity;\n this._authHeaders = options.authHeaders;\n this._sessionId = options.sessionId;\n this._port = options.port;\n this._subdomain = this._buildSubdomain();\n }\n\n async start(): Promise<void> {\n this._sessionManager = new DebuggerSessionManager(this._ctx);\n this._httpServer = this._createHttpServer();\n this._wsServer = new WebSocketServer({ noServer: true });\n\n this._httpServer.on(\"upgrade\", (request, socket, head) => {\n this._handleUpgrade(request, socket, head);\n });\n\n await this._listen();\n }\n\n stop(): void {\n this._ctx.log.debug(\"shutting down proxy server\");\n this._wsServer?.close();\n this._httpServer?.close();\n this._ctx.log.info(\"proxy server stopped\");\n }\n\n private _buildSubdomain(): string {\n const { application, name, type } = this._appIdentity.environment;\n return type === \"production\" ? application.slug : `${application.slug}--${name}`;\n }\n\n private _createHttpServer(): HttpServer {\n return createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host}`);\n this._ctx.log.trace(\"debugger proxy http request received\", {\n method: req.method,\n rUrl: req.url,\n urlPathname: url.pathname,\n url: url.toString(),\n });\n\n try {\n if (url.pathname === \"/json/version\") {\n this._handleVersionRequest(res);\n } else if (url.pathname === \"/json/list\") {\n this._handleListRequest(res);\n } else {\n this._handleNotFound(res, url);\n }\n } catch (error) {\n this._handleError(res, error);\n }\n });\n }\n\n private _handleVersionRequest(res: ServerResponse): void {\n const versionPayload = {\n \"Protocol-Version\": \"1.1\",\n Browser: `node.js/${this._appIdentity.environment.nodeVersion}`,\n };\n this._ctx.log.trace(\"debugger proxy http version request payload\", { payload: versionPayload });\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify(versionPayload));\n }\n\n private _handleListRequest(res: ServerResponse): void {\n const listPayload = [\n {\n id: this._sessionId,\n type: \"node\",\n title: \"ggt debugger\",\n description: `authenticated CDP proxy to current sandbox process for ${this._appIdentity.environment.application.slug}@${this._appIdentity.environment.name}`,\n faviconUrl: \"https://assets.gadget.dev/assets/environment/dev/favicon-32.png\",\n webSocketDebuggerUrl: `ws://127.0.0.1:${this._port}/${this._sessionId}`,\n },\n ];\n this._ctx.log.trace(\"debugger proxy http list request payload\", { payload: listPayload });\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify(listPayload));\n }\n\n private _handleNotFound(res: ServerResponse, url: URL): void {\n this._ctx.log.warn(\"debugger proxy http request not found\", { url: url.toString() });\n res.statusCode = 404;\n res.end(\"Not Found\");\n }\n\n private _handleError(res: ServerResponse, error: unknown): void {\n this._ctx.log.error(\"error handling debugger proxy http request\", { error });\n res.statusCode = 500;\n res.end(\"Internal Server Error\");\n }\n\n private _handleUpgrade(request: IncomingMessage, socket: Duplex, head: Buffer): void {\n if (!this._sessionManager || !this._wsServer) {\n socket.destroy();\n return;\n }\n\n const url = new URL(request.url ?? \"/\", `http://${request.headers.host}`);\n this._ctx.log.trace(\"debugger proxy websocket upgrade request received\", {\n url: request.url,\n isConnecting: this._sessionManager.isConnecting,\n hasActiveConnection: this._sessionManager.hasActiveConnection,\n });\n\n if (url.pathname !== `/${this._sessionId}`) {\n socket.destroy();\n return;\n }\n\n if (this._sessionManager.hasActiveConnection || this._sessionManager.isConnecting) {\n this._ctx.log.debug(\"rejecting upgrade request\", {\n hasActiveConnection: this._sessionManager.hasActiveConnection,\n isConnecting: this._sessionManager.isConnecting,\n });\n this._rejectUpgrade(socket);\n return;\n }\n\n this._sessionManager.clearStaleConnection();\n this._acceptUpgrade(request, socket, head);\n }\n\n private _rejectUpgrade(socket: Duplex): void {\n const status = 409;\n const text = \"Another debugger session is already running for this environment\";\n socket.write(`HTTP/1.1 ${status} ${text}\\r\\nConnection: close\\r\\n\\r\\n`);\n socket.destroy();\n }\n\n private _acceptUpgrade(request: IncomingMessage, socket: Duplex, head: Buffer): void {\n if (!this._wsServer || !this._sessionManager) {\n return;\n }\n\n this._wsServer.handleUpgrade(request, socket, head, (clientWs) => {\n this._ctx.log.info(\"client websocket upgraded, establishing remote connection\");\n void this._handleClientConnection(clientWs);\n });\n }\n\n private async _handleClientConnection(clientWs: WebSocket): Promise<void> {\n if (!this._sessionManager) {\n return;\n }\n\n const connection = new ClientConnection(this._ctx, clientWs, this._sessionManager);\n\n try {\n const remoteWs = await this._establishRemoteConnection();\n connection.connectToRemote(remoteWs);\n this._sessionManager.setActiveConnection(clientWs);\n } catch (error) {\n this._ctx.log.error(\"error establishing remote debugger connection\", { error });\n connection.closeWithError(\"Failed to establish remote debugger connection\");\n }\n }\n\n private async _establishRemoteConnection(): Promise<WebSocket> {\n const session = await http<DebuggerSessionResponse>({\n context: { ctx: this._ctx },\n method: \"POST\",\n url: `https://${this._subdomain}.${config.domains.app}/edit/api/debugger/start-session`,\n headers: { ...this._authHeaders, \"x-gadget-debugger-session-id\": this._sessionId },\n responseType: \"json\",\n resolveBodyOnly: true,\n });\n\n this._ctx.log.debug(\"debugger session created\", { session });\n\n const remoteConnection = new RemoteDebuggerConnection(this._ctx, {\n wsUrl: session.wsUrl,\n sessionId: this._sessionId,\n authHeaders: this._authHeaders,\n });\n\n return await remoteConnection.connect();\n }\n\n private async _listen(): Promise<void> {\n if (!this._httpServer) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n const server = this._httpServer;\n if (!server) {\n reject(new Error(\"HTTP server is not initialized\"));\n return;\n }\n server.listen(this._port, \"127.0.0.1\", () => {\n this._ctx.log.info(\"debugger proxy server listening\", { port: this._port });\n resolve();\n });\n server.on(\"error\", reject);\n });\n }\n}\n\n/**\n * Manages the state of active debugger sessions and connections.\n */\nclass DebuggerSessionManager {\n private readonly _ctx: Context;\n private _activeConnection?: WebSocket;\n private _isConnecting = false;\n\n constructor(ctx: Context) {\n this._ctx = ctx;\n }\n\n get hasActiveConnection(): boolean {\n return !!this._activeConnection && this._activeConnection.readyState === WebSocket.OPEN;\n }\n\n get isConnecting(): boolean {\n return this._isConnecting;\n }\n\n setActiveConnection(ws: WebSocket): void {\n this._activeConnection = ws;\n this._isConnecting = false;\n }\n\n clearActiveConnection(): void {\n this._activeConnection = undefined;\n }\n\n clearStaleConnection(): void {\n if (this._activeConnection) {\n this._ctx.log.debug(\"clearing stale connection reference\");\n this._activeConnection = undefined;\n }\n }\n\n startConnecting(): void {\n this._isConnecting = true;\n }\n\n stopConnecting(): void {\n this._isConnecting = false;\n }\n}\n\n/**\n * Manages a client connection from a CDP debugger (VS Code, Chrome DevTools, etc).\n */\nclass ClientConnection {\n private readonly _ctx: Context;\n private readonly _clientWs: WebSocket;\n private readonly _sessionManager: DebuggerSessionManager;\n private readonly _messageQueue: { data: RawData; isBinary: boolean }[] = [];\n private _remoteWs?: WebSocket;\n private _remoteReady = false;\n\n constructor(ctx: Context, clientWs: WebSocket, sessionManager: DebuggerSessionManager) {\n this._ctx = ctx;\n this._clientWs = clientWs;\n this._sessionManager = sessionManager;\n this._setupClientHandlers();\n }\n\n connectToRemote(remoteWs: WebSocket): void {\n this._remoteWs = remoteWs;\n this._setupRemoteHandlers();\n this._flushMessageQueue();\n }\n\n closeWithError(reason: string): void {\n this._sessionManager.stopConnecting();\n this._clientWs.close(1011, reason);\n }\n\n private _setupClientHandlers(): void {\n this._clientWs.on(\"message\", (data: RawData, isBinary: boolean) => {\n this._handleClientMessage(data, isBinary);\n });\n\n this._clientWs.on(\"error\", (error: Error) => {\n this._ctx.log.error(\"client websocket error\", { error: error.message, stack: error.stack });\n this._remoteWs?.close();\n });\n\n this._clientWs.on(\"close\", () => {\n this._ctx.log.info(\"client websocket closed\");\n this._sessionManager.clearActiveConnection();\n this._remoteWs?.close();\n });\n }\n\n private _handleClientMessage(data: RawData, isBinary: boolean): void {\n // oxlint-disable-next-line no-base-to-string\n const messageString = isBinary ? \"<binary data>\" : String(data);\n this._ctx.log.trace(\"received message from client\", { message: messageString });\n\n if (this._remoteReady && this._remoteWs) {\n this._remoteWs.send(data, { binary: isBinary });\n } else {\n this._messageQueue.push({ data, isBinary });\n }\n }\n\n private _setupRemoteHandlers(): void {\n if (!this._remoteWs) {\n return;\n }\n\n this._remoteWs.on(\"message\", (data: RawData, isBinary: boolean) => {\n // oxlint-disable-next-line no-base-to-string\n const messageString = isBinary ? \"<binary data>\" : String(data);\n this._ctx.log.trace(\"received message from remote debugger\", { message: messageString });\n this._clientWs.send(data, { binary: isBinary });\n });\n\n this._remoteWs.on(\"error\", (error: Error) => {\n this._ctx.log.error(\"remote debugger error\", { error: error.message, stack: error.stack });\n this._clientWs.close(1011, \"Remote debugger connection error, please reconnect\");\n });\n\n this._remoteWs.on(\"close\", () => {\n this._ctx.log.info(\"remote debugger connection closed\");\n this._clientWs.close(1011, \"Remote debugger connection closed by server, please reconnect\");\n });\n\n this._remoteReady = true;\n }\n\n private _flushMessageQueue(): void {\n if (!this._remoteWs) {\n return;\n }\n\n this._ctx.log.debug(\"remote debugger connected, flushing message queue\", {\n queueLength: this._messageQueue.length,\n });\n\n for (const { data, isBinary } of this._messageQueue) {\n this._remoteWs.send(data, { binary: isBinary });\n }\n this._messageQueue.length = 0;\n }\n}\n\ntype RemoteDebuggerConnectionOptions = {\n wsUrl: string;\n sessionId: string;\n authHeaders: Record<string, string>;\n};\n\n/**\n * Manages a connection to the remote Gadget debugger WebSocket.\n */\nclass RemoteDebuggerConnection {\n private readonly _ctx: Context;\n private readonly _wsUrl: string;\n private readonly _sessionId: string;\n private readonly _authHeaders: Record<string, string>;\n\n constructor(ctx: Context, options: RemoteDebuggerConnectionOptions) {\n this._ctx = ctx;\n this._wsUrl = options.wsUrl;\n this._sessionId = options.sessionId;\n this._authHeaders = options.authHeaders;\n }\n\n async connect(): Promise<WebSocket> {\n let resolveConnection: () => void;\n let rejectConnection: (error: Error) => void;\n let connected = false;\n\n const connectionPromise = new Promise<void>((resolve, reject) => {\n resolveConnection = resolve;\n rejectConnection = reject;\n });\n\n const ws = new WebSocket(this._wsUrl, {\n headers: { ...this._authHeaders, \"x-gadget-debugger-session-id\": this._sessionId },\n });\n\n ws.on(\"open\", () => {\n this._ctx.log.debug(\"connected to remote debugger\");\n if (connected) {\n return;\n }\n connected = true;\n resolveConnection();\n });\n\n ws.on(\"error\", (error: Error) => {\n this._ctx.log.error(\"remote debugger error\", { error: error.message, stack: error.stack });\n if (!connected) {\n rejectConnection(error);\n }\n });\n\n if (ws.readyState === WebSocket.OPEN) {\n nextTick(() => {\n resolveConnection();\n });\n }\n\n await connectionPromise;\n\n return ws;\n }\n}\n\ntype VSCodeLaunchConfiguration = {\n type: string;\n request: string;\n name: string;\n address: string;\n port: number;\n localRoot: string;\n remoteRoot: string;\n preLaunchTask: string;\n restart: boolean;\n timeout: number;\n};\n\ntype VSCodeTask = {\n label: string;\n type: string;\n command: string;\n isBackground: boolean;\n problemMatcher: {\n pattern: { regexp: string };\n background: {\n activeOnStart: boolean;\n beginsPattern: string;\n endsPattern: string;\n };\n };\n};\n\n/**\n * Handles VS Code/Cursor debugger configuration setup.\n */\nclass DebuggerConfigurator {\n private readonly _vscodeDir: string;\n\n constructor(directory: string) {\n this._vscodeDir = path.join(directory, \".vscode\");\n }\n\n get launchJsonPath(): string {\n return path.join(this._vscodeDir, \"launch.json\");\n }\n\n get tasksJsonPath(): string {\n return path.join(this._vscodeDir, \"tasks.json\");\n }\n\n hasLaunchConfiguration(): boolean {\n if (!existsSync(this.launchJsonPath)) {\n return false;\n }\n\n try {\n const launchJson = JSON.parse(readFileSync(this.launchJsonPath, \"utf-8\")) as {\n configurations?: VSCodeLaunchConfiguration[];\n };\n const configurations = launchJson.configurations ?? [];\n return configurations.some((config) => config.name === \"Gadget debugger\");\n } catch {\n return false;\n }\n }\n\n configure(port: number): void {\n // Ensure .vscode directory exists\n if (!existsSync(this._vscodeDir)) {\n mkdirSync(this._vscodeDir, { recursive: true });\n }\n\n this._configureLaunch(port);\n this._configureTasks();\n }\n\n private _configureLaunch(port: number): void {\n const launchConfig: VSCodeLaunchConfiguration = {\n type: \"node\",\n request: \"attach\",\n name: \"Gadget debugger\",\n address: \"127.0.0.1\",\n port,\n localRoot: \"${workspaceFolder}\",\n remoteRoot: \"/gadget/app\",\n preLaunchTask: \"ggt debugger\",\n restart: true,\n timeout: 60000,\n };\n\n let launchJson: { version?: string; configurations: VSCodeLaunchConfiguration[] };\n\n if (existsSync(this.launchJsonPath)) {\n // Read existing launch.json\n const content = readFileSync(this.launchJsonPath, \"utf-8\");\n const parsed = JSON.parse(content) as { version?: string; configurations?: VSCodeLaunchConfiguration[] };\n\n // Ensure configurations array exists\n const configurations = parsed.configurations ?? [];\n\n // Check if configuration already exists\n const existingIndex = configurations.findIndex((config) => config.name === \"Gadget debugger\");\n\n if (existingIndex >= 0) {\n // Update existing configuration\n configurations[existingIndex] = launchConfig;\n } else {\n // Add new configuration\n configurations.push(launchConfig);\n }\n\n launchJson = {\n version: parsed.version,\n configurations,\n };\n } else {\n // Create new launch.json\n launchJson = {\n version: \"0.2.0\",\n configurations: [launchConfig],\n };\n }\n\n writeFileSync(this.launchJsonPath, JSON.stringify(launchJson, undefined, 2) + \"\\n\", \"utf-8\");\n }\n\n private _configureTasks(): void {\n const task: VSCodeTask = {\n label: \"ggt debugger\",\n type: \"shell\",\n command: \"ggt debugger\",\n isBackground: true,\n problemMatcher: {\n pattern: { regexp: \"^$\" },\n background: {\n activeOnStart: true,\n beginsPattern: StartingMessage,\n endsPattern: RunningMessage,\n },\n },\n };\n\n let tasksJson: { version?: string; tasks: VSCodeTask[] };\n\n if (existsSync(this.tasksJsonPath)) {\n // Read existing tasks.json\n const content = readFileSync(this.tasksJsonPath, \"utf-8\");\n const parsed = JSON.parse(content) as { version?: string; tasks?: VSCodeTask[] };\n\n // Ensure tasks array exists\n const tasks = parsed.tasks ?? [];\n\n // Check if task already exists\n const existingIndex = tasks.findIndex((t) => t.label === \"ggt debugger\");\n\n if (existingIndex >= 0) {\n // Update existing task\n tasks[existingIndex] = task;\n } else {\n // Add new task\n tasks.push(task);\n }\n\n tasksJson = {\n version: parsed.version,\n tasks,\n };\n } else {\n // Create new tasks.json\n tasksJson = {\n version: \"2.0.0\",\n tasks: [task],\n };\n }\n\n writeFileSync(this.tasksJsonPath, JSON.stringify(tasksJson, undefined, 2) + \"\\n\", \"utf-8\");\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["init_cjs", "randomUUID", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "createServer", "path", "process", "nextTick", "StartingMessage", "RunningMessage", "args", "AppIdentityArgs", "LoggingArgs", "SupportedEditors", "usage", "__name", "_ctx", "sprint", "run", "ctx", "directory", "loadSyncJsonDirectory", "process", "appIdentity", "AppIdentity", "editor", "configurator", "DebuggerConfigurator", "port", "println", "source_default", "symbol", "spinner", "spin", "authHeaders", "loadAuthHeaders", "sessionId", "randomUUID", "proxy", "DebuggerProxy", "resolve", "error", "reportErrorAndExit", "options", "DebuggerSessionManager", "WebSocketServer", "request", "socket", "head", "application", "name", "type", "createServer", "req", "res", "url", "versionPayload", "listPayload", "clientWs", "connection", "ClientConnection", "remoteWs", "session", "http", "config", "RemoteDebuggerConnection", "reject", "server", "WebSocket", "ws", "sessionManager", "reason", "data", "isBinary", "messageString", "resolveConnection", "rejectConnection", "connected", "connectionPromise", "nextTick", "path", "existsSync", "readFileSync", "mkdirSync", "launchConfig", "launchJson", "content", "parsed", "configurations", "existingIndex", "writeFileSync", "task", "tasksJson", "tasks", "t"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/commands/deploy.ts"],
4
- "sourcesContent": ["import chalk from \"chalk\";\nimport indentString from \"indent-string\";\nimport assert from \"node:assert\";\nimport terminalLink from \"terminal-link\";\n\nimport { PUBLISH_STATUS_SUBSCRIPTION } from \"../services/app/edit/operation.js\";\nimport { type Run, type Usage } from \"../services/command/command.js\";\nimport { env } from \"../services/config/env.js\";\nimport { deletedSymbol, updatedSymbol } from \"../services/filesync/changes.js\";\nimport { DeployDisallowedError } from \"../services/filesync/error.js\";\nimport { FileSync } from \"../services/filesync/filesync.js\";\nimport { SyncJson, loadSyncJsonDirectory } from \"../services/filesync/sync-json.js\";\nimport { confirm } from \"../services/output/confirm.js\";\nimport { output } from \"../services/output/output.js\";\nimport { println } from \"../services/output/print.js\";\nimport { ProblemSeverity, printProblems, publishIssuesToProblems } from \"../services/output/problems.js\";\nimport { UnexpectedError, reportErrorAndExit } from \"../services/output/report.js\";\nimport { spin, type spinner } from \"../services/output/spinner.js\";\nimport { sprint } from \"../services/output/sprint.js\";\nimport { ts } from \"../services/output/timestamp.js\";\nimport { unreachable } from \"../services/util/assert.js\";\nimport { parseGraphQLErrors } from \"../services/util/is.js\";\nimport { args as PushArgs } from \"./push.js\";\n\nexport type DeployArgs = typeof args;\n\nexport const args = {\n ...PushArgs,\n \"--env\": { type: String, alias: [\"-e\", \"--environment\", \"--from\"] },\n \"--allow-problems\": { type: Boolean, alias: \"--allow-issues\" },\n \"--allow-charges\": { type: Boolean },\n \"--allow-data-delete\": { type: Boolean },\n};\n\nexport const usage: Usage = (_ctx) => {\n return sprint`\n Deploys your app to production.\n\n This command first performs a sync to ensure that your local and environment directories\n match, changes are tracked since last sync. If any conflicts are detected, they must be\n resolved before deployment.\n\n {gray Usage}\n $ ggt deploy [options]\n\n {gray Options}\n -a, --app <app_name> Selects a specific app to deploy. Defaults to the app synced to the current directory, if there is one.\n --from, -e, --env <env_name> Selects a specific environment to sync and deploy from. Defaults to the environment synced to the current directory, if there is one.\n --force Deploys by discarding any changes made to the environment directory since last sync\n --allow-different-directory Deploys from any local directory with existing files, even if the directory hasn't been synced before\n --allow-different-app Deploys a different app using the --app command, instead of the most recently synced one in the current directory\n --allow-problems Deploys despite any existing issues found in the app (gelly errors, typescript errors etc.)\n --allow-data-delete Deploys even if it results in the deletion of data in production\n --allow-charges Deploys even if it results in additional charges to your plan\n\n {gray Examples}\n Deploys code from the staging environment of a myBlog\n {cyanBright $ ggt deploy -a myBlog -from staging}\n`;\n};\n\nexport const run: Run<DeployArgs> = async (ctx, args) => {\n const directory = await loadSyncJsonDirectory(process.cwd());\n const syncJson = await SyncJson.loadOrAskAndInit(ctx, { command: \"deploy\", args, directory });\n\n println({\n ensureEmptyLineAbove: true,\n content: `Deploying ${syncJson.environment.name} to ${terminalLink(syncJson.environment.application.primaryDomain, `https://${syncJson.environment.application.primaryDomain}/`)}`,\n });\n\n const filesync = new FileSync(syncJson);\n const hashes = await filesync.hashes(ctx);\n if (!hashes.inSync && (hashes.localChangesToPush.size > 0 || !hashes.onlyDotGadgetFilesChanged)) {\n // the following is true:\n // 1. our local files don't match our environment's files\n // 2. we have local changes to push or non .gadget/ files have changed on our environment\n // therefore, we need to push before we can deploy\n await filesync.print(ctx, { hashes });\n\n if (!args[\"--force\"]) {\n // they didn't pass --force, so we need to ask them if they want to push\n println({\n ensureEmptyLineAbove: true,\n content: \"Your environment's files must match your local files before you can deploy.\",\n });\n\n if (output.isInteractive || env.testLike) {\n // we're interactive, so ask them what they want to do\n let content: string;\n switch (true) {\n case hashes.bothChanged:\n content = sprint`Would you like to push your local changes and {underline discard your environment's} changes now?`;\n break;\n case hashes.localChangesToPush.size > 0:\n content = sprint`Would you like to push your local changes now?`;\n break;\n case hashes.environmentChanges.size > 0:\n content = sprint`Do you want to {underline discard your environment's} changes now?`;\n break;\n default:\n unreachable(\"no changes to push or discard\");\n }\n\n await confirm(content);\n } else {\n // we're not interactive, so we're likely in a CI/CD environment\n // assume they want to push\n println({\n ensureEmptyLineAbove: true,\n content: \"Assuming you want to push your local files now.\",\n });\n }\n }\n\n await filesync.push(ctx, { command: \"deploy\", hashes });\n }\n\n const variables = {\n localFilesVersion: String(syncJson.filesVersion),\n force: args[\"--allow-problems\"],\n allowDeletedData: args[\"--allow-data-delete\"],\n allowCharges: args[\"--allow-charges\"],\n };\n\n let spinner: spinner | undefined;\n let currentStep: AppDeploymentSteps = AppDeploymentSteps.NOT_STARTED;\n let printedProblems = false;\n\n const subscription = syncJson.edit.subscribe({\n subscription: PUBLISH_STATUS_SUBSCRIPTION,\n variables,\n onError: async (error) => {\n ctx.log.error(\"failed to deploy\", { error });\n spinner?.fail(stepToSpinnerStart(syncJson, currentStep) + \" \" + ts());\n\n const graphqlErrors = parseGraphQLErrors(error.cause);\n if (graphqlErrors) {\n const graphqlError = graphqlErrors[0];\n assert(graphqlError, \"expected graphqlError to be defined\");\n\n switch (true) {\n case graphqlError.extensions[\"requiresUpgrade\"]:\n println({ ensureEmptyLineAbove: true, content: graphqlError.message.replace(/GGT_PAYMENT_REQUIRED:?\\s*/, \"\") });\n process.exit(1);\n // falls through\n case graphqlError.extensions[\"requiresAdditionalCharge\"]:\n println({ ensureEmptyLineAbove: true, content: graphqlError.message.replace(/GGT_PAYMENT_REQUIRED:?\\s*/, \"\") });\n await confirm({ ensureEmptyLineAbove: true, content: \"Do you want to continue?\" });\n subscription.resubscribe({ ...variables, allowCharges: true });\n return;\n }\n }\n\n await reportErrorAndExit(ctx, error);\n },\n onData: async ({ publishStatus }): Promise<void> => {\n if (!publishStatus) {\n ctx.log.warn(\"received empty publish status\");\n return;\n }\n\n const { publishStarted, progress: step, issues, status, deletedModelsAndFields } = publishStatus;\n const hasIssues = issues.length > 0;\n\n const { deletedModels, deletedModelFields } = deletedModelsAndFields ?? { deletedModels: [], deletedModelFields: [] };\n const hasDataLoss = deletedModels.length > 0 || deletedModelFields.length > 0;\n\n if (!printedProblems && (hasIssues || hasDataLoss)) {\n printedProblems = true;\n\n const fatalIssues = issues.filter((issue) => issue.severity === ProblemSeverity.Fatal);\n if (fatalIssues.length > 0) {\n await reportErrorAndExit(ctx, new DeployDisallowedError(publishIssuesToProblems(fatalIssues)));\n }\n\n if (hasIssues) {\n println({ ensureEmptyLineAbove: true, content: sprint`{bold.yellow !} {bold Issues found in your development app}` });\n printProblems({ problems: publishIssuesToProblems(issues) });\n }\n\n if (hasDataLoss) {\n println({\n ensureEmptyLineAbove: true,\n content: sprint`{bold.yellow !} {bold Data deleted on deploy}`,\n });\n\n const updated = chalk.blueBright(\"updated\");\n const deleted = chalk.redBright(\"deleted\");\n\n const rows: { symbol: string; name: string; action: string; indent: number }[] = [];\n\n deletedModels.forEach((model: string) => {\n rows.push({ symbol: deletedSymbol, name: chalk.redBright(model), action: deleted, indent: 0 });\n });\n\n deletedModelFields.forEach(({ modelIdentifier, fields }) => {\n rows.push({ symbol: updatedSymbol, name: chalk.blueBright(modelIdentifier), action: updated, indent: 0 });\n fields.forEach((field) => {\n rows.push({ symbol: deletedSymbol, name: chalk.redBright(field), action: deleted, indent: 2 });\n });\n });\n\n const longestNameLength = rows.reduce((longest, row) => Math.max(longest, row.name.length), 0);\n const longestIndent = rows.reduce((longest, row) => Math.max(longest, row.indent), 0);\n const indentSize = 2;\n\n println({\n ensureEmptyLineAbove: true,\n content: chalk.gray(\"These changes will be applied to production based on the app you're deploying.\"),\n });\n for (const row of rows) {\n const indentation = \" \".repeat(row.indent * indentSize);\n const namePadding = \" \".repeat(longestNameLength - row.name.length + 2);\n const actionPadding = \" \".repeat((longestIndent - row.indent) * indentSize);\n println({\n ensureEmptyLineAbove: false,\n content: indentString(`${indentation}${row.symbol} ${row.name}${namePadding}${actionPadding}${row.action}`, 6),\n });\n }\n }\n\n if (!publishStarted) {\n await confirm(\"Do you want to continue?\");\n subscription.resubscribe({ ...variables, force: true, allowDeletedData: true });\n } else {\n const allowDataDelete = args[\"--allow-data-delete\"];\n const allowProblems = args[\"--allow-problems\"];\n\n if (!allowDataDelete && !allowProblems) {\n throw new UnexpectedError(\"expected --allow-data-delete or --allow-problems to be true\");\n }\n\n if (allowProblems) {\n println(sprint`Deploying regardless of problems because \"${chalk.gray(\"--allow-problems\")}\" was passed.`);\n }\n\n if (allowDataDelete) {\n println(sprint`Deploying regardless of deleted data because \"${chalk.gray(\"--allow-data-delete\")}\" was passed.`);\n }\n }\n\n return;\n }\n\n if (status?.code === \"Errored\") {\n spinner?.fail(stepToSpinnerStart(syncJson, currentStep) + \" \" + ts());\n\n if (status.message) {\n println({ ensureEmptyLineAbove: true, content: chalk.red(status.message) });\n }\n if (status.output) {\n println({ ensureEmptyLineAbove: true, content: sprint`${terminalLink(\"Check logs\", status.output)}` });\n }\n return;\n }\n\n if (step === AppDeploymentSteps.COMPLETED) {\n spinner?.succeed(stepToSpinnerEnd(syncJson, currentStep));\n\n let content = chalk.green(\"Deploy successful!\");\n if (status?.output) {\n content += ` ${terminalLink(\"Check logs\", status.output)}.`;\n }\n\n println({ ensureEmptyLineAbove: true, content });\n return;\n }\n\n if (step !== currentStep) {\n const spinnerText = stepToSpinnerStart(syncJson, step);\n if (spinnerText !== spinner?.text) {\n // stop the current spinner, if any, and start a new one\n spinner?.succeed(stepToSpinnerEnd(syncJson, currentStep));\n\n const ensureEmptyLineAbove = currentStep === AppDeploymentSteps.NOT_STARTED || !output.isInteractive;\n spinner = spin({ ensureEmptyLineAbove, content: spinnerText });\n }\n\n currentStep = step as AppDeploymentSteps;\n }\n },\n onComplete: () => {\n subscription.unsubscribe();\n },\n });\n};\n\nexport const AppDeploymentSteps = Object.freeze({\n NOT_STARTED: \"NOT_STARTED\",\n STARTING: \"STARTING\",\n BUILDING_ASSETS: \"BUILDING_ASSETS\",\n UPLOADING_ASSETS: \"UPLOADING_ASSETS\",\n CONVERGING_STORAGE: \"CONVERGING_STORAGE\",\n PUBLISHING_TREE: \"PUBLISHING_TREE\",\n RELOADING_SANDBOX: \"RELOADING_SANDBOX\",\n COMPLETED: \"COMPLETED\",\n});\n\nexport type AppDeploymentSteps = (typeof AppDeploymentSteps)[keyof typeof AppDeploymentSteps];\n\nexport const stepToSpinnerStart = (syncJson: SyncJson, step: string): string => {\n switch (step) {\n case AppDeploymentSteps.NOT_STARTED:\n case AppDeploymentSteps.STARTING:\n case AppDeploymentSteps.BUILDING_ASSETS:\n case AppDeploymentSteps.UPLOADING_ASSETS:\n return \"Building frontend assets.\";\n case AppDeploymentSteps.CONVERGING_STORAGE:\n return \"Setting up database.\";\n case AppDeploymentSteps.PUBLISHING_TREE:\n return `Copying ${syncJson.environment.name}.`;\n case AppDeploymentSteps.RELOADING_SANDBOX:\n return \"Restarting app.\";\n case AppDeploymentSteps.COMPLETED:\n return \"Deploy complete!\";\n default:\n return \"Unknown step.\";\n }\n};\n\nexport const stepToSpinnerEnd = (syncJson: SyncJson, step: string): string => {\n switch (step) {\n case AppDeploymentSteps.NOT_STARTED:\n case AppDeploymentSteps.STARTING:\n case AppDeploymentSteps.BUILDING_ASSETS:\n case AppDeploymentSteps.UPLOADING_ASSETS:\n return `Built frontend assets. ${ts()}`;\n case AppDeploymentSteps.CONVERGING_STORAGE:\n return `Setup database. ${ts()}`;\n case AppDeploymentSteps.PUBLISHING_TREE:\n return `Copied ${syncJson.environment.name}. ${ts()}`;\n case AppDeploymentSteps.RELOADING_SANDBOX:\n return `Restarted app. ${ts()}`;\n case AppDeploymentSteps.COMPLETED:\n return \"Deploy successful!\";\n default:\n return `Completed unknown step. ${ts()}`;\n }\n};\n"],
5
- "mappings": "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",
6
- "names": ["init_cjs", "assert", "args", "usage", "__name", "_ctx", "sprint", "run", "ctx", "directory", "loadSyncJsonDirectory", "syncJson", "SyncJson", "println", "terminalLink", "filesync", "FileSync", "hashes", "output", "env", "content", "unreachable", "confirm", "variables", "spinner", "currentStep", "AppDeploymentSteps", "printedProblems", "subscription", "PUBLISH_STATUS_SUBSCRIPTION", "error", "stepToSpinnerStart", "ts", "graphqlErrors", "parseGraphQLErrors", "graphqlError", "assert", "reportErrorAndExit", "publishStatus", "publishStarted", "step", "issues", "status", "deletedModelsAndFields", "hasIssues", "deletedModels", "deletedModelFields", "hasDataLoss", "fatalIssues", "issue", "ProblemSeverity", "DeployDisallowedError", "publishIssuesToProblems", "printProblems", "updated", "source_default", "deleted", "rows", "model", "deletedSymbol", "modelIdentifier", "fields", "updatedSymbol", "field", "longestNameLength", "longest", "row", "longestIndent", "indentSize", "indentation", "namePadding", "actionPadding", "indentString", "allowDataDelete", "allowProblems", "UnexpectedError", "stepToSpinnerEnd", "spinnerText", "ensureEmptyLineAbove", "spin"]
7
- }