@moda-ai/cli 1.36.0 → 1.37.0
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 +2 -0
- package/dist/{cli-0p6n391h.js → cli-07tv75te.js} +21 -6
- package/dist/cli-0v6na3yp.js +35 -0
- package/dist/cli-c5c6f0yw.js +128 -0
- package/dist/{cli-7qkhy41j.js → cli-ert1sbbt.js} +112 -444
- package/dist/{cli-drabjmaj.js → cli-q79sq80a.js} +1 -35
- package/dist/{cli-scjxgaba.js → cli-qgf2cz2v.js} +2 -2
- package/dist/cli-ssfq84k5.js +393 -0
- package/dist/{cli-yz99t7n8.js → cli-strngwn3.js} +4 -2
- package/dist/cli.js +209 -10
- package/dist/{harness-github-actions-tk17mnge.js → harness-github-actions-qz5d22rz.js} +3 -2
- package/dist/{harness-heasma1f.js → harness-n2xgzz31.js} +3 -2
- package/dist/{index-pf2hvadv.js → index-vmmfya6b.js} +167 -207
- package/dist/prompt-source-mcp.js +3 -2
- package/dist/{provision-d242y9qd.js → provision-spwn5t41.js} +4 -3
- package/dist/skills-bundled-mdmhzfsr.js +14 -0
- package/package.json +1 -1
- package/skills/integration/index.json +3 -3
- package/skills/integration/integration-python-langchain/EXAMPLE.md +1 -1
- package/skills/integration/integration-python-langchain/SKILL.md +44 -11
- package/skills/moda-cli/SKILL.md +2 -0
|
@@ -5,11 +5,12 @@ import {
|
|
|
5
5
|
inspectCodeSelectors,
|
|
6
6
|
inspectPythonSelectors,
|
|
7
7
|
safePromptEvidencePath
|
|
8
|
-
} from "./cli-
|
|
8
|
+
} from "./cli-07tv75te.js";
|
|
9
|
+
import"./cli-q79sq80a.js";
|
|
9
10
|
import {
|
|
10
11
|
__commonJS,
|
|
11
12
|
__toESM
|
|
12
|
-
} from "./cli-
|
|
13
|
+
} from "./cli-0v6na3yp.js";
|
|
13
14
|
|
|
14
15
|
// ../../node_modules/.bun/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/code.js
|
|
15
16
|
var require_code = __commonJS((exports) => {
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
selectTenantAndCreateKey
|
|
3
|
-
} from "./cli-
|
|
3
|
+
} from "./cli-qgf2cz2v.js";
|
|
4
4
|
import {
|
|
5
5
|
loadAuthSession
|
|
6
|
-
} from "./cli-
|
|
6
|
+
} from "./cli-strngwn3.js";
|
|
7
7
|
import {
|
|
8
8
|
CliAuthError,
|
|
9
9
|
resolveIngestUrl,
|
|
10
10
|
resolveModaBaseUrl,
|
|
11
11
|
stringOption
|
|
12
|
-
} from "./cli-
|
|
12
|
+
} from "./cli-q79sq80a.js";
|
|
13
|
+
import"./cli-0v6na3yp.js";
|
|
13
14
|
|
|
14
15
|
// src/provision.ts
|
|
15
16
|
async function runProvision(context, options = {}) {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {
|
|
2
|
+
bundledSkillsDir,
|
|
3
|
+
installIntegrationSkill,
|
|
4
|
+
readBundledIndex,
|
|
5
|
+
readBundledSkillMd
|
|
6
|
+
} from "./cli-c5c6f0yw.js";
|
|
7
|
+
import"./cli-ssfq84k5.js";
|
|
8
|
+
import"./cli-0v6na3yp.js";
|
|
9
|
+
export {
|
|
10
|
+
readBundledSkillMd,
|
|
11
|
+
readBundledIndex,
|
|
12
|
+
installIntegrationSkill,
|
|
13
|
+
bundledSkillsDir
|
|
14
|
+
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "moda.skill_index.v1",
|
|
3
|
-
"bundled_at": "2026-09-
|
|
4
|
-
"cli_version": "1.
|
|
3
|
+
"bundled_at": "2026-09-27T21:11:50.220Z",
|
|
4
|
+
"cli_version": "1.37.0",
|
|
5
5
|
"skills": [
|
|
6
6
|
{
|
|
7
7
|
"id": "integration-cloudflare-think",
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
111
|
"id": "integration-python-langchain",
|
|
112
|
-
"version": "1.
|
|
112
|
+
"version": "1.1.0",
|
|
113
113
|
"summary": "Instrument a Python LangChain or LangGraph app with Moda: init before the framework, explicit conversation ids around every run.",
|
|
114
114
|
"targets": {
|
|
115
115
|
"language": "python",
|
|
@@ -53,7 +53,7 @@ moda.flush()
|
|
|
53
53
|
|
|
54
54
|
## What changed, and what did not
|
|
55
55
|
|
|
56
|
-
- `moda-ai` added to the project dependencies.
|
|
56
|
+
- `moda-ai`, `opentelemetry-instrumentation-langchain` and `wrapt<2` added to the project dependencies.
|
|
57
57
|
- One `moda.init` call added at startup, before any LangChain model is
|
|
58
58
|
constructed.
|
|
59
59
|
- Each agent/chain entry point is wrapped in the scoped context managers
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
id: integration-python-langchain
|
|
3
3
|
name: "Integrate Moda with LangChain / LangGraph (Python)"
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
category: integration
|
|
6
6
|
targets:
|
|
7
7
|
language: python
|
|
@@ -35,10 +35,11 @@ this skill, read https://docs.moda.dev/ingestion/moda-sdk.
|
|
|
35
35
|
Two constraints drive every step below:
|
|
36
36
|
|
|
37
37
|
1. Instrument at the Moda SDK level, not inside LangChain. Moda's Python SDK
|
|
38
|
-
|
|
39
|
-
enables all instruments by default (`instruments=None`)
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
knows a LangChain instrument (`Instruments.LANGCHAIN`) and `moda.init()`
|
|
39
|
+
enables all instruments by default (`instruments=None`), but it only
|
|
40
|
+
activates when `opentelemetry-instrumentation-langchain` is installed
|
|
41
|
+
next to `moda-ai` (Step 2). Do not add LangChain callbacks or handler
|
|
42
|
+
classes for Moda — no such Moda API exists.
|
|
42
43
|
2. Explicit conversation ids are mandatory. Moda's automatic conversation
|
|
43
44
|
detection hashes the first user message, and agent frameworks construct
|
|
44
45
|
different messages on every internal iteration, so without an explicit id
|
|
@@ -54,26 +55,58 @@ If you cannot find any LangChain/LangGraph entry point, stop and report.
|
|
|
54
55
|
|
|
55
56
|
## Step 2: Install the SDK
|
|
56
57
|
|
|
57
|
-
Install `moda-ai
|
|
58
|
-
|
|
58
|
+
Install `moda-ai`, the LangChain instrumentation it activates, and a
|
|
59
|
+
`wrapt<2` pin with the package manager this repository already uses
|
|
60
|
+
(`uv.lock` means uv, `poetry.lock` means poetry, otherwise pip). Without
|
|
61
|
+
`opentelemetry-instrumentation-langchain`, only raw provider calls are traced
|
|
62
|
+
and every chain, agent and tool span is missing. The instrumentation version
|
|
63
|
+
that resolves next to `moda-ai` fails to start under `wrapt` 2, so keep the
|
|
64
|
+
pin until `moda-ai` allows newer instrumentations:
|
|
59
65
|
|
|
60
66
|
```bash
|
|
61
|
-
pip install moda-ai
|
|
67
|
+
pip install moda-ai opentelemetry-instrumentation-langchain "wrapt<2"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
With pip, also record them in the file the project installs from, so a
|
|
71
|
+
fresh deployment gets them. In `requirements.txt`:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
moda-ai
|
|
75
|
+
opentelemetry-instrumentation-langchain
|
|
76
|
+
wrapt<2
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
In `pyproject.toml`, add quoted entries to the existing `dependencies` array:
|
|
80
|
+
|
|
81
|
+
```toml
|
|
82
|
+
dependencies = [
|
|
83
|
+
# ...existing dependencies...
|
|
84
|
+
"moda-ai",
|
|
85
|
+
"opentelemetry-instrumentation-langchain",
|
|
86
|
+
"wrapt<2",
|
|
87
|
+
]
|
|
62
88
|
```
|
|
63
89
|
|
|
64
90
|
With uv:
|
|
65
91
|
|
|
66
92
|
```bash
|
|
67
|
-
uv add moda-ai
|
|
93
|
+
uv add moda-ai opentelemetry-instrumentation-langchain "wrapt<2"
|
|
68
94
|
```
|
|
69
95
|
|
|
70
96
|
With poetry:
|
|
71
97
|
|
|
72
98
|
```bash
|
|
73
|
-
poetry add moda-ai
|
|
99
|
+
poetry add moda-ai opentelemetry-instrumentation-langchain "wrapt<2"
|
|
74
100
|
```
|
|
75
101
|
|
|
76
|
-
|
|
102
|
+
Skip `moda-ai` or the instrumentation if it is already a dependency. If the
|
|
103
|
+
project already constrains `wrapt` (for example `wrapt>=2` or `wrapt==2.*`),
|
|
104
|
+
change that constraint to `wrapt<2` rather than skipping it; if something else
|
|
105
|
+
in the project requires `wrapt` 2, stop and report the conflict.
|
|
106
|
+
|
|
107
|
+
After Step 3, start the app once and check its log: the line
|
|
108
|
+
`Error initializing LangChain instrumentor` means the instrumentation did not
|
|
109
|
+
activate. Stop and report it rather than continuing with provider-only traces.
|
|
77
110
|
|
|
78
111
|
## Step 3: Initialize Moda once at startup
|
|
79
112
|
|
package/skills/moda-cli/SKILL.md
CHANGED
|
@@ -997,6 +997,8 @@ npx: `npx -p @moda-ai/cli moda <command>`.
|
|
|
997
997
|
| `moda false-positive <kind> <target>` | Write: kinds `problem\|problem-detection\|quote\|tool\|laziness\|hallucination\|custom-signal`; `--reason` optional; problem-detection needs `--conversation-id` + `--attribution-id`; quote needs `--family`, `--turn`, `--quote`; tool needs `--tool` plus `--tool-use-id` or `--msg-index`; custom-signal needs `--conversation-id`; `--undo` removes a mark (not for problem) |
|
|
998
998
|
| `moda false-positives [conversation_id]` | Current false-positive marks: all (`--kind`, `--all` to include removed, `--limit`) or one trace with its problem detection reviews |
|
|
999
999
|
| `moda laziness` | Laziness detections per trace (`--days-back`, `--limit` 1-50, `--conversation-id`, `--family`) |
|
|
1000
|
+
| `moda problem-linear <problem_id>` | The Problem's linked Linear issue (key, state, URL) or `link: null`; needs Linear connected (Integrations → Linear) |
|
|
1001
|
+
| `moda problem-linear-file <problem_id>` | Write: file the Problem as a Linear issue (`--team-id`, `--title`, `--priority=0-4`), or link an existing one with `--issue=ENG-123\|URL` (exclusive with the others). Idempotent per Problem |
|
|
1000
1002
|
| `moda detection-reviews <conversation_id>` | Problem detections on a trace with review state (`--attribution-id=UUID` narrows to one) |
|
|
1001
1003
|
| `moda detection-review <problem_id>` | Write: `--conversation-id`, `--attribution-id` (UUID), `--verdict=correct\|false_positive\|clear`, optional `--note` |
|
|
1002
1004
|
| `moda signals` | Custom signals: criteria, status, 7-day judged/matched stats |
|