@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.
Files changed (68) hide show
  1. package/dist/configs/vitest/base.d.ts +20 -2
  2. package/dist/configs/vitest/base.d.ts.map +1 -1
  3. package/dist/configs/vitest/base.js +23 -4
  4. package/dist/configs/vitest/base.js.map +1 -1
  5. package/dist/configs/vitest/nestjs.d.ts +2 -2
  6. package/dist/configs/vitest/nestjs.d.ts.map +1 -1
  7. package/dist/configs/vitest/nestjs.js +4 -4
  8. package/dist/configs/vitest/nestjs.js.map +1 -1
  9. package/dist/configs/vitest/typescript.d.ts +2 -2
  10. package/dist/configs/vitest/typescript.d.ts.map +1 -1
  11. package/dist/configs/vitest/typescript.js +4 -4
  12. package/dist/configs/vitest/typescript.js.map +1 -1
  13. package/package.json +1 -1
  14. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  16. package/plugins/lisa-agy/plugin.json +1 -1
  17. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  20. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa-expo-agy/plugin.json +1 -1
  27. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric/skills/harper-build-and-deploy/SKILL.md +70 -8
  32. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric-agy/skills/harper-build-and-deploy/SKILL.md +70 -8
  34. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric-copilot/skills/harper-build-and-deploy/SKILL.md +70 -8
  36. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric-cursor/skills/harper-build-and-deploy/SKILL.md +70 -8
  38. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  41. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  46. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  51. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails-agy/plugin.json +1 -1
  56. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  61. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  66. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  68. package/plugins/src/harper-fabric/skills/harper-build-and-deploy/SKILL.md +70 -8
@@ -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 generated artifacts)
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
- - **TypeScript under `src/` is source.** `bun run build` compiles it into
36
- `harper-app/resources.js` and `harper-app/web/**`.
37
- - **Never edit `resources.js` or `web/**` directly** change the TypeScript and
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` replicates the deploy across all nodes in a cluster — include it
90
- when targeting Fabric/a cluster.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.166.1",
3
+ "version": "2.166.3",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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 generated artifacts)
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
- - **TypeScript under `src/` is source.** `bun run build` compiles it into
36
- `harper-app/resources.js` and `harper-app/web/**`.
37
- - **Never edit `resources.js` or `web/**` directly** change the TypeScript and
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` replicates the deploy across all nodes in a cluster — include it
90
- when targeting Fabric/a cluster.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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": "2.166.1",
3
+ "version": "2.166.3",
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"
@@ -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 generated artifacts)
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
- - **TypeScript under `src/` is source.** `bun run build` compiles it into
36
- `harper-app/resources.js` and `harper-app/web/**`.
37
- - **Never edit `resources.js` or `web/**` directly** change the TypeScript and
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` replicates the deploy across all nodes in a cluster — include it
90
- when targeting Fabric/a cluster.
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