tactus 0.29.4__tar.gz → 0.30.0__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.
- {tactus-0.29.4 → tactus-0.30.0}/AGENTS.md +4 -0
- {tactus-0.29.4 → tactus-0.30.0}/CHANGELOG.md +3 -0
- {tactus-0.29.4 → tactus-0.30.0}/PKG-INFO +9 -1
- {tactus-0.29.4 → tactus-0.30.0}/README.md +8 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/02-basics-simple-logic.tac +26 -26
- tactus-0.30.0/features/60_formatting.feature +37 -0
- tactus-0.30.0/features/steps/formatting_steps.py +153 -0
- tactus-0.30.0/planning/FORMATTER.md +48 -0
- {tactus-0.29.4 → tactus-0.30.0}/pyproject.toml +1 -1
- {tactus-0.29.4 → tactus-0.30.0}/tactus/__init__.py +1 -1
- {tactus-0.29.4 → tactus-0.30.0}/tactus/broker/server.py +295 -3
- {tactus-0.29.4 → tactus-0.30.0}/tactus/cli/app.py +51 -0
- tactus-0.30.0/tactus/formatting/__init__.py +7 -0
- tactus-0.30.0/tactus/formatting/formatter.py +437 -0
- tactus-0.30.0/tests/test_formatter.py +77 -0
- {tactus-0.29.4 → tactus-0.30.0}/.claude/agents.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/.github/workflows/release.yml +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/.gitignore +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/.tactus/config.yml.example +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/IMPLEMENTATION.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/LICENSE +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/Makefile +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/SPECIFICATION.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/TECHNICAL_DEBT.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/behave.ini +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/docs/AGENTS.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/docs/BDD_TESTING.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/docs/CONFIGURATION.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/docs/DURABILITY.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/docs/FILE_IO.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/docs/SANDBOXING.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/docs/STREAMING.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/docs/TOOLS.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/docs/TOOL_ROADMAP.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/docs/development-mode.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/.tactus/config.yml +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/01-basics-hello-world.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/03-basics-parameters.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/04-basics-simple-agent.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/05-basics-multi-model.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/06-basics-streaming.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/07-basics-bedrock.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/08-basics-models.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/09-basics-google-gemini.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/10-feature-state.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/11-feature-message-history.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/12-feature-structured-output.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/13-feature-session.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/14-feature-per-turn-tools-simple.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/14-feature-per-turn-tools.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/15-feature-local-tools.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/16-feature-toolsets-advanced.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/17-feature-toolsets-dsl.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/18-feature-lua-tools-individual.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/18-feature-lua-tools-inline.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/18-feature-lua-tools-toolset.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/19-feature-direct-tool-calls.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/20-bdd-complete.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/20-bdd-complete.tac.bak2 +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/21-bdd-passing.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/21-bdd-passing.tac.bak2 +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/30-eval-simple.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/31-eval-demo.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/32-eval-success-rate.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/33-eval-thresholds.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/34-eval-dataset.jsonl +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/34-eval-dataset.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/35-eval-trace.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/35-eval-trace.tac.bak2 +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/36-eval-advanced.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/37-eval-comprehensive.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/37-eval-comprehensive.tac.bak2 +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/39-model-simple.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/40-mcp-test.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/40-model-text-classifier.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/41-mcp-simple.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/41-model-pytorch.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/43-sub-procedure-simple.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/44-sub-procedure-composition.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/45-sub-procedure-recursive.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/46-checkpoint-explicit.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/47-checkpoint-expensive-ops.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/48-script-mode-simple.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/50-inputs-showcase.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/51-inputs-calculator.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/52-file-io-basics.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/53-tsv-file-io.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/54-json-file-io.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/55-parquet-file-io.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/56-hdf5-file-io.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/57-excel-file-io.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/58-text-file-io.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/60-tool-sources.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/61-inline-toolset-lua.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/62-mcp-toolset-by-server.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/63-toolset-import-from-file.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/64-require-modules.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/65-optional-state-demo.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/66-host-tools-via-broker.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/67-host-tool-source.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/70-mocking-static.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/71-mocking-temporal.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/72-mocking-conditional.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/99-misc-test-loading.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/README.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/app_config.ini +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/data/sample.csv +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/demo_output.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/helpers/math_module.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/helpers/product.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/helpers/string_module.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/helpers/sum.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/helpers/text_tools.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/inventory_summary.tsv +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/mock-config.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/models/README.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/models/create_sentiment_model.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/output_summary.txt +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/test-raw-module.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/test-raw-streaming.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/tools/calculations.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/tools/data_analysis.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/tools/search.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/with_dependencies/README.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/with_dependencies/simple_http_test.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/examples/with_dependencies/time_lookup.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/01_state_management.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/02_checkpointing.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/03_human_in_the_loop.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/04_control_flow.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/05_tool_integration.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/06_retry_logic.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/07_file_operations.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/08_agent_primitives.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/09_workflow_execution.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/10_lua_integration.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/11_storage_backends.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/12_json_operations.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/13_logging.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/14_stage_and_step_tracking.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/15_procedure_calls.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/16_session_management.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/17_lua_dsl_validation.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/18_example_procedures.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/19_ide_server.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/20_parameters.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/21_outputs.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/23_prompts.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/24_bdd_specifications.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/25_bdd_custom_steps.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/26_bdd_evaluation.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/27_default_settings.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/28_custom_prompts.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/29_execution_settings.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/30_session_filters.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/31_matchers.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/32_result_object.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/33_output_type.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/42_model_primitive.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/43_sub_procedure_checkpointing.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/46_explicit_checkpoint.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/48_script_mode.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/51_dspy_lm_config.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/52_dspy_signature.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/53_dspy_module.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/54_dspy_history.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/55_dspy_prediction.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/56_dspy_agent.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/57_chat_assistant.feature +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/documentation/Lua DSL/README.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/environment.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/agent_primitives_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/chat_assistant_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/checkpointing_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/control_flow_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_agent_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_history_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_lm_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_module_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_prediction_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_signature_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/example_procedures_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/file_operations_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/human_in_the_loop_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/ide_server_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/json_operations_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/logging_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/lua_dsl_validation_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/lua_integration_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/mocking_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/procedure_calls_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/result_and_output_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/retry_logic_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/session_management_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/stage_tracking_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/state_management_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/storage_backend_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/support/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/support/harnesses.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/tool_integration_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/features/steps/workflow_execution_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/planning/BROKER_AND_TOOL_RUNNERS.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/scripts/audit_examples_mocking.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/scripts/convert_examples.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/start-web-ide.sh +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/broker_log.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/cli_hitl.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/cli_log.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/cost_collector_log.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/file_storage.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/http_callback_log.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/ide_log.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/lua_tools.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/mcp.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/mcp_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/memory.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/plugins.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/backends/http_backend.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/backends/model_backend.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/backends/pytorch_backend.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/broker/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/broker/client.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/broker/protocol.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/broker/stdio.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/cli/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/cli/commands/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/config_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/dependencies/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/dependencies/registry.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/dsl_stubs.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/exceptions.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/execution_context.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/lua_sandbox.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/message_history_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/mocking.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/output_validator.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/registry.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/runtime.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/template_resolver.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/core/yaml_parser.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/docker/Dockerfile +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/docker/entrypoint.sh +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/agent.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/broker_lm.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/config.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/history.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/module.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/prediction.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/signature.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/ide/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/ide/coding_assistant.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/ide/server.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/control.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/file.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/handles.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/host.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/human.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/json.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/log.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/message_history.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/model.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/procedure.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/procedure_callable.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/retry.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/session.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/stage.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/state.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/step.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/system.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/tool.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/tool_handle.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/toolset.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/chat_recorder.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/config.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/cost.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/hitl.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/log_handler.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/models.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/result.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/storage.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/providers/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/providers/base.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/providers/bedrock.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/providers/google.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/providers/openai.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/config.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/container_runner.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/docker_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/entrypoint.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/protocol.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/csv.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/excel.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/file.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/fs.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/hdf5.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/json.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/parquet.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/tsv.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/loader.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/tac/tactus/tools/done.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/README.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/behave_integration.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/context.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/eval_models.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/evaluation_runner.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/evaluators.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/events.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/gherkin_parser.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/mock_agent.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/mock_dependencies.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/mock_hitl.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/mock_registry.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/mock_tools.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/models.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/pydantic_eval_runner.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/steps/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/steps/builtin.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/steps/custom.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/steps/registry.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/test_runner.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/tracing/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/tracing/trace_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/utils/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/utils/cost_calculator.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/utils/model_pricing.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/utils/safe_file_library.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/utils/safe_libraries.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/LuaLexerBase.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/LuaParserBase.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/README.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/error_listener.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaLexer.interp +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaLexer.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaLexer.tokens +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaLexerBase.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaParser.interp +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaParser.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaParserBase.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaParserVisitor.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/grammar/LuaLexer.g4 +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/grammar/LuaParser.g4 +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/semantic_visitor.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/validator.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/.gitignore +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/BUILD_GUIDE.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/ELECTRON_INTEGRATION.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/README.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/RUN_ELECTRON.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/SETUP_COMPLETE.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/backend/hook-lupa.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/backend/tactus_backend.spec +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/package-lock.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/package.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/preload/preload.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/preload/tsconfig.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/rebuild-and-test.sh +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/resources/app-icon.icns +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/resources/app-icon.ico +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/resources/app-icon.png +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/scripts/build-backend.js +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/scripts/build-frontend.js +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/scripts/generate-icons.sh +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/src/backend-manager.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/src/main.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/src/menu.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/tsconfig.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/ARCHITECTURE.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/CHANGELOG.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/DEV_MODE.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/QUICK_START.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/README.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/TROUBLESHOOTING.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/README.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/assistant_service.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/assistant_tools.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/chat_server.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/config_server.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/events.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/logging_capture.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/lsp_server.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/requirements.txt +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/test_lsp_server.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/text_editor_tool.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/dev.sh +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/.storybook/main.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/.storybook/preview.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/README.md +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/demo.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/index.html +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/jest.config.js +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/package-lock.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/package.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/postcss.config.js +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/App.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/Editor.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/LSPClient.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/commands/registry.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/AboutDialog.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ChatSidebar.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/PreferencesView.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/chat/ChatInterface.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/chat/MessageInput.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/chat/MessageList.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/preferences/ConfigFieldView.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/preferences/SourceBadge.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/preferences/YamlCodeEditor.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/badge.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/dropdown-menu.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/label.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/select.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/switch.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/tooltip.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/hooks/useChatSSE.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/hooks/useEventStream.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/index.css +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/lib/utils.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/main.tsx +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/types/events.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/types/metadata.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/types/preferences.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/types/results.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/types/tracing.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/utils/yamlSync.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/validation/types.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/tailwind.config.js +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/tsconfig.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/tsconfig.node.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/vite.config.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/package.json +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/start-dev.sh +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/test-ci.sh +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/adapters/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/adapters/test_lua_tools_adapter.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/adapters/test_plugins.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/broker/test_broker_host_tool_source.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/broker/test_broker_integration.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/broker/test_broker_tcp_integration.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/broker/test_broker_tcp_unit.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/broker/test_brokered_lm_unit.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/cli/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/cli/test_cli.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/cli/test_cli_inputs.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/conftest.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/core/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/core/test_config_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/core/test_determinism_safety.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/core/test_lua_sandbox_security.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/core/test_runtime_inputs.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/core/test_script_mode.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/dspy/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/dspy/test_mock_field_normalization.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/dspy/test_module_parameter.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/dspy/test_prediction_messages.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/dspy/test_streaming.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/fixtures/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/fixtures/test_mcp_server.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/integration/test_named_procedures.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/mocks/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/mocks/llm_mocks.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_checkpoint_primitive.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_host_primitive.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_retry_primitive.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_state_primitive.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_system_alert.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_tool_primitive.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_toolset_dsl.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/sandbox/test_container_runner.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/sandbox/test_docker_sandbox_smoke.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/stdlib/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/stdlib/test_loader.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/stdlib/test_require_python.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/test_checkpoints_integration.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/test_mcp_integration.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/test_tracing.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/testing/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/testing/conftest.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_all_examples.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_e2e.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_gherkin_parser.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_integration.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_models.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_runtime_integration.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_step_registry.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/utils/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/utils/test_safe_file_library.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/validation/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.30.0}/tests/validation/test_tool_curried_syntax_disallowed.py +0 -0
|
@@ -376,6 +376,10 @@ Tactus has two distinct testing mechanisms that serve different purposes:
|
|
|
376
376
|
|
|
377
377
|
The Tactus CLI provides powerful tools for developing and debugging agents.
|
|
378
378
|
|
|
379
|
+
### Formatting `.tac` Files
|
|
380
|
+
|
|
381
|
+
Use `tactus format` to automatically reindent and normalize whitespace in `.tac` files.
|
|
382
|
+
|
|
379
383
|
### Running and Debugging Procedures
|
|
380
384
|
|
|
381
385
|
When you run a procedure with `tactus run`, you get real-time visibility into what's happening:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tactus
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.30.0
|
|
4
4
|
Summary: Tactus: Lua-based DSL for agentic workflows
|
|
5
5
|
Project-URL: Homepage, https://github.com/AnthusAI/Tactus
|
|
6
6
|
Project-URL: Documentation, https://github.com/AnthusAI/Tactus/tree/main/docs
|
|
@@ -1665,6 +1665,12 @@ Agents:
|
|
|
1665
1665
|
# Validate syntax and structure
|
|
1666
1666
|
tactus validate workflow.tac
|
|
1667
1667
|
|
|
1668
|
+
# Format a workflow file (2-space indentation + normalized spacing)
|
|
1669
|
+
tactus format workflow.tac
|
|
1670
|
+
|
|
1671
|
+
# Check formatting without rewriting (exit 1 if changes needed)
|
|
1672
|
+
tactus format workflow.tac --check
|
|
1673
|
+
|
|
1668
1674
|
# Run BDD specifications
|
|
1669
1675
|
tactus test workflow.tac
|
|
1670
1676
|
|
|
@@ -1675,6 +1681,8 @@ tactus test workflow.tac --runs 10
|
|
|
1675
1681
|
tactus eval workflow.tac --runs 10
|
|
1676
1682
|
```
|
|
1677
1683
|
|
|
1684
|
+
The `format` command uses Tactus's Lua parser to reindent and normalize whitespace while preserving the structure of the code.
|
|
1685
|
+
|
|
1678
1686
|
### Understanding Output
|
|
1679
1687
|
|
|
1680
1688
|
The CLI displays several types of events:
|
|
@@ -1614,6 +1614,12 @@ Agents:
|
|
|
1614
1614
|
# Validate syntax and structure
|
|
1615
1615
|
tactus validate workflow.tac
|
|
1616
1616
|
|
|
1617
|
+
# Format a workflow file (2-space indentation + normalized spacing)
|
|
1618
|
+
tactus format workflow.tac
|
|
1619
|
+
|
|
1620
|
+
# Check formatting without rewriting (exit 1 if changes needed)
|
|
1621
|
+
tactus format workflow.tac --check
|
|
1622
|
+
|
|
1617
1623
|
# Run BDD specifications
|
|
1618
1624
|
tactus test workflow.tac
|
|
1619
1625
|
|
|
@@ -1624,6 +1630,8 @@ tactus test workflow.tac --runs 10
|
|
|
1624
1630
|
tactus eval workflow.tac --runs 10
|
|
1625
1631
|
```
|
|
1626
1632
|
|
|
1633
|
+
The `format` command uses Tactus's Lua parser to reindent and normalize whitespace while preserving the structure of the code.
|
|
1634
|
+
|
|
1627
1635
|
### Understanding Output
|
|
1628
1636
|
|
|
1629
1637
|
The CLI displays several types of events:
|
|
@@ -6,36 +6,36 @@ Stages({"start", "middle", "end"})
|
|
|
6
6
|
|
|
7
7
|
-- Procedure with input, output, and state defined inline
|
|
8
8
|
Procedure {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
input = {
|
|
10
|
+
target_count = field.number{required = false, description = "Target counter value", default = 5},
|
|
11
|
+
},
|
|
12
|
+
output = {
|
|
13
|
+
final_count = field.number{required = true, description = "Final counter value"},
|
|
14
|
+
message = field.string{required = true, description = "Status message"},
|
|
15
|
+
},
|
|
16
|
+
function(input)
|
|
17
|
+
-- Initialize
|
|
18
|
+
Stage.set("start")
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
-- Do work
|
|
21
|
+
local target = input.target_count or 5
|
|
22
|
+
for i = 1, target do
|
|
23
|
+
state.counter = i
|
|
24
|
+
end
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
-- Transition to middle
|
|
27
|
+
Stage.set("middle")
|
|
28
|
+
state.message = "halfway"
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
-- Complete
|
|
31
|
+
Stage.set("end")
|
|
32
|
+
state.message = "complete"
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
return {
|
|
35
|
+
final_count = state.counter,
|
|
36
|
+
message = state.message
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
-- BDD Specifications
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
Feature: Formatting
|
|
2
|
+
Formatting produces stable, canonical Lua DSL text.
|
|
3
|
+
|
|
4
|
+
Scenario: Formatting enforces 2-space semantic indentation
|
|
5
|
+
Given a formatting environment
|
|
6
|
+
And a Lua DSL file with formatting issues
|
|
7
|
+
When I run "tactus format" on the file
|
|
8
|
+
Then the format command should succeed
|
|
9
|
+
And the file should be formatted with 2-space indentation
|
|
10
|
+
|
|
11
|
+
Scenario: Formatting is idempotent
|
|
12
|
+
Given a formatting environment
|
|
13
|
+
And a Lua DSL file with formatting issues
|
|
14
|
+
When I run "tactus format" on the file
|
|
15
|
+
And I run "tactus format" on the file
|
|
16
|
+
Then the format command should succeed
|
|
17
|
+
And the file should be unchanged by the second run
|
|
18
|
+
|
|
19
|
+
Scenario: Check mode detects required changes
|
|
20
|
+
Given a formatting environment
|
|
21
|
+
And a Lua DSL file with formatting issues
|
|
22
|
+
When I run "tactus format --check" on the file
|
|
23
|
+
Then the format command should fail
|
|
24
|
+
|
|
25
|
+
Scenario: Check mode passes when formatted
|
|
26
|
+
Given a formatting environment
|
|
27
|
+
And a Lua DSL file with formatting issues
|
|
28
|
+
When I run "tactus format" on the file
|
|
29
|
+
And I run "tactus format --check" on the file
|
|
30
|
+
Then the format command should succeed
|
|
31
|
+
|
|
32
|
+
Scenario: Formatting indents Specifications content
|
|
33
|
+
Given a formatting environment
|
|
34
|
+
And a Lua DSL file with Specifications content needing indentation
|
|
35
|
+
When I run "tactus format" on the file
|
|
36
|
+
Then the format command should succeed
|
|
37
|
+
And the Specifications content should be indented by 2 spaces
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Step definitions for formatting feature.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import subprocess
|
|
6
|
+
import tempfile
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from behave import given, then, when
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@given("a formatting environment")
|
|
13
|
+
def step_impl(context):
|
|
14
|
+
context.last_cli = None
|
|
15
|
+
context.last_formatted_content = None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@given("a Lua DSL file with formatting issues")
|
|
19
|
+
def step_impl(context):
|
|
20
|
+
# Intentionally inconsistent indentation (tabs + wrong nesting).
|
|
21
|
+
context.lua_content = """-- formatting test
|
|
22
|
+
|
|
23
|
+
Procedure {
|
|
24
|
+
\toutput = {
|
|
25
|
+
\tgreeting=field.string{required=true},
|
|
26
|
+
\tcompleted=field.boolean{required=true},
|
|
27
|
+
\t},
|
|
28
|
+
\tfunction(input)
|
|
29
|
+
\tif 1<2 and 3>4 then
|
|
30
|
+
\treturn {greeting="hi",completed=true}
|
|
31
|
+
\tend
|
|
32
|
+
\tend
|
|
33
|
+
}
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
context.temp_file = tempfile.NamedTemporaryFile(mode="w", suffix=".tac", delete=False)
|
|
37
|
+
context.temp_file.write(context.lua_content)
|
|
38
|
+
context.temp_file.close()
|
|
39
|
+
context.lua_file = Path(context.temp_file.name)
|
|
40
|
+
context.expected_formatted = """-- formatting test
|
|
41
|
+
|
|
42
|
+
Procedure {
|
|
43
|
+
output = {
|
|
44
|
+
greeting = field.string{required = true},
|
|
45
|
+
completed = field.boolean{required = true}
|
|
46
|
+
},
|
|
47
|
+
function(input)
|
|
48
|
+
if 1 < 2 and 3 > 4 then
|
|
49
|
+
return {greeting = "hi", completed = true}
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
}
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@given("a Lua DSL file with Specifications content needing indentation")
|
|
57
|
+
def step_impl(context):
|
|
58
|
+
context.lua_content = """Specifications([[
|
|
59
|
+
Feature: Simple State Management
|
|
60
|
+
Test basic state and stage functionality without agents
|
|
61
|
+
]])\n"""
|
|
62
|
+
|
|
63
|
+
context.temp_file = tempfile.NamedTemporaryFile(mode="w", suffix=".tac", delete=False)
|
|
64
|
+
context.temp_file.write(context.lua_content)
|
|
65
|
+
context.temp_file.close()
|
|
66
|
+
context.lua_file = Path(context.temp_file.name)
|
|
67
|
+
|
|
68
|
+
context.expected_specifications_formatted = """Specifications([[
|
|
69
|
+
Feature: Simple State Management
|
|
70
|
+
Test basic state and stage functionality without agents
|
|
71
|
+
]])\n"""
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@when('I run "tactus format" on the file')
|
|
75
|
+
def step_impl(context):
|
|
76
|
+
import sys
|
|
77
|
+
|
|
78
|
+
before = context.lua_file.read_text()
|
|
79
|
+
result = subprocess.run(
|
|
80
|
+
[sys.executable, "-m", "tactus.cli.app", "format", str(context.lua_file)],
|
|
81
|
+
capture_output=True,
|
|
82
|
+
text=True,
|
|
83
|
+
)
|
|
84
|
+
after = context.lua_file.read_text()
|
|
85
|
+
|
|
86
|
+
context.last_cli = result
|
|
87
|
+
context.last_formatted_content = after
|
|
88
|
+
context._before_after = (before, after)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@when('I run "tactus format --check" on the file')
|
|
92
|
+
def step_impl(context):
|
|
93
|
+
import sys
|
|
94
|
+
|
|
95
|
+
result = subprocess.run(
|
|
96
|
+
[
|
|
97
|
+
sys.executable,
|
|
98
|
+
"-m",
|
|
99
|
+
"tactus.cli.app",
|
|
100
|
+
"format",
|
|
101
|
+
"--check",
|
|
102
|
+
str(context.lua_file),
|
|
103
|
+
],
|
|
104
|
+
capture_output=True,
|
|
105
|
+
text=True,
|
|
106
|
+
)
|
|
107
|
+
context.last_cli = result
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@then("the format command should succeed")
|
|
111
|
+
def step_impl(context):
|
|
112
|
+
assert context.last_cli is not None, "No command was run"
|
|
113
|
+
assert (
|
|
114
|
+
context.last_cli.returncode == 0
|
|
115
|
+
), f"Command failed: {context.last_cli.returncode}\nSTDOUT:\n{context.last_cli.stdout}\nSTDERR:\n{context.last_cli.stderr}"
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@then("the format command should fail")
|
|
119
|
+
def step_impl(context):
|
|
120
|
+
assert context.last_cli is not None, "No command was run"
|
|
121
|
+
assert context.last_cli.returncode != 0, "Command unexpectedly succeeded"
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@then("the file should be formatted with 2-space indentation")
|
|
125
|
+
def step_impl(context):
|
|
126
|
+
content = context.lua_file.read_text().splitlines()
|
|
127
|
+
# Ensure no tabs remain at line starts and indentation uses multiples of 2.
|
|
128
|
+
for line in content:
|
|
129
|
+
stripped = line.lstrip(" \t")
|
|
130
|
+
if stripped == "":
|
|
131
|
+
continue
|
|
132
|
+
leading = line[: len(line) - len(stripped)]
|
|
133
|
+
assert "\t" not in leading, f"Found tab indentation: {line!r}"
|
|
134
|
+
assert len(leading) % 2 == 0, f"Indentation is not a multiple of 2 spaces: {line!r}"
|
|
135
|
+
|
|
136
|
+
assert (
|
|
137
|
+
context.lua_file.read_text() == context.expected_formatted
|
|
138
|
+
), "Formatted output did not match expected canonical indentation"
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@then("the file should be unchanged by the second run")
|
|
142
|
+
def step_impl(context):
|
|
143
|
+
before, after = context._before_after
|
|
144
|
+
assert (
|
|
145
|
+
before == after
|
|
146
|
+
), "Second formatting run changed file content (formatter is not idempotent)"
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
@then("the Specifications content should be indented by 2 spaces")
|
|
150
|
+
def step_impl(context):
|
|
151
|
+
assert (
|
|
152
|
+
context.lua_file.read_text() == context.expected_specifications_formatted
|
|
153
|
+
), "Specifications content did not match expected indentation"
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Formatter Roadmap (Lua DSL)
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Provide a stable formatter for `.tac` / `.lua` that preserves meaning, keeps comments, and converges to a single canonical style. This should be developed BDD-first with idempotence guarantees from the start.
|
|
6
|
+
|
|
7
|
+
## Milestones
|
|
8
|
+
|
|
9
|
+
### Milestone A: Semantic Indentation Formatter
|
|
10
|
+
|
|
11
|
+
Primary requirement:
|
|
12
|
+
- Enforce 2-space indentation based on syntactic structure (not lexical heuristics).
|
|
13
|
+
|
|
14
|
+
Scope:
|
|
15
|
+
- Reindent lines using the ANTLR token stream / parse result.
|
|
16
|
+
- Preserve existing line breaks and token spelling.
|
|
17
|
+
- Preserve comments and avoid rewriting inside multi-line comments/strings.
|
|
18
|
+
- Idempotent output (formatting twice yields the same file).
|
|
19
|
+
|
|
20
|
+
Non-goals:
|
|
21
|
+
- Line wrapping, alignment, or spacing normalization beyond indentation.
|
|
22
|
+
|
|
23
|
+
### Milestone B: Canonical Pretty Printer
|
|
24
|
+
|
|
25
|
+
Primary requirement:
|
|
26
|
+
- Black-like canonical formatting beyond indentation.
|
|
27
|
+
|
|
28
|
+
Scope (incremental):
|
|
29
|
+
- Normalize spaces around operators, commas, braces/parens.
|
|
30
|
+
- Canonical table formatting (inline vs multiline decisions).
|
|
31
|
+
- Stable line breaking within a configured line length.
|
|
32
|
+
- Robust comment attachment and placement.
|
|
33
|
+
- Preserve (or consistently normalize) string literal forms where safe.
|
|
34
|
+
|
|
35
|
+
Non-goals:
|
|
36
|
+
- Formatting arbitrary Lua “perfectly” in the first iteration; prioritize the Tactus DSL subset and expand.
|
|
37
|
+
|
|
38
|
+
## Test Strategy (BDD + Pytest)
|
|
39
|
+
|
|
40
|
+
- Behave scenarios:
|
|
41
|
+
- `tactus format` rewrites indentation to 2 spaces.
|
|
42
|
+
- `tactus format --check` fails when changes are needed.
|
|
43
|
+
- Idempotence: running `tactus format` twice does not change output.
|
|
44
|
+
- Pytest unit tests:
|
|
45
|
+
- Idempotence at the formatter API level.
|
|
46
|
+
- Representative fixtures for nested blocks and tables.
|
|
47
|
+
- Negative tests (invalid input should not be formatted).
|
|
48
|
+
|