@nullplatform/mcp 0.1.8 → 0.1.10

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.
Files changed (3) hide show
  1. package/dist/i18n.js +204 -204
  2. package/dist/render.js +15 -3
  3. package/package.json +1 -1
package/dist/i18n.js CHANGED
@@ -13,19 +13,19 @@ const english = {
13
13
  "resolve.ambiguous": "Several applications match — say which one (name or `#id`):",
14
14
  "resolve.noId": "No application with id {id}.",
15
15
  "resolve.noMatch": 'No application matching "{ref}".',
16
- "resolve.repoUnlinked": 'This repo ({url}) isn\'t linked to any nullplatform application. Pass app:"<name>" or run application_create to link it.',
16
+ "resolve.repoUnlinked": 'This repo ({url}) isn\'t linked to any nullplatform application. Pass app:"<name>" or link it as a new application.',
17
17
  "resolve.noInput": 'No app given and no git remote found in the workspace. Pass app:"<name>" (or an id like "#123").',
18
18
  "resolve.noNrn": "Can't resolve the application NRN for **{app}**.",
19
19
  // — scope selection —
20
20
  "scope.which": "Which scope?",
21
21
  "scope.none": "This app has no scopes yet.",
22
- "scope.noneHint": '`application_scope_create name:"dev"` first then `application_deployment_create`.',
22
+ "scope.noneHint": "create a scope (e.g. a “dev scope) first, then deploy.",
23
23
  "scope.noMatch": 'No scope matching "{wanted}". Scopes: {names}.',
24
24
  "scope.noMatchDetailed": 'No scope matching "{wanted}" (by name or dimension). Scopes:',
25
- "scope.createHint": '`application_scope_create name:"{name}"` to create it.',
26
- "scope.deployHint": '`application_deployment_create scope:"<name or dimension, e.g. environment=production>"`',
25
+ "scope.createHint": "create the **{name}** scope first.",
26
+ "scope.deployHint": "name the scope or dimension to deploy onto (e.g. environment=production).",
27
27
  "scope.perScope": "{noun} are per scope — which one?",
28
- "scope.readHint": '`{tool} scope:"{name}"`',
28
+ "scope.readHint": "read it for the **{name}** scope.",
29
29
  // — table headers —
30
30
  "header.app": "App",
31
31
  "header.id": "Id",
@@ -100,25 +100,25 @@ const english = {
100
100
  "render.now": "now",
101
101
  "render.desired": "→ desired {pct}%",
102
102
  // — next-step hints (status) —
103
- "hint.rolloutTraffic": 'deployment #{id} on **{scope}** is at {traffic}% traffic — `application_deployment_update percent:<n>` to advance, `application_deployment_update action:"finalize"` when done, `application_deployment_update action:"rollback"` to back out.',
104
- "hint.rolloutStatus": "deployment #{id} on **{scope}** is {status} — `application_get deployment:{id}` to watch.",
105
- "hint.noScopes": 'no scopes yet — `application_scope_create name:"dev"` to get a place to deploy.',
106
- "hint.buildNewer": "build #{id} ({branch} @{commit}) is newer than release {semver} — `application_deployment_create` ships it (creates the release for you).",
107
- "hint.buildUnreleased": "build #{id} has no release yet — `application_deployment_create` ships it (creates the release for you).",
108
- "hint.releaseNotLive": "release {semver} isn't live yet — `application_deployment_create` to ship it.",
109
- "hint.noBuilds": "no builds yet — push a commit so CI produces one, then `application_deployment_create`.",
103
+ "hint.rolloutTraffic": "deployment #{id} on **{scope}** is at {traffic}% traffic — move traffic up to advance, finalize once it's at 100%, or roll back to back out.",
104
+ "hint.rolloutStatus": "deployment #{id} on **{scope}** is {status} — keep watching it roll out.",
105
+ "hint.noScopes": "no scopes yet — create one (e.g. a “dev scope) to get a place to deploy.",
106
+ "hint.buildNewer": "build #{id} ({branch} @{commit}) is newer than release {semver} — deploy it to ship the new code (the release is cut for you).",
107
+ "hint.buildUnreleased": "build #{id} has no release yet — deploy it to ship (the release is cut for you).",
108
+ "hint.releaseNotLive": "release {semver} isn't live yet — deploy it to ship.",
109
+ "hint.noBuilds": "no builds yet — push a commit so CI produces one, then deploy.",
110
110
  "hint.upToDate": "everything is up to date ✅",
111
- "hint.watch": "`application_get deployment:{id}` to watch.",
111
+ "hint.watch": "keep watching the rollout to see it land.",
112
112
  // — next-step hints (rollout) —
113
- "rollout.full": 'all traffic on the new version — `application_deployment_update action:"finalize"` to retire the old one.',
114
- "rollout.moving": "traffic moving {from}% → {to}% — `application_get deployment:{id}` to watch.",
115
- "rollout.at": 'traffic at {traffic}% — `application_deployment_update percent:<n>` to advance (marks: 1,5,10,25,50,75,90,95,99,100), `application_deployment_update action:"rollback"` to back out.',
116
- "rollout.instances": "instances are coming up — `application_get deployment:{id}` to watch.",
117
- "rollout.switching": "traffic is switching — `application_get deployment:{id}` to watch.",
113
+ "rollout.full": "all traffic on the new version — finalize to retire the old one.",
114
+ "rollout.moving": "traffic moving {from}% → {to}% — keep watching it land.",
115
+ "rollout.at": "traffic at {traffic}% — move it up to advance (marks: 1, 5, 10, 25, 50, 75, 90, 95, 99, 100%), or roll back to back out.",
116
+ "rollout.instances": "instances are coming up — keep watching.",
117
+ "rollout.switching": "traffic is switching — keep watching.",
118
118
  "rollout.finalizing": "finalizing — old instances are being retired.",
119
119
  "rollout.done": "done — the release is fully live ✅",
120
120
  "rollout.approval": "waiting for an approval ✋ — an approver must allow this deployment (dashboard → Approvals).",
121
- "rollout.failed": 'deployment failed — `application_log_list` for output, `application_deployment_update action:"rollback"` if traffic moved.',
121
+ "rollout.failed": "deployment failed — check the logs for output, and roll back if traffic moved.",
122
122
  "rollout.rolledBack": "rolled back — previous version is serving all traffic.",
123
123
  // — application_get tool —
124
124
  "status.errorLabel": "Couldn't load status",
@@ -126,21 +126,21 @@ const english = {
126
126
  "findApps.noneMatching": "No applications{matching}{inNamespace}.",
127
127
  "findApps.matching": ' matching "{query}"',
128
128
  "findApps.inNamespace": ' in namespaces ~"{namespace}"',
129
- "findApps.createHint": "`application_create` links this repo as a new application.",
129
+ "findApps.createHint": "link this repo as a new application.",
130
130
  "findApps.count.one": "1 application",
131
131
  "findApps.count.many": "{count} applications",
132
- "findApps.statusHint": '`application_get app:"<name>"` for the full picture of one.',
132
+ "findApps.statusHint": "ask for one by name to see its full picture.",
133
133
  "findApps.truncated": "Showing the first {shown} — narrow with a query or namespace to see the rest.",
134
134
  "findApps.errorLabel": "Search failed",
135
135
  // — application_parameter_list tool —
136
- "params.unavailable": "Parameter listing isn't available here. `application_parameter_create` still works.",
136
+ "params.unavailable": "Parameter listing isn't available here, but setting parameters still works.",
137
137
  "params.viewInDashboard": "view in dashboard",
138
138
  "params.none": "**{app}** has no parameters.",
139
- "params.noneHint": "`application_parameter_create` to add env vars or files.",
139
+ "params.noneHint": "add an env var or file parameter to get started.",
140
140
  "params.count.one": "**{app}** · 1 parameter",
141
141
  "params.count.many": "**{app}** · {count} parameters",
142
142
  "params.unset": "_unset_",
143
- "params.applyHint": "changed values apply on the next `application_deployment_create`.",
143
+ "params.applyHint": "changed values apply on the next deploy.",
144
144
  "params.effectiveFor": "**{app}** · effective parameters for **{scope}**",
145
145
  "params.ctxApplication": "Application",
146
146
  "params.ctxScope": "{scope} (scope)",
@@ -148,7 +148,7 @@ const english = {
148
148
  // — application_log_list tool —
149
149
  "logs.noun": "Logs",
150
150
  "logs.noScopes": "**{app}** has no scopes, so there are no runtime logs yet.",
151
- "logs.noScopesHint": "`application_deployment_create` after creating a scope — logs appear once something runs.",
151
+ "logs.noScopesHint": "create a scope and deploy — logs appear once something runs.",
152
152
  "logs.empty": "No log lines returned for **{app}**{scope}.",
153
153
  "logs.openInDashboard": "open logs in dashboard",
154
154
  "logs.lastLines.one": "**{app}**{scope} — last line",
@@ -158,7 +158,7 @@ const english = {
158
158
  // — application_metric_list tool —
159
159
  "metrics.noun": "Metrics",
160
160
  "metrics.noScopes": "**{app}** has no scopes, so there are no runtime metrics yet.",
161
- "metrics.noScopesHint": "`application_deployment_create` after creating a scope.",
161
+ "metrics.noScopesHint": "create a scope and deploy to start collecting metrics.",
162
162
  "metrics.empty": "No metric datapoints for **{app}** · {scope} in the last {window} — the scope may be young or the metrics agent not wired.",
163
163
  "metrics.openInDashboard": "performance in dashboard",
164
164
  "metrics.title": "**{app}** · {scope} — last {window}",
@@ -171,9 +171,9 @@ const english = {
171
171
  "builds.released": "Released",
172
172
  "builds.none": "**{app}** has no builds yet.",
173
173
  "builds.noneForCommit": "No build in **{app}** for commit `{commit}` — it may not have built yet, or the commit isn't on a built branch.",
174
- "builds.noneHint": "push a commit so CI produces one, then `application_deployment_create`.",
175
- "builds.deployHint": "`application_deployment_create build_id:{build}` ships it (cuts the release for you).",
176
- "builds.waiting": "build #{build} is still running — `application_build_list` again in a moment to check.",
174
+ "builds.noneHint": "push a commit so CI produces one, then deploy.",
175
+ "builds.deployHint": "deploy build #{build} to ship it (the release is cut for you).",
176
+ "builds.waiting": "build #{build} is still running — check again in a moment.",
177
177
  "builds.upToDate": "the latest successful build is already released.",
178
178
  "builds.assetsTitle": "Assets of build #{build}",
179
179
  "builds.noAssets": "Build #{build} has no assets.",
@@ -183,23 +183,23 @@ const english = {
183
183
  "releaseList.title.one": "**{app}** · 1 release",
184
184
  "releaseList.title.many": "**{app}** · {count} releases",
185
185
  "releaseList.none": "**{app}** has no releases yet.",
186
- "releaseList.noneHint": "cut one from a successful build with `application_release_create`, or just `application_deployment_create`.",
187
- "releaseList.deployHint": 'deploy an active release with `application_deployment_create version:"x.y.z"`.',
186
+ "releaseList.noneHint": "cut one from a successful build, or just deploy (it cuts the release for you).",
187
+ "releaseList.deployHint": "deploy an active release by version (e.g. x.y.z).",
188
188
  "releaseList.errorLabel": "Couldn't list releases",
189
189
  "deploymentList.title.one": "**{app}** · 1 deployment",
190
190
  "deploymentList.title.many": "**{app}** · {count} deployments",
191
191
  "deploymentList.none": "**{app}** has no deployments yet.",
192
192
  "deploymentList.group": "{count} scopes (group)",
193
- "deploymentList.hint": "`application_get` for the live picture, or `application_deployment_update` to drive a rollout.",
193
+ "deploymentList.hint": "ask for the app's status to see the live picture, or drive a rollout's traffic.",
194
194
  "deploymentList.errorLabel": "Couldn't list deployments",
195
195
  // — organization_get tool —
196
196
  "overview.title.one": "Organization overview · 1 application scanned",
197
197
  "overview.title.many": "Organization overview · {count} applications scanned",
198
- "overview.truncated": '_(showing the first {count} — narrow with `organization_get query:"..."`)_',
198
+ "overview.truncated": "_(showing the first {count} — narrow with a query to see more)_",
199
199
  "overview.activeRollouts": "Active rollouts ({count})",
200
200
  "overview.trouble": "Needs attention ({count})",
201
- "overview.hintActive": '`application_get app:"{app}"` to watch a rollout, or `application_deployment_update` to drive one.',
202
- "overview.hintTrouble": '`application_log_list app:"{app}"` to investigate, `application_deployment_update action:"rollback"` if needed.',
201
+ "overview.hintActive": "open **{app}** to watch a rollout, or drive its traffic.",
202
+ "overview.hintTrouble": "check the logs of **{app}** to investigate, and roll back if needed.",
203
203
  "overview.hintCalm": "everything is steady — nothing rolling out, nothing failed.",
204
204
  "overview.errorLabel": "Couldn't build the overview",
205
205
  // — application_approval_list tool —
@@ -210,10 +210,10 @@ const english = {
210
210
  "approvals.requestedBy": "Requested by",
211
211
  "approvals.none": "No pending approvals for **{app}**.",
212
212
  "approvals.needId": "Pass `approval_id` together with the action.",
213
- "approvals.invalidId": "That doesn't look like a valid approval id — copy it from the `application_approval_list` list.",
213
+ "approvals.invalidId": "That doesn't look like a valid approval id — copy it from the approvals list.",
214
214
  "approvals.approved": "Approved {id} — the gated action can proceed.",
215
215
  "approvals.cancelled": "Cancelled approval {id}.",
216
- "approvals.actHint": '`application_approval_list action:"approve" approval_id:"{id}"` to let it proceed (uses your permissions).',
216
+ "approvals.actHint": "approve {id} to let it proceed (uses your permissions).",
217
217
  "approvals.errorLabel": "Couldn't load approvals",
218
218
  // — application_service_list tool —
219
219
  "services.attached.one": "**{app}** · 1 dependency service",
@@ -230,19 +230,19 @@ const english = {
230
230
  "createService.matchAmbiguous": 'Several dependencies match "{query}" — pick one:',
231
231
  "createService.category": "Category",
232
232
  "createService.provider": "Provider",
233
- "createService.pickHint": '`application_service_create type:"<name>"` to provision one.',
233
+ "createService.pickHint": "name a dependency type to provision one.",
234
234
  "createService.form": "Ready to provision **{spec}** for **{app}** — submit to create it (this creates real cloud resources).",
235
235
  "createService.formHint": "submit the panel to provision, or pass `provision:true` with the parameters.",
236
236
  "createService.provisioning": "Provisioning **{spec}** as **{name}** — {status}. Real resources are being created.",
237
237
  "createService.reused": "**{name}** already exists ({status}) — reusing it, not provisioning a second one.",
238
- "createService.provisioningHint": "`application_link_create` to link **{name}** to a scope — its connection parameters appear after the link, on the next deploy.",
238
+ "createService.provisioningHint": "link **{name}** to a scope — its connection parameters appear after the link, on the next deploy.",
239
239
  // — application_link_create tool —
240
240
  "createLink.errorLabel": "Couldn't create the link",
241
241
  "createLink.noServices": "**{app}** has no provisioned services to link yet.",
242
- "createLink.noServicesHint": "`application_service_create` to provision a dependency first.",
242
+ "createLink.noServicesHint": "provision a dependency service first.",
243
243
  "createLink.pickService": "Which service to link to **{app}**?",
244
244
  "createLink.matchAmbiguous": "Several services match — pick one:",
245
- "createLink.pickHint": '`application_link_create service:"<name>"` to link one.',
245
+ "createLink.pickHint": "name a service to link one.",
246
246
  "createLink.noLinkSpec": "No link specification is available for **{service}** in this org.",
247
247
  "createLink.form": "Ready to link **{service}** to **{app}** — submit to create the link (a credential link provisions a database user).",
248
248
  "createLink.formHint": "submit the panel to create the link, or pass `create:true` with the parameters.",
@@ -252,15 +252,15 @@ const english = {
252
252
  // — application_service_update / application_link_update (run a custom action) —
253
253
  "runAction.errorLabel": "Couldn't run the action",
254
254
  "runAction.noServices": "**{app}** has no provisioned services to run an action on.",
255
- "runAction.noServicesHint": "`application_service_create` to provision a dependency first.",
255
+ "runAction.noServicesHint": "provision a dependency service first.",
256
256
  "runAction.noLinks": "**{app}** has no links to run an action on.",
257
- "runAction.noLinksHint": "`application_link_create` to link a service first.",
257
+ "runAction.noLinksHint": "link a service first.",
258
258
  "runAction.pickService": "Which service to run an action on, in **{app}**?",
259
259
  "runAction.serviceAmbiguous": "Several services match — pick one:",
260
- "runAction.pickServiceHint": '`application_service_update service:"<name>"` to choose one.',
260
+ "runAction.pickServiceHint": "name a service to choose one.",
261
261
  "runAction.pickLink": "Which link to run an action on, in **{app}**?",
262
262
  "runAction.linkAmbiguous": "Several links match — pick one:",
263
- "runAction.pickLinkHint": '`application_link_update link:"<name>"` to choose one.',
263
+ "runAction.pickLinkHint": "name a link to choose one.",
264
264
  "runAction.noActions": "**{name}** exposes no runnable actions.",
265
265
  "runAction.pickAction": "Which action to run on **{name}**?",
266
266
  "runAction.matchAmbiguous": "Several actions match — pick one:",
@@ -277,12 +277,12 @@ const english = {
277
277
  "deleteEntity.noLinks": "**{app}** has no links to delete.",
278
278
  "deleteEntity.pickService": "Which service to delete, in **{app}**?",
279
279
  "deleteEntity.serviceAmbiguous": "Several services match — pick one:",
280
- "deleteEntity.pickServiceHint": '`application_service_delete service:"<name>"` to choose one.',
280
+ "deleteEntity.pickServiceHint": "name a service to choose one.",
281
281
  "deleteEntity.pickLink": "Which link to delete, in **{app}**?",
282
282
  "deleteEntity.linkAmbiguous": "Several links match — pick one:",
283
- "deleteEntity.pickLinkHint": '`application_link_delete link:"<name>"` to choose one.',
283
+ "deleteEntity.pickLinkHint": "name a link to choose one.",
284
284
  "deleteEntity.hasLinks": "**{name}** still has {count} active link(s) — they'd be orphaned.",
285
- "deleteEntity.hasLinksHint": "delete the links first with `application_link_delete`, then the service.",
285
+ "deleteEntity.hasLinksHint": "delete the links first, then the service.",
286
286
  "deleteEntity.confirm": "Ready to delete **{name}** and destroy its resources — submit to confirm.",
287
287
  "deleteEntity.confirmHint": "submit the panel to delete, or pass `confirm:true`.",
288
288
  "deleteEntity.removed": "**{name}** was deleted.",
@@ -292,7 +292,7 @@ const english = {
292
292
  "deleteParam.errorLabel": "Couldn't delete the parameter",
293
293
  "deleteParam.absent": "**{name}** isn't set on **{app}** — nothing to delete.",
294
294
  "deleteParam.readOnly": "**{name}** is read-only — a service link injects it.",
295
- "deleteParam.readOnlyHint": "delete the link that exports it with `application_link_delete`.",
295
+ "deleteParam.readOnlyHint": "delete the link that exports it instead.",
296
296
  "deleteParam.confirm": "Ready to delete **{name}** from **{app}** — submit to confirm.",
297
297
  "deleteParam.confirmHint": "submit the panel to delete, or pass `confirm:true`.",
298
298
  "deleteParam.deleted": "Deleted **{name}** from **{app}**.",
@@ -300,22 +300,22 @@ const english = {
300
300
  "deleteParam.failed": "Couldn't delete **{name}**: {message}",
301
301
  // — application_deployment_create tool —
302
302
  "deploy.noScopeTypes": "This app has no scopes yet. Available scope types: {types}.",
303
- "deploy.createScopeHint": '`application_scope_create name:"dev" type:"{type}"`',
303
+ "deploy.createScopeHint": "create a scope first (e.g. a “dev scope of type {type}).",
304
304
  "deploy.usingRelease": "Using existing release **{semver}** (#{id}). ",
305
305
  "deploy.createdRelease": "Created release **{semver}** from build #{build}. ",
306
306
  "deploy.createdReleaseFrom": "Created release **{semver}** from build #{build} ({branch} @{commit}). ",
307
307
  "deploy.noSuchVersion": "No release **{version}** exists{known} and there's no successful build to cut it from.",
308
308
  "deploy.knownVersions": " (known: {versions})",
309
309
  "deploy.nothing": "Nothing to deploy: no active releases and no successful builds.",
310
- "deploy.nothingHint": "push a commit so CI produces a build, then `application_deployment_create` again.",
310
+ "deploy.nothingHint": "push a commit so CI produces a build, then deploy again.",
311
311
  "deploy.multiAsset": "Build #{build} has several assets — which one ships to **{scope}** ({type})?",
312
- "deploy.assetHint": '`application_deployment_create asset:"{name}"`',
312
+ "deploy.assetHint": "deploy again, naming the asset to ship (e.g. {name}).",
313
313
  "deploy.errorLabel": "Deploy failed",
314
314
  "deploy.alreadyRolling": "This release is already rolling out on **{scope}** — showing that deployment.",
315
- "deploy.rejected": 'Deploy rejected: {message}\nThis usually means the asset choice, not the ids — the build likely has several assets. Retry with `application_deployment_create asset:"<name>"` (see them via `application_get`).',
315
+ "deploy.rejected": "Deploy rejected: {message}\nThis usually means the asset choice, not the ids — the build likely has several assets. Retry naming the asset to ship (the status view lists them).",
316
316
  // — application_deployment_update tool —
317
- "traffic.sayWhat": 'Say what to do: `percent:<0-100>`, `action:"finalize"` or `action:"rollback"`.',
318
- "traffic.noActive": "No active rollout on **{app}** — `application_deployment_create` starts one.",
317
+ "traffic.sayWhat": "Tell me what to do: set a traffic percentage (0100), finalize, or roll back.",
318
+ "traffic.noActive": "No active rollout on **{app}** — deploy to start one.",
319
319
  "traffic.several": "Several rollouts are active — pass deployment_id:",
320
320
  "traffic.snapped": "({requested}% snapped to {snapped}%)",
321
321
  "traffic.errorLabel": "Traffic action failed",
@@ -324,7 +324,7 @@ const english = {
324
324
  "createRelease.done": "Release **{semver}** created{from}.",
325
325
  "createRelease.exists": "Release **{semver}** already exists for build #{build} — reusing it.",
326
326
  "createRelease.from": " from build #{build} ({branch} @{commit}, {when})",
327
- "createRelease.deployHint": "`application_deployment_create release_id:{id}` to ship it.",
327
+ "createRelease.deployHint": "deploy release #{id} to ship it.",
328
328
  "createRelease.errorLabel": "Couldn't create release",
329
329
  // — application_parameter_create tool —
330
330
  "setParams.created.one": "Set 1 new parameter on **{app}**: {names}.",
@@ -332,9 +332,9 @@ const english = {
332
332
  "setParams.updated.one": "Updated 1 existing parameter on **{app}**: {names}.",
333
333
  "setParams.updated.many": "Updated {count} existing parameters on **{app}**: {names}.",
334
334
  "setParams.mixed": "Set {total} parameters on **{app}** (new: {created}, updated: {updated}): {names}.",
335
- "setParams.applyHint": "values apply on the next `application_deployment_create`.",
335
+ "setParams.applyHint": "values apply on the next deploy.",
336
336
  "setParams.scopeDimConflict": "Can't target both a scope and dimensions for `{name}` — a scope already locates the value. Pick one.",
337
- "setParams.partial": "Parameter update failed partway: {message}\nAlready-created parameters remain — `application_parameter_list` to inspect.",
337
+ "setParams.partial": "Parameter update failed partway: {message}\nAlready-created parameters remain — list them to inspect.",
338
338
  "setParams.errorLabel": "Parameter update failed",
339
339
  // — application_create tool —
340
340
  "createApp.form": "To create an application I need a git repository URL and a name (the form collects them).\nNamespaces: {namespaces}.",
@@ -343,24 +343,24 @@ const english = {
343
343
  "createApp.noAccountMatch": 'No account matching "{account}". Accounts: {names}.',
344
344
  "createApp.whichNamespace": "Which namespace?",
345
345
  "createApp.whichNamespaceFor": "Which namespace should own **{name}**?",
346
- "createApp.namespaceHint": '`application_create namespace:"<name>"`',
346
+ "createApp.namespaceHint": "name the namespace to create it in.",
347
347
  "createApp.noNamespaces": "This organization has no namespaces yet — create one in the dashboard first.",
348
348
  "createApp.created": "**{name}** created (#{id}) in namespace **{namespace}**, linked to {repo}.",
349
349
  "createApp.alreadyLinked": "**{name}** (#{id}) is already linked to {repo} — nothing to create.",
350
- "createApp.createdHint": "push a commit to trigger the first build, then `application_deployment_create`.",
351
- "createApp.createdHintNew": "the repo was scaffolded for you — clone {repo} into a folder, add your code there, and push so CI builds it, then `application_deployment_create`.",
350
+ "createApp.createdHint": "push a commit to trigger the first build, then deploy.",
351
+ "createApp.createdHintNew": "the repo was scaffolded for you — clone {repo} into a folder, add your code there, and push so CI builds it, then deploy.",
352
352
  "createApp.pending": "⏳ **{name}** created (#{id}), provisioning is still running (status: {status}).",
353
- "createApp.pendingHint": '`application_get app:"#{id}"` to check on it.',
353
+ "createApp.pendingHint": "check on application #{id} to see its progress.",
354
354
  "createApp.errorLabel": "Couldn't create the application",
355
355
  // — playbook_get tool —
356
356
  "playbook.errorLabel": "Couldn't load the playbook",
357
357
  // — application_scope_create tool —
358
358
  "createScope.whichType": "Which scope type for **{name}**?",
359
- "createScope.typeHint": '`application_scope_create name:"{name}" type:"<type>"`',
359
+ "createScope.typeHint": "name a scope type for **{name}** to create it.",
360
360
  "createScope.noTypes": 'No scope types available — pass type explicitly (e.g. type:"web_pool").',
361
361
  "createScope.provisioning": "⏳ Scope **{name}** (#{id}, {type}{dimensions}) is provisioning — infrastructure is being created.",
362
362
  "createScope.exists": "Scope **{name}** (#{id}) already exists ({status}) — nothing to create.",
363
- "createScope.provisioningHint": '`application_get` shows it; once active, `application_deployment_create scope:"{name}"`.',
363
+ "createScope.provisioningHint": "its status shows it; once active, deploy to the **{name}** scope.",
364
364
  "createScope.errorLabel": "Couldn't create scope",
365
365
  // — auth & transport —
366
366
  "error.credentialRejected": "nullplatform rejected the credential ({status}) — check your NP_API_KEY",
@@ -382,32 +382,32 @@ const english = {
382
382
  "prompt.ship.toScope": ' to the "{scope}" scope',
383
383
  "prompt.thisRepoApp": "the application linked to this repo",
384
384
  "prompt.setup": `Connect this repository to nullplatform:
385
- 1. Run application_get — if the repo is already linked to an application, just show me where I stand.
386
- 2. If it isn't linked, check application_list for an app matching this repo's name before creating anything.
387
- 3. If none exists, application_create to link it, then show application_get and tell me what happens next (first build via CI, then deploy).`,
385
+ 1. Check this app's status — if the repo is already linked to an application, just show me where I stand.
386
+ 2. If it isn't linked, search for an app matching this repo's name before creating anything.
387
+ 3. If none exists, create the application to link it, then show its status and tell me what happens next (first build via CI, then deploy).`,
388
388
  "prompt.health": `Give me a health check of {app}:
389
389
  1. status — what's live where, anything mid-rollout?
390
390
  2. metrics (3h window) — call out anything unusual in throughput, response time, error rate, CPU or memory.
391
391
  3. logs — scan the recent lines for errors or warnings.
392
392
  Finish with a one-paragraph verdict: healthy / degraded / in trouble, and the single most useful next action.`,
393
- "prompt.rollback": `Something is wrong — roll back {app} right now: find its active rollout, run application_deployment_update action:"rollback", then confirm with application_get that the previous version is serving traffic and summarize what was rolled back.`,
393
+ "prompt.rollback": `Something is wrong — roll back {app} right now: find its active rollout, roll it back, then confirm from its status that the previous version is serving traffic and summarize what was rolled back.`,
394
394
  };
395
395
  const spanish = {
396
396
  "resolve.ambiguous": "Varias aplicaciones coinciden — decime cuál (nombre o `#id`):",
397
397
  "resolve.noId": "No hay ninguna aplicación con id {id}.",
398
398
  "resolve.noMatch": 'No hay ninguna aplicación que coincida con "{ref}".',
399
- "resolve.repoUnlinked": 'Este repo ({url}) no está vinculado a ninguna aplicación de nullplatform. Pasá app:"<nombre>" o ejecutá application_create para vincularlo.',
399
+ "resolve.repoUnlinked": 'Este repo ({url}) no está vinculado a ninguna aplicación de nullplatform. Pasá app:"<nombre>" o vinculalo como una aplicación nueva.',
400
400
  "resolve.noInput": 'No se indicó app y no hay git remote en el workspace. Pasá app:"<nombre>" (o un id como "#123").',
401
401
  "resolve.noNrn": "No puedo resolver el NRN de la aplicación **{app}**.",
402
402
  "scope.which": "¿Qué scope?",
403
403
  "scope.none": "Esta app todavía no tiene scopes.",
404
- "scope.noneHint": '`application_scope_create name:"dev"` primero después `application_deployment_create`.',
404
+ "scope.noneHint": "creá un scope (por ejemplo un scope “dev”) primero, después deployá.",
405
405
  "scope.noMatch": 'Ningún scope coincide con "{wanted}". Scopes: {names}.',
406
406
  "scope.noMatchDetailed": 'Ningún scope coincide con "{wanted}" (por nombre o dimensión). Scopes:',
407
- "scope.createHint": '`application_scope_create name:"{name}"` para crearlo.',
408
- "scope.deployHint": '`application_deployment_create scope:"<nombre o dimensión, p. ej. environment=production>"`',
407
+ "scope.createHint": "creá el scope **{name}** primero.",
408
+ "scope.deployHint": "nombrá el scope o dimensión donde deployar (p. ej. environment=production).",
409
409
  "scope.perScope": "{noun} son por scope — ¿cuál?",
410
- "scope.readHint": '`{tool} scope:"{name}"`',
410
+ "scope.readHint": "leelo para el scope **{name}**.",
411
411
  "header.app": "App",
412
412
  "header.id": "Id",
413
413
  "header.namespace": "Namespace",
@@ -477,50 +477,50 @@ const spanish = {
477
477
  "render.started": "empezó {when}",
478
478
  "render.now": "ahora",
479
479
  "render.desired": "→ deseado {pct}%",
480
- "hint.rolloutTraffic": 'el deployment #{id} en **{scope}** está al {traffic}% de tráfico — `application_deployment_update percent:<n>` para avanzar, `application_deployment_update action:"finalize"` al terminar, `application_deployment_update action:"rollback"` para volver atrás.',
481
- "hint.rolloutStatus": "el deployment #{id} en **{scope}** está {status} — `application_get deployment:{id}` para seguirlo.",
482
- "hint.noScopes": 'sin scopes todavía — `application_scope_create name:"dev"` para tener dónde deployar.',
483
- "hint.buildNewer": "el build #{id} ({branch} @{commit}) es más nuevo que la release {semver} — `application_deployment_create` lo publica (crea la release por vos).",
484
- "hint.buildUnreleased": "el build #{id} no tiene release — `application_deployment_create` lo publica (crea la release por vos).",
485
- "hint.releaseNotLive": "la release {semver} no está en vivo — `application_deployment_create` para publicarla.",
486
- "hint.noBuilds": "sin builds todavía — pusheá un commit para que CI genere uno, después `application_deployment_create`.",
480
+ "hint.rolloutTraffic": "el deployment #{id} en **{scope}** está al {traffic}% de tráfico — subí el tráfico para avanzar, finalizá cuando llegue a 100%, o volvé atrás con un rollback.",
481
+ "hint.rolloutStatus": "el deployment #{id} en **{scope}** está {status} — seguí el rollout para ver cómo avanza.",
482
+ "hint.noScopes": "sin scopes todavía — creá uno (por ejemplo un scope “dev”) para tener dónde deployar.",
483
+ "hint.buildNewer": "el build #{id} ({branch} @{commit}) es más nuevo que la release {semver} — deployalo para publicar el código nuevo (la release se crea sola).",
484
+ "hint.buildUnreleased": "el build #{id} todavía no tiene release — deployalo para publicarlo (la release se crea sola).",
485
+ "hint.releaseNotLive": "la release {semver} todavía no está en vivo — deployala para publicarla.",
486
+ "hint.noBuilds": "sin builds todavía — pusheá un commit para que CI genere uno, después deployá.",
487
487
  "hint.upToDate": "todo está al día ✅",
488
- "hint.watch": "`application_get deployment:{id}` para seguirlo.",
489
- "rollout.full": 'todo el tráfico en la versión nueva — `application_deployment_update action:"finalize"` para retirar la vieja.',
490
- "rollout.moving": "el tráfico va de {from}% → {to}% — `application_get deployment:{id}` para seguirlo.",
491
- "rollout.at": 'tráfico al {traffic}% — `application_deployment_update percent:<n>` para avanzar (marcas: 1,5,10,25,50,75,90,95,99,100), `application_deployment_update action:"rollback"` para volver atrás.',
492
- "rollout.instances": "las instancias están levantando — `application_get deployment:{id}` para seguirlo.",
493
- "rollout.switching": "el tráfico se está moviendo — `application_get deployment:{id}` para seguirlo.",
488
+ "hint.watch": "seguí el rollout para verlo aterrizar.",
489
+ "rollout.full": "todo el tráfico en la versión nueva — finalizá para retirar la vieja.",
490
+ "rollout.moving": "el tráfico va de {from}% → {to}% — seguí cómo aterriza.",
491
+ "rollout.at": "tráfico al {traffic}% — subilo para avanzar (marcas: 1, 5, 10, 25, 50, 75, 90, 95, 99, 100%), o volvé atrás con un rollback.",
492
+ "rollout.instances": "las instancias están levantando — seguí el rollout.",
493
+ "rollout.switching": "el tráfico se está moviendo — seguí el rollout.",
494
494
  "rollout.finalizing": "finalizando — se están retirando las instancias viejas.",
495
495
  "rollout.done": "listo — la release está completamente en vivo ✅",
496
496
  "rollout.approval": "esperando una aprobación ✋ — alguien tiene que aprobar este deployment (dashboard → Approvals).",
497
- "rollout.failed": 'el deployment falló — `application_log_list` para ver la salida, `application_deployment_update action:"rollback"` si se movió tráfico.',
497
+ "rollout.failed": "el deployment falló — revisá los logs para ver la salida, y volvé atrás con un rollback si se movió tráfico.",
498
498
  "rollout.rolledBack": "revertido — la versión anterior está sirviendo todo el tráfico.",
499
499
  "status.errorLabel": "No pude cargar el estado",
500
500
  "findApps.noneMatching": "No hay aplicaciones{matching}{inNamespace}.",
501
501
  "findApps.matching": ' que coincidan con "{query}"',
502
502
  "findApps.inNamespace": ' en namespaces ~"{namespace}"',
503
- "findApps.createHint": "`application_create` vincula este repo como una aplicación nueva.",
503
+ "findApps.createHint": "vinculá este repo como una aplicación nueva.",
504
504
  "findApps.count.one": "1 aplicación",
505
505
  "findApps.count.many": "{count} aplicaciones",
506
- "findApps.statusHint": '`application_get app:"<nombre>"` para ver el panorama completo de una.',
506
+ "findApps.statusHint": "pedí una por nombre para ver su panorama completo.",
507
507
  "findApps.truncated": "Mostrando las primeras {shown} — afiná con una búsqueda o namespace para ver el resto.",
508
508
  "findApps.errorLabel": "Falló la búsqueda",
509
- "params.unavailable": "El listado de parámetros no está disponible acá. `application_parameter_create` igual funciona.",
509
+ "params.unavailable": "El listado de parámetros no está disponible acá, pero setear parámetros igual funciona.",
510
510
  "params.viewInDashboard": "ver en el dashboard",
511
511
  "params.none": "**{app}** no tiene parámetros.",
512
- "params.noneHint": "`application_parameter_create` para agregar variables de entorno o archivos.",
512
+ "params.noneHint": "agregá una variable de entorno o un archivo para empezar.",
513
513
  "params.count.one": "**{app}** · 1 parámetro",
514
514
  "params.count.many": "**{app}** · {count} parámetros",
515
515
  "params.unset": "_sin valor_",
516
- "params.applyHint": "los valores cambiados aplican en el próximo `application_deployment_create`.",
516
+ "params.applyHint": "los valores cambiados aplican en el próximo deploy.",
517
517
  "params.effectiveFor": "**{app}** · parámetros efectivos para **{scope}**",
518
518
  "params.ctxApplication": "Aplicación",
519
519
  "params.ctxScope": "{scope} (scope)",
520
520
  "params.errorLabel": "No pude listar los parámetros",
521
521
  "logs.noun": "Los logs",
522
522
  "logs.noScopes": "**{app}** no tiene scopes, así que todavía no hay logs de runtime.",
523
- "logs.noScopesHint": "`application_deployment_create` después de crear un scope — los logs aparecen cuando algo corre.",
523
+ "logs.noScopesHint": "creá un scope y deployá — los logs aparecen cuando algo corre.",
524
524
  "logs.empty": "No hay líneas de log para **{app}**{scope}.",
525
525
  "logs.openInDashboard": "abrir logs en el dashboard",
526
526
  "logs.lastLines.one": "**{app}**{scope} — última línea",
@@ -529,7 +529,7 @@ const spanish = {
529
529
  "logs.errorSuffix": "La vista Logs del dashboard puede tenerlos igual.",
530
530
  "metrics.noun": "Las métricas",
531
531
  "metrics.noScopes": "**{app}** no tiene scopes, así que todavía no hay métricas de runtime.",
532
- "metrics.noScopesHint": "`application_deployment_create` después de crear un scope.",
532
+ "metrics.noScopesHint": "creá un scope y deployá para empezar a juntar métricas.",
533
533
  "metrics.empty": "No hay datapoints de métricas para **{app}** · {scope} en las últimas {window} — el scope puede ser muy nuevo o el agente de métricas no estar conectado.",
534
534
  "metrics.openInDashboard": "performance en el dashboard",
535
535
  "metrics.title": "**{app}** · {scope} — últimas {window}",
@@ -542,9 +542,9 @@ const spanish = {
542
542
  "builds.released": "Released",
543
543
  "builds.none": "**{app}** todavía no tiene builds.",
544
544
  "builds.noneForCommit": "Ningún build en **{app}** para el commit `{commit}` — puede que todavía no haya buildeado, o que el commit no esté en una branch que buildea.",
545
- "builds.noneHint": "pusheá un commit para que CI genere uno, después `application_deployment_create`.",
546
- "builds.deployHint": "`application_deployment_create build_id:{build}` lo publica (crea la release por vos).",
547
- "builds.waiting": "el build #{build} sigue corriendo — `application_build_list` de nuevo en un momento para chequear.",
545
+ "builds.noneHint": "pusheá un commit para que CI genere uno, después deployá.",
546
+ "builds.deployHint": "deployá el build #{build} para publicarlo (la release se crea sola).",
547
+ "builds.waiting": "el build #{build} sigue corriendo — chequeá de nuevo en un momento.",
548
548
  "builds.upToDate": "el último build exitoso ya está publicado.",
549
549
  "builds.assetsTitle": "Assets del build #{build}",
550
550
  "builds.noAssets": "El build #{build} no tiene assets.",
@@ -554,23 +554,23 @@ const spanish = {
554
554
  "releaseList.title.one": "**{app}** · 1 release",
555
555
  "releaseList.title.many": "**{app}** · {count} releases",
556
556
  "releaseList.none": "**{app}** todavía no tiene releases.",
557
- "releaseList.noneHint": "cortá uno desde un build exitoso con `application_release_create`, o directamente `application_deployment_create`.",
558
- "releaseList.deployHint": 'deployá un release activo con `application_deployment_create version:"x.y.z"`.',
557
+ "releaseList.noneHint": "cortá una desde un build exitoso, o directamente deployá (corta la release por vos).",
558
+ "releaseList.deployHint": "deployá una release activa por versión (ej. x.y.z).",
559
559
  "releaseList.errorLabel": "No pude listar los releases",
560
560
  "deploymentList.title.one": "**{app}** · 1 deployment",
561
561
  "deploymentList.title.many": "**{app}** · {count} deployments",
562
562
  "deploymentList.none": "**{app}** todavía no tiene deployments.",
563
563
  "deploymentList.group": "{count} scopes (grupo)",
564
- "deploymentList.hint": "`application_get` para la foto en vivo, o `application_deployment_update` para conducir un rollout.",
564
+ "deploymentList.hint": "pedí el estado de la app para la foto en vivo, o manejá el tráfico de un rollout.",
565
565
  "deploymentList.errorLabel": "No pude listar los deployments",
566
566
  // — organization_get tool —
567
567
  "overview.title.one": "Panorama de la organización · 1 aplicación escaneada",
568
568
  "overview.title.many": "Panorama de la organización · {count} aplicaciones escaneadas",
569
- "overview.truncated": '_(muestro las primeras {count} — acotá con `organization_get query:"..."`)_',
569
+ "overview.truncated": "_(muestro las primeras {count} — acotá con una búsqueda para ver más)_",
570
570
  "overview.activeRollouts": "Rollouts activos ({count})",
571
571
  "overview.trouble": "Requiere atención ({count})",
572
- "overview.hintActive": '`application_get app:"{app}"` para seguir un rollout, o `application_deployment_update` para manejarlo.',
573
- "overview.hintTrouble": '`application_log_list app:"{app}"` para investigar, `application_deployment_update action:"rollback"` si hace falta.',
572
+ "overview.hintActive": "abrí **{app}** para seguir un rollout, o manejá su tráfico.",
573
+ "overview.hintTrouble": "revisá los logs de **{app}** para investigar, y volvé atrás con un rollback si hace falta.",
574
574
  "overview.hintCalm": "todo tranquilo — nada desplegándose, nada falló.",
575
575
  "overview.errorLabel": "No pude armar el panorama",
576
576
  // — application_approval_list tool —
@@ -581,10 +581,10 @@ const spanish = {
581
581
  "approvals.requestedBy": "Solicitada por",
582
582
  "approvals.none": "No hay aprobaciones pendientes para **{app}**.",
583
583
  "approvals.needId": "Pasá `approval_id` junto con la acción.",
584
- "approvals.invalidId": "Eso no parece un approval id válido — copialo de la lista de `application_approval_list`.",
584
+ "approvals.invalidId": "Eso no parece un approval id válido — copialo de la lista de aprobaciones.",
585
585
  "approvals.approved": "Aprobé {id} — la acción bloqueada puede continuar.",
586
586
  "approvals.cancelled": "Cancelé la aprobación {id}.",
587
- "approvals.actHint": '`application_approval_list action:"approve" approval_id:"{id}"` para dejarla continuar (usa tus permisos).',
587
+ "approvals.actHint": "aprobá {id} para dejarla continuar (usa tus permisos).",
588
588
  "approvals.errorLabel": "No pude cargar las aprobaciones",
589
589
  // — application_service_list tool —
590
590
  "services.attached.one": "**{app}** · 1 servicio de dependencia",
@@ -601,19 +601,19 @@ const spanish = {
601
601
  "createService.matchAmbiguous": 'Varias dependencias coinciden con "{query}" — elegí una:',
602
602
  "createService.category": "Categoría",
603
603
  "createService.provider": "Proveedor",
604
- "createService.pickHint": '`application_service_create type:"<nombre>"` para provisionar una.',
604
+ "createService.pickHint": "nombrá un tipo de dependencia para provisionar una.",
605
605
  "createService.form": "Listo para provisionar **{spec}** en **{app}** — confirmá para crearlo (crea recursos cloud reales).",
606
606
  "createService.formHint": "confirmá en el panel para provisionar, o pasá `provision:true` con los parámetros.",
607
607
  "createService.provisioning": "Provisionando **{spec}** como **{name}** — {status}. Se están creando recursos reales.",
608
608
  "createService.reused": "**{name}** ya existe ({status}) — lo reuso, no provisiono un segundo.",
609
- "createService.provisioningHint": "`application_link_create` para linkear **{name}** a un scope — sus parámetros de conexión aparecen después del link, en el próximo deploy.",
609
+ "createService.provisioningHint": "linkeá **{name}** a un scope — sus parámetros de conexión aparecen después del link, en el próximo deploy.",
610
610
  // — application_link_create tool —
611
611
  "createLink.errorLabel": "No pude crear el link",
612
612
  "createLink.noServices": "**{app}** todavía no tiene servicios provisionados para linkear.",
613
- "createLink.noServicesHint": "`application_service_create` para provisionar una dependencia primero.",
613
+ "createLink.noServicesHint": "provisioná un servicio de dependencia primero.",
614
614
  "createLink.pickService": "¿Qué servicio linkear a **{app}**?",
615
615
  "createLink.matchAmbiguous": "Varios servicios coinciden — elegí uno:",
616
- "createLink.pickHint": '`application_link_create service:"<nombre>"` para linkear uno.',
616
+ "createLink.pickHint": "nombrá un servicio para linkear uno.",
617
617
  "createLink.noLinkSpec": "No hay link specification disponible para **{service}** en esta org.",
618
618
  "createLink.form": "Listo para linkear **{service}** a **{app}** — confirmá para crear el link (un link de credenciales provisiona un usuario de base de datos).",
619
619
  "createLink.formHint": "confirmá en el panel para crear el link, o pasá `create:true` con los parámetros.",
@@ -623,15 +623,15 @@ const spanish = {
623
623
  // — application_service_update / application_link_update (correr una custom action) —
624
624
  "runAction.errorLabel": "No pude correr la acción",
625
625
  "runAction.noServices": "**{app}** no tiene servicios provisionados para correr una acción.",
626
- "runAction.noServicesHint": "`application_service_create` para provisionar una dependencia primero.",
626
+ "runAction.noServicesHint": "provisioná un servicio de dependencia primero.",
627
627
  "runAction.noLinks": "**{app}** no tiene links para correr una acción.",
628
- "runAction.noLinksHint": "`application_link_create` para linkear un servicio primero.",
628
+ "runAction.noLinksHint": "linkeá un servicio primero.",
629
629
  "runAction.pickService": "¿En qué servicio correr una acción, en **{app}**?",
630
630
  "runAction.serviceAmbiguous": "Varios servicios coinciden — elegí uno:",
631
- "runAction.pickServiceHint": '`application_service_update service:"<nombre>"` para elegir uno.',
631
+ "runAction.pickServiceHint": "nombrá un servicio para elegir uno.",
632
632
  "runAction.pickLink": "¿En qué link correr una acción, en **{app}**?",
633
633
  "runAction.linkAmbiguous": "Varios links coinciden — elegí uno:",
634
- "runAction.pickLinkHint": '`application_link_update link:"<nombre>"` para elegir uno.',
634
+ "runAction.pickLinkHint": "nombrá un link para elegir uno.",
635
635
  "runAction.noActions": "**{name}** no expone acciones ejecutables.",
636
636
  "runAction.pickAction": "¿Qué acción correr en **{name}**?",
637
637
  "runAction.matchAmbiguous": "Varias acciones coinciden — elegí una:",
@@ -648,12 +648,12 @@ const spanish = {
648
648
  "deleteEntity.noLinks": "**{app}** no tiene links para borrar.",
649
649
  "deleteEntity.pickService": "¿Qué servicio borrar, en **{app}**?",
650
650
  "deleteEntity.serviceAmbiguous": "Varios servicios coinciden — elegí uno:",
651
- "deleteEntity.pickServiceHint": '`application_service_delete service:"<nombre>"` para elegir uno.',
651
+ "deleteEntity.pickServiceHint": "nombrá un servicio para elegir uno.",
652
652
  "deleteEntity.pickLink": "¿Qué link borrar, en **{app}**?",
653
653
  "deleteEntity.linkAmbiguous": "Varios links coinciden — elegí uno:",
654
- "deleteEntity.pickLinkHint": '`application_link_delete link:"<nombre>"` para elegir uno.',
654
+ "deleteEntity.pickLinkHint": "nombrá un link para elegir uno.",
655
655
  "deleteEntity.hasLinks": "**{name}** todavía tiene {count} link(s) activo(s) — quedarían huérfanos.",
656
- "deleteEntity.hasLinksHint": "borrá los links primero con `application_link_delete`, después el servicio.",
656
+ "deleteEntity.hasLinksHint": "borrá los links primero, después el servicio.",
657
657
  "deleteEntity.confirm": "Listo para borrar **{name}** y destruir sus recursos — confirmá para borrar.",
658
658
  "deleteEntity.confirmHint": "confirmá en el panel para borrar, o pasá `confirm:true`.",
659
659
  "deleteEntity.removed": "**{name}** fue borrado.",
@@ -663,28 +663,28 @@ const spanish = {
663
663
  "deleteParam.errorLabel": "No pude borrar el parámetro",
664
664
  "deleteParam.absent": "**{name}** no está seteado en **{app}** — nada que borrar.",
665
665
  "deleteParam.readOnly": "**{name}** es de solo lectura — lo inyecta un link de servicio.",
666
- "deleteParam.readOnlyHint": "borrá el link que lo exporta con `application_link_delete`.",
666
+ "deleteParam.readOnlyHint": "borrá el link que lo exporta.",
667
667
  "deleteParam.confirm": "Listo para borrar **{name}** de **{app}** — confirmá para borrar.",
668
668
  "deleteParam.confirmHint": "confirmá en el panel para borrar, o pasá `confirm:true`.",
669
669
  "deleteParam.deleted": "Borré **{name}** de **{app}**.",
670
670
  "deleteParam.deletedHint": "el cambio aplica en el próximo deploy.",
671
671
  "deleteParam.failed": "No pude borrar **{name}**: {message}",
672
672
  "deploy.noScopeTypes": "Esta app no tiene scopes todavía. Tipos de scope disponibles: {types}.",
673
- "deploy.createScopeHint": '`application_scope_create name:"dev" type:"{type}"`',
673
+ "deploy.createScopeHint": "creá un scope primero (por ejemplo un scope “dev de tipo {type}).",
674
674
  "deploy.usingRelease": "Usando la release existente **{semver}** (#{id}). ",
675
675
  "deploy.createdRelease": "Creé la release **{semver}** desde el build #{build}. ",
676
676
  "deploy.createdReleaseFrom": "Creé la release **{semver}** desde el build #{build} ({branch} @{commit}). ",
677
677
  "deploy.noSuchVersion": "No existe la release **{version}**{known} y no hay un build exitoso del cual cortarla.",
678
678
  "deploy.knownVersions": " (conocidas: {versions})",
679
679
  "deploy.nothing": "Nada para deployar: no hay releases activas ni builds exitosos.",
680
- "deploy.nothingHint": "pusheá un commit para que CI genere un build y después `application_deployment_create` de nuevo.",
680
+ "deploy.nothingHint": "pusheá un commit para que CI genere un build y después deployá de nuevo.",
681
681
  "deploy.multiAsset": "El build #{build} tiene varios assets — ¿cuál va a **{scope}** ({type})?",
682
- "deploy.assetHint": '`application_deployment_create asset:"{name}"`',
682
+ "deploy.assetHint": "deployá de nuevo, nombrando el asset a publicar (ej. {name}).",
683
683
  "deploy.errorLabel": "Falló el deploy",
684
684
  "deploy.alreadyRolling": "Esta release ya se está desplegando en **{scope}** — muestro ese deployment.",
685
- "deploy.rejected": 'Deploy rechazado: {message}\nEsto suele ser la elección de asset, no los ids — el build probablemente tiene varios assets. Reintentá con `application_deployment_create asset:"<nombre>"` (los ves con `application_get`).',
686
- "traffic.sayWhat": 'Decime qué hacer: `percent:<0-100>`, `action:"finalize"` o `action:"rollback"`.',
687
- "traffic.noActive": "No hay rollout activo en **{app}** — `application_deployment_create` arranca uno.",
685
+ "deploy.rejected": "Deploy rechazado: {message}\nEsto suele ser la elección de asset, no los ids — el build probablemente tiene varios assets. Reintentá nombrando el asset a publicar (los ves en el estado de la app).",
686
+ "traffic.sayWhat": "Decime qué hacer: poné un porcentaje de tráfico (0100), finalizá, o volvé atrás con un rollback.",
687
+ "traffic.noActive": "No hay rollout activo en **{app}** — deployá para arrancar uno.",
688
688
  "traffic.several": "Hay varios rollouts activos — pasá deployment_id:",
689
689
  "traffic.snapped": "({requested}% ajustado a {snapped}%)",
690
690
  "traffic.errorLabel": "Falló la acción de tráfico",
@@ -692,16 +692,16 @@ const spanish = {
692
692
  "createRelease.done": "Release **{semver}** creada{from}.",
693
693
  "createRelease.exists": "La release **{semver}** ya existe para el build #{build} — la reuso.",
694
694
  "createRelease.from": " desde el build #{build} ({branch} @{commit}, {when})",
695
- "createRelease.deployHint": "`application_deployment_create release_id:{id}` para publicarla.",
695
+ "createRelease.deployHint": "deployá la release #{id} para publicarla.",
696
696
  "createRelease.errorLabel": "No pude crear la release",
697
697
  "setParams.created.one": "Configuré 1 parámetro nuevo en **{app}**: {names}.",
698
698
  "setParams.created.many": "Configuré {count} parámetros nuevos en **{app}**: {names}.",
699
699
  "setParams.updated.one": "Actualicé 1 parámetro existente en **{app}**: {names}.",
700
700
  "setParams.updated.many": "Actualicé {count} parámetros existentes en **{app}**: {names}.",
701
701
  "setParams.mixed": "Configuré {total} parámetros en **{app}** (nuevos: {created}, actualizados: {updated}): {names}.",
702
- "setParams.applyHint": "los valores aplican en el próximo `application_deployment_create`.",
702
+ "setParams.applyHint": "los valores aplican en el próximo deploy.",
703
703
  "setParams.scopeDimConflict": "No se puede apuntar a un scope y dimensiones a la vez para `{name}` — el scope ya ubica el valor. Elegí uno.",
704
- "setParams.partial": "La actualización de parámetros falló a mitad de camino: {message}\nLos parámetros ya creados quedan — `application_parameter_list` para inspeccionar.",
704
+ "setParams.partial": "La actualización de parámetros falló a mitad de camino: {message}\nLos parámetros ya creados quedan — listalos para inspeccionar.",
705
705
  "setParams.errorLabel": "Falló la actualización de parámetros",
706
706
  "createApp.form": "Para crear una aplicación necesito la URL de un repo git y un nombre (el formulario los pide).\nNamespaces: {namespaces}.",
707
707
  "createApp.noName": "No pude derivar un nombre desde {url} — pasá name.",
@@ -709,23 +709,23 @@ const spanish = {
709
709
  "createApp.noAccountMatch": 'Ninguna cuenta coincide con "{account}". Cuentas: {names}.',
710
710
  "createApp.whichNamespace": "¿Qué namespace?",
711
711
  "createApp.whichNamespaceFor": "¿Qué namespace debería ser dueño de **{name}**?",
712
- "createApp.namespaceHint": '`application_create namespace:"<nombre>"`',
712
+ "createApp.namespaceHint": "nombrá el namespace donde crearla.",
713
713
  "createApp.noNamespaces": "Esta organización no tiene namespaces — creá uno en el dashboard primero.",
714
714
  "createApp.created": "**{name}** creada (#{id}) en el namespace **{namespace}**, vinculada a {repo}.",
715
715
  "createApp.alreadyLinked": "**{name}** (#{id}) ya está vinculada a {repo} — no hay nada que crear.",
716
- "createApp.createdHint": "pusheá un commit para disparar el primer build y después `application_deployment_create`.",
717
- "createApp.createdHintNew": "el repo fue scaffoldeado — cloná {repo} en una carpeta, agregá tu código ahí y pusheá para que CI buildee, después `application_deployment_create`.",
716
+ "createApp.createdHint": "pusheá un commit para disparar el primer build y después deployá.",
717
+ "createApp.createdHintNew": "el repo fue scaffoldeado — cloná {repo} en una carpeta, agregá tu código ahí y pusheá para que CI buildee, después deployá.",
718
718
  "createApp.pending": "⏳ **{name}** creada (#{id}), el aprovisionamiento sigue corriendo (estado: {status}).",
719
- "createApp.pendingHint": '`application_get app:"#{id}"` para revisarla.',
719
+ "createApp.pendingHint": "revisá la aplicación #{id} para ver cómo va.",
720
720
  "createApp.errorLabel": "No pude crear la aplicación",
721
721
  // — playbook_get tool —
722
722
  "playbook.errorLabel": "No pude cargar el playbook",
723
723
  "createScope.whichType": "¿Qué tipo de scope para **{name}**?",
724
- "createScope.typeHint": '`application_scope_create name:"{name}" type:"<tipo>"`',
724
+ "createScope.typeHint": "nombrá un tipo de scope para **{name}** para crearlo.",
725
725
  "createScope.noTypes": 'No hay tipos de scope disponibles — pasá type explícito (p. ej. type:"web_pool").',
726
726
  "createScope.provisioning": "⏳ El scope **{name}** (#{id}, {type}{dimensions}) se está aprovisionando — se está creando infraestructura.",
727
727
  "createScope.exists": "El scope **{name}** (#{id}) ya existe ({status}) — no hay nada que crear.",
728
- "createScope.provisioningHint": '`application_get` lo muestra; cuando esté activo, `application_deployment_create scope:"{name}"`.',
728
+ "createScope.provisioningHint": "el estado de la app lo muestra; cuando esté activo, deployá al scope **{name}**.",
729
729
  "createScope.errorLabel": "No pude crear el scope",
730
730
  "error.credentialRejected": "nullplatform rechazó la credencial ({status}) — revisá tu NP_API_KEY",
731
731
  "error.permission": "tu usuario de nullplatform no tiene permisos para esta acción (403)",
@@ -745,34 +745,34 @@ const spanish = {
745
745
  "prompt.ship.toScope": ' al scope "{scope}"',
746
746
  "prompt.thisRepoApp": "la aplicación vinculada a este repo",
747
747
  "prompt.setup": `Conectá este repositorio a nullplatform:
748
- 1. Corré application_get — si el repo ya está vinculado a una aplicación, mostrame dónde estoy parado.
749
- 2. Si no está vinculado, buscá con application_list una app que coincida con el nombre del repo antes de crear nada.
750
- 3. Si no existe ninguna, application_create para vincularlo; después mostrá application_get y decime qué sigue (primer build vía CI, después deploy).`,
748
+ 1. Mostrame el estado de esta app — si el repo ya está vinculado a una aplicación, mostrame dónde estoy parado.
749
+ 2. Si no está vinculado, buscá una app que coincida con el nombre del repo antes de crear nada.
750
+ 3. Si no existe ninguna, creá la aplicación para vincularlo; después mostrá su estado y decime qué sigue (primer build vía CI, después deploy).`,
751
751
  "prompt.health": `Dame un chequeo de salud de {app}:
752
752
  1. status — ¿qué está en vivo y dónde? ¿algo a mitad de rollout?
753
753
  2. metrics (ventana de 3h) — marcá cualquier cosa rara en throughput, tiempo de respuesta, tasa de errores, CPU o memoria.
754
754
  3. logs — escaneá las líneas recientes buscando errores o warnings.
755
755
  Cerrá con un veredicto de un párrafo: sano / degradado / en problemas, y la próxima acción más útil.`,
756
- "prompt.rollback": `Algo está mal — revertí {app} ya mismo: encontrá su rollout activo, corré application_deployment_update action:"rollback" y confirmá con application_get que la versión anterior está sirviendo tráfico; resumí qué se revirtió.`,
756
+ "prompt.rollback": `Algo está mal — revertí {app} ya mismo: encontrá su rollout activo, revertilo y confirmá desde su estado que la versión anterior está sirviendo tráfico; resumí qué se revirtió.`,
757
757
  };
758
758
  const portuguese = {
759
759
  // — resolution (which app?) —
760
760
  "resolve.ambiguous": "Várias aplicações coincidem — diga qual (nome ou `#id`):",
761
761
  "resolve.noId": "Nenhuma aplicação com id {id}.",
762
762
  "resolve.noMatch": 'Nenhuma aplicação correspondente a "{ref}".',
763
- "resolve.repoUnlinked": 'Este repositório ({url}) não está vinculado a nenhuma aplicação nullplatform. Passe app:"<nome>" ou rode application_create para vinculá-lo.',
763
+ "resolve.repoUnlinked": 'Este repositório ({url}) não está vinculado a nenhuma aplicação nullplatform. Passe app:"<nome>" ou vincule-o como uma nova aplicação.',
764
764
  "resolve.noInput": 'Nenhuma app informada e nenhum remote git encontrado no workspace. Passe app:"<nome>" (ou um id como "#123").',
765
765
  "resolve.noNrn": "Não consigo resolver o NRN da aplicação para **{app}**.",
766
766
  // — scope selection —
767
767
  "scope.which": "Qual scope?",
768
768
  "scope.none": "Esta app ainda não tem scopes.",
769
- "scope.noneHint": '`application_scope_create name:"dev"` primeiro depois `application_deployment_create`.',
769
+ "scope.noneHint": "crie um scope (por exemplo um scope “dev”) primeiro, depois faça o deploy.",
770
770
  "scope.noMatch": 'Nenhum scope correspondente a "{wanted}". Scopes: {names}.',
771
771
  "scope.noMatchDetailed": 'Nenhum scope correspondente a "{wanted}" (por nome ou dimensão). Scopes:',
772
- "scope.createHint": '`application_scope_create name:"{name}"` para criá-lo.',
773
- "scope.deployHint": '`application_deployment_create scope:"<nome ou dimensão, ex. environment=production>"`',
772
+ "scope.createHint": "crie o scope **{name}** primeiro.",
773
+ "scope.deployHint": "informe o scope ou a dimensão onde fazer o deploy (ex. environment=production).",
774
774
  "scope.perScope": "{noun} são por scope — qual?",
775
- "scope.readHint": '`{tool} scope:"{name}"`',
775
+ "scope.readHint": "leia para o scope **{name}**.",
776
776
  // — table headers —
777
777
  "header.app": "App",
778
778
  "header.id": "Id",
@@ -847,25 +847,25 @@ const portuguese = {
847
847
  "render.now": "agora",
848
848
  "render.desired": "→ desejado {pct}%",
849
849
  // — next-step hints (status) —
850
- "hint.rolloutTraffic": 'deployment #{id} em **{scope}** está com {traffic}% de tráfego — `application_deployment_update percent:<n>` para avançar, `application_deployment_update action:"finalize"` quando pronto, `application_deployment_update action:"rollback"` para reverter.',
851
- "hint.rolloutStatus": "deployment #{id} em **{scope}** está {status} — `application_get deployment:{id}` para acompanhar.",
852
- "hint.noScopes": 'ainda sem scopes — `application_scope_create name:"dev"` para ter onde fazer deploy.',
853
- "hint.buildNewer": "build #{id} ({branch} @{commit}) é mais novo que a release {semver} — `application_deployment_create` faz o deploy (cria a release para você).",
854
- "hint.buildUnreleased": "build #{id} ainda não tem release — `application_deployment_create` faz o deploy (cria a release para você).",
855
- "hint.releaseNotLive": "a release {semver} ainda não está no ar — `application_deployment_create` para publicá-la.",
856
- "hint.noBuilds": "ainda sem builds — faça push de um commit para o CI gerar um, depois `application_deployment_create`.",
850
+ "hint.rolloutTraffic": "deployment #{id} em **{scope}** está com {traffic}% de tráfego — aumente o tráfego para avançar, finalize quando chegar a 100%, ou reverta para voltar atrás.",
851
+ "hint.rolloutStatus": "deployment #{id} em **{scope}** está {status} — acompanhe o rollout para ver como avança.",
852
+ "hint.noScopes": "ainda sem scopes — crie um (por exemplo um scope “dev”) para ter onde fazer deploy.",
853
+ "hint.buildNewer": "build #{id} ({branch} @{commit}) é mais novo que a release {semver} — faça o deploy para publicar o código novo (a release é criada para você).",
854
+ "hint.buildUnreleased": "build #{id} ainda não tem release — faça o deploy para publicá-lo (a release é criada para você).",
855
+ "hint.releaseNotLive": "a release {semver} ainda não está no ar — faça o deploy para publicá-la.",
856
+ "hint.noBuilds": "ainda sem builds — faça push de um commit para o CI gerar um, depois faça o deploy.",
857
857
  "hint.upToDate": "está tudo atualizado ✅",
858
- "hint.watch": "`application_get deployment:{id}` para acompanhar.",
858
+ "hint.watch": "acompanhe o rollout para vê-lo concluir.",
859
859
  // — next-step hints (rollout) —
860
- "rollout.full": 'todo o tráfego na nova versão — `application_deployment_update action:"finalize"` para aposentar a antiga.',
861
- "rollout.moving": "tráfego indo de {from}% → {to}% — `application_get deployment:{id}` para acompanhar.",
862
- "rollout.at": 'tráfego em {traffic}% — `application_deployment_update percent:<n>` para avançar (marcas: 1,5,10,25,50,75,90,95,99,100), `application_deployment_update action:"rollback"` para reverter.',
863
- "rollout.instances": "as instâncias estão subindo — `application_get deployment:{id}` para acompanhar.",
864
- "rollout.switching": "o tráfego está sendo trocado — `application_get deployment:{id}` para acompanhar.",
860
+ "rollout.full": "todo o tráfego na nova versão — finalize para aposentar a antiga.",
861
+ "rollout.moving": "tráfego indo de {from}% → {to}% — acompanhe a conclusão.",
862
+ "rollout.at": "tráfego em {traffic}% — aumente para avançar (marcas: 1, 5, 10, 25, 50, 75, 90, 95, 99, 100%), ou reverta para voltar atrás.",
863
+ "rollout.instances": "as instâncias estão subindo — acompanhe o rollout.",
864
+ "rollout.switching": "o tráfego está sendo trocado — acompanhe o rollout.",
865
865
  "rollout.finalizing": "finalizando — as instâncias antigas estão sendo aposentadas.",
866
866
  "rollout.done": "pronto — a release está totalmente no ar ✅",
867
867
  "rollout.approval": "aguardando uma aprovação ✋ — um aprovador precisa liberar este deployment (dashboard → Aprovações).",
868
- "rollout.failed": 'o deployment falhou — `application_log_list` para ver a saída, `application_deployment_update action:"rollback"` se o tráfego se moveu.',
868
+ "rollout.failed": "o deployment falhou — verifique os logs para ver a saída, e reverta se o tráfego se moveu.",
869
869
  "rollout.rolledBack": "revertido — a versão anterior está atendendo todo o tráfego.",
870
870
  // — application_get tool —
871
871
  "status.errorLabel": "Não foi possível carregar o status",
@@ -873,21 +873,21 @@ const portuguese = {
873
873
  "findApps.noneMatching": "Nenhuma aplicação{matching}{inNamespace}.",
874
874
  "findApps.matching": ' correspondente a "{query}"',
875
875
  "findApps.inNamespace": ' nos namespaces ~"{namespace}"',
876
- "findApps.createHint": "`application_create` vincula este repositório como uma nova aplicação.",
876
+ "findApps.createHint": "vincule este repositório como uma nova aplicação.",
877
877
  "findApps.count.one": "1 aplicação",
878
878
  "findApps.count.many": "{count} aplicações",
879
- "findApps.statusHint": '`application_get app:"<nome>"` para o panorama completo de uma.',
879
+ "findApps.statusHint": "peça uma pelo nome para ver o panorama completo.",
880
880
  "findApps.truncated": "Mostrando as primeiras {shown} — refine com uma query ou namespace para ver o resto.",
881
881
  "findApps.errorLabel": "Busca falhou",
882
882
  // — application_parameter_list tool —
883
- "params.unavailable": "A listagem de parâmetros não está disponível aqui. `application_parameter_create` ainda funciona.",
883
+ "params.unavailable": "A listagem de parâmetros não está disponível aqui, mas definir parâmetros ainda funciona.",
884
884
  "params.viewInDashboard": "ver no dashboard",
885
885
  "params.none": "**{app}** não tem parâmetros.",
886
- "params.noneHint": "`application_parameter_create` para adicionar variáveis de ambiente ou arquivos.",
886
+ "params.noneHint": "adicione uma variável de ambiente ou arquivo para começar.",
887
887
  "params.count.one": "**{app}** · 1 parâmetro",
888
888
  "params.count.many": "**{app}** · {count} parâmetros",
889
889
  "params.unset": "_não definido_",
890
- "params.applyHint": "valores alterados aplicam no próximo `application_deployment_create`.",
890
+ "params.applyHint": "valores alterados aplicam no próximo deploy.",
891
891
  "params.effectiveFor": "**{app}** · parâmetros efetivos para **{scope}**",
892
892
  "params.ctxApplication": "Aplicação",
893
893
  "params.ctxScope": "{scope} (scope)",
@@ -895,7 +895,7 @@ const portuguese = {
895
895
  // — application_log_list tool —
896
896
  "logs.noun": "Logs",
897
897
  "logs.noScopes": "**{app}** não tem scopes, então ainda não há logs de runtime.",
898
- "logs.noScopesHint": "`application_deployment_create` depois de criar um scope — os logs aparecem quando algo roda.",
898
+ "logs.noScopesHint": "crie um scope e faça o deploy — os logs aparecem quando algo roda.",
899
899
  "logs.empty": "Nenhuma linha de log retornada para **{app}**{scope}.",
900
900
  "logs.openInDashboard": "abrir logs no dashboard",
901
901
  "logs.lastLines.one": "**{app}**{scope} — última linha",
@@ -905,7 +905,7 @@ const portuguese = {
905
905
  // — application_metric_list tool —
906
906
  "metrics.noun": "Métricas",
907
907
  "metrics.noScopes": "**{app}** não tem scopes, então ainda não há métricas de runtime.",
908
- "metrics.noScopesHint": "`application_deployment_create` depois de criar um scope.",
908
+ "metrics.noScopesHint": "crie um scope e faça o deploy para começar a coletar métricas.",
909
909
  "metrics.empty": "Nenhum datapoint de métrica para **{app}** · {scope} nos últimos {window} — o scope pode ser recente ou o agente de métricas não está configurado.",
910
910
  "metrics.openInDashboard": "performance no dashboard",
911
911
  "metrics.title": "**{app}** · {scope} — últimos {window}",
@@ -918,9 +918,9 @@ const portuguese = {
918
918
  "builds.released": "Com release",
919
919
  "builds.none": "**{app}** ainda não tem builds.",
920
920
  "builds.noneForCommit": "Nenhum build em **{app}** para o commit `{commit}` — pode não ter buildado ainda, ou o commit não está em uma branch buildada.",
921
- "builds.noneHint": "faça push de um commit para o CI gerar um, depois `application_deployment_create`.",
922
- "builds.deployHint": "`application_deployment_create build_id:{build}` faz o deploy (corta a release para você).",
923
- "builds.waiting": "o build #{build} ainda está rodando — `application_build_list` de novo em instantes para checar.",
921
+ "builds.noneHint": "faça push de um commit para o CI gerar um, depois faça o deploy.",
922
+ "builds.deployHint": "faça o deploy do build #{build} para publicá-lo (a release é criada para você).",
923
+ "builds.waiting": "o build #{build} ainda está rodando — verifique de novo em instantes.",
924
924
  "builds.upToDate": "o último build bem-sucedido já tem release.",
925
925
  "builds.assetsTitle": "Assets do build #{build}",
926
926
  "builds.noAssets": "O build #{build} não tem assets.",
@@ -930,23 +930,23 @@ const portuguese = {
930
930
  "releaseList.title.one": "**{app}** · 1 release",
931
931
  "releaseList.title.many": "**{app}** · {count} releases",
932
932
  "releaseList.none": "**{app}** ainda não tem releases.",
933
- "releaseList.noneHint": "corte uma a partir de um build bem-sucedido com `application_release_create`, ou simplesmente `application_deployment_create`.",
934
- "releaseList.deployHint": 'faça deploy de uma release ativa com `application_deployment_create version:"x.y.z"`.',
933
+ "releaseList.noneHint": "corte uma a partir de um build bem-sucedido, ou simplesmente faça o deploy (ele corta a release para você).",
934
+ "releaseList.deployHint": "faça o deploy de uma release ativa por versão (ex. x.y.z).",
935
935
  "releaseList.errorLabel": "Não foi possível listar as releases",
936
936
  "deploymentList.title.one": "**{app}** · 1 deployment",
937
937
  "deploymentList.title.many": "**{app}** · {count} deployments",
938
938
  "deploymentList.none": "**{app}** ainda não tem deployments.",
939
939
  "deploymentList.group": "{count} scopes (grupo)",
940
- "deploymentList.hint": "`application_get` para o panorama ao vivo, ou `application_deployment_update` para conduzir um rollout.",
940
+ "deploymentList.hint": "peça o status da app para o panorama ao vivo, ou conduza o tráfego de um rollout.",
941
941
  "deploymentList.errorLabel": "Não foi possível listar os deployments",
942
942
  // — organization_get tool —
943
943
  "overview.title.one": "Visão geral da organização · 1 aplicação escaneada",
944
944
  "overview.title.many": "Visão geral da organização · {count} aplicações escaneadas",
945
- "overview.truncated": '_(mostrando as primeiras {count} — refine com `organization_get query:"..."`)_',
945
+ "overview.truncated": "_(mostrando as primeiras {count} — refine com uma query para ver mais)_",
946
946
  "overview.activeRollouts": "Rollouts ativos ({count})",
947
947
  "overview.trouble": "Precisa de atenção ({count})",
948
- "overview.hintActive": '`application_get app:"{app}"` para acompanhar um rollout, ou `application_deployment_update` para conduzir um.',
949
- "overview.hintTrouble": '`application_log_list app:"{app}"` para investigar, `application_deployment_update action:"rollback"` se necessário.',
948
+ "overview.hintActive": "abra **{app}** para acompanhar um rollout, ou conduza o tráfego dele.",
949
+ "overview.hintTrouble": "verifique os logs de **{app}** para investigar, e reverta se necessário.",
950
950
  "overview.hintCalm": "está tudo estável — nada em rollout, nada falhou.",
951
951
  "overview.errorLabel": "Não foi possível montar a visão geral",
952
952
  // — application_approval_list tool —
@@ -957,10 +957,10 @@ const portuguese = {
957
957
  "approvals.requestedBy": "Solicitado por",
958
958
  "approvals.none": "Nenhuma aprovação pendente para **{app}**.",
959
959
  "approvals.needId": "Passe `approval_id` junto com a ação.",
960
- "approvals.invalidId": "Isso não parece um approval id válido — copie-o da lista do `application_approval_list`.",
960
+ "approvals.invalidId": "Isso não parece um approval id válido — copie-o da lista de aprovações.",
961
961
  "approvals.approved": "Aprovado {id} — a ação bloqueada pode prosseguir.",
962
962
  "approvals.cancelled": "Aprovação {id} cancelada.",
963
- "approvals.actHint": '`application_approval_list action:"approve" approval_id:"{id}"` para liberá-la (usa suas permissões).',
963
+ "approvals.actHint": "aprove {id} para liberá-la (usa suas permissões).",
964
964
  "approvals.errorLabel": "Não foi possível carregar as aprovações",
965
965
  // — application_service_list tool —
966
966
  "services.attached.one": "**{app}** · 1 serviço de dependência",
@@ -977,19 +977,19 @@ const portuguese = {
977
977
  "createService.matchAmbiguous": 'Várias dependências coincidem com "{query}" — escolha uma:',
978
978
  "createService.category": "Categoria",
979
979
  "createService.provider": "Provider",
980
- "createService.pickHint": '`application_service_create type:"<nome>"` para provisionar uma.',
980
+ "createService.pickHint": "informe um tipo de dependência para provisionar uma.",
981
981
  "createService.form": "Pronto para provisionar **{spec}** para **{app}** — confirme para criar (isso cria recursos cloud reais).",
982
982
  "createService.formHint": "confirme no painel para provisionar, ou passe `provision:true` com os parâmetros.",
983
983
  "createService.provisioning": "Provisionando **{spec}** como **{name}** — {status}. Recursos reais estão sendo criados.",
984
984
  "createService.reused": "**{name}** já existe ({status}) — reusando, não provisionando um segundo.",
985
- "createService.provisioningHint": "`application_link_create` para linkar **{name}** a um scope — seus parâmetros de conexão aparecem após o link, no próximo deploy.",
985
+ "createService.provisioningHint": "linke **{name}** a um scope — seus parâmetros de conexão aparecem após o link, no próximo deploy.",
986
986
  // — application_link_create tool —
987
987
  "createLink.errorLabel": "Não foi possível criar o link",
988
988
  "createLink.noServices": "**{app}** ainda não tem serviços provisionados para linkar.",
989
- "createLink.noServicesHint": "`application_service_create` para provisionar uma dependência primeiro.",
989
+ "createLink.noServicesHint": "provisione um serviço de dependência primeiro.",
990
990
  "createLink.pickService": "Qual serviço linkar a **{app}**?",
991
991
  "createLink.matchAmbiguous": "Vários serviços coincidem — escolha um:",
992
- "createLink.pickHint": '`application_link_create service:"<nome>"` para linkar um.',
992
+ "createLink.pickHint": "informe um serviço para linkar um.",
993
993
  "createLink.noLinkSpec": "Nenhuma link specification disponível para **{service}** nesta org.",
994
994
  "createLink.form": "Pronto para linkar **{service}** a **{app}** — confirme para criar o link (um link de credenciais provisiona um usuário de banco de dados).",
995
995
  "createLink.formHint": "confirme no painel para criar o link, ou passe `create:true` com os parâmetros.",
@@ -999,15 +999,15 @@ const portuguese = {
999
999
  // — application_service_update / application_link_update (run a custom action) —
1000
1000
  "runAction.errorLabel": "Não foi possível rodar a ação",
1001
1001
  "runAction.noServices": "**{app}** não tem serviços provisionados para rodar uma ação.",
1002
- "runAction.noServicesHint": "`application_service_create` para provisionar uma dependência primeiro.",
1002
+ "runAction.noServicesHint": "provisione um serviço de dependência primeiro.",
1003
1003
  "runAction.noLinks": "**{app}** não tem links para rodar uma ação.",
1004
- "runAction.noLinksHint": "`application_link_create` para linkar um serviço primeiro.",
1004
+ "runAction.noLinksHint": "linke um serviço primeiro.",
1005
1005
  "runAction.pickService": "Em qual serviço rodar uma ação, em **{app}**?",
1006
1006
  "runAction.serviceAmbiguous": "Vários serviços coincidem — escolha um:",
1007
- "runAction.pickServiceHint": '`application_service_update service:"<nome>"` para escolher um.',
1007
+ "runAction.pickServiceHint": "informe um serviço para escolher um.",
1008
1008
  "runAction.pickLink": "Em qual link rodar uma ação, em **{app}**?",
1009
1009
  "runAction.linkAmbiguous": "Vários links coincidem — escolha um:",
1010
- "runAction.pickLinkHint": '`application_link_update link:"<nome>"` para escolher um.',
1010
+ "runAction.pickLinkHint": "informe um link para escolher um.",
1011
1011
  "runAction.noActions": "**{name}** não expõe ações executáveis.",
1012
1012
  "runAction.pickAction": "Qual ação rodar em **{name}**?",
1013
1013
  "runAction.matchAmbiguous": "Várias ações coincidem — escolha uma:",
@@ -1024,12 +1024,12 @@ const portuguese = {
1024
1024
  "deleteEntity.noLinks": "**{app}** não tem links para deletar.",
1025
1025
  "deleteEntity.pickService": "Qual serviço deletar, em **{app}**?",
1026
1026
  "deleteEntity.serviceAmbiguous": "Vários serviços coincidem — escolha um:",
1027
- "deleteEntity.pickServiceHint": '`application_service_delete service:"<nome>"` para escolher um.',
1027
+ "deleteEntity.pickServiceHint": "informe um serviço para escolher um.",
1028
1028
  "deleteEntity.pickLink": "Qual link deletar, em **{app}**?",
1029
1029
  "deleteEntity.linkAmbiguous": "Vários links coincidem — escolha um:",
1030
- "deleteEntity.pickLinkHint": '`application_link_delete link:"<nome>"` para escolher um.',
1030
+ "deleteEntity.pickLinkHint": "informe um link para escolher um.",
1031
1031
  "deleteEntity.hasLinks": "**{name}** ainda tem {count} link(s) ativo(s) — ficariam órfãos.",
1032
- "deleteEntity.hasLinksHint": "delete os links primeiro com `application_link_delete`, depois o serviço.",
1032
+ "deleteEntity.hasLinksHint": "delete os links primeiro, depois o serviço.",
1033
1033
  "deleteEntity.confirm": "Pronto para deletar **{name}** e destruir seus recursos — confirme para prosseguir.",
1034
1034
  "deleteEntity.confirmHint": "confirme no painel para deletar, ou passe `confirm:true`.",
1035
1035
  "deleteEntity.removed": "**{name}** foi deletado.",
@@ -1039,7 +1039,7 @@ const portuguese = {
1039
1039
  "deleteParam.errorLabel": "Não foi possível deletar o parâmetro",
1040
1040
  "deleteParam.absent": "**{name}** não está definido em **{app}** — nada para deletar.",
1041
1041
  "deleteParam.readOnly": "**{name}** é somente leitura — um link de serviço o injeta.",
1042
- "deleteParam.readOnlyHint": "delete o link que o exporta com `application_link_delete`.",
1042
+ "deleteParam.readOnlyHint": "delete o link que o exporta.",
1043
1043
  "deleteParam.confirm": "Pronto para deletar **{name}** de **{app}** — confirme para prosseguir.",
1044
1044
  "deleteParam.confirmHint": "confirme no painel para deletar, ou passe `confirm:true`.",
1045
1045
  "deleteParam.deleted": "Deletei **{name}** de **{app}**.",
@@ -1047,22 +1047,22 @@ const portuguese = {
1047
1047
  "deleteParam.failed": "Não foi possível deletar **{name}**: {message}",
1048
1048
  // — application_deployment_create tool —
1049
1049
  "deploy.noScopeTypes": "Esta app ainda não tem scopes. Tipos de scope disponíveis: {types}.",
1050
- "deploy.createScopeHint": '`application_scope_create name:"dev" type:"{type}"`',
1050
+ "deploy.createScopeHint": "crie um scope primeiro (por exemplo um scope “dev do tipo {type}).",
1051
1051
  "deploy.usingRelease": "Usando a release existente **{semver}** (#{id}). ",
1052
1052
  "deploy.createdRelease": "Criei a release **{semver}** a partir do build #{build}. ",
1053
1053
  "deploy.createdReleaseFrom": "Criei a release **{semver}** a partir do build #{build} ({branch} @{commit}). ",
1054
1054
  "deploy.noSuchVersion": "Não existe a release **{version}**{known} e não há build bem-sucedido para cortá-la.",
1055
1055
  "deploy.knownVersions": " (conhecidas: {versions})",
1056
1056
  "deploy.nothing": "Nada para fazer deploy: nenhuma release ativa e nenhum build bem-sucedido.",
1057
- "deploy.nothingHint": "faça push de um commit para o CI gerar um build, depois `application_deployment_create` de novo.",
1057
+ "deploy.nothingHint": "faça push de um commit para o CI gerar um build, depois faça o deploy de novo.",
1058
1058
  "deploy.multiAsset": "O build #{build} tem vários assets — qual vai para **{scope}** ({type})?",
1059
- "deploy.assetHint": '`application_deployment_create asset:"{name}"`',
1059
+ "deploy.assetHint": "faça o deploy de novo, informando o asset a publicar (ex. {name}).",
1060
1060
  "deploy.errorLabel": "Deploy falhou",
1061
1061
  "deploy.alreadyRolling": "Esta release já está em rollout em **{scope}** — mostrando esse deployment.",
1062
- "deploy.rejected": 'Deploy rejeitado: {message}\nIsso geralmente é a escolha do asset, não os ids — o build provavelmente tem vários assets. Tente de novo com `application_deployment_create asset:"<nome>"` (veja-os via `application_get`).',
1062
+ "deploy.rejected": "Deploy rejeitado: {message}\nIsso geralmente é a escolha do asset, não os ids — o build provavelmente tem vários assets. Tente de novo informando o asset a publicar (veja-os no status da app).",
1063
1063
  // — application_deployment_update tool —
1064
- "traffic.sayWhat": 'Diga o que fazer: `percent:<0-100>`, `action:"finalize"` ou `action:"rollback"`.',
1065
- "traffic.noActive": "Nenhum rollout ativo em **{app}** — `application_deployment_create` inicia um.",
1064
+ "traffic.sayWhat": "Diga o que fazer: defina uma porcentagem de tráfego (0100), finalize, ou reverta.",
1065
+ "traffic.noActive": "Nenhum rollout ativo em **{app}** — faça o deploy para iniciar um.",
1066
1066
  "traffic.several": "Vários rollouts estão ativos — passe deployment_id:",
1067
1067
  "traffic.snapped": "({requested}% ajustado para {snapped}%)",
1068
1068
  "traffic.errorLabel": "Ação de tráfego falhou",
@@ -1071,7 +1071,7 @@ const portuguese = {
1071
1071
  "createRelease.done": "Release **{semver}** criada{from}.",
1072
1072
  "createRelease.exists": "A release **{semver}** já existe para o build #{build} — reusando.",
1073
1073
  "createRelease.from": " a partir do build #{build} ({branch} @{commit}, {when})",
1074
- "createRelease.deployHint": "`application_deployment_create release_id:{id}` para fazer o deploy.",
1074
+ "createRelease.deployHint": "faça o deploy da release #{id} para publicá-la.",
1075
1075
  "createRelease.errorLabel": "Não foi possível criar a release",
1076
1076
  // — application_parameter_create tool —
1077
1077
  "setParams.created.one": "Defini 1 novo parâmetro em **{app}**: {names}.",
@@ -1079,9 +1079,9 @@ const portuguese = {
1079
1079
  "setParams.updated.one": "Atualizei 1 parâmetro existente em **{app}**: {names}.",
1080
1080
  "setParams.updated.many": "Atualizei {count} parâmetros existentes em **{app}**: {names}.",
1081
1081
  "setParams.mixed": "Defini {total} parâmetros em **{app}** (novos: {created}, atualizados: {updated}): {names}.",
1082
- "setParams.applyHint": "os valores aplicam no próximo `application_deployment_create`.",
1082
+ "setParams.applyHint": "os valores aplicam no próximo deploy.",
1083
1083
  "setParams.scopeDimConflict": "Não dá para mirar um scope e dimensões ao mesmo tempo para `{name}` — um scope já localiza o valor. Escolha um.",
1084
- "setParams.partial": "A atualização de parâmetros falhou no meio: {message}\nOs parâmetros já criados permanecem — `application_parameter_list` para inspecionar.",
1084
+ "setParams.partial": "A atualização de parâmetros falhou no meio: {message}\nOs parâmetros já criados permanecem — liste-os para inspecionar.",
1085
1085
  "setParams.errorLabel": "Atualização de parâmetros falhou",
1086
1086
  // — application_create tool —
1087
1087
  "createApp.form": "Para criar uma aplicação eu preciso de uma URL de repositório git e um nome (o formulário os coleta).\nNamespaces: {namespaces}.",
@@ -1090,24 +1090,24 @@ const portuguese = {
1090
1090
  "createApp.noAccountMatch": 'Nenhuma conta correspondente a "{account}". Contas: {names}.',
1091
1091
  "createApp.whichNamespace": "Qual namespace?",
1092
1092
  "createApp.whichNamespaceFor": "Qual namespace deve conter **{name}**?",
1093
- "createApp.namespaceHint": '`application_create namespace:"<nome>"`',
1093
+ "createApp.namespaceHint": "informe o namespace onde criá-la.",
1094
1094
  "createApp.noNamespaces": "Esta organização ainda não tem namespaces — crie um no dashboard primeiro.",
1095
1095
  "createApp.created": "**{name}** criada (#{id}) no namespace **{namespace}**, vinculada a {repo}.",
1096
1096
  "createApp.alreadyLinked": "**{name}** (#{id}) já está vinculada a {repo} — nada para criar.",
1097
- "createApp.createdHint": "faça push de um commit para disparar o primeiro build, depois `application_deployment_create`.",
1098
- "createApp.createdHintNew": "o repo foi scaffoldado para você — clone {repo} em uma pasta, adicione seu código lá e faça push para o CI buildar, depois `application_deployment_create`.",
1097
+ "createApp.createdHint": "faça push de um commit para disparar o primeiro build, depois faça o deploy.",
1098
+ "createApp.createdHintNew": "o repo foi scaffoldado para você — clone {repo} em uma pasta, adicione seu código lá e faça push para o CI buildar, depois faça o deploy.",
1099
1099
  "createApp.pending": "⏳ **{name}** criada (#{id}), o provisionamento ainda está rodando (status: {status}).",
1100
- "createApp.pendingHint": '`application_get app:"#{id}"` para checá-la.',
1100
+ "createApp.pendingHint": "verifique a aplicação #{id} para ver o progresso.",
1101
1101
  "createApp.errorLabel": "Não foi possível criar a aplicação",
1102
1102
  // — playbook_get tool —
1103
1103
  "playbook.errorLabel": "Não foi possível carregar o playbook",
1104
1104
  // — application_scope_create tool —
1105
1105
  "createScope.whichType": "Qual tipo de scope para **{name}**?",
1106
- "createScope.typeHint": '`application_scope_create name:"{name}" type:"<tipo>"`',
1106
+ "createScope.typeHint": "informe um tipo de scope para **{name}** para criá-lo.",
1107
1107
  "createScope.noTypes": 'Nenhum tipo de scope disponível — passe type explicitamente (ex. type:"web_pool").',
1108
1108
  "createScope.provisioning": "⏳ O scope **{name}** (#{id}, {type}{dimensions}) está provisionando — a infraestrutura está sendo criada.",
1109
1109
  "createScope.exists": "O scope **{name}** (#{id}) já existe ({status}) — nada para criar.",
1110
- "createScope.provisioningHint": '`application_get` o mostra; quando ativo, `application_deployment_create scope:"{name}"`.',
1110
+ "createScope.provisioningHint": "o status da app o mostra; quando ativo, faça o deploy no scope **{name}**.",
1111
1111
  "createScope.errorLabel": "Não foi possível criar o scope",
1112
1112
  // — auth & transport —
1113
1113
  "error.credentialRejected": "nullplatform rejeitou a credencial ({status}) — verifique sua NP_API_KEY",
@@ -1129,15 +1129,15 @@ const portuguese = {
1129
1129
  "prompt.ship.toScope": ' para o scope "{scope}"',
1130
1130
  "prompt.thisRepoApp": "a aplicação vinculada a este repositório",
1131
1131
  "prompt.setup": `Conecte este repositório à nullplatform:
1132
- 1. Rode application_get — se o repositório já estiver vinculado a uma aplicação, apenas me mostre onde estou.
1133
- 2. Se não estiver vinculado, verifique application_list por uma app com o nome deste repositório antes de criar qualquer coisa.
1134
- 3. Se nenhuma existir, application_create para vinculá-lo, depois mostre application_get e me diga o que acontece a seguir (primeiro build via CI, depois deploy).`,
1132
+ 1. Mostre o status desta app — se o repositório já estiver vinculado a uma aplicação, apenas me mostre onde estou.
1133
+ 2. Se não estiver vinculado, procure uma app com o nome deste repositório antes de criar qualquer coisa.
1134
+ 3. Se nenhuma existir, crie a aplicação para vinculá-lo, depois mostre o status dela e me diga o que acontece a seguir (primeiro build via CI, depois deploy).`,
1135
1135
  "prompt.health": `Me dê um health check de {app}:
1136
1136
  1. status — o que está no ar e onde, algo em rollout?
1137
1137
  2. métricas (janela de 3h) — aponte qualquer coisa incomum em throughput, tempo de resposta, taxa de erro, CPU ou memória.
1138
1138
  3. logs — escaneie as linhas recentes por erros ou avisos.
1139
1139
  Termine com um veredito de um parágrafo: saudável / degradado / com problemas, e a única ação seguinte mais útil.`,
1140
- "prompt.rollback": `Algo está errado — reverta {app} agora mesmo: encontre seu rollout ativo, rode application_deployment_update action:"rollback", depois confirme com application_get que a versão anterior está atendendo o tráfego e resuma o que foi revertido.`,
1140
+ "prompt.rollback": `Algo está errado — reverta {app} agora mesmo: encontre seu rollout ativo, reverta-o, depois confirme pelo status dele que a versão anterior está atendendo o tráfego e resuma o que foi revertido.`,
1141
1141
  };
1142
1142
  const catalogs = { en: english, es: spanish, pt: portuguese };
1143
1143
  const SUPPORTED = ["en", "es", "pt"];
package/dist/render.js CHANGED
@@ -1,9 +1,18 @@
1
1
  import { translate } from "./i18n.js";
2
2
  import { ago, glyph, linkLine, next, shortCommit, statusLabel, table } from "./md.js";
3
3
  import { isDeploymentTerminal } from "./np/journey.js";
4
+ /** "owner/repo" from a git URL (https or ssh), for a readable link label. */
5
+ const repoSlug = (url) => url
6
+ .replace(/\.git$/, "")
7
+ .split(/[/:]/)
8
+ .filter(Boolean)
9
+ .slice(-2)
10
+ .join("/");
4
11
  export function renderAppHeader(app) {
5
12
  const where = [app.namespace, app.account].filter(Boolean).join(" / ");
6
- const repo = app.repository_url ? `\nrepo ${app.repository_url}` : "";
13
+ // Render the repo as a real link (label = owner/repo) instead of a bare URL, so a text host
14
+ // surfaces it as something clickable.
15
+ const repo = app.repository_url ? linkLine(repoSlug(app.repository_url), app.repository_url) : "";
7
16
  return `**${app.name}** · #${app.id}${where ? ` · ${where}` : ""}${repo}`;
8
17
  }
9
18
  function trafficBar(percent) {
@@ -22,7 +31,7 @@ export function renderScopeRows(views) {
22
31
  return translate("render.noScopes");
23
32
  const domains = views
24
33
  .filter((view) => view.scope.domain && view.current && view.current.status === "finalized")
25
- .map((view) => `- ${view.scope.name}: https://${view.scope.domain}`);
34
+ .map((view) => `- ${view.scope.name}: [${view.scope.domain}](https://${view.scope.domain})`);
26
35
  const scopeTable = table([
27
36
  translate("header.scope"),
28
37
  translate("header.status"),
@@ -101,8 +110,11 @@ export function renderStatus(args) {
101
110
  : ""}`;
102
111
  })
103
112
  .join(" · ");
113
+ const commitRef = latestBuild?.commit_url
114
+ ? `[@${shortCommit(latestBuild.commit)}](${latestBuild.commit_url})`
115
+ : `@${shortCommit(latestBuild?.commit)}`;
104
116
  const latestBuildLine = latestBuild
105
- ? `${glyph(latestBuild.status)} #${latestBuild.id} ${latestBuild.branch ?? ""} @${shortCommit(latestBuild.commit)} (${ago(latestBuild.created_at)})`
117
+ ? `${glyph(latestBuild.status)} #${latestBuild.id} ${latestBuild.branch ?? ""} ${commitRef} (${ago(latestBuild.created_at)})`
106
118
  : translate("render.noBuilds");
107
119
  const lines = [
108
120
  renderAppHeader(app),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nullplatform/mcp",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "description": "nullplatform from your code assistant — an MCP server that replaces the dashboard for the everyday developer journey",
5
5
  "license": "MIT",
6
6
  "author": "nullplatform",