@parkercto/cli 0.2.2 → 0.2.4

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 (111) hide show
  1. package/dist/cli.js +54 -0
  2. package/dist/preuninstall.js +3 -0
  3. package/package.json +5 -4
  4. package/dist/bin/parker.d.ts +0 -3
  5. package/dist/bin/parker.d.ts.map +0 -1
  6. package/dist/bin/parker.js +0 -3
  7. package/dist/bin/parker.js.map +0 -1
  8. package/dist/src/bin/parker.d.ts +0 -3
  9. package/dist/src/bin/parker.d.ts.map +0 -1
  10. package/dist/src/bin/parker.js +0 -3
  11. package/dist/src/bin/parker.js.map +0 -1
  12. package/dist/src/bin/preuninstall.d.ts +0 -10
  13. package/dist/src/bin/preuninstall.d.ts.map +0 -1
  14. package/dist/src/bin/preuninstall.js +0 -51
  15. package/dist/src/bin/preuninstall.js.map +0 -1
  16. package/dist/src/cli.d.ts +0 -3
  17. package/dist/src/cli.d.ts.map +0 -1
  18. package/dist/src/cli.js +0 -40
  19. package/dist/src/cli.js.map +0 -1
  20. package/dist/src/client/api-client.d.ts +0 -64
  21. package/dist/src/client/api-client.d.ts.map +0 -1
  22. package/dist/src/client/api-client.js +0 -113
  23. package/dist/src/client/api-client.js.map +0 -1
  24. package/dist/src/client/auth.d.ts +0 -12
  25. package/dist/src/client/auth.d.ts.map +0 -1
  26. package/dist/src/client/auth.js +0 -46
  27. package/dist/src/client/auth.js.map +0 -1
  28. package/dist/src/commands/auth.d.ts +0 -3
  29. package/dist/src/commands/auth.d.ts.map +0 -1
  30. package/dist/src/commands/auth.js +0 -36
  31. package/dist/src/commands/auth.js.map +0 -1
  32. package/dist/src/commands/connect.d.ts +0 -12
  33. package/dist/src/commands/connect.d.ts.map +0 -1
  34. package/dist/src/commands/connect.js +0 -243
  35. package/dist/src/commands/connect.js.map +0 -1
  36. package/dist/src/commands/disable.d.ts +0 -3
  37. package/dist/src/commands/disable.d.ts.map +0 -1
  38. package/dist/src/commands/disable.js +0 -8
  39. package/dist/src/commands/disable.js.map +0 -1
  40. package/dist/src/commands/enable.d.ts +0 -3
  41. package/dist/src/commands/enable.d.ts.map +0 -1
  42. package/dist/src/commands/enable.js +0 -207
  43. package/dist/src/commands/enable.js.map +0 -1
  44. package/dist/src/commands/hook.d.ts +0 -3
  45. package/dist/src/commands/hook.d.ts.map +0 -1
  46. package/dist/src/commands/hook.js +0 -214
  47. package/dist/src/commands/hook.js.map +0 -1
  48. package/dist/src/commands/join.d.ts +0 -9
  49. package/dist/src/commands/join.d.ts.map +0 -1
  50. package/dist/src/commands/join.js +0 -61
  51. package/dist/src/commands/join.js.map +0 -1
  52. package/dist/src/commands/update.d.ts +0 -3
  53. package/dist/src/commands/update.d.ts.map +0 -1
  54. package/dist/src/commands/update.js +0 -36
  55. package/dist/src/commands/update.js.map +0 -1
  56. package/dist/src/constants.d.ts +0 -28
  57. package/dist/src/constants.d.ts.map +0 -1
  58. package/dist/src/constants.js +0 -30
  59. package/dist/src/constants.js.map +0 -1
  60. package/dist/src/lib/auto-update.d.ts +0 -14
  61. package/dist/src/lib/auto-update.d.ts.map +0 -1
  62. package/dist/src/lib/auto-update.js +0 -106
  63. package/dist/src/lib/auto-update.js.map +0 -1
  64. package/dist/src/lib/auto-update_tests.d.ts +0 -2
  65. package/dist/src/lib/auto-update_tests.d.ts.map +0 -1
  66. package/dist/src/lib/auto-update_tests.js +0 -36
  67. package/dist/src/lib/auto-update_tests.js.map +0 -1
  68. package/dist/src/lib/claude-settings.d.ts +0 -38
  69. package/dist/src/lib/claude-settings.d.ts.map +0 -1
  70. package/dist/src/lib/claude-settings.js +0 -66
  71. package/dist/src/lib/claude-settings.js.map +0 -1
  72. package/dist/src/lib/claude-settings_tests.d.ts +0 -2
  73. package/dist/src/lib/claude-settings_tests.d.ts.map +0 -1
  74. package/dist/src/lib/claude-settings_tests.js +0 -117
  75. package/dist/src/lib/claude-settings_tests.js.map +0 -1
  76. package/dist/src/lib/local-git.d.ts +0 -8
  77. package/dist/src/lib/local-git.d.ts.map +0 -1
  78. package/dist/src/lib/local-git.js +0 -36
  79. package/dist/src/lib/local-git.js.map +0 -1
  80. package/dist/src/lib/project-registry.d.ts +0 -13
  81. package/dist/src/lib/project-registry.d.ts.map +0 -1
  82. package/dist/src/lib/project-registry.js +0 -115
  83. package/dist/src/lib/project-registry.js.map +0 -1
  84. package/dist/src/lib/project-registry_tests.d.ts +0 -2
  85. package/dist/src/lib/project-registry_tests.d.ts.map +0 -1
  86. package/dist/src/lib/project-registry_tests.js +0 -75
  87. package/dist/src/lib/project-registry_tests.js.map +0 -1
  88. package/dist/src/lib/redact.d.ts +0 -13
  89. package/dist/src/lib/redact.d.ts.map +0 -1
  90. package/dist/src/lib/redact.js +0 -33
  91. package/dist/src/lib/redact.js.map +0 -1
  92. package/dist/src/lib/redact_tests.d.ts +0 -2
  93. package/dist/src/lib/redact_tests.d.ts.map +0 -1
  94. package/dist/src/lib/redact_tests.js +0 -75
  95. package/dist/src/lib/redact_tests.js.map +0 -1
  96. package/dist/src/lib/repo-config.d.ts +0 -13
  97. package/dist/src/lib/repo-config.d.ts.map +0 -1
  98. package/dist/src/lib/repo-config.js +0 -40
  99. package/dist/src/lib/repo-config.js.map +0 -1
  100. package/dist/src/lib/session-state.d.ts +0 -20
  101. package/dist/src/lib/session-state.d.ts.map +0 -1
  102. package/dist/src/lib/session-state.js +0 -50
  103. package/dist/src/lib/session-state.js.map +0 -1
  104. package/dist/src/lib/session-state_tests.d.ts +0 -2
  105. package/dist/src/lib/session-state_tests.d.ts.map +0 -1
  106. package/dist/src/lib/session-state_tests.js +0 -34
  107. package/dist/src/lib/session-state_tests.js.map +0 -1
  108. package/dist/src/render/help.d.ts +0 -2
  109. package/dist/src/render/help.d.ts.map +0 -1
  110. package/dist/src/render/help.js +0 -21
  111. package/dist/src/render/help.js.map +0 -1
package/dist/cli.js ADDED
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ import{Command as so}from"commander";import{Command as Et}from"commander";import l from"chalk";import Z from"readline/promises";var p=class extends Error{constructor(o,r){super(r);this.status=o;this.name="ApiError"}},We=1e4,O=4e3,m=class{constructor(t,o){this.baseUrl=t;this.token=o}async request(t,o,r,n=We){let a=new AbortController,s=setTimeout(()=>a.abort(),n),i;try{i=await fetch(`${this.baseUrl}${o}`,{method:t,headers:{Authorization:`Bearer ${this.token}`,"Content-Type":"application/json"},body:r?JSON.stringify(r):void 0,signal:a.signal})}finally{clearTimeout(s)}if(!i.ok){let c=await i.json().catch(()=>({}));throw new p(i.status,c.error?.message??i.statusText)}return i.json()}async joinTeam(t){return this.request("POST","/api/teams/join",{teamCode:t})}async getTeam(t){return this.request("GET",`/api/teams/${t}`)}async verifyTeamCode(t){let o=await fetch(`${this.baseUrl}/public/teams/verify?code=${encodeURIComponent(t)}`);if(!o.ok){let r=await o.json().catch(()=>({}));throw new p(o.status,r.error?.message??o.statusText)}return o.json()}async authDev(t){let o=await fetch(`${this.baseUrl}/auth/dev`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({githubUsername:t})});if(!o.ok){let r=await o.json().catch(()=>({}));throw new p(o.status,r.error?.message??o.statusText)}return o.json()}async authGitHub(t){let o=await fetch(`${this.baseUrl}/auth/github`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok){let r=await o.json().catch(()=>({}));throw new p(o.status,r.error?.message??o.statusText)}return o.json()}async createSession(t,o,r){return this.request("POST","/api/sacl/sessions",{teamId:t,startedAt:o,filesInWorkingDir:r},O)}async sendEvents(t,o){let r=new AbortController,n=setTimeout(()=>r.abort(),O);try{await fetch(`${this.baseUrl}/api/sacl/sessions/${t}/events`,{method:"POST",headers:{Authorization:`Bearer ${this.token}`,"Content-Type":"application/json"},body:JSON.stringify({events:o}),signal:r.signal})}finally{clearTimeout(n)}}async endSession(t,o){return this.request("POST",`/api/sacl/sessions/${t}/end`,o,O)}async getContext(t,o,r){return this.request("POST","/api/sacl/context",{teamId:t,filePath:o,repo:r},O)}};import I from"fs/promises";import ze from"path";import ne from"path";import Ye from"os";var re={"SKILL.md":`---
3
+ name: prp
4
+ description: Parker RePrompt - Rewrite a prompt for optimal clarity and structure before executing it. Improves your prompt before Claude acts on it.
5
+ argument-hint: <your prompt>
6
+ disable-model-invocation: true
7
+ ---
8
+
9
+ # Parker RePrompt
10
+
11
+ Take the user's prompt, rewrite it for optimal interaction with Claude, then execute the rewritten prompt.
12
+
13
+ ## Arguments
14
+
15
+ $ARGUMENTS \u2014 The user's original prompt to be optimized and executed.
16
+
17
+ ## Process
18
+
19
+ 1. **Analyze the original prompt:**
20
+ - Read the user's prompt: \`$ARGUMENTS\`
21
+ - Identify the core intent, desired outcome, and any implicit constraints
22
+ - Note what is ambiguous, underspecified, or could lead to a suboptimal response
23
+
24
+ 2. **Rewrite the prompt:**
25
+ - Make the intent explicit and unambiguous
26
+ - Add structure (numbered steps, clear deliverables) where it improves clarity
27
+ - Specify output format, scope, and constraints if the original prompt left them vague
28
+ - Include relevant context from the current working directory and codebase if applicable
29
+ - Preserve the user's original intent exactly \u2014 do not add goals they did not ask for
30
+ - Keep it concise; do not pad with unnecessary instructions
31
+
32
+ 3. **Show the rewritten prompt:**
33
+ - Lead with a bold **Parker RePrompt** header before the quoted block
34
+ - Display the rewritten prompt to the user in a quoted block so they can see what will be executed
35
+ - Briefly note (1-2 sentences) what you changed and why
36
+
37
+ 4. **Execute the rewritten prompt:**
38
+ - Immediately execute the rewritten prompt as if the user had typed it directly
39
+ - Follow all standard instructions, tool usage, and code quality standards while executing
40
+ `};var D={prp:re};var S="0.2.4",se="https://api.parkercto.com",P=ne.join(Ye.homedir(),".parker"),x=ne.join(P,"auth.json"),H=".parker",M="config.json",k="@parkercto/cli",ie=9999,ae="/callback",ce="parker hook session-start",le="parker hook event",de="parker hook context",me="parker hook session-end",ue="parker ",K=["prp"],pe="https://app.parkercto.com";function ge(e){return e instanceof Error&&"code"in e&&e.code==="ENOENT"}async function w(){try{let e=await I.readFile(x,"utf-8");return JSON.parse(e)}catch(e){if(ge(e))return null;throw e}}async function F(e){let t=ze.dirname(x);await I.mkdir(t,{recursive:!0}),await I.writeFile(x,JSON.stringify(e,null,2))}async function fe(){try{await I.unlink(x)}catch(e){if(ge(e))return;throw e}}async function he(){let e=await w();return e||(console.error("Not authenticated. Run 'parker enable' to get started."),process.exit(1)),e}async function ke(){if(process.env.PARKER_API_URL)return process.env.PARKER_API_URL;let e=await w();return e?.apiUrl?e.apiUrl:se}import J from"fs/promises";import{join as q}from"path";import{execFileSync as Qe}from"child_process";var G=class extends Error{constructor(o,r,n){super(`Git command failed: ${o}
41
+ ${n}`);this.command=o;this.exitCode=r;this.name="GitError"}};async function Ze(...e){try{return Qe("git",e,{encoding:"utf8",cwd:process.cwd(),stdio:["pipe","pipe","pipe"]})}catch(t){let o=t instanceof Error&&"status"in t?t.status:1,r=t instanceof Error&&"stderr"in t?String(t.stderr):"",n=t instanceof Error?t.message:String(t);throw new G(`git ${e.join(" ")}`,o||1,r||n)}}async function C(){try{return(await Ze("rev-parse","--show-toplevel")).trim()}catch{throw new Error("Not in a git repository")}}async function et(){let e=await C();return q(e,H,M)}async function g(){try{let e=await et(),t=await J.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(e instanceof Error&&"code"in e&&e.code==="ENOENT")return null;throw e}}async function v(e){let t=await C(),o=q(t,H);await J.mkdir(o,{recursive:!0});let r=q(o,M);await J.writeFile(r,JSON.stringify(e,null,2)+`
42
+ `)}import{Command as Oe}from"commander";import d from"chalk";import{existsSync as ft,mkdirSync as Re,writeFileSync as ht,rmSync as kt}from"fs";import{join as _}from"path";import{existsSync as tt,readFileSync as ot,writeFileSync as rt,mkdirSync as we,openSync as nt,closeSync as st,unlinkSync as it,constants as V}from"fs";import{join as Ce}from"path";function ye(){return Ce(P,"projects.json")}function Se(){return Ce(P,"projects.lock")}var at=50,ct=20;function lt(){we(P,{recursive:!0});let e=Se();for(let t=0;t<ct;t++)try{let o=nt(e,V.O_CREAT|V.O_EXCL|V.O_WRONLY);return st(o),!0}catch(o){if(o.code!=="EEXIST")throw o;let r=Date.now();for(;Date.now()-r<at;);}return!1}function dt(){try{it(Se())}catch{}}function Ee(e){let t=lt();try{return e()}finally{t&&dt()}}function Ae(){let e=ye();if(!tt(e))return[];try{let t=ot(e,"utf-8"),o=JSON.parse(t);return Array.isArray(o)?o.filter(r=>typeof r=="string"):[]}catch{return[]}}function Pe(e){we(P,{recursive:!0}),rt(ye(),JSON.stringify(e,null,2)+`
43
+ `)}function Te(e){Ee(()=>{let t=Ae();t.includes(e)||(t.push(e),Pe(t))})}function xe(e){Ee(()=>{let o=Ae().filter(r=>r!==e);Pe(o)})}import{existsSync as mt,mkdirSync as ut,readFileSync as pt,writeFileSync as gt}from"fs";import{join as B}from"path";function X(e){let t=B(e,".claude","settings.json");if(!mt(t))return{};try{return JSON.parse(pt(t,"utf-8"))}catch{return{}}}function W(e,t){ut(B(e,".claude"),{recursive:!0});let o=B(e,".claude","settings.json");gt(o,JSON.stringify(t,null,2)+`
44
+ `)}function _e(e){if(!e.hooks)return 0;let t=0;for(let[o,r]of Object.entries(e.hooks)){let n=r.filter(a=>{let s=a.hooks.some(i=>i.command.startsWith(ue));return s&&t++,!s});n.length===0?delete e.hooks[o]:e.hooks[o]=n}return Object.keys(e.hooks).length===0&&delete e.hooks,t}var b=["claude"];function wt(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return null;let o=t[1],r=o.match(/^name:\s*(.+)$/m)?.[1]?.trim()??"",n=o.match(/^description:\s*(.+)$/m)?.[1]?.trim()??"",a=o.match(/^argument-hint:\s*(.+)$/m)?.[1]?.trim();return!r||!n?null:{name:r,description:n,argumentHint:a}}function Ct(){return{SessionStart:[{matcher:"",hooks:[{type:"command",command:ce,timeout:5}]}],PostToolUse:[{matcher:"",hooks:[{type:"command",command:le,timeout:3}]}],PreToolUse:[{matcher:"",hooks:[{type:"command",command:de,timeout:3}]}],Stop:[{matcher:"",hooks:[{type:"command",command:me,timeout:5}]}]}}function yt(e){let t=X(e),o=Ct();t.hooks||(t.hooks={});for(let[r,n]of Object.entries(o)){t.hooks[r]||(t.hooks[r]=[]);for(let a of n)for(let s of a.hooks)t.hooks[r].some(c=>c.hooks.some(u=>u.command===s.command))||t.hooks[r].push({matcher:a.matcher,hooks:[s]})}W(e,t)}function St(e){let t=X(e),o=_e(t);o>0&&(W(e,t),console.log(d.red(` - Removed ${o} Parker hook(s) from .claude/settings.json`)))}async function T(){let e;try{e=await C()}catch{console.error(d.red("Not in a git repository. Run this from your project root.")),process.exit(1)}let t=_(e,".claude","skills");Re(t,{recursive:!0});let o=0,r=[];for(let n of K){let a=D[n];if(!a){console.warn(d.yellow(` Skill template not found: ${n} (skipped)`));continue}let s=_(t,n);Re(s,{recursive:!0});for(let[c,u]of Object.entries(a))ht(_(s,c),u);o++,console.log(d.green(` + .claude/skills/${n}/`));let i=a["SKILL.md"];if(i){let c=wt(i);c&&r.push(c)}}if(yt(e),console.log(d.green(" + .claude/settings.json (session hooks)")),Te(e),console.log(""),console.log(d.bold("Parker enabled for Claude Code.")),console.log(` ${o} skill(s) installed`),console.log(" Session hooks configured"),r.length>0){console.log(""),console.log(d.bold("Available skills:"));for(let n of r){let a=n.argumentHint?`/${n.name} ${n.argumentHint}`:`/${n.name}`;console.log(` ${d.cyan(a)}`),console.log(` ${d.dim(n.description)}`)}}}async function Y(){let e;try{e=await C()}catch{console.error(d.red("Not in a git repository. Run this from your project root.")),process.exit(1)}let t=_(e,".claude","skills"),o=0;for(let r of K){let n=_(t,r);ft(n)&&(kt(n,{recursive:!0}),o++,console.log(d.red(` - .claude/skills/${r}/`)))}St(e),xe(e),o===0?console.log(d.yellow("No Parker integration found to remove.")):(console.log(""),console.log(d.bold("Parker disabled for Claude Code.")),console.log(` ${o} skill(s) removed`),console.log(" Session hooks removed"))}var Ie=new Oe("connect").description("Connect Parker to an AI coding assistant").argument("<target>",`Target to connect: ${b.join(", ")}`).action(async e=>{e==="claude"?await T():(console.error(d.red(`Unknown target "${e}". Supported: ${b.join(", ")}`)),process.exit(1))}),ve=new Oe("disconnect").description("Disconnect Parker from an AI coding assistant").argument("<target>",`Target to disconnect: ${b.join(", ")}`).action(async e=>{e==="claude"?await Y():(console.error(d.red(`Unknown target "${e}". Supported: ${b.join(", ")}`)),process.exit(1))});import At from"open";import Pt from"http";import Tt from"url";var be="1",Ne="2";function z(e){if(typeof e=="string"&&e.length>0)return e}async function Q(e,t){let r=await new m(e.apiUrl,e.token).joinTeam(t.toUpperCase());await v({teamCode:r.team.teamCode}),console.log(l.green(`Joined team "${r.team.name}" as ${r.role}`)),console.log(l.dim(`Team code: ${r.team.teamCode}`)),console.log(""),await T()}async function xt(e){let t=new m(e,""),o=Z.createInterface({input:process.stdin,output:process.stdout}),r=await o.question("GitHub username: ");o.close();let n=await t.authDev(r),a={token:n.token,userId:n.user.id,githubUsername:n.user.githubUsername,apiUrl:e};return await F(a),console.log(l.green("Logged in as "+n.user.githubUsername)),console.log(""),a}function _t(e){return new Promise((t,o)=>{console.log("Opening browser for GitHub authentication...");let r=Pt.createServer(),n=ie;r.listen(n,()=>{let a=`${e}/auth/github?cli_port=${n}`;At(a)}),r.on("request",async(a,s)=>{if(!a.url)return;let i=Tt.parse(a.url,!0);if(i.pathname!==ae)return;let c=z(i.query.token),u=z(i.query.user_id),j=z(i.query.username);if(c&&u&&j){let oe={token:c,userId:u,githubUsername:j,apiUrl:e};await F(oe),s.writeHead(200,{"Content-Type":"text/html"}),s.end("<html><body><h1>Success!</h1><p>You can close this window.</p></body></html>"),r.close(),console.log(l.green("Logged in as "+j)),console.log(""),t(oe)}else s.writeHead(400,{"Content-Type":"text/html"}),s.end("<html><body><h1>Error</h1><p>Authentication failed \u2014 missing token.</p></body></html>"),r.close(),o(new Error("Login failed: missing token in callback"))})})}async function $e(e,t){return t?xt(e):_t(e)}async function Le(e){let t=Z.createInterface({input:process.stdin,output:process.stdout}),o=(await t.question("Team code: ")).trim();t.close(),o||(console.error(l.red("Team code is required.")),console.log(l.dim("Ask your team admin for the join code (e.g., XKCD-LAMP-FISH)")),process.exit(1));let r=new m(e,"");try{let n=await r.verifyTeamCode(o);console.log(l.green(`Found team "${n.name}"`)),console.log("")}catch(n){if(n instanceof p&&n.status===404)console.error(l.red("Team not found. Double-check the code and try again."));else{let a=n instanceof Error?n.message:String(n);console.error(l.red(`Could not verify team: ${a}`))}process.exit(1)}return o}async function Rt(e,t){let o=await g();if(o?.teamCode){console.log(l.dim(`Found team code in .parker/config.json: ${o.teamCode}`));let a;try{a=await $e(e,t)}catch(s){let i=s instanceof Error?s.message:String(s);console.error(l.red(`Login failed: ${i}`)),process.exit(1)}try{await Q(a,o.teamCode)}catch(s){let i=s instanceof Error?s.message:String(s);console.error(l.red(`Failed to join team: ${i}`)),process.exit(1)}return}console.log(l.bold("Welcome to Parker!")),console.log(""),console.log(` ${be}) I need to create a team`),console.log(` ${Ne}) I have a team code`),console.log("");let r=Z.createInterface({input:process.stdin,output:process.stdout}),n=(await r.question("Choose (1 or 2): ")).trim();if(r.close(),n===be){console.log(""),console.log(`Sign up and create your team at: ${l.cyan(pe)}`),console.log(""),console.log(l.dim("Once your team is created, run `parker enable` again with your team code."));return}if(n===Ne){let a=await Le(e),s;try{s=await $e(e,t)}catch(i){let c=i instanceof Error?i.message:String(i);console.error(l.red(`Login failed: ${c}`)),process.exit(1)}try{await Q(s,a)}catch(i){let c=i instanceof Error?i.message:String(i);console.error(l.red(`Failed to join team: ${c}`)),process.exit(1)}return}console.error(l.red("Invalid choice.")),process.exit(1)}var Ue=new Et("enable").description("Enable Parker \u2014 authenticate, join a team, and set up Claude Code integration").option("--dev","Use dev auth (no GitHub OAuth)").action(async e=>{let t=await w();if(t){if(console.log(l.dim(`Authenticated as ${t.githubUsername}`)),!(await g())?.teamCode){let n=t.apiUrl,a=await Le(n);try{await Q(t,a)}catch(s){let i=s instanceof Error?s.message:String(s);console.error(l.red(`Failed to join team: ${i}`)),process.exit(1)}return}await T();return}let o=await ke();await Rt(o,!!e.dev)});import{Command as Ot}from"commander";import y from"chalk";var N=new Ot("auth").description("Authentication commands");N.command("logout").description("Logout from Parker").action(async()=>{await fe(),console.log(y.green("\u2713 Logged out"))});N.command("status").description("Check authentication status").action(async()=>{let e=await w();if(!e){console.log(y.yellow("Not authenticated")),console.log(y.dim("Run 'parker enable' to get started"));return}console.log(y.green("\u2713 Authenticated")),console.log(` User: ${y.bold(e.githubUsername)}`),console.log(` API: ${e.apiUrl}`);let t=await g();t?.teamCode?console.log(` Team: ${y.bold(t.teamCode)}`):(console.log(y.yellow(" No team configured for this repo")),console.log(y.dim(" Run 'parker join <code>' to join a team")))});import{Command as It}from"commander";import f from"chalk";async function vt(e,t){let r=await new m(e.apiUrl,e.token).joinTeam(t.toUpperCase());await v({teamCode:r.team.teamCode}),console.log(f.green(`\u2713 Joined team "${r.team.name}" as ${r.role}`)),console.log(f.dim(`Team code: ${r.team.teamCode}`)),console.log(""),await T()}var je=new It("join").description("Join a team").argument("[code]","Team join code (e.g., XKCD-LAMP-FISH)").action(async e=>{let t=await he(),o=e;if(!o){let r=await g();r?.teamCode?(o=r.teamCode,console.log(f.dim(`Using team code from .parker/config.json: ${o}`))):(console.error(f.red("No team code provided and no .parker/config.json found.")),console.log(f.dim("Usage: parker join <code>")),process.exit(1))}try{await vt(t,o)}catch(r){if(r instanceof p)r.status===400?console.error(f.red("Invalid team code")):r.status===404?console.error(f.red("Team not found")):console.error(f.red(`Failed to join team: ${r.message}`));else{let n=r instanceof Error?r.message:String(r);console.error(f.red(`Failed to join team: ${n}`))}process.exit(1)}});import{Command as bt}from"commander";var De=new bt("disable").description("Disable Parker \u2014 remove Claude Code skills and session hooks from this repo").action(async()=>{await Y()});import{Command as Nt}from"commander";import{execSync as $t}from"child_process";import E from"chalk";import Lt from"update-notifier";var He=new Nt("update").description("Update the Parker CLI to the latest version").action(async()=>{console.log(E.cyan("Checking for updates..."));try{let e={name:k,version:S},t=Lt({pkg:e,updateCheckInterval:0});if(await t.fetchInfo(),!t.update||t.update.latest===e.version){console.log(E.green("Already on the latest version."));return}let{current:o,latest:r}=t.update;console.log(`Updating from ${E.dim(o)} \u2192 ${E.green(r)}...`),$t(`npm install -g ${k}@latest`,{stdio:"inherit"}),console.log(E.green("Successfully updated to the latest version."))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(E.red(`Update failed: ${t}`)),console.error(E.dim(`Try running: npm install -g ${k}@latest`)),process.exit(1)}});import{Command as R}from"commander";import{readdirSync as Gt}from"fs";import ee from"fs/promises";import Ut from"path";import jt from"os";var Dt="parker-session-";function te(e){return Ut.join(jt.tmpdir(),`${Dt}${e}.json`)}async function Me(e,t){let o=te(e);await ee.writeFile(o,JSON.stringify(t))}async function $(e){let t=te(e);try{let o=await ee.readFile(t,"utf-8");return JSON.parse(o)}catch(o){return o instanceof Error&&"code"in o&&o.code!=="ENOENT"&&process.stderr.write(`parker: failed to load session state: ${o.message}
45
+ `),null}}async function Ke(e){let t=te(e);try{await ee.unlink(t)}catch(o){o instanceof Error&&"code"in o&&o.code!=="ENOENT"&&process.stderr.write(`parker: failed to clear session state: ${o.message}
46
+ `)}}var Ht=/(?:KEY|SECRET|TOKEN|PASSWORD|CREDENTIAL|PRIVATE)/i;var Mt="[REDACTED]",Kt="[CONTENT_REDACTED]";function Ft(e){return Ht.test(e)}function Fe(e){let t={};for(let[o,r]of Object.entries(e))Ft(o)?t[o]=Mt:typeof r=="string"&&r.length>500?t[o]=Kt:t[o]=r;return t}var Jt=3,qt=100,Vt="unknown";async function Bt(){if(process.stdin.isTTY)return"";let e=[];for await(let t of process.stdin)e.push(Buffer.from(t));return Buffer.concat(e).toString("utf-8")}async function L(){try{let e=await Bt();return e.trim()?JSON.parse(e):null}catch{return null}}function Ge(e){return typeof e.file_path=="string"?e.file_path:typeof e.path=="string"?e.path:null}function Je(e){return e.length===0?"":`Parker context for this file:
47
+ ${e.map(o=>`[${o.kind}] ${o.headline}: ${o.summary}`).join(`
48
+ `)}`}var Xt=new R("session-start").description("Hook: called when a Claude Code session starts").action(async()=>{try{let t=(await L())?.session_id??`fallback-${Date.now()}`,o=await w();if(!o){process.stdout.write("{}");return}let r=await g();if(!r){process.stdout.write("{}");return}let n=new m(o.apiUrl,o.token),a=null;try{a=await n.getTeam(r.teamCode)}catch(c){process.stderr.write(`parker hook session-start: failed to resolve team: ${c}
49
+ `),process.stdout.write("{}");return}let s=[];try{let c=await C();s=Gt(c,{withFileTypes:!0}).filter(u=>u.isFile()).map(u=>u.name).slice(0,qt)}catch{}let i=await n.createSession(a.id,new Date().toISOString(),s);if(await Me(t,{sessionId:i.sessionId,teamId:a.id,engineerId:o.userId,apiUrl:o.apiUrl,token:o.token}),i.cards&&i.cards.length>0){let c=Je(i.cards);process.stdout.write(JSON.stringify({additionalContext:c}))}else process.stdout.write("{}")}catch(e){process.stderr.write(`parker hook session-start error: ${e}
50
+ `),process.stdout.write("{}")}}),Wt=new R("event").description("Hook: called after a tool use during a Claude Code session").action(async()=>{try{let e=await L();if(!e)return;let t=e.session_id??"",o=await $(t);if(!o)return;let r=e.tool_name??Vt,n=e.tool_input??{},a=Ge(n),s=Fe({toolName:r,filePath:a,success:e.tool_error===void 0||e.tool_error===null,timestamp:new Date().toISOString()});new m(o.apiUrl,o.token).sendEvents(o.sessionId,[s]).catch(c=>{process.stderr.write(`parker hook event send error: ${c}
51
+ `)})}catch(e){process.stderr.write(`parker hook event error: ${e}
52
+ `)}}),Yt=new R("context").description("Hook: called before a tool use to inject context").action(async()=>{try{let e=await L();if(!e){process.stdout.write("{}");return}let t=e.session_id??"",o=await $(t);if(!o){process.stdout.write("{}");return}let r=e.tool_input??{},n=Ge(r);if(!n){process.stdout.write("{}");return}let s=await new m(o.apiUrl,o.token).getContext(o.teamId,n);if(s.cards&&s.cards.length>0){let i=Je(s.cards.slice(0,Jt));process.stdout.write(JSON.stringify({additionalContext:i}))}else process.stdout.write("{}")}catch(e){process.stderr.write(`parker hook context error: ${e}
53
+ `),process.stdout.write("{}")}}),zt=new R("session-end").description("Hook: called when a Claude Code session ends").action(async()=>{try{let t=(await L())?.session_id??"",o=await $(t);if(!o)return;await new m(o.apiUrl,o.token).endSession(o.sessionId,{endedAt:new Date().toISOString(),filesRead:[],filesModified:[]}),await Ke(t)}catch(e){process.stderr.write(`parker hook session-end error: ${e}
54
+ `)}}),qe=new R("hook").description("Claude Code hook handlers (internal)").addCommand(Xt).addCommand(Wt).addCommand(Yt).addCommand(zt);import A from"chalk";function Ve(e){let t=n=>A.green(n),o=n=>A.yellow(n),r=A.dim;console.log(""),console.log(` ${A.bold("Parker")} ${r(`v${e}`)} \u2014 Engineering team intelligence`),console.log(""),console.log(A.bold(" Getting Started")),console.log(` ${t("parker enable")} Enable Parker for this repo`),console.log(` ${t("parker disable")} Remove Parker from this repo`),console.log(` ${t("parker join")} ${o("<code>")} Join an existing team`),console.log(""),console.log(r(" Tips")),console.log(r(` Run ${A.reset("parker <command> --help")} for detailed options`)),console.log(r(` Run ${A.reset("parker update")} to update to the latest version`)),console.log("")}import{execSync as Qt,spawn as Zt}from"child_process";import U from"chalk";import eo from"update-notifier";var Be="PARKER_SKIP_AUTO_UPDATE",to=360*60*1e3;function oo(e,t){let o=u=>u.split(".").map(Number),[r,n=0,a=0]=o(e),[s,i=0,c=0]=o(t);return r!==s?r>s:n!==i?n>i:a>c}function ro(e){try{return console.error(U.cyan(`Updating ${k} ${U.dim("\u2192")} ${U.green(e)}...`)),Qt(`npm install -g ${k}@latest`,{stdio:["ignore","ignore","inherit"]}),!0}catch{return console.error(U.yellow("Auto-update failed. Continuing with current version.")),!1}}function no(){let e=Zt(process.argv[0],process.argv.slice(1),{stdio:"inherit",env:{...process.env,[Be]:"1"}});throw e.on("exit",t=>{process.exit(t??0)}),e.on("error",()=>{process.exit(1)}),new Error("unreachable")}function Xe(){if(process.env[Be]||process.argv[1]?.endsWith(".ts"))return;let e={name:k,version:S},t=eo({pkg:e,updateCheckInterval:to});if(!t.update||!oo(t.update.latest,e.version))return;ro(t.update.latest)&&no()}Xe();var h=new so().name("parker").description("Parker \u2014 Engineering team intelligence").version(S);h.addCommand(Ue);h.addCommand(De);h.addCommand(N);h.addCommand(je);h.addCommand(Ie);h.addCommand(ve);h.addCommand(He);h.addCommand(qe);h.parse(process.argv);process.argv.slice(2).length||Ve(S);
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import{existsSync as g,rmSync as w}from"fs";import{join as h}from"path";import a from"path";import y from"os";var n=a.join(y.homedir(),".parker"),F=a.join(n,"auth.json");var p="parker ",u=["prp"];import{existsSync as _,mkdirSync as R,readFileSync as P,writeFileSync as L}from"fs";import{join as i}from"path";function l(e){let t=i(e,".claude","settings.json");if(!_(t))return{};try{return JSON.parse(P(t,"utf-8"))}catch{return{}}}function d(e,t){R(i(e,".claude"),{recursive:!0});let r=i(e,".claude","settings.json");L(r,JSON.stringify(t,null,2)+`
3
+ `)}function m(e){if(!e.hooks)return 0;let t=0;for(let[r,o]of Object.entries(e.hooks)){let s=o.filter(k=>{let c=k.hooks.some(S=>S.command.startsWith(p));return c&&t++,!c});s.length===0?delete e.hooks[r]:e.hooks[r]=s}return Object.keys(e.hooks).length===0&&delete e.hooks,t}import{existsSync as x,readFileSync as E,writeFileSync as $,mkdirSync as z,openSync as W,closeSync as Y,unlinkSync as Q,constants as Z}from"fs";import{join as O}from"path";function A(){return O(n,"projects.json")}function C(){let e=A();if(!x(e))return[];try{let t=E(e,"utf-8"),r=JSON.parse(t);return Array.isArray(r)?r.filter(o=>typeof o=="string"):[]}catch{return[]}}function f(){return C()}function I(e){let t=h(e,".claude","skills");for(let r of u){let o=h(t,r);g(o)&&w(o,{recursive:!0})}}function v(e){let t=l(e);m(t)>0&&d(e,t)}function T(){let e=f();if(e.length!==0){console.error("Parker: cleaning up integrations...");for(let t of e)if(g(t))try{I(t),v(t),console.error(` Cleaned up: ${t}`)}catch{console.error(` Failed to clean up: ${t}`)}}}T();
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@parkercto/cli",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
7
7
  "!dist/tsconfig.tsbuildinfo"
8
8
  ],
9
9
  "bin": {
10
- "parker": "./dist/bin/parker.js"
10
+ "parker": "./dist/cli.js"
11
11
  },
12
12
  "dependencies": {
13
13
  "chalk": "^5.4.0",
@@ -18,17 +18,18 @@
18
18
  "devDependencies": {
19
19
  "@types/node": "^22.0.0",
20
20
  "@types/update-notifier": "^6.0.8",
21
+ "tsup": "^8.0.0",
21
22
  "tsx": "^4.19.0",
22
23
  "typescript": "^5.7.0",
23
24
  "vitest": "^4.0.18"
24
25
  },
25
26
  "scripts": {
26
- "build": "tsc",
27
+ "build": "tsup",
27
28
  "dev": "tsx src/cli.ts",
28
29
  "typecheck": "tsc --noEmit",
29
30
  "clean": "rm -rf dist",
30
31
  "test": "vitest run",
31
32
  "test:watch": "vitest",
32
- "preuninstall": "node dist/bin/preuninstall.js"
33
+ "preuninstall": "node dist/preuninstall.js"
33
34
  }
34
35
  }
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import "../src/cli.js";
3
- //# sourceMappingURL=parker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parker.d.ts","sourceRoot":"","sources":["../../bin/parker.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import "../src/cli.js";
3
- //# sourceMappingURL=parker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parker.js","sourceRoot":"","sources":["../../bin/parker.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import "../cli.js";
3
- //# sourceMappingURL=parker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parker.d.ts","sourceRoot":"","sources":["../../../src/bin/parker.ts"],"names":[],"mappings":";AACA,OAAO,WAAW,CAAC"}
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import "../cli.js";
3
- //# sourceMappingURL=parker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parker.js","sourceRoot":"","sources":["../../../src/bin/parker.ts"],"names":[],"mappings":";AACA,OAAO,WAAW,CAAC"}
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * npm preuninstall lifecycle script.
4
- *
5
- * Iterates all projects registered in ~/.parker/projects.json and removes
6
- * Parker skills and session hooks from each. Runs before `npm uninstall -g`
7
- * removes the package files.
8
- */
9
- export {};
10
- //# sourceMappingURL=preuninstall.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preuninstall.d.ts","sourceRoot":"","sources":["../../../src/bin/preuninstall.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
@@ -1,51 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * npm preuninstall lifecycle script.
4
- *
5
- * Iterates all projects registered in ~/.parker/projects.json and removes
6
- * Parker skills and session hooks from each. Runs before `npm uninstall -g`
7
- * removes the package files.
8
- */
9
- import { existsSync, rmSync } from "fs";
10
- import { join } from "path";
11
- import { BUNDLED_SKILLS } from "../constants.js";
12
- import { readClaudeSettings, writeClaudeSettings, removeParkerHooks } from "../lib/claude-settings.js";
13
- import { getRegisteredProjects } from "../lib/project-registry.js";
14
- function removeSkillsFromProject(projectRoot) {
15
- const skillsDir = join(projectRoot, ".claude", "skills");
16
- for (const skillName of BUNDLED_SKILLS) {
17
- const skillDir = join(skillsDir, skillName);
18
- if (existsSync(skillDir)) {
19
- rmSync(skillDir, { recursive: true });
20
- }
21
- }
22
- }
23
- function removeHooksFromProject(projectRoot) {
24
- const settings = readClaudeSettings(projectRoot);
25
- const removed = removeParkerHooks(settings);
26
- if (removed > 0) {
27
- writeClaudeSettings(projectRoot, settings);
28
- }
29
- }
30
- function cleanupAllProjects() {
31
- const projects = getRegisteredProjects();
32
- if (projects.length === 0) {
33
- return;
34
- }
35
- console.error("Parker: cleaning up integrations...");
36
- for (const projectRoot of projects) {
37
- if (!existsSync(projectRoot)) {
38
- continue;
39
- }
40
- try {
41
- removeSkillsFromProject(projectRoot);
42
- removeHooksFromProject(projectRoot);
43
- console.error(` Cleaned up: ${projectRoot}`);
44
- }
45
- catch {
46
- console.error(` Failed to clean up: ${projectRoot}`);
47
- }
48
- }
49
- }
50
- cleanupAllProjects();
51
- //# sourceMappingURL=preuninstall.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preuninstall.js","sourceRoot":"","sources":["../../../src/bin/preuninstall.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,SAAS,uBAAuB,CAAC,WAAmB;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzD,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,WAAmB;IACjD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,mBAAmB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAErD,KAAK,MAAM,WAAW,IAAI,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,uBAAuB,CAAC,WAAW,CAAC,CAAC;YACrC,sBAAsB,CAAC,WAAW,CAAC,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;AACH,CAAC;AAED,kBAAkB,EAAE,CAAC"}
package/dist/src/cli.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=cli.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
package/dist/src/cli.js DELETED
@@ -1,40 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Command } from "commander";
3
- import { createRequire } from "module";
4
- import { fileURLToPath } from "url";
5
- import { dirname, resolve } from "path";
6
- import { enableCommand } from "./commands/enable.js";
7
- import { authCommand } from "./commands/auth.js";
8
- import { joinCommand } from "./commands/join.js";
9
- import { disableCommand } from "./commands/disable.js";
10
- import { connectCommand, disconnectCommand } from "./commands/connect.js";
11
- import { updateCommand } from "./commands/update.js";
12
- import { hookCommand } from "./commands/hook.js";
13
- import { renderHelp } from "./render/help.js";
14
- import { autoUpdateIfNeeded } from "./lib/auto-update.js";
15
- // Auto-update: if a newer version is cached, install it and re-exec transparently.
16
- // Checks the npm registry every 6 hours (via update-notifier's on-disk cache).
17
- autoUpdateIfNeeded();
18
- const require = createRequire(import.meta.url);
19
- const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
20
- const packageJson = require(resolve(packageRoot, "package.json"));
21
- const program = new Command()
22
- .name("parker")
23
- .description("Parker — Engineering team intelligence")
24
- .version(packageJson.version);
25
- // Add all commands
26
- program.addCommand(enableCommand);
27
- program.addCommand(disableCommand);
28
- program.addCommand(authCommand);
29
- program.addCommand(joinCommand);
30
- program.addCommand(connectCommand);
31
- program.addCommand(disconnectCommand);
32
- program.addCommand(updateCommand);
33
- program.addCommand(hookCommand);
34
- // Parse arguments
35
- program.parse(process.argv);
36
- // Show custom help menu if no command provided
37
- if (!process.argv.slice(2).length) {
38
- renderHelp(packageJson.version);
39
- }
40
- //# sourceMappingURL=cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,mFAAmF;AACnF,+EAA+E;AAC/E,kBAAkB,EAAE,CAAC;AAErB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;AAElE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,WAAW,CAAC,OAAiB,CAAC,CAAC;AAE1C,mBAAmB;AACnB,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAEhC,kBAAkB;AAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,+CAA+C;AAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,UAAU,CAAC,WAAW,CAAC,OAAiB,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,64 +0,0 @@
1
- interface Team {
2
- id: string;
3
- name: string;
4
- teamCode: string;
5
- createdAt?: string;
6
- updatedAt?: string;
7
- }
8
- export declare class ApiError extends Error {
9
- status: number;
10
- constructor(status: number, message: string);
11
- }
12
- export declare class ParkerClient {
13
- private baseUrl;
14
- private token;
15
- constructor(baseUrl: string, token: string);
16
- private request;
17
- joinTeam(teamCode: string): Promise<{
18
- team: Team;
19
- role: string;
20
- }>;
21
- getTeam(teamId: string): Promise<Team>;
22
- verifyTeamCode(teamCode: string): Promise<{
23
- name: string;
24
- teamCode: string;
25
- }>;
26
- authDev(githubUsername: string): Promise<{
27
- token: string;
28
- user: {
29
- id: string;
30
- githubUsername: string;
31
- };
32
- }>;
33
- authGitHub(code: string): Promise<{
34
- token: string;
35
- user: {
36
- id: string;
37
- githubUsername: string;
38
- };
39
- }>;
40
- /** Creates a SACL session. The server resolves engineerId from team membership. */
41
- createSession(teamId: string, startedAt: string, filesInWorkingDir: string[]): Promise<{
42
- sessionId: string;
43
- cards: unknown[];
44
- }>;
45
- sendEvents(sessionId: string, events: Record<string, unknown>[]): Promise<void>;
46
- endSession(sessionId: string, data: {
47
- endedAt: string;
48
- filesRead: string[];
49
- filesModified: string[];
50
- taskSummary?: string;
51
- }): Promise<{
52
- jobId: string;
53
- }>;
54
- getContext(teamId: string, filePath: string, repo?: string): Promise<{
55
- cards: Array<{
56
- headline: string;
57
- summary: string;
58
- kind: string;
59
- confidence: number;
60
- }>;
61
- }>;
62
- }
63
- export {};
64
- //# sourceMappingURL=api-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../../src/client/api-client.ts"],"names":[],"mappings":"AAAA,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,QAAS,SAAQ,KAAK;IAExB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKlB;AAKD,qBAAa,YAAY;IAErB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;gBADL,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM;YAGT,OAAO;IAqCf,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAIjE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAW7E,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAezG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAiBxG,mFAAmF;IAC7E,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAS7C,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAChC,OAAO,CAAC,IAAI,CAAC;IAkBV,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IASvB,UAAU,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CAQtG"}
@@ -1,113 +0,0 @@
1
- export class ApiError extends Error {
2
- status;
3
- constructor(status, message) {
4
- super(message);
5
- this.status = status;
6
- this.name = "ApiError";
7
- }
8
- }
9
- const DEFAULT_TIMEOUT_MS = 10000;
10
- const HOOK_TIMEOUT_MS = 4000;
11
- export class ParkerClient {
12
- baseUrl;
13
- token;
14
- constructor(baseUrl, token) {
15
- this.baseUrl = baseUrl;
16
- this.token = token;
17
- }
18
- async request(method, path, body, timeoutMs = DEFAULT_TIMEOUT_MS) {
19
- const controller = new AbortController();
20
- const timer = setTimeout(() => controller.abort(), timeoutMs);
21
- let response;
22
- try {
23
- response = await fetch(`${this.baseUrl}${path}`, {
24
- method,
25
- headers: {
26
- Authorization: `Bearer ${this.token}`,
27
- "Content-Type": "application/json",
28
- },
29
- body: body ? JSON.stringify(body) : undefined,
30
- signal: controller.signal,
31
- });
32
- }
33
- finally {
34
- clearTimeout(timer);
35
- }
36
- if (!response.ok) {
37
- const error = await response.json().catch(() => ({}));
38
- throw new ApiError(response.status, error.error?.message ?? response.statusText);
39
- }
40
- return response.json();
41
- }
42
- // Team endpoints
43
- async joinTeam(teamCode) {
44
- return this.request("POST", "/api/teams/join", { teamCode });
45
- }
46
- async getTeam(teamId) {
47
- return this.request("GET", `/api/teams/${teamId}`);
48
- }
49
- // Public endpoints (no auth required)
50
- async verifyTeamCode(teamCode) {
51
- const response = await fetch(`${this.baseUrl}/public/teams/verify?code=${encodeURIComponent(teamCode)}`);
52
- if (!response.ok) {
53
- const error = await response.json().catch(() => ({}));
54
- throw new ApiError(response.status, error.error?.message ?? response.statusText);
55
- }
56
- return response.json();
57
- }
58
- // Auth endpoints
59
- async authDev(githubUsername) {
60
- const response = await fetch(`${this.baseUrl}/auth/dev`, {
61
- method: "POST",
62
- headers: { "Content-Type": "application/json" },
63
- body: JSON.stringify({ githubUsername }),
64
- });
65
- if (!response.ok) {
66
- const error = await response.json().catch(() => ({}));
67
- throw new ApiError(response.status, error.error?.message ?? response.statusText);
68
- }
69
- return response.json();
70
- }
71
- async authGitHub(code) {
72
- const response = await fetch(`${this.baseUrl}/auth/github`, {
73
- method: "POST",
74
- headers: { "Content-Type": "application/json" },
75
- body: JSON.stringify({ code }),
76
- });
77
- if (!response.ok) {
78
- const error = await response.json().catch(() => ({}));
79
- throw new ApiError(response.status, error.error?.message ?? response.statusText);
80
- }
81
- return response.json();
82
- }
83
- // SACL endpoints (use shorter timeouts for hook calls)
84
- /** Creates a SACL session. The server resolves engineerId from team membership. */
85
- async createSession(teamId, startedAt, filesInWorkingDir) {
86
- return this.request("POST", "/api/sacl/sessions", { teamId, startedAt, filesInWorkingDir }, HOOK_TIMEOUT_MS);
87
- }
88
- async sendEvents(sessionId, events) {
89
- const controller = new AbortController();
90
- const timer = setTimeout(() => controller.abort(), HOOK_TIMEOUT_MS);
91
- try {
92
- await fetch(`${this.baseUrl}/api/sacl/sessions/${sessionId}/events`, {
93
- method: "POST",
94
- headers: {
95
- Authorization: `Bearer ${this.token}`,
96
- "Content-Type": "application/json",
97
- },
98
- body: JSON.stringify({ events }),
99
- signal: controller.signal,
100
- });
101
- }
102
- finally {
103
- clearTimeout(timer);
104
- }
105
- }
106
- async endSession(sessionId, data) {
107
- return this.request("POST", `/api/sacl/sessions/${sessionId}/end`, data, HOOK_TIMEOUT_MS);
108
- }
109
- async getContext(teamId, filePath, repo) {
110
- return this.request("POST", "/api/sacl/context", { teamId, filePath, repo }, HOOK_TIMEOUT_MS);
111
- }
112
- }
113
- //# sourceMappingURL=api-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../../src/client/api-client.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- export interface AuthContext {
2
- token: string;
3
- userId: string;
4
- githubUsername: string;
5
- apiUrl: string;
6
- }
7
- export declare function loadAuth(): Promise<AuthContext | null>;
8
- export declare function saveAuth(ctx: AuthContext): Promise<void>;
9
- export declare function clearAuth(): Promise<void>;
10
- export declare function requireAuth(): Promise<AuthContext>;
11
- export declare function getApiUrl(): Promise<string>;
12
- //# sourceMappingURL=auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/client/auth.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAU5D;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9D;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAS/C;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAOxD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAEjD"}
@@ -1,46 +0,0 @@
1
- import fs from "fs/promises";
2
- import path from "path";
3
- import { AUTH_FILE_PATH, DEFAULT_API_URL } from "../constants.js";
4
- function isFileNotFound(error) {
5
- return error instanceof Error && "code" in error && error.code === "ENOENT";
6
- }
7
- export async function loadAuth() {
8
- try {
9
- const data = await fs.readFile(AUTH_FILE_PATH, "utf-8");
10
- return JSON.parse(data);
11
- }
12
- catch (error) {
13
- if (isFileNotFound(error)) {
14
- return null;
15
- }
16
- throw error;
17
- }
18
- }
19
- export async function saveAuth(ctx) {
20
- const dir = path.dirname(AUTH_FILE_PATH);
21
- await fs.mkdir(dir, { recursive: true });
22
- await fs.writeFile(AUTH_FILE_PATH, JSON.stringify(ctx, null, 2));
23
- }
24
- export async function clearAuth() {
25
- try {
26
- await fs.unlink(AUTH_FILE_PATH);
27
- }
28
- catch (error) {
29
- if (isFileNotFound(error)) {
30
- return;
31
- }
32
- throw error;
33
- }
34
- }
35
- export async function requireAuth() {
36
- const auth = await loadAuth();
37
- if (!auth) {
38
- console.error("Not authenticated. Run 'parker enable' to get started.");
39
- process.exit(1);
40
- }
41
- return auth;
42
- }
43
- export async function getApiUrl() {
44
- return process.env.PARKER_API_URL ?? DEFAULT_API_URL;
45
- }
46
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/client/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AASlE,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC;AACzG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;IACzC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAgB;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,eAAe,CAAC;AACvD,CAAC"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare const authCommand: Command;
3
- //# sourceMappingURL=auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SACiB,CAAC"}
@@ -1,36 +0,0 @@
1
- import { Command } from "commander";
2
- import chalk from "chalk";
3
- import { loadAuth, clearAuth } from "../client/auth.js";
4
- import { loadRepoConfig } from "../lib/repo-config.js";
5
- export const authCommand = new Command("auth")
6
- .description("Authentication commands");
7
- authCommand
8
- .command("logout")
9
- .description("Logout from Parker")
10
- .action(async () => {
11
- await clearAuth();
12
- console.log(chalk.green("✓ Logged out"));
13
- });
14
- authCommand
15
- .command("status")
16
- .description("Check authentication status")
17
- .action(async () => {
18
- const auth = await loadAuth();
19
- if (!auth) {
20
- console.log(chalk.yellow("Not authenticated"));
21
- console.log(chalk.dim("Run 'parker enable' to get started"));
22
- return;
23
- }
24
- console.log(chalk.green("✓ Authenticated"));
25
- console.log(` User: ${chalk.bold(auth.githubUsername)}`);
26
- console.log(` API: ${auth.apiUrl}`);
27
- const repoConfig = await loadRepoConfig();
28
- if (repoConfig?.teamCode) {
29
- console.log(` Team: ${chalk.bold(repoConfig.teamCode)}`);
30
- }
31
- else {
32
- console.log(chalk.yellow(" No team configured for this repo"));
33
- console.log(chalk.dim(" Run 'parker join <code>' to join a team"));
34
- }
35
- });
36
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,yBAAyB,CAAC,CAAC;AAE1C,WAAW;KACR,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,SAAS,EAAE,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEL,WAAW;KACR,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAE9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAErC,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;IAC1C,IAAI,UAAU,EAAE,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC,CAAC,CAAC"}