god-code 0.9.2__tar.gz → 1.0.0rc1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {god_code-0.9.2 → god_code-1.0.0rc1}/.gitignore +1 -0
- god_code-1.0.0rc1/.gitleaks.toml +30 -0
- god_code-1.0.0rc1/CHANGELOG.md +125 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/PKG-INFO +1 -1
- god_code-1.0.0rc1/docs/plans/2026-04-07-god-code-prelaunch-security-audit-report.md +242 -0
- god_code-1.0.0rc1/docs/plans/2026-04-07-v1.0.0-ux-upgrade-design.md +687 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/agents/configs.py +22 -2
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/commands.py +101 -6
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/streaming.py +4 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/types.py +28 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/config.py +1 -1
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/engine.py +43 -2
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tui/display.py +127 -30
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tui/input_handler.py +9 -3
- {god_code-0.9.2 → god_code-1.0.0rc1}/pyproject.toml +1 -1
- god_code-1.0.0rc1/scripts/install-hooks.sh +37 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/agents/test_dispatcher.py +28 -0
- god_code-1.0.0rc1/tests/llm/test_streaming.py +138 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_config.py +12 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_engine.py +30 -0
- god_code-1.0.0rc1/tests/tui/test_display.py +126 -0
- god_code-0.9.2/CHANGELOG.md +0 -60
- god_code-0.9.2/tests/tui/test_display.py +0 -18
- {god_code-0.9.2 → god_code-1.0.0rc1}/.codetape/component-map.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/.codetape/config.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/.github/FUNDING.yml +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/.github/workflows/docs.yml +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/.github/workflows/publish.yml +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/AGENTS.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/CLAUDE.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/CONTRIBUTING.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/LICENSE +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/PRIVACY.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/README.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/SECURITY.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/cli/ask.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/cli/chat.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/empty-project-to-first-verified-change.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/gameplay-intent-and-enemy-ai-roadmap.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/getting-started/first-run.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/getting-started/install.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/index.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/mcp/overview.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-04-api-backend-design.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-04-api-backend-impl.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-04-bullet-hell-sprite-qa-demo-polish-backlog.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-04-demo-ready-upgrade.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-05-dogfooding-inventory.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-05-v08-design.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-05-v08-impl.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-05-work-status.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-06-auto-flow-impl.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-06-interactive-ux-redesign.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-07-god-code-prelaunch-security-audit-design.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-07-god-code-prelaunch-security-audit.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/providers/byok-and-oauth.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/tui/menu-and-commands.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/tui/settings-and-byok.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/docs/validation/quality-gate.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/addons/god_code_bridge/god_code_bridge.gd +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/addons/god_code_bridge/plugin.cfg +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/agents/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/agents/dispatcher.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/agents/results.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/__main__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/engine_wiring.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/helpers.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/menus.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/entrypoint.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/audio_scaffolder.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/collision_planner.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/consistency_checker.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/dependency_graph.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/gdscript_linter.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/impact_analysis.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/pattern_advisor.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/project.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/resource_validator.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/scene_parser.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/scene_writer.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/tscn_validator.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/ui_layout_advisor.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/variant_codec.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/adapters/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/adapters/anthropic.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/adapters/base.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/adapters/openai.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/client.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/redact.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/vision.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/mcp_server.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/assembler.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/build_discipline.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/genre_templates.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/godot_playbook.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/image_templates.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/knowledge_selector.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/skill_library.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/skill_selector.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/system.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/vision_templates.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/py.typed +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/auth.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/context_health.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/context_manager.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/design_memory.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/error_loop.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/events.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/execution_plan.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/gameplay_reviewer.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/intent_resolver.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/live_client.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/modes.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/oauth.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/playtest_harness.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/polish_rubric.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/providers.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/quality_gate.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/reviewer.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/runtime_bridge.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/bullet_hell_pattern_readability.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/bullet_hell_phase_transition.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/bullet_hell_wave_progression.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/demo_boss_transition.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/demo_combat_feedback.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/demo_ui_readability.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/demo_wave_pacing.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/hud_feedback.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/platformer_enemy_gap_jump.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/platformer_enemy_patrol_response.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/player_movement.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/scene_transition.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/topdown_shooter_flank_resolution.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/topdown_shooter_pressure.json +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/session.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/validation_checks.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/visual_regression.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/classifier.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/hooks.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/policies.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/protected_paths.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/tool_pipeline.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/testing/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/testing/scenario_runner.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/analysis_tools.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/base.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/editor_bridge.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/file_ops.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/git.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/godot_cli.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/image_gen.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/list_dir.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/memory_tool.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/registry.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/runtime_harness.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/scene_tools.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/screenshot.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/script_tools.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/search.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/shell.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/sprite_pipeline.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/sprite_qa.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/vision_analysis.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/vision_scoring.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/web_search.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tui/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/mkdocs.yml +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/scripts/vision_model_comparison.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/skills/god-code-setup/SKILL.md +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/agents/test_playtest_analyst.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/cli/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/cli/test_setup_bridge.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/cli_test_utils.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/e2e/test_planner_worker_reviewer_flow.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/e2e/test_policy_enforcement.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/e2e/test_scenario_runner.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/fuzz/test_input_sequences.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_audio_scaffolder.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_collision_planner.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_consistency.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_dependency_graph.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_impact_analysis.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_linter.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_pattern_advisor.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_project.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_resource_validator.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_scene_parser.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_scene_writer.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_tscn_validator.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_ui_layout_advisor.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_variant_codec.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/llm/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/llm/test_adapters.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/llm/test_client.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/llm/test_vision.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_genre_templates.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_knowledge_selector.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_prompt_assembler.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_skill_selector.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_system_prompt.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_vision_templates.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_context_health.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_context_manager.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_design_memory.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_error_loop.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_execution_plan.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_gameplay_reviewer.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_intent_resolver.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_live_client.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_mode_restrictions.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_multi_agent_flow.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_playtest_harness.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_quality_gate.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_reviewer.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_runtime_bridge.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_session.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_validation_checks.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_visual_regression.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/security/test_classifier.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/security/test_hooks.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/security/test_permissions.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/security/test_tool_pipeline.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_auto_flow.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_cli_config_flow.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_cli_interactive_flows.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_e2e.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_package_compatibility.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_runtime_switch_commands.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_analysis_tools.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_editor_bridge.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_file_ops.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_git.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_godot_cli.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_list_dir.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_memory_tool.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_registry.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_runtime_harness.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_scene_tools.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_screenshot_tool.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_script_tools.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_search.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_shell.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_sprite_qa.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_vision_analysis.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_vision_scoring.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tui/__init__.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tui/test_input_handler.py +0 -0
- {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tui/test_plan_display.py +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Gitleaks config for god-code
|
|
2
|
+
#
|
|
3
|
+
# Purpose: local pre-commit regression prevention against accidental
|
|
4
|
+
# secret commits. Extends gitleaks default ruleset, plus allowlists
|
|
5
|
+
# for known false positives (docs with example tokens, tests of the
|
|
6
|
+
# secret-masking utility).
|
|
7
|
+
#
|
|
8
|
+
# See https://github.com/gitleaks/gitleaks for config reference.
|
|
9
|
+
|
|
10
|
+
[extend]
|
|
11
|
+
useDefault = true
|
|
12
|
+
|
|
13
|
+
[allowlist]
|
|
14
|
+
description = "god-code global allowlist"
|
|
15
|
+
|
|
16
|
+
paths = [
|
|
17
|
+
# Audit artifacts (local only, gitignored)
|
|
18
|
+
'''\.audit/''',
|
|
19
|
+
|
|
20
|
+
# Design docs may contain example API keys in code blocks
|
|
21
|
+
# (e.g. "backend_api_key=gc_live_testkey123" as documentation).
|
|
22
|
+
# Reviewers must still visually scan any new docs/plans/ additions.
|
|
23
|
+
'''docs/plans/.*\.md''',
|
|
24
|
+
|
|
25
|
+
# Tests for the secret-masking utility. These files exist to verify
|
|
26
|
+
# that secret-shaped strings are properly masked for display, so
|
|
27
|
+
# they intentionally contain fake-but-realistic token literals.
|
|
28
|
+
# If you add NEW files that test masking, extend this list.
|
|
29
|
+
'''tests/test_runtime_switch_commands\.py''',
|
|
30
|
+
]
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to God Code will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [1.0.0rc1] — 2026-04-07
|
|
6
|
+
|
|
7
|
+
**v1.0 is the first release where god-code is comfortable to use day-to-day without needing to know its quirks.** This is a coordinated UX overhaul. No new features, no breaking API changes — every change makes the existing tool feel less broken in everyday use.
|
|
8
|
+
|
|
9
|
+
This release closes 27 of 28 UX issues identified in the v1.0 audit (see `docs/plans/2026-04-07-v1.0.0-ux-upgrade-design.md`). The 28th was already fixed in v0.9.2.
|
|
10
|
+
|
|
11
|
+
### Headline fixes
|
|
12
|
+
|
|
13
|
+
- **Streaming "thinking" indicator** — gpt-5.4 with `reasoning_effort=high` has a 30-60s silent reasoning phase before any token streams. Previously you saw an empty cyan panel and assumed god-code was frozen. Now you see a `thinking…` spinner that animates until the first token arrives. (A1)
|
|
14
|
+
- **`max_tokens` default raised from 16384 → 65536** — long technical reports were silently truncated mid-section because the cap was way below gpt-5.4's 128K output capability. Override with `/set max_tokens 16384` if you prefer the old conservative limit. (B1)
|
|
15
|
+
- **Token count works in backend mode** — `_stream_via_backend` was missing `stream_options.include_usage`, so backend-mode users (anyone with `backend_url` + `gc_live_*`) saw `0 tokens / $0.00` after every turn. Now matches direct-mode behaviour. (B5)
|
|
16
|
+
- **Real Ctrl+C cleanup** — cancelled turns no longer leave their partial messages polluting the next turn's context. New `engine.rollback_current_turn()` drops everything appended since the most recent `submit()` began. (C2)
|
|
17
|
+
- **Tool progress spinner** — long-running tools (validation, sprite generation, screenshot — typically 10-60s) now show an auto-animating spinner via `rich.console.status` instead of going silent between `tool: started` and `tool: ok`. (A2)
|
|
18
|
+
- **Planner agent stops claiming "I'm in PLAN mode"** — the planner sub-agent system prompt was triggering an LLM hallucination where the model would announce "我目前是 PLAN 模式" / "I am in plan mode" in its response, confusing users into thinking the CLI was stuck in plan interaction mode. Prompt rewritten to explicitly disavow that wording and clarify the planner is a sub-agent inside god-code. (F1)
|
|
19
|
+
|
|
20
|
+
### Fixed (full list — 27 issues across 11 commits)
|
|
21
|
+
|
|
22
|
+
- **A1** Streaming thinking spinner (`tui/display.py`)
|
|
23
|
+
- **A2** Tool execution status spinner
|
|
24
|
+
- **A3** Blank line between successive streamed turns
|
|
25
|
+
- **A4** Planner sub-agent output bracketed with `Rule` separators
|
|
26
|
+
- **A5** Autosave success/failure events + activity log entries
|
|
27
|
+
- **B1** `max_tokens` default 16384 → 65536
|
|
28
|
+
- **B2 / G2** `tool_result_truncated` event when tool output is silently capped
|
|
29
|
+
- **B3** API error detail bumped 200 → 500 chars with `[…truncated]` marker
|
|
30
|
+
- **B4** Tool args truncated at 100 chars to prevent terminal overflow
|
|
31
|
+
- **B5** Backend streaming now sends `stream_options.include_usage`
|
|
32
|
+
- **C1** Diff read failures emit `diff_failed` event instead of `except: pass`
|
|
33
|
+
- **C2** `rollback_current_turn()` cleans message state after Ctrl+C
|
|
34
|
+
- **C4** Version check offline state surfaced as dim activity line
|
|
35
|
+
- **C5** `is_known_model_pricing()` helper; usage line shows `~$unknown` for unknown models
|
|
36
|
+
- **C6** `/resume <invalid_id>` now actionable error
|
|
37
|
+
- **D1** `god-code setup` confirmation prompt before overwriting existing config
|
|
38
|
+
- **D2** Loud yellow warning when Godot binary auto-detection fails
|
|
39
|
+
- **D3** Welcome panel reduced to 4 essential fields
|
|
40
|
+
- **D4** Multiline continuation prompt cancel hint
|
|
41
|
+
- **E1** `/help` table reorganized into 6 sections
|
|
42
|
+
- **E2** Activity log slice mismatch (10 vs 8) fixed
|
|
43
|
+
- **E4** Mode embedded in input prompt with mode-specific colour
|
|
44
|
+
- **F1** Planner prompt rewrite — disavows "PLAN mode" wording
|
|
45
|
+
- **F2** Planner prompt enforces structured output format
|
|
46
|
+
- **G3** New events: `session_autosaved`, `session_autosave_failed`, `diff_failed`, `version_check_offline`, `turn_cancelled`
|
|
47
|
+
- **H2** Tab-completion hint added to welcome banner
|
|
48
|
+
|
|
49
|
+
### Test count
|
|
50
|
+
|
|
51
|
+
665 → 681 (+16 regression tests across 5 test files)
|
|
52
|
+
|
|
53
|
+
### Known scope notes
|
|
54
|
+
|
|
55
|
+
- **C2 partial implementation** — `rollback_current_turn()` cleans up message state but the full `asyncio.create_task` cancellation pattern (true task termination of in-flight HTTP streams and subprocess tools) is deferred to v1.0.1. The existing CLI flow tests depend on the simpler synchronous-await pattern. In practice CPython's signal handling unwinds the await stack on Ctrl+C correctly, so the user-visible behaviour is fixed even without true task termination.
|
|
56
|
+
- **A2 layer 2 deferred** — universal spinner (Layer 1) ships in v1.0.0; per-tool `tool_progress` events for finer-grained reporting (Layer 2) deferred since they require per-tool instrumentation.
|
|
57
|
+
- **Subprocess termination on cancel deferred** — if a tool has already spawned a subprocess (Godot validation, sprite generation), cancelling the Python coroutine doesn't kill the subprocess. v1.0.1 will add per-tool subprocess registration + termination.
|
|
58
|
+
|
|
59
|
+
### What changed since v0.6.1 (the last PyPI release before v0.9.2)
|
|
60
|
+
|
|
61
|
+
> **PyPI was stuck at v0.6.1 from early April 2026 until v0.9.2 in this same release cycle.** Anyone who installed god-code via `pipx install god-code` between v0.6.1 and v0.9.2 was on a version that predates everything below. v1.0.0rc1 is the first PyPI release that includes all v0.7 / v0.8 / v0.9 / v1.0 work.
|
|
62
|
+
|
|
63
|
+
- **v0.7** — Demo-ready foundation: genre detection (`runtime/intent_resolver.py`), sprite QA pipeline (`tools/sprite_qa.py`), polish rubric, scenario engine (`testing/scenario_runner.py`)
|
|
64
|
+
- **v0.8** — Vision iteration loop (screenshot → analyze → fix → score), live runtime bridge to Godot 4.4 over TCP 9394, backend dual-path LLM client, platform API key auth (`gc_live_*`), CLI package split, ImageChops perf, ValidationSuite
|
|
65
|
+
- **v0.9** — Pre-launch security audit (shell hardening, session paths, MCP path containment, log redaction), OpenAI strict-mode pydantic compatibility, hatch wheel cleanup
|
|
66
|
+
- **v0.9.1** — `assistant_preview` extraction guard against empty LLM responses (was crashing the planner pass)
|
|
67
|
+
- **v0.9.2** — `AgentDispatcher` propagates streaming callbacks to sub-engines (planner pass now streams to TUI instead of blocking 60-120s)
|
|
68
|
+
- **v1.0.0rc1** — this release; the full 27-fix UX overhaul above
|
|
69
|
+
|
|
70
|
+
## [Unreleased]
|
|
71
|
+
|
|
72
|
+
### Security
|
|
73
|
+
- **run_shell hardened** against credential exfiltration: subprocess environment is now filtered to drop any variable whose name contains KEY/TOKEN/SECRET/PASSWORD/PASSWD/CREDENTIAL/AUTH/PRIVATE/CERT, and `env`, `printenv`, `set`, `export`, and reads of `.config/god-code`, `.codex/auth`, `.aws/credentials`, `.ssh/id_*`, `.ssh/authorized_keys`, `.netrc`, `.npmrc`, `.pypirc` are now blocked at all safety levels.
|
|
74
|
+
- **Session files** (`~/.agent_sessions/*.json`) are now `chmod 0o600` on write so tool outputs captured in conversation history are not world-readable.
|
|
75
|
+
- **Atomic secure writes** for `~/.config/god-code/config.json` and `~/.config/god-code/auth.json`: files are created via `tempfile` + `os.fchmod(0o600)` + `os.replace`, eliminating the TOCTOU window where an earlier `write_text` produced a briefly 0o644 file.
|
|
76
|
+
- **MCP server path containment**: every `file_path` argument to MCP tools is validated against the active project root with `Path.relative_to`, and a `.gd/.tscn/.tres/.cfg/.gdshader/.json/.md/.txt/.import` extension allowlist, preventing a misbehaving MCP client from reading or writing arbitrary files such as `~/.config/god-code/config.json`.
|
|
77
|
+
- **Prefix confusion fix** in `file_ops._validate_path`: `startswith` replaced with `Path.relative_to`, so a project rooted at `/proj/my-game` no longer accidentally permits access to `/proj/my-game-secrets/`.
|
|
78
|
+
- **Log redaction** (`godot_agent/llm/redact.py`): a new `redact_secrets` helper masks Bearer tokens, `sk-*` keys, `gc_live_*` keys, and JWT triples in any error string before it is handed to `log.error`/`log.warning`. Applied to backend, streaming, and computer-use error paths in `llm/client.py` and `llm/streaming.py`.
|
|
79
|
+
|
|
80
|
+
### Added
|
|
81
|
+
- Workspace-style chat TUI with session snapshot, recent activity, and live streaming panels
|
|
82
|
+
- Interaction modes (`apply`, `plan`, `explain`, `review`, `fix`) with mode-aware tool availability
|
|
83
|
+
- Autosaved session metadata with `/sessions`, `/resume`, `/new`, and project-aware restore flow
|
|
84
|
+
- Gameplay intent resolver with persistent profile storage in design memory
|
|
85
|
+
- `/intent` commands and TUI intent panel for confirming genre/combat/enemy direction
|
|
86
|
+
- Genre-aware internal skills: `bullet_hell`, `topdown_shooter`, `platformer_enemy`, `tower_defense`, `stealth_guard`
|
|
87
|
+
- Profile-aware playtest selection and report context
|
|
88
|
+
- MkDocs documentation site skeleton with getting-started, TUI, validation, provider, and MCP guides
|
|
89
|
+
|
|
90
|
+
### Changed
|
|
91
|
+
- Unified `ask` and `chat` rendering pipeline, including tool progress and validation feedback
|
|
92
|
+
- Improved post-tool validation visibility and tool result summaries in interactive sessions
|
|
93
|
+
- Session persistence now preserves assistant tool calls and richer metadata for restore
|
|
94
|
+
- Prompt assembly, skill routing, planner/reviewer/playtest flows, and workspace state now consume shared gameplay intent
|
|
95
|
+
|
|
96
|
+
## [0.1.0] - 2026-04-02
|
|
97
|
+
|
|
98
|
+
### Added
|
|
99
|
+
- CLI with `ask`, `chat`, `info`, `login`, `logout`, `status` commands
|
|
100
|
+
- 10 tools: read_file, write_file, edit_file, list_dir, grep, glob, git, run_shell, run_godot, screenshot_scene
|
|
101
|
+
- OpenAI-compatible API client with streaming and vision support
|
|
102
|
+
- OAuth login via Codex CLI refresh token
|
|
103
|
+
- Godot project parser (project.godot, autoloads, resolution)
|
|
104
|
+
- .tscn scene parser, writer, and format validator with auto-fix
|
|
105
|
+
- GDScript linter (naming, ordering, type annotations, anti-patterns)
|
|
106
|
+
- Collision layer planner (standard 8-layer scheme)
|
|
107
|
+
- Cross-file consistency checker (collision, signals, resource paths, groups)
|
|
108
|
+
- Project dependency graph builder
|
|
109
|
+
- Design pattern advisor (object pool, component, state machine)
|
|
110
|
+
- Godot Playbook knowledge system (17 sections, context-aware injection)
|
|
111
|
+
- Build discipline rules (incremental build-and-verify)
|
|
112
|
+
- Error detection loop with Godot output parsing and fix suggestions
|
|
113
|
+
- Conversation context compaction for long sessions
|
|
114
|
+
- Path containment security (file ops restricted to project root)
|
|
115
|
+
- Shell command sandboxing (dangerous pattern blocking)
|
|
116
|
+
- API retry with exponential backoff (429 rate limits)
|
|
117
|
+
- Content filter graceful handling (400 errors)
|
|
118
|
+
- Session persistence to JSON
|
|
119
|
+
|
|
120
|
+
### Security
|
|
121
|
+
- File operations restricted to project root directory
|
|
122
|
+
- Shell commands blocked for dangerous patterns (rm -rf /, sudo, etc.)
|
|
123
|
+
- Git argument parsing via shlex.split()
|
|
124
|
+
- OAuth tokens stored with 600 permissions
|
|
125
|
+
- API key/token masked in status output
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# God Code Pre-launch Security Audit Report
|
|
2
|
+
|
|
3
|
+
**Date completed:** 2026-04-07
|
|
4
|
+
**Auditor:** Claude (Opus 4.6) with user-in-loop decisions
|
|
5
|
+
**Design doc:** [`2026-04-07-god-code-prelaunch-security-audit-design.md`](./2026-04-07-god-code-prelaunch-security-audit-design.md) (`95aef4f`)
|
|
6
|
+
**Plan doc:** [`2026-04-07-god-code-prelaunch-security-audit.md`](./2026-04-07-god-code-prelaunch-security-audit.md) (`b4a4f87`)
|
|
7
|
+
|
|
8
|
+
## Summary
|
|
9
|
+
|
|
10
|
+
**Launch decision: READY.**
|
|
11
|
+
|
|
12
|
+
Three-track audit of `god-code`, `god-code-api`, and `god-code-site` found **zero active security risks**. All three repositories and their published/deployed artifacts are clean of secrets, the backend does not store user content, and the landing page has no tracking or analytics. Pre-launch hardening is complete.
|
|
13
|
+
|
|
14
|
+
**Findings statistics:**
|
|
15
|
+
|
|
16
|
+
| Severity | Count | Status |
|
|
17
|
+
|----------|-------|--------|
|
|
18
|
+
| 🔴 Active leak | 0 | — |
|
|
19
|
+
| 🟠 Serious risk | 0 | — |
|
|
20
|
+
| 🟡 Hygiene | 1 | Corrected (see Audit Correction below) |
|
|
21
|
+
| ℹ️ Informational | 2 | Documented, out of security scope |
|
|
22
|
+
|
|
23
|
+
## Scope
|
|
24
|
+
|
|
25
|
+
Three audit tracks per the design document:
|
|
26
|
+
|
|
27
|
+
- **Track A** — Secrets in repos and published artifacts
|
|
28
|
+
- **Track B** — Deployment secrets and runtime log hygiene
|
|
29
|
+
- **Track C** — User data handling (CLI, backend, waitlist)
|
|
30
|
+
|
|
31
|
+
The following were explicitly out of scope and deferred to post-launch hardening:
|
|
32
|
+
|
|
33
|
+
- CLI local storage upgrade to OS Keychain
|
|
34
|
+
- OAuth device flow between CLI and godcode.dev
|
|
35
|
+
- Website self-serve key issuance
|
|
36
|
+
- CI integration of `gitleaks` (GitHub Actions)
|
|
37
|
+
- Dependency vulnerability scanning (`pip-audit`, `npm audit`)
|
|
38
|
+
- Rate limiting on `/v1/admin/keys`
|
|
39
|
+
- Responsible disclosure program beyond email contact
|
|
40
|
+
|
|
41
|
+
## Track A — Repo and published artifact secrets
|
|
42
|
+
|
|
43
|
+
### A.1 Full-history secret scans (gitleaks)
|
|
44
|
+
|
|
45
|
+
| Repo | Commits scanned | Raw findings | Actionable |
|
|
46
|
+
|------|-----------------|--------------|------------|
|
|
47
|
+
| `god-code` | 110 | 3 | 0 |
|
|
48
|
+
| `god-code-api` | 25 | 1 | 0 |
|
|
49
|
+
| `god-code-site` | 2 | 0 | 0 |
|
|
50
|
+
|
|
51
|
+
All 4 raw findings triaged to false positive:
|
|
52
|
+
|
|
53
|
+
1. `god-code/docs/plans/2026-04-05-v08-impl.md:761` — `gc_live_testkey123` (design doc example)
|
|
54
|
+
2. `god-code/docs/plans/2026-04-05-v08-impl.md:809` — `gc_live_xxx` (curl example)
|
|
55
|
+
3. `god-code/tests/test_runtime_switch_commands.py:108` — `sk-1234567890` (test fixture for the secret-masking function `_format_setting_display_value`)
|
|
56
|
+
4. `god-code-api/tests/util/redact.test.ts:11,16,22,44` — fake JWT/Bearer/sk-/gc_live_ tokens (test fixtures for the `redactSecrets()` utility)
|
|
57
|
+
|
|
58
|
+
All 4 are intentional test fixtures or documentation examples for security-utility code paths. They cannot be removed without breaking the tests that validate the masking/redaction features. They are allowlisted in the per-repo `.gitleaks.toml` files added in Phase 7.
|
|
59
|
+
|
|
60
|
+
### A.2 PyPI wheel inspection
|
|
61
|
+
|
|
62
|
+
- **Published version audited:** 0.6.1 (users currently install this via `pipx install god-code`)
|
|
63
|
+
- **Local repo version at audit time:** 0.9.1 (not yet on PyPI)
|
|
64
|
+
- **Files in 0.6.1 wheel:** 91 (86 under `godot_agent/` package + 5 dist-info)
|
|
65
|
+
- **Sensitive file scan (config.json / auth.json / .env / .key / .pem / agent_sessions / .codetape):** 0 matches
|
|
66
|
+
- **Decision:** Pass. Belt-and-suspenders exclude list added to `pyproject.toml` for future releases (commit `f34b716`).
|
|
67
|
+
|
|
68
|
+
### A.3 Test fixture credential scan
|
|
69
|
+
|
|
70
|
+
- `god-code/tests/`: 0 matches
|
|
71
|
+
- `god-code-api/tests/`: 3 matches (all in `redact.test.ts`, same false-positive pattern as A.1)
|
|
72
|
+
- `god-code-site`: no tests directory
|
|
73
|
+
|
|
74
|
+
### A.4 Environment template files
|
|
75
|
+
|
|
76
|
+
- All 3 repos: **0 `.env.example` / template files found**. Cleanest possible outcome — no risk of a template accidentally containing real values.
|
|
77
|
+
|
|
78
|
+
**Track A verdict:** PASS
|
|
79
|
+
|
|
80
|
+
## Track B — Deployment secrets and log hygiene
|
|
81
|
+
|
|
82
|
+
### B.1 god-code-api secret inventory
|
|
83
|
+
|
|
84
|
+
Deployed secrets (per `wrangler secret list`, post-correction):
|
|
85
|
+
|
|
86
|
+
| Secret | Referenced in source | Status |
|
|
87
|
+
|--------|---------------------|--------|
|
|
88
|
+
| `ADMIN_SECRET` | Yes (admin auth) | OK |
|
|
89
|
+
| `OPENAI_API_KEY` | Yes (provider pool) | OK |
|
|
90
|
+
| `SCORING_API_KEY` | No direct reference | **Reserved** — planned scoring feature (see Audit Correction) |
|
|
91
|
+
|
|
92
|
+
Source-referenced but not currently deployed (functional gap, not security issue):
|
|
93
|
+
|
|
94
|
+
- `ANTHROPIC_API_KEY` — declared in provider pool, not deployed
|
|
95
|
+
- `GEMINI_API_KEY` — declared in provider pool, not deployed
|
|
96
|
+
- `XAI_API_KEY` — declared in provider pool, not deployed
|
|
97
|
+
|
|
98
|
+
Impact: platform-mode callers selecting Claude/Gemini/xAI will receive upstream 401/403 until these are deployed. **Not a security issue** (missing keys = less to leak). Deploy before launch only if the landing page promises those providers in platform mode.
|
|
99
|
+
|
|
100
|
+
### B.2 Workers log hygiene
|
|
101
|
+
|
|
102
|
+
- **`console.*` calls in `src/`:** **0**
|
|
103
|
+
- **`redactSecrets()` utility wired into error paths:** Yes, 4 call sites (lines 305, 338, 358, 369 of `src/index.ts`)
|
|
104
|
+
- **Live `wrangler tail` review:** Not performed. Justification: source audit already confirms zero application logs possible; tail would only capture Cloudflare platform logs outside our control.
|
|
105
|
+
|
|
106
|
+
### B.3 god-code-site Pages env vars
|
|
107
|
+
|
|
108
|
+
- **`import.meta.env.*` references in `src/`:** 0
|
|
109
|
+
- **`process.env.*` references in `src/`:** 0
|
|
110
|
+
- **Secrets embedded in built `dist/`:** 0
|
|
111
|
+
- **Source file count in `src/`:** 1 (`src/pages/index.astro`)
|
|
112
|
+
|
|
113
|
+
Pages dashboard env vars were not inspected via CLI (not possible for CF Pages via wrangler). Not a blocker because source has zero env-var ingestion points.
|
|
114
|
+
|
|
115
|
+
**Track B verdict:** PASS
|
|
116
|
+
|
|
117
|
+
## Track C — User data handling
|
|
118
|
+
|
|
119
|
+
### C.1 D1 schema — content storage check
|
|
120
|
+
|
|
121
|
+
- **Tables defined in schema/:** 5 (`route_decisions`, `quality_alerts`, `quality_scores`, `api_keys`, `usage_log`)
|
|
122
|
+
- **Tables with actual `INSERT INTO` statements in `src/`:** 2 (`api_keys`, `usage_log`)
|
|
123
|
+
- **Tables that store user content:** **0**
|
|
124
|
+
|
|
125
|
+
`api_keys` stores key hashes (not plaintext). `usage_log` stores token counts and metadata (not content). The other three tables are orphan — defined in schema but not written to by current code (informational finding, not security).
|
|
126
|
+
|
|
127
|
+
### C.2 CLI session upload audit
|
|
128
|
+
|
|
129
|
+
- **Network calls in `godot_agent/runtime/session.py`:** 0
|
|
130
|
+
- **`chmod 0o600` on session files:** Yes, already present (pre-existing hardening in v0.9)
|
|
131
|
+
- **What `godot_agent/llm/client.py` sends upstream:** Current-turn messages only. Never reads or uploads the saved session file.
|
|
132
|
+
|
|
133
|
+
### C.3 Waitlist PII minimization
|
|
134
|
+
|
|
135
|
+
- **Before:** KV entries stored `{email, joined_at, source: referer}`. `referer` could contain tracking parameters and campaign IDs.
|
|
136
|
+
- **After:** KV entries store `{email, joined_at}` only.
|
|
137
|
+
- **Implementation:** `src/index.ts` waitlist handler edited to remove `referer` field (commit `4cfcb21`). 152/152 tests pass. Deployed to production.
|
|
138
|
+
- **Historical data cleanup:** No-op. KV was empty at audit time (pre-launch, no real signups yet).
|
|
139
|
+
- **Retention policy:** Until public launch concludes, then purged. Purge procedure documented in `god-code-api/docs/DEPLOYMENT.md`.
|
|
140
|
+
|
|
141
|
+
### C.4 Data flow table
|
|
142
|
+
|
|
143
|
+
Produced in `.audit/data-flow-table.md` and embedded into `god-code/PRIVACY.md`. Covers every data point from CLI to backend to provider, including what is stored where and for how long.
|
|
144
|
+
|
|
145
|
+
**Track C verdict:** PASS
|
|
146
|
+
|
|
147
|
+
## Audit Correction — Finding B1 methodology flaw
|
|
148
|
+
|
|
149
|
+
**What happened**
|
|
150
|
+
|
|
151
|
+
During Phase 3.1, `SCORING_API_KEY` was flagged as an "orphan secret" and a recommendation to delete was made to the user. The recommendation was based on a grep that found zero references to the secret name across `src/`, `tests/`, `wrangler.toml`, and `docs/`. The user approved deletion. After deletion, the user noted that `SCORING_API_KEY` was in fact **reserved for a planned scoring feature** that is not yet wired up in the main branch. The user immediately re-set the secret via `wrangler secret put`. No production code path depended on it during the ~2-minute window of absence, so there was no outage.
|
|
152
|
+
|
|
153
|
+
**Root cause**
|
|
154
|
+
|
|
155
|
+
The audit equated "zero references in current source" with "orphan, safe to delete". These are not the same. A secret with no source references can also mean:
|
|
156
|
+
|
|
157
|
+
- A feature that is planned but not yet implemented
|
|
158
|
+
- A feature that is implemented in a branch or PR but not yet merged
|
|
159
|
+
- A dependency injection pattern where the secret is passed via a different identifier
|
|
160
|
+
- A debugging secret held in reserve for emergency access
|
|
161
|
+
|
|
162
|
+
**Correction applied**
|
|
163
|
+
|
|
164
|
+
- `SCORING_API_KEY` restored by the user
|
|
165
|
+
- `god-code-api/docs/DEPLOYMENT.md` updated to mark the secret as "Reserved for the scoring feature (planned). Do not delete." (commit `f39c65c`)
|
|
166
|
+
- `.audit/track-b-secrets.md` updated with the full incident record and methodology correction
|
|
167
|
+
|
|
168
|
+
**Methodology improvement for future audits**
|
|
169
|
+
|
|
170
|
+
Before recommending deletion of any secret, the auditor must answer all three of the following with "no":
|
|
171
|
+
|
|
172
|
+
1. Is the secret referenced in the current source tree?
|
|
173
|
+
2. Is the secret referenced in any open branch, PR, or design document describing a planned feature?
|
|
174
|
+
3. Does the feature owner confirm that the secret is not reserved for planned work?
|
|
175
|
+
|
|
176
|
+
Only if all three answers are "no" should a secret be flagged for deletion. The default posture should be **conservative retention** — it is cheaper to keep an unused secret than to accidentally remove a reserved one.
|
|
177
|
+
|
|
178
|
+
## Remediation actions applied
|
|
179
|
+
|
|
180
|
+
| Repo | Commit | What |
|
|
181
|
+
|------|--------|------|
|
|
182
|
+
| god-code | `f34b716` | Added hatch wheel exclude list to `pyproject.toml` |
|
|
183
|
+
| god-code-api | `4cfcb21` | Removed `referer` field from waitlist handler |
|
|
184
|
+
| god-code-api | (user) | `wrangler deploy` for the waitlist handler change |
|
|
185
|
+
| god-code-api | `f39c65c` | Corrected `SCORING_API_KEY` classification in `DEPLOYMENT.md` |
|
|
186
|
+
|
|
187
|
+
No git history was rewritten (per design policy: revoke only).
|
|
188
|
+
|
|
189
|
+
## Documentation published
|
|
190
|
+
|
|
191
|
+
| Repo | Artifact | Commit |
|
|
192
|
+
|------|----------|--------|
|
|
193
|
+
| god-code | `SECURITY.md` | `19a7335` |
|
|
194
|
+
| god-code | `PRIVACY.md` | `fd2baab` |
|
|
195
|
+
| god-code-api | `SECURITY.md` | `36a7f03` |
|
|
196
|
+
| god-code-api | `docs/DEPLOYMENT.md` | `c48ddc1` (+ `f39c65c` correction) |
|
|
197
|
+
| god-code-site | `SECURITY.md` | `5dd48b2` |
|
|
198
|
+
| god-code-site | `PRIVACY.md` | `a69a01c` |
|
|
199
|
+
| god-code-site | `docs/DEPLOYMENT.md` | `364e9ed` |
|
|
200
|
+
|
|
201
|
+
## Local regression prevention installed
|
|
202
|
+
|
|
203
|
+
| Repo | `.gitleaks.toml` | `scripts/install-hooks.sh` | Commit |
|
|
204
|
+
|------|------------------|---------------------------|--------|
|
|
205
|
+
| god-code | Yes | Yes | `5589622` |
|
|
206
|
+
| god-code-api | Yes | Yes | `b094e81` |
|
|
207
|
+
| god-code-site | Yes | Yes | `1824ba8` |
|
|
208
|
+
|
|
209
|
+
Each repo's pre-commit hook scans staged changes with `gitleaks protect --staged --config .gitleaks.toml`. Verified live on the initial commit that installed it — zero findings. Any future contributor running `./scripts/install-hooks.sh` after cloning gets the same protection.
|
|
210
|
+
|
|
211
|
+
## Non-goals (deferred to post-launch hardening sprint)
|
|
212
|
+
|
|
213
|
+
- **CLI Keychain storage** — `~/.config/god-code/config.json` remains plain JSON with `chmod 0o600`. Adequate for Level A+B threat model but not Level C (local malware).
|
|
214
|
+
- **OAuth device flow** — replace manual copy-paste key entry with a device-flow authentication between CLI and godcode.dev.
|
|
215
|
+
- **Website self-serve key issuance** — landing page currently only has waitlist, no signup/dashboard for creating `gc_live_*` keys.
|
|
216
|
+
- **CI `gitleaks` integration** — add GitHub Actions workflow to all 3 repos for regression prevention beyond local pre-commit hooks.
|
|
217
|
+
- **Dependency vulnerability scanning** — `pip-audit` for god-code, `npm audit` for god-code-api and god-code-site.
|
|
218
|
+
- **Rate limiting** — `/v1/admin/keys` and other public endpoints currently have no explicit rate limiting beyond Cloudflare's platform defaults.
|
|
219
|
+
- **SCORING_API_KEY full wire-up** — the scoring feature that reserves this secret still needs to be implemented end-to-end.
|
|
220
|
+
- **Missing platform pool keys** — deploy `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, `XAI_API_KEY` if the landing page advertises Claude/Gemini/xAI in platform mode.
|
|
221
|
+
|
|
222
|
+
## Success criteria (from design doc)
|
|
223
|
+
|
|
224
|
+
| Criterion | Met? |
|
|
225
|
+
|-----------|------|
|
|
226
|
+
| Gitleaks full-history scan zero actionable findings | ✅ |
|
|
227
|
+
| PyPI wheel audited, no sensitive files | ✅ |
|
|
228
|
+
| `pyproject.toml` has explicit exclude list, local build clean | ✅ |
|
|
229
|
+
| `wrangler secret list` inspected | ✅ |
|
|
230
|
+
| 3 × SECURITY.md published | ✅ |
|
|
231
|
+
| 2 × PRIVACY.md published with data-flow table | ✅ |
|
|
232
|
+
| 2 × DEPLOYMENT.md published | ✅ |
|
|
233
|
+
| Waitlist PII decision made and applied | ✅ |
|
|
234
|
+
| Local `.gitleaks.toml` + pre-commit hook in all 3 repos | ✅ |
|
|
235
|
+
|
|
236
|
+
All 9 success criteria met.
|
|
237
|
+
|
|
238
|
+
## Final verdict
|
|
239
|
+
|
|
240
|
+
**Pre-launch security audit complete. Launch-ready from a security and privacy standpoint.**
|
|
241
|
+
|
|
242
|
+
Remaining work is product / marketing / release logistics, not security. The audit's posture is **conservative**: zero active risks were found, but the audit explicitly notes what is out of scope so the next security review knows where to dig deeper.
|