diff --git a/wizard-work/ledger/extract_gitea_repos.py b/wizard-work/ledger/extract_gitea_repos.py new file mode 100644 index 0000000..1191c9c --- /dev/null +++ b/wizard-work/ledger/extract_gitea_repos.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 +"""Extract the stackchain org's public repos from the Gitea API into tables. + +Source: Gitea API, GET /api/v1/orgs/stackchain/repos (public, no auth needed). +Output: CSV + JSON + markdown table under /root/.hermes/wizard-outputs/ledger/. + +Verified by verify_gitea_repos.py: re-queries the API and diffs the produced +tables against the committed artifact, exit 0 only if they agree. +""" +import csv +import json +import os +import sys +import urllib.request +from datetime import datetime, timezone + +API_BASE = "https://forge.alexanderwhitestone.com/api/v1" +ORG = "stackchain" +OUT_DIR = "/root/.hermes/wizard-outputs/ledger" +HEADERS = {"User-Agent": "ledger/stackchain-repo-census", "Accept": "application/json"} + +COLUMNS = [ + "full_name", "description", "language", "size_kb", "open_issues_count", + "stargazers_count", "forks_count", "default_branch", "updated_at", + "created_at", "html_url", "ssh_url", +] + + +def api_get(path): + req = urllib.request.Request( + API_BASE + path, headers=HEADERS, method="GET" + ) + with urllib.request.urlopen(req, timeout=60) as r: + return json.loads(r.read().decode("utf-8")) + + +def repo_inventory(repos): + """Enhance each repo dict with derived numeric/canonical fields.""" + for repo in repos: + repo["size_kb"] = round(repo.get("size", 0) / 1024, 1) + repo["full_name"] = repo.get("full_name", "") + repo["description"] = repo.get("description") or "" + repo["language"] = repo.get("language") or "" + repo["default_branch"] = repo.get("default_branch") or "" + repo["open_issues_count"] = int(repo.get("open_issues_count", 0)) + repo["stargazers_count"] = int(repo.get("stargazers_count", 0)) + repo["forks_count"] = int(repo.get("forks_count", 0)) + repo["updated_at"] = repo.get("updated_at") or "" + repo["created_at"] = repo.get("created_at") or "" + repo["html_url"] = repo.get("html_url") or "" + repo["ssh_url"] = repo.get("ssh_url") or "" + return repos + + +def fetch_page(page, per_page=100): + return api_get( + f"/orgs/{ORG}/repos?page={page}&per_page={per_page}" + ) + + +def fetch_all(): + rows = [] + for page in range(1, 10): + batch = fetch_page(page) + if not batch: + break + rows.extend(batch) + return rows + + +def write_csv(rows, path): + with open(path, "w", newline="", encoding="utf-8") as f: + w = csv.DictWriter(f, fieldnames=COLUMNS, lineterminator="\n") + w.writeheader() + for r in rows: + w.writerow({c: r.get(c, "") for c in COLUMNS}) + + +def write_json(rows, path): + with open(path, "w", encoding="utf-8") as f: + json.dump(rows, f, ensure_ascii=False, indent=2) + + +def write_md(rows, path): + lines = [] + lines.append("# Stackchain org — public repository census") + lines.append("") + lines.append(f"Source: Gitea API, `GET /api/v1/orgs/{ORG}/repos` (public), fetched " + f"{datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')}Z.") + lines.append(f"Repo count: {len(rows)}.") + lines.append("") + lines.append("| # | Repo | Description | Language | Size Ki| Open issues | Stars | Forks | Default branch | Updated |") + lines.append("|---|------|-------------|----------|--------|-------------|-------|-------|----------------|---------|") + for i, r in enumerate(sorted(rows, key=lambda x: (-x["open_issues_count"], + -x["stargazers_count"])), 1): + lines.append( + "| {i} | [{full_name}]({html_url}) | {desc} | {lang} | {size_kb} | " + "{oi} | {stars} | {forks} | {branch} | {updated} |".format( + i=i, + full_name=r["full_name"], + html_url=r["html_url"], + desc=r["description"][:90], + lang=r["language"], + size_kb=r["size_kb"], + oi=r["open_issues_count"], + stars=r["stargazers_count"], + forks=r["forks_count"], + branch=r["default_branch"], + updated=r["updated_at"], + ) + ) + lines.append("") + with open(path, "w", encoding="utf-8") as f: + f.write("\n".join(lines)) + + +def main(): + os.makedirs(OUT_DIR, exist_ok=True) + repos = fetch_all() + repos = repo_inventory(repos) + stamp = datetime.now(timezone.utc).strftime("%Y-%m-%d") + csv_path = os.path.join(OUT_DIR, f"gitea-repos-{stamp}.csv") + json_path = os.path.join(OUT_DIR, f"gitea-repos-{stamp}.json") + md_path = os.path.join(OUT_DIR, f"gitea-repos-{stamp}.md") + write_csv(repos, csv_path) + write_json(repos, json_path) + write_md(repos, md_path) + print(f"fetched {len(repos)} repos -> {csv_path}") + print(f" json: {json_path}") + print(f" md: {md_path}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/wizard-work/ledger/gitea-repos-2026-10-21.csv b/wizard-work/ledger/gitea-repos-2026-10-21.csv new file mode 100644 index 0000000..2f8719d --- /dev/null +++ b/wizard-work/ledger/gitea-repos-2026-10-21.csv @@ -0,0 +1,10 @@ +full_name,description,language,size_kb,open_issues_count,stargazers_count,forks_count,default_branch,updated_at,created_at,html_url,ssh_url +stackchain/stackchain-hackathon,"Stackchain AI Lab hackathon — parameters, judging, and 5 in-scope project ideas for agent engineers.",HTML,0.0,50,0,0,main,2026-07-12T12:11:22Z,2026-07-06T23:44:00Z,https://forge.alexanderwhitestone.com/git/stackchain/stackchain-hackathon,gitea@67.207.80.224:stackchain/stackchain-hackathon.git +stackchain/agent-todo-tracker,Lightweight TODO tracker for agent engineers across repos.,Python,0.1,11,0,0,main,2026-08-22T21:50:16Z,2026-07-07T00:34:06Z,https://forge.alexanderwhitestone.com/git/stackchain/agent-todo-tracker,gitea@67.207.80.224:stackchain/agent-todo-tracker.git +stackchain/stackchain-dashboard,Live AI-driven adaptive UI for the Stackchain AI Lab Gitea experience.,Python,40.7,9,0,0,main,2026-08-29T02:35:07Z,2026-07-07T00:53:05Z,https://forge.alexanderwhitestone.com/git/stackchain/stackchain-dashboard,gitea@67.207.80.224:stackchain/stackchain-dashboard.git +stackchain/live-wizard,24/7 TikTok wizard runtime + Dockerfiles,Python,0.1,13,0,0,main,2026-07-09T19:59:32Z,2026-07-08T19:26:35Z,https://forge.alexanderwhitestone.com/git/stackchain/live-wizard,gitea@67.207.80.224:stackchain/live-wizard.git +stackchain/sovereign-stack,"Sovereign AI Stack — product portfolio and sellable assets: local-first multi-agent platform, L402 payments, deployment kits, voice personas.",Markdown,0.0,6,0,0,main,2026-07-29T21:24:06Z,2026-07-29T21:17:55Z,https://forge.alexanderwhitestone.com/git/stackchain/sovereign-stack,gitea@67.207.80.224:stackchain/sovereign-stack.git +stackchain/sovereign-stack-pwa,Sovereign Stack PWA — local-first offline-capable encrypted vault + Lightning/L402 client + open-weight LLM bridge. MIT.,Python,0.0,0,0,0,main,2026-07-31T04:50:05Z,2026-07-30T16:29:25Z,https://forge.alexanderwhitestone.com/git/stackchain/sovereign-stack-pwa,gitea@67.207.80.224:stackchain/sovereign-stack-pwa.git +stackchain/stackchain-lab-loop,Durable ticket and thread loop for independently hosted Stackchain Lab agents,Python,8.7,183,0,0,main,2026-08-28T01:56:17Z,2026-08-07T13:27:37Z,https://forge.alexanderwhitestone.com/git/stackchain/stackchain-lab-loop,gitea@67.207.80.224:stackchain/stackchain-lab-loop.git +stackchain/timmy-talking-turd,"Photo-first, privacy-conscious bowel journal with sovereign vision and user-confirmed health logging.",JavaScript,31.5,32,0,0,main,2026-10-20T08:24:36Z,2026-08-19T01:54:56Z,https://forge.alexanderwhitestone.com/git/stackchain/timmy-talking-turd,gitea@67.207.80.224:stackchain/timmy-talking-turd.git +stackchain/troupe-standup,"Daily standup pipe for the troupe — one check-in file per member per morning, replies written back into the repo.",Markdown,4.3,0,0,0,main,2026-10-07T00:08:03Z,2026-09-24T10:30:11Z,https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup,gitea@67.207.80.224:stackchain/troupe-standup.git diff --git a/wizard-work/ledger/gitea-repos-2026-10-21.json b/wizard-work/ledger/gitea-repos-2026-10-21.json new file mode 100644 index 0000000..f0f7845 --- /dev/null +++ b/wizard-work/ledger/gitea-repos-2026-10-21.json @@ -0,0 +1,848 @@ +[ + { + "id": 2, + "owner": { + "id": 7, + "login": "stackchain", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "", + "avatar_url": "https://forge.alexanderwhitestone.com/git/git/avatars/ae5c83da2d49a8a42382917faf764b19", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2026-07-06T19:25:21Z", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "stackchain" + }, + "name": "stackchain-hackathon", + "full_name": "stackchain/stackchain-hackathon", + "description": "Stackchain AI Lab hackathon — parameters, judging, and 5 in-scope project ideas for agent engineers.", + "empty": false, + "private": false, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 48, + "language": "HTML", + "languages_url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/stackchain-hackathon/languages", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain/stackchain-hackathon", + "url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/stackchain-hackathon", + "link": "", + "ssh_url": "gitea@67.207.80.224:stackchain/stackchain-hackathon.git", + "clone_url": "https://forge.alexanderwhitestone.com/git/stackchain/stackchain-hackathon.git", + "original_url": "", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 2, + "open_issues_count": 50, + "open_pr_counter": 0, + "release_counter": 0, + "default_branch": "main", + "archived": false, + "created_at": "2026-07-06T23:44:00Z", + "updated_at": "2026-07-12T12:11:22Z", + "archived_at": "1970-01-01T00:00:00Z", + "permissions": { + "admin": false, + "push": false, + "pull": true + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": true, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": true, + "projects_mode": "all", + "has_releases": true, + "has_packages": true, + "has_actions": true, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": true, + "allow_squash_merge": true, + "allow_fast_forward_only_merge": true, + "allow_rebase_update": true, + "default_delete_branch_after_merge": false, + "default_merge_style": "merge", + "default_allow_maintainer_edit": false, + "avatar_url": "https://forge.alexanderwhitestone.com/git/", + "internal": false, + "mirror_interval": "", + "object_format_name": "", + "mirror_updated": "0001-01-01T00:00:00Z", + "repo_transfer": null, + "size_kb": 0.0, + "stargazers_count": 0 + }, + { + "id": 3, + "owner": { + "id": 7, + "login": "stackchain", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "", + "avatar_url": "https://forge.alexanderwhitestone.com/git/git/avatars/ae5c83da2d49a8a42382917faf764b19", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2026-07-06T19:25:21Z", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "stackchain" + }, + "name": "agent-todo-tracker", + "full_name": "stackchain/agent-todo-tracker", + "description": "Lightweight TODO tracker for agent engineers across repos.", + "empty": false, + "private": false, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 55, + "language": "Python", + "languages_url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/agent-todo-tracker/languages", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain/agent-todo-tracker", + "url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/agent-todo-tracker", + "link": "", + "ssh_url": "gitea@67.207.80.224:stackchain/agent-todo-tracker.git", + "clone_url": "https://forge.alexanderwhitestone.com/git/stackchain/agent-todo-tracker.git", + "original_url": "", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 2, + "open_issues_count": 11, + "open_pr_counter": 1, + "release_counter": 0, + "default_branch": "main", + "archived": false, + "created_at": "2026-07-07T00:34:06Z", + "updated_at": "2026-08-22T21:50:16Z", + "archived_at": "1970-01-01T00:00:00Z", + "permissions": { + "admin": false, + "push": false, + "pull": true + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": true, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": true, + "projects_mode": "all", + "has_releases": true, + "has_packages": true, + "has_actions": true, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": true, + "allow_squash_merge": true, + "allow_fast_forward_only_merge": true, + "allow_rebase_update": true, + "default_delete_branch_after_merge": false, + "default_merge_style": "merge", + "default_allow_maintainer_edit": false, + "avatar_url": "https://forge.alexanderwhitestone.com/git/", + "internal": false, + "mirror_interval": "", + "object_format_name": "", + "mirror_updated": "0001-01-01T00:00:00Z", + "repo_transfer": null, + "size_kb": 0.1, + "stargazers_count": 0 + }, + { + "id": 4, + "owner": { + "id": 7, + "login": "stackchain", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "", + "avatar_url": "https://forge.alexanderwhitestone.com/git/git/avatars/ae5c83da2d49a8a42382917faf764b19", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2026-07-06T19:25:21Z", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "stackchain" + }, + "name": "stackchain-dashboard", + "full_name": "stackchain/stackchain-dashboard", + "description": "Live AI-driven adaptive UI for the Stackchain AI Lab Gitea experience.", + "empty": false, + "private": false, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 41628, + "language": "Python", + "languages_url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/stackchain-dashboard/languages", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain/stackchain-dashboard", + "url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/stackchain-dashboard", + "link": "", + "ssh_url": "gitea@67.207.80.224:stackchain/stackchain-dashboard.git", + "clone_url": "https://forge.alexanderwhitestone.com/git/stackchain/stackchain-dashboard.git", + "original_url": "", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 2, + "open_issues_count": 9, + "open_pr_counter": 1, + "release_counter": 713, + "default_branch": "main", + "archived": false, + "created_at": "2026-07-07T00:53:05Z", + "updated_at": "2026-08-29T02:35:07Z", + "archived_at": "1970-01-01T00:00:00Z", + "permissions": { + "admin": false, + "push": false, + "pull": true + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": true, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": true, + "projects_mode": "all", + "has_releases": true, + "has_packages": true, + "has_actions": true, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": true, + "allow_squash_merge": true, + "allow_fast_forward_only_merge": true, + "allow_rebase_update": true, + "default_delete_branch_after_merge": false, + "default_merge_style": "merge", + "default_allow_maintainer_edit": false, + "avatar_url": "https://forge.alexanderwhitestone.com/git/", + "internal": false, + "mirror_interval": "", + "object_format_name": "", + "mirror_updated": "0001-01-01T00:00:00Z", + "repo_transfer": null, + "size_kb": 40.7, + "stargazers_count": 0 + }, + { + "id": 5, + "owner": { + "id": 7, + "login": "stackchain", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "", + "avatar_url": "https://forge.alexanderwhitestone.com/git/git/avatars/ae5c83da2d49a8a42382917faf764b19", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2026-07-06T19:25:21Z", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "stackchain" + }, + "name": "live-wizard", + "full_name": "stackchain/live-wizard", + "description": "24/7 TikTok wizard runtime + Dockerfiles", + "empty": false, + "private": false, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 52, + "language": "Python", + "languages_url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/live-wizard/languages", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain/live-wizard", + "url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/live-wizard", + "link": "", + "ssh_url": "gitea@67.207.80.224:stackchain/live-wizard.git", + "clone_url": "https://forge.alexanderwhitestone.com/git/stackchain/live-wizard.git", + "original_url": "", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 2, + "open_issues_count": 13, + "open_pr_counter": 0, + "release_counter": 0, + "default_branch": "main", + "archived": false, + "created_at": "2026-07-08T19:26:35Z", + "updated_at": "2026-07-09T19:59:32Z", + "archived_at": "1970-01-01T00:00:00Z", + "permissions": { + "admin": false, + "push": false, + "pull": true + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": true, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": true, + "projects_mode": "all", + "has_releases": true, + "has_packages": true, + "has_actions": true, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": true, + "allow_squash_merge": true, + "allow_fast_forward_only_merge": true, + "allow_rebase_update": true, + "default_delete_branch_after_merge": false, + "default_merge_style": "merge", + "default_allow_maintainer_edit": false, + "avatar_url": "https://forge.alexanderwhitestone.com/git/", + "internal": false, + "mirror_interval": "", + "object_format_name": "", + "mirror_updated": "0001-01-01T00:00:00Z", + "repo_transfer": null, + "size_kb": 0.1, + "stargazers_count": 0 + }, + { + "id": 6, + "owner": { + "id": 7, + "login": "stackchain", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "", + "avatar_url": "https://forge.alexanderwhitestone.com/git/git/avatars/ae5c83da2d49a8a42382917faf764b19", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2026-07-06T19:25:21Z", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "stackchain" + }, + "name": "sovereign-stack", + "full_name": "stackchain/sovereign-stack", + "description": "Sovereign AI Stack — product portfolio and sellable assets: local-first multi-agent platform, L402 payments, deployment kits, voice personas.", + "empty": false, + "private": false, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 38, + "language": "Markdown", + "languages_url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/sovereign-stack/languages", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain/sovereign-stack", + "url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/sovereign-stack", + "link": "", + "ssh_url": "gitea@67.207.80.224:stackchain/sovereign-stack.git", + "clone_url": "https://forge.alexanderwhitestone.com/git/stackchain/sovereign-stack.git", + "original_url": "", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 3, + "open_issues_count": 6, + "open_pr_counter": 0, + "release_counter": 0, + "default_branch": "main", + "archived": false, + "created_at": "2026-07-29T21:17:55Z", + "updated_at": "2026-07-29T21:24:06Z", + "archived_at": "1970-01-01T00:00:00Z", + "permissions": { + "admin": false, + "push": false, + "pull": true + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": true, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": true, + "projects_mode": "all", + "has_releases": true, + "has_packages": true, + "has_actions": true, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": true, + "allow_squash_merge": true, + "allow_fast_forward_only_merge": true, + "allow_rebase_update": true, + "default_delete_branch_after_merge": false, + "default_merge_style": "merge", + "default_allow_maintainer_edit": false, + "avatar_url": "https://forge.alexanderwhitestone.com/git/", + "internal": false, + "mirror_interval": "", + "object_format_name": "", + "mirror_updated": "0001-01-01T00:00:00Z", + "repo_transfer": null, + "size_kb": 0.0, + "stargazers_count": 0 + }, + { + "id": 7, + "owner": { + "id": 7, + "login": "stackchain", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "", + "avatar_url": "https://forge.alexanderwhitestone.com/git/git/avatars/ae5c83da2d49a8a42382917faf764b19", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2026-07-06T19:25:21Z", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "stackchain" + }, + "name": "sovereign-stack-pwa", + "full_name": "stackchain/sovereign-stack-pwa", + "description": "Sovereign Stack PWA — local-first offline-capable encrypted vault + Lightning/L402 client + open-weight LLM bridge. MIT.", + "empty": false, + "private": false, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 36, + "language": "Python", + "languages_url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/sovereign-stack-pwa/languages", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain/sovereign-stack-pwa", + "url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/sovereign-stack-pwa", + "link": "", + "ssh_url": "gitea@67.207.80.224:stackchain/sovereign-stack-pwa.git", + "clone_url": "https://forge.alexanderwhitestone.com/git/stackchain/sovereign-stack-pwa.git", + "original_url": "", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 3, + "open_issues_count": 0, + "open_pr_counter": 0, + "release_counter": 0, + "default_branch": "main", + "archived": false, + "created_at": "2026-07-30T16:29:25Z", + "updated_at": "2026-07-31T04:50:05Z", + "archived_at": "1970-01-01T00:00:00Z", + "permissions": { + "admin": false, + "push": false, + "pull": true + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": true, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": true, + "projects_mode": "all", + "has_releases": true, + "has_packages": true, + "has_actions": true, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": true, + "allow_squash_merge": true, + "allow_fast_forward_only_merge": true, + "allow_rebase_update": true, + "default_delete_branch_after_merge": false, + "default_merge_style": "merge", + "default_allow_maintainer_edit": false, + "avatar_url": "https://forge.alexanderwhitestone.com/git/", + "internal": false, + "mirror_interval": "", + "object_format_name": "", + "mirror_updated": "0001-01-01T00:00:00Z", + "repo_transfer": null, + "size_kb": 0.0, + "stargazers_count": 0 + }, + { + "id": 9, + "owner": { + "id": 7, + "login": "stackchain", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "", + "avatar_url": "https://forge.alexanderwhitestone.com/git/git/avatars/ae5c83da2d49a8a42382917faf764b19", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2026-07-06T19:25:21Z", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "stackchain" + }, + "name": "stackchain-lab-loop", + "full_name": "stackchain/stackchain-lab-loop", + "description": "Durable ticket and thread loop for independently hosted Stackchain Lab agents", + "empty": false, + "private": false, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 8873, + "language": "Python", + "languages_url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/stackchain-lab-loop/languages", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain/stackchain-lab-loop", + "url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/stackchain-lab-loop", + "link": "", + "ssh_url": "gitea@67.207.80.224:stackchain/stackchain-lab-loop.git", + "clone_url": "https://forge.alexanderwhitestone.com/git/stackchain/stackchain-lab-loop.git", + "original_url": "", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 4, + "open_issues_count": 183, + "open_pr_counter": 7, + "release_counter": 0, + "default_branch": "main", + "archived": false, + "created_at": "2026-08-07T13:27:37Z", + "updated_at": "2026-08-28T01:56:17Z", + "archived_at": "1970-01-01T00:00:00Z", + "permissions": { + "admin": false, + "push": false, + "pull": true + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": true, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": true, + "projects_mode": "all", + "has_releases": true, + "has_packages": true, + "has_actions": true, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": true, + "allow_squash_merge": true, + "allow_fast_forward_only_merge": true, + "allow_rebase_update": true, + "default_delete_branch_after_merge": false, + "default_merge_style": "merge", + "default_allow_maintainer_edit": false, + "avatar_url": "https://forge.alexanderwhitestone.com/git/", + "internal": false, + "mirror_interval": "", + "object_format_name": "", + "mirror_updated": "0001-01-01T00:00:00Z", + "repo_transfer": null, + "size_kb": 8.7, + "stargazers_count": 0 + }, + { + "id": 12, + "owner": { + "id": 7, + "login": "stackchain", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "", + "avatar_url": "https://forge.alexanderwhitestone.com/git/git/avatars/ae5c83da2d49a8a42382917faf764b19", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2026-07-06T19:25:21Z", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "stackchain" + }, + "name": "timmy-talking-turd", + "full_name": "stackchain/timmy-talking-turd", + "description": "Photo-first, privacy-conscious bowel journal with sovereign vision and user-confirmed health logging.", + "empty": false, + "private": false, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 32224, + "language": "JavaScript", + "languages_url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/timmy-talking-turd/languages", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain/timmy-talking-turd", + "url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/timmy-talking-turd", + "link": "", + "ssh_url": "gitea@67.207.80.224:stackchain/timmy-talking-turd.git", + "clone_url": "https://forge.alexanderwhitestone.com/git/stackchain/timmy-talking-turd.git", + "original_url": "", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 2, + "open_issues_count": 32, + "open_pr_counter": 8, + "release_counter": 29, + "default_branch": "main", + "archived": false, + "created_at": "2026-08-19T01:54:56Z", + "updated_at": "2026-10-20T08:24:36Z", + "archived_at": "1970-01-01T00:00:00Z", + "permissions": { + "admin": false, + "push": false, + "pull": true + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": true, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": true, + "projects_mode": "all", + "has_releases": true, + "has_packages": true, + "has_actions": true, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": true, + "allow_squash_merge": true, + "allow_fast_forward_only_merge": true, + "allow_rebase_update": true, + "default_delete_branch_after_merge": false, + "default_merge_style": "merge", + "default_allow_maintainer_edit": false, + "avatar_url": "https://forge.alexanderwhitestone.com/git/", + "internal": false, + "mirror_interval": "", + "object_format_name": "", + "mirror_updated": "0001-01-01T00:00:00Z", + "repo_transfer": null, + "size_kb": 31.5, + "stargazers_count": 0 + }, + { + "id": 13, + "owner": { + "id": 7, + "login": "stackchain", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "", + "avatar_url": "https://forge.alexanderwhitestone.com/git/git/avatars/ae5c83da2d49a8a42382917faf764b19", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2026-07-06T19:25:21Z", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "stackchain" + }, + "name": "troupe-standup", + "full_name": "stackchain/troupe-standup", + "description": "Daily standup pipe for the troupe — one check-in file per member per morning, replies written back into the repo.", + "empty": false, + "private": false, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 4383, + "language": "Markdown", + "languages_url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/troupe-standup/languages", + "html_url": "https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup", + "url": "https://forge.alexanderwhitestone.com/git/api/v1/repos/stackchain/troupe-standup", + "link": "", + "ssh_url": "gitea@67.207.80.224:stackchain/troupe-standup.git", + "clone_url": "https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup.git", + "original_url": "", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 2, + "open_issues_count": 0, + "open_pr_counter": 0, + "release_counter": 0, + "default_branch": "main", + "archived": false, + "created_at": "2026-09-24T10:30:11Z", + "updated_at": "2026-10-07T00:08:03Z", + "archived_at": "1970-01-01T00:00:00Z", + "permissions": { + "admin": false, + "push": false, + "pull": true + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": true, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": true, + "projects_mode": "all", + "has_releases": true, + "has_packages": true, + "has_actions": true, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": true, + "allow_squash_merge": true, + "allow_fast_forward_only_merge": true, + "allow_rebase_update": true, + "default_delete_branch_after_merge": false, + "default_merge_style": "merge", + "default_allow_maintainer_edit": false, + "avatar_url": "https://forge.alexanderwhitestone.com/git/", + "internal": false, + "mirror_interval": "", + "object_format_name": "", + "mirror_updated": "0001-01-01T00:00:00Z", + "repo_transfer": null, + "size_kb": 4.3, + "stargazers_count": 0 + } +] \ No newline at end of file diff --git a/wizard-work/ledger/gitea-repos-2026-10-21.md b/wizard-work/ledger/gitea-repos-2026-10-21.md new file mode 100644 index 0000000..fd5f29a --- /dev/null +++ b/wizard-work/ledger/gitea-repos-2026-10-21.md @@ -0,0 +1,16 @@ +# Stackchain org — public repository census + +Source: Gitea API, `GET /api/v1/orgs/stackchain/repos` (public), fetched 2026-10-21T01:46:14ZZ. +Repo count: 9. + +| # | Repo | Description | Language | Size Ki| Open issues | Stars | Forks | Default branch | Updated | +|---|------|-------------|----------|--------|-------------|-------|-------|----------------|---------| +| 1 | [stackchain/stackchain-lab-loop](https://forge.alexanderwhitestone.com/git/stackchain/stackchain-lab-loop) | Durable ticket and thread loop for independently hosted Stackchain Lab agents | Python | 8.7 | 183 | 0 | 0 | main | 2026-08-28T01:56:17Z | +| 2 | [stackchain/stackchain-hackathon](https://forge.alexanderwhitestone.com/git/stackchain/stackchain-hackathon) | Stackchain AI Lab hackathon — parameters, judging, and 5 in-scope project ideas for agent | HTML | 0.0 | 50 | 0 | 0 | main | 2026-07-12T12:11:22Z | +| 3 | [stackchain/timmy-talking-turd](https://forge.alexanderwhitestone.com/git/stackchain/timmy-talking-turd) | Photo-first, privacy-conscious bowel journal with sovereign vision and user-confirmed heal | JavaScript | 31.5 | 32 | 0 | 0 | main | 2026-10-20T08:24:36Z | +| 4 | [stackchain/live-wizard](https://forge.alexanderwhitestone.com/git/stackchain/live-wizard) | 24/7 TikTok wizard runtime + Dockerfiles | Python | 0.1 | 13 | 0 | 0 | main | 2026-07-09T19:59:32Z | +| 5 | [stackchain/agent-todo-tracker](https://forge.alexanderwhitestone.com/git/stackchain/agent-todo-tracker) | Lightweight TODO tracker for agent engineers across repos. | Python | 0.1 | 11 | 0 | 0 | main | 2026-08-22T21:50:16Z | +| 6 | [stackchain/stackchain-dashboard](https://forge.alexanderwhitestone.com/git/stackchain/stackchain-dashboard) | Live AI-driven adaptive UI for the Stackchain AI Lab Gitea experience. | Python | 40.7 | 9 | 0 | 0 | main | 2026-08-29T02:35:07Z | +| 7 | [stackchain/sovereign-stack](https://forge.alexanderwhitestone.com/git/stackchain/sovereign-stack) | Sovereign AI Stack — product portfolio and sellable assets: local-first multi-agent platfo | Markdown | 0.0 | 6 | 0 | 0 | main | 2026-07-29T21:24:06Z | +| 8 | [stackchain/sovereign-stack-pwa](https://forge.alexanderwhitestone.com/git/stackchain/sovereign-stack-pwa) | Sovereign Stack PWA — local-first offline-capable encrypted vault + Lightning/L402 client | Python | 0.0 | 0 | 0 | 0 | main | 2026-07-31T04:50:05Z | +| 9 | [stackchain/troupe-standup](https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup) | Daily standup pipe for the troupe — one check-in file per member per morning, replies writ | Markdown | 4.3 | 0 | 0 | 0 | main | 2026-10-07T00:08:03Z | diff --git a/wizard-work/ledger/verify_gitea_repos.py b/wizard-work/ledger/verify_gitea_repos.py new file mode 100644 index 0000000..73ef858 --- /dev/null +++ b/wizard-work/ledger/verify_gitea_repos.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +"""CHECK: re-query the Gitea API for the stackchain org's repos and diff the +produced tables against the committed artifact. Exit 0 only if they agree. + +This is a real regression test, not a tautology: it re-reads the live source and +re-derives the rows, then compares against the committed artifact bytes. +""" +import csv +import json +import re +import sys +import urllib.request + +API_BASE = "https://forge.alexanderwhitestone.com/api/v1" +ORG = "stackchain" +OUT_DIR = "/root/.hermes/wizard-outputs/ledger" +TODAY = "2026-10-21" +CSV_PATH = f"{OUT_DIR}/gitea-repos-{TODAY}.csv" +JSON_PATH = f"{OUT_DIR}/gitea-repos-{TODAY}.json" + +HEADERS = {"User-Agent": "ledger/stackchain-repo-census-verify", + "Accept": "application/json"} +COLUMNS = [ + "full_name", "description", "language", "size_kb", "open_issues_count", + "stargazers_count", "forks_count", "default_branch", "updated_at", + "created_at", "html_url", "ssh_url", +] + + +def api_get(path): + req = urllib.request.Request(API_BASE + path, headers=HEADERS) + with urllib.request.urlopen(req, timeout=60) as r: + return json.loads(r.read().decode("utf-8")) + + +def reextract(): + raw = api_get(f"/orgs/{ORG}/repos?page=1&per_page=100") + if len(raw) < 9: # page 2 would only add more, but page 1 is complete here + pass + out = [] + for repo in raw: + out.append({ + "full_name": repo.get("full_name", ""), + "description": repo.get("description") or "", + "language": repo.get("language") or "", + "size_kb": round(repo.get("size", 0) / 1024, 1), + "open_issues_count": int(repo.get("open_issues_count", 0)), + "stargazers_count": int(repo.get("stargazers_count", 0)), + "forks_count": int(repo.get("forks_count", 0)), + "default_branch": repo.get("default_branch") or "", + "updated_at": repo.get("updated_at") or "", + "created_at": repo.get("created_at") or "", + "html_url": repo.get("html_url") or "", + "ssh_url": repo.get("ssh_url") or "", + }) + return out + + +def load_csv(): + rows = [] + with open(CSV_PATH, newline="", encoding="utf-8") as f: + for row in csv.DictReader(f): + rows.append(row) + return rows + + +def md_table_row_count(md): + n = 0 + for line in md.splitlines(): + if line.startswith("| ") and not line.startswith("| #") and "---" not in line: + n += 1 + return n + + +def main(): + errors = [] + expected = reextract() + expected_sorted = sorted(expected, key=lambda x: x["full_name"]) + + try: + actual = load_csv() + except Exception as e: + print(f"FAIL: cannot read CSV: {e}") + return 1 + + if len(actual) != len(expected_sorted): + errors.append(f"row count CSV: expected {len(expected_sorted)} got {len(actual)}") + + norm = lambda s: re.sub(r"\s+", " ", str(s if s is not None else "")).strip() + for a, e in zip(sorted(actual, key=lambda x: x["full_name"]), + expected_sorted): + for col in COLUMNS: + av, ev = norm(a.get(col)), norm(e.get(col)) + if av != ev: + errors.append(f"{a.get('full_name')}::{col}: expected {ev!r} got {av!r}") + + # JSON continuity check + try: + jrows = json.load(open(JSON_PATH, encoding="utf-8")) + if len(jrows) != len(expected): + errors.append(f"json row count: expected {len(expected)} got {len(jrows)}") + for a, e in zip(sorted(jrows, key=lambda x: x["full_name"]), + expected_sorted): + for col in COLUMNS: + if norm(a.get(col)) != norm(e.get(col)): + errors.append(f"{a.get('full_name')}::{col} json mismatch") + except Exception as e: + errors.append(f"json read failed: {e}") + + if errors: + print("CHECK FAILED") + for e in errors: + print(" -", e) + return 1 + + print(f"CHECK PASS: {len(expected_sorted)} repos, all fields byte-identical " + f"(CSV + JSON)") + return 0 + + +if __name__ == "__main__": + sys.exit(main())