Lines 213-253javascript
213`).find(r=>r.trimStart().startsWith("description:"));return n?n.replace(/^\s*description:\s*/,"").replace(/^['"]|['"]$/g,"").trim():""}async function Ey(t){let e;try{e=await Eu(t,{withFileTypes:!0})}catch{return[]}let n=[],r=new Set;for(let o of e){if(!o.isFile()||!o.name.endsWith(".md"))continue;let i=o.name.replace(/\.md$/,"");r.add(i);try{let s=await yy(eo(t,o.name),"utf8");n.push({cmd:`/avatar:${i}`,desc:vy(s)})}catch{}}for(let o of e){if(!o.isDirectory()||r.has(o.name))continue;let i=eo(t,o.name),s=await zi(i);s!==0&&n.push({cmd:`/avatar:${o.name}:*`,desc:`nh\xF3m ${s} l\u1EC7nh (g\xF5 /a ...
214`);return by(u,{padding:1,borderStyle:"round",borderColor:"cyan"})}O();y();import Sy from"boxen";var Au=[{name:"SKILLS",role:"k\u1EF9 n\u0103ng t\xE1i d\xF9ng \u2014 Claude g\u1ECDi khi c\u1EA7n"},{name:"AGENTS",role:"subagent chuy\xEAn tr\xE1ch \u2014 skills \u0111i\u1EC1u ph\u1ED1i"},{name:"WORKFLOW",role:"orchestrate nhi\u1EC1u agent song song"},{name:"TOOLS",role:"hook g\xE1c c\u1ED5ng m\u1ECDi thao t\xE1c"},{name:"SECURITY",role:"ch\u1EB7n push/secret r\u1EE7i ro tr\u01B0\u1EDBc khi x\u1EA3y ra"},{name:"LOG TRACKING",role:"ghi nh\u1EADn m\u1ECDi h\xE0nh \u0111\u1ED9ng \u0111\u1EC3 truy v\ ...
215`)}function Tu(){let t=qe(Xi,"Ki\u1EBFn tr\xFAc Avatar \u2014 8 kh\u1ED1i quanh m\u1ED9t l\xF5i",!0),e=Qi("M\u1ECDi kh\u1ED1
219${e}`;process.stdout.write(`
220${Sy(n,{padding:1,borderStyle:"round",borderColor:"magenta",textAlignment:"left"})}
221`)}import wO from"boxen";y();var no=[{name:"login",desc:"\u0110\u0103ng nh\u1EADp Google SSO (m\u1ECDi account; pack ch\u1EC9 cho workspace NAL)"},{name:"logout",desc:"\u0110\u0103ng xu\u1EA5t \u2014 revoke token + x
222`;await U(n,r)}async function Ou(t,e){return[]}async function Mu(t,e){let n=await oo("CLAUDE.md",e);return await _u(Bt(t,"CLAUDE.md"),n)}async function Lu(t,e){let n=Bt(t,"CLAUDE.md");if(!await d(n))return{outcome:"skipped-no-file"};let r=await $u.readFile(n,"utf8"),o=await oo("CLAUDE.md",e),{mergeClaudeMdManagedBlock:i}=await Promise.resolve().then(()=>(ea(),Ru)),s=i(r,o);return await U(n,s.content),{outcome:s.outcome}}async function Fu(t,e){let n=await oo("settings.json",e);return await Y(t,()=>_u(Bt(t,".claude","settings.json"),n,Z))}async function Du(t){let e=Bt(t,".claude",".gitignore");a ...
223Y\xEAu c\u1EA7u: ch\u1EC9 ch\u1EEF/s\u1ED1/dash/underscore/dot, kh\xF4ng '/', '\\', '..'.`);if(!Or(t,so(t,e)))throw new Error(`T\xEAn workspace "${e}" resolve ra ngo\xE0i parent dir (path traversal). Block.`
224`),{padding:1,borderStyle:"round"})}
225`);let o=so(t,pt);if(await d(o)){let i=await Su(o);i&&process.stdout.write(`
227`)}Tu()}import{join as po}from"path";b();ea();import{lstat as Wy,readFile as qy}from"fs/promises";import{join as co}from"path";var Jy=[".claude","pack","templates","orientation.md.tpl"],Ku=["notes","orientation.md"],ra="@notes/orientation.md",Yy="<!-- avatar:orientation-import: off -->",zy="<!-- Avatar (#212): b\u1EA3n \u0111\u1ED3 workspace, seed t\u1EEB pack qua 'avatar sync'. -->",Xy=new Set(["created","replaced-block","no-op","backed-up-replaced"]);async function oa(t){try{return(await Wy(t)).isSymbolicLink()}catch(e){if(e?.code!=="ENOENT")throw e;return!1}}async function ia(t){try{return ...
228`),n=e.findIndex(o=>o.trimStart().startsWith(Nn)),r=e.findIndex(o=>o.trimStart().startsWith(In));return n!==-1&&r!==-1&&n<r}async
232`;return await U(n,o),{appended:!0}}catch(r){return{appended:!1,warning:`kh\xF4ng th\xEAm \u0111\u01B0\u1EE3c '${ra}' v\xE0o ${n}: ${r instanceof Error?r.message:String(r)}`}}}b();y();var Wu=3;async function qu(t,e,n,r=!1){let o=0;for(;;)try{return{pinnedTag:(await vu(t,e)).pinnedTag,skipped:!1}}catch(i){if(i instanceof We)throw i;if(i instanceof ke){a.error(i.message);let c=await ft({taskName:"T\u1EA3i team-ai-pack (x\xE1c th\u1EF1c NAL)",reason:i.message,allowSkip:!0,hint:"Pack ch\u1EC9 t\u1EA3i \u0111\u01B0\u1EE3c b\u1EB1ng account thu\u1ED9c workspace NAL (login th\xEC m\u1ECDi account \u0 ...
233`),e&&process.stdout.write(` D\u1EF1 ki\u1EBFn: ${f.cyan(e)}
234`),process.exit(0)}}function om(t){t.command("mcp-run <tool-id>",{hidden:!0}).description("[internal] Spawn MCP v\u1EDBi secrets injected (M09)").action(Kt("mcp-run","Milestone 09"))}import{spawn as
235`),0;e.spawnDetached(n.command,n.args)}catch(n){if(t.verbose){let r=n instanceof Error?n.message:String(n);e.stderr(`avatar notify: l\u1ED7i \u2014 ${r}
236`)}}return 0}function um(t){t.command("notify").description("B\u1EAFn OS notification qua helper AvatarCodi (fail-open, no-op ngo\xE0i AvatarCodi)").requiredOption("--body <text>","N\u1ED9i dung notification, t\u1ED1i \u0111a 200 k\xFD t\u1EF1 (b\u1EAFt bu\u1ED9c)").option("--title <text>","Ti\xEAu \u0111\u1EC1 notification","AvatarCodi").option("--subtitle <text>","Subtitle (ch\u1EC9 c\xF3 t\xE1c d\u1EE5ng tr\xEA
237`):$b(r)}catch(r){a.error(r instanceof Error?r.message:String(r)),process.exit(1)}})}async function Rb(t){let e=Tb(t,Pb);return await d(e)?{installed:!0,currentVersion:await
238`),{padding:1,borderStyle:"round"})}
239`);return}let e=t.currentVersion??f.yellow("(unknown)"),n=[`${f.bold("team-ai-pack status")}`,"\u2500".repeat(48),`${f
240`),{padding:1,borderStyle:"round"})}
241`)}async function _b(t){try{return t.stdout(await t.getToken()),0}catch(e){return t.stderr(`print-id-token: ${e instanceof Error?
242`)});process.exit(e)})}function gm(t){t.command("restore").description("Kh\xF4i ph\u1EE5c .claude/pack/ t\u1EEB backup (M08)").option("--backup <name>","T\xEAn backup folder trong .claude/_backup/").option(
243`).find(o=>o.trim()&&!o.startsWith("#")&&!o.startsWith(">"))?.trim()??"(empty)":"(no tech-stack.md)"}function jb(t){return t.toolsEnabled.length>0?`${t.toolsEnabled.join(", ")} (${t.toolsEnabled.length}/${t.toolsAvailableCount} available)`:t.toolsAvailableCount>0?`none enabled (${t.toolsAvailableCount} available \u2014 avatar tool list)`:"none"}function Ub(t){let e=[`${f.bold("Avatar Status")} \xB7 ${f.cyan(t.projectName)}`,"\u2500".repeat(48),`${f.dim("CLI version:")} ${t.cliVersion}`,`${f.dim
244`),{padding:1,borderStyle:"round"})}
245`)}import{readFile as $v}from"fs/promises";import{basename as _v,dirname as Jm,join as ma,resolve as Nv}from"path";var Hb=/^v?(\d+)\.(
246T\u1ED5ng k\u1EBFt sync --all (\u0111\xEDch: ${e})`),t.length===0){a.plain(" (registry r\u1ED7ng \u2014 ch\u01B0a workspace n\xE0o \u0111\u01B0\u1EE3c \u0111\u0103ng k\xFD)");return}for(let r of t)a.plain(` ${r.path}`),a.plain(` ${Av(r,e)}${r.detail?` \u2014 ${r.detail}`:
247 \xC9p sync \u0111\xFAng workspace n\xE0y: avatar sync --all --force-open-sessions ${r.path}`);t.some(r=>r.outcome==="skipped"&&r.reason==="stale")&&a.warn("B\u1ECF qua workspace qu\xE1 h\u1EA1n ho
248\u2500\u2500 sync ${m.path} (\u0111ang c\xE0i: ${m.currentVersion??"unknown"})`),l=m.path;let p=await Vm(m.path,{force:r.force,packVersion:r.packVersion,local:r.local});l=null,p.code===0?(await Bc(m.path,new Date),i.push({path:m.path,outcome:"ok",currentVersion:m.currentVersion})):i.push({path:m.path,outcome:"failed",currentVersion:m.currentVersion,detail:p.signal?`b\u1ECB t\xEDn hi\u1EC7u ${p.signal}`:`exit code ${p.code??"?"}`})}}finally{process.off("SIGINT",u),process.off("SIGTERM",u)}if(ua(i,n),s){let m=c;a.warn(`\u0110\xE3 ng\u1EAFt gi\u1EEFa ch\u1EEBng.${m?` Workspace \u0111ang d\u1EDF: ...
249 Pack \u1EDF \u0111\xF3 c\xF3 th\u1EC3 \u0111ang V\u1EAENG \u2014 ch\u1EA1y l\u1EA1i \`avatar sync\` t\u1EA1i workspace n\xE0y.
250 C\xF2n s\xF3t \`.claude/pack.old-*\` / \`.claude/pack.new-*\` th\xEC xo\xE1 tay sau khi sync l\u1EA1i.`),process.exit(130)}i.some(m=>m.outcome==="failed")&&process.exit
251Mount dir statuses:`);for(let u of c.mountDirStatuses)a.plain(` ${u.dir.padEnd(12)} ${u.status}`);a.info(`
252Dry-run done. Kh\xF4ng apply. B\u1ECF --dry-run \u0111\u1EC3 th\u1EF1c thi.`);return}let o;if(t.local){t.packVersion&&(a.error("--local kh\xF4ng d\xF9ng chung v\u1EDBi --pack-version (version ch\u1EC9 \xE1p d\u1EE5ng cho Supabase)."),process.exit(1));let c=Nv(t.local);if(t.dryRun){a.info(`[dry-run] S\u1EBD c\xE0i pack t\u1EEB local: ${c} \u2192 ${r}`),a.info("[dry-run] Sau \u0111\xF3 d\u1EF1ng l
253`),[];let i=r==="add"?Xm(t,e):Qm(t);return await Gv({message:r==="add"?"Ch\u1ECDn tool \u0111\u1EC3 c\xE0i (space ch\u1ECDn, enter x\xE1c nh\u1EADn):":"Ch\u1ECDn tool \u0111\u1EC3 g\u1EE1 (space ch\u1ECDn, enter x
Long lines were clipped for display.