{"id":50124353,"url":"https://github.com/yviscool/arenaforge","last_synced_at":"2026-05-23T19:02:00.191Z","repository":{"id":355353042,"uuid":"1226118796","full_name":"yviscool/ArenaForge","owner":"yviscool","description":"ArenaForge","archived":false,"fork":false,"pushed_at":"2026-05-13T07:02:50.000Z","size":271,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T09:09:33.122Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yviscool.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-01T01:59:26.000Z","updated_at":"2026-05-13T07:02:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/yviscool/ArenaForge","commit_stats":null,"previous_names":["yviscool/arenaforge"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yviscool/ArenaForge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yviscool%2FArenaForge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yviscool%2FArenaForge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yviscool%2FArenaForge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yviscool%2FArenaForge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yviscool","download_url":"https://codeload.github.com/yviscool/ArenaForge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yviscool%2FArenaForge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33408490,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T18:09:33.147Z","status":"ssl_error","status_checked_at":"2026-05-23T18:09:31.380Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-23T19:01:53.538Z","updated_at":"2026-05-23T19:02:00.182Z","avatar_url":"https://github.com/yviscool.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[English](README.md) | [简体中文](README.zh-CN.md) | [日本語](README.ja.md) | [한국어](README.ko.md) | [Русский](README.ru.md)\n\n# ArenaForge\n\n[![CI](https://github.com/yviscool/ArenaForge/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/yviscool/ArenaForge/actions/workflows/ci.yml)\n\nArenaForge is a competitive-programming toolkit for Sublime Text.\nIt is built for the day-to-day loop of solving problems: open a file, run it quickly, keep sample tests in order, and create a clean workspace from a problem or contest URL.\n\nThe package keeps that workflow inside the editor.\nRun history, stress testing, diagnostics, template insertion, contest setup, and Codeforces submission are all part of the same working surface.\n\n## What It Does\n\n- Run the current file in a dedicated test panel.\n- Store sample tests and richer session snapshots as JSON files near your source tree.\n- Compare output with expected answers and show the first mismatch position.\n- Keep interactive input history and basic terminal-style editing inside the run panel.\n- Open a dedicated test editor and a separate run-history view for the current source file.\n- Bootstrap contest or problem workspaces from Codeforces, AtCoder, Luogu, and AcWing URLs.\n- Submit Codeforces solutions from inside Sublime Text, with credentials stored through `keyring`.\n- Run stress tests with `\u003ctask\u003e__Good` and `\u003ctask\u003e__Generator`.\n- Insert local algorithm templates and provide lightweight C++ completion helpers.\n- Run C++ diagnostics from `lint_compile_cmd`.\n- Show a simple `Doctor` report for package files, resources, run profiles, and credential backend availability.\n\n## Current Provider Support\n\n| Provider | Workspace bootstrap | Submission |\n| --- | --- | --- |\n| Codeforces | Contest workspace with parsed samples | Yes |\n| AtCoder | Contest workspace with parsed samples | No |\n| Luogu | Single problem workspace | No |\n| AcWing | Single problem workspace | No |\n\nCodeforces submission needs `requests` and a working `keyring` backend.\nThe repository declares `requests` in `dependencies.json`.\n\n## Project Layout\n\n- `arena_forge/core`: typed domain models, output checking, and session use cases\n- `arena_forge/adapters`: Sublime integration, providers, storage, runners, i18n, workspace scaffolding, and credential storage\n- `tests`: pytest coverage for providers, storage, settings, run-panel behavior, and command surfaces\n- `docs`: architecture, migration, and i18n notes\n- repo root: Sublime package resources such as keymaps, syntax files, HTML render assets, icons, debuggers, and thin wrapper commands\n\n## Installation\n\n1. Put this folder under your Sublime Text `Packages/` directory.\n2. If you install it manually, rename the outer package folder to `ArenaForge`.\n3. Restart Sublime Text.\n4. Open the command palette and run `ArenaForge: Open Settings`.\n\nYou still need local toolchains for the languages you want to run, such as `g++`, `python`, or `javac`.\n\n## Basic Workflow\n\n1. Open a source file such as `A.cpp` or `main.py`.\n2. Run `ArenaForge: Run`.\n3. Add or edit tests in the run panel.\n4. Use `ArenaForge: Setup Contest` when you want to create a contest or problem workspace from a URL.\n5. Use `ArenaForge: Configure Credentials` once before your first Codeforces submission.\n6. Use `ArenaForge: Submit` from a file inside a contest workspace.\n\nCommon shortcuts:\n\n- Run current file: `Ctrl+Alt+B` on Windows/Linux, `Ctrl+B` on macOS\n- Add a new test: `Ctrl+Enter`\n- Stop the current process: `Ctrl+C` on all platforms, `Ctrl+X` on Windows/Linux\n- Delete the selected test block: `Ctrl+D`\n- Reorder tests: `Ctrl+Shift+Up` / `Ctrl+Shift+Down` on Windows/Linux, `Ctrl+Super+Up` / `Ctrl+Super+Down` on macOS\n- Toggle the right-side tester panel: `Ctrl+K`, `Ctrl+P` on Windows/Linux, `Super+K`, `Super+P` on macOS\n\nIn the run panel, Windows/Linux also support a few terminal-style editing keys:\n\n- Clear all tests: `Ctrl+L`\n- Clear the current input line: `Ctrl+U`\n- Browse input history: `Ctrl+Up` / `Ctrl+Down`\n- Jump to the start or end of the line: `Ctrl+A` / `Ctrl+E`\n- Move or delete by word: `Alt+B`, `Alt+F`, `Ctrl+W`\n\nmacOS currently also exposes:\n\n- Run with the debugger: `Ctrl+Shift+B`\n- Toggle inline phantoms: `Ctrl+Super+Shift+H`\n\nFor the full list, see:\n\n- `Default (Windows).sublime-keymap`\n- `Default (Linux).sublime-keymap`\n- `Default (OSX).sublime-keymap`\n\n## Configuration\n\nThe main settings file is `ArenaForge.sublime-settings`.\nThe repository also includes recommended per-platform defaults in:\n\n- `ArenaForge (Windows).sublime-settings`\n- `ArenaForge (Linux).sublime-settings`\n- `ArenaForge (OSX).sublime-settings`\n\nThe settings you will most likely touch are:\n\n- `run_settings`: language profiles, file extensions, compile commands, run commands, and optional `lint_compile_cmd`\n- `contests_root`: where generated contest or problem workspaces are created\n- `tests_relative_dir`, `session_relative_dir`, `tests_file_suffix`: where test indexes and session snapshots are stored\n- `preferred_locale`: `en`, `zh-Hans`, `ja`, `ko`, or `ru`\n- `credential_backend`: currently `keyring`\n- `stress_time_limit_seconds`: timeout used by stress tests\n- `algorithms_base`: base directory for local C++ templates or snippets\n- `cpp_complete_enabled` and `cpp_complete_settings`: lightweight C++ completion behavior\n- `submission_language_ids`: per-provider language id mapping for submission\n- `ui_variant` and `ui_density`: basic run-panel presentation\n\nExample:\n\n```json\n{\n  \"preferred_locale\": \"en\",\n  \"contests_root\": \"~/Contests/ArenaForge\",\n  \"tests_relative_dir\": \".arena-forge/tests\",\n  \"session_relative_dir\": \".arena-forge/sessions\",\n  \"stress_time_limit_seconds\": 2,\n  \"credential_backend\": \"keyring\",\n  \"algorithms_base\": \"Algorithms\",\n  \"run_settings\": [\n    {\n      \"name\": \"C++\",\n      \"extensions\": [\"cpp\", \"cc\", \"cxx\"],\n      \"compile_cmd\": \"g++ \\\"{source_file}\\\" -std=gnu++17 -O2 -pipe -o \\\"{file_name}\\\"\",\n      \"run_cmd\": \"./{file_name} {args}\",\n      \"lint_compile_cmd\": \"g++ -std=gnu++17 \\\"{source_file}\\\" -I \\\"{source_file_dir}\\\"\"\n    },\n    {\n      \"name\": \"Python\",\n      \"extensions\": [\"py\"],\n      \"compile_cmd\": null,\n      \"run_cmd\": \"python \\\"{source_file}\\\"\",\n      \"lint_compile_cmd\": null\n    }\n  ]\n}\n```\n\nTests and session data are stored as normal JSON files next to your working source tree.\nThe exact locations depend on your `tests_relative_dir` and `session_relative_dir` settings.\nThe shipped settings files use slightly different layouts by platform, so treat the example above as a template, not a required literal copy.\n\n## Development\n\n- Python: `3.8+`\n- Dependency manager: `uv`\n- Runtime dependency: `keyring`\n\nLocal setup and verification:\n\n```bash\nuv sync --group dev\nuv run ruff check arena_forge tests\nuv run pytest -q\nuv run mypy\n```\n\nCI and release automation:\n\n- Workflow file: `.github/workflows/ci.yml`\n- Triggers: `push`, `pull_request`, and manual `workflow_dispatch`\n- Quality matrix: `ubuntu-latest` and `windows-latest`\n- Checks on both platforms: `ruff`, `pytest`\n- Extra check on Ubuntu: `mypy`\n- Release rule: every push to `main` that passes the quality matrix publishes a GitHub prerelease tagged `ci-\u003cshort-sha\u003e`\n- Release asset: `ArenaForge.sublime-package`, built from the tracked package files and attached to that prerelease\n\n## Thanks\n\nThis project builds on ideas and workflow from [FastOlympicCoding](https://github.com/Jatana/FastOlympicCoding) by Jatana.\n\nThe current codebase keeps the same competitive-programming focus, but reorganizes the implementation around a typed core, portable JSON storage, and cleaner Sublime adapters.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyviscool%2Farenaforge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyviscool%2Farenaforge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyviscool%2Farenaforge/lists"}