Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
0d15382
📦 new: add update checker functionality and context injection
warengonzaga Feb 18, 2026
ec863b1
📦 new: implement update checker with caching and runtime detection
warengonzaga Feb 18, 2026
054b7c8
🧪 test: add comprehensive tests for update checker module
warengonzaga Feb 18, 2026
59c79d9
📦 new: add updateContext to AgentContext for software updates
warengonzaga Feb 18, 2026
c0a9883
📦 new: add software update check and context to start command
warengonzaga Feb 18, 2026
9398d21
📦 new: update package versions to 1.0.1 across all packages
warengonzaga Feb 18, 2026
4e31c8a
⚙️ setup: update CI workflows for release process and permissions
warengonzaga Feb 18, 2026
1cd2fca
🔧 update: enhance version parsing in isNewerVersion function
warengonzaga Feb 18, 2026
3f91a71
📦 new: add build step for all packages in CI workflow
warengonzaga Feb 18, 2026
080224e
⚙️ setup (ci): update package-build-flow-action to v2.0.1
warengonzaga Feb 19, 2026
6e46e61
⚙️ setup: enforce clean commit convention with husky and ci
warengonzaga Feb 19, 2026
57d3d0f
⚙️ setup (husky): add clean commit validation hook
warengonzaga Feb 19, 2026
d71d865
⚙️ setup (ci): fix security, guards, and validation issues
warengonzaga Feb 19, 2026
0407858
⚙️ setup (ci): remove redundant permissions from reusable workflow calls
warengonzaga Feb 19, 2026
a240bb6
🔧 update (ci): handle initial push and improve update-checker test
warengonzaga Feb 19, 2026
283a069
📦 new (landing): add landing page with svelte and tailwindcss
warengonzaga Feb 19, 2026
cbe57e2
⚙️ setup (ci): add deploy workflow for landing page
warengonzaga Feb 19, 2026
01135d6
⚙️ setup (landing): add build:landing script and update lockfile
warengonzaga Feb 19, 2026
af268be
⚙️ setup (husky): add error handling and allow revert commits
warengonzaga Feb 19, 2026
cf70b85
🔒 security (update-checker): sanitize version and url for prompt inje…
warengonzaga Feb 19, 2026
7094636
🧪 test (update-checker): add sanitizeForPrompt tests and improve mocking
warengonzaga Feb 19, 2026
858ff22
⚙️ setup (ci): pin action shas and scope deploy permissions
warengonzaga Feb 19, 2026
a5c1305
🔒 security (core): harden update checker cache and fetch logic
warengonzaga Feb 19, 2026
ea45a35
📦 new (landing): extract GitHubIcon component and improve accessibility
warengonzaga Feb 19, 2026
c142513
🔧 update (landing): improve scrollbar styling and Firefox support
warengonzaga Feb 19, 2026
302f44b
🔧 update (landing): clarify QuickStart step 3 description
warengonzaga Feb 19, 2026
99c228a
⚙️ setup (ci): streamline CI workflows by removing unused jobs
warengonzaga Feb 19, 2026
bab10e0
🗑️ remove: delete pre-commit script for bun test
warengonzaga Feb 19, 2026
3004a38
🔧 update (ci): add build step for workspace packages
warengonzaga Feb 19, 2026
67f0a76
🔧 update (dockerfile): upgrade bun version for builder and production…
warengonzaga Feb 19, 2026
8dc6789
🚀 release: bump version to 1.1.0 for all packages
warengonzaga Feb 19, 2026
4422bf3
🔧 update (dockerfile): remove frozen-lockfile option from bun install
warengonzaga Feb 19, 2026
958e520
📦 new: add dev:landing script for development of landing page
warengonzaga Feb 19, 2026
61699d8
📖 docs: update README with model names and licensing information
warengonzaga Feb 19, 2026
6e3e0bd
⚙️ setup: update release action to v1.2.1 and change token secret
warengonzaga Feb 20, 2026
8bb8382
📖 docs: update commit message guidelines for breaking changes
warengonzaga Feb 20, 2026
7c8f470
🔧 update: enhance commit message validation for breaking changes
warengonzaga Feb 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/instructions/copilot.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ Reference: https://github.com/wgtechlabs/clean-commit
```text
<emoji> <type>: <description>
<emoji> <type> (<scope>): <description>
<emoji> <type>!: <description>
<emoji> <type>! (<scope>): <description>
```

## The 9 Types
Expand All @@ -32,6 +34,7 @@ Reference: https://github.com/wgtechlabs/clean-commit
## Rules

- Use lowercase for type
- Use `!` immediately after type (no space) to signal a breaking change — only for `new`, `update`, `remove`, `security`
- Use present tense ("add" not "added")
- No period at the end
- Keep description under 72 characters
Expand All @@ -47,3 +50,5 @@ Reference: https://github.com/wgtechlabs/clean-commit
- `🧪 test: add unit tests for auth service`
- `📖 docs: update installation instructions`
- `🚀 release: version 1.0.0`
- `📦 new!: completely redesign authentication system`
- `🔧 update! (api): change response format for all endpoints`
61 changes: 61 additions & 0 deletions .github/workflows/commit-lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: Commit Lint

on:
pull_request:
branches: [main, dev]
push:
branches: [main, dev]

permissions:
contents: read
pull-requests: write

jobs:
lint-commits:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Validate commit messages
run: |
# Clean Commit convention pattern
# Format: <emoji> <type>[(<scope>)]: <description>
PATTERN='^(📦|🔧|🗑️|🔒|⚙️|☕|🧪|📖|🚀) (new|update|remove|security|setup|chore|test|docs|release)( \([a-z0-9][a-z0-9-]*\))?: .{1,72}$'

if [ "${{ github.event_name }}" = "pull_request" ]; then
COMMITS=$(git log --format="%s" "${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }}")
else
GITHUB_EVENT_BEFORE="${{ github.event.before }}"
GITHUB_EVENT_AFTER="${{ github.event.after }}"
if [ "$GITHUB_EVENT_BEFORE" = "0000000000000000000000000000000000000000" ]; then
# Initial push has no valid "before" SHA, so capture all reachable commits
COMMITS=$(git log --format="%s" "$GITHUB_EVENT_AFTER")
else
COMMITS=$(git log --format="%s" "${GITHUB_EVENT_BEFORE}..${GITHUB_EVENT_AFTER}")
fi
fi

FAILED=0
while IFS= read -r msg; do
[ -z "$msg" ] && continue
# Allow merge commits
if echo "$msg" | grep -qE "^Merge "; then
continue
fi
if ! echo "$msg" | grep -qP "$PATTERN"; then
echo "✖ Invalid commit message: $msg"
FAILED=1
else
echo "✔ Valid commit message: $msg"
fi
done <<< "$COMMITS"

if [ "$FAILED" -eq 1 ]; then
echo ""
echo "One or more commit messages do not follow the Clean Commit convention."
echo "Format: <emoji> <type>[(<scope>)]: <description>"
echo "Reference: https://github.com/wgtechlabs/clean-commit"
exit 1
fi
6 changes: 6 additions & 0 deletions .github/workflows/container.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
name: Container Build

on:
pull_request:
branches: [main, dev]
push:
branches: [main, dev]
workflow_call:
workflow_dispatch:
release:
types: [published]

permissions:
contents: read
Expand Down
50 changes: 50 additions & 0 deletions .github/workflows/landing.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: Deploy Landing Page

on:
push:
branches: [main]
paths:
- 'src/landing/**'
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-pages
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- uses: oven-sh/setup-bun@3d267786b128fe76c2f16a390aa2448b815359f3 # v2
with:
bun-version: 1.2.x

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Build landing page
run: bun run --cwd src/landing build

- name: Upload artifact
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
with:
path: src/landing/dist

deploy:
needs: build
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
11 changes: 10 additions & 1 deletion .github/workflows/package.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
name: Package Build

on:
pull_request:
branches: [main, dev]
push:
branches: [main, dev]
workflow_call:
workflow_dispatch:
inputs:
dry-run:
description: 'Perform dry run without publishing'
type: boolean
default: true
release:
types: [published]

permissions:
contents: read
Expand All @@ -31,8 +37,11 @@ jobs:
- name: Install dependencies
run: bun install --frozen-lockfile

- name: Build workspace packages
run: bun run build:packages

- name: Build & Publish Packages
uses: wgtechlabs/package-build-flow-action@v2.0.0
uses: wgtechlabs/package-build-flow-action@v2.0.1
with:
monorepo: 'true'
workspace-detection: 'true'
Expand Down
20 changes: 3 additions & 17 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ on:

permissions:
contents: write
packages: write
security-events: write
pull-requests: write

jobs:
Expand Down Expand Up @@ -42,20 +40,8 @@ jobs:
echo "changed=false" >> $GITHUB_OUTPUT
fi

package:
needs: check-version
if: needs.check-version.outputs.changed == 'true'
uses: ./.github/workflows/package.yml
secrets: inherit

container:
needs: check-version
if: needs.check-version.outputs.changed == 'true'
uses: ./.github/workflows/container.yml
secrets: inherit

release:
needs: [check-version, package, container]
needs: check-version
if: needs.check-version.outputs.changed == 'true'
runs-on: ubuntu-latest
steps:
Expand All @@ -64,9 +50,9 @@ jobs:
fetch-depth: 0

- name: Create Release
uses: wgtechlabs/release-build-flow-action@032b32cb5f6933e5912768c5b2e42c29389c2c95 # v1.0.0
uses: wgtechlabs/release-build-flow-action@799974c8dec094fbe94a92b2764365d3a8f9ce5f # v1.2.1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
github-token: ${{ secrets.GH_PAT }}
monorepo: 'true'
workspace-detection: 'true'
package-manager: 'bun'
Expand Down
3 changes: 3 additions & 0 deletions .husky/commit-msg
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh

bun "$(dirname "$0")/validate-commit-msg.mjs" "$1"
Empty file added .husky/pre-commit
Empty file.
69 changes: 69 additions & 0 deletions .husky/validate-commit-msg.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { readFileSync } from "fs";

const msgFile = process.argv[2];
if (!msgFile) {
console.error("Error: No commit message file path provided.");
process.exit(1);
}
let raw;
try {
raw = readFileSync(msgFile, "utf8");
} catch (err) {
console.error(
`Error: Could not read commit message file "${msgFile}": ${err.message}`,
);
process.exit(1);
}
const firstLine = raw.replace(/\r/g, "").split("\n")[0].trim();

// Allow merge and revert commits
if (/^Merge /.test(firstLine) || /^Revert /.test(firstLine)) process.exit(0);

// Clean Commit convention pattern
// Format: <emoji> <type>[!][(<scope>)]: <description>
const pattern =
/^(📦|🔧|🗑\uFE0F?|🔒|⚙\uFE0F?|☕|🧪|📖|🚀) (new|update|remove|security|setup|chore|test|docs|release)(!?)( \([a-z0-9][a-z0-9-]*\))?: .{1,72}$/u;

// Only new, update, remove, security may use the breaking change marker
const breakingMatch = firstLine.match(pattern);
if (breakingMatch) {
const type = breakingMatch[2];
const bang = breakingMatch[3];
if (bang === '!' && !['new', 'update', 'remove', 'security'].includes(type)) {
console.error('');
console.error('✖ Breaking change marker (!) is only allowed for: new, update, remove, security');
console.error('');
process.exit(1);
}
}

if (!pattern.test(firstLine)) {
console.error("");
console.error("✖ Invalid commit message format.");
console.error("");
console.error(" Expected: <emoji> <type>[!][(<scope>)]: <description>");
console.error("");
console.error(" Use ! after type for breaking changes (new, update, remove, security only)");
console.error("");
console.error(" Types and emojis:");
console.error(" 📦 new – new features, files, or capabilities");
console.error(" 🔧 update – changes, refactoring, improvements");
console.error(" 🗑️ remove – removing code, files, or dependencies");
console.error(" 🔒 security – security fixes or patches");
console.error(" ⚙️ setup – configs, CI/CD, tooling, build systems");
console.error(" ☕ chore – maintenance, dependency updates");
console.error(" 🧪 test – adding or updating tests");
console.error(" 📖 docs – documentation changes");
console.error(" 🚀 release – version releases");
console.error("");
console.error(" Examples:");
console.error(" 📦 new: user authentication system");
console.error(" 🔧 update (api): improve error handling");
console.error(" ⚙️ setup (ci): configure github actions workflow");
console.error(" 📦 new!: completely redesign authentication system");
console.error(" 🔧 update! (api): change response format for all endpoints");
console.error("");
console.error(" Reference: https://github.com/wgtechlabs/clean-commit");
console.error("");
process.exit(1);
}
5 changes: 5 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ Reference: https://github.com/wgtechlabs/clean-commit
```text
<emoji> <type>: <description>
<emoji> <type> (<scope>): <description>
<emoji> <type>!: <description>
<emoji> <type>! (<scope>): <description>
```

## The 9 Types
Expand All @@ -28,6 +30,7 @@ Reference: https://github.com/wgtechlabs/clean-commit
## Rules

- Use lowercase for type
- Use `!` immediately after type (no space) to signal a breaking change — only for `new`, `update`, `remove`, `security`
- Use present tense ("add" not "added")
- No period at the end
- Keep description under 72 characters
Expand All @@ -43,3 +46,5 @@ Reference: https://github.com/wgtechlabs/clean-commit
- `🧪 test: add unit tests for auth service`
- `📖 docs: update installation instructions`
- `🚀 release: version 1.0.0`
- `📦 new!: completely redesign authentication system`
- `🔧 update! (api): change response format for all endpoints`
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# ── Stage 1: Install + Build ────────────────────────────────────────
FROM oven/bun:1 AS builder
FROM oven/bun:1.3.9 AS builder

WORKDIR /app

Expand Down Expand Up @@ -31,7 +31,7 @@ COPY plugins/channel/plugin-channel-friends/package.json ./plugins/channel/plugi
COPY plugins/provider/plugin-provider-openai/package.json ./plugins/provider/plugin-provider-openai/

# Install all deps (dev included — needed to build)
RUN bun install --frozen-lockfile
RUN bun install

# Copy source
COPY . .
Expand All @@ -40,7 +40,7 @@ COPY . .
RUN bun run build

# ── Stage 2: Production ─────────────────────────────────────────────
FROM oven/bun:1-slim AS production
FROM oven/bun:1.3.9-slim AS production

WORKDIR /app

Expand Down
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ Tiny Claw is inspired by personal AI companions from science fiction like **Cods
- **Self-configuring.** No manual config files. The agent configures itself through conversation.
- **Own personality.** Ships with a personality (Heartware system) that's uniquely its own.
- **Native, not wrapped.** Every component is built from scratch with zero dependency on external AI frameworks.
- **Easy to start.** Uses Ollama Cloud with two built-in models — kimi-k2.5 (default) and gpt-oss:120b. Choose your model during setup and switch anytime via conversation.
- **Easy to start.** Uses Ollama Cloud with two built-in models — kimi-k2.5:cloud (default) and gpt-oss:120b-cloud. Choose your model during setup and switch anytime via conversation.
- **Cost-conscious.** Smart routing tiers queries across your installed providers. Cheap models handle simple stuff, powerful models only fire when needed.

## ✨ Features
Expand Down Expand Up @@ -120,6 +120,7 @@ tinyclaw/
router/ Smart provider routing (8-dim classifier)
learning/ Behavioral pattern detection
sandbox/ Bun Worker code execution
shell/ Controlled shell execution with permission engine
shield/ Runtime SHIELD.md enforcement + anti-malware
pulse/ Cron-like proactive scheduler
queue/ Per-session message locking queue
Expand All @@ -129,11 +130,11 @@ tinyclaw/
secrets/ Encrypted secrets management (AES-256-GCM)
plugins/ Plugin discovery and loading
plugins/ Plugin packages (keep the core tiny)
channel/ Messaging integrations (Discord, etc.)
channel/ Messaging integrations (Discord, Friends, etc.)
provider/ LLM providers (OpenAI, etc.)
tool/ Additional agent tools
src/
cli/ CLI entry point
landing/ Official landing page (Svelte + Vite)
web/ Web UI (Svelte 5, Discord-like experience)
```

Expand All @@ -157,7 +158,7 @@ Read the project's [code of conduct](https://github.com/warengonzaga/tinyclaw/bl

## 📃 License

This project is licensed under [MIT License](https://opensource.org/license/MIT).
This project is licensed under [GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.html).

## 🙏 Credits

Expand Down
Loading
Loading