@lousy-agents/cli 5.4.3 → 5.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.
@@ -42,7 +42,7 @@ Before adding any action:
42
42
  ## Runner Requirements
43
43
 
44
44
  | Workflow | Runner |
45
- |----------|--------|
45
+ | ---------- | -------- |
46
46
  | Default (all workflows) | `ubuntu-latest` |
47
47
  | `copilot-setup-steps.yml` | May use different runners as needed |
48
48
 
@@ -118,7 +118,7 @@ Testcontainers works out of the box on `ubuntu-latest` runners since they have D
118
118
  ### Environment Variables
119
119
 
120
120
  | Variable | Description | Default |
121
- |----------|-------------|---------|
121
+ | ---------- | ------------- | --------- |
122
122
  | `TESTCONTAINERS_RYUK_DISABLED` | Disable Ryuk container cleanup | `false` |
123
123
  | `TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE` | Override Docker socket path | auto-detected |
124
124
 
@@ -399,7 +399,7 @@ export class UserRepositoryImpl implements UserRepository {
399
399
  ## Import Rules Summary
400
400
 
401
401
  | From | Entities | Use Cases | Gateways/Routes/DB | Index (Root) |
402
- |------|----------|-----------|-------------------|--------------|
402
+ | ------ | ---------- | ----------- | ------------------- | -------------- |
403
403
  | Entities | ✓ | ✗ | ✗ | ✗ |
404
404
  | Use Cases | ✓ | ✓ | ✗ | ✗ |
405
405
  | Gateways/Routes/DB | ✓ | ✓ | ✓ | ✗ |
@@ -70,7 +70,7 @@ When you create an issue with the `copilot-ready` label (applied automatically b
70
70
  All acceptance criteria must use EARS (Easy Approach to Requirements Syntax) patterns:
71
71
 
72
72
  | Pattern | Template | Use When |
73
- |---------|----------|----------|
73
+ | --------- | ---------- | ---------- |
74
74
  | Ubiquitous | The `<system>` shall `<response>` | Always true, no trigger |
75
75
  | Event-driven | When `<trigger>`, the `<system>` shall `<response>` | Responding to an event |
76
76
  | State-driven | While `<state>`, the `<system>` shall `<response>` | Active during a condition |
@@ -136,7 +136,7 @@ Personas should be developed and maintained in a central location (e.g., `docs/p
136
136
  Evaluate every feature against these value types. A feature may deliver multiple.
137
137
 
138
138
  | Value Type | Question to Ask |
139
- |------------|-----------------|
139
+ | ------------ | ----------------- |
140
140
  | Commercial | Does this increase revenue or reduce cost of sale? |
141
141
  | Future | Does this save time or money later? Does it reduce technical debt? |
142
142
  | Customer | Does this increase retention or satisfaction for existing users? |
@@ -163,7 +163,7 @@ A spec has three sections that flow into each other:
163
163
  ## Personas
164
164
 
165
165
  | Persona | Impact | Notes |
166
- |---------|--------|-------|
166
+ | --------- | -------- | ------- |
167
167
  | <name> | Positive/Negative/Neutral | <brief explanation> |
168
168
 
169
169
  ## Value Assessment
@@ -21,7 +21,7 @@ Each spec follows this structure:
21
21
 
22
22
  ## Personas
23
23
  | Persona | Impact | Notes |
24
- |---------|--------|-------|
24
+ | --------- | -------- | ------- |
25
25
 
26
26
  ## Value Assessment
27
27
  - **Primary value**: <type> — <explanation>
@@ -58,7 +58,7 @@ so that I can **<outcome>**.
58
58
  Use EARS (Easy Approach to Requirements Syntax) patterns:
59
59
 
60
60
  | Pattern | Template | Use When |
61
- |---------|----------|----------|
61
+ | --------- | ---------- | ---------- |
62
62
  | Ubiquitous | The `<system>` shall `<response>` | Always true |
63
63
  | Event-driven | When `<trigger>`, the `<system>` shall `<response>` | Responding to event |
64
64
  | State-driven | While `<state>`, the `<system>` shall `<response>` | During a condition |
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "devDependencies": {
20
20
  "@biomejs/biome": "2.4.8",
21
- "@lousy-agents/mcp": "5.4.2",
21
+ "@lousy-agents/mcp": "5.5.0",
22
22
  "@modelcontextprotocol/server-sequential-thinking": "2025.12.18",
23
23
  "@testcontainers/postgresql": "11.13.0",
24
24
  "@types/node": "24.12.0",
@@ -944,14 +944,14 @@
944
944
  }
945
945
  },
946
946
  "node_modules/@lousy-agents/mcp": {
947
- "version": "5.4.2",
948
- "resolved": "https://registry.npmjs.org/@lousy-agents/mcp/-/mcp-5.4.2.tgz",
949
- "integrity": "sha512-do2+Tm05LtmCtT440uyLQrhjULK5461w9lGT9Asqxp94UzZj5XmAF7Iz5Rm/BIeNmnnLP6KaaWz/gAvyEFRSkA==",
947
+ "version": "5.5.0",
948
+ "resolved": "https://registry.npmjs.org/@lousy-agents/mcp/-/mcp-5.5.0.tgz",
949
+ "integrity": "sha512-k3fZC+VwSACJlzOAhgVdKwktk/aGKW7JgKtAHTn04e7OBgyE0tMRWU3KUykTnOyfrY1LoOqlitD2geSIsMvVIw==",
950
950
  "dev": true,
951
951
  "license": "MIT",
952
952
  "dependencies": {
953
953
  "@modelcontextprotocol/sdk": "1.27.1",
954
- "yaml": "2.8.2",
954
+ "yaml": "2.8.3",
955
955
  "zod": "4.3.6"
956
956
  },
957
957
  "bin": {
@@ -5846,9 +5846,9 @@
5846
5846
  }
5847
5847
  },
5848
5848
  "node_modules/yaml": {
5849
- "version": "2.8.2",
5850
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
5851
- "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
5849
+ "version": "2.8.3",
5850
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
5851
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
5852
5852
  "dev": true,
5853
5853
  "license": "ISC",
5854
5854
  "bin": {
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "devDependencies": {
28
28
  "@biomejs/biome": "2.4.8",
29
- "@lousy-agents/mcp": "5.4.2",
29
+ "@lousy-agents/mcp": "5.5.0",
30
30
  "@modelcontextprotocol/server-sequential-thinking": "2025.12.18",
31
31
  "@testcontainers/postgresql": "11.13.0",
32
32
  "@types/node": "24.12.0",
@@ -41,7 +41,7 @@ Before adding any action:
41
41
  ## Runner Requirements
42
42
 
43
43
  | Workflow | Runner |
44
- |----------|--------|
44
+ | ---------- | -------- |
45
45
  | Default (all workflows) | `ubuntu-latest` |
46
46
 
47
47
  ## Example CI Workflow
@@ -141,7 +141,7 @@ runMain(main);
141
141
  ## Import Rules Summary
142
142
 
143
143
  | From | Entities | Use Cases | Commands/Gateways/Lib | Index (Root) |
144
- |------|----------|-----------|----------------------|--------------|
144
+ | ------ | ---------- | ----------- | ---------------------- | -------------- |
145
145
  | Entities | ✓ | ✗ | ✗ | ✗ |
146
146
  | Use Cases | ✓ | ✓ | ✗ | ✗ |
147
147
  | Commands/Gateways/Lib | ✓ | ✓ | ✓ | ✗ |
@@ -43,7 +43,7 @@ When reviewing a spec:
43
43
  All acceptance criteria must use EARS (Easy Approach to Requirements Syntax) patterns:
44
44
 
45
45
  | Pattern | Template | Use When |
46
- |---------|----------|----------|
46
+ | --------- | ---------- | ---------- |
47
47
  | Ubiquitous | The `<system>` shall `<response>` | Always true, no trigger |
48
48
  | Event-driven | When `<trigger>`, the `<system>` shall `<response>` | Responding to an event |
49
49
  | State-driven | While `<state>`, the `<system>` shall `<response>` | Active during a condition |
@@ -21,7 +21,7 @@ Each spec follows this structure:
21
21
 
22
22
  ## Personas
23
23
  | Persona | Impact | Notes |
24
- |---------|--------|-------|
24
+ | --------- | -------- | ------- |
25
25
 
26
26
  ## Value Assessment
27
27
  - **Primary value**: <type> — <explanation>
@@ -58,7 +58,7 @@ so that I can **<outcome>**.
58
58
  Use EARS (Easy Approach to Requirements Syntax) patterns:
59
59
 
60
60
  | Pattern | Template | Use When |
61
- |---------|----------|----------|
61
+ | --------- | ---------- | ---------- |
62
62
  | Ubiquitous | The `<system>` shall `<response>` | Always true |
63
63
  | Event-driven | When `<trigger>`, the `<system>` shall `<response>` | Responding to event |
64
64
  | State-driven | While `<state>`, the `<system>` shall `<response>` | During a condition |
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@biomejs/biome": "2.4.8",
23
- "@lousy-agents/mcp": "5.4.2",
23
+ "@lousy-agents/mcp": "5.5.0",
24
24
  "@modelcontextprotocol/server-sequential-thinking": "2025.12.18",
25
25
  "@types/node": "24.12.0",
26
26
  "@upstash/context7-mcp": "2.1.4",
package/dist/index.js CHANGED
@@ -1137,19 +1137,26 @@ function composeNode(ctx, token, props, onError) {
1137
1137
  case 'block-map':
1138
1138
  case 'block-seq':
1139
1139
  case 'flow-collection':
1140
- node = composeCollection.composeCollection(CN, ctx, token, props, onError);
1141
- if (anchor)
1142
- node.anchor = anchor.source.substring(1);
1140
+ try {
1141
+ node = composeCollection.composeCollection(CN, ctx, token, props, onError);
1142
+ if (anchor)
1143
+ node.anchor = anchor.source.substring(1);
1144
+ }
1145
+ catch (error) {
1146
+ // Almost certainly here due to a stack overflow
1147
+ const message = error instanceof Error ? error.message : String(error);
1148
+ onError(token, 'RESOURCE_EXHAUSTION', message);
1149
+ }
1143
1150
  break;
1144
1151
  default: {
1145
1152
  const message = token.type === 'error'
1146
1153
  ? token.message
1147
1154
  : `Unsupported token (type: ${token.type})`;
1148
1155
  onError(token, 'UNEXPECTED_TOKEN', message);
1149
- node = composeEmptyNode(ctx, token.offset, undefined, null, props, onError);
1150
1156
  isSrcToken = false;
1151
1157
  }
1152
1158
  }
1159
+ node ?? (node = composeEmptyNode(ctx, token.offset, undefined, null, props, onError));
1153
1160
  if (anchor && node.anchor === '')
1154
1161
  onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');
1155
1162
  if (atKey &&
@@ -8123,6 +8130,7 @@ function createStringifyContext(doc, options) {
8123
8130
  nullStr: 'null',
8124
8131
  simpleKeys: false,
8125
8132
  singleQuote: null,
8133
+ trailingComma: false,
8126
8134
  trueStr: 'true',
8127
8135
  verifyAliasOrder: true
8128
8136
  }, doc.schema.toStringOptions, options);
@@ -8340,12 +8348,22 @@ function stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) {
8340
8348
  if (comment)
8341
8349
  reqNewline = true;
8342
8350
  let str = stringify.stringify(item, itemCtx, () => (comment = null));
8343
- if (i < items.length - 1)
8351
+ reqNewline || (reqNewline = lines.length > linesAtValue || str.includes('\n'));
8352
+ if (i < items.length - 1) {
8344
8353
  str += ',';
8354
+ }
8355
+ else if (ctx.options.trailingComma) {
8356
+ if (ctx.options.lineWidth > 0) {
8357
+ reqNewline || (reqNewline = lines.reduce((sum, line) => sum + line.length + 2, 2) +
8358
+ (str.length + 2) >
8359
+ ctx.options.lineWidth);
8360
+ }
8361
+ if (reqNewline) {
8362
+ str += ',';
8363
+ }
8364
+ }
8345
8365
  if (comment)
8346
8366
  str += stringifyComment.lineComment(str, itemIndent, commentString(comment));
8347
- if (!reqNewline && (lines.length > linesAtValue || str.includes('\n')))
8348
- reqNewline = true;
8349
8367
  lines.push(str);
8350
8368
  linesAtValue = lines.length;
8351
8369
  }
@@ -33416,11 +33434,25 @@ var dist = __webpack_require__(3519);
33416
33434
 
33417
33435
 
33418
33436
 
33437
+ /**
33438
+ * Skill directory locations to search for SKILL.md files.
33439
+ */ const SKILL_DIRECTORIES = [
33440
+ (0,external_node_path_.join)(".github", "skills"),
33441
+ (0,external_node_path_.join)(".claude", "skills")
33442
+ ];
33419
33443
  /**
33420
33444
  * File system implementation of the skill lint gateway.
33421
33445
  */ class FileSystemSkillLintGateway {
33422
33446
  async discoverSkills(targetDir) {
33423
- const skillsDir = (0,external_node_path_.join)(targetDir, ".github", "skills");
33447
+ const skills = [];
33448
+ for (const relativeDir of SKILL_DIRECTORIES){
33449
+ const skillsDir = (0,external_node_path_.join)(targetDir, relativeDir);
33450
+ const discovered = await this.discoverSkillsInDir(skillsDir);
33451
+ skills.push(...discovered);
33452
+ }
33453
+ return skills;
33454
+ }
33455
+ async discoverSkillsInDir(skillsDir) {
33424
33456
  if (!await file_system_utils_fileExists(skillsDir)) {
33425
33457
  return [];
33426
33458
  }
@@ -56704,7 +56736,7 @@ function hasFrontmatterDelimiters(content) {
56704
56736
  args: {
56705
56737
  skills: {
56706
56738
  type: "boolean",
56707
- description: "Lint skill frontmatter in .github/skills/",
56739
+ description: "Lint skill frontmatter in .github/skills/ and .claude/skills/",
56708
56740
  default: false
56709
56741
  },
56710
56742
  agents: {
@@ -56926,7 +56958,7 @@ You are a ${normalizedName} agent specialized in {domain/responsibility}.
56926
56958
 
56927
56959
  ;// CONCATENATED MODULE: ../core/src/entities/skill.ts
56928
56960
  /**
56929
- * Core domain entity for GitHub Copilot Agent Skills.
56961
+ * Core domain entity for agent skills (GitHub Copilot and Claude Code).
56930
56962
  * Handles name normalization, SKILL.md content generation, and lint types.
56931
56963
  */ /**
56932
56964
  * Severity levels for skill lint diagnostics.