@ekanos/cli 0.3.5 → 0.3.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ekanos/cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.6",
|
|
4
4
|
"description": "The Ekanos partner toolchain CLI: scaffold, validate, and test an Ekanos integration against the published @ekanos packages. Agent-native — every verb speaks JSON with a stable exit-code taxonomy.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@clack/prompts": "1.7.0",
|
|
36
|
-
"@ekanos/integration-schema": "0.
|
|
36
|
+
"@ekanos/integration-schema": "0.6.0",
|
|
37
37
|
"esbuild": "0.28.1",
|
|
38
38
|
"picocolors": "1.1.1"
|
|
39
39
|
},
|
package/templates/AGENTS.md.tmpl
CHANGED
|
@@ -358,10 +358,11 @@ your handler with the values the user actually typed.
|
|
|
358
358
|
|
|
359
359
|
Build widget UI from `@ekanos/ui` — the published slice of the host design
|
|
360
360
|
system. Available modules (import individually, e.g. `@ekanos/ui/button`):
|
|
361
|
-
`alert`, `badge`, `button`, `card`, `dialog`, `
|
|
362
|
-
`
|
|
363
|
-
`
|
|
364
|
-
`
|
|
361
|
+
`alert`, `badge`, `button`, `card`, `confirm-dialog`, `dialog`,
|
|
362
|
+
`dropdown-menu`, `empty-note`, `form`, `icon`, `if`, `input`, `label`,
|
|
363
|
+
`search-field`, `select`, `sheet`, `separator`, `skeleton`, `spinner`,
|
|
364
|
+
`switch`, `table`, `tabs`, `textarea`, `tooltip`, `trans`, `utils` (the
|
|
365
|
+
`cn()` helper), `ai-prompt-input`, plus the stylesheets `styles.css` / `tokens.css` /
|
|
365
366
|
`theme.css` / `base.css`. Icons are Font Awesome glyph names via
|
|
366
367
|
`@ekanos/ui/icon`. This generated shell loads Font Awesome **Free**
|
|
367
368
|
(`@fortawesome/fontawesome-free`) — a much smaller set than the Pro kit Ekanos
|
|
@@ -427,6 +428,13 @@ who answers `/api/integrations/<slug>/…`:
|
|
|
427
428
|
declared scopes, copy the keys) derived from the declaration plus the
|
|
428
429
|
entry's `oauth.setup` (console link, provider-specific notes — WRITE these
|
|
429
430
|
for every OAuth integration), then a form that saves the keys server-side.
|
|
431
|
+
Check the provider's docs for how its token endpoint wants client
|
|
432
|
+
authentication: the default, HTTP Basic, is wrong for some providers
|
|
433
|
+
(LinkedIn accepts only the secret in the form body). Set
|
|
434
|
+
`oauth.provider.tokenAuthMethod: 'client_secret_post'` for those; omit it
|
|
435
|
+
for Basic (`'client_secret_basic'`). A `<slug>_oauth_error=provider_error`
|
|
436
|
+
means the provider itself sent the user back with an error other than
|
|
437
|
+
`access_denied`; read the harness log for its `error_description`.
|
|
430
438
|
Then Connect, and `onTokens` runs on the server. The connection is
|
|
431
439
|
memory-only — a dev-server restart means one more Connect. **Never take a
|
|
432
440
|
user's client id, secret or token through chat or write one into a file;
|
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
"prepare": "node scripts/setup-hooks.mjs"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@ekanos/sdk": "^0.
|
|
15
|
-
"@ekanos/ui": "^0.
|
|
14
|
+
"@ekanos/sdk": "^0.6.0",
|
|
15
|
+
"@ekanos/ui": "^0.6.0"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@ekanos/cli": "^0.3.
|
|
19
|
-
"@ekanos/harness": "^0.4.
|
|
18
|
+
"@ekanos/cli": "^0.3.6",
|
|
19
|
+
"@ekanos/harness": "^0.4.3",
|
|
20
20
|
"@hookform/resolvers": "^5.2.2",
|
|
21
21
|
"@tailwindcss/postcss": "^4.3.3",
|
|
22
22
|
"@tanstack/react-query": "^5.101.4",
|
|
@@ -33,7 +33,11 @@ live: { default: 'live' },
|
|
|
33
33
|
Find `consoleUrl` and the notes in the provider's docs during Phase 2
|
|
34
34
|
(research) — the "create an app" / "register an application" page. Write
|
|
35
35
|
what the CONSOLE calls things, not what the declaration calls them; the
|
|
36
|
-
harness already prints the declared secret names beside each field.
|
|
36
|
+
harness already prints the declared secret names beside each field. Also
|
|
37
|
+
read the provider's docs for how its token endpoint authenticates the client:
|
|
38
|
+
the default is HTTP Basic (`'client_secret_basic'`), but a provider that wants
|
|
39
|
+
`client_id` and `client_secret` in the form body (LinkedIn) needs
|
|
40
|
+
`provider.tokenAuthMethod: 'client_secret_post'` in the declaration. The
|
|
37
41
|
harness derives the rest — provider host, redirect URI, scopes, PKCE — from
|
|
38
42
|
`defineIntegration({ oauth })`, so do not repeat those in `notes`.
|
|
39
43
|
|
|
@@ -67,9 +71,13 @@ opens with a **Local OAuth** panel:
|
|
|
67
71
|
connected" is expected — say so instead of debugging.
|
|
68
72
|
- `<slug>_oauth_error=<code>` on the return URL is the transport's
|
|
69
73
|
vocabulary: `not_configured` = a key is still missing (check the panel's
|
|
70
|
-
badges), `denied` = the user cancelled at the provider, `
|
|
71
|
-
the provider
|
|
72
|
-
|
|
74
|
+
badges), `denied` = the user cancelled at the provider, `provider_error` =
|
|
75
|
+
the provider sent the user back with an error other than `access_denied`
|
|
76
|
+
(the dev-server log has its `error` and `error_description`),
|
|
77
|
+
`exchange_failed` = the provider rejected the exchange (wrong redirect URI
|
|
78
|
+
or secret, the wrong `tokenAuthMethod`, or the token host missing from
|
|
79
|
+
`egress`; the log line carries the provider's redacted response body),
|
|
80
|
+
`save_failed` = your `onTokens` threw
|
|
73
81
|
(read the dev-server log). Fix the cause; do not retry blindly.
|
|
74
82
|
- Widgets read the connection through `useOAuthWidgetGate` / the storage
|
|
75
83
|
route. If they show "Connect" after a successful loop, check `onActivate`
|