dev-log
npx skills add https://github.com/dimple-smile/agent-skills --skill dev-log
Agent 安装分布
Skill 文档
Dev Log
å°å端代ç ç console.log è¾åºéè¿ HTTP æ¥å£å®æ¶åéï¼è®© AI è½å¤èªå¨è·åè¿è¡æ¶æ¥å¿ï¼æ éç¨æ·æå¨å¤å¶æ§å¶å°å 容ã
æ ¸å¿çå¿µï¼ å¤§å¤æ° console.log 齿¯ä¸ºäºè®© AI æ¥çç»æï¼å æ¤åºè¯¥é»è®¤ä½¿ç¨ dev-log æ¹å¼ï¼é¤éæ¯é常ç®åç临æ¶è°è¯ã
When to Use
AI åºè¯¥ä¸»å¨å¤æå¹¶ä½¿ç¨æ¤æè½çæ åµï¼
- çæåç«¯ä»£ç æ¶ – 妿çæç代ç å¯è½éè¦è°è¯/éªè¯ï¼é»è®¤ä½¿ç¨ dev-log æ¶éæ¥å¿
- ç¨æ·è¯´”帮æè°è¯”ã”æé®é¢”ã”çç为ä»ä¹” – éè¦æ¥çè¿è¡æ¶ç¶ææ¶
- éè¦è¿½è¸ªå¼æ¥æµç¨ – fetchãPromiseãasync/await çæ§è¡è¿ç¨
- éè¦éªè¯é»è¾ – 表åéªè¯ãç¶ææ´æ°ãæ¡ä»¶å¤æç
- éè¦æ¥çåéå¼ – ç¹å«æ¯å¨æçææç¨æ·è¾å ¥çå¼
- ç¨æ·è¯´”æä½å®æäº”ã”ä½ ç且ã”好五 – æç¤ºç¨æ·å·²å®ææä½ï¼AI åºè¯¥è¯»åæ¥å¿
ä¸éè¦ä½¿ç¨çæ åµï¼
- 纯éæå 容çæï¼å¦ HTML 模æ¿ï¼
- é常ç®åç䏿¬¡æ§éªè¯
- ç¨æ·æç¡®è¡¨ç¤ºä¸éè¦è°è¯
- 代ç å®å ¨æ¯å端çï¼Node.js æå¡ç«¯ï¼
Examples
Example 1: 主å¨å¯ç¨ – AI 夿éè¦è°è¯
User: åä¸ä¸ª React 计æ°å¨ç»ä»¶
Agent: ææ¥å建ä¸ä¸ªè®¡æ°å¨ç»ä»¶ï¼å¹¶æ·»å æ¥å¿ä»¥ä¾¿éªè¯åè½æ£å¸¸ã
[å¯å¨ dev-log æå¡ï¼çæ sessionId: sess_8x7k2p]
```jsx
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
fetch('http://localhost:54321',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'sess_8x7k2p',time:new Date().toTimeString().split(' ')[0],type:'before-increment',data:{count}})}).catch(()=>{});
setCount(c => c + 1);
};
return <button onClick={increment}>Count: {count}</button>;
}
请ç¹å»æé®å 次ï¼ç¶ååè¯æç»æã
User: ç¹äº3次
Agent: [è¯»åæ¥å¿] 仿¥å¿çå°ï¼
- count ä» 0 â 1 â 2 â 3
- æ¯æ¬¡ increment 齿£ç¡®æ§è¡
计æ°å¨å·¥ä½æ£å¸¸ï¼
### Example 2: è¿½è¸ªå¼æ¥è¯·æ±
```markdown
User: è¿ä¸ªå¼æ¥å½æ°ææ¶åä¼å¤±è´¥ï¼å¸®æçç
Agent: [uses dev-log skill] å¯å¨æ¥å¿æå¡...
```javascript
async function fetchData(userId) {
fetch('http://localhost:54321',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'sess_a1b2c3',time:new Date().toTimeString().split(' ')[0],type:'fetch-start',data:{userId}})}).catch(()=>{});
try {
const response = await fetch(`/api/users/${userId}`);
fetch('http://localhost:54321',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'sess_a1b2c3',time:new Date().toTimeString().split(' ')[0],type:'fetch-response',data:{status:response.status,ok:response.ok}})}).catch(()=>{});
if (!response.ok) {
fetch('http://localhost:54321',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'sess_a1b2c3',time:new Date().toTimeString().split(' ')[0],type:'fetch-error',data:{status:response.status}})}).catch(()=>{});
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();
fetch('http://localhost:54321',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'sess_a1b2c3',time:new Date().toTimeString().split(' ')[0],type:'fetch-success',data:{hasData:!!data}})}).catch(()=>{});
return data;
} catch (error) {
fetch('http://localhost:54321',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'sess_a1b2c3',time:new Date().toTimeString().split(' ')[0],type:'catch-error',data:{message:error.message}})}).catch(()=>{});
throw error;
}
}
æä½ä¸ä¸ï¼åè¯æç»æã
User: è¿æ¯å¤±è´¥
Agent: [è¯»åæ¥å¿] æ¥å¿æ¾ç¤ºï¼
- fetch-start â
- fetch-response {status: 404, ok: false}
- fetch-error
é®é¢æ¯è¿å 404ï¼è¯´æ API ç«¯ç¹ /api/users/${userId} ä¸åå¨ãéè¦æ£æ¥å端路ç±é
ç½®…
### Example 3: 表åéªè¯è¿½è¸ª
```markdown
User: åä¸ä¸ªç»å½è¡¨åçéªè¯é»è¾
Agent: [å¯å¨ dev-logï¼çæ sessionId: sess_valid9]
```javascript
function validateLoginForm(form) {
const email = form.email.value;
const password = form.password.value;
fetch('http://localhost:54321',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'sess_valid9',time:new Date().toTimeString().split(' ')[0],type:'validate-input',data:{field:'email',value:email}})}).catch(()=>{});
const errors = {};
if (!email) {
errors.email = 'é®ç®±ä¸è½ä¸ºç©º';
}
fetch('http://localhost:54321',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'sess_valid9',time:new Date().toTimeString().split(' ')[0],type:'validate-result',data:{field:'email',valid:!!email}})}).catch(()=>{});
// ... æ´å¤éªè¯
fetch('http://localhost:54321',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'sess_valid9',time:new Date().toTimeString().split(' ')[0],type:'final-result',data:{errorCount:Object.keys(errors).length}})}).catch(()=>{});
return { valid: Object.keys(errors).length === 0, errors };
}
æµè¯ååè¯æç»æï¼æä¼æ ¹æ®æ¥å¿å¤æéªè¯é»è¾æ¯å¦æ£ç¡®ã
## Implementation
### æå¡å¯å¨
**å¯å¨å½ä»¤ï¼**
```bash
cd skills/dev-log && ./start.sh
å¯å¨èæ¬ä¼èªå¨ï¼
- æ£æ¥ç°ææå¡ç¶æï¼è¯»å
port.txtå¹¶æµè¯è¿æ¥ï¼ - 妿æå¡æ£å¸¸è¿è¡ï¼åå¤ç¨ç°ææå¡
- 妿æå¡å¼å¸¸æä¸åå¨ï¼åå¯å¨æ°æå¡
- æå¡å¯å¨åä¼è®°å½ç«¯å£å°
port.txtï¼è¿ç¨ ID å°pid.txt
æä»¶ç»æï¼
./skills/dev-log/
âââ start.sh # å¯å¨èæ¬ï¼æ£æ¥/å¯å¨æå¡ï¼
âââ read-log.sh # è¯»åæ¥å¿èæ¬ï¼æ¯æè¿æ»¤ï¼
âââ server.js # HTTP æå¡å¨ï¼ESM 模åï¼
âââ pid.txt # æå¡è¿ç¨ ID
âââ port.txt # æå¡ç«¯å£
âââ dev-logs.json # æ¥å¿æä»¶ï¼JSON æ ¼å¼ï¼
æ¥å¿è¯»å
è¯»åæææ¥å¿ï¼
./skills/dev-log/read-log.sh
æ sessionId è¿æ»¤æ¥å¿ï¼
./skills/dev-log/read-log.sh "$SESSION_ID"
代ç çææ¨¡æ¿
æ å fetch è¯·æ±æ¨¡æ¿ï¼
fetch('http://localhost:PORT',{
method:'POST',
headers:{'Content-Type':'application/json'},
body:JSON.stringify({
sessionId:'SESSION_ID',
time:'TIME',
type:'TYPE',
data:DATA
})
}).catch(()=>{})
åè¡ç®åçæ¬ï¼
fetch('http://localhost:PORT',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'SID',time:'TIME',type:'TYPE',data:DATA})}).catch(()=>{})
模æ¿åé说æï¼
PORT: ä»skills/dev-log/port.txt读åç端å£å·SESSION_ID: AI çæçä¼è¯ IDï¼æ ¼å¼ï¼sess_+ 8ä½éæºå符ï¼TIME: æ¶é´æ³ï¼å¦14:23:05ænew Date().toTimeString().split(' ')[0]ï¼TYPE: æ¥å¿ç±»åï¼å»ºè®®ï¼state/error/validation/request/response/fetch-startçï¼DATA: è¦è®°å½çä»»ææ°æ®å¯¹è±¡
宿´ä½¿ç¨æµç¨
- AI 夿éè¦è°è¯ â èªå¨å¯å¨ dev-log æè½
- æ£æ¥/å¯å¨æå¡ â æµè¯ç°ææå¡æå¯å¨æ°æå¡
- çæ sessionId â å¨å
åä¸è®°ä½ï¼æ ¼å¼
sess_xxxxxxxx - æ¸ ç©ºæ¥å¿ â æ°ä¸è½®è°è¯å¼å§æ¶
- 读å端å£å· â ä»
port.txtè·å - çæå¸¦æ¥å¿ç代ç â å¨å ³é®ä½ç½®æå ¥ fetch è¯å¥
- æç¤ºç¨æ·æä½ ⠓请æä½ä¸ä¸ï¼ç¶ååè¯æç»æ”
- ç¨æ·åç¥å®æ â “å¥½äº”ã”æä½å®æäº”
- 读åå¹¶åææ¥å¿ â æ sessionId è¿æ»¤ï¼åæç»æ
å¤ä¼è¯é离
- æ¯ä¸ª AI ä¼è¯æç¬ç«ç sessionIdï¼å åä¸ï¼
- æ¥å¿é½åå
¥åä¸ä¸ª
dev-logs.json - AI è¯»åæ¥å¿æ¶ç¨èªå·±ç sessionId è¿æ»¤
- æ ¼å¼ï¼
{"sessionId":"sess_abc123","time":"14:23:05","type":"state","data":{...}}
注æäºé¡¹
- é»è®¤ä½¿ç¨ – çæåç«¯ä»£ç æ¶é»è®¤èèä½¿ç¨ dev-logï¼é¤éé常ç®å
- æ¸ çæ¶æº – æ°ä¸è½®è°è¯å¼å§æ¶æ¸ 空æ¥å¿
- ç产ç¯å¢ – å¡å¿ ç§»é¤è°è¯ä»£ç
- é误å¤ç – fetch å¿
é¡»å
.catch(()=>{})é¿å é»å¡ä¸»é»è¾ - åè¡æå ¥ – æ¥å¿ä»£ç å¨ç¨æ·ä»£ç çä¸ä¸è¡æå ¥ï¼ä¿æå代ç ç»æ
- æ¬å°å¼å – ä» ç¨äºæ¬å°å¼åï¼ä¸è¦æ´é²å°å ¬ç½