Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@ All notable changes to this project are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
[Semantic Versioning](https://semver.org/).

## [0.2.2] - 2026-11-06

Documentation only; no change to the code or to what the recipes do.

### Changed
- README follows the layout shared by the author's other open-source projects: a centred header with a project logo
(`brand/logo.svg`, rendered to PNG by `brand/jana-aset.py`), a Bahasa Melayu summary after the English text, and
absolute links and image URLs so the page also renders on PyPI.

## [0.2.1] - 2026-10-22

No change to what the recipes do; this release makes the package easier to trust and to install.
Expand Down Expand Up @@ -78,6 +87,7 @@ First version: one framework replacing four separate tools
### Removed
- apiforge's web dashboard and the illustrative token "stats"/daily estimates.

[0.2.2]: https://github.com/aimanmalib/crewforge/compare/v0.2.1...v0.2.2
[0.2.1]: https://github.com/aimanmalib/crewforge/compare/v0.2.0...v0.2.1
[0.2.0]: https://github.com/aimanmalib/crewforge/compare/v0.1.0...v0.2.0
[0.1.0]: https://github.com/aimanmalib/crewforge/releases/tag/v0.1.0
2 changes: 1 addition & 1 deletion CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ type: software
authors:
- given-names: Muhammad
family-names: Aiman
version: 0.2.1
version: 0.2.2
license: MIT
repository-code: "https://github.com/aimanmalib/crewforge"
abstract: >-
Expand Down
62 changes: 51 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
# crewforge
<p align="center"><img src="https://raw.githubusercontent.com/aimanmalib/crewforge/main/brand/logo-512.png" width="112" height="112" alt="crewforge"></p>

**One crew of LLM agents, five recipes: code review, document Q&A, API scaffolding, content and honest academic-writing help. It works with any OpenAI-compatible provider and fails loudly instead of pretending.**
<h1 align="center">crewforge</h1>

[![CI](https://github.com/aimanmalib/crewforge/actions/workflows/ci.yml/badge.svg)](https://github.com/aimanmalib/crewforge/actions/workflows/ci.yml)
[![PyPI](https://img.shields.io/pypi/v/crewforge)](https://pypi.org/project/crewforge/)
[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/aimanmalib/crewforge/badge)](https://scorecard.dev/viewer/?uri=github.com/aimanmalib/crewforge)
![Python 3.10–3.14](https://img.shields.io/badge/python-3.10%E2%80%933.14-blue)
![License: MIT](https://img.shields.io/badge/license-MIT-green)
<p align="center"><a href="https://github.com/aimanmalib/crewforge/actions/workflows/ci.yml"><img src="https://github.com/aimanmalib/crewforge/actions/workflows/ci.yml/badge.svg" alt="CI"></a> <a href="https://pypi.org/project/crewforge/"><img src="https://img.shields.io/pypi/v/crewforge" alt="PyPI"></a> <a href="https://scorecard.dev/viewer/?uri=github.com/aimanmalib/crewforge"><img src="https://api.scorecard.dev/projects/github.com/aimanmalib/crewforge/badge" alt="OpenSSF Scorecard"></a> <img src="https://img.shields.io/badge/python-3.10%E2%80%933.14-blue" alt="Python 3.10–3.14"> <a href="https://github.com/aimanmalib/crewforge/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="License: MIT"></a></p>

<p align="center"><b>One crew of LLM agents, five recipes, any OpenAI-compatible provider.</b> · <i>Satu kru ejen LLM, lima resipi, mana-mana penyedia serasi OpenAI.</i><br>
<a href="https://pypi.org/project/crewforge/">PyPI</a> · <a href="https://github.com/aimanmalib/crewforge/blob/main/CHANGELOG.md">changelog</a> · <a href="https://github.com/aimanmalib/crewforge/blob/main/docs/porting.md">porting notes</a> · Built in Malaysia by <a href="https://aimanmalib.com">Aiman Malib</a></p>

crewforge is a command-line tool and Python library that runs a crew of LLM agents through five recipes: code
review, document Q&A, API scaffolding, content writing and honest academic-writing help. It works with any
OpenAI-compatible provider, reads API keys only from the environment, and fails loudly instead of pretending: a run
in which an agent produced nothing exits with code 1 and names that agent.

[Bahasa Melayu ↓](#bahasa-melayu)

```bash
crewforge review src/ # six reviewers + a summary
Expand Down Expand Up @@ -377,13 +383,47 @@ Please report vulnerabilities privately through
See [SECURITY.md](https://github.com/aimanmalib/crewforge/blob/main/SECURITY.md) for scope notes (what is sent to your provider,
and what `validate` executes).

## License
## Bahasa Melayu

crewforge ialah alat baris arahan dan pustaka Python yang menjalankan satu kru ejen LLM melalui lima resipi:
semakan kod (`review`), soal jawab dokumen (`ask`, `summarize`), penjanaan projek API FastAPI (`scaffold`,
`validate`), penulisan kandungan (`write`) dan bantuan penulisan akademik yang jujur (`academic`). Ia berfungsi
dengan mana-mana penyedia serasi OpenAI, termasuk model tempatan melalui Ollama atau llama.cpp. Kunci API hanya
dibaca dari pemboleh ubah persekitaran, tidak pernah ditulis ke fail.

**Mengapa satu kru.** crewforge menggabungkan empat alat lama (codeguard, documind, apiforge, contentforge) yang
masing-masing menyimpan salinan sendiri bagi rangka yang sama. Salinan itu sudah berbeza dan setiap satu
menyembunyikan kegagalan dengan cara sendiri. Kini teras dikongsi: pembaikan dibuat sekali, dan setiap alat menjadi
resipi di atas teras itu.

**Gagal dengan jelas.** Larian yang ejennya memulangkan jawapan kosong atau tidak boleh dihurai, atau pengesah
yang tidak menyemak apa-apa, keluar dengan kod 1 dan menamakan ejen itu. Kod keluar: `0` berjaya, `1` larian
gagal, `2` ralat penggunaan atau konfigurasi. Bilangan token diambil daripada laporan penyedia sahaja, tidak
dianggar.

**Resipi `academic`.** Membantu pelajar dan penyelidik dengan kerja mereka **sendiri**: merancang dari taklimat
tugasan, memberi ulasan atas draf tanpa menulis semula, memformat rujukan yang diberi pengguna (APA 7, IEEE,
Harvard) tanpa menambah rujukan baharu, dan menulis pernyataan penggunaan AI daripada rekod langkah yang
dijalankan. Output dalam bahasa Inggeris atau Bahasa Melayu (`--language ms`); output BM disemak untuk bentuk
Indonesia seperti *karena* atau *kualitas*. Sumber yang dicadangkan model dilabel UNVERIFIED, atau LIKELY
FABRICATED jika tiada DOI, URL atau ISBN. Tiada ciri "humanise" atau mengelak pengesan AI.

**Pasang dan guna.**

```bash
pip install crewforge # Python 3.10 hingga 3.14
pip install "crewforge[docs,api]" # pilihan: PDF/DOCX dan semakan aplikasi FastAPI
export OPENAI_API_KEY=sk-... # atau penyedia lain, lihat `crewforge providers`
crewforge review src/
crewforge academic feedback draf.md --brief taklimat.md --language ms
```

[MIT](https://github.com/aimanmalib/crewforge/blob/main/LICENSE) © Muhammad Aiman
Senarai penyedia, contoh setiap resipi dan seni bina ada dalam bahagian bahasa Inggeris di atas
([Providers](https://github.com/aimanmalib/crewforge#providers), [Recipes](https://github.com/aimanmalib/crewforge#recipes)).

---
## Licence

Built by [Sasa Teguh](https://sasateguh.com) · Malaysia
[MIT](https://github.com/aimanmalib/crewforge/blob/main/LICENSE) © Muhammad Aiman. Made by [Aiman Malib](https://aimanmalib.com), Malaysia.

## Work with Sasa Teguh

Expand Down
24 changes: 24 additions & 0 deletions brand/jana-aset.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/usr/bin/env python3
"""Render brand/logo.svg to brand/logo-512.png and brand/logo-64.png with Chromium (Playwright).

uv run --with playwright==1.58.0 python3 brand/jana-aset.py

Same script as sasateguh/codr and sasateguh/mypii. The PNGs are committed because the README is also
shown on PyPI, and not every renderer there draws an SVG with gradients reliably.
"""

import os

from playwright.sync_api import sync_playwright

HERE = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(HERE, "logo.svg"), encoding="utf-8") as f:
svg = f.read()
with sync_playwright() as p:
b = p.chromium.launch()
for size in (512, 64):
pg = b.new_page(viewport={"width": size, "height": size}, device_scale_factor=1)
inner = svg.replace('width="256" height="256"', f'width="{size}" height="{size}"')
pg.set_content(f'<html><body style="margin:0;background:transparent">{inner}</body></html>')
pg.screenshot(path=os.path.join(HERE, f"logo-{size}.png"), omit_background=True)
b.close()
Binary file added brand/logo-512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added brand/logo-64.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
24 changes: 24 additions & 0 deletions brand/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "crewforge"
version = "0.2.1"
version = "0.2.2"
description = "One crew of LLM agents, five recipes: code review, document Q&A, API scaffolding, content and honest academic-writing help — on any OpenAI-compatible provider."
readme = "README.md"
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion src/crewforge/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""crewforge — one crew of LLM agents, five recipes, any OpenAI-compatible provider."""

__version__ = "0.2.1"
__version__ = "0.2.2"
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading