@m8t-stack/cli 0.2.26 → 0.2.28
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 +8 -8
- package/dist/cli.js +207 -123
- package/dist/cli.js.map +1 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -931,7 +931,7 @@ var init_foundry_agents = __esm({
|
|
|
931
931
|
"use strict";
|
|
932
932
|
init_http();
|
|
933
933
|
init_errors();
|
|
934
|
-
METADATA_SOURCE = "m8t
|
|
934
|
+
METADATA_SOURCE = "m8t";
|
|
935
935
|
FOUNDRY_SCOPE2 = "https://ai.azure.com/.default";
|
|
936
936
|
API = "v1";
|
|
937
937
|
}
|
|
@@ -1177,7 +1177,7 @@ async function enableHostedBrain(args) {
|
|
|
1177
1177
|
// survive the relink version; the managed fields are re-asserted over the
|
|
1178
1178
|
// spread, and createCoderVersion applies the `brain` arg last.
|
|
1179
1179
|
...current.metadata,
|
|
1180
|
-
source: "m8t
|
|
1180
|
+
source: "m8t",
|
|
1181
1181
|
kind: "hosted",
|
|
1182
1182
|
persona: current.metadata?.persona ?? "coding-agent",
|
|
1183
1183
|
personaVersion: current.metadata?.personaVersion ?? null
|
|
@@ -1247,7 +1247,7 @@ var init_enable_hosted_brain = __esm({
|
|
|
1247
1247
|
import { Builtins, Cli } from "clipanion";
|
|
1248
1248
|
|
|
1249
1249
|
// src/lib/package-version.ts
|
|
1250
|
-
var CLI_VERSION = "0.2.
|
|
1250
|
+
var CLI_VERSION = "0.2.28";
|
|
1251
1251
|
|
|
1252
1252
|
// src/lib/render-error.ts
|
|
1253
1253
|
init_errors();
|
|
@@ -1412,7 +1412,7 @@ var BACKEND_RULES = [
|
|
|
1412
1412
|
{
|
|
1413
1413
|
code: "UPSTREAM_FAILED",
|
|
1414
1414
|
reason: "kv_secret_malformed",
|
|
1415
|
-
hint: () => "the Key Vault secret for this binding is in an unexpected shape. Manual cleanup may be required \u2014 contact your m8t
|
|
1415
|
+
hint: () => "the Key Vault secret for this binding is in an unexpected shape. Manual cleanup may be required \u2014 contact your m8t admin."
|
|
1416
1416
|
},
|
|
1417
1417
|
// NOTE: cascade_partial_failure is handled INLINE in the bind remove +
|
|
1418
1418
|
// bind cleanup command files (the rendering needs the structured
|
|
@@ -1477,15 +1477,15 @@ var LOCAL_RULES = {
|
|
|
1477
1477
|
// Task 15+16
|
|
1478
1478
|
KV_URI_NOT_FOUND: "Pass `--kv-uri` or set `AZURE_KEYVAULT_URI` / `KEYVAULT_URI`.",
|
|
1479
1479
|
// Task 13 — brain-link
|
|
1480
|
-
LINK_NO_INSTALLATION_ID: "Internal error \u2014 the CLI command must poll for the installation id before calling linkBrain. Report at https://github.com/m8t
|
|
1480
|
+
LINK_NO_INSTALLATION_ID: "Internal error \u2014 the CLI command must poll for the installation id before calling linkBrain. Report at https://github.com/m8t/m8t/issues.",
|
|
1481
1481
|
// Task 16 — brain link command
|
|
1482
|
-
M8T_REPO_ROOT_MISSING: "Re-run `m8t install` from a fresh m8t
|
|
1482
|
+
M8T_REPO_ROOT_MISSING: "Re-run `m8t install` from a fresh m8t checkout \u2014 the post-install hook writes ~/.m8t/repo-root.",
|
|
1483
1483
|
// Task 14 — persona-render
|
|
1484
|
-
PERSONA_PATH_NOT_ABSOLUTE: "The persona path in ~/.m8t
|
|
1484
|
+
PERSONA_PATH_NOT_ABSOLUTE: "The persona path in ~/.m8t/foundry/<worker>.yaml must be absolute. Re-deploy the worker via the architect.",
|
|
1485
1485
|
// Task 9 — persona-render
|
|
1486
|
-
PERSONA_PLACEHOLDER_UNSATISFIED: "Re-deploy the worker via the architect to repopulate fillableFieldValues, OR edit ~/.m8t
|
|
1486
|
+
PERSONA_PLACEHOLDER_UNSATISFIED: "Re-deploy the worker via the architect to repopulate fillableFieldValues, OR edit ~/.m8t/foundry/<worker>.yaml manually.",
|
|
1487
1487
|
// Task 9 — persona-render
|
|
1488
|
-
PERSONA_READ_FAILED: "Verify the persona path in ~/.m8t
|
|
1488
|
+
PERSONA_READ_FAILED: "Verify the persona path in ~/.m8t/foundry/<worker>.yaml; the architect should have populated it at deploy time.",
|
|
1489
1489
|
// ── pre-existing entries ──────────────────────────────────────────────────
|
|
1490
1490
|
AUTH_NOT_SIGNED_IN: "you are not signed in to Azure \u2014 run 'az login' first.",
|
|
1491
1491
|
AUTH_EXPIRED: "your Azure login expired \u2014 run 'az login' to re-authenticate.",
|
|
@@ -11747,7 +11747,7 @@ import * as path2 from "path";
|
|
|
11747
11747
|
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
11748
11748
|
function configDir() {
|
|
11749
11749
|
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
11750
|
-
return path2.join(home, ".m8t
|
|
11750
|
+
return path2.join(home, ".m8t");
|
|
11751
11751
|
}
|
|
11752
11752
|
function getConfigPath() {
|
|
11753
11753
|
return path2.join(configDir(), "cli-config.yaml");
|
|
@@ -11810,7 +11810,7 @@ async function discoverGateway(opts) {
|
|
|
11810
11810
|
const candidates = [];
|
|
11811
11811
|
try {
|
|
11812
11812
|
for await (const app of client.containerApps.listBySubscription()) {
|
|
11813
|
-
if (app.tags?.
|
|
11813
|
+
if (app.tags?.m8t !== "gateway") continue;
|
|
11814
11814
|
const fqdn2 = app.configuration?.ingress?.fqdn;
|
|
11815
11815
|
const envs = app.template?.containers?.[0]?.env ?? [];
|
|
11816
11816
|
const envMap = /* @__PURE__ */ new Map();
|
|
@@ -11839,7 +11839,7 @@ async function discoverGateway(opts) {
|
|
|
11839
11839
|
if (candidates.length === 0) {
|
|
11840
11840
|
throw new LocalCliError({
|
|
11841
11841
|
code: "GATEWAY_DISCOVERY_ZERO",
|
|
11842
|
-
message: `No m8t
|
|
11842
|
+
message: `No m8t deployment found in subscription ${subscriptionId}.`,
|
|
11843
11843
|
hint: "If the deployment is in another subscription, run 'az account set --subscription <name>'."
|
|
11844
11844
|
});
|
|
11845
11845
|
}
|
|
@@ -11850,8 +11850,8 @@ async function discoverGateway(opts) {
|
|
|
11850
11850
|
if (pool.length === 0) {
|
|
11851
11851
|
throw new LocalCliError({
|
|
11852
11852
|
code: "GATEWAY_DISCOVERY_RG_NOT_FOUND",
|
|
11853
|
-
message: `No m8t
|
|
11854
|
-
hint: `m8t
|
|
11853
|
+
message: `No m8t gateway found in resource group '${opts.resourceGroup}' (subscription ${subscriptionId}).`,
|
|
11854
|
+
hint: `m8t gateways in this subscription: ${candidates.map((c) => c.resourceGroup).join(", ")}.`
|
|
11855
11855
|
});
|
|
11856
11856
|
}
|
|
11857
11857
|
}
|
|
@@ -11860,7 +11860,7 @@ async function discoverGateway(opts) {
|
|
|
11860
11860
|
chosen = pool[0];
|
|
11861
11861
|
} else if (opts.interactive) {
|
|
11862
11862
|
const resourceId = await select({
|
|
11863
|
-
message: `Multiple m8t
|
|
11863
|
+
message: `Multiple m8t deployments found in subscription ${subscriptionId}. Choose one:`,
|
|
11864
11864
|
choices: pool.map((c) => ({
|
|
11865
11865
|
name: `${c.name} (rg=${c.resourceGroup}, ${c.location})`,
|
|
11866
11866
|
value: c.resourceId
|
|
@@ -11877,7 +11877,7 @@ async function discoverGateway(opts) {
|
|
|
11877
11877
|
} else {
|
|
11878
11878
|
throw new LocalCliError({
|
|
11879
11879
|
code: "GATEWAY_DISCOVERY_MULTIPLE",
|
|
11880
|
-
message: `Multiple m8t
|
|
11880
|
+
message: `Multiple m8t gateways found in subscription ${subscriptionId}: ${pool.map((c) => `${c.name} (rg=${c.resourceGroup}, ${c.location})`).join("; ")}.`,
|
|
11881
11881
|
hint: `Re-run with --resource-group <rg> to pick one (e.g. --resource-group ${pool[0].resourceGroup}).`
|
|
11882
11882
|
});
|
|
11883
11883
|
}
|
|
@@ -11965,7 +11965,7 @@ var BindAddCommand = class extends M8tCommand {
|
|
|
11965
11965
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
11966
11966
|
});
|
|
11967
11967
|
resourceGroup = Option.String("--resource-group", {
|
|
11968
|
-
description: "m8t
|
|
11968
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
11969
11969
|
});
|
|
11970
11970
|
async executeCommand() {
|
|
11971
11971
|
if (!this.worker) {
|
|
@@ -12048,7 +12048,7 @@ var BindCleanupCommand = class extends M8tCommand {
|
|
|
12048
12048
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12049
12049
|
});
|
|
12050
12050
|
resourceGroup = Option2.String("--resource-group", {
|
|
12051
|
-
description: "m8t
|
|
12051
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12052
12052
|
});
|
|
12053
12053
|
async executeCommand() {
|
|
12054
12054
|
if (this.bindingId && this.allOrphaned) {
|
|
@@ -12189,7 +12189,7 @@ var BindListCommand = class extends M8tCommand {
|
|
|
12189
12189
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12190
12190
|
});
|
|
12191
12191
|
resourceGroup = Option3.String("--resource-group", {
|
|
12192
|
-
description: "m8t
|
|
12192
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12193
12193
|
});
|
|
12194
12194
|
async executeCommand() {
|
|
12195
12195
|
const mode = resolveOutputMode(
|
|
@@ -12269,7 +12269,7 @@ var BindRemoveCommand = class extends M8tCommand {
|
|
|
12269
12269
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12270
12270
|
});
|
|
12271
12271
|
resourceGroup = Option4.String("--resource-group", {
|
|
12272
|
-
description: "m8t
|
|
12272
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12273
12273
|
});
|
|
12274
12274
|
async executeCommand() {
|
|
12275
12275
|
const mode = resolveOutputMode(
|
|
@@ -12348,7 +12348,7 @@ var BindShowCommand = class extends M8tCommand {
|
|
|
12348
12348
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12349
12349
|
});
|
|
12350
12350
|
resourceGroup = Option5.String("--resource-group", {
|
|
12351
|
-
description: "m8t
|
|
12351
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12352
12352
|
});
|
|
12353
12353
|
async executeCommand() {
|
|
12354
12354
|
const mode = resolveOutputMode(
|
|
@@ -12422,7 +12422,7 @@ var FOUNDRY_CONFIG_KEYS = ["tenantId", "clientId", "projectEndpoint"];
|
|
|
12422
12422
|
var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
12423
12423
|
function configDir2() {
|
|
12424
12424
|
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
12425
|
-
return path3.join(home, ".m8t
|
|
12425
|
+
return path3.join(home, ".m8t");
|
|
12426
12426
|
}
|
|
12427
12427
|
function getFoundryConfigPath() {
|
|
12428
12428
|
return path3.join(configDir2(), "config.yaml");
|
|
@@ -12539,7 +12539,7 @@ init_errors();
|
|
|
12539
12539
|
var ConfigSetCommand = class extends M8tCommand {
|
|
12540
12540
|
static paths = [["config", "set"]];
|
|
12541
12541
|
static usage = Command8.Usage({
|
|
12542
|
-
description: "Set a value in ~/.m8t
|
|
12542
|
+
description: "Set a value in ~/.m8t/config.yaml (tenantId | clientId | projectEndpoint)."
|
|
12543
12543
|
});
|
|
12544
12544
|
key = Option7.String();
|
|
12545
12545
|
value = Option7.String();
|
|
@@ -12574,7 +12574,7 @@ import { Command as Command9, Option as Option8 } from "clipanion";
|
|
|
12574
12574
|
var ConfigShowCommand = class extends M8tCommand {
|
|
12575
12575
|
static paths = [["config", "show"]];
|
|
12576
12576
|
static usage = Command9.Usage({
|
|
12577
|
-
description: "Show ~/.m8t
|
|
12577
|
+
description: "Show ~/.m8t/config.yaml (tenant/client/project) + the cached gateway.",
|
|
12578
12578
|
details: "Displays the Foundry config (config.yaml) and the gateway discovery cache (cli-config.yaml)."
|
|
12579
12579
|
});
|
|
12580
12580
|
output = Option8.String("--output");
|
|
@@ -12648,7 +12648,7 @@ var TeamAddCommand = class extends M8tCommand {
|
|
|
12648
12648
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12649
12649
|
});
|
|
12650
12650
|
resourceGroup = Option9.String("--resource-group", {
|
|
12651
|
-
description: "m8t
|
|
12651
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12652
12652
|
});
|
|
12653
12653
|
async executeCommand() {
|
|
12654
12654
|
const identities = {};
|
|
@@ -12741,7 +12741,7 @@ var TeamAddIdentityCommand = class extends M8tCommand {
|
|
|
12741
12741
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12742
12742
|
});
|
|
12743
12743
|
resourceGroup = Option10.String("--resource-group", {
|
|
12744
|
-
description: "m8t
|
|
12744
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12745
12745
|
});
|
|
12746
12746
|
async executeCommand() {
|
|
12747
12747
|
const identities = {};
|
|
@@ -12801,7 +12801,7 @@ var TeamListCommand = class extends M8tCommand {
|
|
|
12801
12801
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12802
12802
|
});
|
|
12803
12803
|
resourceGroup = Option11.String("--resource-group", {
|
|
12804
|
-
description: "m8t
|
|
12804
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12805
12805
|
});
|
|
12806
12806
|
async executeCommand() {
|
|
12807
12807
|
const mode = resolveOutputMode(
|
|
@@ -12870,7 +12870,7 @@ var TeamRemoveCommand = class extends M8tCommand {
|
|
|
12870
12870
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12871
12871
|
});
|
|
12872
12872
|
resourceGroup = Option12.String("--resource-group", {
|
|
12873
|
-
description: "m8t
|
|
12873
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12874
12874
|
});
|
|
12875
12875
|
async executeCommand() {
|
|
12876
12876
|
const mode = resolveOutputMode(
|
|
@@ -12934,7 +12934,7 @@ var TeamRemoveIdentityCommand = class extends M8tCommand {
|
|
|
12934
12934
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12935
12935
|
});
|
|
12936
12936
|
resourceGroup = Option13.String("--resource-group", {
|
|
12937
|
-
description: "m8t
|
|
12937
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12938
12938
|
});
|
|
12939
12939
|
async executeCommand() {
|
|
12940
12940
|
const channels = [];
|
|
@@ -12997,7 +12997,7 @@ var TeamShowCommand = class extends M8tCommand {
|
|
|
12997
12997
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12998
12998
|
});
|
|
12999
12999
|
resourceGroup = Option14.String("--resource-group", {
|
|
13000
|
-
description: "m8t
|
|
13000
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
13001
13001
|
});
|
|
13002
13002
|
async executeCommand() {
|
|
13003
13003
|
const mode = resolveOutputMode(
|
|
@@ -13492,8 +13492,8 @@ var BrainAppCreateCommand = class extends M8tCommand {
|
|
|
13492
13492
|
});
|
|
13493
13493
|
}
|
|
13494
13494
|
const org = this.org;
|
|
13495
|
-
const pemOut = typeof this.pemOut === "string" ? this.pemOut : path4.join(os.homedir(), ".m8t
|
|
13496
|
-
const credsOut = typeof this.credsOut === "string" ? this.credsOut : path4.join(os.homedir(), ".m8t
|
|
13495
|
+
const pemOut = typeof this.pemOut === "string" ? this.pemOut : path4.join(os.homedir(), ".m8t", "github-app.pem");
|
|
13496
|
+
const credsOut = typeof this.credsOut === "string" ? this.credsOut : path4.join(os.homedir(), ".m8t", "github-app.json");
|
|
13497
13497
|
const port = Number(this.port);
|
|
13498
13498
|
const onProgress = (m) => this.context.stderr.write(` ${colors.dim(m)}
|
|
13499
13499
|
`);
|
|
@@ -13591,7 +13591,7 @@ function discoverKvUri(env, override) {
|
|
|
13591
13591
|
});
|
|
13592
13592
|
}
|
|
13593
13593
|
function tryResolveRepoRoot() {
|
|
13594
|
-
const marker = path5.join(os2.homedir(), ".m8t
|
|
13594
|
+
const marker = path5.join(os2.homedir(), ".m8t", "repo-root");
|
|
13595
13595
|
if (!fs5.existsSync(marker)) return null;
|
|
13596
13596
|
const root = fs5.readFileSync(marker, "utf8").trim();
|
|
13597
13597
|
return root.length > 0 ? root : null;
|
|
@@ -13601,7 +13601,7 @@ function resolveRepoRoot() {
|
|
|
13601
13601
|
if (root === null) {
|
|
13602
13602
|
throw new LocalCliError({
|
|
13603
13603
|
code: "M8T_REPO_ROOT_MISSING",
|
|
13604
|
-
message: "~/.m8t
|
|
13604
|
+
message: "~/.m8t/repo-root marker missing \u2014 m8t install never completed."
|
|
13605
13605
|
});
|
|
13606
13606
|
}
|
|
13607
13607
|
return root;
|
|
@@ -13756,7 +13756,7 @@ import * as path6 from "path";
|
|
|
13756
13756
|
import * as os3 from "os";
|
|
13757
13757
|
import { parse as parseYaml3, stringify as stringifyYaml3 } from "yaml";
|
|
13758
13758
|
function agentYamlPath(agentName, home = os3.homedir()) {
|
|
13759
|
-
return path6.join(home, ".m8t
|
|
13759
|
+
return path6.join(home, ".m8t", "foundry", `${agentName}.yaml`);
|
|
13760
13760
|
}
|
|
13761
13761
|
function readAgentYaml(agentName, home) {
|
|
13762
13762
|
const file = agentYamlPath(agentName, home);
|
|
@@ -13837,7 +13837,7 @@ function renderPersonaBody(personaPath, fillableFieldValues, instanceName) {
|
|
|
13837
13837
|
throw new LocalCliError({
|
|
13838
13838
|
code: "PERSONA_PLACEHOLDER_UNSATISFIED",
|
|
13839
13839
|
message: `Persona '${personaPath}' has un-substituted placeholders: ${names.join(", ")}`,
|
|
13840
|
-
hint: `Add these to fillableFieldValues in ~/.m8t
|
|
13840
|
+
hint: `Add these to fillableFieldValues in ~/.m8t/foundry/<agent>.yaml, or re-deploy the agent via the architect to repopulate.`
|
|
13841
13841
|
});
|
|
13842
13842
|
}
|
|
13843
13843
|
const out = rendered.replace(/\s+$/, "");
|
|
@@ -14685,7 +14685,7 @@ var BrainCreateCommand = class extends M8tCommand {
|
|
|
14685
14685
|
static paths = [["brain", "create"]];
|
|
14686
14686
|
static usage = Command18.Usage({
|
|
14687
14687
|
description: "Create a new brain repo from brain-template/ (optionally seeded) and link it to <worker>.",
|
|
14688
|
-
details: "Copies ~/.m8t
|
|
14688
|
+
details: "Copies ~/.m8t/repo-root/brain-template/ to a tmp dir, optionally overlays brain-seeds/<name>/ (via --seed), stages it as a git repo, runs gh repo create --source --push, then the link cascade. Default --repo-name: <worker>-brain. Default visibility: private.",
|
|
14689
14689
|
examples: [
|
|
14690
14690
|
["Create + link with defaults", "$0 brain create cmo --owner orkeren21"],
|
|
14691
14691
|
["Custom name + public", "$0 brain create cmo --owner orkeren21 --repo-name cmo-second-brain --public"],
|
|
@@ -15110,7 +15110,7 @@ async function listM8tAgents(args) {
|
|
|
15110
15110
|
if (!raw.name && !raw.id) continue;
|
|
15111
15111
|
const name = String(raw.name ?? raw.id);
|
|
15112
15112
|
const md = raw.metadata ?? raw.versions?.latest?.metadata ?? {};
|
|
15113
|
-
if (md.source === "m8t
|
|
15113
|
+
if (md.source === "m8t") {
|
|
15114
15114
|
result.push({ name, metadata: md });
|
|
15115
15115
|
}
|
|
15116
15116
|
}
|
|
@@ -15270,12 +15270,12 @@ async function unlinkBrain(args) {
|
|
|
15270
15270
|
if (yaml?.personaPath) {
|
|
15271
15271
|
let personaPath = yaml.personaPath;
|
|
15272
15272
|
if (!personaPath.startsWith("/")) {
|
|
15273
|
-
const marker = path11.join(args.home ?? os5.homedir(), ".m8t
|
|
15273
|
+
const marker = path11.join(args.home ?? os5.homedir(), ".m8t", "repo-root");
|
|
15274
15274
|
if (!fs12.existsSync(marker)) {
|
|
15275
15275
|
throw new LocalCliError({
|
|
15276
15276
|
code: "PERSONA_PATH_NOT_ABSOLUTE",
|
|
15277
15277
|
message: `personaPath '${personaPath}' is relative and the repo-root marker is missing.`,
|
|
15278
|
-
hint: "Re-run 'm8t install' from a fresh m8t
|
|
15278
|
+
hint: "Re-run 'm8t install' from a fresh m8t checkout (writes ~/.m8t/repo-root) \u2014 or edit the personaPath to absolute."
|
|
15279
15279
|
});
|
|
15280
15280
|
}
|
|
15281
15281
|
personaPath = path11.join(fs12.readFileSync(marker, "utf8").trim(), personaPath);
|
|
@@ -15629,7 +15629,7 @@ var AgentDeployAdvisorCommand = class extends M8tCommand {
|
|
|
15629
15629
|
description: "Azure subscription ID. Defaults to the current az account."
|
|
15630
15630
|
});
|
|
15631
15631
|
repoRootFlag = Option22.String("--repo-root", {
|
|
15632
|
-
description: "Path to the m8t
|
|
15632
|
+
description: "Path to the m8t repo checkout. Defaults to the ~/.m8t/repo-root marker."
|
|
15633
15633
|
});
|
|
15634
15634
|
output = Option22.String("--output", {
|
|
15635
15635
|
description: "Output format: pretty (default) or json."
|
|
@@ -15641,7 +15641,7 @@ var AgentDeployAdvisorCommand = class extends M8tCommand {
|
|
|
15641
15641
|
throw new LocalCliError({
|
|
15642
15642
|
code: "USAGE",
|
|
15643
15643
|
message: "--persona is required (e.g. --persona startup-advisor).",
|
|
15644
|
-
hint: "Pass the persona directory name under personas/ in your m8t
|
|
15644
|
+
hint: "Pass the persona directory name under personas/ in your m8t checkout."
|
|
15645
15645
|
});
|
|
15646
15646
|
}
|
|
15647
15647
|
if (!agentName) {
|
|
@@ -16170,7 +16170,7 @@ var AgentRemoveCommand = class extends M8tCommand {
|
|
|
16170
16170
|
subscription = Option23.String("--subscription");
|
|
16171
16171
|
kvUri = Option23.String("--kv-uri");
|
|
16172
16172
|
resourceGroup = Option23.String("--resource-group", {
|
|
16173
|
-
description: "m8t
|
|
16173
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
16174
16174
|
});
|
|
16175
16175
|
output = Option23.String("--output");
|
|
16176
16176
|
async executeCommand() {
|
|
@@ -16305,7 +16305,7 @@ function resolveBridgeUrl(opts) {
|
|
|
16305
16305
|
throw new LocalCliError({
|
|
16306
16306
|
code: "A2A_NO_GATEWAY_URL",
|
|
16307
16307
|
message: "Could not resolve the gateway URL for the A2A bridge.",
|
|
16308
|
-
hint: "Pass --gateway-url https://<gateway-fqdn>, set M8T_GATEWAY_URL, or add a gatewayUrl key to ~/.m8t
|
|
16308
|
+
hint: "Pass --gateway-url https://<gateway-fqdn>, set M8T_GATEWAY_URL, or add a gatewayUrl key to ~/.m8t/config.yaml."
|
|
16309
16309
|
});
|
|
16310
16310
|
}
|
|
16311
16311
|
return `${base}${A2A_PATH}`;
|
|
@@ -16317,7 +16317,7 @@ function clean(v) {
|
|
|
16317
16317
|
return t.length ? t : void 0;
|
|
16318
16318
|
}
|
|
16319
16319
|
function readConfigGatewayUrl(home) {
|
|
16320
|
-
const cfg = path13.join(home ?? os6.homedir(), ".m8t
|
|
16320
|
+
const cfg = path13.join(home ?? os6.homedir(), ".m8t", "config.yaml");
|
|
16321
16321
|
if (!fs16.existsSync(cfg)) return void 0;
|
|
16322
16322
|
try {
|
|
16323
16323
|
const o = parseYaml8(fs16.readFileSync(cfg, "utf8"));
|
|
@@ -16465,6 +16465,67 @@ function readVersionFrontmatter(file) {
|
|
|
16465
16465
|
function sha256File(filePath) {
|
|
16466
16466
|
return createHash2("sha256").update(fs17.readFileSync(filePath)).digest("hex");
|
|
16467
16467
|
}
|
|
16468
|
+
var SIDECAR_FILENAME = "m8t-architect.m8t-skill.json";
|
|
16469
|
+
var LEGACY_SIDECAR_FILENAME = ".m8t-skill.json";
|
|
16470
|
+
function vsCodeUserDataDir() {
|
|
16471
|
+
if (process.platform === "darwin") {
|
|
16472
|
+
return path15.join(os7.homedir(), "Library", "Application Support", "Code", "User");
|
|
16473
|
+
}
|
|
16474
|
+
if (process.platform === "win32") {
|
|
16475
|
+
const appData = process.env.APPDATA ?? path15.join(os7.homedir(), "AppData", "Roaming");
|
|
16476
|
+
return path15.join(appData, "Code", "User");
|
|
16477
|
+
}
|
|
16478
|
+
return null;
|
|
16479
|
+
}
|
|
16480
|
+
function vsCodePromptsDir() {
|
|
16481
|
+
const userData = vsCodeUserDataDir();
|
|
16482
|
+
if (!userData) return null;
|
|
16483
|
+
const prompts = path15.join(userData, "prompts");
|
|
16484
|
+
if (fs17.existsSync(prompts)) return prompts;
|
|
16485
|
+
const promptFiles = path15.join(userData, "prompt-files");
|
|
16486
|
+
if (fs17.existsSync(promptFiles)) return promptFiles;
|
|
16487
|
+
return prompts;
|
|
16488
|
+
}
|
|
16489
|
+
var COPILOT_CLI_SKILLS_ROOTS = [
|
|
16490
|
+
[".copilot", "skills"],
|
|
16491
|
+
[".config", "github-copilot", "skills"],
|
|
16492
|
+
[".github", "copilot", "skills"]
|
|
16493
|
+
];
|
|
16494
|
+
function sidecarLocations() {
|
|
16495
|
+
const home = os7.homedir();
|
|
16496
|
+
const locations = [
|
|
16497
|
+
{ host: "Claude Code", dir: path15.join(home, ".claude", "skills", "m8t-architect") }
|
|
16498
|
+
];
|
|
16499
|
+
const vsCodeDir = vsCodePromptsDir();
|
|
16500
|
+
if (vsCodeDir) {
|
|
16501
|
+
locations.push({ host: "VS Code Copilot Chat", dir: vsCodeDir });
|
|
16502
|
+
}
|
|
16503
|
+
for (const segments of COPILOT_CLI_SKILLS_ROOTS) {
|
|
16504
|
+
locations.push({
|
|
16505
|
+
host: "GitHub Copilot CLI",
|
|
16506
|
+
dir: path15.join(home, ...segments, "m8t-architect")
|
|
16507
|
+
});
|
|
16508
|
+
}
|
|
16509
|
+
return locations;
|
|
16510
|
+
}
|
|
16511
|
+
function resolveSidecar() {
|
|
16512
|
+
let best = null;
|
|
16513
|
+
for (const loc of sidecarLocations()) {
|
|
16514
|
+
for (const filename of [SIDECAR_FILENAME, LEGACY_SIDECAR_FILENAME]) {
|
|
16515
|
+
const candidate2 = path15.join(loc.dir, filename);
|
|
16516
|
+
let mtimeMs;
|
|
16517
|
+
try {
|
|
16518
|
+
mtimeMs = fs17.statSync(candidate2).mtimeMs;
|
|
16519
|
+
} catch {
|
|
16520
|
+
continue;
|
|
16521
|
+
}
|
|
16522
|
+
if (!best || mtimeMs > best.mtimeMs) {
|
|
16523
|
+
best = { path: candidate2, host: loc.host, mtimeMs };
|
|
16524
|
+
}
|
|
16525
|
+
}
|
|
16526
|
+
}
|
|
16527
|
+
return best;
|
|
16528
|
+
}
|
|
16468
16529
|
function checkArchitectDrift() {
|
|
16469
16530
|
const sourcePath = path15.join(
|
|
16470
16531
|
resolveRepoRoot(),
|
|
@@ -16472,26 +16533,20 @@ function checkArchitectDrift() {
|
|
|
16472
16533
|
"m8t-architect",
|
|
16473
16534
|
"persona.md"
|
|
16474
16535
|
);
|
|
16475
|
-
const sidecarPath = path15.join(
|
|
16476
|
-
os7.homedir(),
|
|
16477
|
-
".claude",
|
|
16478
|
-
"skills",
|
|
16479
|
-
"m8t-architect",
|
|
16480
|
-
".m8t-skill.json"
|
|
16481
|
-
);
|
|
16482
16536
|
if (!fs17.existsSync(sourcePath)) {
|
|
16483
16537
|
return {
|
|
16484
16538
|
match: false,
|
|
16485
16539
|
sourceVersion: "",
|
|
16486
16540
|
installedVersion: "",
|
|
16487
|
-
advice: `Source persona not found at ${sourcePath}. Check ~/.m8t
|
|
16541
|
+
advice: `Source persona not found at ${sourcePath}. Check ~/.m8t/repo-root points at a valid checkout.`
|
|
16488
16542
|
};
|
|
16489
16543
|
}
|
|
16490
16544
|
const sourceVersion = readVersionFrontmatter(sourcePath);
|
|
16545
|
+
const resolved = resolveSidecar();
|
|
16491
16546
|
let sidecar = null;
|
|
16492
|
-
if (
|
|
16547
|
+
if (resolved) {
|
|
16493
16548
|
try {
|
|
16494
|
-
const raw = JSON.parse(fs17.readFileSync(
|
|
16549
|
+
const raw = JSON.parse(fs17.readFileSync(resolved.path, "utf8"));
|
|
16495
16550
|
if (raw !== null && typeof raw === "object") {
|
|
16496
16551
|
const r = raw;
|
|
16497
16552
|
sidecar = {
|
|
@@ -16504,11 +16559,12 @@ function checkArchitectDrift() {
|
|
|
16504
16559
|
}
|
|
16505
16560
|
}
|
|
16506
16561
|
if (!sidecar || typeof sidecar.sourceSha256 !== "string") {
|
|
16562
|
+
const checked = sidecarLocations().map((l) => `${l.host} (${l.dir})`).join("; ");
|
|
16507
16563
|
return {
|
|
16508
16564
|
match: false,
|
|
16509
16565
|
sourceVersion,
|
|
16510
16566
|
installedVersion: "",
|
|
16511
|
-
advice:
|
|
16567
|
+
advice: `Architect skill not installed (or installed before sidecar support). Checked: ${checked}. Re-run the install guide for your host from guides/install/m8t.md to render it.`
|
|
16512
16568
|
};
|
|
16513
16569
|
}
|
|
16514
16570
|
const installedVersion = typeof sidecar.version === "string" ? sidecar.version : "";
|
|
@@ -16521,7 +16577,7 @@ function checkArchitectDrift() {
|
|
|
16521
16577
|
match: false,
|
|
16522
16578
|
sourceVersion,
|
|
16523
16579
|
installedVersion,
|
|
16524
|
-
advice: sameVersion ? `m8t-architect content drift (v${sourceVersion} unchanged, body edited since render). Re-render via
|
|
16580
|
+
advice: sameVersion ? `m8t-architect content drift (v${sourceVersion} unchanged, body edited since render). Re-render via the install guide for your host (guides/install/m8t.md).` : `Installed m8t-architect${installedVersion ? ` (v${installedVersion})` : ""} is out of date with source${sourceVersion ? ` (v${sourceVersion})` : ""}. Re-render via the install guide for your host (guides/install/m8t.md).`
|
|
16525
16581
|
};
|
|
16526
16582
|
}
|
|
16527
16583
|
|
|
@@ -16530,7 +16586,7 @@ var ArchitectCheckCommand = class extends M8tCommand {
|
|
|
16530
16586
|
static paths = [["architect-check"]];
|
|
16531
16587
|
static usage = Command27.Usage({
|
|
16532
16588
|
description: "Verify the installed m8t-architect persona matches the repo source.",
|
|
16533
|
-
details: "Compares a render-time content hash (stored in
|
|
16589
|
+
details: "Compares a render-time content hash (stored in a per-persona `<name>.m8t-skill.json` sidecar, checked across every host m8t can render into \u2014 Claude Code, VS Code Copilot Chat, GitHub Copilot CLI) against a fresh hash of <repo-root>/personas/m8t-architect/persona.md. Exits 0 when they match, 1 with remediation advice when they don't. Used as a pre-flight gate by the architect persona body and as a verification step in guides/install/m8t.md.",
|
|
16534
16590
|
examples: [
|
|
16535
16591
|
["Run the architect drift check", "$0 architect-check"]
|
|
16536
16592
|
]
|
|
@@ -16924,7 +16980,7 @@ async function assertPlatformLive(opts) {
|
|
|
16924
16980
|
if (e.code === "GATEWAY_DISCOVERY_ZERO") {
|
|
16925
16981
|
throw new LocalCliError({
|
|
16926
16982
|
code: "PLATFORM_NOT_LIVE",
|
|
16927
|
-
message: "The m8t
|
|
16983
|
+
message: "The m8t platform isn't deployed yet \u2014 there is no gateway in this subscription.",
|
|
16928
16984
|
hint: "Deploy it first: run the local bootstrap (`m8t bootstrap launch \u2026`) and wait for `m8t bootstrap status` to reach done. If it's in another subscription, run `az account set --subscription <id>`.",
|
|
16929
16985
|
cause: e
|
|
16930
16986
|
});
|
|
@@ -17098,7 +17154,7 @@ var CoderDeployCommand = class extends M8tCommand {
|
|
|
17098
17154
|
cpu: preset.cpu,
|
|
17099
17155
|
memory: preset.memory,
|
|
17100
17156
|
env,
|
|
17101
|
-
metadata: { ...currentMetadata, source: "m8t
|
|
17157
|
+
metadata: { ...currentMetadata, source: "m8t", kind: "hosted", persona: personaName, personaVersion },
|
|
17102
17158
|
onProgress
|
|
17103
17159
|
});
|
|
17104
17160
|
if (typeof this.brain === "string") {
|
|
@@ -17211,7 +17267,7 @@ var CoderDeployCommand = class extends M8tCommand {
|
|
|
17211
17267
|
this.context.stdout.write(` project: ${project.projectName} (${project.region})
|
|
17212
17268
|
`);
|
|
17213
17269
|
this.context.stdout.write(
|
|
17214
|
-
` ${colors.hint("next:")} it now appears on MCP (/m8t
|
|
17270
|
+
` ${colors.hint("next:")} it now appears on MCP (/m8t:workers), the web app, and (when --gateway-url was passed) as an a2a target.
|
|
17215
17271
|
`
|
|
17216
17272
|
);
|
|
17217
17273
|
return 0;
|
|
@@ -17545,7 +17601,7 @@ var AzureExecDeployCommand = class extends M8tCommand {
|
|
|
17545
17601
|
cpu: preset.cpu,
|
|
17546
17602
|
memory: preset.memory,
|
|
17547
17603
|
env,
|
|
17548
|
-
metadata: { source: "m8t
|
|
17604
|
+
metadata: { source: "m8t", kind: "hosted", persona: personaName, personaVersion },
|
|
17549
17605
|
onProgress
|
|
17550
17606
|
});
|
|
17551
17607
|
onProgress?.(`granting Contributor at ${grantScope}\u2026`);
|
|
@@ -18005,7 +18061,7 @@ async function resolveReleaseContent(manifest, opts = {}) {
|
|
|
18005
18061
|
return opts.contentDir;
|
|
18006
18062
|
}
|
|
18007
18063
|
const commit = manifest.platform.commit;
|
|
18008
|
-
const cacheRoot = opts.cacheRoot ?? path19.join(os8.homedir(), ".m8t
|
|
18064
|
+
const cacheRoot = opts.cacheRoot ?? path19.join(os8.homedir(), ".m8t", "cache");
|
|
18009
18065
|
const dest = path19.join(cacheRoot, `release-${commit}`);
|
|
18010
18066
|
if (fs20.existsSync(path19.join(dest, "personas"))) return dest;
|
|
18011
18067
|
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
@@ -18069,7 +18125,7 @@ async function discoverStampStorage(opts) {
|
|
|
18069
18125
|
url: `${ARM3}/subscriptions/${opts.subscriptionId}/resourceGroups/${opts.resourceGroup}/providers/Microsoft.Storage/storageAccounts?api-version=${STORAGE_API}`
|
|
18070
18126
|
}) ?? {};
|
|
18071
18127
|
const accounts = (list.value ?? []).filter((a) => a.properties?.primaryEndpoints?.table);
|
|
18072
|
-
const chosen = accounts.find((a) => a.tags?.
|
|
18128
|
+
const chosen = accounts.find((a) => a.tags?.m8t === "storage") ?? accounts.find((a) => a.tags?.["m8t:role"] === "gateway" || a.tags?.["m8t:role"] === "ledger") ?? (accounts.length === 1 ? accounts[0] : void 0);
|
|
18073
18129
|
const tableEndpoint = chosen?.properties?.primaryEndpoints?.table?.replace(/\/$/, "");
|
|
18074
18130
|
if (!tableEndpoint || !chosen?.id || !chosen.name) {
|
|
18075
18131
|
throw new LocalCliError({
|
|
@@ -18224,7 +18280,7 @@ function buildBicepParams(p) {
|
|
|
18224
18280
|
return params;
|
|
18225
18281
|
}
|
|
18226
18282
|
async function resolveRepoRoot2(home = os9.homedir()) {
|
|
18227
|
-
const marker = path20.join(home, ".m8t
|
|
18283
|
+
const marker = path20.join(home, ".m8t", "repo-root");
|
|
18228
18284
|
try {
|
|
18229
18285
|
const root = (await fs21.readFile(marker, "utf8")).trim();
|
|
18230
18286
|
if (!root) throw new Error("empty");
|
|
@@ -18232,8 +18288,8 @@ async function resolveRepoRoot2(home = os9.homedir()) {
|
|
|
18232
18288
|
} catch {
|
|
18233
18289
|
throw new LocalCliError({
|
|
18234
18290
|
code: "DEPLOY_NO_REPO_ROOT",
|
|
18235
|
-
message: "~/.m8t
|
|
18236
|
-
hint: "Run 'm8t install' from an m8t
|
|
18291
|
+
message: "~/.m8t/repo-root marker is missing or empty.",
|
|
18292
|
+
hint: "Run 'm8t install' from an m8t checkout (it writes the marker), or run 'm8t deploy' from the repo."
|
|
18237
18293
|
});
|
|
18238
18294
|
}
|
|
18239
18295
|
}
|
|
@@ -18297,7 +18353,7 @@ async function ensureResourceGroup(name, location) {
|
|
|
18297
18353
|
await runAz(["group", "show", "--name", name, "--output", "json"]).catch(() => "") || "null"
|
|
18298
18354
|
);
|
|
18299
18355
|
if (existing) return;
|
|
18300
|
-
await runAz(["group", "create", "--name", name, "--location", location, "--tags", "m8t
|
|
18356
|
+
await runAz(["group", "create", "--name", name, "--location", location, "--tags", "m8t=deployment"]);
|
|
18301
18357
|
}
|
|
18302
18358
|
function resolveAcrPullIdentity(opts) {
|
|
18303
18359
|
return opts.explicit ?? "";
|
|
@@ -18769,13 +18825,13 @@ var PlatformStatusCommand = class extends M8tCommand {
|
|
|
18769
18825
|
});
|
|
18770
18826
|
subscription = Option29.String("--subscription");
|
|
18771
18827
|
resourceGroup = Option29.String("--resource-group", {
|
|
18772
|
-
description: "m8t
|
|
18828
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
18773
18829
|
});
|
|
18774
18830
|
to = Option29.String("--to", {
|
|
18775
18831
|
description: "Check status against a pinned platform version (defaults to the current release channel)."
|
|
18776
18832
|
});
|
|
18777
18833
|
contentDir = Option29.String("--content-dir", {
|
|
18778
|
-
description: "Path to a local m8t
|
|
18834
|
+
description: "Path to a local m8t repo checkout (skips the tarball tree-SHA fetch)."
|
|
18779
18835
|
});
|
|
18780
18836
|
manifestUrl = Option29.String("--manifest-url", {
|
|
18781
18837
|
description: "Fetch the release manifest from this URL instead of the release channel."
|
|
@@ -19503,7 +19559,7 @@ var PlatformUpdateCommand = class extends M8tCommand {
|
|
|
19503
19559
|
});
|
|
19504
19560
|
subscription = Option30.String("--subscription");
|
|
19505
19561
|
resourceGroup = Option30.String("--resource-group", {
|
|
19506
|
-
description: "m8t
|
|
19562
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
19507
19563
|
});
|
|
19508
19564
|
to = Option30.String("--to", {
|
|
19509
19565
|
description: "Pin the platform version to converge to (defaults to the current release channel)."
|
|
@@ -19519,7 +19575,7 @@ var PlatformUpdateCommand = class extends M8tCommand {
|
|
|
19519
19575
|
description: "Required with --force-infra \u2014 the existing deployment's resource-name suffix (avoids provisioning duplicates)."
|
|
19520
19576
|
});
|
|
19521
19577
|
contentDir = Option30.String("--content-dir", {
|
|
19522
|
-
description: "Path to a local m8t
|
|
19578
|
+
description: "Path to a local m8t repo checkout (skips the tarball fetch + tree-drift check)."
|
|
19523
19579
|
});
|
|
19524
19580
|
manifestUrl = Option30.String("--manifest-url", {
|
|
19525
19581
|
description: "Fetch the release manifest from this URL instead of the release channel."
|
|
@@ -20193,7 +20249,7 @@ var PlatformEnableCostReportCommand = class extends M8tCommand {
|
|
|
20193
20249
|
});
|
|
20194
20250
|
subscription = Option31.String("--subscription");
|
|
20195
20251
|
resourceGroup = Option31.String("--resource-group", {
|
|
20196
|
-
description: "m8t
|
|
20252
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
20197
20253
|
});
|
|
20198
20254
|
acsEndpoint = Option31.String("--acs-endpoint", { required: true, description: "ACS data-plane endpoint, e.g. https://acs-<name>.communication.azure.com/" });
|
|
20199
20255
|
acsSender = Option31.String("--acs-sender", { required: true, description: "Managed-domain sender address, e.g. DoNotReply@<guid>.azurecomm.net" });
|
|
@@ -20285,7 +20341,7 @@ var PlatformEnableAutoUpdateCommand = class extends M8tCommand {
|
|
|
20285
20341
|
});
|
|
20286
20342
|
subscription = Option32.String("--subscription");
|
|
20287
20343
|
resourceGroup = Option32.String("--resource-group", {
|
|
20288
|
-
description: "m8t
|
|
20344
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
20289
20345
|
});
|
|
20290
20346
|
suffix = Option32.String("--suffix", {
|
|
20291
20347
|
description: "The existing deployment's resource-name suffix. Required when it cannot be recovered from system/infra-params or the live gateway."
|
|
@@ -20429,7 +20485,7 @@ import { Command as Command36, Option as Option33 } from "clipanion";
|
|
|
20429
20485
|
|
|
20430
20486
|
// src/lib/app-reg.ts
|
|
20431
20487
|
init_errors();
|
|
20432
|
-
var APP_NAME = "m8t-
|
|
20488
|
+
var APP_NAME = "m8t-webapp";
|
|
20433
20489
|
var AZURE_CLI_FIRST_PARTY_APP_ID = "04b07795-8ddb-461a-bbee-02f9e1bf7b46";
|
|
20434
20490
|
var FOUNDRY_SP_APP_ID = "18a66f5f-dbdf-4c17-9dd7-1634712a9cbe";
|
|
20435
20491
|
var USER_IMPERSONATION_SCOPE_ID = "1a7925b5-f871-417a-9b8b-303f9f29fa10";
|
|
@@ -20469,10 +20525,10 @@ async function ensureExposeAnApi(appId, appObjectId) {
|
|
|
20469
20525
|
id: scopeId,
|
|
20470
20526
|
value: "user_impersonation",
|
|
20471
20527
|
type: "User",
|
|
20472
|
-
adminConsentDescription: "Allow the application to access m8t
|
|
20473
|
-
adminConsentDisplayName: "Access m8t
|
|
20474
|
-
userConsentDescription: "Allow the application to access m8t
|
|
20475
|
-
userConsentDisplayName: "Access m8t
|
|
20528
|
+
adminConsentDescription: "Allow the application to access m8t on behalf of the signed-in user.",
|
|
20529
|
+
adminConsentDisplayName: "Access m8t",
|
|
20530
|
+
userConsentDescription: "Allow the application to access m8t on your behalf.",
|
|
20531
|
+
userConsentDisplayName: "Access m8t",
|
|
20476
20532
|
isEnabled: true
|
|
20477
20533
|
}
|
|
20478
20534
|
];
|
|
@@ -20829,7 +20885,7 @@ var DeployCommand = class extends M8tCommand {
|
|
|
20829
20885
|
static paths = [["deploy"]];
|
|
20830
20886
|
static usage = Command36.Usage({
|
|
20831
20887
|
description: "Deploy (or update) the m8t gateway/webapp stack via Bicep.",
|
|
20832
|
-
details: "Ensures the Entra app reg (or pass --client-id to reuse an existing one \u2014 required if you can't create app regs), writes ~/.m8t
|
|
20888
|
+
details: "Ensures the Entra app reg (or pass --client-id to reuse an existing one \u2014 required if you can't create app regs), writes ~/.m8t/config.yaml, ensures the resource group, and runs deploy/main.bicep. The repo is located via ~/.m8t/repo-root."
|
|
20833
20889
|
});
|
|
20834
20890
|
subscription = Option33.String("--subscription");
|
|
20835
20891
|
resourceGroup = Option33.String("--resource-group", "rg-m8t-stack");
|
|
@@ -20878,7 +20934,7 @@ var DeployCommand = class extends M8tCommand {
|
|
|
20878
20934
|
throw new LocalCliError({
|
|
20879
20935
|
code: "DEPLOY_NO_FOUNDRY_ENDPOINT",
|
|
20880
20936
|
message: "No Foundry endpoint provided.",
|
|
20881
|
-
hint: "Pass --foundry-endpoint <url> or set projectEndpoint in ~/.m8t
|
|
20937
|
+
hint: "Pass --foundry-endpoint <url> or set projectEndpoint in ~/.m8t/config.yaml (m8t config set / m8t switch)."
|
|
20882
20938
|
});
|
|
20883
20939
|
}
|
|
20884
20940
|
if (this.whatIf) {
|
|
@@ -20887,7 +20943,7 @@ var DeployCommand = class extends M8tCommand {
|
|
|
20887
20943
|
throw new LocalCliError({
|
|
20888
20944
|
code: "DEPLOY_WHATIF_NO_CLIENT",
|
|
20889
20945
|
message: "--what-if needs a client id but none was provided or configured.",
|
|
20890
|
-
hint: "Pass --client-id <appId>, or run from a host with ~/.m8t
|
|
20946
|
+
hint: "Pass --client-id <appId>, or run from a host with ~/.m8t/config.yaml."
|
|
20891
20947
|
});
|
|
20892
20948
|
}
|
|
20893
20949
|
const foundryResourceId2 = await resolveFoundryResourceId(foundryEndpoint, this.foundryResourceId);
|
|
@@ -21508,7 +21564,7 @@ var WhoamiCommand = class extends M8tCommand {
|
|
|
21508
21564
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
21509
21565
|
});
|
|
21510
21566
|
resourceGroup = Option37.String("--resource-group", {
|
|
21511
|
-
description: "m8t
|
|
21567
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
21512
21568
|
});
|
|
21513
21569
|
async executeCommand() {
|
|
21514
21570
|
const mode = resolveOutputMode(
|
|
@@ -21696,7 +21752,7 @@ function checkFoundryConfig(cfg) {
|
|
|
21696
21752
|
return {
|
|
21697
21753
|
name: "config.yaml",
|
|
21698
21754
|
status: "FAIL",
|
|
21699
|
-
detail: "missing or invalid ~/.m8t
|
|
21755
|
+
detail: "missing or invalid ~/.m8t/config.yaml",
|
|
21700
21756
|
remediation: "m8t switch (or m8t config set tenantId|clientId|projectEndpoint <value>)"
|
|
21701
21757
|
};
|
|
21702
21758
|
}
|
|
@@ -21820,27 +21876,46 @@ function checkRepoRoot(probe) {
|
|
|
21820
21876
|
return {
|
|
21821
21877
|
name: "brain repo-root",
|
|
21822
21878
|
status: "FAIL",
|
|
21823
|
-
detail: "~/.m8t
|
|
21824
|
-
remediation: 're-run the m8t
|
|
21879
|
+
detail: "~/.m8t/repo-root marker missing \u2014 m8t install never completed",
|
|
21880
|
+
remediation: 're-run the m8t install (writes ~/.m8t/repo-root), or: printf %s "$(git -C <m8t-checkout> rev-parse --show-toplevel)" > ~/.m8t/repo-root'
|
|
21825
21881
|
};
|
|
21826
21882
|
}
|
|
21827
21883
|
if (!probe.isDir) {
|
|
21828
21884
|
return {
|
|
21829
21885
|
name: "brain repo-root",
|
|
21830
21886
|
status: "FAIL",
|
|
21831
|
-
detail: `~/.m8t
|
|
21832
|
-
remediation: 'the m8t
|
|
21887
|
+
detail: `~/.m8t/repo-root \u2192 ${probe.path} \u2014 that path does not exist or is not a directory`,
|
|
21888
|
+
remediation: 'the m8t checkout moved or was deleted; point the marker at the current checkout: printf %s "$(git -C <m8t-checkout> rev-parse --show-toplevel)" > ~/.m8t/repo-root'
|
|
21833
21889
|
};
|
|
21834
21890
|
}
|
|
21835
21891
|
if (!probe.isGitCheckout) {
|
|
21836
21892
|
return {
|
|
21837
21893
|
name: "brain repo-root",
|
|
21838
21894
|
status: "WARN",
|
|
21839
|
-
detail: `~/.m8t
|
|
21840
|
-
remediation: "point the marker at the m8t
|
|
21895
|
+
detail: `~/.m8t/repo-root \u2192 ${probe.path} exists but is not a git checkout (no .git) \u2014 brain-loader template + persona paths may be stale`,
|
|
21896
|
+
remediation: "point the marker at the m8t git checkout (it reads targets/foundry/brain-loader.md from there)"
|
|
21897
|
+
};
|
|
21898
|
+
}
|
|
21899
|
+
return { name: "brain repo-root", status: "PASS", detail: `~/.m8t/repo-root \u2192 ${probe.path}` };
|
|
21900
|
+
}
|
|
21901
|
+
function checkLegacyStateDir(probe) {
|
|
21902
|
+
if (!probe.legacyExists) {
|
|
21903
|
+
return { name: "state dir", status: "PASS", detail: "no legacy ~/.m8t-stack folder" };
|
|
21904
|
+
}
|
|
21905
|
+
if (!probe.currentExists) {
|
|
21906
|
+
return {
|
|
21907
|
+
name: "state dir",
|
|
21908
|
+
status: "WARN",
|
|
21909
|
+
detail: "found legacy ~/.m8t-stack but no ~/.m8t \u2014 the state folder was renamed to ~/.m8t",
|
|
21910
|
+
remediation: "mv ~/.m8t-stack ~/.m8t"
|
|
21841
21911
|
};
|
|
21842
21912
|
}
|
|
21843
|
-
return {
|
|
21913
|
+
return {
|
|
21914
|
+
name: "state dir",
|
|
21915
|
+
status: "WARN",
|
|
21916
|
+
detail: "legacy ~/.m8t-stack exists alongside ~/.m8t \u2014 only ~/.m8t is read",
|
|
21917
|
+
remediation: "review ~/.m8t-stack for anything you still need, then remove it"
|
|
21918
|
+
};
|
|
21844
21919
|
}
|
|
21845
21920
|
|
|
21846
21921
|
// src/commands/doctor.ts
|
|
@@ -21907,7 +21982,7 @@ async function resolveAccountLocation(accountId) {
|
|
|
21907
21982
|
}
|
|
21908
21983
|
}
|
|
21909
21984
|
function probeRepoRoot() {
|
|
21910
|
-
const marker = path28.join(os11.homedir(), ".m8t
|
|
21985
|
+
const marker = path28.join(os11.homedir(), ".m8t", "repo-root");
|
|
21911
21986
|
if (!fs26.existsSync(marker)) {
|
|
21912
21987
|
return { markerExists: false, path: null, isDir: false, isGitCheckout: false };
|
|
21913
21988
|
}
|
|
@@ -21927,6 +22002,12 @@ function probeRepoRoot() {
|
|
|
21927
22002
|
const isGitCheckout = isDir && fs26.existsSync(path28.join(repoPath, ".git"));
|
|
21928
22003
|
return { markerExists: true, path: repoPath, isDir, isGitCheckout };
|
|
21929
22004
|
}
|
|
22005
|
+
function probeLegacyStateDir() {
|
|
22006
|
+
return {
|
|
22007
|
+
legacyExists: fs26.existsSync(path28.join(os11.homedir(), ".m8t-stack")),
|
|
22008
|
+
currentExists: fs26.existsSync(path28.join(os11.homedir(), ".m8t"))
|
|
22009
|
+
};
|
|
22010
|
+
}
|
|
21930
22011
|
var DoctorCommand = class extends M8tCommand {
|
|
21931
22012
|
static paths = [["doctor"]];
|
|
21932
22013
|
static usage = Command42.Usage({
|
|
@@ -21935,7 +22016,7 @@ var DoctorCommand = class extends M8tCommand {
|
|
|
21935
22016
|
output = Option39.String("--output");
|
|
21936
22017
|
agent = Option39.String("--agent");
|
|
21937
22018
|
resourceGroup = Option39.String("--resource-group", {
|
|
21938
|
-
description: "m8t
|
|
22019
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
21939
22020
|
});
|
|
21940
22021
|
async executeCommand() {
|
|
21941
22022
|
const mode = resolveOutputMode(
|
|
@@ -21969,6 +22050,7 @@ var DoctorCommand = class extends M8tCommand {
|
|
|
21969
22050
|
emit(checkFoundryConfig(foundry));
|
|
21970
22051
|
emit(checkTenantAlignment(az, foundry));
|
|
21971
22052
|
emit(checkRepoRoot(probeRepoRoot()));
|
|
22053
|
+
emit(checkLegacyStateDir(probeLegacyStateDir()));
|
|
21972
22054
|
checking("gateway");
|
|
21973
22055
|
let gw = { ok: false, detail: "not probed" };
|
|
21974
22056
|
try {
|
|
@@ -22058,7 +22140,7 @@ import * as path29 from "path";
|
|
|
22058
22140
|
import { parse as parseYaml11, stringify as stringifyYaml4 } from "yaml";
|
|
22059
22141
|
function profilesDir() {
|
|
22060
22142
|
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
22061
|
-
return path29.join(home, ".m8t
|
|
22143
|
+
return path29.join(home, ".m8t", "profiles");
|
|
22062
22144
|
}
|
|
22063
22145
|
function getProfilePath(name) {
|
|
22064
22146
|
return path29.join(profilesDir(), `${path29.basename(name)}.yaml`);
|
|
@@ -22308,7 +22390,7 @@ var OpenCommand = class extends M8tCommand {
|
|
|
22308
22390
|
print = Option41.Boolean("--print", false);
|
|
22309
22391
|
output = Option41.String("--output");
|
|
22310
22392
|
resourceGroup = Option41.String("--resource-group", {
|
|
22311
|
-
description: "m8t
|
|
22393
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
22312
22394
|
});
|
|
22313
22395
|
async executeCommand() {
|
|
22314
22396
|
const mode = resolveOutputMode(
|
|
@@ -23117,7 +23199,7 @@ async function runPipeline(args) {
|
|
|
23117
23199
|
({ items, fetchError } = await fetchItems(sources.conversations, recoveredId));
|
|
23118
23200
|
if (g.source === "a2a" && !fetchError && items.length > 0 && sources.conversations.retrieveApp) {
|
|
23119
23201
|
const app = await sources.conversations.retrieveApp(recoveredId);
|
|
23120
|
-
if (app !== "m8t-
|
|
23202
|
+
if (app !== "m8t-a2a") {
|
|
23121
23203
|
didRecover = false;
|
|
23122
23204
|
items = [];
|
|
23123
23205
|
conversationId = void 0;
|
|
@@ -24452,13 +24534,13 @@ async function discoverLedgerResources(opts) {
|
|
|
24452
24534
|
url: `${ARM4}/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/providers/Microsoft.Storage/storageAccounts?api-version=${STORAGE_API2}`
|
|
24453
24535
|
});
|
|
24454
24536
|
const accounts = storage.filter((a) => a.properties?.primaryEndpoints?.table);
|
|
24455
|
-
const ledgerAcct = accounts.find((a) => (a.tags?.["m8t
|
|
24537
|
+
const ledgerAcct = accounts.find((a) => (a.tags?.["m8t:role"] ?? a.properties?.tags?.["m8t:role"]) === "ledger") ?? (accounts.length === 1 ? accounts[0] : void 0);
|
|
24456
24538
|
const ledgerTableEndpoint = ledgerAcct?.properties?.primaryEndpoints?.table?.replace(/\/$/, "");
|
|
24457
24539
|
if (!ledgerTableEndpoint) {
|
|
24458
24540
|
throw new LocalCliError({
|
|
24459
24541
|
code: "DREAM_LEDGER_STORAGE_NOT_FOUND",
|
|
24460
24542
|
message: `No AgentLedger storage account found in resource group ${resourceGroup}.`,
|
|
24461
|
-
hint: `Found: ${accounts.map((a) => a.name).join(", ") || "(none)"}. Tag the ledger account 'm8t
|
|
24543
|
+
hint: `Found: ${accounts.map((a) => a.name).join(", ") || "(none)"}. Tag the ledger account 'm8t:role=ledger'.`
|
|
24462
24544
|
});
|
|
24463
24545
|
}
|
|
24464
24546
|
const ws = await authedJsonPagedValues({
|
|
@@ -25338,7 +25420,7 @@ function buildPreflightBanner(who) {
|
|
|
25338
25420
|
"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557",
|
|
25339
25421
|
"\u2551 \u26D4 STOP \u2014 READ THIS BEFORE CONTINUING \u2551",
|
|
25340
25422
|
"\u2551 \u2551",
|
|
25341
|
-
"\u2551 Installing m8t
|
|
25423
|
+
"\u2551 Installing m8t creates real Azure resources in YOUR \u2551",
|
|
25342
25424
|
"\u2551 subscription and assigns roles. To do that, the account you just \u2551",
|
|
25343
25425
|
"\u2551 signed in with MUST be: \u2551",
|
|
25344
25426
|
"\u2551 \u2551",
|
|
@@ -25362,7 +25444,7 @@ function buildPreflightBanner(who) {
|
|
|
25362
25444
|
var BootstrapPreflightCommand = class extends M8tCommand {
|
|
25363
25445
|
static paths = [["bootstrap", "preflight"]];
|
|
25364
25446
|
static usage = Command48.Usage({
|
|
25365
|
-
description: "Loudly verify you can install m8t
|
|
25447
|
+
description: "Loudly verify you can install m8t (Owner/UAA + directory admin) and hard-stop if not.",
|
|
25366
25448
|
details: "Step 1 of `m8t bootstrap`. Prints an unmissable admin-credentials notice, then checks: Owner or User Access Administrator at subscription scope (hard requirement), directory-admin capability to register the app (or pass --client-id), and registers Microsoft.ContainerInstance. Exits non-zero with the exact failing check + remedy.",
|
|
25367
25449
|
examples: [
|
|
25368
25450
|
["Run the preflight", "$0 bootstrap preflight"],
|
|
@@ -25386,7 +25468,7 @@ var BootstrapPreflightCommand = class extends M8tCommand {
|
|
|
25386
25468
|
}
|
|
25387
25469
|
if (!clientId) {
|
|
25388
25470
|
const appReg = await checkAppRegCapability(oid);
|
|
25389
|
-
this.context.stdout.write(line(appReg.ok, "Directory admin \u2014 can register the m8t
|
|
25471
|
+
this.context.stdout.write(line(appReg.ok, "Directory admin \u2014 can register the m8t app", "first-run app registration"));
|
|
25390
25472
|
if (!appReg.ok) {
|
|
25391
25473
|
this.context.stderr.write(failBlock(
|
|
25392
25474
|
appReg.inconclusive ? "Couldn't verify your directory admin role (Microsoft Graph denied the read \u2014 common for guest accounts)." : "You don't hold a directory admin role (Application / Cloud Application / Global Administrator).",
|
|
@@ -25448,7 +25530,7 @@ async function ensureResourceGroup2(opts) {
|
|
|
25448
25530
|
"--subscription",
|
|
25449
25531
|
opts.subscriptionId,
|
|
25450
25532
|
"--tags",
|
|
25451
|
-
"m8t
|
|
25533
|
+
"m8t=deployment",
|
|
25452
25534
|
"--only-show-errors"
|
|
25453
25535
|
]);
|
|
25454
25536
|
}
|
|
@@ -25654,7 +25736,7 @@ import * as fs29 from "fs/promises";
|
|
|
25654
25736
|
import * as os13 from "os";
|
|
25655
25737
|
import * as path31 from "path";
|
|
25656
25738
|
function stateDir(home) {
|
|
25657
|
-
return path31.join(home, ".m8t
|
|
25739
|
+
return path31.join(home, ".m8t");
|
|
25658
25740
|
}
|
|
25659
25741
|
function statePath(home) {
|
|
25660
25742
|
return path31.join(stateDir(home), "bootstrap.json");
|
|
@@ -25678,19 +25760,19 @@ async function writeBootstrapState(state, home = os13.homedir()) {
|
|
|
25678
25760
|
// src/commands/bootstrap/launch.ts
|
|
25679
25761
|
var DEFAULT_RG = "rg-m8t-stack";
|
|
25680
25762
|
var DEFAULT_INSTALLER = "ghcr.io/m8t-labs/m8t-installer";
|
|
25681
|
-
var DEFAULT_INSTALLER_TAG = "v0.1.
|
|
25763
|
+
var DEFAULT_INSTALLER_TAG = "v0.1.33";
|
|
25682
25764
|
var ACI_NAME = "m8t-installer";
|
|
25683
25765
|
var MI_NAME = "m8t-installer-mi";
|
|
25684
25766
|
var BootstrapLaunchCommand = class extends M8tCommand {
|
|
25685
25767
|
static paths = [["bootstrap", "launch"]];
|
|
25686
25768
|
static usage = Command49.Usage({
|
|
25687
25769
|
description: "Create + authorize the installer managed identity, then kick the cloud installer.",
|
|
25688
|
-
details: "Step 2 of `m8t bootstrap` (run after `preflight`). Ensures the resource group, creates the m8t
|
|
25770
|
+
details: "Step 2 of `m8t bootstrap` (run after `preflight`). Ensures the resource group, creates the m8t app registration (or uses --client-id), creates a user-assigned managed identity granted Owner at subscription scope, and launches the published m8t-installer image as an ACI run-to-completion job under that identity. Writes ~/.m8t/bootstrap.json for `status`/`reap`/`finish`.",
|
|
25689
25771
|
examples: [
|
|
25690
25772
|
["Launch in eastus2", "$0 bootstrap launch --location eastus2"],
|
|
25691
25773
|
["BYO app registration", "$0 bootstrap launch --location eastus2 --client-id <appId>"],
|
|
25692
|
-
["Pin a specific installer tag", "$0 bootstrap launch --location eastus2 --installer-tag v0.1.
|
|
25693
|
-
["Override the full installer image ref", "$0 bootstrap launch --location eastus2 --installer-image ghcr.io/m8t-labs/m8t-installer:v0.1.
|
|
25774
|
+
["Pin a specific installer tag", "$0 bootstrap launch --location eastus2 --installer-tag v0.1.33"],
|
|
25775
|
+
["Override the full installer image ref", "$0 bootstrap launch --location eastus2 --installer-image ghcr.io/m8t-labs/m8t-installer:v0.1.33"]
|
|
25694
25776
|
]
|
|
25695
25777
|
});
|
|
25696
25778
|
location = Option46.String("--location");
|
|
@@ -25719,7 +25801,7 @@ var BootstrapLaunchCommand = class extends M8tCommand {
|
|
|
25719
25801
|
const subscriptionId = (typeof this.subscription === "string" ? this.subscription : void 0) ?? account.subscriptionId;
|
|
25720
25802
|
const out = (m) => this.context.stderr.write(` ${colors.dim(m)}
|
|
25721
25803
|
`);
|
|
25722
|
-
const credsPath = typeof this.githubAppCreds === "string" ? this.githubAppCreds : path32.join(os14.homedir(), ".m8t
|
|
25804
|
+
const credsPath = typeof this.githubAppCreds === "string" ? this.githubAppCreds : path32.join(os14.homedir(), ".m8t", "github-app.json");
|
|
25723
25805
|
let githubApp;
|
|
25724
25806
|
if (fs30.existsSync(credsPath)) {
|
|
25725
25807
|
let parsed;
|
|
@@ -25755,7 +25837,7 @@ var BootstrapLaunchCommand = class extends M8tCommand {
|
|
|
25755
25837
|
}
|
|
25756
25838
|
out("registering Microsoft.ContainerInstance\u2026");
|
|
25757
25839
|
await registerContainerInstance(subscriptionId);
|
|
25758
|
-
out("resolving the m8t
|
|
25840
|
+
out("resolving the m8t app registration\u2026");
|
|
25759
25841
|
const appReg = await ensureAppReg({ tenantId: account.tenantId, clientId: clientIdOpt });
|
|
25760
25842
|
out(`ensuring resource group ${resourceGroup}\u2026`);
|
|
25761
25843
|
await ensureResourceGroup2({ name: resourceGroup, location, subscriptionId });
|
|
@@ -25846,7 +25928,7 @@ var BootstrapStatusCommand = class extends M8tCommand {
|
|
|
25846
25928
|
if (!state) {
|
|
25847
25929
|
throw new LocalCliError({
|
|
25848
25930
|
code: "BOOTSTRAP_NO_STATE",
|
|
25849
|
-
message: "No bootstrap is in flight (no ~/.m8t
|
|
25931
|
+
message: "No bootstrap is in flight (no ~/.m8t/bootstrap.json).",
|
|
25850
25932
|
hint: "Run 'm8t bootstrap launch --location <region>' first."
|
|
25851
25933
|
});
|
|
25852
25934
|
}
|
|
@@ -26297,7 +26379,7 @@ function composeFounderIdentityNote(id) {
|
|
|
26297
26379
|
|
|
26298
26380
|
// src/lib/company-profile-seed.ts
|
|
26299
26381
|
function readGithubAppCreds(credsPath) {
|
|
26300
|
-
const p = credsPath ?? path33.join(os15.homedir(), ".m8t
|
|
26382
|
+
const p = credsPath ?? path33.join(os15.homedir(), ".m8t", "github-app.json");
|
|
26301
26383
|
try {
|
|
26302
26384
|
return JSON.parse(readFileSync20(p, "utf8"));
|
|
26303
26385
|
} catch {
|
|
@@ -26362,7 +26444,7 @@ async function applyProfileToBrain(args) {
|
|
|
26362
26444
|
});
|
|
26363
26445
|
}
|
|
26364
26446
|
function spawnDetachedSeedWatch() {
|
|
26365
|
-
const logPath = path33.join(os15.homedir(), ".m8t
|
|
26447
|
+
const logPath = path33.join(os15.homedir(), ".m8t", "seed-profile.log");
|
|
26366
26448
|
const fd = openSync(logPath, "a");
|
|
26367
26449
|
try {
|
|
26368
26450
|
const child = spawn6(process.execPath, [process.argv[1] ?? "", "bootstrap", "seed-profile", "--watch"], {
|
|
@@ -26441,7 +26523,7 @@ var BootstrapFinishCommand = class extends M8tCommand {
|
|
|
26441
26523
|
static paths = [["bootstrap", "finish"]];
|
|
26442
26524
|
static usage = Command52.Usage({
|
|
26443
26525
|
description: "Point your local tools at the now-live platform (repo-root marker, discovery cache, next steps).",
|
|
26444
|
-
details: "Final step of `m8t bootstrap` (after the install reaches done). Writes ~/.m8t
|
|
26526
|
+
details: "Final step of `m8t bootstrap` (after the install reaches done). Writes ~/.m8t/repo-root, points your local tools at the live gateway, and \u2014 if you completed the onboarding questionnaire \u2014 seeds your brain-backed advisor's brain with your company profile (best-effort; never blocks finish). Run `m8t bootstrap seed-profile` to seed manually later.",
|
|
26445
26527
|
examples: [["Finish local", "$0 bootstrap finish --repo-root /path/to/m8t"]]
|
|
26446
26528
|
});
|
|
26447
26529
|
repoRoot = Option49.String("--repo-root");
|
|
@@ -26461,7 +26543,7 @@ var BootstrapFinishCommand = class extends M8tCommand {
|
|
|
26461
26543
|
});
|
|
26462
26544
|
}
|
|
26463
26545
|
const repoRoot = (typeof this.repoRoot === "string" ? this.repoRoot : void 0) ?? process.cwd();
|
|
26464
|
-
const markerDir = path34.join(os16.homedir(), ".m8t
|
|
26546
|
+
const markerDir = path34.join(os16.homedir(), ".m8t");
|
|
26465
26547
|
await fs31.mkdir(markerDir, { recursive: true });
|
|
26466
26548
|
await fs31.writeFile(path34.join(markerDir, "repo-root"), `${repoRoot}
|
|
26467
26549
|
`, "utf8");
|
|
@@ -26520,8 +26602,10 @@ var BootstrapFinishCommand = class extends M8tCommand {
|
|
|
26520
26602
|
}
|
|
26521
26603
|
this.context.stdout.write(renderInstallSummary({ webappUrl, brainOrg }) + "\n");
|
|
26522
26604
|
this.context.stdout.write(
|
|
26523
|
-
`${colors.field("
|
|
26524
|
-
\u2022
|
|
26605
|
+
`${colors.field("Optional local tooling for your coding agent:")}
|
|
26606
|
+
\u2022 Talk to your deployed workers from agent sessions (e.g. /stacey) \u2014 install the m8t plugin: guides/install/m8t-plugin.md.
|
|
26607
|
+
\u2022 Azure-capable MCP servers (microsoft/azure-skills, Microsoft Learn) \u2014 see the optional steps in guides/install.md.
|
|
26608
|
+
\u2022 Deploy workers conversationally with the opt-in persona skills \u2014 see guides/workers.md.
|
|
26525
26609
|
\u2022 Make sure your m8t CLI is current: npm i -g @m8t-stack/cli@latest
|
|
26526
26610
|
|
|
26527
26611
|
${colors.field("Then open a brand new chat/session")} \u2014 new skills + MCP servers load only on a fresh start.
|
|
@@ -26778,14 +26862,14 @@ async function installWebDeps(repoRoot) {
|
|
|
26778
26862
|
await runInherit("pnpm", ["install"], repoRoot, "BOOTSTRAP_UI_INSTALL_FAILED");
|
|
26779
26863
|
}
|
|
26780
26864
|
function onboardingUiPaths(home = os17.homedir()) {
|
|
26781
|
-
const dir = path35.join(home, ".m8t
|
|
26865
|
+
const dir = path35.join(home, ".m8t");
|
|
26782
26866
|
return {
|
|
26783
26867
|
logPath: path35.join(dir, "onboarding-ui.log"),
|
|
26784
26868
|
pidPath: path35.join(dir, "onboarding-ui.pid")
|
|
26785
26869
|
};
|
|
26786
26870
|
}
|
|
26787
26871
|
function onboardingRelayPaths(home = os17.homedir()) {
|
|
26788
|
-
const dir = path35.join(home, ".m8t
|
|
26872
|
+
const dir = path35.join(home, ".m8t");
|
|
26789
26873
|
return {
|
|
26790
26874
|
logPath: path35.join(dir, "onboarding-relay.log"),
|
|
26791
26875
|
pidPath: path35.join(dir, "onboarding-relay.pid")
|
|
@@ -26979,7 +27063,7 @@ var BootstrapUiCommand = class extends M8tCommand {
|
|
|
26979
27063
|
if (!state) {
|
|
26980
27064
|
throw new LocalCliError({
|
|
26981
27065
|
code: "BOOTSTRAP_NO_STATE",
|
|
26982
|
-
message: "No bootstrap is in flight (no ~/.m8t
|
|
27066
|
+
message: "No bootstrap is in flight (no ~/.m8t/bootstrap.json).",
|
|
26983
27067
|
hint: "Run 'm8t bootstrap launch --location <region>' first."
|
|
26984
27068
|
});
|
|
26985
27069
|
}
|
|
@@ -26995,8 +27079,8 @@ var BootstrapUiCommand = class extends M8tCommand {
|
|
|
26995
27079
|
this.context.stderr.write(` ${colors.dim(m)}
|
|
26996
27080
|
`);
|
|
26997
27081
|
};
|
|
26998
|
-
if (fs33.existsSync(path36.join(os18.homedir(), ".m8t
|
|
26999
|
-
out(colors.error("\u26A0 an existing ~/.m8t
|
|
27082
|
+
if (fs33.existsSync(path36.join(os18.homedir(), ".m8t", "config.yaml"))) {
|
|
27083
|
+
out(colors.error("\u26A0 an existing ~/.m8t/config.yaml will override the onboarding app registration in apps/web \u2014 if Microsoft sign-in fails, move it aside and retry."));
|
|
27000
27084
|
}
|
|
27001
27085
|
const credential2 = new DefaultAzureCredential20();
|
|
27002
27086
|
const account = await getAzAccount();
|
|
@@ -27119,7 +27203,7 @@ var BootstrapSeedProfileCommand = class extends M8tCommand {
|
|
|
27119
27203
|
credsPath: typeof this.githubAppCreds === "string" ? this.githubAppCreds : void 0
|
|
27120
27204
|
});
|
|
27121
27205
|
if (!ctx) {
|
|
27122
|
-
this.context.stderr.write(` ${colors.dim("no GitHub App creds (~/.m8t
|
|
27206
|
+
this.context.stderr.write(` ${colors.dim("no GitHub App creds (~/.m8t/github-app.json) \u2014 no brain to seed; skipping.")}
|
|
27123
27207
|
`);
|
|
27124
27208
|
return 0;
|
|
27125
27209
|
}
|
|
@@ -27159,7 +27243,7 @@ var BootstrapSeedProfileCommand = class extends M8tCommand {
|
|
|
27159
27243
|
// src/cli.ts
|
|
27160
27244
|
var cli = new Cli({
|
|
27161
27245
|
binaryName: "m8t",
|
|
27162
|
-
binaryLabel: "m8t CLI \u2014 manage m8t
|
|
27246
|
+
binaryLabel: "m8t CLI \u2014 manage m8t deployments",
|
|
27163
27247
|
binaryVersion: CLI_VERSION
|
|
27164
27248
|
});
|
|
27165
27249
|
cli.register(Builtins.HelpCommand);
|