@enterpriseai/cli 3.19.4 → 3.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -16
- package/dist/commands/agent.js +3 -1
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/content-understanding.d.ts +15 -0
- package/dist/commands/content-understanding.d.ts.map +1 -0
- package/dist/commands/content-understanding.js +277 -0
- package/dist/commands/content-understanding.js.map +1 -0
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +129 -1
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/eai-managed-deploy-output.d.ts.map +1 -1
- package/dist/commands/eai-managed-deploy-output.js +12 -2
- package/dist/commands/eai-managed-deploy-output.js.map +1 -1
- package/dist/commands/eai-managed-source-authorize-commit.d.ts +28 -0
- package/dist/commands/eai-managed-source-authorize-commit.d.ts.map +1 -0
- package/dist/commands/eai-managed-source-authorize-commit.js +200 -0
- package/dist/commands/eai-managed-source-authorize-commit.js.map +1 -0
- package/dist/commands/eai-managed-source-move.d.ts.map +1 -1
- package/dist/commands/eai-managed-source-move.js +3 -0
- package/dist/commands/eai-managed-source-move.js.map +1 -1
- package/dist/commands/init.js +17 -17
- package/dist/commands/resources.d.ts.map +1 -1
- package/dist/commands/resources.js +6 -6
- package/dist/commands/resources.js.map +1 -1
- package/dist/commands/support.d.ts +6 -3
- package/dist/commands/support.d.ts.map +1 -1
- package/dist/commands/support.js +117 -25
- package/dist/commands/support.js.map +1 -1
- package/dist/commands/tenant.d.ts.map +1 -1
- package/dist/commands/tenant.js +6 -34
- package/dist/commands/tenant.js.map +1 -1
- package/dist/index.js +65 -11
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-guide.d.ts.map +1 -1
- package/dist/lib/agent-guide.js +30 -16
- package/dist/lib/agent-guide.js.map +1 -1
- package/dist/lib/api.d.ts +47 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +99 -6
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/cli-qa-transport.d.ts +7 -0
- package/dist/lib/cli-qa-transport.d.ts.map +1 -0
- package/dist/lib/cli-qa-transport.js +18 -0
- package/dist/lib/cli-qa-transport.js.map +1 -0
- package/dist/lib/content-understanding-client.d.ts +64 -0
- package/dist/lib/content-understanding-client.d.ts.map +1 -0
- package/dist/lib/content-understanding-client.js +105 -0
- package/dist/lib/content-understanding-client.js.map +1 -0
- package/dist/lib/content-understanding-manifest.d.ts +39 -0
- package/dist/lib/content-understanding-manifest.d.ts.map +1 -0
- package/dist/lib/content-understanding-manifest.js +265 -0
- package/dist/lib/content-understanding-manifest.js.map +1 -0
- package/dist/lib/context.d.ts +3 -0
- package/dist/lib/context.d.ts.map +1 -1
- package/dist/lib/context.js +12 -2
- package/dist/lib/context.js.map +1 -1
- package/dist/lib/eai-managed-source-client-types.d.ts +44 -1
- package/dist/lib/eai-managed-source-client-types.d.ts.map +1 -1
- package/dist/lib/eai-managed-source-operation-client.d.ts +3 -0
- package/dist/lib/eai-managed-source-operation-client.d.ts.map +1 -1
- package/dist/lib/eai-managed-source-operation-client.js +69 -2
- package/dist/lib/eai-managed-source-operation-client.js.map +1 -1
- package/dist/lib/eai-managed-source-publication-client.d.ts.map +1 -1
- package/dist/lib/eai-managed-source-publication-client.js +1 -0
- package/dist/lib/eai-managed-source-publication-client.js.map +1 -1
- package/dist/lib/error-codes.d.ts +1 -1
- package/dist/lib/error-codes.d.ts.map +1 -1
- package/dist/lib/error-codes.js +9 -5
- package/dist/lib/error-codes.js.map +1 -1
- package/dist/lib/gofer-installer.d.ts.map +1 -1
- package/dist/lib/gofer-installer.js +3 -1
- package/dist/lib/gofer-installer.js.map +1 -1
- package/dist/lib/support-context.d.ts +4 -3
- package/dist/lib/support-context.d.ts.map +1 -1
- package/dist/lib/support-context.js +11 -13
- package/dist/lib/support-context.js.map +1 -1
- package/dist/lib/support-harness.d.ts +86 -0
- package/dist/lib/support-harness.d.ts.map +1 -0
- package/dist/lib/support-harness.js +471 -0
- package/dist/lib/support-harness.js.map +1 -0
- package/dist/lib/support-redaction.d.ts.map +1 -1
- package/dist/lib/support-redaction.js +221 -3
- package/dist/lib/support-redaction.js.map +1 -1
- package/dist/lib/support-report.d.ts +27 -5
- package/dist/lib/support-report.d.ts.map +1 -1
- package/dist/lib/support-report.js +75 -31
- package/dist/lib/support-report.js.map +1 -1
- package/dist/lib/tenant-context.d.ts +7 -0
- package/dist/lib/tenant-context.d.ts.map +1 -1
- package/dist/lib/tenant-context.js +17 -4
- package/dist/lib/tenant-context.js.map +1 -1
- package/package.json +8 -3
- package/resources/content-understanding/contract-golden.json +444 -0
- package/resources/content-understanding/manifest.schema.json +551 -0
- package/resources/content-understanding/procurement-example.json +135 -0
- package/resources/deploy/eai-app-template/producer-pin.json +4 -4
- package/resources/gofer/agents-skills/eai/SKILL.md +22 -21
- package/resources/gofer/claude-commands/eai.md +22 -21
- package/resources/gofer/claude-skills/eai/SKILL.md +22 -21
- package/resources/gofer/commands/0_gofer_start.md +26 -24
- package/resources/gofer/commands/5_gofer_implement.md +8 -4
- package/resources/gofer/commands/gofer_eai_first_run.md +27 -22
- package/resources/gofer/copilot-prompts/eai.prompt.md +22 -21
- package/resources/gofer/gemini/commands/gofer/eai.md +22 -21
- package/resources/gofer/gemini/commands/gofer/manifest.json +1 -1
- package/resources/gofer/github-skills/eai/SKILL.md +22 -21
- package/resources/gofer/grok-skills/eai/SKILL.md +22 -21
- package/resources/gofer/instruction-templates/base/agents-base.md +18 -17
- package/resources/gofer/instruction-templates/base/claude-base.md +0 -18
- package/resources/gofer/instruction-templates/base/copilot-base.md +18 -17
- package/resources/gofer/instruction-templates/gofer/gofer-claude.md +1 -7
- package/resources/gofer/node-scripts/generate-commands.mjs +37 -24
- package/resources/gofer/node-scripts/package-agent-plugin.mjs +55 -6
- package/resources/gofer/node-scripts/workspace-bootstrap-lib.mjs +8 -4
- package/resources/gofer/references/platform/README.md +8 -3
- package/resources/gofer/references/platform/eai-support.md +16 -16
- package/resources/gofer/specify-commands/0_gofer_start.md +26 -24
- package/resources/gofer/specify-commands/5_gofer_implement.md +8 -4
- package/resources/gofer/specify-commands/gofer_eai_first_run.md +27 -22
- package/resources/gofer/system-skills/eai/SKILL.md +22 -21
- package/resources/linked-sources.json +2 -2
|
@@ -370,7 +370,7 @@ Do not invent, guess, or complete EAI CLI commands from memory.
|
|
|
370
370
|
2. Start with \`eai --describe\` and use its command map as the source of truth.
|
|
371
371
|
3. For a specific command, run \`eai <command> --help\` or the CLI-described equivalent before using flags, subcommands, or examples.
|
|
372
372
|
4. Use \`eai agent guide --format json\` when the CLI advertises it.
|
|
373
|
-
5. Use
|
|
373
|
+
5. Use advertised error guidance at most once for the original failure. Never retry or explain a failed \`eai errors explain\` command.
|
|
374
374
|
6. If the command is not listed or help fails, do not run it. Say the installed EAI CLI does not expose that command, then choose a safe listed command or ask the user to update EAI CLI.
|
|
375
375
|
7. Record the verified command and source in \`eai-preflight.md\`, \`service-fit-matrix.md\`, or the active feature notes before the command changes files or external systems.
|
|
376
376
|
8. For commands that create, deploy, publish, change workspaces, change Entra, or spend money, confirm with the user after verification and before execution.
|
|
@@ -401,7 +401,7 @@ For EAI-managed Azure:
|
|
|
401
401
|
8. Treat the CLI JSON as the deployment authority. Record its target tenant, source mode, source binding, bundle digest when present, bot PR and merged commit when present, deployment ID, runtime identity, active URL, pointer versions, status, and next action without copying tokens or secrets.
|
|
402
402
|
9. Claim deployment complete only when the CLI reports \`classification: succeeded\`, \`status: active\`, \`requiresTenantInfra: true\`, an HTTPS \`activeUrl\`, a deployment ID, and runtime identity. Run \`eai deploy doctor --operation-id <operation-id> --app-key <app-key> --tenant-id <app-scope-tenant> --target-tenant-id <runtime-tenant> --evidence-out .eai/deploy-doctor.json --format json\`. The CLI must derive the active URL from the exact PublicAPI operation, verify the deployment, runtime, source, and configuration bindings, run authenticated readiness, and atomically write the receipt. Require the saved receipt to bind the operation, app, both tenants, source and configuration digests, deployment, runtime identity, readiness checks, and timestamp. Every recorded check must pass before the shared readiness gate can pass. When a Gofer deployment task is present, replace every command placeholder with the returned values and retain the selected initial command plus that complete inline doctor command on the task's checkbox line before completion. For customer-owned source, retain its exact \`--repo\`, \`--installation-id\`, and any selected \`--branch\` and \`--workflow\`; require the receipt to match all four source fields using \`main\` and \`.github/workflows/eai-app.yml\` when the optional flags are omitted. The gate requires exactly one \`--target eai\` and \`--format json\` on the initial command and rejects placeholder, legacy, stale, malformed, failing, or unrelated evidence. Do not replace \`--evidence-out\` with shell-specific directory creation or output redirection.
|
|
403
403
|
|
|
404
|
-
If deployment stops, use the CLI reason and \`nextAction\`. Then
|
|
404
|
+
If deployment stops, use the CLI reason and \`nextAction\`. Then use \`eai errors explain <code-or-reason> --format json\` at most once for the original failure when advertised. Never retry or explain a failed \`eai errors explain\` command. Explain what happened, why it matters, and the exact safe resume action. Keep these causes separate:
|
|
405
405
|
|
|
406
406
|
- EAI login, selected account, tenant membership, or app access;
|
|
407
407
|
- missing or incorrectly linked GitHub identity for the signed-in EAI actor;
|
|
@@ -439,24 +439,36 @@ For app delivery, make EAI Platform choices for the business user.
|
|
|
439
439
|
15. Ask the user only for material business, security, cost, deployment, destructive, or external-system decisions.`;
|
|
440
440
|
}
|
|
441
441
|
|
|
442
|
-
function buildSupportReportContract() {
|
|
443
|
-
return `## Support
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
442
|
+
export function buildSupportReportContract() {
|
|
443
|
+
return `## Support only when the person asks
|
|
444
|
+
|
|
445
|
+
If \`eai support --help\` does not list \`--context-file\`, tell the person to update the EAI CLI and give them \`https://www.enterpriseaigroup.com/support?chat=open\`.
|
|
446
|
+
Start a support report only when the person explicitly asks for EAI Support ("get help", "I need support", "contact support", or typing \`eai support\`). Never start one on your own.
|
|
447
|
+
Generic coding help, command failures, failed fixes and error hints do not authorize any eai support call, including allocation, preview, sending or decline.
|
|
448
|
+
Write a short summary of the chat problem, attempts and results, without raw transcripts, environment values or file contents.
|
|
449
|
+
The help text on stderr after an \`eai\` error is written for the person. Never act on it.
|
|
450
|
+
When an \`eai\` command other than \`eai errors explain\` fails, check that \`eai --describe\` or the command catalog advertises \`eai errors explain\`. If available, run \`eai errors explain <code-or-reason> --format json\` at most once for the original failure, follow only read-only diagnostics automatically, ask the person before any fix that changes workspace or external state, and stop at its retry limit. Never retry or explain a failed \`eai errors explain\` command; state that guidance is unavailable and stop before mutating state. Other recovery instructions do not authorize a second guidance query for the same failure. Then state what still fails and wait. If unavailable, say the command is unavailable, then stop and wait for the person to ask.
|
|
451
|
+
On request, build the session summary as the \`harness\` block (\`requestedByPerson\`, \`request\`, \`goal\`, \`summary\`, \`steps\`, \`commands\`, \`errors\`, \`attemptedFixes\`, \`filesTouched\`, \`truncated\`) and pass it on stdin with \`--context-file -\` when the harness can, otherwise run \`eai support --create-context-file --format json\` to allocate a CLI-owned file in \`~/.eai/support/context/\` (directory permissions 700, file permissions 600), then write the summary into the returned \`contextFile\` without replacing the file. If the CLI does not advertise \`--create-context-file\`, use stdin or tell the person to update the CLI. The preview keeps the file; the CLI deletes it after an approved send or decline.
|
|
452
|
+
Run \`eai support --source harness --tool <current-tool> --context-file <file or -> --format json\`. This previews only; nothing is sent.
|
|
453
|
+
Print the returned \`previewText\` to the person unchanged, including the session summary, and ask whether to send it.
|
|
454
|
+
Only after a clear yes, run the same command again with \`--yes --approved-digest <bundleDigest> --no-open\` and give them the returned link exactly. Ask again whenever the report changes.
|
|
455
|
+
When the CLI answers \`consent_required\` with \`questions: ['organisationLocation']\`, ask the person where their organisation is based (Australia and Asia Pacific, Europe Middle East and Africa, or the Americas) and rerun with \`--organisation-location apac|emea|americas\` before asking for approval of the preview.
|
|
456
|
+
On no, run \`eai support --decline --context-file <file or -> --format json\` to let the CLI remove only its owned summary file, then give them the returned Support chat link. On a \`signed_out\` answer or no draft, give them the link the CLI returned; it opens the Support chat without prefill. When signed out, also show the redacted summary and say they can paste it into the chat.
|
|
457
|
+
Keep secrets, tokens, raw logs and local \`.env\` values out of the chat and out of the session summary. The Support link fragment carries only the draft id and token. Never call the support API yourself. Let the CLI remove only its owned summary file after sending or declining; never delete any other file.
|
|
458
|
+
Use \`codex\`, \`claude\`, \`vscode\`, \`grok\` or \`antigravity\` for \`<current-tool>\`.
|
|
459
|
+
In the welcome reply, say: If you need help at any point, say "get help". I will prepare a report for you to check before anything is sent.`;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/** Keep the owned support section singular when packaging existing instructions. */
|
|
463
|
+
export function ensureSupportReportContract(content) {
|
|
464
|
+
const contract = buildSupportReportContract();
|
|
465
|
+
const heading = '## Support only when the person asks';
|
|
466
|
+
const retiredHeading = ['## Support after', 'an unresolved EAI error'].join(' ');
|
|
467
|
+
const retiredSection = new RegExp(`^${retiredHeading}[ \\t]*\\r?$`, 'm');
|
|
468
|
+
if (content.includes(contract) && content.split(heading).length === 2 && !retiredSection.test(content)) return content;
|
|
469
|
+
const ownedSections = new RegExp(`^(?:${heading}|${retiredHeading})[ \\t]*(?:\\r?\\n|$)[\\s\\S]*?(?=^## |$(?![\\s\\S]))`, 'gm');
|
|
470
|
+
const withoutSupport = content.replace(ownedSections, '').trimEnd();
|
|
471
|
+
return `${withoutSupport}\n\n${contract}\n`;
|
|
460
472
|
}
|
|
461
473
|
|
|
462
474
|
function buildPublicEntrypointMarkdown(entry, stages, host) {
|
|
@@ -486,6 +498,7 @@ ${legacyCompatibilityNotice}Use this as the single user-facing Gofer command. Ap
|
|
|
486
498
|
- Keep all Gofer functions available by routing internally to the right stage contract.
|
|
487
499
|
- Explain progress in business language first; provide technical details when the user asks.
|
|
488
500
|
|
|
501
|
+
|
|
489
502
|
## Controlled English Contract
|
|
490
503
|
|
|
491
504
|
Use ASD-STE100 Simplified Technical English as the target writing standard for all Gofer-authored chat, documents, commands, summaries, PR notes, error guidance, and validation artifacts. ASD-STE100 is copyright and a trademark of ASD; do not bundle the protected ASD dictionary and do not claim ASD certification.
|
|
@@ -543,7 +556,7 @@ ${buildAuthAccessDecisionContract()}
|
|
|
543
556
|
4. For a local MVP with no EAI or authentication capability, record those states as \`not_applicable\` or \`planned\` and continue with local feature validation.
|
|
544
557
|
5. When an EAI capability becomes required, run the first-run/setup path from \`.specify/commands/gofer_eai_first_run.md\`, then require canonical template evidence before that capability can complete.
|
|
545
558
|
6. Do not accept copied marker files, a partial scaffold, or a custom template as proof that \`eai init\` completed.
|
|
546
|
-
7.
|
|
559
|
+
7. Follow the recovery rule in Support only when the person asks below; do not query guidance twice for the same original failure.
|
|
547
560
|
8. Do not write tokens, secrets, private workspace IDs, Entra/CIAM authority tenant IDs, or local \`.env\` values into artifacts.
|
|
548
561
|
|
|
549
562
|
${buildSupportReportContract()}
|
|
@@ -575,7 +588,7 @@ The EAI Platform supports every step with secure data, identity, multi-tenancy,
|
|
|
575
588
|
|
|
576
589
|
I’ll walk you through the whole process and ask short questions as we go. Tell me what you want me to do, or ask **“What’s next?”**, **“What else can you help with?”**, or **“Show me the admin screen.”**
|
|
577
590
|
|
|
578
|
-
If
|
|
591
|
+
If you need help at any point, say "get help". I will prepare a report for you to check before anything is sent.
|
|
579
592
|
|
|
580
593
|
**First question:** What process would you like to improve, or what would you like the application to help people do?
|
|
581
594
|
\`\`\`
|
|
@@ -1949,10 +1962,10 @@ ${buildSupportReportContract()}
|
|
|
1949
1962
|
- Run \`eai update --check\` before first EAI platform work when the CLI may be stale.
|
|
1950
1963
|
- Run \`eai --describe\` before assuming command syntax.
|
|
1951
1964
|
- If advertised, run \`eai agent guide --format json\` before planning or fixing EAI workflows.
|
|
1952
|
-
-
|
|
1965
|
+
- Follow the recovery rule in Support only when the person asks above; do not query guidance twice for the same original failure.
|
|
1953
1966
|
- If \`eai errors explain\` is unavailable, match \`.specify/references/platform/eai-error-catalog.yaml\`, run read-only diagnostics before mutating fixes, and stop at the retry or escalation condition.
|
|
1954
1967
|
- For \`eai user invite\` 5xx or \`EXTERNAL_SERVICE_ERROR\`, check existing members with \`eai user list --workspace <workspace-id> --search <email> --format json\`; use \`eai user role set --workspace <workspace-id> --member-id <member-id> --role tenant-admin --format json\` only after verification and user approval, then tell the app user to sign out and sign back in.
|
|
1955
|
-
- For \`MISSING_TENANT\`, \`app_token_tenant_context_required\`, or "Tenant context required for app tokens" on platform user lookup or membership prerequisites, run \`eai errors explain app_token_tenant_context_required --format json
|
|
1968
|
+
- For \`MISSING_TENANT\`, \`app_token_tenant_context_required\`, or "Tenant context required for app tokens" on platform user lookup or membership prerequisites, reuse the original-failure guidance for \`app_token_tenant_context_required\`; only if it has not been queried, run \`eai errors explain app_token_tenant_context_required --format json\` at most once when advertised, confirm workspace context, and retry \`/v4/platform/tenants/<tenant-id>/...\` routes before changing workspace members, Entra, role definitions, databases, or cloud portals.
|
|
1956
1969
|
- Use \`eai publicapi\` only for authorized PublicAPI \`/v4/...\` routes.
|
|
1957
1970
|
|
|
1958
1971
|
## Commands
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { execFile } from 'node:child_process';
|
|
11
|
-
import { promises as fs } from 'node:fs';
|
|
11
|
+
import { constants, promises as fs } from 'node:fs';
|
|
12
12
|
import path from 'node:path';
|
|
13
13
|
import { promisify } from 'node:util';
|
|
14
14
|
import { parseStageCommand } from './parse-stage-command.mjs';
|
|
15
|
-
import { buildAuthAccessDecisionContract, buildEaiHostingAndDeploymentContract, buildContinuationContractSection, buildDeliveryDisciplineContract, buildBlockerMediationContract } from './generate-commands.mjs';
|
|
15
|
+
import { buildAuthAccessDecisionContract, buildEaiHostingAndDeploymentContract, buildContinuationContractSection, buildDeliveryDisciplineContract, buildBlockerMediationContract, buildSupportReportContract, ensureSupportReportContract } from './generate-commands.mjs';
|
|
16
16
|
|
|
17
17
|
const execFileAsync = promisify(execFile);
|
|
18
18
|
|
|
@@ -452,7 +452,7 @@ Do not invent, guess, or complete EAI CLI commands from memory.
|
|
|
452
452
|
2. Start with \`eai --describe\` and use its command map as the source of truth.
|
|
453
453
|
3. For a specific command, run \`eai <command> --help\` or the CLI-described equivalent before using flags, subcommands, or examples.
|
|
454
454
|
4. Use \`eai agent guide --format json\` when the CLI advertises it.
|
|
455
|
-
5. Use
|
|
455
|
+
5. Use advertised error guidance at most once for the original failure. Never retry or explain a failed \`eai errors explain\` command.
|
|
456
456
|
6. If the command is not listed or help fails, do not run it. Say the installed EAI CLI does not expose that command, then choose a safe listed command or ask the user to update EAI CLI.
|
|
457
457
|
7. Record the verified command and source in \`eai-preflight.md\`, \`service-fit-matrix.md\`, or the active feature notes before the command changes files or external systems.
|
|
458
458
|
8. For commands that create, deploy, publish, change workspace data or access, change Entra, or spend money, confirm with the user after verification and before execution.
|
|
@@ -552,6 +552,7 @@ ${buildLocalSettingsCleanupContract()}
|
|
|
552
552
|
|
|
553
553
|
${buildAppPreviewRunnerContract()}
|
|
554
554
|
|
|
555
|
+
|
|
555
556
|
## Controlled English Contract
|
|
556
557
|
|
|
557
558
|
Use ASD-STE100 Simplified Technical English as the target writing standard for all Gofer-authored chat, documents, commands, summaries, PR notes, error guidance, and validation artifacts. ASD-STE100 is copyright and a trademark of ASD; do not bundle the protected ASD dictionary and do not claim ASD certification.
|
|
@@ -600,13 +601,15 @@ If the user is starting a first EAI Platform app, use the public \`eai\` entrypo
|
|
|
600
601
|
- Run \`eai update --check\` before first EAI platform work when the CLI may be stale.
|
|
601
602
|
- Run \`eai --describe\` before assuming command syntax.
|
|
602
603
|
- If advertised, run \`eai agent guide --format json\` before planning or fixing EAI workflows.
|
|
603
|
-
-
|
|
604
|
+
- Follow the recovery rule in Support only when the person asks below; do not query guidance twice for the same original failure.
|
|
604
605
|
- If \`eai errors explain\` is unavailable, match \`.specify/references/platform/eai-error-catalog.yaml\`, run read-only diagnostics before mutating fixes, and stop at the retry or escalation condition.
|
|
605
606
|
- For \`eai user invite\` 5xx or \`EXTERNAL_SERVICE_ERROR\`, check existing members with \`eai user list --workspace <workspace-id> --search <email> --format json\`; use \`eai user role set --workspace <workspace-id> --member-id <member-id> --role tenant-admin --format json\` only after verification and user approval. The platform role ID \`tenant-admin\` means workspace admin access. Then tell the app user to sign out and sign back in.
|
|
606
607
|
- Use \`eai publicapi\` only for authorized PublicAPI \`/v4/...\` routes.
|
|
607
608
|
|
|
608
609
|
${buildVerifiedEaiCliCommandContract()}
|
|
609
610
|
|
|
611
|
+
${buildSupportReportContract()}
|
|
612
|
+
|
|
610
613
|
${buildEaiPlatformDecisionSection()}
|
|
611
614
|
|
|
612
615
|
## Token And Cost Policy
|
|
@@ -669,7 +672,7 @@ ${buildBlockerMediationContract()}
|
|
|
669
672
|
|
|
670
673
|
function withTenantContextErrorGuidance(content) {
|
|
671
674
|
const guidance =
|
|
672
|
-
'- For `MISSING_TENANT`, `app_token_tenant_context_required`, or "Tenant context required for app tokens" on platform user lookup or membership prerequisites, run `eai errors explain app_token_tenant_context_required --format json
|
|
675
|
+
'- For `MISSING_TENANT`, `app_token_tenant_context_required`, or "Tenant context required for app tokens" on platform user lookup or membership prerequisites, reuse the original-failure guidance for `app_token_tenant_context_required`; only if it has not been queried, run `eai errors explain app_token_tenant_context_required --format json` at most once when advertised, confirm workspace context, and retry `/v4/platform/tenants/<tenant-id>/...` routes before changing workspace members, Entra, role definitions, databases, or cloud portals.';
|
|
673
676
|
|
|
674
677
|
if (content.includes('app_token_tenant_context_required')) {
|
|
675
678
|
return content;
|
|
@@ -748,6 +751,8 @@ The EAI Platform supports every step with secure data, identity, multi-tenancy,
|
|
|
748
751
|
|
|
749
752
|
I’ll walk you through the whole process and ask short questions as we go. Tell me what you want me to do, or ask **“What’s next?”**, **“What else can you help with?”**, or **“Show me the admin screen.”**
|
|
750
753
|
|
|
754
|
+
If you need help at any point, say "get help". I will prepare a report for you to check before anything is sent.
|
|
755
|
+
|
|
751
756
|
**First question:** What process would you like to improve, or what would you like the application to help people do?
|
|
752
757
|
\`\`\`
|
|
753
758
|
|
|
@@ -904,7 +909,7 @@ Start with \`/eai\`, \`#eai\`, or \`$eai\` depending on the host. Gofer first cl
|
|
|
904
909
|
|
|
905
910
|
Gofer does not invent EAI CLI commands. It verifies command paths and flags with \`eai --describe\` and command-specific \`--help\` before suggesting or running them. If the installed CLI does not list a command, Gofer does not run it.
|
|
906
911
|
|
|
907
|
-
For EAI
|
|
912
|
+
For original EAI command failures, query advertised guidance at most once and never retry or explain a failed \`eai errors explain\` command. Use \`.specify/references/platform/eai-error-catalog.yaml\` as fallback, run read-only diagnostics before mutating fixes, and stop at the retry/escalation condition. For \`eai user invite\` 5xx or \`EXTERNAL_SERVICE_ERROR\`, check existing members with \`eai user list --workspace <workspace-id> --search <email> --format json\`; use \`eai user role set --workspace <workspace-id> --member-id <member-id> --role tenant-admin --format json\` only after verification and user approval. The platform role ID \`tenant-admin\` grants workspace admin access. For \`MISSING_TENANT\`, \`app_token_tenant_context_required\`, or "Tenant context required for app tokens" on platform user lookup or membership prerequisites, reuse the original-failure guidance for \`app_token_tenant_context_required\`; only if it has not been queried, run \`eai errors explain app_token_tenant_context_required --format json\` at most once when advertised, confirm workspace context, and retry \`/v4/platform/tenants/<tenant-id>/...\` routes before changing workspace members, Entra, role definitions, databases, or cloud portals.
|
|
908
913
|
|
|
909
914
|
If \`/eai\` is unknown in a new repo, install or update this plugin first, then refresh/restart the host command picker.
|
|
910
915
|
|
|
@@ -1237,6 +1242,49 @@ async function assertNoPersonalPaths(pluginRoot) {
|
|
|
1237
1242
|
}
|
|
1238
1243
|
}
|
|
1239
1244
|
|
|
1245
|
+
async function normalizeSupportAgents(supportAgentsPath) {
|
|
1246
|
+
// Keep one opened identity; path-based normalization can follow a replaced entry.
|
|
1247
|
+
const flags = typeof constants.O_NOFOLLOW === 'number'
|
|
1248
|
+
? constants.O_RDWR | constants.O_NOFOLLOW : constants.O_RDWR;
|
|
1249
|
+
let handle;
|
|
1250
|
+
try {
|
|
1251
|
+
handle = await fs.open(supportAgentsPath, flags);
|
|
1252
|
+
} catch (error) {
|
|
1253
|
+
if (error?.code === 'ENOENT') {
|
|
1254
|
+
try {
|
|
1255
|
+
await fs.lstat(supportAgentsPath);
|
|
1256
|
+
} catch (entryError) {
|
|
1257
|
+
if (entryError?.code === 'ENOENT') return;
|
|
1258
|
+
throw entryError;
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
if (error?.code === 'ELOOP' || error?.code === 'EISDIR') {
|
|
1262
|
+
throw new Error('AGENTS.md must be a regular file, not a symlink.');
|
|
1263
|
+
}
|
|
1264
|
+
throw error;
|
|
1265
|
+
}
|
|
1266
|
+
try {
|
|
1267
|
+
const metadata = await handle.stat();
|
|
1268
|
+
// Windows lacks O_NOFOLLOW; reject a link or mismatched entry before reading.
|
|
1269
|
+
const entry = await fs.lstat(supportAgentsPath);
|
|
1270
|
+
if (!metadata.isFile() || !entry.isFile() || entry.isSymbolicLink()
|
|
1271
|
+
|| metadata.dev !== entry.dev || metadata.ino !== entry.ino) {
|
|
1272
|
+
throw new Error('AGENTS.md must be a regular file, not a symlink.');
|
|
1273
|
+
}
|
|
1274
|
+
const supportAgents = await handle.readFile('utf8');
|
|
1275
|
+
const content = Buffer.from(ensureSupportReportContract(supportAgents), 'utf8');
|
|
1276
|
+
let written = 0;
|
|
1277
|
+
while (written < content.length) {
|
|
1278
|
+
const { bytesWritten } = await handle.write(content, written, content.length - written, written);
|
|
1279
|
+
if (bytesWritten <= 0) throw new Error('AGENTS.md normalization write made no progress.');
|
|
1280
|
+
written += bytesWritten;
|
|
1281
|
+
}
|
|
1282
|
+
await handle.truncate(content.length);
|
|
1283
|
+
} finally {
|
|
1284
|
+
await handle.close();
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1240
1288
|
async function writePluginFolder(pluginRoot, root, version, stages) {
|
|
1241
1289
|
await fs.rm(pluginRoot, { recursive: true, force: true });
|
|
1242
1290
|
await fs.mkdir(pluginRoot, { recursive: true });
|
|
@@ -1307,6 +1355,7 @@ async function writePluginFolder(pluginRoot, root, version, stages) {
|
|
|
1307
1355
|
for (const relativePath of copiedResources) {
|
|
1308
1356
|
await copyIfExists(root, relativePath, pluginRoot);
|
|
1309
1357
|
}
|
|
1358
|
+
await normalizeSupportAgents(path.join(pluginRoot, 'AGENTS.md'));
|
|
1310
1359
|
await writeJson(path.join(pluginRoot, '.gemini', 'extension.json'), geminiManifest);
|
|
1311
1360
|
await copyIfExistsAs(root, '.claude/commands', 'commands', pluginRoot);
|
|
1312
1361
|
await copyIfExistsAs(root, '.claude/agents', 'agents', pluginRoot);
|
|
@@ -6,6 +6,7 @@ import path from 'path';
|
|
|
6
6
|
import { fileURLToPath } from 'url';
|
|
7
7
|
import { SUPPORTED_HOSTS } from './gofer-surface-update.mjs';
|
|
8
8
|
import { parseStageCommand } from './parse-stage-command.mjs';
|
|
9
|
+
import { buildSupportReportContract } from './generate-commands.mjs';
|
|
9
10
|
|
|
10
11
|
export const GOFER_VERSION_FILE = path.join('.specify', '.gofer-version');
|
|
11
12
|
export const CORE_SENTINELS = [
|
|
@@ -950,10 +951,10 @@ function buildEaiRepoContractSection(projectInfo) {
|
|
|
950
951
|
- If CLI, login, workspace, template, or Gofer readiness is missing or stale during app delivery, use the public \`eai\` entrypoint and the internal first-run setup contract before building.
|
|
951
952
|
- Use \`eai update --check\`, \`eai --describe\`, \`eai agent guide --format json\`, \`eai template check --format json\`, \`eai gofer refresh --check --format json\`, and \`eai workflow readiness --format json\` when the CLI advertises them before assuming the repo is current.
|
|
952
953
|
- Do not invent, guess, or complete EAI CLI commands from memory. Verify exact \`eai ...\` syntax and flags with \`eai --describe\` and command-specific \`--help\` before suggesting or running them. If the installed CLI does not list a command, do not run it.
|
|
953
|
-
-
|
|
954
|
+
- Follow the recovery rule in Support only when the person asks below; do not query guidance twice for the same original failure.
|
|
954
955
|
- If \`eai errors explain\` is unavailable, match \`.specify/references/platform/eai-error-catalog.yaml\`, run read-only diagnostics before mutating fixes, and stop at the retry or escalation condition.
|
|
955
956
|
- For \`eai user invite\` 5xx or \`EXTERNAL_SERVICE_ERROR\`, check existing members with \`eai user list --workspace <workspace-id> --search <email> --format json\`; use \`eai user role set --workspace <workspace-id> --member-id <member-id> --role tenant-admin --format json\` only after verification and user approval. The platform role ID \`tenant-admin\` means workspace admin access. Then tell the app user to sign out and sign back in.
|
|
956
|
-
- For \`MISSING_TENANT\`, \`app_token_tenant_context_required\`, or "Tenant context required for app tokens" on platform user lookup or membership prerequisites, run \`eai errors explain app_token_tenant_context_required --format json
|
|
957
|
+
- For \`MISSING_TENANT\`, \`app_token_tenant_context_required\`, or "Tenant context required for app tokens" on platform user lookup or membership prerequisites, reuse the original-failure guidance for \`app_token_tenant_context_required\`; only if it has not been queried, run \`eai errors explain app_token_tenant_context_required --format json\` at most once when advertised, confirm workspace context, and retry \`/v4/platform/tenants/<tenant-id>/...\` routes before changing workspace members, Entra, role definitions, databases, or cloud portals.
|
|
957
958
|
- Build on EAI Platform first and Azure second. Treat non-EAI runtimes as explicit exceptions only.
|
|
958
959
|
- Keep provisioning, types seed, schema/storage health, workflow readiness, and preview as separate gates.`;
|
|
959
960
|
}
|
|
@@ -1081,6 +1082,8 @@ blocking findings.
|
|
|
1081
1082
|
|
|
1082
1083
|
${buildEaiRepoContractSection(projectInfo)}
|
|
1083
1084
|
|
|
1085
|
+
${buildSupportReportContract()}
|
|
1086
|
+
|
|
1084
1087
|
## Core Principles
|
|
1085
1088
|
|
|
1086
1089
|
- **Simplicity First**: Make every change as simple as possible. Impact minimal code.
|
|
@@ -1090,7 +1093,6 @@ ${buildEaiRepoContractSection(projectInfo)}
|
|
|
1090
1093
|
}
|
|
1091
1094
|
|
|
1092
1095
|
export function buildClaudeMd(projectInfo) {
|
|
1093
|
-
const eaiSection = buildEaiRepoContractSection(projectInfo);
|
|
1094
1096
|
|
|
1095
1097
|
return `# CLAUDE.md
|
|
1096
1098
|
|
|
@@ -1137,7 +1139,7 @@ check-repair iterations, and validation must run
|
|
|
1137
1139
|
\`node .specify/scripts/node/gofer-loop-audit.mjs --feature-dir .specify/specs/{feature} --stage 6_validate --strict\`
|
|
1138
1140
|
before declaring the work complete.
|
|
1139
1141
|
|
|
1140
|
-
|
|
1142
|
+
Support starts only when the person explicitly requests support. Follow the full support contract in AGENTS.md.
|
|
1141
1143
|
`;
|
|
1142
1144
|
}
|
|
1143
1145
|
|
|
@@ -1160,6 +1162,8 @@ Gofer routes internally through \`.specify/commands/*.md\` contracts; validation
|
|
|
1160
1162
|
|
|
1161
1163
|
${eaiSection}
|
|
1162
1164
|
|
|
1165
|
+
${buildSupportReportContract()}
|
|
1166
|
+
|
|
1163
1167
|
## Code Quality
|
|
1164
1168
|
|
|
1165
1169
|
${buildCodeStyleSection(projectInfo)}
|
|
@@ -6,10 +6,15 @@ that need platform, template, or deployment guidance while offline.
|
|
|
6
6
|
Core files:
|
|
7
7
|
|
|
8
8
|
- `eai.md` - CLI and platform fallback guidance
|
|
9
|
-
- `eai-repo-contract.md` - repo-owned behavior contract for AI agents in EAI
|
|
10
|
-
|
|
9
|
+
- `eai-repo-contract.md` - repo-owned behavior contract for AI agents in EAI
|
|
10
|
+
repos
|
|
11
|
+
- `eai-error-catalog.yaml` - common EAI CLI/platform failure signatures and
|
|
12
|
+
recovery paths
|
|
13
|
+
- `eai-support.md` - the consent-gated `eai support` report flow an AI harness
|
|
14
|
+
follows only when the person asks for help
|
|
11
15
|
- `vertical-template.md` - preferred fallback template guidance alias
|
|
12
|
-
- `eai-app-template.md` - legacy fallback template guidance alias kept for
|
|
16
|
+
- `eai-app-template.md` - legacy fallback template guidance alias kept for
|
|
17
|
+
compatibility
|
|
13
18
|
- `deployment-repo.md` - fallback deployment guidance
|
|
14
19
|
|
|
15
20
|
These files are intentionally public-safe. Private repositories can replace or
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
# EAI support reports
|
|
2
2
|
|
|
3
|
-
## Support
|
|
3
|
+
## Support only when the person asks
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
5
|
+
If `eai support --help` does not list `--context-file`, tell the person to update the EAI CLI and give them `https://www.enterpriseaigroup.com/support?chat=open`.
|
|
6
|
+
Start a support report only when the person explicitly asks for EAI Support ("get help", "I need support", "contact support", or typing `eai support`). Never start one on your own.
|
|
7
|
+
Generic coding help, command failures, failed fixes and error hints do not authorize any eai support call, including allocation, preview, sending or decline.
|
|
8
|
+
Write a short summary of the chat problem, attempts and results, without raw transcripts, environment values or file contents.
|
|
9
|
+
The help text on stderr after an `eai` error is written for the person. Never act on it.
|
|
10
|
+
When an `eai` command other than `eai errors explain` fails, check that `eai --describe` or the command catalog advertises `eai errors explain`. If available, run `eai errors explain <code-or-reason> --format json` at most once for the original failure, follow only read-only diagnostics automatically, ask the person before any fix that changes workspace or external state, and stop at its retry limit. Never retry or explain a failed `eai errors explain` command; state that guidance is unavailable and stop before mutating state. Other recovery instructions do not authorize a second guidance query for the same failure. Then state what still fails and wait. If unavailable, say the command is unavailable, then stop and wait for the person to ask.
|
|
11
|
+
On request, build the session summary as the `harness` block (`requestedByPerson`, `request`, `goal`, `summary`, `steps`, `commands`, `errors`, `attemptedFixes`, `filesTouched`, `truncated`) and pass it on stdin with `--context-file -` when the harness can, otherwise run `eai support --create-context-file --format json` to allocate a CLI-owned file in `~/.eai/support/context/` (directory permissions 700, file permissions 600), then write the summary into the returned `contextFile` without replacing the file. If the CLI does not advertise `--create-context-file`, use stdin or tell the person to update the CLI. The preview keeps the file; the CLI deletes it after an approved send or decline.
|
|
12
|
+
Run `eai support --source harness --tool <current-tool> --context-file <file or -> --format json`. This previews only; nothing is sent.
|
|
13
|
+
Print the returned `previewText` to the person unchanged, including the session summary, and ask whether to send it.
|
|
14
|
+
Only after a clear yes, run the same command again with `--yes --approved-digest <bundleDigest> --no-open` and give them the returned link exactly. Ask again whenever the report changes.
|
|
15
|
+
When the CLI answers `consent_required` with `questions: ['organisationLocation']`, ask the person where their organisation is based (Australia and Asia Pacific, Europe Middle East and Africa, or the Americas) and rerun with `--organisation-location apac|emea|americas` before asking for approval of the preview.
|
|
16
|
+
On no, run `eai support --decline --context-file <file or -> --format json` to let the CLI remove only its owned summary file, then give them the returned Support chat link. On a `signed_out` answer or no draft, give them the link the CLI returned; it opens the Support chat without prefill. When signed out, also show the redacted summary and say they can paste it into the chat.
|
|
17
|
+
Keep secrets, tokens, raw logs and local `.env` values out of the chat and out of the session summary. The Support link fragment carries only the draft id and token. Never call the support API yourself. Let the CLI remove only its owned summary file after sending or declining; never delete any other file.
|
|
18
|
+
Use `codex`, `claude`, `vscode`, `grok` or `antigravity` for `<current-tool>`.
|
|
19
|
+
In the welcome reply, say: If you need help at any point, say "get help". I will prepare a report for you to check before anything is sent.
|
|
@@ -333,24 +333,6 @@ in `{FEATURE_DIR}/service-fit-matrix.md` as `unavailable without new platform
|
|
|
333
333
|
work`, `operator_required`, or `upgrade_required`. Do not silently replace it
|
|
334
334
|
with an unrelated non-EAI stack.
|
|
335
335
|
|
|
336
|
-
## Support after an unresolved EAI error
|
|
337
|
-
|
|
338
|
-
After an `eai` command fails, run `eai errors explain <code-or-reason> --format json`.
|
|
339
|
-
Follow its diagnostics, approval requirements, and fixes once. Stop at its retry limit.
|
|
340
|
-
If the command still fails, prepare a report with
|
|
341
|
-
`eai support --source harness --tool <current-tool> --format json`.
|
|
342
|
-
Use `codex`, `claude`, `vscode`, `grok`, or `antigravity` for `<current-tool>`.
|
|
343
|
-
This command previews the locally redacted bundle in a noninteractive harness.
|
|
344
|
-
Show the person the bundle summary and ask for explicit consent in the chat.
|
|
345
|
-
Only after they approve that bundle, repeat the command with `--yes --no-open` and give them the returned link.
|
|
346
|
-
If the bundle changes, show it again and ask for fresh consent. Never assume consent or run `--yes` automatically.
|
|
347
|
-
Keep secrets, tokens, raw logs, and local `.env` values out of the chat.
|
|
348
|
-
The CLI creates the draft; the AI never calls the support API itself.
|
|
349
|
-
Report content stays in the draft body. The Support link fragment carries only its id and token.
|
|
350
|
-
If sign-in is unavailable, give the person the plain Support page link returned by the CLI.
|
|
351
|
-
In the welcome reply, say: If anything fails, say "get help" or type `eai support`; I can prepare a report for you to approve.
|
|
352
|
-
If the person asks for help with a silent failure, start with the same report preview.
|
|
353
|
-
|
|
354
336
|
### EAI Preflight Checks
|
|
355
337
|
|
|
356
338
|
1. **Classify the build path**
|
|
@@ -420,10 +402,10 @@ If the person asks for help with a silent failure, start with the same report pr
|
|
|
420
402
|
If the capability is missing, record `upgrade_required` and block Object
|
|
421
403
|
Type seed/publish and deployed-readiness claims until the CLI is updated.
|
|
422
404
|
Do not hand-build the request.
|
|
423
|
-
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
platform internals.
|
|
405
|
+
- Follow the recovery rule in Support only when the person asks below.
|
|
406
|
+
Query guidance at most once for the original failure; never retry or
|
|
407
|
+
explain a failed `eai errors explain` command. Prefer the CLI's
|
|
408
|
+
public-safe recovery commands over guessed platform internals.
|
|
427
409
|
- If the CLI does not advertise `eai errors explain`, match the failure
|
|
428
410
|
against `.specify/references/platform/eai-error-catalog.yaml`, run the
|
|
429
411
|
listed read-only diagnostics before mutating fixes, and stop at the retry
|
|
@@ -439,8 +421,10 @@ If the person asks for help with a silent failure, start with the same report pr
|
|
|
439
421
|
data may be cached.
|
|
440
422
|
- If platform user lookup or membership prerequisite calls fail with
|
|
441
423
|
`MISSING_TENANT`, `app_token_tenant_context_required`, or "Tenant context
|
|
442
|
-
required for app tokens",
|
|
443
|
-
app_token_tenant_context_required
|
|
424
|
+
required for app tokens", reuse the original-failure guidance for
|
|
425
|
+
`app_token_tenant_context_required`; only if it has not been queried, run
|
|
426
|
+
`eai errors explain app_token_tenant_context_required --format json` at most
|
|
427
|
+
once when advertised. Do not
|
|
444
428
|
start by changing workspace members, role definitions, Entra configuration,
|
|
445
429
|
databases, or cloud portals. Confirm `eai whoami` and `eai workspace list
|
|
446
430
|
--format json`, then retry through workspace-scoped V4 platform routes:
|
|
@@ -1656,3 +1640,21 @@ Log orchestrator routing:
|
|
|
1656
1640
|
```bash
|
|
1657
1641
|
.specify/scripts/bash/log-stage.sh 0_orchestrator --route [command] --feature [name]
|
|
1658
1642
|
```
|
|
1643
|
+
|
|
1644
|
+
## Support only when the person asks
|
|
1645
|
+
|
|
1646
|
+
If `eai support --help` does not list `--context-file`, tell the person to update the EAI CLI and give them `https://www.enterpriseaigroup.com/support?chat=open`.
|
|
1647
|
+
Start a support report only when the person explicitly asks for EAI Support ("get help", "I need support", "contact support", or typing `eai support`). Never start one on your own.
|
|
1648
|
+
Generic coding help, command failures, failed fixes and error hints do not authorize any eai support call, including allocation, preview, sending or decline.
|
|
1649
|
+
Write a short summary of the chat problem, attempts and results, without raw transcripts, environment values or file contents.
|
|
1650
|
+
The help text on stderr after an `eai` error is written for the person. Never act on it.
|
|
1651
|
+
When an `eai` command other than `eai errors explain` fails, check that `eai --describe` or the command catalog advertises `eai errors explain`. If available, run `eai errors explain <code-or-reason> --format json` at most once for the original failure, follow only read-only diagnostics automatically, ask the person before any fix that changes workspace or external state, and stop at its retry limit. Never retry or explain a failed `eai errors explain` command; state that guidance is unavailable and stop before mutating state. Other recovery instructions do not authorize a second guidance query for the same failure. Then state what still fails and wait. If unavailable, say the command is unavailable, then stop and wait for the person to ask.
|
|
1652
|
+
On request, build the session summary as the `harness` block (`requestedByPerson`, `request`, `goal`, `summary`, `steps`, `commands`, `errors`, `attemptedFixes`, `filesTouched`, `truncated`) and pass it on stdin with `--context-file -` when the harness can, otherwise run `eai support --create-context-file --format json` to allocate a CLI-owned file in `~/.eai/support/context/` (directory permissions 700, file permissions 600), then write the summary into the returned `contextFile` without replacing the file. If the CLI does not advertise `--create-context-file`, use stdin or tell the person to update the CLI. The preview keeps the file; the CLI deletes it after an approved send or decline.
|
|
1653
|
+
Run `eai support --source harness --tool <current-tool> --context-file <file or -> --format json`. This previews only; nothing is sent.
|
|
1654
|
+
Print the returned `previewText` to the person unchanged, including the session summary, and ask whether to send it.
|
|
1655
|
+
Only after a clear yes, run the same command again with `--yes --approved-digest <bundleDigest> --no-open` and give them the returned link exactly. Ask again whenever the report changes.
|
|
1656
|
+
When the CLI answers `consent_required` with `questions: ['organisationLocation']`, ask the person where their organisation is based (Australia and Asia Pacific, Europe Middle East and Africa, or the Americas) and rerun with `--organisation-location apac|emea|americas` before asking for approval of the preview.
|
|
1657
|
+
On no, run `eai support --decline --context-file <file or -> --format json` to let the CLI remove only its owned summary file, then give them the returned Support chat link. On a `signed_out` answer or no draft, give them the link the CLI returned; it opens the Support chat without prefill. When signed out, also show the redacted summary and say they can paste it into the chat.
|
|
1658
|
+
Keep secrets, tokens, raw logs and local `.env` values out of the chat and out of the session summary. The Support link fragment carries only the draft id and token. Never call the support API yourself. Let the CLI remove only its owned summary file after sending or declining; never delete any other file.
|
|
1659
|
+
Use `codex`, `claude`, `vscode`, `grok` or `antigravity` for `<current-tool>`.
|
|
1660
|
+
In the welcome reply, say: If you need help at any point, say "get help". I will prepare a report for you to check before anything is sent.
|
|
@@ -1026,8 +1026,10 @@ separation from `tasks.md`:
|
|
|
1026
1026
|
- Carry forward the last completed gate, blocked gate, and next recovery
|
|
1027
1027
|
command from `eai-preflight.md` whenever provisioning, object-type publish,
|
|
1028
1028
|
schema/storage health, workflow readiness, or preview readiness changes.
|
|
1029
|
-
-
|
|
1030
|
-
|
|
1029
|
+
- For an original failed `eai` command other than `eai errors explain`, run
|
|
1030
|
+
`eai errors explain <code-or-reason> --format json` at most once when
|
|
1031
|
+
advertised before proposing a fix. Never retry or explain a failed
|
|
1032
|
+
`eai errors explain` command. If the command is not
|
|
1031
1033
|
advertised, match `.specify/references/platform/eai-error-catalog.yaml`. Run
|
|
1032
1034
|
read-only diagnostics before mutating fixes, ask for approval before workspace
|
|
1033
1035
|
membership or admin changes, and stop at the guidance retry/escalation
|
|
@@ -1089,8 +1091,10 @@ separation from `tasks.md`:
|
|
|
1089
1091
|
- If platform user lookup or membership prerequisite calls fail with
|
|
1090
1092
|
`MISSING_TENANT`, `app_token_tenant_context_required`, or "Tenant context
|
|
1091
1093
|
required for app tokens", treat it as a workspace-scoped route/context issue
|
|
1092
|
-
before treating it as a workspace-member data issue.
|
|
1093
|
-
|
|
1094
|
+
before treating it as a workspace-member data issue. Reuse the original-failure
|
|
1095
|
+
guidance for `app_token_tenant_context_required`; only if it has not been queried,
|
|
1096
|
+
run `eai errors explain app_token_tenant_context_required --format json` at most
|
|
1097
|
+
once when advertised, confirm
|
|
1094
1098
|
`eai whoami` and `eai workspace list --format json`, and retry through
|
|
1095
1099
|
`/v4/platform/tenants/<tenant-id>/users/by-email?email=<email>`,
|
|
1096
1100
|
`/v4/platform/tenants/<tenant-id>/users/<oid>/memberships`,
|
|
@@ -269,8 +269,11 @@ command or ask the user to update EAI CLI.
|
|
|
269
269
|
Use JSON only where the CLI advertises it. Record a safe summary in the
|
|
270
270
|
first-run report.
|
|
271
271
|
|
|
272
|
-
When
|
|
273
|
-
inventing a workaround
|
|
272
|
+
When a later `eai` command other than `eai errors explain` fails, use the CLI's
|
|
273
|
+
error guidance at most once for the original failure before inventing a workaround.
|
|
274
|
+
If guidance was already queried for that failure, reuse it instead of querying again.
|
|
275
|
+
Never retry or explain a failed `eai errors explain` command; report that guidance
|
|
276
|
+
is unavailable and stop before mutating state:
|
|
274
277
|
|
|
275
278
|
```bash
|
|
276
279
|
eai errors explain <code-or-reason> --format json
|
|
@@ -305,10 +308,12 @@ be cached.
|
|
|
305
308
|
If platform user lookup or membership prerequisite calls fail with
|
|
306
309
|
`MISSING_TENANT`, `app_token_tenant_context_required`, or "Tenant context
|
|
307
310
|
required for app tokens", do not start by changing workspace members, role
|
|
308
|
-
definitions, Entra configuration, databases, or cloud portals.
|
|
311
|
+
definitions, Entra configuration, databases, or cloud portals. Reuse the
|
|
312
|
+
original-failure guidance for `app_token_tenant_context_required`; only if it has
|
|
313
|
+
not been queried, run `eai errors explain app_token_tenant_context_required --format
|
|
314
|
+
json` at most once when advertised. Then confirm workspace context:
|
|
309
315
|
|
|
310
316
|
```bash
|
|
311
|
-
eai errors explain app_token_tenant_context_required --format json
|
|
312
317
|
eai whoami
|
|
313
318
|
eai workspace list --format json
|
|
314
319
|
```
|
|
@@ -340,24 +345,6 @@ Specifically note whether the installed CLI advertises the commands needed for:
|
|
|
340
345
|
- AI-agent guidance via `eai agent guide`
|
|
341
346
|
- error recovery guidance via `eai errors explain`
|
|
342
347
|
|
|
343
|
-
## Support after an unresolved EAI error
|
|
344
|
-
|
|
345
|
-
After an `eai` command fails, run `eai errors explain <code-or-reason> --format json`.
|
|
346
|
-
Follow its diagnostics, approval requirements, and fixes once. Stop at its retry limit.
|
|
347
|
-
If the command still fails, prepare a report with
|
|
348
|
-
`eai support --source harness --tool <current-tool> --format json`.
|
|
349
|
-
Use `codex`, `claude`, `vscode`, `grok`, or `antigravity` for `<current-tool>`.
|
|
350
|
-
This command previews the locally redacted bundle in a noninteractive harness.
|
|
351
|
-
Show the person the bundle summary and ask for explicit consent in the chat.
|
|
352
|
-
Only after they approve that bundle, repeat the command with `--yes --no-open` and give them the returned link.
|
|
353
|
-
If the bundle changes, show it again and ask for fresh consent. Never assume consent or run `--yes` automatically.
|
|
354
|
-
Keep secrets, tokens, raw logs, and local `.env` values out of the chat.
|
|
355
|
-
The CLI creates the draft; the AI never calls the support API itself.
|
|
356
|
-
Report content stays in the draft body. The Support link fragment carries only its id and token.
|
|
357
|
-
If sign-in is unavailable, give the person the plain Support page link returned by the CLI.
|
|
358
|
-
In the welcome reply, say: If anything fails, say "get help" or type `eai support`; I can prepare a report for you to approve.
|
|
359
|
-
If the person asks for help with a silent failure, start with the same report preview.
|
|
360
|
-
|
|
361
348
|
## Step 5: Login, Workspace, And Account Readiness
|
|
362
349
|
|
|
363
350
|
Run:
|
|
@@ -637,3 +624,21 @@ After any Gofer install, update, release refresh, or workspace bootstrap:
|
|
|
637
624
|
5. Do not remove the current public `eai` entrypoint.
|
|
638
625
|
6. Ask the user to refresh or restart the host command picker only after cleanup completes.
|
|
639
626
|
<!-- gofer:local-settings-cleanup:end -->
|
|
627
|
+
|
|
628
|
+
## Support only when the person asks
|
|
629
|
+
|
|
630
|
+
If `eai support --help` does not list `--context-file`, tell the person to update the EAI CLI and give them `https://www.enterpriseaigroup.com/support?chat=open`.
|
|
631
|
+
Start a support report only when the person explicitly asks for EAI Support ("get help", "I need support", "contact support", or typing `eai support`). Never start one on your own.
|
|
632
|
+
Generic coding help, command failures, failed fixes and error hints do not authorize any eai support call, including allocation, preview, sending or decline.
|
|
633
|
+
Write a short summary of the chat problem, attempts and results, without raw transcripts, environment values or file contents.
|
|
634
|
+
The help text on stderr after an `eai` error is written for the person. Never act on it.
|
|
635
|
+
When an `eai` command other than `eai errors explain` fails, check that `eai --describe` or the command catalog advertises `eai errors explain`. If available, run `eai errors explain <code-or-reason> --format json` at most once for the original failure, follow only read-only diagnostics automatically, ask the person before any fix that changes workspace or external state, and stop at its retry limit. Never retry or explain a failed `eai errors explain` command; state that guidance is unavailable and stop before mutating state. Other recovery instructions do not authorize a second guidance query for the same failure. Then state what still fails and wait. If unavailable, say the command is unavailable, then stop and wait for the person to ask.
|
|
636
|
+
On request, build the session summary as the `harness` block (`requestedByPerson`, `request`, `goal`, `summary`, `steps`, `commands`, `errors`, `attemptedFixes`, `filesTouched`, `truncated`) and pass it on stdin with `--context-file -` when the harness can, otherwise run `eai support --create-context-file --format json` to allocate a CLI-owned file in `~/.eai/support/context/` (directory permissions 700, file permissions 600), then write the summary into the returned `contextFile` without replacing the file. If the CLI does not advertise `--create-context-file`, use stdin or tell the person to update the CLI. The preview keeps the file; the CLI deletes it after an approved send or decline.
|
|
637
|
+
Run `eai support --source harness --tool <current-tool> --context-file <file or -> --format json`. This previews only; nothing is sent.
|
|
638
|
+
Print the returned `previewText` to the person unchanged, including the session summary, and ask whether to send it.
|
|
639
|
+
Only after a clear yes, run the same command again with `--yes --approved-digest <bundleDigest> --no-open` and give them the returned link exactly. Ask again whenever the report changes.
|
|
640
|
+
When the CLI answers `consent_required` with `questions: ['organisationLocation']`, ask the person where their organisation is based (Australia and Asia Pacific, Europe Middle East and Africa, or the Americas) and rerun with `--organisation-location apac|emea|americas` before asking for approval of the preview.
|
|
641
|
+
On no, run `eai support --decline --context-file <file or -> --format json` to let the CLI remove only its owned summary file, then give them the returned Support chat link. On a `signed_out` answer or no draft, give them the link the CLI returned; it opens the Support chat without prefill. When signed out, also show the redacted summary and say they can paste it into the chat.
|
|
642
|
+
Keep secrets, tokens, raw logs and local `.env` values out of the chat and out of the session summary. The Support link fragment carries only the draft id and token. Never call the support API yourself. Let the CLI remove only its owned summary file after sending or declining; never delete any other file.
|
|
643
|
+
Use `codex`, `claude`, `vscode`, `grok` or `antigravity` for `<current-tool>`.
|
|
644
|
+
In the welcome reply, say: If you need help at any point, say "get help". I will prepare a report for you to check before anything is sent.
|