@codyswann/lisa 3.45.8 → 3.45.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/all/copy-overwrite/scripts/lisa-floor-collisions.mjs +17 -1
  2. package/all/copy-overwrite/scripts/lisa-gates.mjs +2 -2
  3. package/all/copy-overwrite/scripts/lisa-work-item.mjs +54 -12
  4. package/dist/cli/doctor-traceability-gate.js +1 -1
  5. package/dist/cli/doctor-traceability-gate.js.map +1 -1
  6. package/dist/configs/eslint/slow.js +3 -3
  7. package/dist/configs/eslint/slow.js.map +1 -1
  8. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  9. package/dist/core/lisa-owned-hash-ledger.js +17 -0
  10. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  11. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  12. package/dist/core/upstream-evidence-manifest.js +18 -16
  13. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  14. package/dist/migrations/ensure-audit-ignore-local-exclusions.js +1 -1
  15. package/dist/migrations/ensure-audit-ignore-local-exclusions.js.map +1 -1
  16. package/dist/migrations/ensure-wiki-source-declared.js +2 -2
  17. package/dist/migrations/ensure-wiki-source-declared.js.map +1 -1
  18. package/expo/copy-overwrite/scripts/bdd/discover.mjs +20 -4
  19. package/expo/copy-overwrite/scripts/bdd/markdown-cell.mjs +7 -1
  20. package/expo/copy-overwrite/scripts/bdd/parse.mjs +9 -3
  21. package/expo/copy-overwrite/scripts/check-e2e-coverage.mjs +9 -3
  22. package/expo/copy-overwrite/scripts/classify-maestro-failures.mjs +91 -10
  23. package/package.json +1 -1
  24. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa/.codex-plugin/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +2 -2
  27. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/surfaces.mjs +1 -1
  28. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +2 -2
  29. package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/cli.mjs +1 -1
  30. package/plugins/lisa/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +2 -2
  31. package/plugins/lisa/skills/lisa-secrets-access/scripts/surfaces.mjs +1 -1
  32. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +2 -2
  33. package/plugins/lisa/skills/lisa-setup-workstation/scripts/cli.mjs +1 -1
  34. package/plugins/lisa-agy/plugin.json +1 -1
  35. package/plugins/lisa-agy/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +2 -2
  36. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/surfaces.mjs +1 -1
  37. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +2 -2
  38. package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/cli.mjs +1 -1
  39. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  42. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-copilot/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +2 -2
  46. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/surfaces.mjs +1 -1
  47. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +2 -2
  48. package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/cli.mjs +1 -1
  49. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-cursor/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +2 -2
  51. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/surfaces.mjs +1 -1
  52. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +2 -2
  53. package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/cli.mjs +1 -1
  54. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-expo-agy/plugin.json +1 -1
  57. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  62. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  67. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  72. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  77. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-rails-agy/plugin.json +1 -1
  82. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  86. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  87. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  91. package/plugins/lisa-wiki/scripts/ensure-wiki.mjs +3 -3
  92. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  93. package/plugins/lisa-wiki-agy/scripts/ensure-wiki.mjs +3 -3
  94. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-wiki-copilot/scripts/ensure-wiki.mjs +3 -3
  96. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-wiki-cursor/scripts/ensure-wiki.mjs +3 -3
  98. package/plugins/src/base/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +2 -2
  99. package/plugins/src/base/skills/lisa-secrets-access/scripts/surfaces.mjs +1 -1
  100. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +2 -2
  101. package/plugins/src/base/skills/lisa-setup-workstation/scripts/cli.mjs +1 -1
  102. package/plugins/src/wiki/scripts/ensure-wiki.mjs +3 -3
  103. package/scripts/lisa-assert-eas-profile.mjs +1 -1
  104. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +22 -6
  105. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +10 -1
@@ -443,8 +443,8 @@ export function satisfiedByNpm(pkg, tool) {
443
443
  const viaNpm = KNOWN_TOOLS[tool]?.viaNpm;
444
444
  if (!viaNpm) return false;
445
445
  const declared = {
446
- ...(pkg?.dependencies ?? {}),
447
- ...(pkg?.devDependencies ?? {}),
446
+ ...pkg?.dependencies,
447
+ ...pkg?.devDependencies,
448
448
  };
449
449
  return Object.hasOwn(declared, viaNpm);
450
450
  }
@@ -308,7 +308,7 @@ export function readConfig(cwd = process.cwd(), env = process.env) {
308
308
  rotating: cfg.rotating ?? [],
309
309
  propagating: cfg.propagating ?? [],
310
310
  namespace,
311
- narrow: { ...DEFAULTS.narrow, ...(cfg.narrow ?? {}) },
311
+ narrow: { ...DEFAULTS.narrow, ...cfg.narrow },
312
312
  surface: cfg.surface ?? null,
313
313
  routing,
314
314
  configPath: path,
@@ -91,7 +91,7 @@ export function readRemoteEnvConfig(cwd = process.cwd()) {
91
91
  const cfg = JSON.parse(readFileSync(path, "utf8")).remoteEnv;
92
92
  if (!cfg) return defaults;
93
93
  return {
94
- tools: { require: [], install: [], ...(cfg.tools ?? {}) },
94
+ tools: { require: [], install: [], ...cfg.tools },
95
95
  hook: cfg.hook ?? null,
96
96
  surfaces: cfg.surfaces ?? {},
97
97
  };
@@ -879,7 +879,7 @@ export function pinEnvironment(environmentId, cwd = process.cwd()) {
879
879
  : {};
880
880
  const merged = {
881
881
  ...existing,
882
- remote: { ...(existing.remote ?? {}), defaultEnvironmentId: environmentId },
882
+ remote: { ...existing.remote, defaultEnvironmentId: environmentId },
883
883
  };
884
884
  writeFileSync(path, `${JSON.stringify(merged, null, 2)}\n`);
885
885
  return path;
@@ -204,7 +204,7 @@ export async function run(argv, io = {}) {
204
204
 
205
205
  let plan;
206
206
  try {
207
- plan = planWorkstation({ agents, tools, provider, ...(io.probes ?? {}) });
207
+ plan = planWorkstation({ agents, tools, provider, ...io.probes });
208
208
  } catch (error) {
209
209
  // A misspelled provider stops here rather than silently provisioning the
210
210
  // wrong credential manager.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -94,10 +94,10 @@ const committed =
94
94
  readJsonSafe(path.join(projectDir, ".lisa.config.json")) ?? {};
95
95
  const local =
96
96
  readJsonSafe(path.join(projectDir, ".lisa.config.local.json")) ?? {};
97
- const wikiCfg = { ...(committed.wiki ?? {}), ...(local.wiki ?? {}) };
97
+ const wikiCfg = { ...committed.wiki, ...local.wiki };
98
98
  const source = {
99
- ...(committed.wiki?.source ?? {}),
100
- ...(local.wiki?.source ?? {}),
99
+ ...committed.wiki?.source,
100
+ ...local.wiki?.source,
101
101
  };
102
102
  const ttlSeconds = Number(
103
103
  ttlOverride ?? wikiCfg.ttlSeconds ?? DEFAULT_TTL_SECONDS
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -94,10 +94,10 @@ const committed =
94
94
  readJsonSafe(path.join(projectDir, ".lisa.config.json")) ?? {};
95
95
  const local =
96
96
  readJsonSafe(path.join(projectDir, ".lisa.config.local.json")) ?? {};
97
- const wikiCfg = { ...(committed.wiki ?? {}), ...(local.wiki ?? {}) };
97
+ const wikiCfg = { ...committed.wiki, ...local.wiki };
98
98
  const source = {
99
- ...(committed.wiki?.source ?? {}),
100
- ...(local.wiki?.source ?? {}),
99
+ ...committed.wiki?.source,
100
+ ...local.wiki?.source,
101
101
  };
102
102
  const ttlSeconds = Number(
103
103
  ttlOverride ?? wikiCfg.ttlSeconds ?? DEFAULT_TTL_SECONDS
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -94,10 +94,10 @@ const committed =
94
94
  readJsonSafe(path.join(projectDir, ".lisa.config.json")) ?? {};
95
95
  const local =
96
96
  readJsonSafe(path.join(projectDir, ".lisa.config.local.json")) ?? {};
97
- const wikiCfg = { ...(committed.wiki ?? {}), ...(local.wiki ?? {}) };
97
+ const wikiCfg = { ...committed.wiki, ...local.wiki };
98
98
  const source = {
99
- ...(committed.wiki?.source ?? {}),
100
- ...(local.wiki?.source ?? {}),
99
+ ...committed.wiki?.source,
100
+ ...local.wiki?.source,
101
101
  };
102
102
  const ttlSeconds = Number(
103
103
  ttlOverride ?? wikiCfg.ttlSeconds ?? DEFAULT_TTL_SECONDS
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.45.8",
3
+ "version": "3.45.10",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -94,10 +94,10 @@ const committed =
94
94
  readJsonSafe(path.join(projectDir, ".lisa.config.json")) ?? {};
95
95
  const local =
96
96
  readJsonSafe(path.join(projectDir, ".lisa.config.local.json")) ?? {};
97
- const wikiCfg = { ...(committed.wiki ?? {}), ...(local.wiki ?? {}) };
97
+ const wikiCfg = { ...committed.wiki, ...local.wiki };
98
98
  const source = {
99
- ...(committed.wiki?.source ?? {}),
100
- ...(local.wiki?.source ?? {}),
99
+ ...committed.wiki?.source,
100
+ ...local.wiki?.source,
101
101
  };
102
102
  const ttlSeconds = Number(
103
103
  ttlOverride ?? wikiCfg.ttlSeconds ?? DEFAULT_TTL_SECONDS
@@ -443,8 +443,8 @@ export function satisfiedByNpm(pkg, tool) {
443
443
  const viaNpm = KNOWN_TOOLS[tool]?.viaNpm;
444
444
  if (!viaNpm) return false;
445
445
  const declared = {
446
- ...(pkg?.dependencies ?? {}),
447
- ...(pkg?.devDependencies ?? {}),
446
+ ...pkg?.dependencies,
447
+ ...pkg?.devDependencies,
448
448
  };
449
449
  return Object.hasOwn(declared, viaNpm);
450
450
  }
@@ -308,7 +308,7 @@ export function readConfig(cwd = process.cwd(), env = process.env) {
308
308
  rotating: cfg.rotating ?? [],
309
309
  propagating: cfg.propagating ?? [],
310
310
  namespace,
311
- narrow: { ...DEFAULTS.narrow, ...(cfg.narrow ?? {}) },
311
+ narrow: { ...DEFAULTS.narrow, ...cfg.narrow },
312
312
  surface: cfg.surface ?? null,
313
313
  routing,
314
314
  configPath: path,
@@ -91,7 +91,7 @@ export function readRemoteEnvConfig(cwd = process.cwd()) {
91
91
  const cfg = JSON.parse(readFileSync(path, "utf8")).remoteEnv;
92
92
  if (!cfg) return defaults;
93
93
  return {
94
- tools: { require: [], install: [], ...(cfg.tools ?? {}) },
94
+ tools: { require: [], install: [], ...cfg.tools },
95
95
  hook: cfg.hook ?? null,
96
96
  surfaces: cfg.surfaces ?? {},
97
97
  };
@@ -879,7 +879,7 @@ export function pinEnvironment(environmentId, cwd = process.cwd()) {
879
879
  : {};
880
880
  const merged = {
881
881
  ...existing,
882
- remote: { ...(existing.remote ?? {}), defaultEnvironmentId: environmentId },
882
+ remote: { ...existing.remote, defaultEnvironmentId: environmentId },
883
883
  };
884
884
  writeFileSync(path, `${JSON.stringify(merged, null, 2)}\n`);
885
885
  return path;
@@ -204,7 +204,7 @@ export async function run(argv, io = {}) {
204
204
 
205
205
  let plan;
206
206
  try {
207
- plan = planWorkstation({ agents, tools, provider, ...(io.probes ?? {}) });
207
+ plan = planWorkstation({ agents, tools, provider, ...io.probes });
208
208
  } catch (error) {
209
209
  // A misspelled provider stops here rather than silently provisioning the
210
210
  // wrong credential manager.
@@ -94,10 +94,10 @@ const committed =
94
94
  readJsonSafe(path.join(projectDir, ".lisa.config.json")) ?? {};
95
95
  const local =
96
96
  readJsonSafe(path.join(projectDir, ".lisa.config.local.json")) ?? {};
97
- const wikiCfg = { ...(committed.wiki ?? {}), ...(local.wiki ?? {}) };
97
+ const wikiCfg = { ...committed.wiki, ...local.wiki };
98
98
  const source = {
99
- ...(committed.wiki?.source ?? {}),
100
- ...(local.wiki?.source ?? {}),
99
+ ...committed.wiki?.source,
100
+ ...local.wiki?.source,
101
101
  };
102
102
  const ttlSeconds = Number(
103
103
  ttlOverride ?? wikiCfg.ttlSeconds ?? DEFAULT_TTL_SECONDS
@@ -101,7 +101,7 @@ export function resolveProfile(profiles, name) {
101
101
  const effective = {};
102
102
  for (const link of chain) {
103
103
  Object.assign(effective, link, {
104
- env: { ...(effective.env ?? {}), ...(link.env ?? {}) },
104
+ env: { ...effective.env, ...link.env },
105
105
  });
106
106
  }
107
107
  delete effective.extends;
@@ -2169,6 +2169,22 @@ function sleep(ms) {
2169
2169
  /** GitHub's remaining-quota response header, read from three call sites. */
2170
2170
  const RATELIMIT_REMAINING_HEADER = "x-ratelimit-remaining";
2171
2171
 
2172
+ /**
2173
+ * The `accept` value that selects GitHub's versioned REST media type.
2174
+ *
2175
+ * Named because it is a wire contract shared by every request this file makes:
2176
+ * send a different one and the API answers with a different response shape,
2177
+ * which every parser below would then misread rather than reject.
2178
+ */
2179
+ const GITHUB_ACCEPT = "application/vnd.github+json";
2180
+
2181
+ /**
2182
+ * The `user-agent` GitHub sees. GitHub requires one, and this value is how a
2183
+ * request from this check is told apart from any other Lisa traffic in an
2184
+ * audit log — so it is one string, not three that can drift apart.
2185
+ */
2186
+ const HEALTH_USER_AGENT = "lisa-nightly-e2e-health";
2187
+
2172
2188
  /**
2173
2189
  * How long to wait before retrying a throttled response, bounded.
2174
2190
  *
@@ -2211,10 +2227,10 @@ export async function apiGet(api, path, wait = sleep) {
2211
2227
  try {
2212
2228
  response = await fetch(`${api.apiUrl}${path}`, {
2213
2229
  headers: {
2214
- accept: "application/vnd.github+json",
2230
+ accept: GITHUB_ACCEPT,
2215
2231
  authorization: `Bearer ${api.token}`,
2216
2232
  "x-github-api-version": "2022-11-28",
2217
- "user-agent": "lisa-nightly-e2e-health",
2233
+ "user-agent": HEALTH_USER_AGENT,
2218
2234
  },
2219
2235
  });
2220
2236
  } catch (error) {
@@ -2523,11 +2539,11 @@ export async function apiWrite(api, method, path, payload, wait = sleep) {
2523
2539
  response = await fetch(`${api.apiUrl}${path}`, {
2524
2540
  method,
2525
2541
  headers: {
2526
- accept: "application/vnd.github+json",
2542
+ accept: GITHUB_ACCEPT,
2527
2543
  authorization: `Bearer ${api.token}`,
2528
2544
  "content-type": "application/json",
2529
2545
  "x-github-api-version": "2022-11-28",
2530
- "user-agent": "lisa-nightly-e2e-health",
2546
+ "user-agent": HEALTH_USER_AGENT,
2531
2547
  },
2532
2548
  body: JSON.stringify(payload),
2533
2549
  });
@@ -2600,10 +2616,10 @@ export async function setIssuePin(api, nodeId, pinned) {
2600
2616
  const response = await fetch(api.graphqlUrl ?? `${api.apiUrl}/graphql`, {
2601
2617
  method: "POST",
2602
2618
  headers: {
2603
- accept: "application/vnd.github+json",
2619
+ accept: GITHUB_ACCEPT,
2604
2620
  authorization: `Bearer ${api.token}`,
2605
2621
  "content-type": "application/json",
2606
- "user-agent": "lisa-nightly-e2e-health",
2622
+ "user-agent": HEALTH_USER_AGENT,
2607
2623
  },
2608
2624
  body: JSON.stringify({
2609
2625
  query: `mutation($id: ID!) { ${mutation}(input: {issueId: $id}) { issue { number } } }`,