@majeanson/lac 3.4.5 → 3.5.1

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/lsp.mjs CHANGED
@@ -8861,6 +8861,10 @@ const FeatureSchema = object({
8861
8861
  lastVerifiedDate: string().regex(/^\d{4}-\d{2}-\d{2}$/, "lastVerifiedDate must be YYYY-MM-DD").optional(),
8862
8862
  codeSnippets: array(CodeSnippetSchema).optional(),
8863
8863
  implementationNotes: array(string()).optional(),
8864
+ pmSummary: string().optional(),
8865
+ testStrategy: string().optional(),
8866
+ releaseVersion: string().optional(),
8867
+ acceptanceCriteria: array(string()).optional(),
8864
8868
  fieldLocks: array(FieldLockSchema).optional(),
8865
8869
  featureLocked: boolean().optional()
8866
8870
  });
package/dist/mcp.mjs CHANGED
@@ -3778,6 +3778,10 @@ const FeatureSchema$1 = object$1({
3778
3778
  lastVerifiedDate: string$2().regex(/^\d{4}-\d{2}-\d{2}$/, "lastVerifiedDate must be YYYY-MM-DD").optional(),
3779
3779
  codeSnippets: array$1(CodeSnippetSchema$1).optional(),
3780
3780
  implementationNotes: array$1(string$2()).optional(),
3781
+ pmSummary: string$2().optional(),
3782
+ testStrategy: string$2().optional(),
3783
+ releaseVersion: string$2().optional(),
3784
+ acceptanceCriteria: array$1(string$2()).optional(),
3781
3785
  fieldLocks: array$1(FieldLockSchema$1).optional(),
3782
3786
  featureLocked: boolean$2().optional()
3783
3787
  });
@@ -8091,6 +8095,10 @@ object({
8091
8095
  lastVerifiedDate: string().regex(/^\d{4}-\d{2}-\d{2}$/, "lastVerifiedDate must be YYYY-MM-DD").optional(),
8092
8096
  codeSnippets: array(CodeSnippetSchema).optional(),
8093
8097
  implementationNotes: array(string()).optional(),
8098
+ pmSummary: string().optional(),
8099
+ testStrategy: string().optional(),
8100
+ releaseVersion: string().optional(),
8101
+ acceptanceCriteria: array(string()).optional(),
8094
8102
  fieldLocks: array(FieldLockSchema).optional(),
8095
8103
  featureLocked: boolean().optional()
8096
8104
  });
@@ -8445,6 +8453,25 @@ Return ONLY a valid JSON array of plain strings — no other text, no markdown f
8445
8453
 
8446
8454
  If there are no notable implementation notes, return an empty array: []`,
8447
8455
  userSuffix: "Extract free-form implementation notes for this feature."
8456
+ },
8457
+ pmSummary: {
8458
+ system: `You are a product manager writing for a non-technical executive audience. Given a feature.json, write a 1–2 sentence business-value summary. Focus on the outcome and the user or business benefit — not the technical implementation. Avoid words like "component", "schema", "API", "TypeScript". Write as if you are telling a stakeholder why this feature matters. Return only the summary text, no JSON wrapper, no heading.`,
8459
+ userSuffix: "Write a 1–2 sentence PM/exec summary for this feature."
8460
+ },
8461
+ testStrategy: {
8462
+ system: `You are a software testing expert. Given a feature.json, describe in 2-4 sentences how this feature should be tested. Cover: what type of tests are appropriate (unit, integration, E2E, manual), what the hardest thing to test is, and any test setup or environment requirements implied by the feature. Be specific — name the actual components or flows that need coverage. Return only the strategy text, no JSON wrapper, no heading.`,
8463
+ userSuffix: "Describe the test strategy for this feature."
8464
+ },
8465
+ releaseVersion: {
8466
+ system: `You are a software engineering analyst. Given a feature.json, return the release version string this feature first shipped in, if it can be inferred from the statusHistory dates, revisions, or annotations. If not determinable, return an empty string. Return only the version string (e.g. "3.5.0", "v2", "2026-Q2") or an empty string — nothing else.`,
8467
+ userSuffix: "Identify the release version this feature first shipped in, or return empty string if unknown."
8468
+ },
8469
+ acceptanceCriteria: {
8470
+ system: `You are a software testing expert. Given a feature.json, break the successCriteria and problem statement into 3-8 discrete, testable acceptance criteria. Each criterion must be a single concrete, verifiable statement (e.g. "Camera roll permission prompt appears on first launch only", "Denying permission shows a recovery screen with an Open Settings button"). No vague statements. No compound criteria (one thing per item).
8471
+
8472
+ Return ONLY a valid JSON array of strings — no other text:
8473
+ ["criterion 1", "criterion 2", "criterion 3"]`,
8474
+ userSuffix: "Generate structured acceptance criteria for this feature."
8448
8475
  }
8449
8476
  };
8450
8477
  const JSON_FIELDS = new Set([
@@ -8455,7 +8482,9 @@ const JSON_FIELDS = new Set([
8455
8482
  "npmPackages",
8456
8483
  "publicInterface",
8457
8484
  "externalDependencies",
8458
- "codeSnippets"
8485
+ "codeSnippets",
8486
+ "implementationNotes",
8487
+ "acceptanceCriteria"
8459
8488
  ]);
8460
8489
  const ALL_FILLABLE_FIELDS = [
8461
8490
  "analysis",
@@ -8465,6 +8494,9 @@ const ALL_FILLABLE_FIELDS = [
8465
8494
  "tags",
8466
8495
  "successCriteria",
8467
8496
  "userGuide",
8497
+ "pmSummary",
8498
+ "testStrategy",
8499
+ "acceptanceCriteria",
8468
8500
  "domain",
8469
8501
  "componentFile",
8470
8502
  "npmPackages",
@@ -8472,7 +8504,8 @@ const ALL_FILLABLE_FIELDS = [
8472
8504
  "externalDependencies",
8473
8505
  "lastVerifiedDate",
8474
8506
  "codeSnippets",
8475
- "implementationNotes"
8507
+ "implementationNotes",
8508
+ "releaseVersion"
8476
8509
  ];
8477
8510
  function getMissingFields(feature) {
8478
8511
  return ALL_FILLABLE_FIELDS.filter((field) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@majeanson/lac",
3
- "version": "3.4.5",
3
+ "version": "3.5.1",
4
4
  "description": "CLI for life-as-code — feature provenance tracking from the terminal",
5
5
  "license": "MIT",
6
6
  "repository": {