tileflow 0.1.0-alpha.5 → 0.1.0-alpha.6
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.
- package/README.md +148 -699
- package/docs/agent-icon-composition.md +49 -0
- package/docs/build-artifacts.md +33 -0
- package/docs/cli-setup-and-defaults.md +56 -0
- package/docs/command-families.md +18 -0
- package/docs/coordinates.md +68 -0
- package/docs/deterministic-agent-diagnostics.md +47 -0
- package/docs/hosted-authentication-and-deploy.md +190 -0
- package/docs/inspect-vector-features.md +19 -0
- package/docs/local-visual-feedback.md +268 -0
- package/docs/read-only-icon-comparison.md +69 -0
- package/package.json +8 -7
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Agent icon composition
|
|
2
|
+
|
|
3
|
+
Start with the [tileflow guide](https://github.com/tileflow/tileflow-sdk/blob/main/packages/cli/README.md) for installation and a complete first example.
|
|
4
|
+
|
|
5
|
+
List the effective local catalog used by the exported map:
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npx tileflow icons list --json
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
The successful stdout contract is one deterministic JSON document followed by exactly one newline.
|
|
12
|
+
Its top-level fields, in order, are `schemaVersion: 2`, `pathBase: "cwd"`, and `maps`.
|
|
13
|
+
Schema version 2 is a compatibility boundary: removing or renaming a field or changing an enum's
|
|
14
|
+
meaning requires a new schema version. Additive optional fields require corresponding documentation
|
|
15
|
+
and tests.
|
|
16
|
+
|
|
17
|
+
Each sorted map entry has one `id` and an `icons` value. `icons.kind` is `none` for `icons: []`, or
|
|
18
|
+
`directories` for a prepared ordered composition. A directory entry contains:
|
|
19
|
+
|
|
20
|
+
- `directories`, in the exact left-to-right authoring order, using config-relative paths or safe
|
|
21
|
+
`npm:<package>/<path>` descriptors;
|
|
22
|
+
- `finalIds`, the sorted canonical lower-kebab IDs in the resulting sprite;
|
|
23
|
+
- `replacements`, with the replaced path and winning path for every later exact-ID replacement;
|
|
24
|
+
- `sources`, with the winning ID, cwd-relative path, format, byte length, and intrinsic dimensions;
|
|
25
|
+
- `insideWorkingTree`; and
|
|
26
|
+
- the deterministic generated `packageHash`.
|
|
27
|
+
|
|
28
|
+
There is deliberately no parallel catalog registry, provider kind, semantic mapping, external
|
|
29
|
+
sprite branch, or arbitrary source-to-runtime renaming. `<id>.<ext>` publishes `<id>` and the
|
|
30
|
+
reserved pattern form `<id>.pattern.<ext>` also publishes `<id>`. This lets an
|
|
31
|
+
agent answer “which directory wins this icon?” directly from one map record without reconstructing
|
|
32
|
+
hidden provider state. Use `--map <id>` to select one exact map when internal orchestration supplies
|
|
33
|
+
more than one.
|
|
34
|
+
|
|
35
|
+
All reported paths are relative to the invocation working directory. A source outside that tree
|
|
36
|
+
uses `../` and `insideWorkingTree: false`; no absolute path is emitted. Listing follows local
|
|
37
|
+
authoring semantics. Run `npx tileflow validate --target hosted` separately before a
|
|
38
|
+
hosted deploy to check containment, portable IDs, SVG safety, and hosted limits.
|
|
39
|
+
|
|
40
|
+
The Tileflow command performs no authentication, network request, browser/server launch, or file
|
|
41
|
+
write. It removes an ambient `TILEFLOW_API_KEY` before importing config. As with every config-aware
|
|
42
|
+
command, loading `tileflow.config.ts` executes repository code and is not a sandbox; side effects in
|
|
43
|
+
that code remain the repository's responsibility. Success emits no ANSI or progress prose. Usage,
|
|
44
|
+
config, source, decode, and render failures exit 1, write diagnostics to stderr, and leave stdout
|
|
45
|
+
empty.
|
|
46
|
+
|
|
47
|
+
The output contains no source contents or source hash, rendered cells, atlas coordinates,
|
|
48
|
+
image/base64 payload, credential, timestamp, random value, or absolute path. Open a reported local
|
|
49
|
+
source path with normal repository tools only when the pixels themselves are needed.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Build artifacts
|
|
2
|
+
|
|
3
|
+
Start with the [tileflow guide](https://github.com/tileflow/tileflow-sdk/blob/main/packages/cli/README.md) for installation and a complete first example.
|
|
4
|
+
|
|
5
|
+
`tileflow build` resolves the exported map lineage, validates executable config and MapLibre
|
|
6
|
+
semantics, compiles its ordered package/local icon directories and selected text provider, and
|
|
7
|
+
writes `manifest.json`, one `styles/<map>/<theme>.json` per concrete appearance, and every referenced
|
|
8
|
+
sprite/font asset. The manifest records `defaultTheme`, optional `systemThemes`, and the exact theme
|
|
9
|
+
catalog; it never flattens a default into a second style alias. A
|
|
10
|
+
map with text has exactly one provider: local/package `fonts` directories or a `glyphs` descriptor
|
|
11
|
+
whose `fontStacks` are explicit. The default output is `dist/tileflow`; choose another directory
|
|
12
|
+
explicitly with `--out`:
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
npx tileflow build --out public/tileflow
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Named hosted sources with `local` archives are for account-free validation, development, preview,
|
|
19
|
+
and capture. `tileflow build` rejects them instead of copying, publishing, or taking ownership of
|
|
20
|
+
user data. For production, either publish managed data explicitly with `tileset publish` or serve
|
|
21
|
+
it from infrastructure owned by the application. A local declaration never selects either path
|
|
22
|
+
implicitly.
|
|
23
|
+
|
|
24
|
+
Preview, capture, and the React/Vue/Svelte adapters register Tileflow's local PMTiles protocol
|
|
25
|
+
before MapLibre reads the compiled Style. Its URL is stable by logical tileset ID; physical local
|
|
26
|
+
snapshot generations do not change Style identity. Standalone Capture retains one snapshot for the
|
|
27
|
+
render. Application Capture uses the application's server; Tileflow's local handler provides
|
|
28
|
+
immutable, ETag-guarded PMTiles reads, but does not freeze every local dataset for the complete
|
|
29
|
+
screenshot window.
|
|
30
|
+
|
|
31
|
+
Build is local and credential-free. Hosted compatibility is a separate
|
|
32
|
+
`tileflow validate --target hosted` preflight. Primary map data must remain Tileflow World; named
|
|
33
|
+
Team sources are validated and resolved independently.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# CLI setup and defaults
|
|
2
|
+
|
|
3
|
+
Start with the [tileflow guide](https://github.com/tileflow/tileflow-sdk/blob/main/packages/cli/README.md) for installation and a complete first example.
|
|
4
|
+
|
|
5
|
+
CLI-only tools for Tileflow config, preview, validation, capture, and hosted deploy. The package
|
|
6
|
+
requires Node.js 22 or newer and intentionally exposes only the `tileflow` binary; importing
|
|
7
|
+
`tileflow` as a JavaScript library is not a supported surface.
|
|
8
|
+
|
|
9
|
+
Local config, validation, build, preview, and hosted-compatibility checks require
|
|
10
|
+
no Tileflow account or API key:
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
npm install @tileflow/core@alpha @tileflow/maps@alpha
|
|
14
|
+
npm install --save-dev --save-exact tileflow@alpha
|
|
15
|
+
npx tileflow init
|
|
16
|
+
npx tileflow validate
|
|
17
|
+
npx tileflow validate --target hosted
|
|
18
|
+
npx tileflow build
|
|
19
|
+
npx tileflow preview
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The generated config imports `streets`, extends it, materializes a custom dark theme from
|
|
23
|
+
`streetsThemes.dark`, and declares the starter's theme family, modules, and view. Streets already
|
|
24
|
+
owns its complete icon and glyph providers, so the leaf does not repeat font stacks or know a
|
|
25
|
+
delivery URL.
|
|
26
|
+
|
|
27
|
+
Install the exact project dependency first; then `npx tileflow` runs its local executable. Other
|
|
28
|
+
package managers work; use the equivalent command for the lockfile already owned by the project.
|
|
29
|
+
|
|
30
|
+
`tileflow preview` previews the map exported by `tileflow.config.ts` and uses its configured `view`.
|
|
31
|
+
Select one of that map's committed standalone scenes explicitly:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
npx tileflow preview --scene madrid-mobile
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
To work on another map, point `--config` at another singular config. Multi-map catalogs are internal
|
|
38
|
+
orchestration used by this repository's workbench and are not a second public config shape.
|
|
39
|
+
|
|
40
|
+
`tileflow dev` remains a compatibility alias. The `preview` name distinguishes this SDK preview
|
|
41
|
+
server from an application's own `npm run dev` process.
|
|
42
|
+
|
|
43
|
+
`--api-base-url` selects the origin used by official World, Bathymetry vector, Bathymetry DEM,
|
|
44
|
+
Nautical, and terrain TileJSON sources in the generated preview style. In particular, a hybrid
|
|
45
|
+
Bathymetry map resolves `/tiles/bathymetry/tiles.json` and `/tiles/bathymetry/dem/tiles.json` from
|
|
46
|
+
that one origin. `TILEFLOW_API_URL` supplies the same value when the flag is omitted, which lets a
|
|
47
|
+
local tiles stack serve all sidecars without changing map authoring.
|
|
48
|
+
|
|
49
|
+
The preview binds only `127.0.0.1` by default. Network exposure is never implicit. To bind another
|
|
50
|
+
interface, pass one explicit IP literal (or `localhost`) with `--host`, for example
|
|
51
|
+
`tileflow preview --host 192.0.2.10`. URL-, path-, and hostname-shaped values are rejected.
|
|
52
|
+
|
|
53
|
+
A map preview accepts `--theme <concrete-name>`; omission selects its declared default. A scene
|
|
54
|
+
preview applies its committed concrete theme, camera, and CSS viewport dimensions. Capture remains the
|
|
55
|
+
authority for exact DPR and pixels. Scenes whose target is an application must be viewed through
|
|
56
|
+
that application's normal development server.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Command families
|
|
2
|
+
|
|
3
|
+
Start with the [tileflow guide](https://github.com/tileflow/tileflow-sdk/blob/main/packages/cli/README.md) for installation and a complete first example.
|
|
4
|
+
|
|
5
|
+
| Family | Commands |
|
|
6
|
+
| ----------------- | ---------------------------------------------------------------------------------------------- |
|
|
7
|
+
| Semantic language | `language manifest`, `language schema` |
|
|
8
|
+
| Map authoring | `init`, `validate`, `inspect`, `explain`, `semantic-diff`, `build`, `preview` (`dev` alias) |
|
|
9
|
+
| Local evidence | `setup capture`, `capture`, `visual compare`, `visual analyze`, `visual diff`, `visual update` |
|
|
10
|
+
| Data and assets | `tileset inspect`, `tileset publish/list/status/purge`, `inspect features`, `icons list/diff` |
|
|
11
|
+
| Account | `login`, `logout`, `whoami` |
|
|
12
|
+
| Hosted delivery | `deploy`, `status` |
|
|
13
|
+
|
|
14
|
+
Run `tileflow <command> --help` (or the family help, such as `tileflow icons --help`) for the exact
|
|
15
|
+
arguments and bounded JSON modes.
|
|
16
|
+
|
|
17
|
+
The CLI retains the hidden `projects` command family as a compatibility and support surface for the
|
|
18
|
+
internal application boundary. It is not part of the ordinary workflow or the product catalog.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Coordinates
|
|
2
|
+
|
|
3
|
+
Start with the [tileflow guide](https://github.com/tileflow/tileflow-sdk/blob/main/packages/cli/README.md) for installation and a complete first example.
|
|
4
|
+
|
|
5
|
+
These local commands require an explicitly provided compatible runtime distribution. No public
|
|
6
|
+
native runtime download is currently offered; package installation or the default setup URL does
|
|
7
|
+
not supply one. The verified production profile is Linux x64 on Debian 12, glibc 2.36 and Node 24.
|
|
8
|
+
The examples below use development artifacts and do not establish public platform support.
|
|
9
|
+
|
|
10
|
+
Coordinates commands use a locally provisioned execution release. They do not use Map
|
|
11
|
+
configuration, account state, or a Hosted fallback. Provision first from a distribution source, then
|
|
12
|
+
run the local commands against the active cache entry or an explicit runtime directory.
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
tileflow setup coordinates --source /path/to/distribution.json --cache-dir /path/to/coordinates-cache --development --json
|
|
16
|
+
tileflow coordinates search --query ETRS89 --runtime-dir /path/to/installed-release --development --json
|
|
17
|
+
tileflow coordinates describe --id EPSG:25830 --runtime-dir /path/to/installed-release --development --json
|
|
18
|
+
tileflow coordinates operations --from EPSG:4258 --to EPSG:25832 --runtime-dir /path/to/installed-release --development --json
|
|
19
|
+
tileflow coordinates transform --from EPSG:4258 --to EPSG:25832 --positions '[[12,55]]' --runtime-dir /path/to/installed-release --development --json
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`setup coordinates --source` accepts a distribution URL, a local `distribution.json`, or a directory
|
|
23
|
+
that contains one. `--archive` is a local archive alias and rejects URLs. Setup verifies every asset
|
|
24
|
+
declared by the selected distribution before it records the active release. `--development` is
|
|
25
|
+
required for a development distribution.
|
|
26
|
+
|
|
27
|
+
Every execution command accepts `--runtime-dir`, `--release`, and `--development`. With no
|
|
28
|
+
`--runtime-dir`, it opens the cache entry selected by setup. `search` accepts `--query`, `describe`
|
|
29
|
+
accepts `--id`, `operations` accepts `--from` and `--to`, and `transform` also accepts JSON
|
|
30
|
+
`--positions`.
|
|
31
|
+
|
|
32
|
+
For a complete request, use exactly one of `--request '<json>'` or `--input <file|->`. These forms
|
|
33
|
+
cannot be combined with the command's convenience request flags. Input is limited to 32 KiB, must be
|
|
34
|
+
valid UTF-8 JSON, and `-` reads standard input. Success writes one JSON document to stdout. A
|
|
35
|
+
structured failure writes one JSON document to stderr and exits with status 1. Plain `--help` remains
|
|
36
|
+
human-readable; `--help --json` is a structured failure.
|
|
37
|
+
|
|
38
|
+
`tileflow explain` compiles exactly one map/theme selection through `createStyleResult()` and emits
|
|
39
|
+
its structured `report` and safe compiler `diagnostics`; it deliberately omits the usually large
|
|
40
|
+
MapLibre `style`. In a singular config, `--map` is optional; a multi-map workbench requires it.
|
|
41
|
+
`--theme` defaults to that map's declared default. `--inspection` adds opt-in, read-only
|
|
42
|
+
physical-output provenance to the report. Its physical layer IDs and indexes are diagnostic
|
|
43
|
+
observations only: they are not stable application or authoring targets, and no semantic operation
|
|
44
|
+
accepts them. The JSON document has this stable projection:
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"schemaVersion": 1,
|
|
49
|
+
"command": "explain",
|
|
50
|
+
"ok": true,
|
|
51
|
+
"selection": {"map": "madrid", "theme": "dark"},
|
|
52
|
+
"authoringManifestSchemaVersion": 2,
|
|
53
|
+
"compilation": {"ok": true, "diagnostics": [], "report": {}},
|
|
54
|
+
"diagnostics": []
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`tileflow semantic-diff --from-config <path> --to-config <path>` compares the sole map exported by
|
|
59
|
+
each ordinary config, which is the normal agent workflow for reviewing a change across two files or
|
|
60
|
+
checkouts. If either endpoint is a multi-map `*.workspace.ts`, select that endpoint explicitly with
|
|
61
|
+
`--from-map` or `--to-map`; selectors are rejected for singular configs. The existing
|
|
62
|
+
`--config <workspace> --from <map> --to <map>` form remains as the same-workspace shortcut. Paired
|
|
63
|
+
config options and workspace options cannot be mixed.
|
|
64
|
+
|
|
65
|
+
The successful document adds `diff`, whose exact core shape is `{schemaVersion, from, to, summary,
|
|
66
|
+
changes}`; each change is `add`, `remove`, or `change` at an RFC 6901 JSON Pointer. Differences are
|
|
67
|
+
informational, so a non-empty diff still exits successfully. Selection, load, validation, asset, or
|
|
68
|
+
compilation failures leave stdout empty and emit one safe structured document on stderr.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Deterministic agent diagnostics
|
|
2
|
+
|
|
3
|
+
Start with the [tileflow guide](https://github.com/tileflow/tileflow-sdk/blob/main/packages/cli/README.md) for installation and a complete first example.
|
|
4
|
+
|
|
5
|
+
Use JSON mode when an agent or CI job needs to validate or reason about the resolved config:
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npx tileflow validate --json
|
|
9
|
+
npx tileflow inspect --json
|
|
10
|
+
npx tileflow inspect --map madrid --json
|
|
11
|
+
npx tileflow language manifest --json
|
|
12
|
+
npx tileflow language schema --json
|
|
13
|
+
npx tileflow explain --map madrid --theme dark --json
|
|
14
|
+
npx tileflow semantic-diff --from-config before/tileflow.config.ts --to-config after/tileflow.config.ts --json
|
|
15
|
+
npx tileflow semantic-diff --config maps.workspace.ts --from before --to after --json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`validate`, `inspect`, `explain`, and `semantic-diff` success writes exactly one
|
|
19
|
+
schema-version-1 command envelope to stdout. The two discovery commands intentionally return their
|
|
20
|
+
contracts raw instead of wrapping them: `language manifest --json` emits authoring-manifest version
|
|
21
|
+
2 and `language schema --json` emits config-reference version 4. Every JSON-mode failure, including
|
|
22
|
+
failure to load either raw discovery contract, leaves stdout empty and writes one schema-version-1
|
|
23
|
+
command failure to stderr. Command summaries and every failure diagnostic contain `phase`, `code`,
|
|
24
|
+
`path`, `severity`, `message`, and a bounded safe `suggestion`; diagnostics are sorted and
|
|
25
|
+
deduplicated deterministically.
|
|
26
|
+
|
|
27
|
+
Config inspection returns the resolved map, parent-to-leaf lineage, declared paths, leaf-level merge
|
|
28
|
+
provenance, and an explicit `themeContract`: default/system selection, shared token schema,
|
|
29
|
+
concrete values, typography, lighting, differences from the default, and stable audit diagnostics.
|
|
30
|
+
It omits the executable input-file graph and sanitizes credentials, URL queries,
|
|
31
|
+
secret-shaped values, data URLs, and absolute filesystem paths. The generated
|
|
32
|
+
[`modules-api-reference.json`](https://github.com/tileflow/tileflow-sdk/blob/main/docs/modules-api-reference.json) is the machine-readable
|
|
33
|
+
map/module schema; its default `authoring` entrypoint tells an agent how to write the singular
|
|
34
|
+
config with `extends` and `scenes`, while its named `resolved` entrypoint matches inspection and
|
|
35
|
+
compiler input. Both are produced from executable core schemas rather than a handwritten parallel
|
|
36
|
+
API list.
|
|
37
|
+
|
|
38
|
+
`tileflow language manifest --json` discovers the complete closed semantic language without loading
|
|
39
|
+
a project: compiler identity, domains and their dependencies, public operations, expression-builder
|
|
40
|
+
signatures and limits, render selectors, semantic fields/features, diagnostics, reports, commands,
|
|
41
|
+
and schema references. `tileflow language schema --json` returns the packaged generated JSON Schema
|
|
42
|
+
that those references address. Together they are the canonical bootstrap surface for an authoring
|
|
43
|
+
agent; neither command writes files or accesses the network.
|
|
44
|
+
|
|
45
|
+
Each manifest command entry declares its `outputKind`, `outputVersion`, and stable
|
|
46
|
+
`outputSchemaRef`. `raw-authoring-manifest` and `raw-config-reference` identify the two bootstrap
|
|
47
|
+
documents above; `command-envelope` identifies the ordinary version-1 CLI contract.
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Hosted authentication and deploy
|
|
2
|
+
|
|
3
|
+
Start with the [tileflow guide](https://github.com/tileflow/tileflow-sdk/blob/main/packages/cli/README.md) for installation and a complete first example.
|
|
4
|
+
|
|
5
|
+
Hosted writes have two independent authorization paths:
|
|
6
|
+
|
|
7
|
+
- Personal developer session: run `npx tileflow login` once for a
|
|
8
|
+
Tileflow API origin. Login authenticates the account and selects no Map.
|
|
9
|
+
Map commands exchange it for a brief Map capability; tileset commands use a separate Team data
|
|
10
|
+
capability.
|
|
11
|
+
- CI key: create a dashboard `CI deploy` key, store it as
|
|
12
|
+
`TILEFLOW_API_KEY`, and let the repository workflow deploy without a local login. The server
|
|
13
|
+
binds that key to exactly one Map.
|
|
14
|
+
|
|
15
|
+
Hosted control-plane requests stay pinned to the configured HTTP(S) origin, apply a hard bounded
|
|
16
|
+
timeout, and stream at most 1 MiB of response data. CLI diagnostics never echo an untrusted remote
|
|
17
|
+
response body or bearer credential.
|
|
18
|
+
|
|
19
|
+
Inspect the account, then target the Map shown in the dashboard:
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
npx tileflow whoami --json
|
|
23
|
+
npx tileflow deploy --map-id map_AbCdEfGhIjKlMnOp
|
|
24
|
+
npx tileflow status --map-id map_AbCdEfGhIjKlMnOp
|
|
25
|
+
npx tileflow logout
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Changing or resetting the hosted account password revokes saved personal CLI sessions. The next
|
|
29
|
+
account or hosted command stops with a clear message and asks you to run `tileflow login` again.
|
|
30
|
+
Project API and CI keys are independent project credentials and are not removed by a personal
|
|
31
|
+
password change.
|
|
32
|
+
|
|
33
|
+
The dashboard creates the Map and browser-access policy before repository setup. Keep that exact
|
|
34
|
+
Map ID in the deploy action. If the config contains several maps, select the authored map explicitly:
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
npx tileflow deploy \
|
|
38
|
+
--map-id map_AbCdEfGhIjKlMnOp \
|
|
39
|
+
--map store-locator
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The Map ID is a public destination, not a credential. A successful server-confirmed deploy keeps
|
|
43
|
+
unrelated manifest entries and records that Map's stable ID, hosted theme URLs, World `v1`
|
|
44
|
+
generation, and fixed session usage mode. Browser access remains server-owned and is never read
|
|
45
|
+
from or written to repository configuration. Do not add an API key or payment authority to a copied
|
|
46
|
+
prompt.
|
|
47
|
+
|
|
48
|
+
Team tileset commands exchange the same account session for a separate Team-scoped data capability;
|
|
49
|
+
it carries no Map authority. Inspect and preview remain account-free:
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
npx tileflow tileset inspect ./data/stores.pmtiles --json
|
|
53
|
+
npx tileflow tileset inspect ./data/stores.pmtiles \
|
|
54
|
+
--include-values category,status --json
|
|
55
|
+
npx tileflow tileset publish ./data/stores.pmtiles \
|
|
56
|
+
--id stores --team @acme --attribution 'Store data © Example' --json
|
|
57
|
+
npx tileflow tileset list --team @acme --json
|
|
58
|
+
npx tileflow tileset status stores --team @acme --json
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Inspection schema 1 separates authoritative PMTiles/TileJSON declarations from bounded MVT
|
|
62
|
+
observations. Sampled fields report present/missing feature counts, observed distinct-value counts,
|
|
63
|
+
numeric min/max, and truncation. Raw primitive values remain absent unless `--include-values`
|
|
64
|
+
explicitly selects their comma-separated field names; the command emits at most 16 values per field,
|
|
65
|
+
32 selected fields, and 256 characters per string. `--no-sample` returns only authoritative metadata
|
|
66
|
+
and cannot be combined with value inspection. Directory traversal recomputes addressed-tile and
|
|
67
|
+
tile-entry counts; the header's tile-content count is reported only as a nullable declaration and is
|
|
68
|
+
not treated as authority.
|
|
69
|
+
|
|
70
|
+
`publish --id` names a Team-local logical resource; Tileflow owns its opaque delivery ID. The
|
|
71
|
+
command validates the archive locally before authentication, hashes it in fixed 16 MiB parts, then
|
|
72
|
+
uploads at most four parts concurrently without buffering the complete file. Interrupted sessions
|
|
73
|
+
remain resumable for 24 hours: rerunning the same command reconciles server receipts and transfers
|
|
74
|
+
only missing parts. Normal Queue initialization is polled for at most two minutes before the command
|
|
75
|
+
returns a resumable availability error. Retryable transfer failures receive fresh short-lived authorization; a changed
|
|
76
|
+
local file stops before completion. Free accepts versions through exactly 2,000,000,000 bytes and
|
|
77
|
+
Starter through exactly 4,000,000,000 bytes, subject to the Team's hosted-storage capacity.
|
|
78
|
+
|
|
79
|
+
Publication completes only after server-side integrity and PMTiles validation. A compatible new
|
|
80
|
+
version becomes current at the same stable TileJSON and tile URLs, so newly resolved browser
|
|
81
|
+
requests see it without creating a Map deployment. Purge requires `--confirm <exact-id>` and fails
|
|
82
|
+
with bounded dependency context while any retained Map deployment uses the resource. Automation may set a Team data
|
|
83
|
+
`TILEFLOW_API_KEY`; that key selects its Team, so commands omit `--team` and never load account
|
|
84
|
+
state.
|
|
85
|
+
|
|
86
|
+
`tileset publish --json` emits schema version 2 with the Team selector when known, logical and
|
|
87
|
+
opaque tileset identities, immutable version ID and number, exact byte count, content-hash
|
|
88
|
+
algorithm/hash, final state, and `changed` or `unchanged` publication result. It never emits the
|
|
89
|
+
local path, upload session, storage key, signed URL, ETag, credential, or retry details.
|
|
90
|
+
|
|
91
|
+
An explicit key or `TILEFLOW_API_KEY` never uses the saved account session. The deploy API rejects a
|
|
92
|
+
`--map-id` that does not match the key. Read-only hosted icon comparison validates the same binding
|
|
93
|
+
before loading its baseline.
|
|
94
|
+
|
|
95
|
+
A deploy-only key grants `styles:write` and `status:read`. Without additional permissions it cannot upload
|
|
96
|
+
datasets or render images. Give it an expiration, rotate the repository secret
|
|
97
|
+
before it expires, and avoid non-expiring CI keys.
|
|
98
|
+
|
|
99
|
+
Detected CI never falls back to the credential saved by `tileflow login`: if
|
|
100
|
+
`TILEFLOW_API_KEY` is absent, deploy stops before loading config or making a
|
|
101
|
+
request. Once captured, the key is hidden from `process.env` and `--api-key` is removed from the
|
|
102
|
+
temporary `process.argv` view before the CLI imports executable `tileflow.config.ts`; both process
|
|
103
|
+
surfaces are restored after the protected operation. Every config-aware command uses the same
|
|
104
|
+
scope, including validate, build, dev/watch, capture, visual, inspect, icon inspection, and deploy.
|
|
105
|
+
This is defense in depth, not a sandbox; deploy only reviewed repository code on a trusted runner,
|
|
106
|
+
and do not pass keys through the `--api-key` command line in CI.
|
|
107
|
+
|
|
108
|
+
The [deploy documentation](https://tileflow.dev/docs/deploy) contains copyable
|
|
109
|
+
GitHub Actions and GitLab CI workflows. Both use `npm ci`, the committed
|
|
110
|
+
lockfile, and the repository-local CLI. GitHub exposes the key only to its deploy
|
|
111
|
+
step. GitLab variables are job-scoped, so its example validates in a keyless job
|
|
112
|
+
and deploys in a protected `production` job; the locked install and runner are
|
|
113
|
+
part of that trusted job boundary. Both serialize publications and intentionally
|
|
114
|
+
omit path filters because `tileflow.config.ts` can import arbitrary repository
|
|
115
|
+
files.
|
|
116
|
+
|
|
117
|
+
The CLI records bounded private provenance for GitHub Actions, GitLab CI,
|
|
118
|
+
generic CI, and local runs. These provider fields are descriptive client
|
|
119
|
+
reports, not OIDC attestations. Provider values can be overridden with:
|
|
120
|
+
|
|
121
|
+
```txt
|
|
122
|
+
TILEFLOW_DEPLOY_REPOSITORY
|
|
123
|
+
TILEFLOW_DEPLOY_REVISION
|
|
124
|
+
TILEFLOW_DEPLOY_REF
|
|
125
|
+
TILEFLOW_DEPLOY_RUN_ID
|
|
126
|
+
TILEFLOW_DEPLOY_RUN_URL
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Invalid explicit values fail before a network write. Provider metadata that is
|
|
130
|
+
missing, malformed, or too long is omitted. Secrets and the complete
|
|
131
|
+
environment are never logged.
|
|
132
|
+
|
|
133
|
+
A separate app-build step is absent from the minimal workflows. Self-hosted build and deploy emit the same
|
|
134
|
+
runtime manifest version 1 shape; Hosted fields are optional identity metadata on its map/theme
|
|
135
|
+
entries. Filesystem build writers refuse to replace a manifest carrying Hosted metadata by default,
|
|
136
|
+
and deploy refuses to replace a purely local manifest. Prefer `emitBuildArtifacts: false` or
|
|
137
|
+
separate output paths when the app deliberately packages a deploy manifest. The explicit
|
|
138
|
+
`overwriteHostedManifest: true` build option and
|
|
139
|
+
`tileflow deploy --overwrite-self-hosted-manifest` flag authorize that destination replacement. A
|
|
140
|
+
retry of the same compiled theme family reuses its deployment version and prints `Unchanged`;
|
|
141
|
+
changed cartography prints `Published` with a new version. Allowed websites is managed separately
|
|
142
|
+
in Tileflow and is never read from repository config. The
|
|
143
|
+
fingerprint binds resource references, not the changing bytes behind referenced
|
|
144
|
+
glyph or sprite URLs. Every theme of one logical map publishes atomically; separate maps can still
|
|
145
|
+
partially succeed when no remote batch release is used.
|
|
146
|
+
|
|
147
|
+
All config, theme-style, icon, and compatibility preflight happens before the first style write. After
|
|
148
|
+
that boundary the current Hosted API has no batch commit across repository-internal orchestration:
|
|
149
|
+
one singular config can publish before a later config fails. The orchestrator then leaves the
|
|
150
|
+
previous local manifest untouched, reports which publications succeeded, and tells the operator to
|
|
151
|
+
retry; idempotent publication converges on that retry. The local manifest
|
|
152
|
+
writer uses a durable same-directory temporary followed by direct rename and directory sync, so
|
|
153
|
+
readers see either the previous or next complete manifest. Multi-file artifact writers remain
|
|
154
|
+
rollback-capable sets. Neither mechanism is a remote transaction or can make several API writes
|
|
155
|
+
all-or-none.
|
|
156
|
+
|
|
157
|
+
Deploy treats the locally compiled MapLibre Style family as one logical-map artifact. The request
|
|
158
|
+
contains an exact `styles[theme]` collection, per-theme canonical SHA-256 identities in the build
|
|
159
|
+
manifest, only bounded hosting policy that does not belong in MapLibre itself, and the exact managed
|
|
160
|
+
icon-package identity when the family has one. Delivery
|
|
161
|
+
policy is not inherited with cartographic fields. Deploy does not serialize the module
|
|
162
|
+
configuration, send a public `tileset` selector, or ask the hosted API to compile the map again.
|
|
163
|
+
Hosted publication currently requires Tileflow World; `vectorTiles()` remains available for local
|
|
164
|
+
builds and previews but fails deploy before any remote write. The API binds recognized
|
|
165
|
+
Tileflow-owned world and terrain URLs to its generated map ID. A successful response must return
|
|
166
|
+
exactly the submitted theme names and a hosted Style URL for each. Deploy writes strict runtime
|
|
167
|
+
manifest version 1 with stable theme URLs, `colorScheme`, content revision, optional font faces and
|
|
168
|
+
style IDs, rather than duplicating dataset configuration. No older manifest is normalized.
|
|
169
|
+
|
|
170
|
+
For a map with `icons: ['./icons']`, hosted validation compiles the local SVG/PNG/JPEG/WebP files
|
|
171
|
+
without a key. Ordered directories apply left to right and later exact IDs replace earlier files.
|
|
172
|
+
Deploy uploads the four generated sprite files before its first style write and reuses
|
|
173
|
+
byte-identical packages by content hash. Source icons and absolute paths remain local; generated
|
|
174
|
+
atlas bytes and sorted icon names are public. Each hosted package is limited to 256 icons and 8 MiB
|
|
175
|
+
generated bytes as a processing envelope. There is no package-count quota; physically retained
|
|
176
|
+
generated packages share the organization's 5/10-GB hosted-storage pool with retained PMTiles,
|
|
177
|
+
remain protected by deployment/library references, and otherwise enter the technical orphan grace
|
|
178
|
+
before deletion. Upload success must confirm the submitted `contentHash`, exact icon count, exact
|
|
179
|
+
generated byte total, one opaque `icp_<id>`, and the corresponding query-free
|
|
180
|
+
`/sprites/<id>/sprite` URL. The CLI rejects any missing or divergent field before using that URL.
|
|
181
|
+
|
|
182
|
+
Hosted deploy currently rejects local or package-owned web fonts before authentication or remote
|
|
183
|
+
writes. Use self-hosted delivery or an explicit public glyph provider. Enabling managed font bundles
|
|
184
|
+
requires a separately deployed ownership, quota, retention, and immutable-delivery contract.
|
|
185
|
+
|
|
186
|
+
For both managed resource kinds, `assetSetSha256` remains a separate per-map output identity. It
|
|
187
|
+
hashes each generated file's exact portable name, media type, byte count, and SHA-256 using Core's
|
|
188
|
+
asset-set v1 contract; it does not hash only the icon-package manifest. Hosted must
|
|
189
|
+
confirm the immutable resource bytes, reconstruct those same per-file identities (including the
|
|
190
|
+
`icons/<mapId>/` prefix), and reject the Style when the submitted build-manifest hash diverges.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Inspect vector features
|
|
2
|
+
|
|
3
|
+
Start with the [tileflow guide](https://github.com/tileflow/tileflow-sdk/blob/main/packages/cli/README.md) for installation and a complete first example.
|
|
4
|
+
|
|
5
|
+
See which bounded source features the exported map sees near a camera before tuning taxonomy,
|
|
6
|
+
density, or labels:
|
|
7
|
+
|
|
8
|
+
```sh
|
|
9
|
+
npx tileflow inspect features \
|
|
10
|
+
--center=-3.6927512,40.4086555 --zoom=16 \
|
|
11
|
+
--layers=poi --properties=name,category,type,icon,filter_rank,size_rank --json
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The command supports HTTP(S) TileJSON/vector sources and returns only requested properties plus
|
|
15
|
+
geometry summaries in stable order. Viewport, tiles, bytes, scanned/returned features, names, and
|
|
16
|
+
timeouts are bounded. Safe provenance includes origins, a query-free TileJSON path, and configured
|
|
17
|
+
source revision or `null`; credentials, URL queries, hidden properties, response bodies, and
|
|
18
|
+
absolute paths are omitted. It is read-only apart from executable config's own possible side
|
|
19
|
+
effects and removes `TILEFLOW_API_KEY` before loading config.
|