CPL{S:stmt=cmd(;cmd)*,cmd=op(args?),args=pair(,pair)*,pair=key=val|val,val=atom|[val(,val)*],atom=num|id|path|blobref;O:g,l,i,c,p,+,~,-,r,f,o,d,u,q,m,@;M:g=goal,l=lang,i=in,c=con,p=plan,+=gen,~=mod,-=del,r=run,f=fix,o=out,d=dep,u=unit,q=ask,m=mac,@=cwd;D:lang=[ts,js,py,go,rs,rb,sh,kt,cs],rt=[node,deno,bun,py39,wasm],test=[vi,je,pt,go],goal=[b,fx,rf,dc,bn],form=[s,z,d,p],algo=[dp,gr,bs,bt,df,bf,2p,fft,simd];F:lang=ts,rt=node,fmt=pr,test=vi,o.kind=s,style=S;R:sep=;,sp=*,inh=@|l|c,ref=$N;X:ord=L2R,bind=err>$err|log>$log,safe=[pnpm**,pytest,go_test]}CPLは、Coding Agentに対して「最小トークン数」で明確な指示を与えるための超簡潔な構成言語です。
人間用の詳細仕様ではなく、Agentにそのままドロップインできる形式を目指しています。
- 文は
;で区切る。 - 空白は使用せず、必要なら
_で置換。 key=valueの形で属性を与える。順序が一意ならkey=省略可。@で作業ルートを指定。直前の出力は$nで参照。- コメントは
#で始め行末まで。
例:
@(/ws); l(ts,deno); g(sum_ints); c(strict=1)
| 記号 | 意味 | 例 |
|---|---|---|
| g | 目的/要件 | g(app_ts_api) |
| l | 言語/環境 | l(lang=ts,rt=deno) |
| i | 入力仕様 | i(spec=$1) |
| c | 制約 | c(perf=P95<50ms) |
| p | 方針/アルゴリズム | p(algo=dp) |
| + | 生成 | +(src/a.ts,desc=fn_sum) |
| ~ | 修正 | ~(src/a.ts,fix=types) |
| - | 削除 | -(dist/*) |
| r | 実行/テスト | r(pnpm_test) |
| f | 修復 | f($log) |
| o | 出力形式 | o(single,lib.ts) |
| d | 依存関係 | d(npm=[kysely,pg]) |
| u | 単体テスト例 | u(in=[2,3],out=5) |
| q | 質問 | q(n=1,ask=ambiguous_api) |
| m | マクロ定義 | m(S=strict_types=on) |
| @ | 作業ルート | @(/work) |
lang=ts,rt=node,test=vi,o.kind=single,style=Sが既定。- 真偽値は
1/0。 @, l, cの設定は次のコマンドに継承される。
- 言語:
ts,js,py,go,rs,rb,sh,kt,cs - ランタイム:
node,deno,bun,py39,wasm - テスト:
vi(Vitest),je(Jest),pt(PyTest),go(gotest) - 目的:
b(build),fx(fix),rf(refactor),dc(doc),bn(bench) - 出力形式:
s(single),z(zip),d(dir),p(patch) - アルゴリズム:
dp,gr,bs,bt,df,bf,2p,fft,simd
@(/ws); l(ts,deno); g(sum_ints); c(strict=1);
+(src/sum.ts,desc=fn_sum(a:int,b:int)->int);
u(in=[2,3],out=5); r(pnpm_test); f($1); o(s,sum.ts)
@(/api); l(ts,node); d(npm=[express,zod]);
g(http_add); c(sec=1,perf=P95<30ms);
+(src/handler.ts,desc=POST_/add:zod(a:int,b:int)->{"sum":int},int=je)
l(ts,node); ~(src/a.ts,fix=types); r(pnpm_build); f($log)
l(py,py39); g(lis); p(dp); c(mem<256MB,time<1s);
+(main.py,desc=solve_LIS_from_stdin,int=pt);
u(in="5\n1 4 2 3 5\n",out="4\n"); r(pytest); f($e); o(s,main.py)
CPLは以下の特徴でトークン消費を最小化します。
- 1字オペコード
- 空白を使わず
_で置換 - 規定値の徹底利用
- 直前参照
$nと設定継承で冗長さ排除
これにより、人間の自然文プロンプトよりも極端にコンパクトにAgentへの指示を符号化できます。