liteagents 3.5.0 → 3.6.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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ---
9
9
 
10
+ ## [3.6.0] - 2026-09-05
11
+
12
+ ### Added
13
+ - **`scripts/frontmatter.json` is frozen and date-stamped.** `mirror.cjs
14
+ shapes` now refuses to overwrite a recorded shape with a weaker one (a
15
+ required key demoted to optional, gone entirely, or a `Bash()` style
16
+ relaxed to `null`) — it reports `WEAKENING` instead of writing. `--force`
17
+ re-records it deliberately and updates the frozen date.
18
+ - **`mirror.cjs check` detects orphaned kit files** — a file under a mirrored
19
+ tool directory with no corresponding source under `packages/claude`, left
20
+ behind when a capability moves or is removed.
21
+ - **`/branch-review`'s review-record guard.** A recorded `last-review.md` is
22
+ now validated before being trusted: its `sha:` must resolve to a real
23
+ commit and be an ancestor of `HEAD`, and its `branch:` must match the
24
+ current branch. A record that fails either check — hand-edited, corrupted,
25
+ or left over from a merged, renamed, or rebased branch — is treated as no
26
+ record at all, falling through to a full review. Previously only the
27
+ `sha:` line was compared, so a stale record resolved to a commit range
28
+ that never existed.
29
+
30
+ ### Fixed
31
+ - **`supported_variants` removed from all four `tools/*/manifest-template.json`.**
32
+ It advertised `["lite","standard","pro"]` in every installed `manifest.json`
33
+ when only one install exists, and nothing read the field.
34
+ - **`tests/installer/package-manager.test.js` was never registered** in
35
+ `tests/run-all-tests.js`, so it had never run. Standalone it failed 22 of
36
+ 44 tests against the removed three-variant installer, and wrote 11 fixtures
37
+ into `packages/` inside the repo. Rewritten against the single-variant
38
+ reality, every fixture now in an isolated temp directory, and registered.
39
+
40
+ ### Changed
41
+ - Installer test coverage: 1103 → 1153 tests. `getAvailableContent`'s
42
+ deduplication — a capability shipping both `<name>.md` and a same-named
43
+ `<name>/` asset directory must be listed once — now has a regression suite
44
+ of its own.
45
+
10
46
  ## [3.5.0] - 2026-09-05
11
47
 
12
48
  ### Breaking
@@ -349,7 +349,9 @@ class PackageManager {
349
349
  }
350
350
  }
351
351
 
352
- return { items: result, dirName: path.basename(dir) };
352
+ // A command with both a <name>.md file and a same-named <name>/
353
+ // subdirectory (bundled assets) would otherwise appear twice here.
354
+ return { items: [...new Set(result)], dirName: path.basename(dir) };
353
355
  };
354
356
 
355
357
  // Check for both plural and singular directory names
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "liteagents",
3
- "version": "3.5.0",
3
+ "version": "3.6.0",
4
4
  "description": "AI development toolkit with 10 specialized agents and 13 capabilities including live-canvas UI design with click-to-annotate feedback. Simple one-question installer for Claude, Opencode, Ampcode, and Droid.",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -100,6 +100,20 @@ was actually read rather than assuming.
100
100
  you owe an answer on — take both from the file, never from the orchestrator's
101
101
  recollection, for the same reason `/release` does. Then:
102
102
 
103
+ - **First, check the record belongs to this branch.** There is one record file
104
+ per repo, not one per branch. Validate `<that sha>` first with
105
+ `git rev-parse --verify <that sha>` — a value that fails this (e.g. a
106
+ corrupted or hand-edited record, or one starting with `-`, which git would
107
+ otherwise parse as an option) is a malformed record; treat it exactly as
108
+ **No file** below. If it validates, and its `branch:` line differs from the
109
+ current branch, or `git merge-base --is-ancestor <that sha> HEAD` exits
110
+ non-zero, the record describes a different or rewritten history — treat it
111
+ exactly as **No file** below and review the whole branch. Skipping this
112
+ resolves `<that sha>..HEAD` against a merged, renamed, or rebased sha, which
113
+ is not a subset of this branch but a range that never existed. Check both:
114
+ the branch name catches a switch, the ancestry check catches a rebase or
115
+ squash under the same name. Otherwise:
116
+
103
117
  - **`sha:` ≠ HEAD** → this is a re-review. Target the range
104
118
  `<that sha>..HEAD`. Stage 1 reads only the commits since, and stage 3
105
119
  re-verifies each recorded blocker as fixed, unfixed, or dismissed with a
@@ -100,6 +100,20 @@ was actually read rather than assuming.
100
100
  you owe an answer on — take both from the file, never from the orchestrator's
101
101
  recollection, for the same reason `/release` does. Then:
102
102
 
103
+ - **First, check the record belongs to this branch.** There is one record file
104
+ per repo, not one per branch. Validate `<that sha>` first with
105
+ `git rev-parse --verify <that sha>` — a value that fails this (e.g. a
106
+ corrupted or hand-edited record, or one starting with `-`, which git would
107
+ otherwise parse as an option) is a malformed record; treat it exactly as
108
+ **No file** below. If it validates, and its `branch:` line differs from the
109
+ current branch, or `git merge-base --is-ancestor <that sha> HEAD` exits
110
+ non-zero, the record describes a different or rewritten history — treat it
111
+ exactly as **No file** below and review the whole branch. Skipping this
112
+ resolves `<that sha>..HEAD` against a merged, renamed, or rebased sha, which
113
+ is not a subset of this branch but a range that never existed. Check both:
114
+ the branch name catches a switch, the ancestry check catches a rebase or
115
+ squash under the same name. Otherwise:
116
+
103
117
  - **`sha:` ≠ HEAD** → this is a re-review. Target the range
104
118
  `<that sha>..HEAD`. Stage 1 reads only the commits since, and stage 3
105
119
  re-verifies each recorded blocker as fixed, unfixed, or dismissed with a
@@ -97,6 +97,20 @@ was actually read rather than assuming.
97
97
  you owe an answer on — take both from the file, never from the orchestrator's
98
98
  recollection, for the same reason `/release` does. Then:
99
99
 
100
+ - **First, check the record belongs to this branch.** There is one record file
101
+ per repo, not one per branch. Validate `<that sha>` first with
102
+ `git rev-parse --verify <that sha>` — a value that fails this (e.g. a
103
+ corrupted or hand-edited record, or one starting with `-`, which git would
104
+ otherwise parse as an option) is a malformed record; treat it exactly as
105
+ **No file** below. If it validates, and its `branch:` line differs from the
106
+ current branch, or `git merge-base --is-ancestor <that sha> HEAD` exits
107
+ non-zero, the record describes a different or rewritten history — treat it
108
+ exactly as **No file** below and review the whole branch. Skipping this
109
+ resolves `<that sha>..HEAD` against a merged, renamed, or rebased sha, which
110
+ is not a subset of this branch but a range that never existed. Check both:
111
+ the branch name catches a switch, the ancestry check catches a rebase or
112
+ squash under the same name. Otherwise:
113
+
100
114
  - **`sha:` ≠ HEAD** → this is a re-review. Target the range
101
115
  `<that sha>..HEAD`. Stage 1 reads only the commits since, and stage 3
102
116
  re-verifies each recorded blocker as fixed, unfixed, or dismissed with a
@@ -96,6 +96,20 @@ was actually read rather than assuming.
96
96
  you owe an answer on — take both from the file, never from the orchestrator's
97
97
  recollection, for the same reason `/release` does. Then:
98
98
 
99
+ - **First, check the record belongs to this branch.** There is one record file
100
+ per repo, not one per branch. Validate `<that sha>` first with
101
+ `git rev-parse --verify <that sha>` — a value that fails this (e.g. a
102
+ corrupted or hand-edited record, or one starting with `-`, which git would
103
+ otherwise parse as an option) is a malformed record; treat it exactly as
104
+ **No file** below. If it validates, and its `branch:` line differs from the
105
+ current branch, or `git merge-base --is-ancestor <that sha> HEAD` exits
106
+ non-zero, the record describes a different or rewritten history — treat it
107
+ exactly as **No file** below and review the whole branch. Skipping this
108
+ resolves `<that sha>..HEAD` against a merged, renamed, or rebased sha, which
109
+ is not a subset of this branch but a range that never existed. Check both:
110
+ the branch name catches a switch, the ancestry check catches a rebase or
111
+ squash under the same name. Otherwise:
112
+
99
113
  - **`sha:` ≠ HEAD** → this is a re-review. Target the range
100
114
  `<that sha>..HEAD`. Stage 1 reads only the commits since, and stage 3
101
115
  re-verifies each recorded blocker as fixed, unfixed, or dismissed with a
@@ -6,7 +6,6 @@
6
6
  "optimization": "amplified-codegen",
7
7
  "integration_type": "cli",
8
8
  "manifest_format": "ampcode-config",
9
- "supported_variants": ["lite", "standard", "pro"],
10
9
  "agent_format": "amplified-optimized",
11
10
  "skill_compatibility": "ampcode-native",
12
11
  "resource_format": "enhanced",
@@ -6,7 +6,6 @@
6
6
  "optimization": "conversational-ai",
7
7
  "integration_type": "plugin",
8
8
  "manifest_format": "claude-plugin",
9
- "supported_variants": ["lite", "standard", "pro"],
10
9
  "agent_format": "claude-conversational",
11
10
  "skill_compatibility": "claude-native",
12
11
  "resource_format": "markdown",
@@ -6,7 +6,6 @@
6
6
  "optimization": "mobile-codegen",
7
7
  "integration_type": "cli",
8
8
  "manifest_format": "droid-config",
9
- "supported_variants": ["lite", "standard", "pro"],
10
9
  "agent_format": "mobile-optimized",
11
10
  "skill_compatibility": "droid-native",
12
11
  "resource_format": "mobile-focused",
@@ -6,7 +6,6 @@
6
6
  "optimization": "cli-codegen",
7
7
  "integration_type": "cli",
8
8
  "manifest_format": "opencode-config",
9
- "supported_variants": ["lite", "standard", "pro"],
10
9
  "agent_format": "cli-optimized",
11
10
  "skill_compatibility": "cli-native",
12
11
  "resource_format": "terminal",