fluttersdk_telescope 0.0.3
fluttersdk_telescope: ^0.0.3 copied to clipboard
Passive runtime inspector for Flutter. Captures HTTP, logs, exceptions, DB queries, and Magic events via VM Service extensions. CLI tail and MCP tools for Claude Code.
Changelog #
All notable changes to this project will be documented in this file.
This project follows Semantic Versioning 2.0.0. Entries follow the Keep a Changelog shape.
[Unreleased] #
0.0.3 - 2026-05-28 #
Added #
- Skill v0.0.3: new
## 8. Community: star + issue (optional, once per session)section inskills/fluttersdk-telescope/SKILL.mdplus a newskills/fluttersdk-telescope/references/community.mdreference page. Trigger split: star CTA fires after the user confirms a telescope task end-to-end (captured HTTP record after a gesture, level-filtered tail slice, surfaced uncaught exception,clear-then-repro delta, or cleantelescope:install); issue CTA fires only on a genuine telescope-side bug (malformed MCP envelope,kInvalidParamsfor documented params,TelescopeStorelosing entries before the 500-cap,clearreturning anything but{"cleared": true}, shipped watchers throwing on a clean install,telescope:installexiting non-zero on a fresh consumer, orregisterExtensionIdempotentviolating idempotency). Issue CTA explicitly excludes the documented wired-but-empty buffers, swallowedtry / catchinvisibility, consumer-app exceptions, rawdart:io HttpClienttraffic gaps, the missingtelescope_modelsMCP tool, and FIFO eviction past 500. Preflight gates onghpresence and auth; failure prints the URL only, noopen/xdg-open/start. Both CTAs are prose-permission (notAskUserQuestion), maximum one star and one issue per session, declining one suppresses only that CTA. Labels: onlybugis applied (theagent-reportedlabel does not exist onfluttersdk/telescope, drop the flag). - Repo flow adopted GitHub Flow (single long-lived
master; retired thedevelopaccumulator).CLAUDE.mdand.github/copilot-instructions.mdnow carry Golden Rule 7 plus a## Branchingsection documenting task-branch naming, squash-merge policy, and the release-tag shape.delete_branch_on_merge: trueenabled on origin so merged branches auto-cleanup.
Changed #
fluttersdk_artisanconstraint bumped^0.0.4->^0.0.6. Consumers were already pulling 0.0.6 transitively (via the post-installfluttersdk_artisan: anyline the telescope:install bootstrap appends to the consumer pubspec); telescope's own dev resolution now tracks the same version so tests, format, andpub publish --dry-runrun against the artisan that consumers actually execute. Picks up the 0.0.5 + 0.0.6 fixes:_plugins.g.dartAOT staleness detection, MCPserverInfo.versionsync to0.0.6, atomic.mcp.jsonwrites via.tmp+ rename, themcp:install --invocationplugin-aware fallback, and thedusk_evaluateVM-routed fix. Future artisan 0.0.7 will need a coordinated bump.telescope_*MCP tool descriptions now state the actual wire shape ("oldest-first; last entry is newest"). Previously seven of the eight read tools claimed "Returns newest-first" while the handler delivered oldest-first; the SKILL.md Law 5 disclaimer ("presenter shorthand") that papered over the gap has been retired. Clients reading the description verbatim no longer assume a reversed order.mcp:installfallback now writesdart run fluttersdk_telescope mcp:servewhenbin/fsais absent (via the wrapper's--invocationpass-through to artisan'smcp:install, gated on the 0.0.6 trim-whitespace behavior).telescope:installno longer depends on the AOT-compiledbin/fsa. The chained subprocess calls (install+plugin:install fluttersdk_telescope) now spawndart run fluttersdk_telescope ...directly through the telescope CLI wrapper, mirroring the Cat C subprocess pattern landed influttersdk_dusk. Consumers on a clean checkout (where fsa has not been compiled yet) can complete the bootstrap chain without aProcessException: No such file or directoryfailure. Behavior delta: even consumers withbin/fsascaffolded now invokeplugin:installthroughdart run(a few seconds slower than the fsa AOT proxy on a singletelescope:installinvocation). RequiresdartonPATH(always true on a Flutter dev box). Matches dusk's unconditionaldart runpattern for cross-plugin consistency.
Fixed #
telescope_clearMCP descriptor claimed it cleared "three ring buffers (http, logs, exceptions)" but the implementation has always wiped all 9 buffers atomically (per Core Law 6). Rewrote the description and Usage bullets inlib/src/telescope_artisan_provider.dartto enumerate the 9 buffers (http, logs, exceptions, events, gates, dumps, queries, caches, magic models), document the{"cleared": true}envelope, and make the upstream-sink isolation (Sentry, Bugsnag still receive events) explicit. The wire behavior was already correct; this is a descriptor-string fix only.bin/fluttersdk_telescope.dartnow forcescollectMcpTools: truewhen dispatchingmcp:serve, sodart run fluttersdk_telescope mcp:servesurfaces all 9telescope_*MCP tools. Previously returned 0 plugin tools.
0.0.2 - 2026-05-22 #
Fixed #
- CHANGELOG correction. The
0.0.1archive on pub.dev shipped with a populated[Unreleased]block left over from release prep: every entry listed there (magic dev-dep drop,pubspec_overrides.yamlremoval,test/src/magic/deletion,magictag cleanup indart_test.yaml+ CI workflows + agent-instruction files,example_magic/removal, sub-barrel import path swap intelescope:install) actually shipped INSIDE0.0.1; nothing was published before it. This0.0.2republishes the corrected CHANGELOG so the consolidated0.0.1history surfaces on pub.dev. - README pinned-install snippet bumped from
^0.0.1to^0.0.2so the example matches the published version.
Unchanged #
- No code, no test, no runtime behavior, no public API surface changed.
lib/,bin/,test/,example/, and all 11ext.telescope.*VM Service extensions plus 9telescope_*MCP tools are byte-identical to0.0.1.
0.0.1 - 2026-05-22 #
Initial public release of fluttersdk_telescope. Passive runtime inspector for Flutter apps with a framework-agnostic core and optional Magic-stack integration. Plugin of fluttersdk_artisan ^0.0.4 (hosted-only; no path overrides). Vanilla-Flutter clean: zero magic references in the production or default-test surface. Magic-stack integration is opt-in via runtime detection in telescope:install, which injects import 'package:magic/telescope_integration.dart'; and an if (kDebugMode) MagicTelescopeIntegration.install(); block after await Magic.init( when the consumer's pubspec lists magic:.
Watchers #
9 watchers across vanilla Flutter and Magic-stack:
LogWatcher(auto-installed):package:loggingLogger calls captured to thelogsring buffer.ExceptionWatcher:FlutterError.onError+PlatformDispatcher.instance.onError, chain-preserve previous handlers.DumpWatcher:debugPrintcapture (vanilla Flutter); debug-only.MagicHttpFacadeAdapter: MagicHttpfacade interceptor.MagicModelWatcher:ModelCreated/ModelSaved/ModelDeletedevents from Magic.MagicCacheWatcher:CacheHit/CacheMiss/CachePut/CacheForget/CacheFlushevents.MagicEventWatcher: curated event subscription (auth, db connection, gate-define).MagicGateWatcher:GateAccessCheckedevent after everyGate.allows/Gate.denies.MagicQueryWatcher:QueryExecutedevent from the magic database connector.
Records #
9 immutable record types: HttpRequestRecord, LogRecordEntry, ExceptionRecord, MagicModelRecord, MagicCacheRecord, EventRecord, GateRecord, DumpRecord, QueryRecord.
9-buffer TelescopeStore #
Per-buffer Queue
VM Service extensions (11) #
ext.telescope.requests, .console, .exceptions, .events, .gates, .dumps, .queries, .caches, .clear, .pause, .resume. Every registration goes through registerExtensionIdempotent (from fluttersdk_artisan) for hot-restart safety.
MCP tools (9) #
telescope_tail, telescope_requests, telescope_exceptions, telescope_clear, telescope_events, telescope_gates, telescope_dumps, telescope_queries, telescope_caches. Each is a McpToolDescriptor const instance contributed via TelescopeArtisanProvider.mcpTools().
CLI commands (6) #
telescope:install, telescope:tail, telescope:requests, telescope:queries, telescope:caches, telescope:clear. telescope:install is a one-shot bootstrap that scaffolds the consumer artisan harness, runs plugin:install fluttersdk_telescope, and injects TelescopePlugin.install() into lib/main.dart (Magic-stack anchor or vanilla runApp anchor).
Three public contracts #
TelescopeWatcher:namegetter +install()+uninstall().TelescopeHttpAdapter: same 3-method shape + optionalpendingCountgetter (default 0).McpToolDescriptor: const-constructible; shape owned byfluttersdk_artisan.
TelescopeStore extension surface #
pendingHttpCountgetter sumsTelescopeHttpAdapter.pendingCountacross every registered adapter; consumed byext.dusk.wait_for_network_idlefor network-idle detection.
CI + automated publishing #
.github/workflows/ci.yml: format + analyze + flutter test (--exclude-tags integration) + 80% line-coverage floor (lcov + awk gate) + codecov upload + dart pub publish --dry-run..github/workflows/publish.yml: SemVer tag push triggers validate -> pub.dev publish via the officialdart-lang/setup-dart/.github/workflows/publish.yml@v1reusable workflow with OIDC authentication + github-release job auto-extracting CHANGELOG entry..github/dependabot.yml: weekly pub root + weekly github-actions bumps.
Documentation #
README.mdtwo-path Quick Start (one-shot self-bootstrap viadart run fluttersdk_telescope telescope:install; manual wiring for consumers who prefer to drive the artisan dispatcher by hand). After install, the consumer's./bin/fsanative AOT launcher is the recommended entry point for every subsequent telescope command.doc/tree:getting-started/,watchers/,mcp/.llms.txtat repo root per llmstxt.org spec.skills/fluttersdk-telescope/LLM-agent skill (SKILL.md + 2 references).
Compatibility #
- Dart SDK >=3.4.0 <4.0.0; Flutter >=3.22.0.
- Platforms: Android, iOS, macOS, Linux, Windows, Web (debug-only on every platform; release builds tree-shake the entire telescope subsystem via
kDebugModegate). - Magic-stack integration optional. Vanilla Flutter consumers use Dio adapter + LogWatcher + ExceptionWatcher + DumpWatcher with no Magic dependency.
Test coverage #
249 tests green at release time across watchers, records, commands, extensions, and the artisan provider. 80% line coverage floor enforced in CI (current measured coverage 95.60%).