@codyswann/lisa 2.166.1 → 2.166.3
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/dist/configs/vitest/base.d.ts +20 -2
- package/dist/configs/vitest/base.d.ts.map +1 -1
- package/dist/configs/vitest/base.js +23 -4
- package/dist/configs/vitest/base.js.map +1 -1
- package/dist/configs/vitest/nestjs.d.ts +2 -2
- package/dist/configs/vitest/nestjs.d.ts.map +1 -1
- package/dist/configs/vitest/nestjs.js +4 -4
- package/dist/configs/vitest/nestjs.js.map +1 -1
- package/dist/configs/vitest/typescript.d.ts +2 -2
- package/dist/configs/vitest/typescript.d.ts.map +1 -1
- package/dist/configs/vitest/typescript.js +4 -4
- package/dist/configs/vitest/typescript.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/skills/harper-build-and-deploy/SKILL.md +70 -8
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/skills/harper-build-and-deploy/SKILL.md +70 -8
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/skills/harper-build-and-deploy/SKILL.md +70 -8
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/skills/harper-build-and-deploy/SKILL.md +70 -8
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/harper-fabric/skills/harper-build-and-deploy/SKILL.md +70 -8
|
@@ -53,10 +53,28 @@ export declare const defaultThresholds: PortableThresholds;
|
|
|
53
53
|
export declare const defaultCoverageExclusions: readonly string[];
|
|
54
54
|
/**
|
|
55
55
|
* Default patterns to exclude from test discovery across all stacks.
|
|
56
|
-
*
|
|
57
|
-
*
|
|
56
|
+
*
|
|
57
|
+
* The `.claude/worktrees/` exclusion is intentionally NOT baked in here —
|
|
58
|
+
* it is cwd-conditional and supplied by {@link worktreeExclusions} so that
|
|
59
|
+
* a vitest run launched from INSIDE a worktree can still discover its own
|
|
60
|
+
* tests. Stack factories spread `worktreeExclusions()` alongside this list.
|
|
58
61
|
*/
|
|
59
62
|
export declare const defaultTestExclusions: readonly string[];
|
|
63
|
+
/**
|
|
64
|
+
* Returns the worktree exclusion glob a stack config should add to skip
|
|
65
|
+
* test files / coverage that live inside `.claude/worktrees/`.
|
|
66
|
+
*
|
|
67
|
+
* Lisa manages `.claude/worktrees/` as scratch worktrees for subagents.
|
|
68
|
+
* When vitest runs from the primary checkout, tests inside those worktrees
|
|
69
|
+
* should be skipped — each worktree has its own vitest run. When vitest runs
|
|
70
|
+
* from INSIDE a worktree (the project root *is* the worktree), the same glob
|
|
71
|
+
* matches every path under root and vitest finds zero tests. This returns the
|
|
72
|
+
* glob only when the current working directory is outside a worktree, so each
|
|
73
|
+
* stack factory can spread it into its `exclude` arrays without hand-rolling
|
|
74
|
+
* the conditional. Mirrors jest's `worktreeTestPathIgnorePatterns()`.
|
|
75
|
+
* @returns Single-entry array with the worktree exclude glob, or an empty array when already inside a worktree.
|
|
76
|
+
*/
|
|
77
|
+
export declare function worktreeExclusions(): readonly string[];
|
|
60
78
|
/**
|
|
61
79
|
* Maps portable threshold format (with `global` wrapper) to Vitest's
|
|
62
80
|
* flat threshold format. Projects store thresholds in the portable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,8DAA8D;AAC9D,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,kBAO/B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,8DAA8D;AAC9D,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,kBAO/B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAatD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAGlD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAMtD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GACxB,YAAY,kBAAkB,KAC7B,gBAaD,CAAC;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,kBAAkB,EAC5B,WAAW,kBAAkB,KAC5B,kBAOD,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAI,GAAG,SAAS,UAAU,EAAE,KAAG,UA4C7D,CAAC"}
|
|
@@ -22,7 +22,6 @@ export const defaultCoverageExclusions = [
|
|
|
22
22
|
"**/index.ts",
|
|
23
23
|
"**/node_modules/**",
|
|
24
24
|
"**/dist/**",
|
|
25
|
-
"**/.claude/worktrees/**",
|
|
26
25
|
"**/*.test.ts",
|
|
27
26
|
"**/*.spec.ts",
|
|
28
27
|
"**/*.mock.ts",
|
|
@@ -34,14 +33,34 @@ export const defaultCoverageExclusions = [
|
|
|
34
33
|
];
|
|
35
34
|
/**
|
|
36
35
|
* Default patterns to exclude from test discovery across all stacks.
|
|
37
|
-
*
|
|
38
|
-
*
|
|
36
|
+
*
|
|
37
|
+
* The `.claude/worktrees/` exclusion is intentionally NOT baked in here —
|
|
38
|
+
* it is cwd-conditional and supplied by {@link worktreeExclusions} so that
|
|
39
|
+
* a vitest run launched from INSIDE a worktree can still discover its own
|
|
40
|
+
* tests. Stack factories spread `worktreeExclusions()` alongside this list.
|
|
39
41
|
*/
|
|
40
42
|
export const defaultTestExclusions = [
|
|
41
43
|
"**/node_modules/**",
|
|
42
44
|
"**/dist/**",
|
|
43
|
-
"**/.claude/worktrees/**",
|
|
44
45
|
];
|
|
46
|
+
/**
|
|
47
|
+
* Returns the worktree exclusion glob a stack config should add to skip
|
|
48
|
+
* test files / coverage that live inside `.claude/worktrees/`.
|
|
49
|
+
*
|
|
50
|
+
* Lisa manages `.claude/worktrees/` as scratch worktrees for subagents.
|
|
51
|
+
* When vitest runs from the primary checkout, tests inside those worktrees
|
|
52
|
+
* should be skipped — each worktree has its own vitest run. When vitest runs
|
|
53
|
+
* from INSIDE a worktree (the project root *is* the worktree), the same glob
|
|
54
|
+
* matches every path under root and vitest finds zero tests. This returns the
|
|
55
|
+
* glob only when the current working directory is outside a worktree, so each
|
|
56
|
+
* stack factory can spread it into its `exclude` arrays without hand-rolling
|
|
57
|
+
* the conditional. Mirrors jest's `worktreeTestPathIgnorePatterns()`.
|
|
58
|
+
* @returns Single-entry array with the worktree exclude glob, or an empty array when already inside a worktree.
|
|
59
|
+
*/
|
|
60
|
+
export function worktreeExclusions() {
|
|
61
|
+
const isInsideWorktree = /[/\\]\.claude[/\\]worktrees(?:[/\\]|$)/.test(process.cwd());
|
|
62
|
+
return isInsideWorktree ? [] : ["**/.claude/worktrees/**"];
|
|
63
|
+
}
|
|
45
64
|
/**
|
|
46
65
|
* Maps portable threshold format (with `global` wrapper) to Vitest's
|
|
47
66
|
* flat threshold format. Projects store thresholds in the portable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/configs/vitest/base.ts"],"names":[],"mappings":"AA4CA;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACnD,MAAM,EAAE;QACN,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,EAAE;KACV;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,WAAW;IACX,aAAa;IACb,oBAAoB;IACpB,YAAY;IACZ,
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/configs/vitest/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
import type { ViteUserConfig } from "vitest/config";
|
|
14
14
|
/** Vite UserConfig augmented with Vitest's `test` property */
|
|
15
15
|
type UserConfig = ViteUserConfig;
|
|
16
|
-
import { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs } from "./base.js";
|
|
16
|
+
import { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, worktreeExclusions } from "./base.js";
|
|
17
17
|
import type { PortableThresholds } from "./base.js";
|
|
18
|
-
export { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, };
|
|
18
|
+
export { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, worktreeExclusions, };
|
|
19
19
|
export type { PortableThresholds };
|
|
20
20
|
/**
|
|
21
21
|
* Options for configuring the NestJS Vitest config factory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nestjs.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/nestjs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,8DAA8D;AAC9D,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,CAAC;AAEF,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC;;GAEG;AACH,UAAU,mBAAmB;IAC3B,mFAAmF;IACnF,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;CAC1C;AAwBD;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,GAAI,kBAEnC,mBAAwB,KAAG,UAkB5B,CAAC"}
|
|
1
|
+
{"version":3,"file":"nestjs.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/nestjs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,8DAA8D;AAC9D,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,CAAC;AAEF,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC;;GAEG;AACH,UAAU,mBAAmB;IAC3B,mFAAmF;IACnF,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;CAC1C;AAwBD;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,GAAI,kBAEnC,mBAAwB,KAAG,UAkB5B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, } from "./base.js";
|
|
1
|
+
import { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, worktreeExclusions, } from "./base.js";
|
|
2
2
|
// Re-export base utilities for entry-point configs
|
|
3
|
-
export { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, };
|
|
3
|
+
export { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, worktreeExclusions, };
|
|
4
4
|
/**
|
|
5
5
|
* NestJS-specific patterns excluded from coverage collection.
|
|
6
6
|
* These are generated or boilerplate files that don't benefit from coverage tracking.
|
|
@@ -41,12 +41,12 @@ export const getNestjsVitestConfig = ({ thresholds = defaultThresholds, } = {})
|
|
|
41
41
|
// on "No test files found" otherwise. See typescript.ts for rationale.
|
|
42
42
|
passWithNoTests: true,
|
|
43
43
|
include: ["**/*.spec.ts"],
|
|
44
|
-
exclude: [...defaultTestExclusions],
|
|
44
|
+
exclude: [...defaultTestExclusions, ...worktreeExclusions()],
|
|
45
45
|
testTimeout: 10000,
|
|
46
46
|
coverage: {
|
|
47
47
|
provider: "v8",
|
|
48
48
|
include: ["**/*.ts"],
|
|
49
|
-
exclude: [...nestjsCoverageExclusions],
|
|
49
|
+
exclude: [...nestjsCoverageExclusions, ...worktreeExclusions()],
|
|
50
50
|
thresholds: mapThresholds(thresholds),
|
|
51
51
|
},
|
|
52
52
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nestjs.js","sourceRoot":"","sources":["../../../src/configs/vitest/nestjs.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAInB,mDAAmD;AACnD,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,CAAC;AAYF;;;GAGG;AACH,MAAM,wBAAwB,GAAsB;IAClD,GAAG,yBAAyB;IAC5B,gBAAgB;IAChB,aAAa;IACb,eAAe;IACf,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,2BAA2B;IAC3B,sBAAsB;IACtB,eAAe;IACf,YAAY;CACb,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EACpC,UAAU,GAAG,iBAAiB,MACP,EAAE,EAAc,EAAE,CAAC,CAAC;IAC3C,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,KAAK;QACX,8EAA8E;QAC9E,uEAAuE;QACvE,eAAe,EAAE,IAAI;QACrB,OAAO,EAAE,CAAC,cAAc,CAAC;QACzB,OAAO,EAAE,CAAC,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"nestjs.js","sourceRoot":"","sources":["../../../src/configs/vitest/nestjs.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAInB,mDAAmD;AACnD,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,CAAC;AAYF;;;GAGG;AACH,MAAM,wBAAwB,GAAsB;IAClD,GAAG,yBAAyB;IAC5B,gBAAgB;IAChB,aAAa;IACb,eAAe;IACf,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,2BAA2B;IAC3B,sBAAsB;IACtB,eAAe;IACf,YAAY;CACb,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EACpC,UAAU,GAAG,iBAAiB,MACP,EAAE,EAAc,EAAE,CAAC,CAAC;IAC3C,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,KAAK;QACX,8EAA8E;QAC9E,uEAAuE;QACvE,eAAe,EAAE,IAAI;QACrB,OAAO,EAAE,CAAC,cAAc,CAAC;QACzB,OAAO,EAAE,CAAC,GAAG,qBAAqB,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC5D,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE;YACR,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,CAAC,SAAS,CAAC;YACpB,OAAO,EAAE,CAAC,GAAG,wBAAwB,EAAE,GAAG,kBAAkB,EAAE,CAAC;YAC/D,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC;SACtC;KACF;CACF,CAAC,CAAC"}
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
import type { ViteUserConfig } from "vitest/config";
|
|
10
10
|
/** Vite UserConfig augmented with Vitest's `test` property */
|
|
11
11
|
type UserConfig = ViteUserConfig;
|
|
12
|
-
import { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs } from "./base.js";
|
|
12
|
+
import { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, worktreeExclusions } from "./base.js";
|
|
13
13
|
import type { PortableThresholds } from "./base.js";
|
|
14
|
-
export { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, };
|
|
14
|
+
export { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, worktreeExclusions, };
|
|
15
15
|
export type { PortableThresholds };
|
|
16
16
|
/**
|
|
17
17
|
* Options for configuring the TypeScript Vitest config factory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/typescript.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,8DAA8D;AAC9D,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,CAAC;AAEF,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC;;GAEG;AACH,UAAU,uBAAuB;IAC/B,mFAAmF;IACnF,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;CAC1C;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,GAAI,kBAEvC,uBAA4B,KAAG,UAmBhC,CAAC"}
|
|
1
|
+
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/typescript.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,8DAA8D;AAC9D,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,CAAC;AAEF,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC;;GAEG;AACH,UAAU,uBAAuB;IAC/B,mFAAmF;IACnF,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;CAC1C;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,GAAI,kBAEvC,uBAA4B,KAAG,UAmBhC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, } from "./base.js";
|
|
1
|
+
import { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, worktreeExclusions, } from "./base.js";
|
|
2
2
|
// Re-export base utilities for stack-specific configs to use
|
|
3
|
-
export { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, };
|
|
3
|
+
export { defaultCoverageExclusions, defaultTestExclusions, defaultThresholds, mapThresholds, mergeThresholds, mergeVitestConfigs, worktreeExclusions, };
|
|
4
4
|
/**
|
|
5
5
|
* Creates a Vitest configuration for TypeScript/Node projects.
|
|
6
6
|
*
|
|
@@ -21,12 +21,12 @@ export const getTypescriptVitestConfig = ({ thresholds = defaultThresholds, } =
|
|
|
21
21
|
// the test-world analog of allowing `files: []` in tsconfig for zero sources.
|
|
22
22
|
passWithNoTests: true,
|
|
23
23
|
include: ["tests/**/*.test.ts", "src/**/*.test.ts"],
|
|
24
|
-
exclude: [...defaultTestExclusions],
|
|
24
|
+
exclude: [...defaultTestExclusions, ...worktreeExclusions()],
|
|
25
25
|
testTimeout: 10000,
|
|
26
26
|
coverage: {
|
|
27
27
|
provider: "v8",
|
|
28
28
|
include: ["src/**/*.ts"],
|
|
29
|
-
exclude: [...defaultCoverageExclusions],
|
|
29
|
+
exclude: [...defaultCoverageExclusions, ...worktreeExclusions()],
|
|
30
30
|
thresholds: mapThresholds(thresholds),
|
|
31
31
|
},
|
|
32
32
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/configs/vitest/typescript.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAInB,6DAA6D;AAC7D,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,CAAC;AAYF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,EACxC,UAAU,GAAG,iBAAiB,MACH,EAAE,EAAc,EAAE,CAAC,CAAC;IAC/C,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,4EAA4E;QAC5E,uEAAuE;QACvE,2EAA2E;QAC3E,8EAA8E;QAC9E,eAAe,EAAE,IAAI;QACrB,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,OAAO,EAAE,CAAC,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/configs/vitest/typescript.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAInB,6DAA6D;AAC7D,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,CAAC;AAYF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,EACxC,UAAU,GAAG,iBAAiB,MACH,EAAE,EAAc,EAAE,CAAC,CAAC;IAC/C,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,4EAA4E;QAC5E,uEAAuE;QACvE,2EAA2E;QAC3E,8EAA8E;QAC9E,eAAe,EAAE,IAAI;QACrB,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,OAAO,EAAE,CAAC,GAAG,qBAAqB,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC5D,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE;YACR,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,OAAO,EAAE,CAAC,GAAG,yBAAyB,EAAE,GAAG,kBAAkB,EAAE,CAAC;YAChE,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC;SACtC;KACF;CACF,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"lodash": ">=4.18.1"
|
|
86
86
|
},
|
|
87
87
|
"name": "@codyswann/lisa",
|
|
88
|
-
"version": "2.166.
|
|
88
|
+
"version": "2.166.3",
|
|
89
89
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
90
90
|
"main": "dist/index.js",
|
|
91
91
|
"exports": {
|
|
@@ -27,14 +27,42 @@ The CLI binary is `harper` (v5; older installs use `harperdb`). Key commands:
|
|
|
27
27
|
In this project, dev typically runs against the component dir, e.g.
|
|
28
28
|
`harper dev harper-app` (use the project's documented run command if it wraps this).
|
|
29
29
|
|
|
30
|
-
## The build step (TypeScript
|
|
30
|
+
## The build step (TypeScript -> generated artifacts)
|
|
31
31
|
|
|
32
32
|
Harper loads JavaScript (`resources.js`) and serves static files (`web/**`). In this
|
|
33
|
-
project those are **generated**, not authored
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
project those are **generated**, not authored.
|
|
34
|
+
|
|
35
|
+
What the build actually does:
|
|
36
|
+
|
|
37
|
+
1. Compiles the TypeScript source under `src/` into deployable JavaScript.
|
|
38
|
+
2. Emits `harper-app/resources.js`, the aggregate resource module loaded by the
|
|
39
|
+
`jsResource` extension.
|
|
40
|
+
3. Emits per-resource modules such as `harper-app/resource-*.js` when the project
|
|
41
|
+
build splits resources for Harper's runtime loader.
|
|
42
|
+
4. Copies browser/static output into `harper-app/web/**` for the `static`
|
|
43
|
+
extension to serve.
|
|
44
|
+
5. Mirrors shared library output into `harper-app/lib/**` and rewrites imports
|
|
45
|
+
such as `../lib/foo.js` to `./lib/foo.js`. Fabric packages the component root
|
|
46
|
+
as a flat deploy unit, and Node resolves real paths at runtime, so imports must
|
|
47
|
+
point at files that exist inside the packaged `harper-app/` root.
|
|
48
|
+
6. Adds cache-busting `?v=` query parameters to browser-module imports when the
|
|
49
|
+
project build owns web asset versioning.
|
|
50
|
+
|
|
51
|
+
Generated Harper deploy artifacts usually include:
|
|
52
|
+
|
|
53
|
+
- `harper-app/resources.js`
|
|
54
|
+
- `harper-app/resource-*.js`
|
|
55
|
+
- `harper-app/web/**`
|
|
56
|
+
- `harper-app/lib/**`
|
|
57
|
+
|
|
58
|
+
Every lint, format, dead-code, search, or generated-artifact guard must ignore
|
|
59
|
+
those generated paths unless it is explicitly validating the build output itself.
|
|
60
|
+
When a new generated path appears, add it to every relevant ignore surface in the
|
|
61
|
+
same change; partial ignores fail later gates in non-obvious ways.
|
|
62
|
+
|
|
63
|
+
- **TypeScript under `src/` is source.** `bun run build` produces the deployable
|
|
64
|
+
Harper assets from it.
|
|
65
|
+
- **Never edit generated Harper assets directly** — change the TypeScript and
|
|
38
66
|
rebuild. See [[harper-resources]] and [[harper-component-model]].
|
|
39
67
|
- **Build before symlinking, packaging, or deploying `harper-app/`.** Deploying
|
|
40
68
|
stale artifacts ships code that does not match `src/`.
|
|
@@ -86,11 +114,45 @@ harper deploy_component \
|
|
|
86
114
|
|
|
87
115
|
- Omitting `package` deploys the current directory.
|
|
88
116
|
- `restart=true` restarts threads after deploy so new code loads.
|
|
89
|
-
- `replicated=true`
|
|
90
|
-
|
|
117
|
+
- `replicated=true` asks Harper/Fabric to apply the component deploy across the
|
|
118
|
+
cluster rather than only the node receiving the deploy request. Include it when
|
|
119
|
+
targeting Fabric or any clustered deployment.
|
|
91
120
|
- Credentials can come from `CLI_TARGET_USERNAME` / `CLI_TARGET_PASSWORD` instead of
|
|
92
121
|
inline flags — prefer that so secrets never land in shell history or tracked files.
|
|
93
122
|
|
|
123
|
+
## Replication and topology
|
|
124
|
+
|
|
125
|
+
Fabric is a distributed runtime: a project can run on one or more Harper nodes,
|
|
126
|
+
often grouped by region or environment. Your application code is packaged as a
|
|
127
|
+
component, and the data layer is replicated through Harper's database and
|
|
128
|
+
clustering model.
|
|
129
|
+
|
|
130
|
+
Keep these semantics separate:
|
|
131
|
+
|
|
132
|
+
- **Component code replication** is controlled by deploy behavior. With
|
|
133
|
+
`replicated=true`, the deployed component package should reach the cluster nodes
|
|
134
|
+
that serve the application. Without it, you may update only the target node and
|
|
135
|
+
leave other nodes running older code.
|
|
136
|
+
- **Data replication** is runtime/database behavior. Deploying code does not by
|
|
137
|
+
itself prove that existing rows, schema changes, caches, or realtime state are
|
|
138
|
+
consistent across regions or nodes.
|
|
139
|
+
- **Thread restart** is local process behavior. `restart=true` reloads code after
|
|
140
|
+
the package lands; it is not a substitute for checking every node or region that
|
|
141
|
+
receives traffic.
|
|
142
|
+
|
|
143
|
+
After a replicated deploy, verify from the topology the app actually uses:
|
|
144
|
+
|
|
145
|
+
1. Confirm the deploy command or workflow used `replicated=true` for Fabric/cluster
|
|
146
|
+
targets.
|
|
147
|
+
2. Read `harper status` or the project's Fabric status command to see the expected
|
|
148
|
+
nodes/regions.
|
|
149
|
+
3. Hit the public smoke endpoint through the production route, then hit a direct
|
|
150
|
+
node or region endpoint when the project exposes one.
|
|
151
|
+
4. For schema or data changes, verify a write/read path that proves the expected
|
|
152
|
+
data is visible where traffic can land.
|
|
153
|
+
5. If one node serves old assets or resources, treat the deploy as incomplete even
|
|
154
|
+
when the initial target node passed smoke.
|
|
155
|
+
|
|
94
156
|
## Secrets
|
|
95
157
|
|
|
96
158
|
Keep runtime secrets out of tracked files. Use environment variables, the
|
|
@@ -27,14 +27,42 @@ The CLI binary is `harper` (v5; older installs use `harperdb`). Key commands:
|
|
|
27
27
|
In this project, dev typically runs against the component dir, e.g.
|
|
28
28
|
`harper dev harper-app` (use the project's documented run command if it wraps this).
|
|
29
29
|
|
|
30
|
-
## The build step (TypeScript
|
|
30
|
+
## The build step (TypeScript -> generated artifacts)
|
|
31
31
|
|
|
32
32
|
Harper loads JavaScript (`resources.js`) and serves static files (`web/**`). In this
|
|
33
|
-
project those are **generated**, not authored
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
project those are **generated**, not authored.
|
|
34
|
+
|
|
35
|
+
What the build actually does:
|
|
36
|
+
|
|
37
|
+
1. Compiles the TypeScript source under `src/` into deployable JavaScript.
|
|
38
|
+
2. Emits `harper-app/resources.js`, the aggregate resource module loaded by the
|
|
39
|
+
`jsResource` extension.
|
|
40
|
+
3. Emits per-resource modules such as `harper-app/resource-*.js` when the project
|
|
41
|
+
build splits resources for Harper's runtime loader.
|
|
42
|
+
4. Copies browser/static output into `harper-app/web/**` for the `static`
|
|
43
|
+
extension to serve.
|
|
44
|
+
5. Mirrors shared library output into `harper-app/lib/**` and rewrites imports
|
|
45
|
+
such as `../lib/foo.js` to `./lib/foo.js`. Fabric packages the component root
|
|
46
|
+
as a flat deploy unit, and Node resolves real paths at runtime, so imports must
|
|
47
|
+
point at files that exist inside the packaged `harper-app/` root.
|
|
48
|
+
6. Adds cache-busting `?v=` query parameters to browser-module imports when the
|
|
49
|
+
project build owns web asset versioning.
|
|
50
|
+
|
|
51
|
+
Generated Harper deploy artifacts usually include:
|
|
52
|
+
|
|
53
|
+
- `harper-app/resources.js`
|
|
54
|
+
- `harper-app/resource-*.js`
|
|
55
|
+
- `harper-app/web/**`
|
|
56
|
+
- `harper-app/lib/**`
|
|
57
|
+
|
|
58
|
+
Every lint, format, dead-code, search, or generated-artifact guard must ignore
|
|
59
|
+
those generated paths unless it is explicitly validating the build output itself.
|
|
60
|
+
When a new generated path appears, add it to every relevant ignore surface in the
|
|
61
|
+
same change; partial ignores fail later gates in non-obvious ways.
|
|
62
|
+
|
|
63
|
+
- **TypeScript under `src/` is source.** `bun run build` produces the deployable
|
|
64
|
+
Harper assets from it.
|
|
65
|
+
- **Never edit generated Harper assets directly** — change the TypeScript and
|
|
38
66
|
rebuild. See [[harper-resources]] and [[harper-component-model]].
|
|
39
67
|
- **Build before symlinking, packaging, or deploying `harper-app/`.** Deploying
|
|
40
68
|
stale artifacts ships code that does not match `src/`.
|
|
@@ -86,11 +114,45 @@ harper deploy_component \
|
|
|
86
114
|
|
|
87
115
|
- Omitting `package` deploys the current directory.
|
|
88
116
|
- `restart=true` restarts threads after deploy so new code loads.
|
|
89
|
-
- `replicated=true`
|
|
90
|
-
|
|
117
|
+
- `replicated=true` asks Harper/Fabric to apply the component deploy across the
|
|
118
|
+
cluster rather than only the node receiving the deploy request. Include it when
|
|
119
|
+
targeting Fabric or any clustered deployment.
|
|
91
120
|
- Credentials can come from `CLI_TARGET_USERNAME` / `CLI_TARGET_PASSWORD` instead of
|
|
92
121
|
inline flags — prefer that so secrets never land in shell history or tracked files.
|
|
93
122
|
|
|
123
|
+
## Replication and topology
|
|
124
|
+
|
|
125
|
+
Fabric is a distributed runtime: a project can run on one or more Harper nodes,
|
|
126
|
+
often grouped by region or environment. Your application code is packaged as a
|
|
127
|
+
component, and the data layer is replicated through Harper's database and
|
|
128
|
+
clustering model.
|
|
129
|
+
|
|
130
|
+
Keep these semantics separate:
|
|
131
|
+
|
|
132
|
+
- **Component code replication** is controlled by deploy behavior. With
|
|
133
|
+
`replicated=true`, the deployed component package should reach the cluster nodes
|
|
134
|
+
that serve the application. Without it, you may update only the target node and
|
|
135
|
+
leave other nodes running older code.
|
|
136
|
+
- **Data replication** is runtime/database behavior. Deploying code does not by
|
|
137
|
+
itself prove that existing rows, schema changes, caches, or realtime state are
|
|
138
|
+
consistent across regions or nodes.
|
|
139
|
+
- **Thread restart** is local process behavior. `restart=true` reloads code after
|
|
140
|
+
the package lands; it is not a substitute for checking every node or region that
|
|
141
|
+
receives traffic.
|
|
142
|
+
|
|
143
|
+
After a replicated deploy, verify from the topology the app actually uses:
|
|
144
|
+
|
|
145
|
+
1. Confirm the deploy command or workflow used `replicated=true` for Fabric/cluster
|
|
146
|
+
targets.
|
|
147
|
+
2. Read `harper status` or the project's Fabric status command to see the expected
|
|
148
|
+
nodes/regions.
|
|
149
|
+
3. Hit the public smoke endpoint through the production route, then hit a direct
|
|
150
|
+
node or region endpoint when the project exposes one.
|
|
151
|
+
4. For schema or data changes, verify a write/read path that proves the expected
|
|
152
|
+
data is visible where traffic can land.
|
|
153
|
+
5. If one node serves old assets or resources, treat the deploy as incomplete even
|
|
154
|
+
when the initial target node passed smoke.
|
|
155
|
+
|
|
94
156
|
## Secrets
|
|
95
157
|
|
|
96
158
|
Keep runtime secrets out of tracked files. Use environment variables, the
|