@codyswann/lisa 4.38.8 → 4.39.0

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 (74) hide show
  1. package/all/deletions.json +136 -1
  2. package/cdk/deletions.json +8 -1
  3. package/dist/core/config.d.ts +33 -0
  4. package/dist/core/config.d.ts.map +1 -1
  5. package/dist/core/config.js.map +1 -1
  6. package/dist/core/deletion-basis.d.ts +107 -0
  7. package/dist/core/deletion-basis.d.ts.map +1 -0
  8. package/dist/core/deletion-basis.js +81 -0
  9. package/dist/core/deletion-basis.js.map +1 -0
  10. package/dist/core/lisa.d.ts.map +1 -1
  11. package/dist/core/lisa.js +18 -0
  12. package/dist/core/lisa.js.map +1 -1
  13. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  14. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  15. package/dist/core/upstream-evidence-manifest.js +13 -8
  16. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  17. package/expo/deletions.json +37 -1
  18. package/harper-fabric/deletions.json +6 -1
  19. package/nestjs/deletions.json +12 -1
  20. package/package.json +6 -5
  21. package/phaser/deletions.json +6 -1
  22. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa-agy/plugin.json +1 -1
  25. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  28. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-expo-agy/plugin.json +1 -1
  35. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  40. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  45. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  50. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  55. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails-agy/plugin.json +1 -1
  60. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  65. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  70. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  72. package/rails/deletions.json +18 -1
  73. package/scripts/check-deletion-basis.mjs +126 -0
  74. package/typescript/deletions.json +48 -0
@@ -141,5 +141,140 @@
141
141
  "scripts/setup-deploy-key.sh",
142
142
  ".coderabbit.yml",
143
143
  "HUMAN.md"
144
- ]
144
+ ],
145
+ "basis": {
146
+ ".claude/commands/project": "needs-review",
147
+ ".claude/skills/coding-philosophy": "needs-review",
148
+ ".claude/skills/project-add-test-coverage": "needs-review",
149
+ ".claude/skills/project-archive": "needs-review",
150
+ ".claude/skills/project-bootstrap": "needs-review",
151
+ ".claude/skills/project-debrief": "needs-review",
152
+ ".claude/skills/project-document": "needs-review",
153
+ ".claude/skills/project-execute": "needs-review",
154
+ ".claude/skills/project-fix-linter-error": "needs-review",
155
+ ".claude/skills/project-implement": "needs-review",
156
+ ".claude/skills/project-local-code-review": "needs-review",
157
+ ".claude/skills/project-lower-code-complexity": "needs-review",
158
+ ".claude/skills/project-plan": "needs-review",
159
+ ".claude/skills/project-reduce-max-lines": "needs-review",
160
+ ".claude/skills/project-reduce-max-lines-per-function": "needs-review",
161
+ ".claude/skills/project-research": "needs-review",
162
+ ".claude/skills/project-review": "needs-review",
163
+ ".claude/skills/project-setup": "needs-review",
164
+ ".claude/skills/project-verify": "needs-review",
165
+ ".claude/skills/prompt-complexity-scorer": "needs-review",
166
+ ".claude/skills/git:commit": "needs-review",
167
+ ".claude/skills/git:commit-and-submit-pr": "needs-review",
168
+ ".claude/skills/git:prune": "needs-review",
169
+ ".claude/skills/git:submit-pr": "needs-review",
170
+ ".claude/skills/jira:create": "needs-review",
171
+ ".claude/skills/jira:sync": "needs-review",
172
+ ".claude/skills/jira:verify": "needs-review",
173
+ ".claude/skills/lisa:review-implementation": "needs-review",
174
+ ".claude/skills/plan:add-test-coverage": "needs-review",
175
+ ".claude/skills/plan:create": "needs-review",
176
+ ".claude/skills/plan:fix-linter-error": "needs-review",
177
+ ".claude/skills/plan:implement": "needs-review",
178
+ ".claude/skills/plan:local-code-review": "needs-review",
179
+ ".claude/skills/plan:lower-code-complexity": "needs-review",
180
+ ".claude/skills/plan:reduce-max-lines": "needs-review",
181
+ ".claude/skills/plan:reduce-max-lines-per-function": "needs-review",
182
+ ".claude/skills/pull-request:review": "needs-review",
183
+ ".claude/skills/security:zap-scan": "needs-review",
184
+ ".claude/skills/sonarqube:check": "needs-review",
185
+ ".claude/skills/sonarqube:fix": "needs-review",
186
+ ".claude/skills/tasks:load": "needs-review",
187
+ ".claude/skills/tasks:sync": "needs-review",
188
+ ".claude/REFERENCE.md": "needs-review",
189
+ ".claude/commands/plan/implement.md": "needs-review",
190
+ ".claude/rules/plan-governance.md": "needs-review",
191
+ ".claude/rules/plan.md": "needs-review",
192
+ ".claude/skills/plan-create": "needs-review",
193
+ ".claude/skills/plan-implement": "needs-review",
194
+ ".claude/agents/architecture-planner.md": "needs-review",
195
+ ".claude/agents/codebase-analyzer.md": "needs-review",
196
+ ".claude/agents/codebase-locator.md": "needs-review",
197
+ ".claude/agents/codebase-pattern-finder.md": "needs-review",
198
+ ".claude/agents/consistency-checker.md": "needs-review",
199
+ ".claude/agents/product-planner.md": "needs-review",
200
+ ".claude/agents/product-reviewer.md": "needs-review",
201
+ ".claude/agents/security-planner.md": "needs-review",
202
+ ".claude/agents/spec-analyst.md": "needs-review",
203
+ ".claude/agents/tech-reviewer.md": "needs-review",
204
+ ".claude/agents/test-coverage-agent.md": "needs-review",
205
+ ".claude/agents/test-strategist.md": "needs-review",
206
+ ".claude/agents/agent-architect.md": "needs-review",
207
+ ".claude/agents/architecture-specialist.md": "needs-review",
208
+ ".claude/agents/debug-specialist.md": "needs-review",
209
+ ".claude/agents/git-history-analyzer.md": "needs-review",
210
+ ".claude/agents/hooks-expert.md": "needs-review",
211
+ ".claude/agents/implementer.md": "needs-review",
212
+ ".claude/agents/learner.md": "needs-review",
213
+ ".claude/agents/performance-specialist.md": "needs-review",
214
+ ".claude/agents/product-specialist.md": "needs-review",
215
+ ".claude/agents/quality-specialist.md": "needs-review",
216
+ ".claude/agents/security-specialist.md": "needs-review",
217
+ ".claude/agents/skill-evaluator.md": "needs-review",
218
+ ".claude/agents/slash-command-architect.md": "needs-review",
219
+ ".claude/agents/test-specialist.md": "needs-review",
220
+ ".claude/agents/verification-specialist.md": "needs-review",
221
+ ".claude/agents/web-search-researcher.md": "needs-review",
222
+ ".claude/commands/git": "needs-review",
223
+ ".claude/commands/jira": "needs-review",
224
+ ".claude/commands/lisa": "needs-review",
225
+ ".claude/commands/plan": "needs-review",
226
+ ".claude/commands/plans": "needs-review",
227
+ ".claude/commands/pull-request": "needs-review",
228
+ ".claude/commands/security": "needs-review",
229
+ ".claude/commands/sonarqube": "needs-review",
230
+ ".claude/commands/tasks": "needs-review",
231
+ ".claude/skills/agent-design-best-practices": "needs-review",
232
+ ".claude/skills/git-commit": "needs-review",
233
+ ".claude/skills/git-commit-and-submit-pr": "needs-review",
234
+ ".claude/skills/git-commit-submit-pr-and-verify": "needs-review",
235
+ ".claude/skills/git-commit-submit-pr-deploy-and-verify": "needs-review",
236
+ ".claude/skills/git-prune": "needs-review",
237
+ ".claude/skills/git-submit-pr": "needs-review",
238
+ ".claude/skills/jira-add-journey": "needs-review",
239
+ ".claude/skills/jira-create": "needs-review",
240
+ ".claude/skills/jira-evidence": "needs-review",
241
+ ".claude/skills/jira-fix": "needs-review",
242
+ ".claude/skills/jira-implement": "needs-review",
243
+ ".claude/skills/jira-journey": "needs-review",
244
+ ".claude/skills/jira-sync": "needs-review",
245
+ ".claude/skills/jira-verify": "needs-review",
246
+ ".claude/skills/lisa-review-implementation": "needs-review",
247
+ ".claude/skills/plan-add-test-coverage": "needs-review",
248
+ ".claude/skills/plan-execute": "needs-review",
249
+ ".claude/skills/plan-fix-linter-error": "needs-review",
250
+ ".claude/skills/plan-local-code-review": "needs-review",
251
+ ".claude/skills/plan-lower-code-complexity": "needs-review",
252
+ ".claude/skills/plan-reduce-max-lines": "needs-review",
253
+ ".claude/skills/plan-reduce-max-lines-per-function": "needs-review",
254
+ ".claude/skills/pull-request-review": "needs-review",
255
+ ".claude/skills/security-zap-scan": "needs-review",
256
+ ".claude/skills/skill-creator": "needs-review",
257
+ ".claude/skills/sonarqube-check": "needs-review",
258
+ ".claude/skills/sonarqube-fix": "needs-review",
259
+ ".claude/skills/tasks-load": "needs-review",
260
+ ".claude/skills/tasks-sync": "needs-review",
261
+ ".claude/hooks/check-tired-boss.sh": "needs-review",
262
+ ".claude/hooks/debug-hook.sh": "needs-review",
263
+ ".claude/hooks/enforce-plan-rules.sh": "needs-review",
264
+ ".claude/hooks/notify-ntfy.sh": "needs-review",
265
+ ".claude/hooks/setup-jira-cli.sh": "needs-review",
266
+ ".claude/hooks/sync-tasks.sh": "needs-review",
267
+ ".claude/hooks/ticket-sync-reminder.sh": "needs-review",
268
+ ".claude/hooks/track-plan-sessions.sh": "needs-review",
269
+ ".claude/hooks/verify-completion.sh": "needs-review",
270
+ ".claude/hooks/README.md": "needs-review",
271
+ ".claude/rules/verfication.md": "needs-review",
272
+ ".claude/rules/lisa.md": "needs-review",
273
+ ".claude/rules/base-rules.md": "needs-review",
274
+ ".claude/rules/coding-philosophy.md": "needs-review",
275
+ ".claude/rules/intent-routing.md": "needs-review",
276
+ ".claude/rules/security-audit-handling.md": "needs-review",
277
+ ".claude/rules/verification.md": "needs-review",
278
+ ".lisa-manifest": "needs-review"
279
+ }
145
280
  }
@@ -5,5 +5,12 @@
5
5
  "jest.cdk.ts",
6
6
  "jest.base.ts",
7
7
  "jest.thresholds.json"
8
- ]
8
+ ],
9
+ "basis": {
10
+ "jest.config.ts": "needs-review",
11
+ "jest.config.local.ts": "needs-review",
12
+ "jest.cdk.ts": "needs-review",
13
+ "jest.base.ts": "needs-review",
14
+ "jest.thresholds.json": "needs-review"
15
+ }
9
16
  }
@@ -272,6 +272,39 @@ export interface DeletionsConfig {
272
272
  * to any other path is recorded and unused.
273
273
  */
274
274
  readonly force?: Readonly<Record<string, string>>;
275
+ /**
276
+ * Why each declared path may be removed, keyed by that path.
277
+ *
278
+ * `deletions.json` authorises a removal by the path being LISTED, and nothing
279
+ * else — the manifest cannot see whether Lisa put that file in a given
280
+ * consumer's repository, because ownership is a per-consumer fact and this is
281
+ * a repo-side artifact. CodySwannGT/lisa#3656 closed the gap for
282
+ * `.github/workflows/` by reading each workflow's own ownership header, which
283
+ * covers 42 of 255 declared paths.
284
+ *
285
+ * The obvious rule for the other 213 — delete only what Lisa still ships —
286
+ * was measured and fails on 95% of them: 11 are attributable to a lane Lisa
287
+ * ships today and 202 are not, because the 202 ARE the point. They are skill
288
+ * trees Lisa renamed, and stranding them leaves every consumer carrying dead
289
+ * directories forever. So ownership stops being inferred and starts being
290
+ * declared, one of:
291
+ *
292
+ * - `owned` — Lisa installs this path today.
293
+ * - `legacy: <reason>` — Lisa shipped it once and no longer does; the reason
294
+ * names the version or ticket.
295
+ * - `needs-review` — declared before this field existed. Authorises removal
296
+ * exactly as before, so no consumer sees a behaviour change, while staying
297
+ * countable as debt rather than passing as classified.
298
+ *
299
+ * An ABSENT basis means "I cannot tell", which is deliberately distinct from
300
+ * "not owned": the uncertain case keeps the file and says so. A path wrongly
301
+ * kept is visible and fixable; a path wrongly deleted is gone from someone
302
+ * else's repository with no undo.
303
+ *
304
+ * A `force` entry is itself a basis and outranks this map.
305
+ * @see core/deletion-basis
306
+ */
307
+ readonly basis?: Readonly<Record<string, string>>;
275
308
  }
276
309
  /**
277
310
  * Result of a Lisa operation
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Why a declared path may be removed from a consumer's repository.
3
+ *
4
+ * `deletions.json` removes host files BY DESTINATION PATH ONLY. The path being
5
+ * listed is the entire authorisation: nothing between the manifest and
6
+ * `fse.remove` looks at the file's contents, its origin, or whether Lisa ever
7
+ * installed it. CodySwannGT/lisa#3656 closed that for `.github/workflows/` by
8
+ * reading each workflow's own ownership header, which covers 42 of 255 declared
9
+ * paths. This module is about the other 213.
10
+ *
11
+ * ## Why the obvious gate is not the fix
12
+ *
13
+ * The natural rule — "only delete what Lisa currently ships" — was measured
14
+ * against `main` and fails on 95% of the manifest: of the 213 non-workflow
15
+ * paths, 11 are attributable to a lane Lisa still ships and 202 are not. The
16
+ * 202 are not marginal. They are `.claude/skills/project-*`,
17
+ * `.claude/skills/git:*`, `.claude/skills/jira:*` and friends — skill trees Lisa
18
+ * renamed. Stranding them leaves every consumer carrying dead directories
19
+ * forever, which is the harm the manifest exists to prevent. A gate that causes
20
+ * the harm it was written to stop is the wrong gate.
21
+ *
22
+ * The reason it fails is structural rather than incidental: ownership is a
23
+ * per-consumer fact and the manifest is a repo-side artifact. Lisa cannot see,
24
+ * from its own tree, whether it put a given file in someone else's repository.
25
+ * No amount of matching logic closes that gap, so this module stops trying to
26
+ * infer ownership and requires it to be DECLARED.
27
+ *
28
+ * ## The grammar
29
+ *
30
+ * Every declared path carries a basis, and `force` counts as one:
31
+ *
32
+ * - `owned` — Lisa installs this path today; the lane is the evidence.
33
+ * - `legacy: <reason>` — Lisa shipped it in an older version and no longer
34
+ * does. The reason names the version or ticket. The honest home for the 202.
35
+ * - `needs-review` — declared before this field existed. Deletes exactly as it
36
+ * did before, so nothing changes for an existing consumer, but it is
37
+ * countable: debt kept visible rather than laundered as classified.
38
+ * - a `force` entry — a ruling that overrides even the workflow ownership gate.
39
+ * Unchanged by this module; its five existing entries keep working verbatim.
40
+ *
41
+ * ## What an ABSENT basis means, and why it keeps
42
+ *
43
+ * Unclassified is not "not owned" — it is "I cannot tell", and the two must be
44
+ * distinguishable or the uncertain case gets silently resolved as one of them.
45
+ * The cheap error is to keep the file: a path wrongly kept is visible and
46
+ * fixable, a path wrongly deleted is gone from someone else's repository with
47
+ * no undo. So an unclassified path is kept and announced.
48
+ *
49
+ * Two rules this deliberately does NOT implement, both learned in #3656:
50
+ *
51
+ * 1. Ownership is never inferred from a filename. A probe of the form "does
52
+ * Lisa ship a file with this name anywhere?" marks the highest-risk paths
53
+ * SAFE precisely because Lisa knows those names.
54
+ * 2. Ownership never keys on "was it modified". "The host has local work here"
55
+ * and "the host has re-armed the hazard" are the same observation on disk;
56
+ * only a declared reason separates them.
57
+ * @module core/deletion-basis
58
+ */
59
+ import type { DeletionsConfig } from "./config.js";
60
+ /** How a declared deletion path is authorised. */
61
+ export type DeletionBasisKind = "owned" | "legacy" | "needs-review" | "force" | "unclassified";
62
+ /** The resolved basis for one declared path. */
63
+ export interface DeletionBasis {
64
+ readonly kind: DeletionBasisKind;
65
+ /** Prose accompanying a `legacy` or `force` basis; empty otherwise. */
66
+ readonly reason: string;
67
+ }
68
+ /**
69
+ * Resolve why one declared path may be removed.
70
+ *
71
+ * `force` is checked first and wins: it is the strongest declaration in the
72
+ * manifest, and a path carrying one is authorised whatever else says.
73
+ * @param config - The parsed manifest.
74
+ * @param relativePath - Declared path, spelled as the manifest spells it.
75
+ * @returns The basis, or `unclassified` when the manifest does not say.
76
+ */
77
+ export declare function resolveDeletionBasis(config: DeletionsConfig, relativePath: string): DeletionBasis;
78
+ /**
79
+ * Whether a resolved basis authorises removal.
80
+ *
81
+ * `needs-review` authorises: this field lands with every existing path already
82
+ * marked, so an existing consumer sees byte-identical behaviour. The gate binds
83
+ * on paths added AFTER it, which is the whole point of shipping the mechanism
84
+ * before the prose.
85
+ * @param basis - A resolved basis.
86
+ * @returns True when the path may be removed.
87
+ */
88
+ export declare function basisAuthorisesDeletion(basis: DeletionBasis): boolean;
89
+ /**
90
+ * Every declared path in one manifest that carries no basis.
91
+ *
92
+ * This is what the authoring gate refuses on. It is deliberately separate from
93
+ * the runtime keep-decision above: the runtime rule is the fail-safe that
94
+ * protects consumers whatever manifest they have, and this is the check that
95
+ * stops an unclassified path being authored in the first place. A single
96
+ * mechanism doing both would have to choose which to be.
97
+ * @param config - The parsed manifest.
98
+ * @returns Unclassified paths, in declaration order.
99
+ */
100
+ export declare function unclassifiedDeletionPaths(config: DeletionsConfig): readonly string[];
101
+ /**
102
+ * Count declared paths by basis kind, for reporting the outstanding debt.
103
+ * @param config - The parsed manifest.
104
+ * @returns A count per kind, including zeroes.
105
+ */
106
+ export declare function countDeletionBases(config: DeletionsConfig): Readonly<Record<DeletionBasisKind, number>>;
107
+ //# sourceMappingURL=deletion-basis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deletion-basis.d.ts","sourceRoot":"","sources":["../../src/core/deletion-basis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,kDAAkD;AAClD,MAAM,MAAM,iBAAiB,GACzB,OAAO,GACP,QAAQ,GACR,cAAc,GACd,OAAO,GACP,cAAc,CAAC;AAEnB,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,MAAM,GACnB,aAAa,CAqBf;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAErE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,GACtB,SAAS,MAAM,EAAE,CAMnB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,GACtB,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAc7C"}
@@ -0,0 +1,81 @@
1
+ const NEEDS_REVIEW = "needs-review";
2
+ const OWNED = "owned";
3
+ const LEGACY_PREFIX = "legacy:";
4
+ /**
5
+ * Resolve why one declared path may be removed.
6
+ *
7
+ * `force` is checked first and wins: it is the strongest declaration in the
8
+ * manifest, and a path carrying one is authorised whatever else says.
9
+ * @param config - The parsed manifest.
10
+ * @param relativePath - Declared path, spelled as the manifest spells it.
11
+ * @returns The basis, or `unclassified` when the manifest does not say.
12
+ */
13
+ export function resolveDeletionBasis(config, relativePath) {
14
+ const forced = config.force?.[relativePath];
15
+ if (typeof forced === "string" && forced.trim() !== "")
16
+ return { kind: "force", reason: forced };
17
+ const declared = config.basis?.[relativePath];
18
+ if (typeof declared !== "string" || declared.trim() === "")
19
+ return { kind: "unclassified", reason: "" };
20
+ const value = declared.trim();
21
+ if (value === NEEDS_REVIEW)
22
+ return { kind: NEEDS_REVIEW, reason: "" };
23
+ if (value === OWNED)
24
+ return { kind: OWNED, reason: "" };
25
+ if (value.startsWith(LEGACY_PREFIX)) {
26
+ const reason = value.slice(LEGACY_PREFIX.length).trim();
27
+ // A `legacy` basis with no prose is unclassified in substance: the whole
28
+ // point of the kind is that somebody wrote down WHY, and an empty reason
29
+ // is the debt without the marker that makes it countable.
30
+ if (reason === "")
31
+ return { kind: "unclassified", reason: "" };
32
+ return { kind: "legacy", reason };
33
+ }
34
+ return { kind: "unclassified", reason: "" };
35
+ }
36
+ /**
37
+ * Whether a resolved basis authorises removal.
38
+ *
39
+ * `needs-review` authorises: this field lands with every existing path already
40
+ * marked, so an existing consumer sees byte-identical behaviour. The gate binds
41
+ * on paths added AFTER it, which is the whole point of shipping the mechanism
42
+ * before the prose.
43
+ * @param basis - A resolved basis.
44
+ * @returns True when the path may be removed.
45
+ */
46
+ export function basisAuthorisesDeletion(basis) {
47
+ return basis.kind !== "unclassified";
48
+ }
49
+ /**
50
+ * Every declared path in one manifest that carries no basis.
51
+ *
52
+ * This is what the authoring gate refuses on. It is deliberately separate from
53
+ * the runtime keep-decision above: the runtime rule is the fail-safe that
54
+ * protects consumers whatever manifest they have, and this is the check that
55
+ * stops an unclassified path being authored in the first place. A single
56
+ * mechanism doing both would have to choose which to be.
57
+ * @param config - The parsed manifest.
58
+ * @returns Unclassified paths, in declaration order.
59
+ */
60
+ export function unclassifiedDeletionPaths(config) {
61
+ const keep = new Set(config.keep ?? []);
62
+ return (config.paths ?? []).filter(p => !keep.has(p) && !basisAuthorisesDeletion(resolveDeletionBasis(config, p)));
63
+ }
64
+ /**
65
+ * Count declared paths by basis kind, for reporting the outstanding debt.
66
+ * @param config - The parsed manifest.
67
+ * @returns A count per kind, including zeroes.
68
+ */
69
+ export function countDeletionBases(config) {
70
+ return (config.paths ?? []).reduce((counts, declaredPath) => {
71
+ const { kind } = resolveDeletionBasis(config, declaredPath);
72
+ return { ...counts, [kind]: counts[kind] + 1 };
73
+ }, {
74
+ owned: 0,
75
+ legacy: 0,
76
+ [NEEDS_REVIEW]: 0,
77
+ force: 0,
78
+ unclassified: 0,
79
+ });
80
+ }
81
+ //# sourceMappingURL=deletion-basis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deletion-basis.js","sourceRoot":"","sources":["../../src/core/deletion-basis.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"lisa.d.ts","sourceRoot":"","sources":["../../src/core/lisa.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lisa.d.ts","sourceRoot":"","sources":["../../src/core/lisa.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAiCnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,iBAAiB,EAGlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAwB,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAe9D,OAAO,KAAK,EAIV,UAAU,EACV,UAAU,EAGX,MAAM,aAAa,CAAC;AAyBrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAuBpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;CAC/C;AAUD;;GAEG;AACH,qBAAa,IAAI;IAgJb,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAhJvB,OAAO,CAAC,QAAQ,CAA8C;IAE9D;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;IAChD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,cAAc,CAGpB;IACF;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB,CAA0B;IAClD;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,mBAAmB,CAAkC;IAC7D;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,sBAAsB,CAAkC;IAChE,2EAA2E;IAC3E,OAAO,CAAC,oBAAoB,CAAmC;IAC/D,4EAA4E;IAC5E,OAAO,CAAC,kCAAkC,CAAS;IACnD;;;;;OAKG;IACH,OAAO,CAAC,kCAAkC,CAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8C;IACxE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IAEpD;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAS;IAE1B;;;;OAIG;gBAEgB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,gBAAgB;IAGzC;;;;;;;;OAQG;IACH,OAAO,CAAC,oCAAoC;IAI5C;;OAEG;YACW,YAAY;IAQ1B;;OAEG;YACW,WAAW;IAUzB;;;;;;OAMG;YACW,eAAe;IAa7B;;OAEG;YACW,qBAAqB;IAyBnC;;;;;;;;;;;;;;;OAeG;YACW,oBAAoB;IAWlC;;;;OAIG;YACW,wBAAwB;IAoBtC;;;;;;;;;;;;;;;;;;;;;;OAsBG;YACW,uBAAuB;IAsCrC;;;;;;;;;;;OAWG;YACW,0BAA0B;IAqBxC;;;;;;;OAOG;YACW,2BAA2B;IAyBzC;;OAEG;YACW,gBAAgB;IAoB9B;;;OAGG;YACW,oBAAoB;IAiDlC;;;;OAIG;YACW,qBAAqB;IAkEnC;;;;;;;;;;OAUG;YACW,eAAe;IAoB7B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;YACW,iBAAiB;IAyB/B;;;OAGG;YACW,6BAA6B;IAe3C;;OAEG;YACW,iBAAiB;IAiB/B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;OAEG;YACW,eAAe;IA+C7B;;;;;;;;;;;;;;OAcG;YACW,kCAAkC;IAqDhD;;;;;;;;;;;;;;;;;;;;OAoBG;YACW,qBAAqB;IAuCnC;;;;;;OAMG;YACW,qBAAqB;IAoBnC;;;;;OAKG;YACW,aAAa;IAgB3B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;;;;;;OAOG;YACW,sBAAsB;IA0BpC;;;;;;;;;;;;;;;OAeG;YACW,qBAAqB;IAYnC;;;OAGG;YACW,QAAQ;IAQtB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;OAIG;YACW,gBAAgB;IAuB9B;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;IAiDlC;;;;;;;;;;;;;;;;;;;OAmBG;YACW,2BAA2B;IAqBzC;;;;;;;;;OASG;YACW,gBAAgB;IAoC9B;;;;;;;;OAQG;YACW,iBAAiB;IA0B/B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;YACW,cAAc;IA+E5B;;;;;;;;;;;OAWG;YACW,uBAAuB;IAqCrC;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAM7B;;;;;;;;;OASG;YACW,kBAAkB;IAoDhC;;;;;;;;;;;;;OAaG;YACW,+BAA+B;IAkD7C;;;;;;;;;;;;;;OAcG;YACW,mBAAmB;IAsEjC;;;;;;;;;;;;;OAaG;YACW,0BAA0B;IAaxC;;;;;;;;;;;;;;;;OAgBG;YACW,gCAAgC;IAoB9C;;;;;;;;;;;;;;;;;;;OAmBG;YACW,iCAAiC;IAgD/C;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAKrC;;;OAGG;YACW,kBAAkB;IAuBhC;;;;;;;OAOG;YACW,gBAAgB;IA2D9B;;;;;;;OAOG;IACH,OAAO,CAAC,0BAA0B;IAqBlC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;;;;;OAMG;IACH,OAAO,CAAC,OAAO;IAaf;;;;;;OAMG;YACW,qBAAqB;IAyBnC;;;;OAIG;YACW,QAAQ;IAatB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAsCtB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAKlB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAyEjB;;;OAGG;IACH,OAAO,CAAC,OAAO;IAMf;;OAEG;YACW,mBAAmB;IAajC;;OAEG;YACW,gBAAgB;IA+B9B;;OAEG;IACH,OAAO,CAAC,WAAW;IA4BnB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2CvB;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;;;;OAKG;YACW,WAAW;IAQzB;;;;;OAKG;YACW,qBAAqB;CAqDpC"}
package/dist/core/lisa.js CHANGED
@@ -32,6 +32,7 @@ import { COPY_STRATEGIES, createInitialCounters, harnessIncludesAgent, } from ".
32
32
  import { migrateInstructionFiles, relocateProjectLearningsLedger, } from "./instruction-files-migration.js";
33
33
  import { assertSafeLearningParents, resolveSafeLearningTarget, } from "./learnings-file-safety.js";
34
34
  import { APPLY_RECEIPT_DISPLAY_PATH } from "./apply-receipt.js";
35
+ import { basisAuthorisesDeletion, resolveDeletionBasis, } from "./deletion-basis.js";
35
36
  import { findLocalWorkflowReferences } from "./workflow-reference-guard.js";
36
37
  import { classifyWorkflowForDeletion, describeRefusal, isWorkflowDeletionPath, } from "./workflow-deletion-ownership.js";
37
38
  import { readProjectConfig, resolveLegacyProjectLearningsFile, resolveProjectLearningsFile, } from "./project-config.js";
@@ -445,6 +446,23 @@ export class Lisa {
445
446
  logger.info(`Kept (protected): ${relativePath}`);
446
447
  continue;
447
448
  }
449
+ // "I cannot tell" is a THIRD answer, and it has to be, or the uncertain
450
+ // case gets silently resolved as one of the other two. A manifest that
451
+ // does not say why a path may go does not authorise removing it: the
452
+ // cheap error is keeping a file, because a path wrongly kept is visible
453
+ // and fixable while a path wrongly deleted is gone from someone else's
454
+ // repository with no undo (CodySwannGT/lisa#3700).
455
+ //
456
+ // This is the runtime fail-safe, and it is deliberately not the same
457
+ // mechanism as the authoring check. That one refuses an unclassified
458
+ // entry at commit time; this one protects a consumer whatever manifest
459
+ // they happen to have, including one authored before either existed.
460
+ const basis = resolveDeletionBasis(deletions, relativePath);
461
+ if (!basisAuthorisesDeletion(basis)) {
462
+ logger.warn(`Kept (no declared basis): ${relativePath} — the manifest lists this path but does not say why it may be removed, so it was not.`);
463
+ this.counters.skipped++;
464
+ continue;
465
+ }
448
466
  await this.processSingleDeletion(relativePath, deletions.force?.[relativePath]);
449
467
  }
450
468
  }