akapen 0.1.0 → 0.1.1
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.
- package/dist/akapen.js +1 -1
- package/package.json +1 -1
package/dist/akapen.js
CHANGED
|
@@ -31,7 +31,7 @@ import{parseArgs as e,promisify as t}from"node:util";import n from"node:path";im
|
|
|
31
31
|
`)},yt=e=>e.findings.length===0?[``,`## 指摘`,``,`なし`]:[``,`## 指摘(${String(e.findings.length)} 件)`,``,e.findings.map(vt).join(`
|
|
32
32
|
|
|
33
33
|
`)],bt=e=>{let t=e.map(e=>e.costUsd).filter(e=>e!==void 0);return t.length===0?``:`、$${t.reduce((e,t)=>e+t,0).toFixed(lt)}`},xt=e=>e.unplaced.length===0?[]:[``,`## 変更行に置けなかった指摘(${String(e.unplaced.length)} 件、要確認)`,``,...e.unplaced.map(e=>`- [${e.source}] ${e.error}\n ${JSON.stringify(e.finding)}`)],St=(e,t)=>{let n=t.reduce((e,t)=>e+t.inputTokens,0),r=t.reduce((e,t)=>e+t.outputTokens,0);return`- ${e}: 入力 ${String(n)} / 出力 ${String(r)} トークン${bt(t)}`},Ct=e=>{let t=[...new Set(e.usage.map(e=>e.model))].map(t=>St(t,e.usage.filter(e=>e.model===t)));return t.push(St(`合計`,e.usage)),[``,`## 使用量`,``,...t,``,`中間成果物: ${e.artifactDir}`]},wt=e=>[`# akapen: ${mt(e)}`,``,...ht(e),...gt(e),..._t(e),...yt(e),...xt(e),...Ct(e),``].join(`
|
|
34
|
-
`),Tt=m.O_WRONLY|m.O_CREAT|m.O_TRUNC|m.O_NOFOLLOW,Et=async(e,t)=>{await p(e,t,{flag:Tt,mode:384})},Dt=/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/u,Ot=/^[\w.#:~-]{1,256}$/u,kt=e=>e===void 0||Array.isArray(e)&&e.every(e=>typeof e==`object`&&!!e&&`id`in e&&typeof e.id==`string`&&Ot.test(e.id)),At=e=>typeof e==`object`&&!!e&&`schemaVersion`in e&&e.schemaVersion===1&&`tree`in e&&typeof e.tree==`string`&&Dt.test(e.tree)&&`findings`in e&&Array.isArray(e.findings)&&kt(e.findings)&&kt(Reflect.get(e,`accepted`)),jt=async e=>{if(e===void 0)return;let t=JSON.parse(await u(e,`utf8`));if(!At(t))throw Error(`${e} は akapen の結果 JSON ではありません`);return t},Mt={name:`akapen`,version:`0.1.
|
|
34
|
+
`),Tt=m.O_WRONLY|m.O_CREAT|m.O_TRUNC|m.O_NOFOLLOW,Et=async(e,t)=>{await p(e,t,{flag:Tt,mode:384})},Dt=/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/u,Ot=/^[\w.#:~-]{1,256}$/u,kt=e=>e===void 0||Array.isArray(e)&&e.every(e=>typeof e==`object`&&!!e&&`id`in e&&typeof e.id==`string`&&Ot.test(e.id)),At=e=>typeof e==`object`&&!!e&&`schemaVersion`in e&&e.schemaVersion===1&&`tree`in e&&typeof e.tree==`string`&&Dt.test(e.tree)&&`findings`in e&&Array.isArray(e.findings)&&kt(e.findings)&&kt(Reflect.get(e,`accepted`)),jt=async e=>{if(e===void 0)return;let t=JSON.parse(await u(e,`utf8`));if(!At(t))throw Error(`${e} は akapen の結果 JSON ではありません`);return t},Mt={name:`akapen`,version:`0.1.1`,description:`Multi-stage cross-model code review for Claude Code and Codex`,license:`UNLICENSED`,bin:{akapen:`dist/akapen.js`},files:[`dist`],type:`module`,imports:{"#package.json":`./package.json`,"#src/*":`./src/*`},scripts:{test:`vitest run`,typecheck:`tsc --noEmit`,lint:`oxlint --type-aware --deny-warnings`,format:`oxfmt`,"format:check":`oxfmt --check`,check:`pnpm run format:check && pnpm run lint && pnpm run typecheck && pnpm run test`,build:`vite build`,prepublishOnly:`pnpm run check && pnpm run build`},dependencies:{"@anthropic-ai/claude-agent-sdk":`0.3.316`,"@clack/prompts":`1.8.1`,"@openai/codex-sdk":`0.166.0`,"smol-toml":`1.9.1`},devDependencies:{"@tsconfig/strictest":`2.0.8`,"@types/node":`26.6.6`,oxfmt:`0.75.0`,oxlint:`1.90.0`,"oxlint-tsgolint":`7.0.2005`,typescript:`7.0.2`,vite:`8.3.5`,vitest:`5.0.5`},engines:{node:`>=24`,pnpm:`>=12.16.1 <13`},packageManager:`pnpm@12.16.1`},Nt=async e=>({env:y(),home:h(),project:await C(e,[`rev-parse`,`--show-toplevel`])??n.resolve(e)}),Pt=()=>Mt.version,Ft=`akapen`,T=[{id:`claude-code`,label:`Claude Code`,reviewer:`codex`,skillsDir:(e,t)=>e===`project`?n.join(t.project,`.claude`,`skills`):n.join(t.env.CLAUDE_CONFIG_DIR??n.join(t.home,`.claude`),`skills`)},{id:`codex`,label:`Codex`,reviewer:`claude`,skillsDir:(e,t)=>e===`project`?n.join(t.project,`.agents`,`skills`):n.join(t.home,`.agents`,`skills`)}],It=[`user`,`project`],Lt=e=>{let t=T.find(t=>t.id===e);if(t===void 0)throw Error(`unknown agent ${e}`);return t},Rt=async()=>{let e=await ce({initialValues:T.map(e=>e.id),message:`どのエージェントにスキルを入れますか?(スペースで選択、Enter で決定)`,options:T.map(e=>({hint:`レビュアーは ${e.reviewer}`,label:e.label,value:e.id})),required:!0});if(!se(e))return e},zt=async()=>{let e=await ue({message:`どこに入れますか?`,options:[{hint:`すべてのプロジェクトで使う`,label:`ユーザー`,value:`user`},{hint:`このリポジトリだけ(コミットして共有できる)`,label:`プロジェクト`,value:`project`}]});if(!se(e))return e},Bt=async e=>{oe(`akapen setup`);let t=e.agents??await Rt();if(t===void 0)return;let n=e.scope??await zt();if(n!==void 0)return le(`インストールします`),{agents:t,scope:n}},Vt=`---
|
|
35
35
|
name: akapen
|
|
36
36
|
description: 実装がひと区切りついたとき、または PR を出す前に、変更を codex に多段レビュー(文脈調査 → 3 観点 → critic → 検証)させ、妥当な指摘だけを直して LGTM まで回す。ユーザーが「akapen」「赤ペン入れて」「codex にレビューさせて」「深くレビューして」と言ったときにも使う。
|
|
37
37
|
---
|