@tutti-os/nexight-devops 0.5.3 → 0.5.4

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 CHANGED
@@ -48,6 +48,7 @@ nexight-devops ppe-lane status --all
48
48
  nexight-devops release prepare
49
49
  nexight-devops release hotfix
50
50
  nexight-devops release approve
51
+ nexight-devops release rollback
51
52
  nexight-devops release rollback tutti-server
52
53
  ```
53
54
 
@@ -64,11 +65,11 @@ nexight-devops release rollback tutti-server
64
65
  - `admin computer log-recall` exposes the lower-level task operations for troubleshooting and recovery.
65
66
  - `datafinder` validates access, reads dashboards/reports, runs trusted local JavaScript queries, and exposes fixed reliability queries.
66
67
  - `diagnose shared-agent` runs a bounded, read-only CloudWatch playbook that correlates room descriptor results, Owner lease observations, client version, and HTTP failures. It verifies the production AWS account before querying and supports stable `--json` output.
67
- - `ppe-lane deploy` deploys selected backend repositories and the optional `zk-web/canvas` staging artifact to a PPE lane.
68
- - `ppe-lane destroy` checks existing lane instances and triggers destroy workflows after a lane-name confirmation.
69
- - `ppe-lane status` queries AWS Cloud Map for one lane, or all lanes with `--all`.
68
+ - `ppe-lane deploy` deploys selected backend repositories, including `tutti-server`, and the optional `zk-web/canvas` staging artifact to a PPE lane.
69
+ - `ppe-lane destroy` checks existing lane instances and triggers destroy workflows after a lane-name confirmation. `tutti-server` must be selected explicitly for destruction.
70
+ - `ppe-lane status` queries AWS Cloud Map for one lane, or all lanes with `--all`, including `tutti-server`.
70
71
  - `release prepare`, `release hotfix`, and `release approve` run the controlled release lifecycle through GitHub Actions and approval issues.
71
- - `release rollback tutti-server` reads the current production image and up to ten recent Helm deployments directly when local read access to the production cluster is available. Otherwise it retrieves the verified list through GitHub Actions. The selected image is always revalidated and restored by GitHub Actions, followed by health checks. Use `--revision <number> --yes` for scripted selection and confirmation.
72
+ - `release rollback` lets you choose `tutti-server` interactively; `release rollback tutti-server` selects it directly. The command reads the current production image and up to ten recent Helm deployments directly when local read access to the production cluster is available. Otherwise it retrieves the verified list through GitHub Actions. The selected image is always revalidated and restored by GitHub Actions, followed by health checks. Use `--revision <number> --yes` with the explicit repository for scripted selection and confirmation.
72
73
 
73
74
  ## Controlled Release
74
75
 
package/dist/cli.js CHANGED
@@ -4018,6 +4018,17 @@ var ppeLaneCanvasTarget = {
4018
4018
 
4019
4019
  // src/constants/ppe-lane-repos.ts
4020
4020
  var ppeLaneRepos = [
4021
+ {
4022
+ key: "tutti-server",
4023
+ label: "tutti-server",
4024
+ repoFullName: "tutti-lab/tutti-server",
4025
+ deployWorkflowFile: "deploy-lane.yml",
4026
+ destroyWorkflowFile: "destroy-lane.yml",
4027
+ defaultRef: "main",
4028
+ defaultDestroySelection: false,
4029
+ cloudMapServiceId: "srv-izinli73rwxpf2dr",
4030
+ serviceName: "tutti-server"
4031
+ },
4021
4032
  {
4022
4033
  key: "zk-agent-engine",
4023
4034
  label: "zk-agent-engine",
@@ -4463,7 +4474,11 @@ var runPpeLaneDestroy = async () => {
4463
4474
  const lane = validatePpeLaneName(await ui.input({ message: t("ppeLane.destroy.enterLane") }));
4464
4475
  const selectedKeys = await ui.checkbox({
4465
4476
  message: t("ppeLane.destroy.selectRepos"),
4466
- choices: ppeLaneRepos.map((repo) => ({ value: repo.key, name: repo.label, checked: true }))
4477
+ choices: ppeLaneRepos.map((repo) => ({
4478
+ value: repo.key,
4479
+ name: repo.label,
4480
+ checked: repo.defaultDestroySelection !== false
4481
+ }))
4467
4482
  });
4468
4483
  if (selectedKeys.length === 0) {
4469
4484
  throw new CliError(t("ppeLane.destroy.atLeastOneRepo"), 1);
@@ -5086,6 +5101,14 @@ import { mkdtemp as mkdtemp3, readFile as readFile3, rm as rm2 } from "fs/promis
5086
5101
  import { tmpdir } from "os";
5087
5102
  import { join as join5 } from "path";
5088
5103
 
5104
+ // src/constants/rollback-targets.ts
5105
+ var tuttiServerRollbackTarget = {
5106
+ key: "tutti-server",
5107
+ label: "tutti-server",
5108
+ repoFullName: "tutti-lab/tutti-server"
5109
+ };
5110
+ var rollbackTargets = [tuttiServerRollbackTarget];
5111
+
5089
5112
  // src/commands/release/rollback-local.ts
5090
5113
  var CLUSTER = "arn:aws:eks:us-east-1:250509935467:cluster/nexight-ojo-us-east-1";
5091
5114
  var REPOSITORY = "250509935467.dkr.ecr.us-east-1.amazonaws.com/nexight/tutti/tutti-server";
@@ -5173,7 +5196,7 @@ var fetchLocalRollbackCatalog = async () => {
5173
5196
  };
5174
5197
 
5175
5198
  // src/commands/release/rollback.ts
5176
- var REPO = "tutti-lab/tutti-server";
5199
+ var REPO = tuttiServerRollbackTarget.repoFullName;
5177
5200
  var WORKFLOW = "rollback.yml";
5178
5201
  var SHA256 = /^sha256:[0-9a-f]{64}$/;
5179
5202
  var SINGAPORE_TIME = new Intl.DateTimeFormat("sv-SE", {
@@ -5341,8 +5364,12 @@ var runTuttiRollback = async (options) => {
5341
5364
  logger.info(run.htmlUrl);
5342
5365
  };
5343
5366
  var registerReleaseRollbackCommand = (program) => {
5344
- program.command("rollback").description("Restore a recent production image").argument("<repository>", "Currently supported: tutti-server").option("--revision <number>", "Select a recent Helm revision without the chooser").option("--yes", "Skip the final confirmation").action(async (repository, options) => {
5345
- if (repository !== "tutti-server") {
5367
+ program.command("rollback").description("Restore a recent production image").argument("[repository]", "Rollback target; omit to choose interactively").option("--revision <number>", "Select a recent Helm revision without the chooser").option("--yes", "Skip the final confirmation").action(async (repository, options) => {
5368
+ const selected = repository ?? await ui.select({
5369
+ message: "Select a repository to roll back",
5370
+ choices: rollbackTargets.map((target) => ({ name: target.label, value: target.key }))
5371
+ });
5372
+ if (selected !== tuttiServerRollbackTarget.key) {
5346
5373
  throw new CliError("Only tutti-server is currently supported", 1);
5347
5374
  }
5348
5375
  await runTuttiRollback(options);