- Rename: 00→80 claude-settings-optimizer, 88→79 dintel-skill-update, 92→81 mac-optimizer, 93→82 tui-design-template - Rename: dintel-shared → _dintel-shared (consistent with _ourdigital-shared) - Remove: 61-gtm-manager, 62-gtm-guardian (obsolete), 99_archive - Update all dintel-* skill refs (114 occurrences across 31 files) - Sync README.md, CLAUDE.md, AGENTS.md with new structure Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.6 KiB
2.6 KiB
DTM Wizard — Reference Implementation
The DTM Agent TUI wizard is the first project built with this skill's patterns.
Repository
- Project: D.intelligence Tag Manager Agent
- Location:
github.com/D-intelligence/dintel-gtm-agent - TUI code:
src/dtm/tui/(20 files, ~2500 lines) - Tests:
tools/tests/unit/test_tui_*.py(29 tests)
File Inventory
| File | Lines | Purpose |
|---|---|---|
__init__.py |
13 | Public API |
i18n.py |
93 | 60+ bilingual EN/KR strings |
input.py |
93 | Escape sequence parser |
themes.py |
48 | Norton Commander color scheme |
widgets.py |
35 | Status icons, mini-tables |
breadcrumb.py |
22 | Navigation path bar |
function_bar.py |
33 | F-key shortcut bar |
status_panel.py |
85 | Left panel health display |
menu.py |
35 | Gopher-style numbered menu |
dialog.py |
70 | Modal overlays |
core.py |
100 | Three-tier layout engine |
runner.py |
170 | Event loop + ScreenStack |
selector.py |
156 | Arrow-key list selector |
renderers.py |
~1100 | 15 leaf screen content renderers |
screens/*.py |
~250 | 21 screen definitions |
Screen Hierarchy (21 screens)
home
setup
setup.credentials
setup.account
setup.account.containers (dynamic sub-screen)
setup.ai
setup.connectivity
operations
ops.workflow
ops.container_analysis
ops.ai_analysis
ops.performance
configuration
config.review
config.change_account
config.change_container
config.export
diagnostics
diag.health
diag.test
diag.recommendations
PRs and Evolution
| PR | Title | Key Changes |
|---|---|---|
| #10 | Core TUI redesign | 19 modules, 28 tests |
| #11 | 7 usability fixes | Panel height, no-color, bilingual icons |
| #12 | Interactive selection | Account/container by number, help screen |
| #13 | Name resolution | Resolve IDs to names from API |
| #14 | Loading spinners | Visual feedback during API calls |
| #15 | AI model selector | Ollama + LM Studio detection |
| #16 | Batch UX fixes | ListSelector, export formats, crash fixes |
External Service Detection Pattern
def _detect_lm_studio() -> dict:
"""Detect LM Studio on localhost:1234."""
import requests
try:
resp = requests.get("http://localhost:1234/v1/models", timeout=3)
if resp.status_code == 200:
return {"available": True, "models": [m["id"] for m in resp.json().get("data", [])]}
except Exception:
pass
return {"available": False, "models": []}
This pattern works for any OpenAI-compatible local LLM server.