tangle-cli 0.0.1a3__tar.gz → 0.1.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.
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/PKG-INFO +8 -4
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/README.md +6 -2
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/pyproject.toml +3 -2
- tangle_cli-0.1.0/skills/tangent/OSS-CONVENTIONS.md +471 -0
- tangle_cli-0.1.0/skills/tangent/PORT-README.md +79 -0
- tangle_cli-0.1.0/skills/tangent/SKILL.md +124 -0
- tangle_cli-0.1.0/skills/tangent/agents/auth-wizard.md +150 -0
- tangle_cli-0.1.0/skills/tangent/agents/builder.md +252 -0
- tangle_cli-0.1.0/skills/tangent/agents/debugger.md +142 -0
- tangle_cli-0.1.0/skills/tangent/agents/reporter.md +103 -0
- tangle_cli-0.1.0/skills/tangent/agents/researcher.md +197 -0
- tangle_cli-0.1.0/skills/tangent/agents/reviewer.md +106 -0
- tangle_cli-0.1.0/skills/tangent/agents/scenario-builder.md +451 -0
- tangle_cli-0.1.0/skills/tangent/references/data-sources.md +334 -0
- tangle_cli-0.1.0/skills/tangent/references/event-log.md +110 -0
- tangle_cli-0.1.0/skills/tangent/references/example-scenarios/01-mslr-ranking.md +165 -0
- tangle_cli-0.1.0/skills/tangent/references/example-scenarios/02-text-classification.md +147 -0
- tangle_cli-0.1.0/skills/tangent/references/example-scenarios/INDEX.md +48 -0
- tangle_cli-0.1.0/skills/tangent/references/iterating-on-runs.md +56 -0
- tangle_cli-0.1.0/skills/tangent/references/knowledge-corpus.md +128 -0
- tangle_cli-0.1.0/skills/tangent/references/secrets.md +347 -0
- tangle_cli-0.1.0/skills/tangent/references/setup.md +157 -0
- tangle_cli-0.1.0/skills/tangent/references/step-0-initialize.md +107 -0
- tangle_cli-0.1.0/skills/tangent/references/step-1-analyze.md +91 -0
- tangle_cli-0.1.0/skills/tangent/references/step-2-hypothesize.md +42 -0
- tangle_cli-0.1.0/skills/tangent/references/step-3-submit.md +174 -0
- tangle_cli-0.1.0/skills/tangent/references/step-4-monitor.md +123 -0
- tangle_cli-0.1.0/skills/tangent/references/step-5-evaluate.md +53 -0
- tangle_cli-0.1.0/skills/tangent/references/step-6-synthesize.md +56 -0
- tangle_cli-0.1.0/skills/tangent/references/step-7-decide.md +79 -0
- tangle_cli-0.1.0/skills/tangent/references/tangle-tools.md +410 -0
- tangle_cli-0.1.0/skills/tangent/references/uploading-artifacts.md +229 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/__init__.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/api_cli.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/api_schema.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/api_transport.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/args_container.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/artifacts.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/artifacts_cli.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/cli.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/cli_helpers.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/cli_options.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/client.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/component_from_func.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/component_generator.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/component_inspector.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/component_publisher.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/components_cli.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/dynamic_discovery_client.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/generated_model_extensions.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/handler.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/hydration_trust.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/logger.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/models.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/module_bundler.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/openapi/__init__.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/openapi/codegen.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/openapi/parser.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_dehydrator.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_hydrator.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_run_annotations.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_run_details.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_run_manager.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_run_search.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_runner.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_runs_cli.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipelines.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipelines_cli.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/published_components_cli.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/py.typed +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/quickstart.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/secrets.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/secrets_cli.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/utils.py +0 -0
- {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/version_manager.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: tangle-cli
|
|
3
|
-
Version: 0.0
|
|
3
|
+
Version: 0.1.0
|
|
4
4
|
Summary: CLI for Tangle, the open-source ML pipeline orchestration platform
|
|
5
5
|
Author: Alexey Volkov, Tangle authors
|
|
6
6
|
Author-email: Alexey Volkov <alexey.volkov@ark-kun.com>
|
|
@@ -13,7 +13,7 @@ Requires-Dist: platformdirs>=4.10.0
|
|
|
13
13
|
Requires-Dist: pydantic>=2.0
|
|
14
14
|
Requires-Dist: pyyaml>=6.0
|
|
15
15
|
Requires-Dist: requests>=2.32.0
|
|
16
|
-
Requires-Dist: tangle-api==0.0
|
|
16
|
+
Requires-Dist: tangle-api==0.1.0
|
|
17
17
|
Requires-Dist: tomli>=2.0 ; python_full_version < '3.11'
|
|
18
18
|
Requires-Python: >=3.10
|
|
19
19
|
Project-URL: Homepage, https://tangleml.com
|
|
@@ -126,7 +126,11 @@ uv run tangle api --help
|
|
|
126
126
|
uv run tangle sdk pipelines validate pipeline.yaml
|
|
127
127
|
```
|
|
128
128
|
|
|
129
|
-
Custom API/codegen users can still run codegen from the fully capable install; generating bindings does not require removing the official `tangle-api` package. For project-local generated APIs, generate into a local source tree such as `src/tangle_api/generated` (and `src/tangle_api/schema/openapi.json` when you want `tangle api --schema-source official`) and run from that project so local `src/tangle_api` shadows site-packages. For packaged custom APIs, publish/provide a distribution named `tangle-api` with a version compatible with this `tangle-cli` release (for example `0.0
|
|
129
|
+
Custom API/codegen users can still run codegen from the fully capable install; generating bindings does not require removing the official `tangle-api` package. For project-local generated APIs, generate into a local source tree such as `src/tangle_api/generated` (and `src/tangle_api/schema/openapi.json` when you want `tangle api --schema-source official`) and run from that project so local `src/tangle_api` shadows site-packages. For packaged custom APIs, publish/provide a distribution named `tangle-api` with a version compatible with this `tangle-cli` release (for example `0.1.0+yourorg` for a `tangle-cli` dependency on `tangle-api==0.1.0`) via a private index, `--find-links`, or uv sources. As an expert escape hatch, `--no-deps` installs only `tangle-cli` and skips all dependencies, so that environment must manually provide every required runtime dependency plus its generated/custom `tangle_api`; this is acceptable for controlled codegen/custom scenarios but not normal UX.
|
|
130
|
+
|
|
131
|
+
## Agent skills
|
|
132
|
+
|
|
133
|
+
This repo includes the Tangent agent-skill bundle under `skills/tangent/`. The bundle was ported from `tangle-cli-lab` and now treats this repository as the canonical source. It drives the public `tangle` / `tangle-cli` command surface, assumes the default `tangle-cli` install includes `tangle-api`, and keeps relative references (`agents/*.md`, `references/*.md`) self-contained for Pi-style skill loaders. The source distribution includes `skills/**` so downstream source-based consumers can inspect or vendor the skill docs with the release.
|
|
130
134
|
|
|
131
135
|
## Quick command examples
|
|
132
136
|
|
|
@@ -371,7 +375,7 @@ uv run python -m tangle_cli.openapi.codegen \
|
|
|
371
375
|
--out src/tangle_api/generated
|
|
372
376
|
```
|
|
373
377
|
|
|
374
|
-
That project-local `tangle_api` package can be an editable/package source tree. If you ship the custom API bindings as a wheel or source distribution, use the distribution name `tangle-api` and a compatible version for the `tangle-cli` release you are using. A PEP 440 local version such as `0.0
|
|
378
|
+
That project-local `tangle_api` package can be an editable/package source tree. If you ship the custom API bindings as a wheel or source distribution, use the distribution name `tangle-api` and a compatible version for the `tangle-cli` release you are using. A PEP 440 local version such as `0.1.0+yourorg` can satisfy a public `==0.1.0` dependency while distinguishing your private build. Provide that package through your private index, `--find-links`, or uv source configuration so the resolver chooses it instead of the public official package.
|
|
375
379
|
|
|
376
380
|
Generate from a backend checkout explicitly:
|
|
377
381
|
|
|
@@ -101,7 +101,11 @@ uv run tangle api --help
|
|
|
101
101
|
uv run tangle sdk pipelines validate pipeline.yaml
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
-
Custom API/codegen users can still run codegen from the fully capable install; generating bindings does not require removing the official `tangle-api` package. For project-local generated APIs, generate into a local source tree such as `src/tangle_api/generated` (and `src/tangle_api/schema/openapi.json` when you want `tangle api --schema-source official`) and run from that project so local `src/tangle_api` shadows site-packages. For packaged custom APIs, publish/provide a distribution named `tangle-api` with a version compatible with this `tangle-cli` release (for example `0.0
|
|
104
|
+
Custom API/codegen users can still run codegen from the fully capable install; generating bindings does not require removing the official `tangle-api` package. For project-local generated APIs, generate into a local source tree such as `src/tangle_api/generated` (and `src/tangle_api/schema/openapi.json` when you want `tangle api --schema-source official`) and run from that project so local `src/tangle_api` shadows site-packages. For packaged custom APIs, publish/provide a distribution named `tangle-api` with a version compatible with this `tangle-cli` release (for example `0.1.0+yourorg` for a `tangle-cli` dependency on `tangle-api==0.1.0`) via a private index, `--find-links`, or uv sources. As an expert escape hatch, `--no-deps` installs only `tangle-cli` and skips all dependencies, so that environment must manually provide every required runtime dependency plus its generated/custom `tangle_api`; this is acceptable for controlled codegen/custom scenarios but not normal UX.
|
|
105
|
+
|
|
106
|
+
## Agent skills
|
|
107
|
+
|
|
108
|
+
This repo includes the Tangent agent-skill bundle under `skills/tangent/`. The bundle was ported from `tangle-cli-lab` and now treats this repository as the canonical source. It drives the public `tangle` / `tangle-cli` command surface, assumes the default `tangle-cli` install includes `tangle-api`, and keeps relative references (`agents/*.md`, `references/*.md`) self-contained for Pi-style skill loaders. The source distribution includes `skills/**` so downstream source-based consumers can inspect or vendor the skill docs with the release.
|
|
105
109
|
|
|
106
110
|
## Quick command examples
|
|
107
111
|
|
|
@@ -346,7 +350,7 @@ uv run python -m tangle_cli.openapi.codegen \
|
|
|
346
350
|
--out src/tangle_api/generated
|
|
347
351
|
```
|
|
348
352
|
|
|
349
|
-
That project-local `tangle_api` package can be an editable/package source tree. If you ship the custom API bindings as a wheel or source distribution, use the distribution name `tangle-api` and a compatible version for the `tangle-cli` release you are using. A PEP 440 local version such as `0.0
|
|
353
|
+
That project-local `tangle_api` package can be an editable/package source tree. If you ship the custom API bindings as a wheel or source distribution, use the distribution name `tangle-api` and a compatible version for the `tangle-cli` release you are using. A PEP 440 local version such as `0.1.0+yourorg` can satisfy a public `==0.1.0` dependency while distinguishing your private build. Provide that package through your private index, `--find-links`, or uv source configuration so the resolver chooses it instead of the public official package.
|
|
350
354
|
|
|
351
355
|
Generate from a backend checkout explicitly:
|
|
352
356
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tangle-cli"
|
|
3
|
-
version = "0.0
|
|
3
|
+
version = "0.1.0"
|
|
4
4
|
description = "CLI for Tangle, the open-source ML pipeline orchestration platform"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [
|
|
@@ -18,7 +18,7 @@ dependencies = [
|
|
|
18
18
|
"pydantic>=2.0",
|
|
19
19
|
"pyyaml>=6.0",
|
|
20
20
|
"requests>=2.32.0",
|
|
21
|
-
"tangle-api==0.0
|
|
21
|
+
"tangle-api==0.1.0",
|
|
22
22
|
"tomli>=2.0; python_version < '3.11'",
|
|
23
23
|
]
|
|
24
24
|
|
|
@@ -42,6 +42,7 @@ build-backend = "uv_build"
|
|
|
42
42
|
|
|
43
43
|
[tool.uv.build-backend]
|
|
44
44
|
module-root = "packages/tangle-cli/src"
|
|
45
|
+
source-include = ["skills/**"]
|
|
45
46
|
|
|
46
47
|
[tool.uv.sources]
|
|
47
48
|
cloud-pipelines-backend = { git = "https://github.com/TangleML/tangle", rev = "stable_cli" }
|
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
# OSS Conventions — Tangent Agent-Skills on `tangle-cli`
|
|
2
|
+
|
|
3
|
+
> **This file is the single source of truth.** Every ported skill file (SKILL.md,
|
|
4
|
+
> `agents/*.md`, `references/*.md`) references this document for the CLI surface,
|
|
5
|
+
> invocation rule, auth, artifacts, learnings corpus, logs, annotations, and the
|
|
6
|
+
> resolved D1–D14 defaults. When a ported file needs a command, a flag, an env var,
|
|
7
|
+
> an auth recipe, or a corpus/artifact/log recipe, it cites *this* document rather
|
|
8
|
+
> than re-deriving it. If something here conflicts with an older internal habit
|
|
9
|
+
> (an internal dev-env shim, a cloud-bucket URI, an internal backend host), this document wins and the
|
|
10
|
+
> internal habit is a release blocker (see §9, Security mandate).
|
|
11
|
+
|
|
12
|
+
Target CLI: **`github.com/TangleML/tangle-cli`** — binary `tangle`, package
|
|
13
|
+
`tangle-cli`, Apache-2.0. The CLI splits the surface into two families:
|
|
14
|
+
`tangle api …` (auto-generated OpenAPI wrappers) and `tangle sdk …` (hand-written
|
|
15
|
+
SDK / local / compound commands). The ported skills drive the **OSS core** (`sdk`
|
|
16
|
+
and `api`) and **never** any internal wrapper/hook layer.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. Invocation rule
|
|
21
|
+
|
|
22
|
+
**Published-package usage is the default; checkout usage is for local `tangle-cli` development/validation.**
|
|
23
|
+
|
|
24
|
+
For a persistent user-level CLI install, prefer uv tools:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
uv tool install tangle-cli
|
|
28
|
+
tangle quickstart
|
|
29
|
+
tangle --help
|
|
30
|
+
tangle sdk --help
|
|
31
|
+
tangle api --help
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
For one-off execution without a persistent install, use `uvx`:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
uvx --from tangle-cli tangle --help
|
|
38
|
+
uvx --from tangle-cli tangle quickstart
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Generic Python environments may also use `pip install tangle-cli`; use
|
|
42
|
+
`uv pip install tangle-cli` only inside an explicitly managed virtualenv.
|
|
43
|
+
|
|
44
|
+
When intentionally validating a local checkout of the `tangle-cli` repo, prefix
|
|
45
|
+
examples with `uv run` (for example, `uv run tangle quickstart`). Skill examples
|
|
46
|
+
otherwise use the installed-tool form (`tangle …` / `tangle-cli …`).
|
|
47
|
+
|
|
48
|
+
- **Never** prefix a command with an internal env-shim exec wrapper. That internal
|
|
49
|
+
dev-env tooling must not appear in any ported file.
|
|
50
|
+
- `tangle-cli` is a public PyPI package. The default install includes the
|
|
51
|
+
matching `tangle-api` package and supports static API-backed commands plus the
|
|
52
|
+
handwritten `TangleApiClient` wrapper (see §3). The old `[native]` extra is
|
|
53
|
+
only a compatibility/no-op alias.
|
|
54
|
+
- In the `tangle-cli` workspace, `uv` installs the workspace `tangle-api` package
|
|
55
|
+
automatically for dev/tests.
|
|
56
|
+
- Help is standard cyclopts `--help`. **There is no `--help-extended` / `--help-full`.**
|
|
57
|
+
- Skills live **in-repo** (checked into the `tangle-cli` repo). There is **no internal
|
|
58
|
+
bundle-refresh step**; relative cross-references (`agents/*.md`, `references/*.md`)
|
|
59
|
+
resolve directly on disk.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 2. CLI mapping table (internal `<deploy-cli> …` → OSS `tangle …`)
|
|
64
|
+
|
|
65
|
+
This table is the canonical rename. The left column is the internal command a
|
|
66
|
+
porting agent will encounter in the source skill; the right column is the exact
|
|
67
|
+
OSS replacement. **Verbs/flags below were verified against the `tangle-cli` source**
|
|
68
|
+
(`cli.py`, `pipeline_runs_cli.py`, `pipelines_cli.py`, `components_cli.py`,
|
|
69
|
+
`published_components_cli.py`, `artifacts_cli.py`, `secrets_cli.py`).
|
|
70
|
+
|
|
71
|
+
### Invocation / help / client
|
|
72
|
+
|
|
73
|
+
| Internal | OSS |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `<env-shim> -- <deploy-cli> …` | `tangle …` / `tangle-cli …` (or `uv run tangle …` only when validating a local checkout) |
|
|
76
|
+
| `<deploy-cli> quickstart` | `tangle quickstart` (real; static onboarding text) |
|
|
77
|
+
| `--help-extended` / `--help-full` | `--help` |
|
|
78
|
+
| `from <deploy_pkg> import TangleApiClient` | `from tangle_cli.client import TangleApiClient` (see §3) |
|
|
79
|
+
|
|
80
|
+
### `pipeline-runs` (note: **plural** group `pipeline-runs`)
|
|
81
|
+
|
|
82
|
+
| Internal | OSS |
|
|
83
|
+
|---|---|
|
|
84
|
+
| `<deploy-cli> pipeline-run submit p.yaml -f c.yaml --hydrate --no-wait` | `tangle sdk pipeline-runs submit p.yaml [--arg K=V \| --args-json JSON] [--annotation K=V]` — **hydrate is the default; there is NO `--no-wait` (submit never waits); there is NO `-f config.yaml` (use `--arg`/`--args-json`, or `--config` for CLI-option defaults)** |
|
|
85
|
+
| `… submit … (submit-as-is, no version resolution)` | `tangle sdk pipeline-runs submit p.yaml --no-hydrate` |
|
|
86
|
+
| `… submit … --dry-run` (preview payload) | `tangle sdk pipeline-runs submit p.yaml --dry-run` (prints the submit body, creates no run) |
|
|
87
|
+
| `<deploy-cli> pipeline-run details RUN_ID --state` | `tangle sdk pipeline-runs details RUN_ID --include-execution-state` |
|
|
88
|
+
| `… details … --implementations` | `… details … --include-implementations` |
|
|
89
|
+
| `… details … --include-annotations` | `… details … --include-annotations` (unchanged) |
|
|
90
|
+
| `… details … --execution-id EXEC_ID` | `tangle sdk pipeline-runs details RUN_ID --execution-id EXEC_ID` |
|
|
91
|
+
| (light status) | `tangle sdk pipeline-runs status RUN_ID` (run + derived status summary) |
|
|
92
|
+
| (graph execution state) | `tangle sdk pipeline-runs graph-state EXECUTION_ID` |
|
|
93
|
+
| `<deploy-cli> pipeline-run logs EXECUTION_ID` | `tangle sdk pipeline-runs logs EXECUTION_ID` (backend-native container logs — see §7) |
|
|
94
|
+
| `<deploy-cli> pipeline-run search --name N` | `tangle sdk pipeline-runs search --name N` (also `--created-by`, `--annotation K=V`, `--start-date`, `--end-date`, `--limit N`, `--query JSON`, positional `QUERY`) |
|
|
95
|
+
| `<deploy-cli> pipeline-run cancel RUN_ID` | `tangle sdk pipeline-runs cancel RUN_ID` |
|
|
96
|
+
| `<deploy-cli> pipeline-run await … --max-wait` | `tangle sdk pipeline-runs wait RUN_ID --max-wait N --poll-interval N [--exit-on-first-failure]` (defaults: max-wait 600s, poll-interval 10s) |
|
|
97
|
+
| `<deploy-cli> pipeline-run export RUN_ID out.yaml --dehydrate` | `tangle sdk pipeline-runs export RUN_ID --output out.yaml` (**drop `--dehydrate`; use `--output` — there is no `-o` alias for `export`; omit `--output` to print to stdout**) |
|
|
98
|
+
| `<deploy-cli> pipeline-run annotations set RUN_ID K V` | `tangle sdk pipeline-runs annotations set RUN_ID K V` (also `annotations list RUN_ID`, `annotations delete RUN_ID K`) |
|
|
99
|
+
|
|
100
|
+
### `pipelines` (local pipeline ops — **these live under `pipelines`, NOT `pipeline-runs`**)
|
|
101
|
+
|
|
102
|
+
| Internal | OSS |
|
|
103
|
+
|---|---|
|
|
104
|
+
| `<deploy-cli> pipeline-run validate p.yaml` | `tangle sdk pipelines validate p.yaml` |
|
|
105
|
+
| `<deploy-cli> pipeline auto-layout p.yaml` | `tangle sdk pipelines layout p.yaml [--recursive] [-o out.yaml]` |
|
|
106
|
+
| `<deploy-cli> pipeline hydrate t.yaml out.yaml` | `tangle sdk pipelines hydrate t.yaml -o out.yaml [--var K=V]` |
|
|
107
|
+
| `<deploy-cli> pipeline view … --hydrate` | `tangle sdk pipelines diagram p.yaml` (Mermaid) / `tangle sdk pipelines layout p.yaml` — **no GUI viewer** |
|
|
108
|
+
| `<deploy-cli> …-dehydrate-…` / any `dehydrate` verb/flag | **No OSS `dehydrate` command or `--dehydrate` flag.** Drop it (see §10, D1). `pipeline_dehydrator.py` exists only as unwired library code. |
|
|
109
|
+
|
|
110
|
+
### `components` (local authoring) vs `published-components` (registry)
|
|
111
|
+
|
|
112
|
+
| Internal | OSS |
|
|
113
|
+
|---|---|
|
|
114
|
+
| `<deploy-cli> component generate from-python s.py` | `tangle sdk components generate from-python s.py [--function NAME] [--image REG/IMG:TAG] [--output OUT] [--name NAME] [--mode inline\|bundle] [--dependencies-from REQ] [--strip-code] [--resolve-root DIR]` |
|
|
115
|
+
| `<deploy-cli> component generate from-docker …` / `--quick` / `--engine` | **No image build/push in the CLI.** Build/push the image yourself, then `generate from-python --image <registry/img:tag>`. `set-container-image` is a `NotImplementedError` stub. (See §10, D7.) |
|
|
116
|
+
| `<deploy-cli> component generate from-dbt …` | **Not in the CLI surface.** Drop; treat as out of scope. |
|
|
117
|
+
| `<deploy-cli> component bump-version c.yaml` | `tangle sdk components bump-version c.yaml [--set-version V] [--update-timestamp]` (**bump-version is under `components`**) |
|
|
118
|
+
| `<deploy-cli> component publish c.yaml` | `tangle sdk published-components publish c.yaml [--image …] [--name …] [--description …] [--annotations JSON] [--dry-run] [--published-by …]` (**publish is under `published-components`**) |
|
|
119
|
+
| `<deploy-cli> publish-all …` | **No `publish-all`.** Pass a `--config` YAML/JSON list (or `_defaults` + `configs`) to the same `published-components publish`; it aggregates and exits nonzero on any error. |
|
|
120
|
+
| `<deploy-cli> component inspect --name N --full-spec` | `tangle sdk published-components inspect --name N --full-spec` (or `inspect --digest DIGEST`; exactly one of NAME or `--digest`) |
|
|
121
|
+
| `<deploy-cli> component search-v2 …` / `search … --semantic`/`--fuzzy`/`--regex`/`--schema` | `tangle sdk published-components search NAME [--digest D] [--published-by U] [--include-deprecated]` — **keyword/name/digest only; NO v2/semantic/fuzzy/regex/schema variants** (see §10, D11). May return empty on a fresh OSS install (feature off by default). |
|
|
122
|
+
| `<deploy-cli> component deprecate DIGEST` | `tangle sdk published-components deprecate DIGEST [--superseded-by DIGEST]` |
|
|
123
|
+
| `<deploy-cli> docs standard_components` | `tangle sdk published-components library` (curated standard library) |
|
|
124
|
+
|
|
125
|
+
### `secrets`, `artifacts`, `docs`
|
|
126
|
+
|
|
127
|
+
| Internal | OSS |
|
|
128
|
+
|---|---|
|
|
129
|
+
| `<deploy-cli> secrets {list,create,update,delete}` | `tangle sdk secrets {list,create,update,delete}` — create/update take `--value`/`-v`, **prefer `--from-env`/`-e ENVVAR`** (avoids shell-history exposure), `--description`/`-d`, `--expires-at`; delete prompts unless `--force` |
|
|
130
|
+
| `<deploy-cli> artifacts get RUN_ID -q …` | `tangle sdk artifacts get RUN_ID -q '<JSON>'` (**metadata-only**, see §5). `-q`/`--query` is a JSON string with optional keys `tasks`, `components`, `executions`, `artifact_ids` |
|
|
131
|
+
| `<deploy-cli> artifacts download RUN_ID -q … -o ./dir` | **No download-to-disk command.** Use the signed-URL fetch recipe in §5 / §10 D2. |
|
|
132
|
+
| `<deploy-cli> docs {pipeline,component,debugging_runs,standard_components}` | **No `docs` command.** Point to `tangle sdk <group> --help`, `tangle sdk published-components library`, and the public OSS docs at `github.com/TangleML/website/tree/master/docs` (see §10, D10). |
|
|
133
|
+
|
|
134
|
+
### `auth` / SA setup / scheduler / run-as
|
|
135
|
+
|
|
136
|
+
| Internal | OSS |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `<deploy-cli> auth …` / `<sa-setup>` / Workload-Identity / Terraform | **No `auth` command group and no SA-setup command in the CLI.** Auth is plain env/flags (§4). The replacement auth-wizard is a thin token/header credential helper (§10, D5). |
|
|
139
|
+
| `<schedule-pipeline>` / scheduler | **No scheduler in OSS.** Reduce "do not schedule" guidance to a generic conceptual caution; do not name a `schedule` command (§10, D9). |
|
|
140
|
+
| `--run-as IDENTITY` | `--run-as` exists on `submit` but the **OSS default hooks do not support it** (downstream extension seam only). Drop run-as examples (§10, D9). |
|
|
141
|
+
|
|
142
|
+
**Invocation rule for the whole table:** every left-column command, however it was
|
|
143
|
+
written internally, becomes the bare right-column form (for example,
|
|
144
|
+
`tangle sdk pipeline-runs submit …`). Only prefix with `uv run` when intentionally
|
|
145
|
+
validating a local checkout. Auth flags from §4 attach to any API-backed command.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 3. Programmatic client
|
|
150
|
+
|
|
151
|
+
The stable public wrapper for Python tooling is:
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
from tangle_cli.client import TangleApiClient
|
|
155
|
+
|
|
156
|
+
# Defaults to the local dev backend; pass base_url + auth for a remote backend.
|
|
157
|
+
client = TangleApiClient(
|
|
158
|
+
"http://localhost:8000",
|
|
159
|
+
token=None, # Bearer token shorthand
|
|
160
|
+
auth_header=None, # full Authorization value, e.g. "Bearer …" / "Basic …"
|
|
161
|
+
header=None, # one "Name: value" string or a list of them
|
|
162
|
+
headers=None, # mapping form, if you prefer a dict
|
|
163
|
+
)
|
|
164
|
+
run = client.pipeline_runs_get("run-id")
|
|
165
|
+
existing = client.find_existing_components(
|
|
166
|
+
["component-name"],
|
|
167
|
+
published_by_substring="alice@example.com",
|
|
168
|
+
)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
- Constructor signature: `TangleApiClient(base_url, *, token=, auth_header=, header=, headers=, …)`.
|
|
172
|
+
A bare `TangleApiClient()` only works against the default localhost backend.
|
|
173
|
+
- `TangleApiClient` lives in `tangle_cli.client` and inherits generated endpoint
|
|
174
|
+
methods from `tangle_api.generated.operations.GeneratedTangleApiOperations`.
|
|
175
|
+
**Importing it requires generated bindings**. The default `tangle-cli` install
|
|
176
|
+
includes `tangle-api`; custom API projects may provide a local or packaged
|
|
177
|
+
compatible `tangle_api.generated` package before `from tangle_cli.client import …`.
|
|
178
|
+
The top-level `import tangle_cli` intentionally does not eagerly import generated bindings.
|
|
179
|
+
- **Prefer the CLI over Python snippets for status/polling.** Any internal snippet
|
|
180
|
+
that calls unverified methods like `get_pipeline_run`, `get_execution_graph_state`,
|
|
181
|
+
`set_verbose`, `.status_totals`, or `.root_execution_id` must be replaced. The
|
|
182
|
+
verified surface is `client.pipeline_runs_get(run_id)` and the
|
|
183
|
+
`find_existing_components(...)` semantic helper; for status/graph state the
|
|
184
|
+
**preferred** approach is the purpose-built CLI:
|
|
185
|
+
- `tangle sdk pipeline-runs status RUN_ID` (run + derived status summary)
|
|
186
|
+
- `tangle sdk pipeline-runs graph-state EXECUTION_ID` (graph execution state)
|
|
187
|
+
|
|
188
|
+
Skills should call those CLI commands rather than hand-rolling a light-poll loop
|
|
189
|
+
in Python (see §10, D14).
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 4. Auth & environment
|
|
194
|
+
|
|
195
|
+
OSS auth is **explicit and layered**: explicit CLI option > `--config` file value >
|
|
196
|
+
environment default. **There is no `auth` command group.** These flags/env vars
|
|
197
|
+
replace the internal identity/session systems, cloud SA impersonation, the
|
|
198
|
+
internal backend's auth verification, and the internal package index **entirely**.
|
|
199
|
+
|
|
200
|
+
| CLI option | Env var(s) | Purpose |
|
|
201
|
+
|---|---|---|
|
|
202
|
+
| `--base-url` | `TANGLE_API_URL` | API origin. Defaults to the local dev API URL when omitted. |
|
|
203
|
+
| `--token` | `TANGLE_API_TOKEN` | Bearer-token shorthand. |
|
|
204
|
+
| `--auth-header` | `TANGLE_API_AUTH_HEADER`, `TANGLE_AUTH_HEADER` | Full `Authorization` value such as `Bearer …` or `Basic …`. |
|
|
205
|
+
| `-H` / `--header` | `TANGLE_API_HEADERS` | Extra headers. Repeatable as CLI flags; env accepts a JSON object **or** newline-separated `Name: value` entries. |
|
|
206
|
+
| `--config` | — | YAML/JSON defaults (single object, a list, or `_defaults` + `configs`). |
|
|
207
|
+
| — | `TANGLE_VERBOSE=1` | Redacted HTTP request/response diagnostics (separate from progress logs). |
|
|
208
|
+
|
|
209
|
+
- **Env-var rename:** internal `TANGLE_AUTH` (username:password) → OSS
|
|
210
|
+
`TANGLE_API_TOKEN` (Bearer) **or** `TANGLE_API_AUTH_HEADER` (full header for
|
|
211
|
+
Basic/other schemes). The deploy-time source-attribution env var → dropped (see §8).
|
|
212
|
+
- **Run links:** replace internal run-URL links (`https://<internal-backend-host>/runs/<id>`) with
|
|
213
|
+
`<base-url>/runs/<id>` **or** "inspect via `tangle sdk pipeline-runs details RUN_ID`".
|
|
214
|
+
- **No internal package index.** Resolve dependencies against public PyPI
|
|
215
|
+
(`uv tool install tangle-cli` for a persistent CLI, or
|
|
216
|
+
`uvx --from tangle-cli tangle …` for one-off execution). Generic Python
|
|
217
|
+
environments may also use `pip install tangle-cli`; local checkout validation
|
|
218
|
+
uses `uv sync` / `uv run` inside the repo.
|
|
219
|
+
- Example for a protected backend:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
tangle sdk pipeline-runs submit pipeline.yaml \
|
|
223
|
+
--base-url https://api.example \
|
|
224
|
+
--auth-header 'Bearer …' \
|
|
225
|
+
-H 'X-Gateway-Auth: …' \
|
|
226
|
+
--log-type console
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
- **Auth-wizard replacement (D5):** a thin wizard that (1) asks for `--base-url`,
|
|
230
|
+
(2) picks one credential mechanism (`--token` vs `--auth-header` vs `-H`),
|
|
231
|
+
(3) shows the flag / env / `--config` setup, (4) verifies with a cheap call
|
|
232
|
+
(`tangle sdk pipeline-runs search --limit 1`), and (5) interprets 401/403/429.
|
|
233
|
+
No GCP/Workload-Identity/Terraform modes.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 5. Artifacts
|
|
238
|
+
|
|
239
|
+
`tangle sdk artifacts get RUN_ID -q '<JSON>'` is **metadata-only**. It returns
|
|
240
|
+
records of the form `{id, uri, size, hash}` (and a `count`); the `uri` is
|
|
241
|
+
**backend-agnostic**. There is **no `artifacts download` / `-o` to disk** in the CLI.
|
|
242
|
+
|
|
243
|
+
- **URI scheme is HuggingFace, not an internal cloud-bucket scheme.** Under the OSS `tangle` backend the
|
|
244
|
+
storage provider is `huggingface_repo_storage.py`, so artifact URIs look like:
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
hf://{model|dataset|space}s/<user>/<repo>@<branch>/<path>
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
e.g. `hf://datasets/acme/eval-artifacts@main/run-123/metrics.json`. **Any skill
|
|
251
|
+
text that parses, echoes, or hard-codes a specific storage scheme (e.g. a
|
|
252
|
+
cloud-bucket URI) must be made scheme-agnostic** — read the `uri` field; do not assume a scheme.
|
|
253
|
+
|
|
254
|
+
- **To fetch bytes** (the standard recipe — cite this from reporter/debugger/
|
|
255
|
+
researcher/reviewer/scenario-builder/step-5):
|
|
256
|
+
|
|
257
|
+
1. Get metadata and read the `uri`:
|
|
258
|
+
```bash
|
|
259
|
+
tangle sdk artifacts get RUN_ID -q '{"artifact_ids":["<artifact-id>"]}'
|
|
260
|
+
```
|
|
261
|
+
2. Ask the backend for a signed URL:
|
|
262
|
+
```bash
|
|
263
|
+
tangle api artifacts signed-artifact-url --id <artifact-id>
|
|
264
|
+
```
|
|
265
|
+
3. Fetch with a generic client — `curl -L "<signed-url>" -o ./out`, or for
|
|
266
|
+
`hf://` URIs `huggingface_hub` (`hf_hub_download` / `snapshot_download`).
|
|
267
|
+
|
|
268
|
+
Keep this recipe in one place (here); other files point at it rather than
|
|
269
|
+
repeating it.
|
|
270
|
+
|
|
271
|
+
- **Metadata-only is sufficient for many checks.** Reviewers can verify
|
|
272
|
+
existence/size/hash from `artifacts get` alone. Only mandate byte-fetching where
|
|
273
|
+
per-example or metric-content analysis genuinely requires it (reporter), and there
|
|
274
|
+
point at the signed-URL recipe above (see §10, D2).
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## 6. Learnings corpus
|
|
279
|
+
|
|
280
|
+
Replaces the internal cloud-storage learnings bucket. Two tiers:
|
|
281
|
+
|
|
282
|
+
- **Default — local directory.** A configurable `LEARNINGS_DIR`, default
|
|
283
|
+
`$SCENARIO_DIR/learnings/`, overridable via env. Records are **run_id-keyed**
|
|
284
|
+
JSON. Replace the internal cloud-storage upload command with a plain copy/write:
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
mkdir -p "$LEARNINGS_DIR/<scenario>"
|
|
288
|
+
cp learning.json "$LEARNINGS_DIR/<scenario>/learning-<run_id>.json"
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Keep the run_id-keying scheme (`active_run_id` for research, `best_run_id` for
|
|
292
|
+
the learning) and keep the resilience event — but reword "upload" → "record"
|
|
293
|
+
(the event `learning_upload_failed` becomes `learning_record_failed`; see §8/§10
|
|
294
|
+
D3). Genericize the word "bucket" → "corpus directory".
|
|
295
|
+
|
|
296
|
+
- **Shared tier — HuggingFace dataset repo.** For a team-shared corpus (the shared
|
|
297
|
+
bucket's real purpose), the OSS-native equivalent matches the backend's own
|
|
298
|
+
storage provider:
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
hf://datasets/<org>/<corpus>@main/<scenario>/<run_id>.json
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
pushed with `huggingface_hub` (`HfApi().upload_file(...)`). Document local-dir as
|
|
305
|
+
the default and the HF dataset as the optional shared tier. **Never** reintroduce
|
|
306
|
+
an internal cloud-storage bucket.
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## 7. Logs
|
|
311
|
+
|
|
312
|
+
Drop the **internal observability stack** (its hosts, datasets, `--source`
|
|
313
|
+
selectors, and auth env vars) entirely. The OSS log surface is split by what stores the data:
|
|
314
|
+
|
|
315
|
+
- **Container logs (application stdout/stderr)** — backend-native, the **only** CLI-native
|
|
316
|
+
log surface:
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
tangle sdk pipeline-runs logs EXECUTION_ID
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
(Note: this is keyed by **EXECUTION_ID**, not run id.)
|
|
323
|
+
|
|
324
|
+
- **Kubernetes/system events (OOM, eviction, scheduling, "pod not found")** — the
|
|
325
|
+
Tangle backend does **not** store these; they are **launcher-specific**. Frame as
|
|
326
|
+
"consult your launcher's runtime," with concrete per-launcher hints:
|
|
327
|
+
|
|
328
|
+
| Launcher | System-event source |
|
|
329
|
+
|---|---|
|
|
330
|
+
| `kubernetes`, `google_kubernetes` | `kubectl get events`, `kubectl describe pod <pod>` |
|
|
331
|
+
| `local_docker` | `docker logs <container>`, `docker inspect <container>` |
|
|
332
|
+
| `skypilot` | the cluster console / `sky logs` |
|
|
333
|
+
| `huggingface` | the Space's logs in the HF UI |
|
|
334
|
+
|
|
335
|
+
- This is a genuine **degradation** vs the internal observability path for *infra-failure*
|
|
336
|
+
diagnosis (no unified system-event search). The debugger skill must note the
|
|
337
|
+
weaker INFRA-failure signal and lean on container logs + launcher-native events.
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 8. Annotations
|
|
342
|
+
|
|
343
|
+
- **Drop the internal dashboard-compatibility annotation marker** and the entire
|
|
344
|
+
source-attribution mechanism (the deploy-source env var / `--source` flag).
|
|
345
|
+
These were pure downstream attribution for the internal dashboards and are safe to
|
|
346
|
+
remove for OSS.
|
|
347
|
+
- **Keep the generic annotation mechanism.** Portable annotations stay:
|
|
348
|
+
`--annotation session=… --annotation round=… --annotation type=… --annotation label=…`
|
|
349
|
+
(and `annotations set RUN_ID K V` after the fact).
|
|
350
|
+
- **Optional provenance only.** If a skill wants to mark its runs, use a single
|
|
351
|
+
optional `--annotation source=tangle-cli`. Do **not** make it mandatory and do
|
|
352
|
+
**not** reintroduce the internal dashboard marker.
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## 9. Security mandate (strip-list — release blocker)
|
|
357
|
+
|
|
358
|
+
Per the team's security mandate, internal references in an OSS repo are
|
|
359
|
+
**attack vectors** (supply-chain + reconnaissance), not cosmetic. Treat **any**
|
|
360
|
+
residual internal reference in a ported file as a **release blocker**.
|
|
361
|
+
|
|
362
|
+
No internal identifier may appear in **any** ported file — prose, code,
|
|
363
|
+
examples, comments, links, YAML, or annotations. The forbidden **categories**
|
|
364
|
+
(named here generically, so this public file does not itself carry the literal
|
|
365
|
+
strings it forbids):
|
|
366
|
+
|
|
367
|
+
- Internal backend / gateway / observability **hostnames**, and any internal
|
|
368
|
+
corporate domain.
|
|
369
|
+
- Cloud-storage **bucket URIs and bucket names** tied to internal infra, and the
|
|
370
|
+
helper code or CLIs that read or upload them.
|
|
371
|
+
- Internal **observability**, **data-warehouse**, **experimentation**, and
|
|
372
|
+
**session / identity** systems — their hosts, datasets, source selectors, and
|
|
373
|
+
auth/session env vars.
|
|
374
|
+
- Internal or vendor **compute** project IDs and ML-platform endpoints.
|
|
375
|
+
- Internal **package-index** URLs.
|
|
376
|
+
- Internal **dev-environment** tooling and monorepo source / zone paths.
|
|
377
|
+
- Employee usernames / emails as data (PII), and service-account names.
|
|
378
|
+
- Internal component digests presented as resolvable.
|
|
379
|
+
- Internal dashboard-attribution annotations and source-attribution env vars.
|
|
380
|
+
|
|
381
|
+
**Pre-release sweep.** The authoritative literal deny-list and the `grep`
|
|
382
|
+
patterns that enforce it **must live in private validation tooling, not in this
|
|
383
|
+
public tree** — shipping the literal internal strings, even inside a deny-list,
|
|
384
|
+
would itself violate the mandate. Before declaring any file done, run that
|
|
385
|
+
private sweep over the ported tree; then verify two non-sensitive structural
|
|
386
|
+
invariants directly here: every relative `../references/*.md` / `agents/*.md`
|
|
387
|
+
link still resolves, and no dropped subagent (the uploader) is still spawned.
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## 10. Resolved D1–D14 defaults
|
|
392
|
+
|
|
393
|
+
These are **final** (from plan §4, several pre-resolved by team Slack in §0c).
|
|
394
|
+
Apply them identically across all files.
|
|
395
|
+
|
|
396
|
+
- **D1 — Dehydrate.** Reframe the iteration loop around plain `export` (root spec
|
|
397
|
+
as-is) + hand-edit + `submit` (hydrate is the default). **Drop all `--dehydrate`
|
|
398
|
+
flags and the `grep -q ' spec:'` "dehydrate first" guards.** Do **not** add a new
|
|
399
|
+
dehydrate command. Accept hydrate-as-no-op on already-inline exports.
|
|
400
|
+
|
|
401
|
+
- **D2 — Artifact bytes.** Document the `artifacts get` → `tangle api artifacts
|
|
402
|
+
signed-artifact-url` → fetch recipe **once** (here, §5). Keep reporter's per-example
|
|
403
|
+
analysis requirement but point it at that recipe. Reviewer relies on
|
|
404
|
+
**metadata-only** verification.
|
|
405
|
+
|
|
406
|
+
- **D3 — Learnings corpus.** Canonical local path `LEARNINGS_DIR`, default
|
|
407
|
+
`$SCENARIO_DIR/learnings/` (env-overridable). Keep the corpus concept and the
|
|
408
|
+
resilience event, renamed `learning_record_failed`. Shared tier = HF dataset repo
|
|
409
|
+
(§6).
|
|
410
|
+
|
|
411
|
+
- **D4 — Data-source components.** **Drop the dedicated data-source recipes**
|
|
412
|
+
(`Promote/Load/Find data source`, `Download from cloud storage`). Reframe artifact reuse as
|
|
413
|
+
"record `run_id` / artifact `uri` locally and re-reference." Gate
|
|
414
|
+
`data-sources.md` as a **conditional** pattern doc ("if your backend provides
|
|
415
|
+
these components"), never a prerequisite.
|
|
416
|
+
|
|
417
|
+
- **D5 — Auth wizard.** **Replace** the GCP/Workload-Identity/Terraform wizard with a
|
|
418
|
+
minimal token/header wizard (see §4: ask base-url → pick `--token`/`--auth-header`/`-H`
|
|
419
|
+
→ show flag/env/`--config` setup → verify with `tangle sdk pipeline-runs search
|
|
420
|
+
--limit 1` → interpret 401/403/429). Drop Modes 1/2 wholesale.
|
|
421
|
+
|
|
422
|
+
- **D6 — Uploader agent.** **Drop the agent** (no OSS upload command; it relied on
|
|
423
|
+
the user's cloud-CLI auth + a hard-coded cloud-storage-download component). Preserve only the
|
|
424
|
+
portable kernels (file-vs-directory trailing-slash semantics, unique-filename
|
|
425
|
+
guidance, `componentRef` wiring shape) inside `uploading-artifacts.md`. Fix every
|
|
426
|
+
cross-reference that spawned the uploader to self-contained generic text.
|
|
427
|
+
|
|
428
|
+
- **D7 — Containerized component build.** **Drop**
|
|
429
|
+
`containerized-component-iteration.md`. Document `generate from-python --image
|
|
430
|
+
<registry/img:tag>` (image built/pushed by the user with their own docker/podman)
|
|
431
|
+
as the only component-generation path in `builder.md`. `set-container-image` is a
|
|
432
|
+
stub; do not use it.
|
|
433
|
+
|
|
434
|
+
- **D8 — Secrets.** **Drop GCP Secret Manager "Pattern B"** and the SA-impersonation
|
|
435
|
+
account-scoping section. **Keep Pattern A** (`dynamicData.secret`). Reduce
|
|
436
|
+
account-scoping to one generic paragraph: "secrets belong to the authenticating
|
|
437
|
+
identity; re-run with a different `--token` to create under another identity."
|
|
438
|
+
Prefer `secrets create --from-env ENVVAR` over `--value` in examples.
|
|
439
|
+
|
|
440
|
+
- **D9 — Scheduler / run-as.** No scheduler command to name — reduce "do not
|
|
441
|
+
schedule promote" to a generic conceptual caution. **Drop `--run-as` examples**
|
|
442
|
+
(OSS default hooks reject it; it is a downstream extension seam only).
|
|
443
|
+
|
|
444
|
+
- **D10 — `docs` command.** **Drop `docs` invocations.** Point to
|
|
445
|
+
`tangle sdk <group> --help`, `tangle sdk published-components library`, in-repo
|
|
446
|
+
schema docs, and the public OSS docs at
|
|
447
|
+
`github.com/TangleML/website/tree/master/docs` (confirmed canonical OSS docs home).
|
|
448
|
+
|
|
449
|
+
- **D11 — Component search.** Collapse to `tangle sdk published-components search
|
|
450
|
+
NAME` (keyword/name/digest only); **drop semantic/fuzzy/regex/schema variants.**
|
|
451
|
+
The PublishedComponents / remote-component-library feature is **off by default in
|
|
452
|
+
OSS**, so researcher/builder must treat component discovery as **optional** and
|
|
453
|
+
**tolerate empty results** on a fresh install — never a hard prerequisite of a
|
|
454
|
+
workflow step.
|
|
455
|
+
|
|
456
|
+
- **D12 — Run arguments.** Standardize on `--arg K=V` and `--args-json '<JSON>'`
|
|
457
|
+
(or `--args-json @file.json` where a file is wanted). **Rewrite every
|
|
458
|
+
`-f *.config.yaml` submit example** accordingly. `--config` carries CLI-option
|
|
459
|
+
defaults (base-url/auth/log-type), **not** pipeline run args.
|
|
460
|
+
|
|
461
|
+
- **D13 — Example-scenarios bundle.** **Drop all 16 files** (`INDEX.md` + `01`–`15`)
|
|
462
|
+
— internal-domain case studies with near-zero portable CLI content and many
|
|
463
|
+
strip-list violations. **Author 1–2 fresh synthetic examples** on a public dataset
|
|
464
|
+
(e.g. MSLR/LETOR for ranking; a public image-text set for matching) plus a new
|
|
465
|
+
`INDEX.md`. Any synthetic scenario must name only public datasets/models and
|
|
466
|
+
treat scheduling/run-as/data-source promotion as extension-only.
|
|
467
|
+
|
|
468
|
+
- **D14 — Step-4 light-poll client API.** **Replace the Python snippet** with the
|
|
469
|
+
CLI: `tangle sdk pipeline-runs status RUN_ID` and `tangle sdk pipeline-runs
|
|
470
|
+
graph-state EXECUTION_ID`. Do not ship a snippet that calls unverified client
|
|
471
|
+
methods.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Tangent Agent-Skills — Open-Source Port
|
|
2
|
+
|
|
3
|
+
This directory is an **open-source port of the Tangent agent-skill bundle**: a set of
|
|
4
|
+
instructions that let an autonomous coding agent run ML pipeline-tuning experiments end to
|
|
5
|
+
end against the [`tangle-cli`](https://github.com/TangleML/tangle-cli) CLI (binary
|
|
6
|
+
`tangle`, the `tangle sdk` / `tangle api` surfaces).
|
|
7
|
+
|
|
8
|
+
It is a faithful carbon copy of the original bundle with **every infrastructure-specific
|
|
9
|
+
reference removed and re-expressed against the public CLI**. The substitutions are not ad
|
|
10
|
+
hoc — they are governed by a single binding contract, [`OSS-CONVENTIONS.md`](./OSS-CONVENTIONS.md),
|
|
11
|
+
which every file in this tree inherits.
|
|
12
|
+
|
|
13
|
+
## What this is for
|
|
14
|
+
|
|
15
|
+
The bundle drives an 8-step autonomous loop (initialize → analyze → hypothesize → submit →
|
|
16
|
+
monitor → evaluate → synthesize → decide) plus a roster of specialized subagents. Point a
|
|
17
|
+
capable agent harness at `SKILL.md` as the entry index and it can: read a tuning scenario,
|
|
18
|
+
form a hypothesis, edit a pipeline config, submit a run, monitor it, pull artifacts and logs,
|
|
19
|
+
evaluate the result, and record a durable learning — looping until the scenario's goal is met.
|
|
20
|
+
|
|
21
|
+
## Layout
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
SKILL.md ← entry index: roster, the 8-step loop, invocation rules
|
|
25
|
+
OSS-CONVENTIONS.md ← the binding port contract (CLI surface, auth, artifacts,
|
|
26
|
+
logs, learnings, annotations, resolved defaults). Read first.
|
|
27
|
+
PORT-README.md ← this file
|
|
28
|
+
agents/ ← 7 subagents the loop spawns
|
|
29
|
+
builder.md debugger.md reporter.md researcher.md
|
|
30
|
+
reviewer.md scenario-builder.md auth-wizard.md
|
|
31
|
+
references/ ← the loop steps + topic references
|
|
32
|
+
step-0-initialize.md … step-7-decide.md
|
|
33
|
+
tangle-tools.md setup.md secrets.md data-sources.md
|
|
34
|
+
event-log.md knowledge-corpus.md iterating-on-runs.md uploading-artifacts.md
|
|
35
|
+
example-scenarios/ ← worked scenarios on PUBLIC datasets
|
|
36
|
+
INDEX.md 01-*.md 02-*.md
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## How to invoke
|
|
40
|
+
|
|
41
|
+
Normal usage runs the **published `tangle-cli` package**: install persistently with `uv tool install tangle-cli`, then run `tangle …` / `tangle-cli …`, or use `uvx --from tangle-cli tangle …` for one-off commands. Local checkout invocation (`uv run tangle …`) is only for validating changes inside the `tangle-cli` repo. Elsewhere, `tangle` still appears as a bare command noun in prose and in the §2 CLI map (the naming-surface exception). See `OSS-CONVENTIONS.md` §1.
|
|
42
|
+
|
|
43
|
+
## What changed from the internal bundle
|
|
44
|
+
|
|
45
|
+
The internal original was wired to closed, internal-only infrastructure. Each of those couplings was
|
|
46
|
+
replaced with the project's open, backend-agnostic equivalent:
|
|
47
|
+
|
|
48
|
+
| Internal coupling (removed) | Open-source replacement |
|
|
49
|
+
| ---------------------------------- | -------------------------------------------------------------------- |
|
|
50
|
+
| Internal CLI wrapper + env shim | `tangle …` / `tangle-cli …` from the published package, no environment shim |
|
|
51
|
+
| Cloud-object-storage artifact URIs | Scheme-agnostic artifact `uri` (e.g. `hf://…`); fetch via signed URL |
|
|
52
|
+
| Hosted log-search backend | `tangle sdk pipeline-runs logs` + launcher-native system events |
|
|
53
|
+
| Hard-coded internal API endpoint | `--base-url` / `TANGLE_API_URL` |
|
|
54
|
+
| Internal auth brokers / SSO | `--token` / `--auth-header` / `-H` (+ `TANGLE_API_*` env vars) |
|
|
55
|
+
| Cloud bucket "learnings" corpus | Local `LEARNINGS_DIR`, optional shared HuggingFace-dataset tier |
|
|
56
|
+
| Dashboard run-attribution tags | Dropped (generic user annotations retained) |
|
|
57
|
+
|
|
58
|
+
A few source files were **dropped rather than ported**, by design:
|
|
59
|
+
|
|
60
|
+
- **`agents/uploader.md`** — its portable guidance was folded into
|
|
61
|
+
`references/uploading-artifacts.md`; no surviving file spawns it.
|
|
62
|
+
- **`references/containerized-component-iteration.md`** — built on a container-build path that
|
|
63
|
+
is a not-implemented stub in the OSS CLI.
|
|
64
|
+
- **The 15 numbered case studies under `example-scenarios/`** — these were internal/customer
|
|
65
|
+
scenarios. They are replaced with self-contained synthetic scenarios on **public datasets**.
|
|
66
|
+
|
|
67
|
+
## Provenance & the security contract
|
|
68
|
+
|
|
69
|
+
This port treats internal references as a **release blocker**, not cosmetic cleanup: a leaked
|
|
70
|
+
internal hostname, project id, bucket URI, or credential path in open-source files is an attack
|
|
71
|
+
surface. `OSS-CONVENTIONS.md` §9 holds the full strip-list; every ported file was audited
|
|
72
|
+
against it. If you extend this bundle, run that audit on your additions before publishing.
|
|
73
|
+
|
|
74
|
+
## Intended destination
|
|
75
|
+
|
|
76
|
+
This tree is standalone and self-referential (all cross-references are relative). It is meant
|
|
77
|
+
to be dropped into the `tangle-cli` repo as an agent-skill bundle — for example at
|
|
78
|
+
`tangle-cli/skills/tangent/` (or wherever that repo loads agent skills from) — so the
|
|
79
|
+
harness can load `SKILL.md` as the index.
|