English | 简体中文
A browser automation execution engine for AI agents and delivery teams. Use one toolkit across
observe -> draft -> validate -> run -> repair, session reuse, and explicit security controls.
TSPlay is built with Go + Playwright and exposes three entry points: Lua CLI / Script, Flow DSL, and MCP Server.
It is designed for work that needs to survive handoff, review, AI generation, and ongoing delivery. Instead of treating browser automation as a pile of one-off scripts, TSPlay keeps the runtime, examples, docs, sessions, repair artifacts, and security boundaries close to each other.
TSPlay is not just a thin wrapper around browser actions. It organizes the capabilities that usually become fragmented in real delivery work:
- page observation and interactive element extraction
- structured Flow drafting, validation, and execution
- failure traces, screenshots, HTML, and DOM snapshots
- login state and browser session reuse
- agent-facing MCP tools with explicit permission boundaries
If you want browser automation that can be maintained over time, generated by AI, reviewed by a team, and delivered reliably, TSPlay is built much closer to that goal.
| If you want to... | Start with | Then continue to |
|---|---|---|
| get the environment working first | 5-Minute Quick Start | docs/tutorials/01-hello-world.md |
| write or fix a Flow | script/demo_baidu.flow.yaml | docs/tutorials/README.md |
| connect Codex or another agent | docs/training/ai-intent-to-flow.md | go run . -action srv |
| learn through step-by-step examples | docs/tutorials/README.md | docs/tutorials/01-hello-world.md |
| plan onboarding or training | docs/training/README.md | docs/training/bootcamp-plan.md |
If this is your first time touching TSPlay, do not choose between Lua / Flow / MCP / binary yet.
Use the default path below and aim for one successful run first.
Prepare:
- Go
1.23.6+ - a machine that can launch Chromium
On the first browser-related run, TSPlay uses a playwright/ folder next to the binary when one is present; otherwise it calls playwright.Install() automatically to download Chromium.
Then run these commands from the repository root:
go mod download
go run . -flow script/tutorials/01_hello_world.flow.yamlIf you want to practice against the local demo pages, open one more terminal:
go run . -action file-srv -addr :8000You are done when:
go run . -flow ...completes successfullyartifacts/contains run outputs- if you started
file-srv,http://127.0.0.1:8000/demo/demo.htmlopens
After the default path works, pick the route that matches your goal.
go run . -flow script/demo_baidu.flow.yamlgo build -o tsplay .
./tsplay -flow script/tutorials/01_hello_world.flow.yaml
./tsplay -action list-assetsgo run . -action srv
go run . -action mcp-tool -tool tsplay.list_actionsGood next commands after that:
go run . -action cligo run . -action srvgo run . -action mcp-tool -tool tsplay.list_actions- docs/README.md for the full docs map
Start with a runnable Flow, then move into the tutorial set and Flow-oriented training materials:
Start with the intent-to-flow path, then use MCP tools to observe, draft, validate, run, and repair:
- docs/training/ai-intent-to-flow.md
go run . -action srvgo run . -action mcp-tool -tool tsplay.list_actions
Start with the training overview, then go deeper into learning paths, labs, bootcamps, and trainer materials:
- Web RPA: login, search, click, upload, download, export
- page data extraction: text, attributes, links, tables, HTML, cookies, storage state
- business workflow automation: variables, control flow, assertions, recovery, resumable runs
- agent browser tooling: let Codex, OpenClaw, and similar models observe a page before drafting, running, and repairing flows
- browser plus external systems: HTTP APIs, Redis, CSV/Excel, databases
Flowis versionable, reviewable, reusable, and much easier for AI to generate strictly- failures automatically preserve trace data, screenshots, HTML, and DOM snapshots for debugging and repair
- sessions can be named, saved, and reused for long-term delivery instead of one-off scripts
- MCP mode comes with security boundaries, which is much safer for agent-facing automation than exposing a raw browser directly
| Mode | Best for | Entry |
|---|---|---|
Lua CLI / Script |
quick debugging, page exploration, one-off tasks | go run . -action cli / go run . -script ... |
Flow DSL |
versioned, reviewable, reusable business workflows that AI can generate | go run . -flow ... |
MCP Server |
exposing observe, draft, execute, repair, and session capabilities to agents | go run . -action srv |
For day-to-day delivery work, Flow should usually be your main path.
Use CLI to explore a page first, and MCP when you want to connect TSPlay to an AI product or agent workflow.
The goal of this matrix is not to force every capability into mechanical 1:1 parity. The point is to separate what should stay aligned across layers and what belongs naturally at the Flow level.
| Capability Area | Typical Actions | Flow | Lua | MCP | Recommendation |
|---|---|---|---|---|---|
| page primitives | navigate, click, type_text, select_option |
Yes | Yes | Yes | Keep aligned |
| file and spreadsheet I/O | screenshot, save_html, read_json, read_csv, read_excel, write_json, write_csv, write_excel, zip_compress, zip_extract |
Yes | Yes | Yes | Keep aligned; constrained by allow_file_access in MCP |
| HTTP requests | http_request, ocr_ready, ocr_request, json_extract |
Yes | Yes | Yes | Keep aligned; Lua inside Flow / MCP also obeys allow_http, allow_file_access, and file-root constraints |
| email delivery | send_email |
Yes | Yes | Yes | Keep aligned; Lua inside Flow / MCP also obeys allow_email |
| Redis operations | redis_get, redis_set, redis_del, redis_incr |
Yes | Yes | Yes | Keep aligned; Lua inside Flow / MCP also obeys allow_redis |
| database operations | db_insert, db_insert_many, db_upsert, db_query, db_query_one, db_execute, db_transaction |
Yes | Yes | Yes | Keep aligned; Lua inside Flow / MCP also obeys allow_database, and db_transaction auto-commits or rolls back |
| browser state | get_storage_state, get_cookies_string, browser.use_session, browser.cdp_* |
Yes | Yes | Yes | Keep aligned; constrained by allow_browser_state in MCP |
| Flow convenience actions | extract_text, assert_visible, assert_text, set_var, append_var |
Yes | Yes | Yes | Already aligned; better treated as orchestration sugar than low-level primitives |
| Flow control flow | retry, if, foreach, on_error, wait_until |
Yes | No | Yes | No need to force parity into Lua |
| Lua callback-style capability | intercept_request |
No | Yes | No | Best kept Lua-only |
Recommended rule of thumb:
- Atomic data actions such as
HTTP / Redis / database / file I/Oshould ideally work in bothFlowandLua, so exploration, productionization, and integration do not drift apart. - Orchestration capabilities such as
retry / foreach / on_error / wait_untilbelong more naturally inFlow DSLand do not need to be translated into Lua extension functions. - Semantic actions such as
extract_text / assert_text / assert_visiblecan start as higher-level Flow actions; if Lua users keep rebuilding the same patterns, then a Lua sugar layer is worth adding.
If you want the capability-action layer explained systematically, start with docs/capability-actions/README.md.
If you want the command-line -action entry points instead, see docs/actions/README.md.
If you only want the shortest setup path, use the 5-Minute Quick Start above first. This section keeps the full command map and detailed notes.
- Go
1.23.6+ - an environment that can run Playwright Chromium
- on the first browser-related run, TSPlay will use an adjacent
playwright/folder when one is present, or callplaywright.Install()automatically to download Chromium
go mod download| What you want to do | Command |
|---|---|
| start the interactive CLI | go run . -action cli |
| run a Lua script | go run . -script script/open_url.lua |
| run a Flow | go run . -flow script/demo_baidu.flow.yaml |
| start the built-in static file server | go run . -action file-srv -addr :8000 |
| call one TSPlay MCP tool directly | go run . -action mcp-tool -tool tsplay.list_actions |
| list macOS screen recording devices | go run . -action list-record-devices |
| record the entire desktop | go run . -action record-screen -record-cmd "go run . -flow script/tutorials/10_assert_page_state.flow.yaml" |
| record only browser-page video | go run . -flow script/tutorials/10_assert_page_state.flow.yaml -browser-video-output artifacts/recordings/lesson-10-assert-page-state.webm |
| list bundled assets inside the binary | go run . -action list-assets |
| extract bundled docs/script/demo assets | go run . -action extract-assets -extract-root ./tsplay-assets |
| start the MCP server | go run . -action srv |
If you want one place that explains every supported command-line -action, start with docs/actions/README.md.
Add -headless if you want to hide the browser window.
To attach to Chrome/Chromium that was already started with --remote-debugging-port=9222, add -browser-cdp-port 9222 to -flow, -script, or -action cli; use -browser-cdp-endpoint when you already have the full CDP endpoint.
-browser-cdp-endpoint accepts ws://127.0.0.1:9222/devtools/browser/..., http://127.0.0.1:9222, and pasted local forms like 127.0.0.1:9222/json/version, 127.0.0.1:9222/json/list, 127.0.0.1:9222/json/new, 127.0.0.1:9222/json/protocol, or 127.0.0.1:9222/devtools/browser/....
If you want TSPlay to make this easy, use -browser-cdp-launch: TSPlay will search common Chrome/Chromium/Edge locations on macOS, Windows, and Linux, launch a separate profile with remote debugging enabled, then attach over CDP. Use -browser-cdp-executable or -browser-cdp-user-data-dir only when you need to override the detected browser or profile directory.
CDP mode is for trusted local automation where you need a real browser environment: a profile that is already logged in, installed extensions, cached site state, or a page that needs manual intervention during a run.
If your current daily Chrome was not started with a remote debugging port, TSPlay cannot safely attach to that exact process. Start a separate Chrome profile instead:
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--remote-debugging-port=9222 \
--user-data-dir="$PWD/artifacts/chrome-cdp-profile"
# Linux
google-chrome \
--remote-debugging-port=9222 \
--user-data-dir="$PWD/artifacts/chrome-cdp-profile"# Windows PowerShell
& "$env:ProgramFiles\Google\Chrome\Application\chrome.exe" `
--remote-debugging-port=9222 `
--user-data-dir="$pwd\artifacts\chrome-cdp-profile"Then attach TSPlay:
go run . -flow script/demo_baidu.flow.yaml -browser-cdp-port 9222For the easiest first run, let TSPlay find Chrome and launch an isolated profile for you:
go run . -flow script/demo_baidu.flow.yaml -browser-cdp-launchImportant behavior:
- external CDP attach disconnects Playwright at the end and leaves the real browser running
cdp_launchstarts a browser owned by TSPlay and cleans it up when the run finishescdp_user_data_diris only forcdp_launch; it defaults under the artifact root- MCP requests that use
browser_cdp_*or Flowbrowser.cdp_*requireallow_browser_state=true - CDP mode cannot be combined with
use_session,storage_state/load_storage_state, persistentprofile/session,user_agent, or-browser-video-output
record-screen captures the entire macOS desktop, which is useful for desktop demos.
-browser-video-output records the Playwright page itself, which is better for browser tutorials.
TSPlay also keeps the page open slightly longer by default so short recordings remain watchable.
For the full instructor workflow, see
docs/training/tutorial-video-recording.md.
When you build ./tsplay, ReadMe.md, docs/, script/, and demo/ are bundled into the binary:
- run a bundled example directly:
./tsplay -script script/tutorials/01_hello_world.lua - run a bundled Flow directly:
./tsplay -flow script/tutorials/01_hello_world.flow.yaml - serve the bundled demo pages directly:
./tsplay -action file-srv -addr :8000 - extract the reference assets to a local directory:
./tsplay -action extract-assets -extract-root ./tsplay-assets
The repository already includes a minimal example:
go run . -flow script/demo_baidu.flow.yamlThe Flow looks roughly like this:
schema_version: "1"
name: baidu_search
vars:
query: 山东大学
steps:
- action: navigate
url: https://www.baidu.com
- action: wait_for_selector
selector: "#kw"
timeout: 5000
- action: type_text
selector: "#kw"
text: "{{query}}"
- action: click
selector: "#su"
- action: wait_for_network_idle
- action: get_all_links
selector: "xpath=//body"
save_as: linksThe run returns structured JSON with variables, step traces, durations, and failure artifact paths when something goes wrong.
Start the CLI:
go run . -action cliThen enter:
start
After that you can execute Lua-style commands directly:
navigate("https://www.baidu.com")
wait_for_network_idle()
type_text("#kw", "山东大学")
click("#su")go run . -action srv
go run . -action srv -addr :8081
go run . -action srv -flow-root script -artifact-root artifacts
go run . -action mcp-stdio -flow-root script -artifact-root artifacts
go run . -action mcp-tool -tool tsplay.list_actions
go run . -action mcp-tool -tool tsplay.observe_page -args-file script/tutorials/113_mcp_observe_page_template_release.args.jsonDefault constraints:
flow_pathcan only read files underscript/unless you change it with-flow-root- file input and output are limited to the artifact root by default
run_flowdefaults toheadless=true
If you want to start from the path where a user describes intent and the model helps draft and run a Flow, begin with docs/training/ai-intent-to-flow.md.
Compared with raw Lua, Flow works better as a long-lived business asset:
- easier for AI to generate strictly
- easier for humans to review and diff
- easier to validate with a schema and return structured issues
- easier to preserve failure context and repair hints
- easier to expose through MCP to agents
Common Flow capabilities include:
- variables:
vars,save_as,set_var,append_var - control flow:
retry,if,foreach,on_error,wait_until - page actions: click, type, wait, assert, screenshot, upload, download
- data actions:
http_request,json_extract,send_email,read_json,read_csv,read_excel,write_json,write_csv,write_excel,zip_compress,zip_extract - browser state:
use_session,storage_state,save_storage_state,cdp_launch,cdp_endpoint,cdp_port
- Chromium automation driven by Playwright
- direct browser control through Lua
- structured Flow in YAML / JSON
- page observation, Flow drafting, validation, execution, and failure repair
- named browser session save, reuse, and export
- data actions such as
redis_get/set/del/incranddb_insert/db_query/db_transaction - automatic failure artifacts including screenshots, HTML, and DOM snapshots
- explicit security boundaries and capability grants through MCP
Every Flow run returns a step trace that usually includes:
action- parameter summary
statusduration_ms- output summary
- current
page_url
When a step fails, TSPlay writes the scene into the artifact root, which defaults to artifacts/.
Common files include:
failure.pngpage.htmldom_snapshot.json
You can change the output directory with:
go run . -flow script/demo_baidu.flow.yaml -artifact-root artifactsTSPlay can run as an MCP server so an agent does not need to read a full HTML page or hand-author selectors directly.
If you want a shorter default path for the model, prefer tsplay.finalize_flow.
If you need finer-grained control, use the full chain:
observe_page -> draft_flow -> validate_flow -> run_flow -> repair_flow_context -> repair_flow.
Common tsplay.finalize_flow statuses:
ready: the Flow can run immediatelyneeds_input: more variables or user input are requiredneeds_permission: a security boundary was hit and additional permission is requiredneeds_repair: the Flow is close, but should be fixed before running
| Group | Tools |
|---|---|
| Flow discovery | tsplay.list_actions, tsplay.flow_schema, tsplay.flow_examples |
| page observation and drafting | tsplay.observe_page, tsplay.draft_flow, tsplay.finalize_flow |
| validation, execution, and repair | tsplay.validate_flow, tsplay.run_flow, tsplay.repair_flow_context, tsplay.repair_flow |
| session management | tsplay.save_session, tsplay.list_sessions, tsplay.get_session, tsplay.export_session_flow_snippet, tsplay.delete_session |
If you want a shorter default path for smaller models or productized integrations, start with:
tsplay.finalize_flow- if
status=ready, runtsplay.run_flow - if
status=needs_permission, grant permissions and calltsplay.finalize_flowagain - if
status=needs_input, provide the missing input and calltsplay.finalize_flowagain - if
status=needs_repair, move intotsplay.validate_flow/tsplay.repair_flow_context/tsplay.repair_flow
If you need finer control, use the full path:
tsplay.flow_schematsplay.flow_examplestsplay.observe_pagetsplay.draft_flowtsplay.validate_flowtsplay.run_flowtsplay.repair_flow_context/tsplay.repair_flowtsplay.save_session
The golden-path tools try to return a unified envelope whose top-level fields usually include:
oktoolsummaryartifactsnext_actionwarningsrun
- use
type_text, notfill - use
save_as, notresult_var - for file I/O, uploads, downloads, and screenshots in MCP mode, pass
allow_file_access=trueor usesecurity_preset=browser_write - set page-level timeout in
browser.timeoutinstead of adding an unsupportedtimeoutdirectly tonavigate - if you are unsure about an action name, check
tsplay.list_actionsandtsplay.flow_schemafirst
If a business flow depends on login state, put browser config at the top of the Flow instead of scattering it across individual steps:
schema_version: "1"
name: admin_orders
browser:
headless: true
use_session: admin
save_storage_state: states/admin-latest.json
timeout: 30000
viewport:
width: 1440
height: 900
steps:
- action: navigate
url: https://example.com/admin/orders
- action: assert_visible
selector: "#orders-table"
timeout: 10000Common browser fields:
headlessuse_sessionstorage_state/storage_state_path/load_storage_statesave_storage_statecdp_launchcdp_endpointcdp_portcdp_executablecdp_user_data_dirpersistentprofilesessiontimeoutuser_agentviewport.width/viewport.height
Notes:
use_sessionexpands automatically from a named session saved withtsplay.save_sessionsave_storage_statesaves the current login state after the Flow finishescdp_launch: truestarts a local Chrome/Chromium/Edge with remote debugging enabled and then attaches over CDP; whencdp_executableis omitted, TSPlay searches common browser locations on macOS, Windows, and Linuxcdp_endpoint/cdp_portattaches to an existing Chromium/Chrome process started with--remote-debugging-port; for examplecdp_port: 9222orcdp_endpoint: "127.0.0.1:9222/json/version"cdp_endpointmay be an HTTP base URL, a WebSocket browser endpoint, or a pasted DevTools helper URL such as/json/version,/json/list,/json/new,/json/protocol, or/devtools/browser/...cdp_user_data_dirselects the independent profile directory forcdp_launch; when omitted, TSPlay creates one under the artifact rootprofile/sessionenables a persistent browser contextpersistent profile/sessioncannot be combined withstorage_stateoruse_session- CDP attach reuses the external browser's default context and first page; TSPlay disconnects Playwright when done and does not close the real browser
- CDP launch is cleaned up by TSPlay when it started the browser process
cdp_launchis the beginner-friendly path: it avoids interrupting the user's daily Chrome window while still using the locally installed Chrome/Chromium/Edge binarycdp_launch/cdp_endpoint/cdp_portcannot be combined withuse_session,storage_state/load_storage_state,persistent/profile/session,user_agent, or-browser-video-output
If you want business users to remember only a single session name, save one first:
{
"name": "admin",
"storage_state_path": "states/admin.json"
}Then write this in later Flows:
browser:
use_session: adminMCP mode is not fully open by default. High-risk capabilities require explicit permission per request.
readonly: default minimum permissionsbrowser_write: enables file I/O and browser-state capabilities, which is suitable for upload, download, screenshots, and storage-state reusefull_automation: enables all MCP security capabilities
Explicit allow_* flags override the corresponding fields inside security_preset.
| Permission Flag | Allows |
|---|---|
allow_lua=true |
lua |
allow_javascript=true |
execute_script, evaluate |
allow_file_access=true |
screenshot, save_html, read_csv, read_excel, upload/download, write_json, write_csv, write_excel, zip_compress, zip_extract |
allow_browser_state=true |
cookies / storage state / browser.use_session / persistent profile / browser.cdp_* and MCP browser_cdp_* |
allow_http=true |
http_request, ocr_ready, ocr_request |
allow_email=true |
send_email |
allow_redis=true |
redis_get, redis_set, redis_del, redis_incr, foreach.with.progress_key |
allow_database=true |
db_insert, db_insert_many, db_upsert, db_query, db_query_one, db_execute, db_transaction |
Additional notes:
- even when file actions are allowed, reads and writes still stay within the artifact root
- relative paths inside top-level
browserconfig are also resolved under the artifact root - CDP attach and launch are treated as browser-state capabilities because they can expose real cookies, extensions, profile data, and logged-in sessions
http_request,redis_*, anddb_*inside Lua inherit the correspondingallow_*constraints when running inside Flow / MCP security contexts- local CLI runs such as
go run . -flow ...remain a more flexible local workflow
TSPlay can place browser automation and data actions inside the same Flow.
You can call external APIs directly with http_request and continue the orchestration with json_extract.
Typical examples:
- OCR or captcha recognition
- internal lookup or patch APIs
- webhook or notification endpoints
Additional notes:
- both
FlowandLuasupporthttp_request - when
Lua http_requestruns inside a Flow / MCP security context, it also obeysallow_http - if
http_requestusessave_pathormultipart_files, Lua follows the sameallow_file_accessconstraints as Flow - in restricted mode, relative paths in
save_pathandmultipart_filesresolve under the configured file root
Useful when you want to send import results, failure summaries, or run-complete notifications directly to business or operations inboxes.
Environment variable conventions:
- default connection:
TSPLAY_EMAIL_* - named connection:
TSPLAY_EMAIL_<NAME>_*
Common fields:
HOST,PORTUSERNAME,PASSWORDFROMTLS_MODE:none,starttls,tlsTIMEOUT_MS
Additional notes:
- both
FlowandLuasupportsend_email send_emailrequiresallow_email=truein restricted Flow / MCP contextssend_emailacceptswith.to,with.cc, andwith.bccas either one email string or a list of email stringssend_emailrequires at least one ofwith.bodyorwith.html- you can either use
connection: qqwith environment variables or puthost,port,username,password,from, andtls_modedirectly underwith.smtp send_emailsupportswith.attachmentsas either a single file path/object or a list of file paths/objects shaped like{path, name?, content_type?}- attachments read local files, so restricted Flow / MCP contexts also require
allow_file_access=true
Redis works well for shared cookies, cursors, deduplication keys, and resumable checkpoints.
Environment variable conventions:
- default connection:
TSPLAY_REDIS_* - named connection:
TSPLAY_REDIS_<NAME>_* - URL form is also supported:
TSPLAY_REDIS_URL,TSPLAY_REDIS_<NAME>_URL
Useful for batch import, chunked execution, and writing results back into a ledger.
read_csvtreats the first non-empty row as the header by defaultread_excelcurrently supports.xlsxwrite_excelcurrently supports.xlsxwrite_excelsupports multi-sheet workbook values shaped likevalue = { sheets = [...] }write_excelwrites numbers and booleans as native Excel cell typesread_excel.rangesupports rectangular ranges such asA2:B20- you can combine
with.start_row,with.limit, andwith.row_number_fieldfor resumable processing
Useful when a Flow needs to package generated reports, unpack a downloaded handoff, or move a folder as one artifact.
- action: zip_compress
file_path: artifacts/reports/run.zip
files:
- artifacts/reports/summary.json
- artifacts/reports/results.csv
folders:
- artifacts/reports/screenshots
password: "{{zip_password}}"
save_as: archive
- action: zip_extract
file_path: "{{archive.file_path}}"
save_path: artifacts/unpacked
password: "{{zip_password}}"Additional notes:
zip_compressaccepts a singlesource_path,file,folder,files,folders,paths, orsourceswith.base_dircontrols the relative paths stored inside the archivezip_extractrejects unsafe archive paths that would escapesave_path- password support uses traditional ZipCrypto compatibility
- restricted Flow / MCP contexts require
allow_file_access=true
Useful when you want to persist structured output directly into tables or query business data during a Flow.
Environment variable conventions:
- default connection:
TSPLAY_DB_* - named connection:
TSPLAY_DB_<NAME>_*
Common supported drivers:
mysqlpgsqlsqlserveroracle
Notes:
- both
FlowandLuasupportdb_insert,db_insert_many,db_upsert,db_query,db_query_one,db_execute, anddb_transaction - when
Lua db_*orLua db_transactionruns inside a Flow / MCP security context, it also obeysallow_database=true db_transactionexecutes inner database actions in one transaction scope, auto-commits on success, and auto-rolls back on failuredb_*actions requireallow_database=truein MCP mode- SQL Server and Oracle require binaries built with the corresponding driver build tags
This README covers project positioning and quick start. Training, enablement, and delivery-oriented materials live under docs/.
| Content | Description | Entry |
|---|---|---|
| docs index | repository-wide documentation map and recommended reading order | docs/README.md |
| skills overview | explains what a Codex skill solves and what TSPlay currently provides | docs/skills/README.md |
| tutorial pyramid overview | explains why the curriculum is organized as four layers instead of a flat lesson list | docs/tutorials/curriculum-overview.zh-CN.md |
| training overview | a single entry for implementers, testers, developers, and trainers | docs/training/README.md |
| AI intent to Flow | hands-on guide for the agent path from user intent to MCP to Flow to execution and repair | docs/training/ai-intent-to-flow.md |
| learning path | roadmap from beginner to MCP integrator / trainer | docs/training/learning-path.md |
| bootcamp plan | 2-day bootcamp and 4-week rollout rhythm | docs/training/bootcamp-plan.md |
| labs | hands-on exercises built on demo/ and script/ |
docs/training/labs.md |
| assessment and certification | scoring dimensions, evidence standards, and graduation criteria | docs/training/assessment.md |
| trainer playbook | preparation, delivery, and retrospective guidance for instructors | docs/training/trainer-playbook.md |
.
├── main.go
├── docs/ # docs index, training system, labs, and trainer materials
├── tsplay_core/ # core engine, Flow, MCP, observation, and repair
├── script/ # Lua and Flow examples
├── demo/ # local demo pages
├── tsplay_test/ # tests and demo resources
└── mcp_test/ # MCP-related experiment code
go test ./...If this is your first time with TSPlay, this reading order works well:
- start with this page to understand the three layers and quick start
- continue with docs/README.md to locate the rest of the materials
- if you want the system view first, read docs/tutorials/curriculum-overview.zh-CN.md
- if you want to learn Flow delivery, focus on docs/training/learning-path.md
- if you want to integrate agents or MCP, focus on docs/training/ai-intent-to-flow.md