Skip to content

Commit 7508680

Browse files
committed
Add bbm channel: harga BBM Pertamina dari dataset terverifikasi
Pertalite/Biosolar (subsidi) + Pertamax/Green/Turbo/Dexlite (non-subsidi) dari raw bbm-predictor (berita penyesuaian resmi), bukan scraping SPBU. Shell/BP/Vivo tak disertakan: tak ada sumber publik legal, hanya scraping = di luar prinsip jangkau. 21 kanal, v0.2.3, 29/29 smoke.
1 parent 254f3a6 commit 7508680

8 files changed

Lines changed: 73 additions & 4 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
node --input-type=module -e "
3131
import { CHANNELS } from './src/channels/index.mjs';
3232
const names = Object.keys(CHANNELS);
33-
if (names.length < 20) { console.error('expected >=20 channels, got', names.length); process.exit(1); }
33+
if (names.length < 21) { console.error('expected >=21 channels, got', names.length); process.exit(1); }
3434
for (const [k, ch] of Object.entries(CHANNELS)) {
3535
for (const f of ['run','check']) if (typeof ch[f] !== 'function') { console.error(k,'missing',f); process.exit(1); }
3636
if (!ch.meta?.name || !ch.meta?.usage) { console.error(k,'bad meta'); process.exit(1); }

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,8 @@ Rilis awal: 9 kanal + self-learning backend router.
4545
- **Self-learning router**: tiap panggilan backend dicatat dengan hasilnya (`~/.jangkau/learn.jsonl`), urutan backend mengikuti tingkat sukses nyata di mesin pengguna (`~/.jangkau/memory.json`, epsilon 0.1).
4646
- `doctor` (health check live), `learn` (laporan router), `skill --install`.
4747
- Zero dependency, Node ≥18, MIT.
48+
49+
## [0.2.3] - 2026-07-04
50+
51+
### Ditambahkan
52+
- **`bbm`**: harga BBM Pertamina (Pertalite/Biosolar subsidi + Pertamax/Turbo/Dex non-subsidi), dari dataset terverifikasi bbm-predictor (berita penyesuaian resmi), bukan scraping situs SPBU. Shell/BP/Vivo sengaja tidak disertakan: tidak ada sumber data publik legal (hanya via scraping = di luar prinsip).

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Agent AI (Claude Code, Cursor, OpenClaw, apa pun yang bisa jalanin CLI) jago nul
1616
- 💱 "Kurs dolar sekarang?" / 📈 "BBCA berapa?" → tidak tahu sumber gratis yang legal
1717
- 📊 "Cari data inflasi resmi" → tidak tahu data.go.id dan BPS WebAPI itu ada
1818

19-
`jangkau` membereskan semuanya: **20 kanal data publik Indonesia** — sumber resmi (BMKG, RSS media, ECB, Portal Satu Data, BPS) atau open-data komunitas (kodewilayah, emsifa, sooluh) dan endpoint publik Yahoo Finance — semuanya legal, plain GET, output selalu JSON rapi yang enak dibaca agent. Tanpa scraping login, tanpa risiko ban akun, tanpa API berbayar.
19+
`jangkau` membereskan semuanya: **21 kanal data publik Indonesia** — sumber resmi (BMKG, RSS media, ECB, Portal Satu Data, BPS) atau open-data komunitas (kodewilayah, emsifa, sooluh) dan endpoint publik Yahoo Finance — semuanya legal, plain GET, output selalu JSON rapi yang enak dibaca agent. Tanpa scraping login, tanpa risiko ban akun, tanpa API berbayar.
2020

2121
## Instal (suruh agent kamu yang pasang)
2222

@@ -56,6 +56,7 @@ Butuh Node.js ≥ 18. Zero dependency — tidak ada `node_modules`.
5656
| 📚 Wiki | `jangkau wiki soekarno` | Ringkasan Wikipedia Bahasa Indonesia |
5757
| 🌊 Maritim | `jangkau maritim "selat sunda"` | Kondisi laut / gelombang untuk perairan Indonesia (Open-Meteo Marine) |
5858
| 🎵 Musik | `jangkau musik` / `musik album` / `musik podcast` | Top chart Indonesia (Apple Music) |
59+
| ⛽ BBM | `jangkau bbm` | Harga BBM Pertamina (subsidi + non-subsidi, data terverifikasi) |
5960
| 📊 Dataset | `jangkau data inflasi` | Portal Satu Data (data.go.id) |
6061
| 📉 Statistik | `jangkau bps inflasi` | BPS WebAPI (key gratis, 1 menit daftar) |
6162
| 📱 Sosial (1 URL) | `jangkau sosial <url>` | oEmbed resmi: TikTok + YouTube (tanpa key), IG + FB (perlu Meta app token) |

SKILL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Semua perintah mengembalikan JSON rapi. Semua sumber = API/feed publik legal (re
2828
| Wikipedia ID | `jangkau wiki <topik>` (ringkasan Bahasa Indonesia) |
2929
| Kondisi laut | `jangkau maritim <perairan>` (gelombang/arah/periode/suhu laut; contoh: selat sunda, natuna, bali) |
3030
| Top musik ID | `jangkau musik [lagu\|album\|podcast]` (chart Apple Music Indonesia) |
31+
| Harga BBM | `jangkau bbm` (Pertamina subsidi + non-subsidi, data terverifikasi; Shell/BP/Vivo tak tersedia = tak ada sumber legal) |
3132
| Dataset pemerintah | `jangkau data <kata kunci>` |
3233
| Statistik BPS | `jangkau bps <kata kunci>` (sekali saja: daftar key gratis di webapi.bps.go.id lalu `jangkau bps --key <KEY>`) |
3334
| Baca 1 post sosial | `jangkau sosial <url>` (oEmbed resmi; TikTok/YouTube tanpa key, IG/FB perlu Meta token) |

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "jangkau",
3-
"version": "0.2.2",
3+
"version": "0.2.3",
44
"description": "Beri agent AI kamu akses 18 kanal data publik Indonesia — BMKG gempa & cuaca, berita, sholat, Al-Quran, saham IDX, kualitas udara, pesawat live — dengan routing multi-backend yang belajar sendiri. Zero dependency.",
55
"type": "module",
66
"bin": { "jangkau": "bin/jangkau.js" },

src/channels/bbm.mjs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// bbm — harga BBM Indonesia. Sumber: dataset terverifikasi bbm-predictor (dari
2+
// berita resmi penyesuaian Pertamina, di-host publik), bukan scraping situs SPBU.
3+
// Pertamina non-subsidi = data bulanan terverifikasi; subsidi (Pertalite/Biosolar)
4+
// = harga tetap yang dipatok pemerintah. Shell/BP/Vivo TIDAK disertakan: tidak ada
5+
// sumber data publik legal untuk itu (hanya via scraping situs mereka = di luar
6+
// prinsip jangkau). Lihat catatan di output.
7+
import { fetchJson, runChannel } from "../core.mjs";
8+
9+
export const meta = {
10+
name: "bbm",
11+
description: "Harga BBM Indonesia (Pertamina, dari data terverifikasi)",
12+
tier: 0,
13+
backends: ["bbm-predictor-gh"],
14+
usage: "jangkau bbm",
15+
};
16+
17+
const SRC = "https://raw.githubusercontent.com/ryanda9910/bbm-predictor/main/data/history.json";
18+
19+
// BBM subsidi: harga dipatok pemerintah (bukan formula), stabil sepanjang 2026.
20+
const SUBSIDI = [
21+
{ nama: "Pertalite (RON 90)", harga: 10000, jenis: "subsidi" },
22+
{ nama: "Biosolar (CN 48)", harga: 6800, jenis: "subsidi" },
23+
];
24+
25+
const rp = (n) => `Rp${Math.round(n).toLocaleString("id-ID")}`;
26+
27+
export async function run() {
28+
const { result } = await runChannel("bbm", {
29+
"bbm-predictor-gh": async () => {
30+
const d = await fetchJson(SRC, { timeout: 12000 });
31+
const fuels = Object.entries(d).filter(([k]) => !k.startsWith("_"));
32+
if (!fuels.length) throw new Error("dataset kosong");
33+
return fuels;
34+
},
35+
});
36+
37+
let bulan = "";
38+
const nonSubsidi = result.map(([nama, hist]) => {
39+
const last = hist[hist.length - 1];
40+
bulan = last.month;
41+
return { nama, harga: rp(last.price), jenis: "non-subsidi" };
42+
});
43+
44+
return {
45+
berlaku: `${bulan} (Jabodetabek, per liter)`,
46+
pertamina: [
47+
...SUBSIDI.map((s) => ({ ...s, harga: rp(s.harga) })),
48+
...nonSubsidi,
49+
],
50+
catatan: "Harga Pertamina dari data resmi terverifikasi (berita penyesuaian). Harga bisa beda antar wilayah (pajak daerah). Shell/BP/Vivo tidak tersedia: tak ada sumber data publik legal (hanya via scraping situs = di luar prinsip jangkau).",
51+
sumber: "dataset bbm-predictor (github.com/ryanda9910/bbm-predictor)",
52+
};
53+
}
54+
55+
export async function check() {
56+
const d = await fetchJson(SRC, { timeout: 10000 });
57+
const turbo = d["Pertamax Turbo (RON 98)"];
58+
if (!turbo?.length) throw new Error("format berubah");
59+
return `Pertamax Turbo ${rp(turbo[turbo.length - 1].price)} (${turbo[turbo.length - 1].month})`;
60+
}

src/channels/index.mjs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ import * as doa from "./doa.mjs";
1818
import * as wiki from "./wiki.mjs";
1919
import * as maritim from "./maritim.mjs";
2020
import * as musik from "./musik.mjs";
21+
import * as bbm from "./bbm.mjs";
2122

22-
export const CHANNELS = { gempa, cuaca, berita, wilayah, kodepos, kurs, saham, ihsg, sholat, quran, hijriah, pesawat, doa, wiki, maritim, musik, data, bps, sosial, udara };
23+
export const CHANNELS = { gempa, cuaca, berita, wilayah, kodepos, kurs, saham, ihsg, sholat, quran, hijriah, pesawat, doa, wiki, maritim, musik, bbm, data, bps, sosial, udara };

test.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ check "doa" '"arab"' $J doa
3434
check "wiki" '"ringkasan"' $J wiki soekarno
3535
check "maritim" '"tinggi_gelombang"' $J maritim "selat sunda"
3636
check "musik" '"peringkat"' $J musik --limit 3
37+
check "bbm" '"pertamina"' $J bbm
3738
check "gempa-live" '"magnitudo"' $J gempa --live
3839
check "cuaca" '"lokasi"' $J cuaca jasinga bogor
3940
check "bps" 'webapi.bps.go.id\|"indikator"' $J bps inflasi

0 commit comments

Comments
 (0)