tactus 0.29.3__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.3 → tactus-0.30.0}/.github/workflows/release.yml +16 -10
- {tactus-0.29.3 → tactus-0.30.0}/AGENTS.md +4 -0
- {tactus-0.29.3 → tactus-0.30.0}/CHANGELOG.md +11 -0
- {tactus-0.29.3 → tactus-0.30.0}/PKG-INFO +9 -1
- {tactus-0.29.3 → tactus-0.30.0}/README.md +8 -0
- {tactus-0.29.3 → 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.3 → tactus-0.30.0}/pyproject.toml +1 -1
- {tactus-0.29.3 → tactus-0.30.0}/tactus/__init__.py +1 -1
- {tactus-0.29.3 → tactus-0.30.0}/tactus/broker/server.py +295 -3
- {tactus-0.29.3 → 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.3 → tactus-0.30.0}/.claude/agents.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/.gitignore +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/.tactus/config.yml.example +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/IMPLEMENTATION.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/LICENSE +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/Makefile +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/SPECIFICATION.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/TECHNICAL_DEBT.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/behave.ini +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/docs/AGENTS.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/docs/BDD_TESTING.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/docs/CONFIGURATION.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/docs/DURABILITY.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/docs/FILE_IO.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/docs/SANDBOXING.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/docs/STREAMING.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/docs/TOOLS.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/docs/TOOL_ROADMAP.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/docs/development-mode.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/.tactus/config.yml +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/01-basics-hello-world.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/03-basics-parameters.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/04-basics-simple-agent.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/05-basics-multi-model.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/06-basics-streaming.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/07-basics-bedrock.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/08-basics-models.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/09-basics-google-gemini.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/10-feature-state.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/11-feature-message-history.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/12-feature-structured-output.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/13-feature-session.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/14-feature-per-turn-tools-simple.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/14-feature-per-turn-tools.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/15-feature-local-tools.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/16-feature-toolsets-advanced.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/17-feature-toolsets-dsl.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/18-feature-lua-tools-individual.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/18-feature-lua-tools-inline.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/18-feature-lua-tools-toolset.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/19-feature-direct-tool-calls.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/20-bdd-complete.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/20-bdd-complete.tac.bak2 +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/21-bdd-passing.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/21-bdd-passing.tac.bak2 +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/30-eval-simple.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/31-eval-demo.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/32-eval-success-rate.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/33-eval-thresholds.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/34-eval-dataset.jsonl +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/34-eval-dataset.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/35-eval-trace.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/35-eval-trace.tac.bak2 +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/36-eval-advanced.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/37-eval-comprehensive.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/37-eval-comprehensive.tac.bak2 +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/39-model-simple.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/40-mcp-test.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/40-model-text-classifier.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/41-mcp-simple.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/41-model-pytorch.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/43-sub-procedure-simple.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/44-sub-procedure-composition.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/45-sub-procedure-recursive.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/46-checkpoint-explicit.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/47-checkpoint-expensive-ops.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/48-script-mode-simple.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/50-inputs-showcase.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/51-inputs-calculator.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/52-file-io-basics.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/53-tsv-file-io.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/54-json-file-io.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/55-parquet-file-io.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/56-hdf5-file-io.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/57-excel-file-io.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/58-text-file-io.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/60-tool-sources.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/61-inline-toolset-lua.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/62-mcp-toolset-by-server.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/63-toolset-import-from-file.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/64-require-modules.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/65-optional-state-demo.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/66-host-tools-via-broker.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/67-host-tool-source.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/70-mocking-static.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/71-mocking-temporal.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/72-mocking-conditional.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/99-misc-test-loading.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/README.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/app_config.ini +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/data/sample.csv +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/demo_output.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/helpers/math_module.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/helpers/product.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/helpers/string_module.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/helpers/sum.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/helpers/text_tools.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/inventory_summary.tsv +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/mock-config.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/models/README.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/models/create_sentiment_model.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/output_summary.txt +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/test-raw-module.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/test-raw-streaming.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/tools/calculations.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/tools/data_analysis.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/tools/search.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/with_dependencies/README.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/with_dependencies/simple_http_test.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/examples/with_dependencies/time_lookup.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/01_state_management.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/02_checkpointing.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/03_human_in_the_loop.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/04_control_flow.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/05_tool_integration.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/06_retry_logic.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/07_file_operations.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/08_agent_primitives.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/09_workflow_execution.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/10_lua_integration.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/11_storage_backends.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/12_json_operations.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/13_logging.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/14_stage_and_step_tracking.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/15_procedure_calls.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/16_session_management.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/17_lua_dsl_validation.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/18_example_procedures.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/19_ide_server.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/20_parameters.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/21_outputs.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/23_prompts.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/24_bdd_specifications.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/25_bdd_custom_steps.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/26_bdd_evaluation.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/27_default_settings.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/28_custom_prompts.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/29_execution_settings.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/30_session_filters.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/31_matchers.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/32_result_object.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/33_output_type.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/42_model_primitive.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/43_sub_procedure_checkpointing.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/46_explicit_checkpoint.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/48_script_mode.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/51_dspy_lm_config.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/52_dspy_signature.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/53_dspy_module.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/54_dspy_history.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/55_dspy_prediction.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/56_dspy_agent.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/57_chat_assistant.feature +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/documentation/Lua DSL/README.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/environment.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/agent_primitives_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/chat_assistant_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/checkpointing_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/control_flow_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/dspy_agent_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/dspy_history_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/dspy_lm_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/dspy_module_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/dspy_prediction_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/dspy_signature_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/example_procedures_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/file_operations_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/human_in_the_loop_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/ide_server_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/json_operations_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/logging_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/lua_dsl_validation_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/lua_integration_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/mocking_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/procedure_calls_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/result_and_output_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/retry_logic_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/session_management_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/stage_tracking_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/state_management_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/storage_backend_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/support/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/support/harnesses.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/tool_integration_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/features/steps/workflow_execution_steps.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/planning/BROKER_AND_TOOL_RUNNERS.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/scripts/audit_examples_mocking.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/scripts/convert_examples.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/start-web-ide.sh +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/broker_log.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/cli_hitl.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/cli_log.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/cost_collector_log.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/file_storage.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/http_callback_log.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/ide_log.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/lua_tools.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/mcp.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/mcp_manager.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/memory.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/adapters/plugins.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/backends/http_backend.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/backends/model_backend.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/backends/pytorch_backend.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/broker/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/broker/client.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/broker/protocol.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/broker/stdio.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/cli/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/cli/commands/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/config_manager.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/dependencies/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/dependencies/registry.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/dsl_stubs.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/exceptions.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/execution_context.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/lua_sandbox.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/message_history_manager.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/mocking.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/output_validator.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/registry.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/runtime.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/template_resolver.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/core/yaml_parser.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/docker/Dockerfile +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/docker/entrypoint.sh +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/dspy/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/dspy/agent.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/dspy/broker_lm.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/dspy/config.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/dspy/history.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/dspy/module.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/dspy/prediction.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/dspy/signature.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/ide/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/ide/coding_assistant.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/ide/server.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/control.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/file.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/handles.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/host.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/human.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/json.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/log.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/message_history.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/model.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/procedure.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/procedure_callable.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/retry.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/session.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/stage.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/state.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/step.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/system.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/tool.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/tool_handle.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/primitives/toolset.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/protocols/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/protocols/chat_recorder.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/protocols/config.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/protocols/cost.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/protocols/hitl.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/protocols/log_handler.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/protocols/models.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/protocols/result.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/protocols/storage.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/providers/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/providers/base.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/providers/bedrock.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/providers/google.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/providers/openai.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/sandbox/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/sandbox/config.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/sandbox/container_runner.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/sandbox/docker_manager.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/sandbox/entrypoint.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/sandbox/protocol.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/io/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/io/csv.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/io/excel.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/io/file.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/io/fs.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/io/hdf5.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/io/json.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/io/parquet.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/io/tsv.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/loader.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/tac/tactus/tools/done.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/README.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/behave_integration.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/context.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/eval_models.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/evaluation_runner.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/evaluators.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/events.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/gherkin_parser.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/mock_agent.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/mock_dependencies.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/mock_hitl.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/mock_registry.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/mock_tools.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/models.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/pydantic_eval_runner.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/steps/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/steps/builtin.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/steps/custom.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/steps/registry.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/testing/test_runner.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/tracing/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/tracing/trace_manager.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/utils/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/utils/cost_calculator.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/utils/model_pricing.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/utils/safe_file_library.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/utils/safe_libraries.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/LuaLexerBase.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/LuaParserBase.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/README.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/error_listener.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/generated/LuaLexer.interp +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/generated/LuaLexer.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/generated/LuaLexer.tokens +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/generated/LuaLexerBase.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/generated/LuaParser.interp +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/generated/LuaParser.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/generated/LuaParserBase.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/generated/LuaParserVisitor.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/generated/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/grammar/LuaLexer.g4 +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/grammar/LuaParser.g4 +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/semantic_visitor.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus/validation/validator.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/.gitignore +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/BUILD_GUIDE.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/ELECTRON_INTEGRATION.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/README.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/RUN_ELECTRON.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/SETUP_COMPLETE.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/backend/hook-lupa.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/backend/tactus_backend.spec +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/package-lock.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/package.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/preload/preload.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/preload/tsconfig.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/rebuild-and-test.sh +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/resources/app-icon.icns +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/resources/app-icon.ico +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/resources/app-icon.png +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/scripts/build-backend.js +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/scripts/build-frontend.js +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/scripts/generate-icons.sh +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/src/backend-manager.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/src/main.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/src/menu.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-desktop/tsconfig.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/ARCHITECTURE.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/CHANGELOG.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/DEV_MODE.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/QUICK_START.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/README.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/TROUBLESHOOTING.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/README.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/assistant_service.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/assistant_tools.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/chat_server.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/config_server.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/events.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/logging_capture.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/lsp_server.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/requirements.txt +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/test_lsp_server.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/backend/text_editor_tool.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/dev.sh +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/.storybook/main.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/.storybook/preview.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/README.md +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/demo.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/index.html +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/jest.config.js +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/package-lock.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/package.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/postcss.config.js +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/App.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/Editor.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/LSPClient.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/commands/registry.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/AboutDialog.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ChatSidebar.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/PreferencesView.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/chat/ChatInterface.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/chat/MessageInput.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/chat/MessageList.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/preferences/ConfigFieldView.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/preferences/SourceBadge.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/preferences/YamlCodeEditor.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/badge.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/dropdown-menu.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/label.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/select.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/switch.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/tooltip.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/hooks/useChatSSE.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/hooks/useEventStream.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/index.css +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/lib/utils.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/main.tsx +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/types/events.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/types/metadata.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/types/preferences.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/types/results.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/types/tracing.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/utils/yamlSync.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/validation/types.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/tailwind.config.js +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/tsconfig.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/tsconfig.node.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/vite.config.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/package.json +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tactus-ide/start-dev.sh +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/test-ci.sh +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/adapters/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/adapters/test_lua_tools_adapter.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/adapters/test_plugins.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/broker/test_broker_host_tool_source.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/broker/test_broker_integration.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/broker/test_broker_tcp_integration.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/broker/test_broker_tcp_unit.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/broker/test_brokered_lm_unit.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/cli/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/cli/test_cli.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/cli/test_cli_inputs.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/conftest.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/core/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/core/test_config_manager.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/core/test_determinism_safety.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/core/test_lua_sandbox_security.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/core/test_runtime_inputs.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/core/test_script_mode.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/dspy/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/dspy/test_mock_field_normalization.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/dspy/test_module_parameter.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/dspy/test_prediction_messages.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/dspy/test_streaming.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/fixtures/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/fixtures/test_mcp_server.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/integration/test_named_procedures.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/mocks/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/mocks/llm_mocks.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/primitives/test_checkpoint_primitive.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/primitives/test_host_primitive.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/primitives/test_retry_primitive.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/primitives/test_state_primitive.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/primitives/test_system_alert.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/primitives/test_tool_primitive.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/primitives/test_toolset_dsl.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/sandbox/test_container_runner.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/sandbox/test_docker_sandbox_smoke.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/stdlib/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/stdlib/test_loader.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/stdlib/test_require_python.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/test_checkpoints_integration.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/test_mcp_integration.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/test_tracing.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/testing/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/testing/conftest.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/testing/test_all_examples.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/testing/test_e2e.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/testing/test_gherkin_parser.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/testing/test_integration.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/testing/test_models.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/testing/test_runtime_integration.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/testing/test_step_registry.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/utils/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/utils/test_safe_file_library.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/validation/__init__.py +0 -0
- {tactus-0.29.3 → tactus-0.30.0}/tests/validation/test_tool_curried_syntax_disallowed.py +0 -0
|
@@ -123,6 +123,21 @@ jobs:
|
|
|
123
123
|
pip install pyinstaller
|
|
124
124
|
pip install -e .
|
|
125
125
|
|
|
126
|
+
- name: Get release version and update package.json
|
|
127
|
+
id: get_version
|
|
128
|
+
run: |
|
|
129
|
+
# Get the latest tag created by semantic-release
|
|
130
|
+
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
|
|
131
|
+
VERSION=${LATEST_TAG#v} # Remove 'v' prefix
|
|
132
|
+
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
|
133
|
+
echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT
|
|
134
|
+
echo "Found release version: $VERSION"
|
|
135
|
+
|
|
136
|
+
# Update package.json version
|
|
137
|
+
cd tactus-desktop
|
|
138
|
+
npm version $VERSION --no-git-tag-version --allow-same-version
|
|
139
|
+
shell: bash
|
|
140
|
+
|
|
126
141
|
- name: Install Node dependencies (Desktop)
|
|
127
142
|
working-directory: ./tactus-desktop
|
|
128
143
|
run: npm install
|
|
@@ -154,15 +169,6 @@ jobs:
|
|
|
154
169
|
working-directory: ./tactus-desktop
|
|
155
170
|
run: npm run package:linux
|
|
156
171
|
|
|
157
|
-
- name: Get latest release tag
|
|
158
|
-
id: version
|
|
159
|
-
run: |
|
|
160
|
-
# Get the latest tag created by semantic-release
|
|
161
|
-
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
|
|
162
|
-
echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT
|
|
163
|
-
echo "Found release tag: $LATEST_TAG"
|
|
164
|
-
shell: bash
|
|
165
|
-
|
|
166
172
|
- name: Upload Desktop Artifacts to GitHub Artifacts
|
|
167
173
|
uses: actions/upload-artifact@v4
|
|
168
174
|
with:
|
|
@@ -173,7 +179,7 @@ jobs:
|
|
|
173
179
|
if: success()
|
|
174
180
|
uses: softprops/action-gh-release@v1
|
|
175
181
|
with:
|
|
176
|
-
tag_name: ${{ steps.
|
|
182
|
+
tag_name: ${{ steps.get_version.outputs.tag }}
|
|
177
183
|
files: tactus-desktop/dist-electron/*
|
|
178
184
|
fail_on_unmatched_files: false
|
|
179
185
|
env:
|
|
@@ -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:
|
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v0.30.0 (2026-01-15)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## v0.29.4 (2026-01-15)
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
- Sync desktop app version with semantic-release version in filenames
|
|
13
|
+
([`212eec0`](https://github.com/AnthusAI/Tactus/commit/212eec0c179c6b1d3aa47b4d595be91db696f114))
|
|
14
|
+
|
|
15
|
+
|
|
5
16
|
## v0.29.3 (2026-01-15)
|
|
6
17
|
|
|
7
18
|
### Bug Fixes
|
|
@@ -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
|
+
|