Auto-commit: 2026-05-10 12:34

This commit is contained in:
OpenClaw
2026-05-10 12:34:24 +00:00
parent a62e89ad99
commit aa10d148ec
37 changed files with 4699 additions and 52 deletions

View File

@@ -3,5 +3,5 @@
"registry": "https://clawhub.ai",
"slug": "agent-browser-clawdbot",
"installedVersion": "0.1.0",
"installedAt": 1775990867414
"installedAt": 1778353986431
}

View File

@@ -3,5 +3,5 @@
"registry": "https://clawhub.ai",
"slug": "agentmail",
"installedVersion": "1.1.1",
"installedAt": 1776003352600
"installedAt": 1778353987605
}

View File

@@ -0,0 +1,56 @@
---
name: gitea-issue-resolver
description: Resolve open Gitea issues by creating feature branches, implementing fixes, and committing. Use when checking or working on issues in Martin's Gitea repos (git.home.kies-media.de). Triggers on mentions of "issues", "Gitea issues", or when checking repos for open issues.
---
# Gitea Issue Resolver
## Authentication
Use git credentials from `~/.git-credentials` for API calls:
```bash
GIT_CREDS=$(grep git.home.kies-media.de ~/.git-credentials | head -1)
GIT_USER=$(echo "$GIT_CREDS" | sed -n 's|.*://\([^:]*\):.*|\1|p')
GIT_PASS=$(echo "$GIT_CREDS" | sed -n 's|.*://[^:]*:\([^@]*\)@.*|\1|p')
```
For API calls use `-u "$GIT_USER:$GIT_PASS"`. If Basic Auth fails, ask Martin for a Gitea API token.
## Workflow
### 1. Check for Open Issues
```bash
curl -s "https://git.home.kies-media.de/api/v1/repos/<owner>/<repo>/issues?state=open" \
-u "$GIT_USER:$GIT_PASS"
```
### 2. For Each Open Issue
1. **Create a feature branch** from `main`:
```bash
git checkout main && git pull
git checkout -b feature/issue-<number>-<short-description>
```
2. **Clone repo if needed** (work in a temp dir):
```bash
git clone https://git.home.kies-media.de/<owner>/<repo>.git /tmp/<repo>
```
3. **Implement the fix** read the issue body, understand the requirement, implement it.
4. **Commit and push**:
```bash
git add -A
git commit -m "Fix #<number>: <description>"
git push -u origin feature/issue-<number>-<short-description>
```
5. **Inform Martin** send a summary of what was done and that the branch is ready for review/merge.
### 3. Do NOT
- Do not merge the branch yourself
- Do not close the issue yourself
- Do not push to `main` directly

View File

@@ -2,6 +2,6 @@
"version": 1,
"registry": "https://clawhub.ai",
"slug": "self-improving-agent",
"installedVersion": "3.0.13",
"installedAt": 1775988613159
"installedVersion": "3.0.21",
"installedAt": 1778353984557
}

View File

@@ -0,0 +1,14 @@
# self-improvement
Self-improvement skill for OpenClaw. It captures learnings, errors, and feature requests to support continuous improvement across sessions.
## Attribution
Remade for OpenClaw from the original repo:
- https://github.com/pskoett/pskoett-ai-skills
- https://github.com/pskoett/pskoett-ai-skills/tree/main/skills/self-improvement
## Main File
- `SKILL.md`

View File

@@ -642,30 +642,3 @@ Ask in chat: "Should I log this as a learning?"
```
**Detection**: Manual review at session end
### OpenClaw
**Activation**: Workspace injection + inter-agent messaging
**Setup**: See "OpenClaw Setup" section above
**Detection**: Via session tools and workspace files
### Agent-Agnostic Guidance
Regardless of agent, apply self-improvement when you:
1. **Discover something non-obvious** - solution wasn't immediate
2. **Correct yourself** - initial approach was wrong
3. **Learn project conventions** - discovered undocumented patterns
4. **Hit unexpected errors** - especially if diagnosis was difficult
5. **Find better approaches** - improved on your original solution
### Copilot Chat Integration
For Copilot users, add this to your prompts when relevant:
> After completing this task, evaluate if any learnings should be logged to `.learnings/` using the self-improvement skill format.
Or use quick prompts:
- "Log this to learnings"
- "Create a skill from this solution"
- "Check .learnings/ for related issues"

View File

@@ -1,6 +1,6 @@
{
"ownerId": "kn70cjr952qdec1nx70zs6wefn7ynq2t",
"slug": "self-improving-agent",
"version": "3.0.13",
"publishedAt": 1775236036699
"version": "3.0.21",
"publishedAt": 1777649615088
}

View File

@@ -5,10 +5,20 @@
* Fires on agent:bootstrap event before workspace files are injected.
*/
const REMINDER_NAME = 'SELF_IMPROVEMENT_REMINDER.md';
const REMINDER_PATH = REMINDER_NAME;
const REMINDER_CONTENT = `
## Self-Improvement Reminder
After completing tasks, evaluate if any learnings should be captured:
After completing tasks, evaluate whether any learnings should be captured.
Only log if this repo or workspace is using the self-improvement skill.
Before logging:
- Create only missing \`.learnings/\` files; never overwrite existing content
- Do not log secrets, tokens, private keys, environment variables, or raw transcripts
- Prefer short summaries or redacted excerpts over full command output
**Log when:**
- User corrects you → \`.learnings/LEARNINGS.md\`
@@ -22,9 +32,24 @@ After completing tasks, evaluate if any learnings should be captured:
- Workflow improvements → \`AGENTS.md\`
- Tool gotchas → \`TOOLS.md\`
Keep entries simple: date, title, what happened, what to do differently.
Keep entries simple: date, title, what happened, and what to do differently.
`.trim();
function isObject(value) {
return !!value && typeof value === 'object';
}
function isInjectedReminderFile(value) {
if (!isObject(value) || value.path !== REMINDER_PATH) {
return false;
}
return (
value.virtual === true ||
value.content === REMINDER_CONTENT
);
}
const handler = async (event) => {
// Safety checks for event structure
if (!event || typeof event !== 'object') {
@@ -41,14 +66,45 @@ const handler = async (event) => {
return;
}
// Skip sub-agent sessions to avoid bootstrap issues
// Sub-agents have sessionKey patterns like "agent:main:subagent:..."
const sessionKey = event.sessionKey || '';
if (sessionKey.includes(':subagent:')) {
return;
}
// Inject the reminder as a virtual bootstrap file
// Check that bootstrapFiles is an array before pushing
if (Array.isArray(event.context.bootstrapFiles)) {
event.context.bootstrapFiles.push({
path: 'SELF_IMPROVEMENT_REMINDER.md',
const occupiedByOtherFile = event.context.bootstrapFiles.some(
(file) => isObject(file) && file.path === REMINDER_PATH && !isInjectedReminderFile(file),
);
if (occupiedByOtherFile) {
return;
}
const cleanedBootstrapFiles = event.context.bootstrapFiles.filter(
(file, index, files) =>
!isInjectedReminderFile(file) ||
files.findIndex((candidate) => isInjectedReminderFile(candidate)) === index,
);
const reminderFile = {
name: REMINDER_NAME,
path: REMINDER_PATH,
content: REMINDER_CONTENT,
missing: false,
virtual: true,
});
};
const existingIndex = cleanedBootstrapFiles.findIndex((file) => isInjectedReminderFile(file));
if (existingIndex === -1) {
cleanedBootstrapFiles.push(reminderFile);
} else {
cleanedBootstrapFiles[existingIndex] = reminderFile;
}
event.context.bootstrapFiles = cleanedBootstrapFiles;
}
};

View File

@@ -7,9 +7,19 @@
import type { HookHandler } from 'openclaw/hooks';
const REMINDER_NAME = 'SELF_IMPROVEMENT_REMINDER.md';
const REMINDER_PATH = REMINDER_NAME;
const REMINDER_CONTENT = `## Self-Improvement Reminder
After completing tasks, evaluate if any learnings should be captured:
After completing tasks, evaluate whether any learnings should be captured.
Only log if this repo or workspace is using the self-improvement skill.
Before logging:
- Create only missing \`.learnings/\` files; never overwrite existing content
- Do not log secrets, tokens, private keys, environment variables, or raw transcripts
- Prefer short summaries or redacted excerpts over full command output
**Log when:**
- User corrects you → \`.learnings/LEARNINGS.md\`
@@ -23,7 +33,22 @@ After completing tasks, evaluate if any learnings should be captured:
- Workflow improvements → \`AGENTS.md\`
- Tool gotchas → \`TOOLS.md\`
Keep entries simple: date, title, what happened, what to do differently.`;
Keep entries simple: date, title, what happened, and what to do differently.`;
function isObject(value: unknown): value is Record<string, unknown> {
return !!value && typeof value === 'object';
}
function isInjectedReminderFile(value: unknown): boolean {
if (!isObject(value) || value.path !== REMINDER_PATH) {
return false;
}
return (
value.virtual === true ||
value.content === REMINDER_CONTENT
);
}
const handler: HookHandler = async (event) => {
// Safety checks for event structure
@@ -51,11 +76,35 @@ const handler: HookHandler = async (event) => {
// Inject the reminder as a virtual bootstrap file
// Check that bootstrapFiles is an array before pushing
if (Array.isArray(event.context.bootstrapFiles)) {
event.context.bootstrapFiles.push({
path: 'SELF_IMPROVEMENT_REMINDER.md',
const occupiedByOtherFile = event.context.bootstrapFiles.some(
(file) => isObject(file) && file.path === REMINDER_PATH && !isInjectedReminderFile(file),
);
if (occupiedByOtherFile) {
return;
}
const cleanedBootstrapFiles = event.context.bootstrapFiles.filter(
(file, index, files) =>
!isInjectedReminderFile(file) ||
files.findIndex((candidate) => isInjectedReminderFile(candidate)) === index,
);
const reminderFile = {
name: REMINDER_NAME,
path: REMINDER_PATH,
content: REMINDER_CONTENT,
missing: false,
virtual: true,
});
};
const existingIndex = cleanedBootstrapFiles.findIndex((file) => isInjectedReminderFile(file));
if (existingIndex === -1) {
cleanedBootstrapFiles.push(reminderFile);
} else {
cleanedBootstrapFiles[existingIndex] = reminderFile;
}
event.context.bootstrapFiles = cleanedBootstrapFiles;
}
};

View File

@@ -172,15 +172,15 @@ Or update Dockerfile: `FROM --platform=linux/amd64 python:3.11-slim`
**Area**: backend
### Summary
Third-party payment API timeout during checkout
Third-party API timeout during request processing
### Error
```
TimeoutError: Request to payments.example.com timed out after 30000ms
TimeoutError: Request to api.example.com timed out after 30000ms
```
### Context
- Command: POST /api/checkout
- Command: POST /api/process
- Timeout set to 30s
- Occurs during peak hours (lunch, evening)
@@ -189,7 +189,7 @@ Implement retry with exponential backoff. Consider circuit breaker pattern.
### Metadata
- Reproducible: yes (during peak hours)
- Related Files: src/services/payment.ts
- Related Files: src/services/api-client.ts
- See Also: ERR-20250115-X1Y, ERR-20250118-Z3W
---