@contractspec/module.workspace 1.56.0 → 1.57.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 (81) hide show
  1. package/dist/ai/prompts/code-generation.d.ts.map +1 -1
  2. package/dist/ai/prompts/spec-creation.d.ts +0 -1
  3. package/dist/ai/prompts/spec-creation.d.ts.map +1 -1
  4. package/dist/analysis/deps/graph.d.ts +0 -1
  5. package/dist/analysis/deps/graph.d.ts.map +1 -1
  6. package/dist/analysis/deps/parse-imports.d.ts.map +1 -1
  7. package/dist/analysis/diff/deep-diff.d.ts +0 -1
  8. package/dist/analysis/diff/deep-diff.d.ts.map +1 -1
  9. package/dist/analysis/diff/semantic.d.ts +0 -1
  10. package/dist/analysis/diff/semantic.d.ts.map +1 -1
  11. package/dist/analysis/example-scan.d.ts +0 -1
  12. package/dist/analysis/example-scan.d.ts.map +1 -1
  13. package/dist/analysis/feature-scan.d.ts +0 -1
  14. package/dist/analysis/feature-scan.d.ts.map +1 -1
  15. package/dist/analysis/grouping.d.ts +5 -12
  16. package/dist/analysis/grouping.d.ts.map +1 -1
  17. package/dist/analysis/grouping.js +2 -2
  18. package/dist/analysis/grouping.js.map +1 -1
  19. package/dist/analysis/impact/classifier.d.ts +0 -1
  20. package/dist/analysis/impact/classifier.d.ts.map +1 -1
  21. package/dist/analysis/impact/rules.d.ts +0 -1
  22. package/dist/analysis/impact/rules.d.ts.map +1 -1
  23. package/dist/analysis/impact/types.d.ts.map +1 -1
  24. package/dist/analysis/snapshot/normalizer.d.ts.map +1 -1
  25. package/dist/analysis/snapshot/snapshot.d.ts +0 -1
  26. package/dist/analysis/snapshot/snapshot.d.ts.map +1 -1
  27. package/dist/analysis/snapshot/types.d.ts +0 -1
  28. package/dist/analysis/snapshot/types.d.ts.map +1 -1
  29. package/dist/analysis/spec-parser.d.ts +0 -1
  30. package/dist/analysis/spec-parser.d.ts.map +1 -1
  31. package/dist/analysis/spec-parsing-utils.d.ts +0 -1
  32. package/dist/analysis/spec-parsing-utils.d.ts.map +1 -1
  33. package/dist/analysis/spec-parsing-utils.js +3 -3
  34. package/dist/analysis/spec-parsing-utils.js.map +1 -1
  35. package/dist/analysis/spec-scan.d.ts +0 -1
  36. package/dist/analysis/spec-scan.d.ts.map +1 -1
  37. package/dist/analysis/utils/matchers.js +3 -3
  38. package/dist/analysis/utils/matchers.js.map +1 -1
  39. package/dist/analysis/validate/spec-structure.d.ts +0 -1
  40. package/dist/analysis/validate/spec-structure.d.ts.map +1 -1
  41. package/dist/formatter.d.ts +0 -1
  42. package/dist/formatter.d.ts.map +1 -1
  43. package/dist/formatters/spec-markdown.d.ts +0 -1
  44. package/dist/formatters/spec-markdown.d.ts.map +1 -1
  45. package/dist/formatters/spec-to-docblock.d.ts +0 -1
  46. package/dist/formatters/spec-to-docblock.d.ts.map +1 -1
  47. package/dist/templates/app-config.d.ts.map +1 -1
  48. package/dist/templates/data-view.d.ts.map +1 -1
  49. package/dist/templates/event.d.ts +0 -1
  50. package/dist/templates/event.d.ts.map +1 -1
  51. package/dist/templates/experiment.d.ts.map +1 -1
  52. package/dist/templates/handler.d.ts.map +1 -1
  53. package/dist/templates/integration-utils.js +0 -3
  54. package/dist/templates/integration-utils.js.map +1 -1
  55. package/dist/templates/integration.d.ts.map +1 -1
  56. package/dist/templates/knowledge.d.ts.map +1 -1
  57. package/dist/templates/knowledge.js +0 -1
  58. package/dist/templates/knowledge.js.map +1 -1
  59. package/dist/templates/migration.d.ts.map +1 -1
  60. package/dist/templates/migration.js +0 -1
  61. package/dist/templates/migration.js.map +1 -1
  62. package/dist/templates/operation.d.ts +0 -1
  63. package/dist/templates/operation.d.ts.map +1 -1
  64. package/dist/templates/presentation.d.ts +0 -1
  65. package/dist/templates/presentation.d.ts.map +1 -1
  66. package/dist/templates/telemetry.d.ts.map +1 -1
  67. package/dist/templates/utils.d.ts.map +1 -1
  68. package/dist/templates/workflow-runner.d.ts.map +1 -1
  69. package/dist/templates/workflow.d.ts +0 -1
  70. package/dist/templates/workflow.d.ts.map +1 -1
  71. package/dist/types/analysis-types.d.ts +0 -1
  72. package/dist/types/analysis-types.d.ts.map +1 -1
  73. package/dist/types/generation-types.d.ts +0 -1
  74. package/dist/types/generation-types.d.ts.map +1 -1
  75. package/dist/types/llm-types.d.ts +0 -1
  76. package/dist/types/llm-types.d.ts.map +1 -1
  77. package/dist/types/rulesync-types.d.ts +0 -1
  78. package/dist/types/rulesync-types.d.ts.map +1 -1
  79. package/dist/types/spec-types.d.ts +1 -2
  80. package/dist/types/spec-types.d.ts.map +1 -1
  81. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"code-generation.d.ts","names":[],"sources":["../../../src/ai/prompts/code-generation.ts"],"sourcesContent":[],"mappings":";;AAGA;AA0BA;AA0BgB,iBApDA,kBAAA,CAoDe,QAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AA2B/B;AA2CA;;iBAhGgB,oBAAA;;;;iBA0BA,eAAA;;;;iBA2BA,eAAA;;;;iBA2CA,sBAAA,CAAA"}
1
+ {"version":3,"file":"code-generation.d.ts","names":[],"sources":["../../../src/ai/prompts/code-generation.ts"],"mappings":";;AAGA;;iBAAgB,kBAAA,CAAmB,QAAA;;;AA0BnC;iBAAgB,oBAAA,CAAqB,QAAA;;;;iBA0BrB,eAAA,CAAgB,QAAA;;;;iBA2BhB,eAAA,CACd,QAAA,UACA,kBAAA,UACA,QAAA;AAHF;;;AAAA,iBA2CgB,sBAAA,CAAA"}
@@ -2,7 +2,6 @@ import { PresentationKind } from "../../types/spec-types.js";
2
2
  import { OpKind } from "@contractspec/lib.contracts";
3
3
 
4
4
  //#region src/ai/prompts/spec-creation.d.ts
5
-
6
5
  /**
7
6
  * Build prompt for creating operation spec from description
8
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"spec-creation.d.ts","names":[],"sources":["../../../src/ai/prompts/spec-creation.ts"],"sourcesContent":[],"mappings":";;;;;;;AAMA;AA4BgB,iBA5BA,wBAAA,CA4BoB,WAAA,EAAA,MAAA,EAAA,IAAA,EA1B5B,MA0B4B,CAAA,EAAA,MAAA;AAqBpC;AAoCA;AAiBA;iBA1EgB,oBAAA;;;;iBAqBA,2BAAA,4BAER;;;;iBAkCQ,eAAA,CAAA;;;;iBAiBA,iBAAA"}
1
+ {"version":3,"file":"spec-creation.d.ts","names":[],"sources":["../../../src/ai/prompts/spec-creation.ts"],"mappings":";;;;;;AAMA;iBAAgB,wBAAA,CACd,WAAA,UACA,IAAA,EAAM,MAAA;;;;iBA0BQ,oBAAA,CAAqB,WAAA;;;;iBAqBrB,2BAAA,CACd,WAAA,UACA,IAAA,EAAM,gBAAA;;;;iBAkCQ,eAAA,CAAA;AApChB;;;AAAA,iBAqDgB,iBAAA,CACd,UAAA,UACA,QAAA"}
@@ -1,7 +1,6 @@
1
1
  import { ContractGraph, ContractNode } from "../../types/analysis-types.js";
2
2
 
3
3
  //#region src/analysis/deps/graph.d.ts
4
-
5
4
  /**
6
5
  * Build reverse edges (dependents) for all nodes in the graph.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"graph.d.ts","names":[],"sources":["../../../src/analysis/deps/graph.ts"],"sourcesContent":[],"mappings":";;;;AAwFA;AAsBA;AAOA;iBAzGgB,iBAAA,QAAyB;;;;iBAsBzB,YAAA,QAAoB;;;;iBAoCpB,uBAAA,QACP;;;;;;;iBAiBO,KAAA,QAAa;;;;iBAsBb,mBAAA,CAAA,GAAuB;;;;iBAOvB,eAAA,QACP"}
1
+ {"version":3,"file":"graph.d.ts","names":[],"sources":["../../../src/analysis/deps/graph.ts"],"mappings":";;;;;AAkCA;iBAtBgB,iBAAA,CAAkB,KAAA,EAAO,aAAA;;;;iBAsBzB,YAAA,CAAa,KAAA,EAAO,aAAA;;;;iBAoCpB,uBAAA,CACd,KAAA,EAAO,aAAA;EACJ,QAAA;EAAkB,OAAA;AAAA;;;AAgBvB;iBAAgB,KAAA,CAAM,KAAA,EAAO,aAAA;;;;iBAsBb,mBAAA,CAAA,GAAuB,aAAA;;;;iBAOvB,eAAA,CACd,KAAA,EAAO,aAAA,EACP,GAAA,UACA,IAAA,UACA,YAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"parse-imports.d.ts","names":[],"sources":["../../../src/analysis/deps/parse-imports.ts"],"sourcesContent":[],"mappings":";;AAaA;;;;;;;;;;;iBAAgB,sBAAA"}
1
+ {"version":3,"file":"parse-imports.d.ts","names":[],"sources":["../../../src/analysis/deps/parse-imports.ts"],"mappings":";;AAaA;;;;;;;;;;;iBAAgB,sBAAA,CACd,UAAA,UACA,aAAA"}
@@ -2,7 +2,6 @@ import { SemanticDiffItem } from "../../types/analysis-types.js";
2
2
  import { FieldSnapshot, IoSnapshot } from "../snapshot/types.js";
3
3
 
4
4
  //#region src/analysis/diff/deep-diff.d.ts
5
-
6
5
  /**
7
6
  * Deep diff options.
8
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"deep-diff.d.ts","names":[],"sources":["../../../src/analysis/diff/deep-diff.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA8CgB,UAjCC,eAAA,CAiCgB;EACJ;EAAf,YAAA,CAAA,EAAA,OAAA;EACe;EAAf,UAAA,CAAA,EAAA,MAAA;;;;AA+Dd;AACQ,iBAzFQ,aAAA,CAyFR,IAAA,EAxFA,UAwFA,EAAA,IAAA,EAvFA,UAuFA,EAAA,OAAA,CAAA,EAtFG,eAsFH,CAAA,EArFL,gBAqFK,EAAA;;;;AAIW,iBAtEH,iBAAA,CAsEG,UAAA,EArEL,MAqEK,CAAA,MAAA,EArEU,aAqEV,CAAA,EAAA,UAAA,EApEL,MAoEK,CAAA,MAAA,EApEU,aAoEV,CAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAlER,eAkEQ,CAAA,EAjEhB,gBAiEgB,EAAA;AAwGnB;;;iBA7GgB,gBAAA,OACR,qBACA,wCAEI,kBACT;;;;iBAwGa,gBAAA,OACR"}
1
+ {"version":3,"file":"deep-diff.d.ts","names":[],"sources":["../../../src/analysis/diff/deep-diff.ts"],"mappings":";;;;;AAuBA;;UAViB,eAAA;EAWT;EATN,YAAA;EAWS;EATT,UAAA;AAAA;;;;iBAMc,aAAA,CACd,IAAA,EAAM,UAAA,EACN,IAAA,EAAM,UAAA,EACN,OAAA,GAAS,eAAA,GACR,gBAAA;;;;iBAmBa,iBAAA,CACd,UAAA,EAAY,MAAA,SAAe,aAAA,GAC3B,UAAA,EAAY,MAAA,SAAe,aAAA,GAC3B,UAAA,UACA,OAAA,GAAS,eAAA,GACR,gBAAA;;;AALH;iBAiEgB,gBAAA,CACd,IAAA,EAAM,aAAA,EACN,IAAA,EAAM,aAAA,EACN,IAAA,UACA,QAAA,GAAU,eAAA,GACT,gBAAA;;;;iBAwGa,gBAAA,CACd,IAAA,EAAM,gBAAA,EACN,OAAA"}
@@ -1,7 +1,6 @@
1
1
  import { SemanticDiffItem, SemanticDiffOptions } from "../../types/analysis-types.js";
2
2
 
3
3
  //#region src/analysis/diff/semantic.d.ts
4
-
5
4
  /**
6
5
  * Compute semantic differences between two spec sources.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"semantic.d.ts","names":[],"sources":["../../../src/analysis/diff/semantic.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAegB,mBAAA,uEAKL,sBACR"}
1
+ {"version":3,"file":"semantic.d.ts","names":[],"sources":["../../../src/analysis/diff/semantic.ts"],"mappings":";;;;;;iBAegB,mBAAA,CACd,KAAA,UACA,KAAA,UACA,KAAA,UACA,KAAA,UACA,OAAA,GAAS,mBAAA,GACR,gBAAA"}
@@ -1,7 +1,6 @@
1
1
  import { ExampleScanResult } from "../types/analysis-types.js";
2
2
 
3
3
  //#region src/analysis/example-scan.d.ts
4
-
5
4
  /**
6
5
  * Check if a file is an example file based on naming conventions.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"example-scan.d.ts","names":[],"sources":["../../src/analysis/example-scan.ts"],"sourcesContent":[],"mappings":";;;;;;AAWA;AAOgB,iBAPA,aAAA,CAUb,QAAA,EAAA,MAAiB,CAAA,EAAA,OAAA;;;;iBAHJ,iBAAA,kCAGb"}
1
+ {"version":3,"file":"example-scan.d.ts","names":[],"sources":["../../src/analysis/example-scan.ts"],"mappings":";;;;;AAWA;iBAAgB,aAAA,CAAc,QAAA;;;;iBAOd,iBAAA,CACd,IAAA,UACA,QAAA,WACC,iBAAA"}
@@ -1,7 +1,6 @@
1
1
  import { FeatureScanResult } from "../types/analysis-types.js";
2
2
 
3
3
  //#region src/analysis/feature-scan.d.ts
4
-
5
4
  /**
6
5
  * Check if a file is a feature file based on naming conventions.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"feature-scan.d.ts","names":[],"sources":["../../src/analysis/feature-scan.ts"],"sourcesContent":[],"mappings":";;;;;;AAWA;AAOgB,iBAPA,aAAA,CAUb,QAAA,EAAA,MAAiB,CAAA,EAAA,OAAA;;;;iBAHJ,iBAAA,kCAGb"}
1
+ {"version":3,"file":"feature-scan.d.ts","names":[],"sources":["../../src/analysis/feature-scan.ts"],"mappings":";;;;;AAWA;iBAAgB,aAAA,CAAc,QAAA;;;;iBAOd,iBAAA,CACd,IAAA,UACA,QAAA,WACC,iBAAA"}
@@ -2,7 +2,6 @@ import { Stability } from "../types/spec-types.js";
2
2
  import { FeatureScanResult, SpecScanResult } from "../types/analysis-types.js";
3
3
 
4
4
  //#region src/analysis/grouping.d.ts
5
-
6
5
  /**
7
6
  * Filter criteria for spec scan results.
8
7
  */
@@ -33,17 +32,11 @@ interface GroupedItems<T> {
33
32
  * Pre-built grouping strategies for spec scan results.
34
33
  */
35
34
  declare const SpecGroupingStrategies: {
36
- /** Group by first tag. */
37
- byTag: (item: SpecScanResult) => string;
38
- /** Group by first owner. */
39
- byOwner: (item: SpecScanResult) => string;
40
- /** Group by domain (first segment of name). */
41
- byDomain: (item: SpecScanResult) => string;
42
- /** Group by stability. */
43
- byStability: (item: SpecScanResult) => string;
44
- /** Group by spec type. */
45
- bySpecType: (item: SpecScanResult) => string;
46
- /** Group by file directory. */
35
+ /** Group by first tag. */byTag: (item: SpecScanResult) => string; /** Group by first owner. */
36
+ byOwner: (item: SpecScanResult) => string; /** Group by domain (first segment of name). */
37
+ byDomain: (item: SpecScanResult) => string; /** Group by stability. */
38
+ byStability: (item: SpecScanResult) => string; /** Group by spec type. */
39
+ bySpecType: (item: SpecScanResult) => string; /** Group by file directory. */
47
40
  byDirectory: (item: SpecScanResult) => string;
48
41
  };
49
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"grouping.d.ts","names":[],"sources":["../../src/analysis/grouping.ts"],"sourcesContent":[],"mappings":";;;;;AAmCA;AAQA;;AAKkB,UAlCD,UAAA,CAkCC;EAGC;EASG,IAAA,CAAA,EAAA,MAAA,EAAA;EAGD;EAGC,MAAA,CAAA,EAAA,MAAA,EAAA;EAAc;EAUpB,SAAA,CAAA,EAxDF,SAwDa,EAAA;EAClB;EACC,QAAA,CAAA,EAxDG,cAwDH,CAAA,UAAA,CAAA,EAAA;EACP;EAAc,WAAA,CAAA,EAAA,MAAA;AAiDjB;;;;AAGe,KArGH,UAqGG,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,EArGoB,CAqGpB,EAAA,GAAA,MAAA;;;AAmBf;AACS,UApHQ,YAoHR,CAAA,CAAA,CAAA,CAAA;EACW,GAAA,EAAA,MAAA;EAAX,KAAA,EAnHA,CAmHA,EAAA;;;;AAWT;AAagB,cArIH,sBAqI8B,EAAA;EAa3B;EAWA,KAAA,EAAA,CAAA,IAAA,EA3JA,cA2Jc,EAAA,GAAA,MAAA;EAClB;EACF,OAAA,EAAA,CAAA,IAAA,EA1JQ,cA0JR,EAAA,GAAA,MAAA;EACP;EAAiB,QAAA,EAAA,CAAA,IAAA,EAxJD,cAwJC,EAAA,GAAA,MAAA;;sBA/IE;;qBAGD;;sBAGC;;;;;iBAUN,WAAA,QACP,0BACC,aACP;;;;iBAiDa,qBACP,YACA,WAAW,KACjB,YAAY;;;;iBAmBC,4BACP,YACA,WAAW,KACjB,aAAa;;;;iBAUA,iBAAA,QAAyB;;;;iBAazB,mBAAA,QAA2B;;;;iBAa3B,oBAAA,QAA4B;;;;iBAW5B,cAAA,WACJ,6BACF,aACP"}
1
+ {"version":3,"file":"grouping.d.ts","names":[],"sources":["../../src/analysis/grouping.ts"],"mappings":";;;;;;;UAciB,UAAA;EAMf;EAJA,IAAA;EAMA;EAJA,MAAA;EAMA;EAJA,SAAA,GAAY,SAAA;EAID;EAFX,QAAA,GAAW,cAAA;EAQS;EANpB,WAAA;AAAA;;;;KAMU,UAAA,OAAiB,IAAA,EAAM,CAAA;;AAKnC;;UAAiB,YAAA;EACf,GAAA;EACA,KAAA,EAAO,CAAA;AAAA;;;;cAMI,sBAAA;EAAA,wCAEG,cAAA;kBAGE,cAAA,aAAA;mBAGC,cAAA,aASG;sBAAA,cAAA,aAMA;qBAHD,cAAA,aAGe;sBAAd,cAAA;AAAA;;;;iBAUN,WAAA,CACd,KAAA,EAAO,cAAA,IACP,MAAA,EAAQ,UAAA,GACP,cAAA;;;;iBAiDa,UAAA,GAAA,CACd,KAAA,EAAO,CAAA,IACP,KAAA,EAAO,UAAA,CAAW,CAAA,IACjB,GAAA,SAAY,CAAA;;;;iBAmBC,iBAAA,GAAA,CACd,KAAA,EAAO,CAAA,IACP,KAAA,EAAO,UAAA,CAAW,CAAA,IACjB,YAAA,CAAa,CAAA;;;;iBAUA,iBAAA,CAAkB,KAAA,EAAO,cAAA;;;AAvFzC;iBAoGgB,mBAAA,CAAoB,KAAA,EAAO,cAAA;;;;iBAa3B,oBAAA,CAAqB,KAAA,EAAO,cAAA;;;;iBAW5B,cAAA,CACd,QAAA,EAAU,iBAAA,IACV,MAAA,EAAQ,UAAA,GACP,iBAAA"}
@@ -59,9 +59,9 @@ function groupSpecs(items, keyFn) {
59
59
  */
60
60
  function groupSpecsToArray(items, keyFn) {
61
61
  const map = groupSpecs(items, keyFn);
62
- return Array.from(map.entries()).map(([key, items$1]) => ({
62
+ return Array.from(map.entries()).map(([key, items]) => ({
63
63
  key,
64
- items: items$1
64
+ items
65
65
  })).sort((a, b) => a.key.localeCompare(b.key));
66
66
  }
67
67
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"grouping.js","names":["items"],"sources":["../../src/analysis/grouping.ts"],"sourcesContent":["/**\n * Grouping and filtering utilities for ContractSpec workspace analysis.\n * Provides services to filter and group scan results.\n */\n\nimport type {\n FeatureScanResult,\n SpecScanResult,\n} from '../types/analysis-types';\nimport type { Stability } from '../types/spec-types';\n\n/**\n * Filter criteria for spec scan results.\n */\nexport interface SpecFilter {\n /** Filter by tags (item must have at least one matching tag) */\n tags?: string[];\n /** Filter by owners (item must have at least one matching owner) */\n owners?: string[];\n /** Filter by stability levels */\n stability?: Stability[];\n /** Filter by spec type */\n specType?: SpecScanResult['specType'][];\n /** Filter by name pattern (glob) */\n namePattern?: string;\n}\n\n/**\n * Grouping key function type.\n */\nexport type GroupKeyFn<T> = (item: T) => string;\n\n/**\n * Grouped items result.\n */\nexport interface GroupedItems<T> {\n key: string;\n items: T[];\n}\n\n/**\n * Pre-built grouping strategies for spec scan results.\n */\nexport const SpecGroupingStrategies = {\n /** Group by first tag. */\n byTag: (item: SpecScanResult): string => item.tags?.[0] ?? 'untagged',\n\n /** Group by first owner. */\n byOwner: (item: SpecScanResult): string => item.owners?.[0] ?? 'unowned',\n\n /** Group by domain (first segment of name). */\n byDomain: (item: SpecScanResult): string => {\n const key = item.key ?? '';\n if (key.includes('.')) {\n return key.split('.')[0] ?? 'default';\n }\n return 'default';\n },\n\n /** Group by stability. */\n byStability: (item: SpecScanResult): string => item.stability ?? 'stable',\n\n /** Group by spec type. */\n bySpecType: (item: SpecScanResult): string => item.specType,\n\n /** Group by file directory. */\n byDirectory: (item: SpecScanResult): string => {\n const parts = item.filePath.split('/');\n // Return parent directory\n return parts.slice(0, -1).join('/') || '.';\n },\n};\n\n/**\n * Filter specs by criteria.\n */\nexport function filterSpecs(\n specs: SpecScanResult[],\n filter: SpecFilter\n): SpecScanResult[] {\n return specs.filter((spec) => {\n // Filter by tags\n if (filter.tags?.length) {\n const hasMatchingTag = filter.tags.some((tag) =>\n spec.tags?.includes(tag)\n );\n if (!hasMatchingTag) return false;\n }\n\n // Filter by owners\n if (filter.owners?.length) {\n const hasMatchingOwner = filter.owners.some((owner) =>\n spec.owners?.includes(owner)\n );\n if (!hasMatchingOwner) return false;\n }\n\n // Filter by stability\n if (filter.stability?.length) {\n if (!filter.stability.includes(spec.stability ?? 'stable')) {\n return false;\n }\n }\n\n // Filter by spec type\n if (filter.specType?.length) {\n if (!filter.specType.includes(spec.specType)) {\n return false;\n }\n }\n\n // Filter by name pattern\n if (filter.namePattern) {\n const key = spec.key ?? '';\n const pattern = filter.namePattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n const regex = new RegExp(`^${pattern}$`, 'i');\n if (!regex.test(key)) return false;\n }\n\n return true;\n });\n}\n\n/**\n * Group specs by key function.\n */\nexport function groupSpecs<T>(\n items: T[],\n keyFn: GroupKeyFn<T>\n): Map<string, T[]> {\n const groups = new Map<string, T[]>();\n\n for (const item of items) {\n const key = keyFn(item);\n const existing = groups.get(key);\n if (existing) {\n existing.push(item);\n } else {\n groups.set(key, [item]);\n }\n }\n\n return groups;\n}\n\n/**\n * Group specs and return as array.\n */\nexport function groupSpecsToArray<T>(\n items: T[],\n keyFn: GroupKeyFn<T>\n): GroupedItems<T>[] {\n const map = groupSpecs(items, keyFn);\n return Array.from(map.entries())\n .map(([key, items]) => ({ key, items }))\n .sort((a, b) => a.key.localeCompare(b.key));\n}\n\n/**\n * Get unique tags from spec results.\n */\nexport function getUniqueSpecTags(specs: SpecScanResult[]): string[] {\n const tags = new Set<string>();\n for (const spec of specs) {\n for (const tag of spec.tags ?? []) {\n tags.add(tag);\n }\n }\n return Array.from(tags).sort();\n}\n\n/**\n * Get unique owners from spec results.\n */\nexport function getUniqueSpecOwners(specs: SpecScanResult[]): string[] {\n const owners = new Set<string>();\n for (const spec of specs) {\n for (const owner of spec.owners ?? []) {\n owners.add(owner);\n }\n }\n return Array.from(owners).sort();\n}\n\n/**\n * Get unique domains from spec results.\n */\nexport function getUniqueSpecDomains(specs: SpecScanResult[]): string[] {\n const domains = new Set<string>();\n for (const spec of specs) {\n domains.add(SpecGroupingStrategies.byDomain(spec));\n }\n return Array.from(domains).sort();\n}\n\n/**\n * Filter features by criteria.\n */\nexport function filterFeatures(\n features: FeatureScanResult[],\n filter: SpecFilter\n): FeatureScanResult[] {\n return features.filter((feature) => {\n // Filter by tags\n if (filter.tags?.length) {\n const hasMatchingTag = filter.tags.some((tag) =>\n feature.tags?.includes(tag)\n );\n if (!hasMatchingTag) return false;\n }\n\n // Filter by owners\n if (filter.owners?.length) {\n const hasMatchingOwner = filter.owners.some((owner) =>\n feature.owners?.includes(owner)\n );\n if (!hasMatchingOwner) return false;\n }\n\n // Filter by stability\n if (filter.stability?.length) {\n if (!filter.stability.includes(feature.stability ?? 'stable')) {\n return false;\n }\n }\n\n // Filter by name pattern\n if (filter.namePattern) {\n const pattern = filter.namePattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n const regex = new RegExp(`^${pattern}$`, 'i');\n if (!regex.test(feature.key)) return false;\n }\n\n return true;\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"grouping.js","names":[],"sources":["../../src/analysis/grouping.ts"],"sourcesContent":["/**\n * Grouping and filtering utilities for ContractSpec workspace analysis.\n * Provides services to filter and group scan results.\n */\n\nimport type {\n FeatureScanResult,\n SpecScanResult,\n} from '../types/analysis-types';\nimport type { Stability } from '../types/spec-types';\n\n/**\n * Filter criteria for spec scan results.\n */\nexport interface SpecFilter {\n /** Filter by tags (item must have at least one matching tag) */\n tags?: string[];\n /** Filter by owners (item must have at least one matching owner) */\n owners?: string[];\n /** Filter by stability levels */\n stability?: Stability[];\n /** Filter by spec type */\n specType?: SpecScanResult['specType'][];\n /** Filter by name pattern (glob) */\n namePattern?: string;\n}\n\n/**\n * Grouping key function type.\n */\nexport type GroupKeyFn<T> = (item: T) => string;\n\n/**\n * Grouped items result.\n */\nexport interface GroupedItems<T> {\n key: string;\n items: T[];\n}\n\n/**\n * Pre-built grouping strategies for spec scan results.\n */\nexport const SpecGroupingStrategies = {\n /** Group by first tag. */\n byTag: (item: SpecScanResult): string => item.tags?.[0] ?? 'untagged',\n\n /** Group by first owner. */\n byOwner: (item: SpecScanResult): string => item.owners?.[0] ?? 'unowned',\n\n /** Group by domain (first segment of name). */\n byDomain: (item: SpecScanResult): string => {\n const key = item.key ?? '';\n if (key.includes('.')) {\n return key.split('.')[0] ?? 'default';\n }\n return 'default';\n },\n\n /** Group by stability. */\n byStability: (item: SpecScanResult): string => item.stability ?? 'stable',\n\n /** Group by spec type. */\n bySpecType: (item: SpecScanResult): string => item.specType,\n\n /** Group by file directory. */\n byDirectory: (item: SpecScanResult): string => {\n const parts = item.filePath.split('/');\n // Return parent directory\n return parts.slice(0, -1).join('/') || '.';\n },\n};\n\n/**\n * Filter specs by criteria.\n */\nexport function filterSpecs(\n specs: SpecScanResult[],\n filter: SpecFilter\n): SpecScanResult[] {\n return specs.filter((spec) => {\n // Filter by tags\n if (filter.tags?.length) {\n const hasMatchingTag = filter.tags.some((tag) =>\n spec.tags?.includes(tag)\n );\n if (!hasMatchingTag) return false;\n }\n\n // Filter by owners\n if (filter.owners?.length) {\n const hasMatchingOwner = filter.owners.some((owner) =>\n spec.owners?.includes(owner)\n );\n if (!hasMatchingOwner) return false;\n }\n\n // Filter by stability\n if (filter.stability?.length) {\n if (!filter.stability.includes(spec.stability ?? 'stable')) {\n return false;\n }\n }\n\n // Filter by spec type\n if (filter.specType?.length) {\n if (!filter.specType.includes(spec.specType)) {\n return false;\n }\n }\n\n // Filter by name pattern\n if (filter.namePattern) {\n const key = spec.key ?? '';\n const pattern = filter.namePattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n const regex = new RegExp(`^${pattern}$`, 'i');\n if (!regex.test(key)) return false;\n }\n\n return true;\n });\n}\n\n/**\n * Group specs by key function.\n */\nexport function groupSpecs<T>(\n items: T[],\n keyFn: GroupKeyFn<T>\n): Map<string, T[]> {\n const groups = new Map<string, T[]>();\n\n for (const item of items) {\n const key = keyFn(item);\n const existing = groups.get(key);\n if (existing) {\n existing.push(item);\n } else {\n groups.set(key, [item]);\n }\n }\n\n return groups;\n}\n\n/**\n * Group specs and return as array.\n */\nexport function groupSpecsToArray<T>(\n items: T[],\n keyFn: GroupKeyFn<T>\n): GroupedItems<T>[] {\n const map = groupSpecs(items, keyFn);\n return Array.from(map.entries())\n .map(([key, items]) => ({ key, items }))\n .sort((a, b) => a.key.localeCompare(b.key));\n}\n\n/**\n * Get unique tags from spec results.\n */\nexport function getUniqueSpecTags(specs: SpecScanResult[]): string[] {\n const tags = new Set<string>();\n for (const spec of specs) {\n for (const tag of spec.tags ?? []) {\n tags.add(tag);\n }\n }\n return Array.from(tags).sort();\n}\n\n/**\n * Get unique owners from spec results.\n */\nexport function getUniqueSpecOwners(specs: SpecScanResult[]): string[] {\n const owners = new Set<string>();\n for (const spec of specs) {\n for (const owner of spec.owners ?? []) {\n owners.add(owner);\n }\n }\n return Array.from(owners).sort();\n}\n\n/**\n * Get unique domains from spec results.\n */\nexport function getUniqueSpecDomains(specs: SpecScanResult[]): string[] {\n const domains = new Set<string>();\n for (const spec of specs) {\n domains.add(SpecGroupingStrategies.byDomain(spec));\n }\n return Array.from(domains).sort();\n}\n\n/**\n * Filter features by criteria.\n */\nexport function filterFeatures(\n features: FeatureScanResult[],\n filter: SpecFilter\n): FeatureScanResult[] {\n return features.filter((feature) => {\n // Filter by tags\n if (filter.tags?.length) {\n const hasMatchingTag = filter.tags.some((tag) =>\n feature.tags?.includes(tag)\n );\n if (!hasMatchingTag) return false;\n }\n\n // Filter by owners\n if (filter.owners?.length) {\n const hasMatchingOwner = filter.owners.some((owner) =>\n feature.owners?.includes(owner)\n );\n if (!hasMatchingOwner) return false;\n }\n\n // Filter by stability\n if (filter.stability?.length) {\n if (!filter.stability.includes(feature.stability ?? 'stable')) {\n return false;\n }\n }\n\n // Filter by name pattern\n if (filter.namePattern) {\n const pattern = filter.namePattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n const regex = new RegExp(`^${pattern}$`, 'i');\n if (!regex.test(feature.key)) return false;\n }\n\n return true;\n });\n}\n"],"mappings":"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"}
@@ -3,7 +3,6 @@ import { SpecSnapshot } from "../snapshot/types.js";
3
3
  import { ClassifyOptions, ImpactResult } from "./types.js";
4
4
 
5
5
  //#region src/analysis/impact/classifier.d.ts
6
-
7
6
  /**
8
7
  * Classify the impact of changes between base and head snapshots.
9
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"classifier.d.ts","names":[],"sources":["../../../src/analysis/impact/classifier.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;iBA0BgB,cAAA,YACH,2BACA,uBACJ,8BACE,kBACR"}
1
+ {"version":3,"file":"classifier.d.ts","names":[],"sources":["../../../src/analysis/impact/classifier.ts"],"mappings":";;;;;;;;;;;;;;iBA0BgB,cAAA,CACd,SAAA,EAAW,YAAA,IACX,SAAA,EAAW,YAAA,IACX,KAAA,EAAO,gBAAA,IACP,OAAA,GAAS,eAAA,GACR,YAAA"}
@@ -1,7 +1,6 @@
1
1
  import { ImpactRule, ImpactSeverity } from "./types.js";
2
2
 
3
3
  //#region src/analysis/impact/rules.d.ts
4
-
5
4
  /**
6
5
  * Default breaking change rules.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.ts","names":[],"sources":["../../../src/analysis/impact/rules.ts"],"sourcesContent":[],"mappings":";;;;AAqKA;AASA;AAOA;cA1Ka,gBAAgB;;;;cAiFhB,oBAAoB;;;;cA2CpB,YAAY;;;;cA8BZ,eAAe;;;;iBASZ,kBAAA,WAA6B,iBAAiB;;;;iBAO9C,gBAAA;;;;WAEP,eACN"}
1
+ {"version":3,"file":"rules.d.ts","names":[],"sources":["../../../src/analysis/impact/rules.ts"],"mappings":";;;;;AA4FA;cAjFa,cAAA,EAAgB,UAAA;;;;cAiFhB,kBAAA,EAAoB,UAAA;;;;cA2CpB,UAAA,EAAY,UAAA;AA8BzB;;;AAAA,cAAa,aAAA,EAAe,UAAA;;AAS5B;;iBAAgB,kBAAA,CAAmB,QAAA,EAAU,cAAA,GAAiB,UAAA;;;;iBAO9C,gBAAA,CACd,KAAA;EAAS,IAAA;EAAc,WAAA;EAAqB,IAAA;AAAA,GAC5C,KAAA,GAAO,UAAA,KACN,UAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/analysis/impact/types.ts"],"sourcesContent":[],"mappings":";;AAOA;AAGA;AAGA;AAsBA;AASA;AAEU,KAvCE,cAAA,GAuCF,UAAA,GAAA,cAAA,GAAA,MAAA;;AAQA,KA5CE,YAAA,GA4CF,WAAA,GAAA,cAAA,GAAA,UAAA;;AAkBO,UA3DA,WAAA,CA2De;EAQf;;;;;;;;;YAzDL;;;;;;;;;;;UAYK,aAAA;;;;;;;;UASA,YAAA;;UAEP;;;;;;WAMC;;UAED;;;;;;;;;;;;;;;;;;;;;UAkBO,eAAA;;gBAED;;;;;UAMC,UAAA;;;;;;YAML"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/analysis/impact/types.ts"],"mappings":";;AAOA;;;;;KAAY,cAAA;;KAGA,YAAA;;UAGK,WAAA;EAAA;EAEf,OAAA;;EAEA,WAAA;EAFA;EAIA,QAAA;EAAA;EAEA,IAAA;EAEA;EAAA,QAAA,EAAU,cAAA;EAEV;EAAA,IAAA;EAIA;EAFA,WAAA;EAIQ;EAFR,QAAA;EAMe;EAJf,QAAA;AAAA;;UAIe,aAAA;EACf,QAAA;EACA,WAAA;EACA,IAAA;EACA,KAAA;EACA,OAAA;AAAA;AAIF;AAAA,UAAiB,YAAA;;EAEf,MAAA,EAAQ,YAAA;EAMC;EAJT,WAAA;EAMmB;EAJnB,cAAA;EAJA;EAMA,OAAA,EAAS,aAAA;EAJT;EAMA,MAAA,EAAQ,WAAA;EAFR;EAIA,UAAA;IAAc,GAAA;IAAa,OAAA;IAAiB,IAAA;EAAA;EAAjB;EAE3B,YAAA;IACE,GAAA;IACA,OAAA;IACA,IAAA;EAAA;EAGF;EAAA,OAAA;EAIA;EAFA,OAAA;EAES;EAAT,SAAA;AAAA;;UAIe,eAAA;EAEf;EAAA,WAAA,GAAc,UAAA;EAEd;EAAA,oBAAA;AAAA;AAIF;AAAA,UAAiB,UAAA;;EAEf,EAAA;EAAA;EAEA,WAAA;EAEA;EAAA,QAAA,EAAU,cAAA;EAEV;EAAA,OAAA,GAAU,KAAA;IACR,IAAA;IACA,WAAA;IACA,IAAA;EAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"normalizer.d.ts","names":[],"sources":["../../../src/analysis/snapshot/normalizer.ts"],"sourcesContent":[],"mappings":";;AAgBA;AA+BA;AAOA;AAQA;AAaA;;;;;;;iBA3DgB,cAAA;;;;iBA+BA,eAAA;;;;iBAOA,WAAA;;;;iBAQA;;;UACP,MACN;;;;iBAWa,UAAA,SACN,0BACP"}
1
+ {"version":3,"file":"normalizer.d.ts","names":[],"sources":["../../../src/analysis/snapshot/normalizer.ts"],"mappings":";;AAgBA;;;;;AA+BA;;;;;AAOA;AAPA,iBA/BgB,cAAA,CAAe,KAAA;;;;iBA+Bf,eAAA,CAAgB,KAAA;;;;iBAOhB,WAAA,CAAY,KAAA;;;;iBAQZ,SAAA;EAAsB,GAAA;EAAa,OAAA;AAAA,EAAA,CACjD,KAAA,EAAO,CAAA,KACN,CAAA;AAWH;;;AAAA,iBAAgB,UAAA,CACd,MAAA,EAAQ,MAAA,oBACP,MAAA"}
@@ -1,7 +1,6 @@
1
1
  import { ContractSnapshot, SnapshotOptions } from "./types.js";
2
2
 
3
3
  //#region src/analysis/snapshot/snapshot.d.ts
4
-
5
4
  /**
6
5
  * Generate a contract snapshot from spec source files.
7
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.d.ts","names":[],"sources":["../../../src/analysis/snapshot/snapshot.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;iBA2BgB,gBAAA;;;eAEL,kBACR"}
1
+ {"version":3,"file":"snapshot.d.ts","names":[],"sources":["../../../src/analysis/snapshot/snapshot.ts"],"mappings":";;;;;;;;;;iBA2BgB,gBAAA,CACd,KAAA;EAAS,IAAA;EAAc,OAAA;AAAA,KACvB,OAAA,GAAS,eAAA,GACR,gBAAA"}
@@ -1,7 +1,6 @@
1
1
  import { EventRef } from "@contractspec/lib.contracts";
2
2
 
3
3
  //#region src/analysis/snapshot/types.d.ts
4
-
5
4
  /** Field type in a schema */
6
5
  type FieldType = 'string' | 'number' | 'boolean' | 'object' | 'array' | 'enum' | 'union' | 'literal' | 'date' | 'unknown';
7
6
  /** Schema field definition */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/analysis/snapshot/types.ts"],"sourcesContent":[],"mappings":";;;;;AAgCe,KAtBH,SAAA,GAsBG,QAAA,GAAA,QAAA,GAAA,SAAA,GAAA,QAAA,GAAA,OAAA,GAAA,MAAA,GAAA,OAAA,GAAA,SAAA,GAAA,MAAA,GAAA,SAAA;;AACa,UAVX,aAAA,CAUW;EAIX,IAAA,EAAA,MAAA;EACO,IAAA,EAbhB,SAagB;EAAf,QAAA,EAAA,OAAA;EACgB,QAAA,EAAA,OAAA;EAAf,WAAA,CAAA,EAAA,MAAA;EAAM,UAAA,CAAA,EAAA,MAAA,EAAA;EAIC,YAAA,CAAA,EAAA,OAAmB;EAMnB,KAAA,CAAA,EAlBP,aAkBwB;EAMzB,UAAA,CAAA,EAvBM,MAuBN,CAAA,MAAA,EAvBqB,aAuBrB,CAAA;EACH,UAAA,CAAA,EAvBS,aAuBT,EAAA;;;AAMW,UAzBA,UAAA,CAyBa;EASlB,KAAA,EAjCH,MAiCG,CAAA,MAAY,EAjCA,aAiCG,CAAA;EAGV,MAAA,EAnCP,MAmCO,CAAA,MAAgB,EAnCR,aA2ChB,CAAA;AAMT;;UA7CiB,mBAAA;;;;;UAMA,iBAAA;;;;;;SAMR;MACH;;kBAEY;;;UAID,aAAA;;;;;WAKN,eAAe;;;KAId,YAAA,GAAe,oBAAoB;;UAG9B,gBAAA;;;;;;;;SAQR;;;;;UAMQ,eAAA"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/analysis/snapshot/types.ts"],"mappings":";;;;KAUY,SAAA;;UAaK,aAAA;EACf,IAAA;EACA,IAAA,EAAM,SAAA;EACN,QAAA;EACA,QAAA;EACA,WAAA;EACA,UAAA;EACA,YAAA;EACA,KAAA,GAAQ,aAAA;EACR,UAAA,GAAa,MAAA,SAAe,aAAA;EAC5B,UAAA,GAAa,aAAA;AAAA;;UAIE,UAAA;EACf,KAAA,EAAO,MAAA,SAAe,aAAA;EACtB,MAAA,EAAQ,MAAA,SAAe,aAAA;AAAA;;UAIR,mBAAA;EACf,MAAA;EACA,IAAA;AAAA;;UAIe,iBAAA;EACf,IAAA;EACA,GAAA;EACA,OAAA;EACA,IAAA;EACA,SAAA;EACA,IAAA,GAAO,mBAAA;EACP,EAAA,EAAI,UAAA;EACJ,SAAA;EACA,aAAA,GAAgB,QAAA;AAAA;;UAID,aAAA;EACf,IAAA;EACA,GAAA;EACA,OAAA;EACA,SAAA;EACA,OAAA,EAAS,MAAA,SAAe,aAAA;AAAA;AAxB1B;AAAA,KA4BY,YAAA,GAAe,iBAAA,GAAoB,aAAA;;UAG9B,gBAAA;EA7BX;EA+BJ,OAAA;EA3BgC;EA6BhC,WAAA;EAvBO;EAyBP,SAAA;EAtBgB;EAwBhB,KAAA,EAAO,YAAA;EAxBiB;EA0BxB,IAAA;AAAA;;UAIe,eAAA;EAlCf;EAoCA,OAAA;EAnCO;EAqCP,KAAA;AAAA"}
@@ -1,7 +1,6 @@
1
1
  import { ParsedSpec } from "../types/llm-types.js";
2
2
 
3
3
  //#region src/analysis/spec-parser.d.ts
4
-
5
4
  /**
6
5
  * Load and parse specs from a source file.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"spec-parser.d.ts","names":[],"sources":["../../src/analysis/spec-parser.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAoBsB,kBAAA,oBAEnB,QAAQ"}
1
+ {"version":3,"file":"spec-parser.d.ts","names":[],"sources":["../../src/analysis/spec-parser.ts"],"mappings":";;;;;;iBAoBsB,kBAAA,CACpB,QAAA,WACC,OAAA,CAAQ,UAAA"}
@@ -1,5 +1,4 @@
1
1
  //#region src/analysis/spec-parsing-utils.d.ts
2
-
3
2
  /**
4
3
  * Extract test target from a TestSpec source.
5
4
  * Parses the `target: { type: 'operation', key, version }` field OR
@@ -1 +1 @@
1
- {"version":3,"file":"spec-parsing-utils.d.ts","names":[],"sources":["../../src/analysis/spec-parsing-utils.ts"],"sourcesContent":[],"mappings":";;;;;;;iBA0EgB,iBAAA;;;;;;;;;;;;iBAiEA,mBAAA"}
1
+ {"version":3,"file":"spec-parsing-utils.d.ts","names":[],"sources":["../../src/analysis/spec-parsing-utils.ts"],"mappings":";;;;;;iBA0EgB,iBAAA,CACd,IAAA;EAEI,IAAA;EAAgC,GAAA;EAAa,OAAA;AAAA;;;;;;;;iBA8DnC,mBAAA,CAAoB,IAAA;EAClC,UAAA;EACA,QAAA;AAAA"}
@@ -7,7 +7,7 @@ function parsePolicy(code) {
7
7
  return extractRefList(policyBlock[1], "policies") ?? [];
8
8
  }
9
9
  function extractRefList(code, field) {
10
- const regex = /* @__PURE__ */ new RegExp(`${escapeRegex(field)}\\s*:\\s*\\[([\\s\\S]*?)\\]`);
10
+ const regex = new RegExp(`${escapeRegex(field)}\\s*:\\s*\\[([\\s\\S]*?)\\]`);
11
11
  const match = code.match(regex);
12
12
  if (!match?.[1]) return void 0;
13
13
  const inner = match[1];
@@ -24,7 +24,7 @@ function extractRefList(code, field) {
24
24
  return items.length > 0 ? items : void 0;
25
25
  }
26
26
  function extractTestRefs(code) {
27
- const regex = /* @__PURE__ */ new RegExp(`testRefs\\s*:\\s*\\[([\\s\\S]*?)\\]`);
27
+ const regex = new RegExp(`testRefs\\s*:\\s*\\[([\\s\\S]*?)\\]`);
28
28
  const match = code.match(regex);
29
29
  if (!match?.[1]) return void 0;
30
30
  const inner = match[1];
@@ -64,7 +64,7 @@ function extractTestTarget(code) {
64
64
  key: flatKey,
65
65
  version: matchVersionField(targetBlock, "version")
66
66
  };
67
- const refBlockMatch = targetBlock.match(/* @__PURE__ */ new RegExp(`${type}\\s*:\\s*\\{([\\s\\S]*?)\\}`));
67
+ const refBlockMatch = targetBlock.match(new RegExp(`${type}\\s*:\\s*\\{([\\s\\S]*?)\\}`));
68
68
  if (!refBlockMatch?.[1]) return void 0;
69
69
  const refBlock = refBlockMatch[1];
70
70
  const key = matchStringField(refBlock, "key");
@@ -1 +1 @@
1
- {"version":3,"file":"spec-parsing-utils.js","names":[],"sources":["../../src/analysis/spec-parsing-utils.ts"],"sourcesContent":["import {\n escapeRegex,\n matchStringField,\n matchVersionField,\n findMatchingDelimiter,\n} from './utils/matchers';\n\nexport function parsePolicy(code: string): { key: string; version: string }[] {\n const policyBlock = code.match(/policy\\s*:\\s*\\{([\\s\\S]*?)\\}/);\n if (!policyBlock?.[1]) return [];\n\n return extractRefList(policyBlock[1], 'policies') ?? [];\n}\n\nexport function extractRefList(\n code: string,\n field: string\n): { key: string; version: string }[] | undefined {\n const regex = new RegExp(`${escapeRegex(field)}\\\\s*:\\\\s*\\\\[([\\\\s\\\\S]*?)\\\\]`);\n const match = code.match(regex);\n if (!match?.[1]) return undefined;\n\n const inner = match[1];\n const items: { key: string; version: string }[] = [];\n\n const parts = inner.match(/\\{[\\s\\S]*?\\}/g);\n if (parts) {\n for (const part of parts) {\n const k = matchStringField(part, 'key');\n const v = matchVersionField(part, 'version');\n if (k) {\n items.push({ key: k, version: v ?? '1.0.0' });\n }\n }\n }\n\n return items.length > 0 ? items : undefined;\n}\n\nexport function extractTestRefs(\n code: string\n): { key: string; version: string; type: 'success' | 'error' }[] | undefined {\n const regex = new RegExp(`testRefs\\\\s*:\\\\s*\\\\[([\\\\s\\\\S]*?)\\\\]`);\n const match = code.match(regex);\n if (!match?.[1]) return undefined;\n\n const inner = match[1];\n const items: { key: string; version: string; type: 'success' | 'error' }[] =\n [];\n\n const parts = inner.match(/\\{[\\s\\S]*?\\}/g);\n if (parts) {\n for (const part of parts) {\n const k = matchStringField(part, 'key');\n const v = matchVersionField(part, 'version');\n const t = matchStringField(part, 'type');\n if (k) {\n items.push({\n key: k,\n version: v ?? '1.0.0',\n type: t === 'error' ? 'error' : 'success',\n });\n }\n }\n }\n\n return items.length > 0 ? items : undefined;\n}\n\n/**\n * Extract test target from a TestSpec source.\n * Parses the `target: { type: 'operation', key, version }` field OR\n * the nested format `target: { type: 'operation', operation: { key, version } }`.\n */\nexport function extractTestTarget(\n code: string\n):\n | { type: 'operation' | 'workflow'; key: string; version: string | undefined }\n | undefined {\n // Find target block start\n const targetStartMatch = code.match(/target\\s*:\\s*\\{/);\n if (!targetStartMatch || targetStartMatch.index === undefined)\n return undefined;\n\n const openBraceIndex =\n targetStartMatch.index + targetStartMatch[0].length - 1;\n const closeBraceIndex = findMatchingDelimiter(code, openBraceIndex, '{', '}');\n\n if (closeBraceIndex === -1) return undefined;\n\n const targetBlock = code.substring(openBraceIndex + 1, closeBraceIndex);\n\n // Extract the type\n const typeMatch = targetBlock.match(/type\\s*:\\s*['\"](\\w+)['\"]/);\n if (!typeMatch?.[1]) return undefined;\n\n const type = typeMatch[1];\n if (type !== 'operation' && type !== 'workflow') return undefined;\n\n // Try flat format first: { type: 'operation', key: '...', version: '...' }\n const flatKey = matchStringField(targetBlock, 'key');\n if (flatKey) {\n const flatVersion = matchVersionField(targetBlock, 'version');\n return {\n type,\n key: flatKey,\n version: flatVersion,\n };\n }\n\n // Try nested format: { type: 'operation', operation: { key: '...', version: '...' } }\n const refBlockMatch = targetBlock.match(\n new RegExp(`${type}\\\\s*:\\\\s*\\\\{([\\\\s\\\\S]*?)\\\\}`)\n );\n\n if (!refBlockMatch?.[1]) return undefined;\n\n const refBlock = refBlockMatch[1];\n\n // Extract key and version from the ref block\n const key = matchStringField(refBlock, 'key');\n if (!key) return undefined;\n\n const version = matchVersionField(refBlock, 'version');\n\n return {\n type,\n key,\n version,\n };\n}\n\n/**\n * Extract test coverage info from a TestSpec source.\n * Checks for presence of success (expectOutput) and failure (expectError) scenarios.\n * Supports both formats:\n * - New: `expectOutput: {}` and `expectError: {}`\n * - Old: `{ type: 'expectOutput', ... }` and `{ type: 'expectError', ... }`\n */\nexport function extractTestCoverage(code: string): {\n hasSuccess: boolean;\n hasError: boolean;\n} {\n // Check new format: expectOutput: or expectError: as keys\n const hasSuccessNew = /expectOutput\\s*:/.test(code);\n const hasErrorNew = /expectError\\s*:/.test(code);\n\n // Check old format: { type: 'expectOutput' } or { type: 'expectError' }\n const hasSuccessOld = /(['\"]?)type\\1\\s*:\\s*['\"]expectOutput['\"]/.test(code);\n const hasErrorOld = /(['\"]?)type\\1\\s*:\\s*['\"]expectError['\"]/.test(code);\n\n return {\n hasSuccess: hasSuccessNew || hasSuccessOld,\n hasError: hasErrorNew || hasErrorOld,\n };\n}\n"],"mappings":";;;AAOA,SAAgB,YAAY,MAAkD;CAC5E,MAAM,cAAc,KAAK,MAAM,8BAA8B;AAC7D,KAAI,CAAC,cAAc,GAAI,QAAO,EAAE;AAEhC,QAAO,eAAe,YAAY,IAAI,WAAW,IAAI,EAAE;;AAGzD,SAAgB,eACd,MACA,OACgD;CAChD,MAAM,wBAAQ,IAAI,OAAO,GAAG,YAAY,MAAM,CAAC,6BAA6B;CAC5E,MAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,KAAI,CAAC,QAAQ,GAAI,QAAO;CAExB,MAAM,QAAQ,MAAM;CACpB,MAAM,QAA4C,EAAE;CAEpD,MAAM,QAAQ,MAAM,MAAM,gBAAgB;AAC1C,KAAI,MACF,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,IAAI,iBAAiB,MAAM,MAAM;EACvC,MAAM,IAAI,kBAAkB,MAAM,UAAU;AAC5C,MAAI,EACF,OAAM,KAAK;GAAE,KAAK;GAAG,SAAS,KAAK;GAAS,CAAC;;AAKnD,QAAO,MAAM,SAAS,IAAI,QAAQ;;AAGpC,SAAgB,gBACd,MAC2E;CAC3E,MAAM,wBAAQ,IAAI,OAAO,sCAAsC;CAC/D,MAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,KAAI,CAAC,QAAQ,GAAI,QAAO;CAExB,MAAM,QAAQ,MAAM;CACpB,MAAM,QACJ,EAAE;CAEJ,MAAM,QAAQ,MAAM,MAAM,gBAAgB;AAC1C,KAAI,MACF,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,IAAI,iBAAiB,MAAM,MAAM;EACvC,MAAM,IAAI,kBAAkB,MAAM,UAAU;EAC5C,MAAM,IAAI,iBAAiB,MAAM,OAAO;AACxC,MAAI,EACF,OAAM,KAAK;GACT,KAAK;GACL,SAAS,KAAK;GACd,MAAM,MAAM,UAAU,UAAU;GACjC,CAAC;;AAKR,QAAO,MAAM,SAAS,IAAI,QAAQ;;;;;;;AAQpC,SAAgB,kBACd,MAGY;CAEZ,MAAM,mBAAmB,KAAK,MAAM,kBAAkB;AACtD,KAAI,CAAC,oBAAoB,iBAAiB,UAAU,OAClD,QAAO;CAET,MAAM,iBACJ,iBAAiB,QAAQ,iBAAiB,GAAG,SAAS;CACxD,MAAM,kBAAkB,sBAAsB,MAAM,gBAAgB,KAAK,IAAI;AAE7E,KAAI,oBAAoB,GAAI,QAAO;CAEnC,MAAM,cAAc,KAAK,UAAU,iBAAiB,GAAG,gBAAgB;CAGvE,MAAM,YAAY,YAAY,MAAM,2BAA2B;AAC/D,KAAI,CAAC,YAAY,GAAI,QAAO;CAE5B,MAAM,OAAO,UAAU;AACvB,KAAI,SAAS,eAAe,SAAS,WAAY,QAAO;CAGxD,MAAM,UAAU,iBAAiB,aAAa,MAAM;AACpD,KAAI,QAEF,QAAO;EACL;EACA,KAAK;EACL,SAJkB,kBAAkB,aAAa,UAAU;EAK5D;CAIH,MAAM,gBAAgB,YAAY,sBAChC,IAAI,OAAO,GAAG,KAAK,6BAA6B,CACjD;AAED,KAAI,CAAC,gBAAgB,GAAI,QAAO;CAEhC,MAAM,WAAW,cAAc;CAG/B,MAAM,MAAM,iBAAiB,UAAU,MAAM;AAC7C,KAAI,CAAC,IAAK,QAAO;AAIjB,QAAO;EACL;EACA;EACA,SALc,kBAAkB,UAAU,UAAU;EAMrD;;;;;;;;;AAUH,SAAgB,oBAAoB,MAGlC;CAEA,MAAM,gBAAgB,mBAAmB,KAAK,KAAK;CACnD,MAAM,cAAc,kBAAkB,KAAK,KAAK;CAGhD,MAAM,gBAAgB,2CAA2C,KAAK,KAAK;CAC3E,MAAM,cAAc,0CAA0C,KAAK,KAAK;AAExE,QAAO;EACL,YAAY,iBAAiB;EAC7B,UAAU,eAAe;EAC1B"}
1
+ {"version":3,"file":"spec-parsing-utils.js","names":[],"sources":["../../src/analysis/spec-parsing-utils.ts"],"sourcesContent":["import {\n escapeRegex,\n matchStringField,\n matchVersionField,\n findMatchingDelimiter,\n} from './utils/matchers';\n\nexport function parsePolicy(code: string): { key: string; version: string }[] {\n const policyBlock = code.match(/policy\\s*:\\s*\\{([\\s\\S]*?)\\}/);\n if (!policyBlock?.[1]) return [];\n\n return extractRefList(policyBlock[1], 'policies') ?? [];\n}\n\nexport function extractRefList(\n code: string,\n field: string\n): { key: string; version: string }[] | undefined {\n const regex = new RegExp(`${escapeRegex(field)}\\\\s*:\\\\s*\\\\[([\\\\s\\\\S]*?)\\\\]`);\n const match = code.match(regex);\n if (!match?.[1]) return undefined;\n\n const inner = match[1];\n const items: { key: string; version: string }[] = [];\n\n const parts = inner.match(/\\{[\\s\\S]*?\\}/g);\n if (parts) {\n for (const part of parts) {\n const k = matchStringField(part, 'key');\n const v = matchVersionField(part, 'version');\n if (k) {\n items.push({ key: k, version: v ?? '1.0.0' });\n }\n }\n }\n\n return items.length > 0 ? items : undefined;\n}\n\nexport function extractTestRefs(\n code: string\n): { key: string; version: string; type: 'success' | 'error' }[] | undefined {\n const regex = new RegExp(`testRefs\\\\s*:\\\\s*\\\\[([\\\\s\\\\S]*?)\\\\]`);\n const match = code.match(regex);\n if (!match?.[1]) return undefined;\n\n const inner = match[1];\n const items: { key: string; version: string; type: 'success' | 'error' }[] =\n [];\n\n const parts = inner.match(/\\{[\\s\\S]*?\\}/g);\n if (parts) {\n for (const part of parts) {\n const k = matchStringField(part, 'key');\n const v = matchVersionField(part, 'version');\n const t = matchStringField(part, 'type');\n if (k) {\n items.push({\n key: k,\n version: v ?? '1.0.0',\n type: t === 'error' ? 'error' : 'success',\n });\n }\n }\n }\n\n return items.length > 0 ? items : undefined;\n}\n\n/**\n * Extract test target from a TestSpec source.\n * Parses the `target: { type: 'operation', key, version }` field OR\n * the nested format `target: { type: 'operation', operation: { key, version } }`.\n */\nexport function extractTestTarget(\n code: string\n):\n | { type: 'operation' | 'workflow'; key: string; version: string | undefined }\n | undefined {\n // Find target block start\n const targetStartMatch = code.match(/target\\s*:\\s*\\{/);\n if (!targetStartMatch || targetStartMatch.index === undefined)\n return undefined;\n\n const openBraceIndex =\n targetStartMatch.index + targetStartMatch[0].length - 1;\n const closeBraceIndex = findMatchingDelimiter(code, openBraceIndex, '{', '}');\n\n if (closeBraceIndex === -1) return undefined;\n\n const targetBlock = code.substring(openBraceIndex + 1, closeBraceIndex);\n\n // Extract the type\n const typeMatch = targetBlock.match(/type\\s*:\\s*['\"](\\w+)['\"]/);\n if (!typeMatch?.[1]) return undefined;\n\n const type = typeMatch[1];\n if (type !== 'operation' && type !== 'workflow') return undefined;\n\n // Try flat format first: { type: 'operation', key: '...', version: '...' }\n const flatKey = matchStringField(targetBlock, 'key');\n if (flatKey) {\n const flatVersion = matchVersionField(targetBlock, 'version');\n return {\n type,\n key: flatKey,\n version: flatVersion,\n };\n }\n\n // Try nested format: { type: 'operation', operation: { key: '...', version: '...' } }\n const refBlockMatch = targetBlock.match(\n new RegExp(`${type}\\\\s*:\\\\s*\\\\{([\\\\s\\\\S]*?)\\\\}`)\n );\n\n if (!refBlockMatch?.[1]) return undefined;\n\n const refBlock = refBlockMatch[1];\n\n // Extract key and version from the ref block\n const key = matchStringField(refBlock, 'key');\n if (!key) return undefined;\n\n const version = matchVersionField(refBlock, 'version');\n\n return {\n type,\n key,\n version,\n };\n}\n\n/**\n * Extract test coverage info from a TestSpec source.\n * Checks for presence of success (expectOutput) and failure (expectError) scenarios.\n * Supports both formats:\n * - New: `expectOutput: {}` and `expectError: {}`\n * - Old: `{ type: 'expectOutput', ... }` and `{ type: 'expectError', ... }`\n */\nexport function extractTestCoverage(code: string): {\n hasSuccess: boolean;\n hasError: boolean;\n} {\n // Check new format: expectOutput: or expectError: as keys\n const hasSuccessNew = /expectOutput\\s*:/.test(code);\n const hasErrorNew = /expectError\\s*:/.test(code);\n\n // Check old format: { type: 'expectOutput' } or { type: 'expectError' }\n const hasSuccessOld = /(['\"]?)type\\1\\s*:\\s*['\"]expectOutput['\"]/.test(code);\n const hasErrorOld = /(['\"]?)type\\1\\s*:\\s*['\"]expectError['\"]/.test(code);\n\n return {\n hasSuccess: hasSuccessNew || hasSuccessOld,\n hasError: hasErrorNew || hasErrorOld,\n };\n}\n"],"mappings":";;;AAOA,SAAgB,YAAY,MAAkD;CAC5E,MAAM,cAAc,KAAK,MAAM,8BAA8B;AAC7D,KAAI,CAAC,cAAc,GAAI,QAAO,EAAE;AAEhC,QAAO,eAAe,YAAY,IAAI,WAAW,IAAI,EAAE;;AAGzD,SAAgB,eACd,MACA,OACgD;CAChD,MAAM,QAAQ,IAAI,OAAO,GAAG,YAAY,MAAM,CAAC,6BAA6B;CAC5E,MAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,KAAI,CAAC,QAAQ,GAAI,QAAO;CAExB,MAAM,QAAQ,MAAM;CACpB,MAAM,QAA4C,EAAE;CAEpD,MAAM,QAAQ,MAAM,MAAM,gBAAgB;AAC1C,KAAI,MACF,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,IAAI,iBAAiB,MAAM,MAAM;EACvC,MAAM,IAAI,kBAAkB,MAAM,UAAU;AAC5C,MAAI,EACF,OAAM,KAAK;GAAE,KAAK;GAAG,SAAS,KAAK;GAAS,CAAC;;AAKnD,QAAO,MAAM,SAAS,IAAI,QAAQ;;AAGpC,SAAgB,gBACd,MAC2E;CAC3E,MAAM,QAAQ,IAAI,OAAO,sCAAsC;CAC/D,MAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,KAAI,CAAC,QAAQ,GAAI,QAAO;CAExB,MAAM,QAAQ,MAAM;CACpB,MAAM,QACJ,EAAE;CAEJ,MAAM,QAAQ,MAAM,MAAM,gBAAgB;AAC1C,KAAI,MACF,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,IAAI,iBAAiB,MAAM,MAAM;EACvC,MAAM,IAAI,kBAAkB,MAAM,UAAU;EAC5C,MAAM,IAAI,iBAAiB,MAAM,OAAO;AACxC,MAAI,EACF,OAAM,KAAK;GACT,KAAK;GACL,SAAS,KAAK;GACd,MAAM,MAAM,UAAU,UAAU;GACjC,CAAC;;AAKR,QAAO,MAAM,SAAS,IAAI,QAAQ;;;;;;;AAQpC,SAAgB,kBACd,MAGY;CAEZ,MAAM,mBAAmB,KAAK,MAAM,kBAAkB;AACtD,KAAI,CAAC,oBAAoB,iBAAiB,UAAU,OAClD,QAAO;CAET,MAAM,iBACJ,iBAAiB,QAAQ,iBAAiB,GAAG,SAAS;CACxD,MAAM,kBAAkB,sBAAsB,MAAM,gBAAgB,KAAK,IAAI;AAE7E,KAAI,oBAAoB,GAAI,QAAO;CAEnC,MAAM,cAAc,KAAK,UAAU,iBAAiB,GAAG,gBAAgB;CAGvE,MAAM,YAAY,YAAY,MAAM,2BAA2B;AAC/D,KAAI,CAAC,YAAY,GAAI,QAAO;CAE5B,MAAM,OAAO,UAAU;AACvB,KAAI,SAAS,eAAe,SAAS,WAAY,QAAO;CAGxD,MAAM,UAAU,iBAAiB,aAAa,MAAM;AACpD,KAAI,QAEF,QAAO;EACL;EACA,KAAK;EACL,SAJkB,kBAAkB,aAAa,UAAU;EAK5D;CAIH,MAAM,gBAAgB,YAAY,MAChC,IAAI,OAAO,GAAG,KAAK,6BAA6B,CACjD;AAED,KAAI,CAAC,gBAAgB,GAAI,QAAO;CAEhC,MAAM,WAAW,cAAc;CAG/B,MAAM,MAAM,iBAAiB,UAAU,MAAM;AAC7C,KAAI,CAAC,IAAK,QAAO;AAIjB,QAAO;EACL;EACA;EACA,SALc,kBAAkB,UAAU,UAAU;EAMrD;;;;;;;;;AAUH,SAAgB,oBAAoB,MAGlC;CAEA,MAAM,gBAAgB,mBAAmB,KAAK,KAAK;CACnD,MAAM,cAAc,kBAAkB,KAAK,KAAK;CAGhD,MAAM,gBAAgB,2CAA2C,KAAK,KAAK;CAC3E,MAAM,cAAc,0CAA0C,KAAK,KAAK;AAExE,QAAO;EACL,YAAY,iBAAiB;EAC7B,UAAU,eAAe;EAC1B"}
@@ -2,7 +2,6 @@ import { AnalyzedOperationKind, AnalyzedSpecType, SpecScanResult } from "../type
2
2
  import { extractTestCoverage, extractTestTarget } from "./spec-parsing-utils.js";
3
3
 
4
4
  //#region src/analysis/spec-scan.d.ts
5
-
6
5
  /**
7
6
  * Scan all specs from a single source file.
8
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"spec-scan.d.ts","names":[],"sources":["../../src/analysis/spec-scan.ts"],"sourcesContent":[],"mappings":";;;;;AAoPA;;;iBA/MgB,sBAAA,kCAGb;iBAmDa,0BAAA;YACJ;QACJ;;;;;iBAwFQ,cAAA,kCAAgD;;;;iBA+DhD,yBAAA,oBAEb"}
1
+ {"version":3,"file":"spec-scan.d.ts","names":[],"sources":["../../src/analysis/spec-scan.ts"],"mappings":";;;;;;;iBAqCgB,sBAAA,CACd,IAAA,UACA,QAAA,WACC,cAAA;AAAA,iBAmDa,0BAAA,CAA2B,cAAA;EACzC,QAAA,EAAU,gBAAA;EACV,IAAA,EAAM,qBAAA;AAAA;;;;iBAwFQ,cAAA,CAAe,IAAA,UAAc,QAAA,WAAmB,cAAA;;;;iBA+DhD,yBAAA,CACd,QAAA,WACC,cAAA"}
@@ -9,7 +9,7 @@ function escapeRegex(value) {
9
9
  * Match a string field in source code.
10
10
  */
11
11
  function matchStringField(code, field) {
12
- const regex = /* @__PURE__ */ new RegExp(`${escapeRegex(field)}\\s*:\\s*['"]([^'"]+)['"]`);
12
+ const regex = new RegExp(`${escapeRegex(field)}\\s*:\\s*['"]([^'"]+)['"]`);
13
13
  return code.match(regex)?.[1] ?? null;
14
14
  }
15
15
  /**
@@ -22,7 +22,7 @@ function matchStringFieldIn(code, field) {
22
22
  * Match a version field which can be a string or number.
23
23
  */
24
24
  function matchVersionField(code, field) {
25
- const regex = /* @__PURE__ */ new RegExp(`${escapeRegex(field)}\\s*:\\s*(?:['"]([^'"]+)['"]|(\\d+(?:\\.\\d+)*))`);
25
+ const regex = new RegExp(`${escapeRegex(field)}\\s*:\\s*(?:['"]([^'"]+)['"]|(\\d+(?:\\.\\d+)*))`);
26
26
  const match = code.match(regex);
27
27
  if (match?.[1]) return match[1];
28
28
  if (match?.[2]) return match[2];
@@ -31,7 +31,7 @@ function matchVersionField(code, field) {
31
31
  * Match a string array field in source code.
32
32
  */
33
33
  function matchStringArrayField(code, field) {
34
- const regex = /* @__PURE__ */ new RegExp(`${escapeRegex(field)}\\s*:\\s*\\[([\\s\\S]*?)\\]`);
34
+ const regex = new RegExp(`${escapeRegex(field)}\\s*:\\s*\\[([\\s\\S]*?)\\]`);
35
35
  const match = code.match(regex);
36
36
  if (!match?.[1]) return void 0;
37
37
  const inner = match[1];
@@ -1 +1 @@
1
- {"version":3,"file":"matchers.js","names":[],"sources":["../../../src/analysis/utils/matchers.ts"],"sourcesContent":["/**\n * Shared regex matchers and parsing utilities for spec scanning.\n */\n\nimport type { Stability } from '../../types/spec-types';\n\n/**\n * Escape regex special characters.\n */\nexport function escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Match a string field in source code.\n */\nexport function matchStringField(code: string, field: string): string | null {\n const regex = new RegExp(`${escapeRegex(field)}\\\\s*:\\\\s*['\"]([^'\"]+)['\"]`);\n const match = code.match(regex);\n return match?.[1] ?? null;\n}\n\n/**\n * Match a string field within a limited scope.\n */\nexport function matchStringFieldIn(code: string, field: string): string | null {\n return matchStringField(code, field);\n}\n\n/**\n * Match a version field which can be a string or number.\n */\nexport function matchVersionField(\n code: string,\n field: string\n): string | undefined {\n const regex = new RegExp(\n `${escapeRegex(field)}\\\\s*:\\\\s*(?:['\"]([^'\"]+)['\"]|(\\\\d+(?:\\\\.\\\\d+)*))`\n );\n const match = code.match(regex);\n if (match?.[1]) return match[1];\n if (match?.[2]) return match[2];\n return undefined;\n}\n\n/**\n * Match a string array field in source code.\n */\nexport function matchStringArrayField(\n code: string,\n field: string\n): string[] | undefined {\n const regex = new RegExp(`${escapeRegex(field)}\\\\s*:\\\\s*\\\\[([\\\\s\\\\S]*?)\\\\]`);\n const match = code.match(regex);\n if (!match?.[1]) return undefined;\n\n const inner = match[1];\n const items = Array.from(inner.matchAll(/['\"]([^'\"]+)['\"]/g))\n .map((m) => m[1])\n .filter(\n (value): value is string => typeof value === 'string' && value.length > 0\n );\n\n return items.length > 0 ? items : undefined;\n}\n\n/**\n * Check if a value is a valid stability.\n */\nexport function isStability(value: string | null): value is Stability {\n return (\n value === 'experimental' ||\n value === 'beta' ||\n value === 'stable' ||\n value === 'deprecated'\n );\n}\n\n/**\n * Find matching closing delimiter for an opening delimiter.\n * Returns the index of the closing delimiter or -1 if not found.\n */\nexport function findMatchingDelimiter(\n code: string,\n startIndex: number,\n openChar: string,\n closeChar: string\n): number {\n let depth = 0;\n let inString = false;\n let stringChar = '';\n\n for (let i = startIndex; i < code.length; i++) {\n const char = code[i];\n const prevChar = i > 0 ? code[i - 1] : '';\n\n // Handle string literals\n if ((char === '\"' || char === \"'\" || char === '`') && prevChar !== '\\\\') {\n if (!inString) {\n inString = true;\n stringChar = char;\n } else if (char === stringChar) {\n inString = false;\n }\n continue;\n }\n\n if (inString) continue;\n\n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Find matching closing brace for an opening brace.\n * Returns the index of the closing brace or -1 if not found.\n */\nexport function findMatchingBrace(code: string, startIndex: number): number {\n return findMatchingDelimiter(code, startIndex, '{', '}');\n}\n"],"mappings":";;;;AASA,SAAgB,YAAY,OAAuB;AACjD,QAAO,MAAM,QAAQ,uBAAuB,OAAO;;;;;AAMrD,SAAgB,iBAAiB,MAAc,OAA8B;CAC3E,MAAM,wBAAQ,IAAI,OAAO,GAAG,YAAY,MAAM,CAAC,2BAA2B;AAE1E,QADc,KAAK,MAAM,MAAM,GAChB,MAAM;;;;;AAMvB,SAAgB,mBAAmB,MAAc,OAA8B;AAC7E,QAAO,iBAAiB,MAAM,MAAM;;;;;AAMtC,SAAgB,kBACd,MACA,OACoB;CACpB,MAAM,wBAAQ,IAAI,OAChB,GAAG,YAAY,MAAM,CAAC,kDACvB;CACD,MAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,KAAI,QAAQ,GAAI,QAAO,MAAM;AAC7B,KAAI,QAAQ,GAAI,QAAO,MAAM;;;;;AAO/B,SAAgB,sBACd,MACA,OACsB;CACtB,MAAM,wBAAQ,IAAI,OAAO,GAAG,YAAY,MAAM,CAAC,6BAA6B;CAC5E,MAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,KAAI,CAAC,QAAQ,GAAI,QAAO;CAExB,MAAM,QAAQ,MAAM;CACpB,MAAM,QAAQ,MAAM,KAAK,MAAM,SAAS,oBAAoB,CAAC,CAC1D,KAAK,MAAM,EAAE,GAAG,CAChB,QACE,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,EACzE;AAEH,QAAO,MAAM,SAAS,IAAI,QAAQ;;;;;AAMpC,SAAgB,YAAY,OAA0C;AACpE,QACE,UAAU,kBACV,UAAU,UACV,UAAU,YACV,UAAU;;;;;;AAQd,SAAgB,sBACd,MACA,YACA,UACA,WACQ;CACR,IAAI,QAAQ;CACZ,IAAI,WAAW;CACf,IAAI,aAAa;AAEjB,MAAK,IAAI,IAAI,YAAY,IAAI,KAAK,QAAQ,KAAK;EAC7C,MAAM,OAAO,KAAK;EAClB,MAAM,WAAW,IAAI,IAAI,KAAK,IAAI,KAAK;AAGvC,OAAK,SAAS,QAAO,SAAS,OAAO,SAAS,QAAQ,aAAa,MAAM;AACvE,OAAI,CAAC,UAAU;AACb,eAAW;AACX,iBAAa;cACJ,SAAS,WAClB,YAAW;AAEb;;AAGF,MAAI,SAAU;AAEd,MAAI,SAAS,SACX;WACS,SAAS,WAAW;AAC7B;AACA,OAAI,UAAU,EACZ,QAAO;;;AAKb,QAAO"}
1
+ {"version":3,"file":"matchers.js","names":[],"sources":["../../../src/analysis/utils/matchers.ts"],"sourcesContent":["/**\n * Shared regex matchers and parsing utilities for spec scanning.\n */\n\nimport type { Stability } from '../../types/spec-types';\n\n/**\n * Escape regex special characters.\n */\nexport function escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Match a string field in source code.\n */\nexport function matchStringField(code: string, field: string): string | null {\n const regex = new RegExp(`${escapeRegex(field)}\\\\s*:\\\\s*['\"]([^'\"]+)['\"]`);\n const match = code.match(regex);\n return match?.[1] ?? null;\n}\n\n/**\n * Match a string field within a limited scope.\n */\nexport function matchStringFieldIn(code: string, field: string): string | null {\n return matchStringField(code, field);\n}\n\n/**\n * Match a version field which can be a string or number.\n */\nexport function matchVersionField(\n code: string,\n field: string\n): string | undefined {\n const regex = new RegExp(\n `${escapeRegex(field)}\\\\s*:\\\\s*(?:['\"]([^'\"]+)['\"]|(\\\\d+(?:\\\\.\\\\d+)*))`\n );\n const match = code.match(regex);\n if (match?.[1]) return match[1];\n if (match?.[2]) return match[2];\n return undefined;\n}\n\n/**\n * Match a string array field in source code.\n */\nexport function matchStringArrayField(\n code: string,\n field: string\n): string[] | undefined {\n const regex = new RegExp(`${escapeRegex(field)}\\\\s*:\\\\s*\\\\[([\\\\s\\\\S]*?)\\\\]`);\n const match = code.match(regex);\n if (!match?.[1]) return undefined;\n\n const inner = match[1];\n const items = Array.from(inner.matchAll(/['\"]([^'\"]+)['\"]/g))\n .map((m) => m[1])\n .filter(\n (value): value is string => typeof value === 'string' && value.length > 0\n );\n\n return items.length > 0 ? items : undefined;\n}\n\n/**\n * Check if a value is a valid stability.\n */\nexport function isStability(value: string | null): value is Stability {\n return (\n value === 'experimental' ||\n value === 'beta' ||\n value === 'stable' ||\n value === 'deprecated'\n );\n}\n\n/**\n * Find matching closing delimiter for an opening delimiter.\n * Returns the index of the closing delimiter or -1 if not found.\n */\nexport function findMatchingDelimiter(\n code: string,\n startIndex: number,\n openChar: string,\n closeChar: string\n): number {\n let depth = 0;\n let inString = false;\n let stringChar = '';\n\n for (let i = startIndex; i < code.length; i++) {\n const char = code[i];\n const prevChar = i > 0 ? code[i - 1] : '';\n\n // Handle string literals\n if ((char === '\"' || char === \"'\" || char === '`') && prevChar !== '\\\\') {\n if (!inString) {\n inString = true;\n stringChar = char;\n } else if (char === stringChar) {\n inString = false;\n }\n continue;\n }\n\n if (inString) continue;\n\n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Find matching closing brace for an opening brace.\n * Returns the index of the closing brace or -1 if not found.\n */\nexport function findMatchingBrace(code: string, startIndex: number): number {\n return findMatchingDelimiter(code, startIndex, '{', '}');\n}\n"],"mappings":";;;;AASA,SAAgB,YAAY,OAAuB;AACjD,QAAO,MAAM,QAAQ,uBAAuB,OAAO;;;;;AAMrD,SAAgB,iBAAiB,MAAc,OAA8B;CAC3E,MAAM,QAAQ,IAAI,OAAO,GAAG,YAAY,MAAM,CAAC,2BAA2B;AAE1E,QADc,KAAK,MAAM,MAAM,GAChB,MAAM;;;;;AAMvB,SAAgB,mBAAmB,MAAc,OAA8B;AAC7E,QAAO,iBAAiB,MAAM,MAAM;;;;;AAMtC,SAAgB,kBACd,MACA,OACoB;CACpB,MAAM,QAAQ,IAAI,OAChB,GAAG,YAAY,MAAM,CAAC,kDACvB;CACD,MAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,KAAI,QAAQ,GAAI,QAAO,MAAM;AAC7B,KAAI,QAAQ,GAAI,QAAO,MAAM;;;;;AAO/B,SAAgB,sBACd,MACA,OACsB;CACtB,MAAM,QAAQ,IAAI,OAAO,GAAG,YAAY,MAAM,CAAC,6BAA6B;CAC5E,MAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,KAAI,CAAC,QAAQ,GAAI,QAAO;CAExB,MAAM,QAAQ,MAAM;CACpB,MAAM,QAAQ,MAAM,KAAK,MAAM,SAAS,oBAAoB,CAAC,CAC1D,KAAK,MAAM,EAAE,GAAG,CAChB,QACE,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,EACzE;AAEH,QAAO,MAAM,SAAS,IAAI,QAAQ;;;;;AAMpC,SAAgB,YAAY,OAA0C;AACpE,QACE,UAAU,kBACV,UAAU,UACV,UAAU,YACV,UAAU;;;;;;AAQd,SAAgB,sBACd,MACA,YACA,UACA,WACQ;CACR,IAAI,QAAQ;CACZ,IAAI,WAAW;CACf,IAAI,aAAa;AAEjB,MAAK,IAAI,IAAI,YAAY,IAAI,KAAK,QAAQ,KAAK;EAC7C,MAAM,OAAO,KAAK;EAClB,MAAM,WAAW,IAAI,IAAI,KAAK,IAAI,KAAK;AAGvC,OAAK,SAAS,QAAO,SAAS,OAAO,SAAS,QAAQ,aAAa,MAAM;AACvE,OAAI,CAAC,UAAU;AACb,eAAW;AACX,iBAAa;cACJ,SAAS,WAClB,YAAW;AAEb;;AAGF,MAAI,SAAU;AAEd,MAAI,SAAS,SACX;WACS,SAAS,WAAW;AAC7B;AACA,OAAI,UAAU,EACZ,QAAO;;;AAKb,QAAO"}
@@ -1,7 +1,6 @@
1
1
  import { SpecScanResult, ValidationResult } from "../../types/analysis-types.js";
2
2
 
3
3
  //#region src/analysis/validate/spec-structure.d.ts
4
-
5
4
  /**
6
5
  * Rule severity level for lint rules.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"spec-structure.d.ts","names":[],"sources":["../../../src/analysis/validate/spec-structure.ts"],"sourcesContent":[],"mappings":";;;;AA8DA;;;AAEe,KAxCH,YAAA,GAwCG,KAAA,GAAA,MAAA,GAAA,OAAA;;;;KAnCH,QAAA;;;;UAeK,WAAA;;;;;sCAKqB,WAAW;;;;;iBAajC,qBAAA,WACJ,KAAK,wEACF,cACZ"}
1
+ {"version":3,"file":"spec-structure.d.ts","names":[],"sources":["../../../src/analysis/validate/spec-structure.ts"],"mappings":";;;;;AA6BA;KALY,YAAA;;;;KAKA,QAAA;;;;UAeK,WAAA;EAKP;;;;EAAR,OAAA,CAAQ,QAAA,UAAkB,QAAA,EAAU,QAAA,GAAW,YAAA;AAAA;AAajD;;;AAAA,iBAAgB,qBAAA,CACd,QAAA,EAAU,IAAA,CAAK,cAAA,4CACf,WAAA,GAAa,WAAA,GACZ,gBAAA"}
@@ -1,7 +1,6 @@
1
1
  import { FormatterConfig, FormatterType } from "@contractspec/lib.contracts";
2
2
 
3
3
  //#region src/formatter.d.ts
4
-
5
4
  interface FormatterOptions {
6
5
  /** Override formatter type from config */
7
6
  type?: FormatterType;
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.d.ts","names":[],"sources":["../src/formatter.ts"],"sourcesContent":[],"mappings":";;;;AAoLiB,UAlKA,gBAAA,CAkKY;EASP;EAEX,IAAA,CAAA,EA3KF,aA2KE;EACC;EACD,IAAA,CAAA,EAAA,OAAA;EACA;EAAR,GAAA,CAAA,EAAA,MAAA;EAAO;EA8EY,MAAA,CAAA,EAAA,OAAA;;AAGV,UAtPK,YAAA,CAsPL;EACD,OAAA,EAAA,OAAA;EACA,SAAA,EAAA,OAAA;EAAR,KAAA,CAAA,EAAA,MAAA;EAAO,QAAA,CAAA,EAAA,MAAA;kBAnPQ;;;;;;iBAkDI,eAAA,gBAEnB,QAAQ;UA8FM,YAAA;;;;;;;;iBASK,WAAA,oCAEX,2BACC,2BACD,eACR,QAAQ;;;;iBA8EW,gBAAA,2BAEX,2BACC,2BACD,eACR,QAAQ"}
1
+ {"version":3,"file":"formatter.d.ts","names":[],"sources":["../src/formatter.ts"],"mappings":";;;UAkBiB,gBAAA;EAEf;EAAA,IAAA,GAAO,aAAA;EAEP;EAAA,IAAA;EAIA;EAFA,GAAA;EAEM;EAAN,MAAA;AAAA;AAAA,UAGe,YAAA;EACf,OAAA;EACA,SAAA;EACA,KAAA;EACA,QAAA;EACA,aAAA,GAAgB,aAAA;AAAA;;;;AAkDlB;iBAAsB,eAAA,CACpB,GAAA,YACC,OAAA,CAAQ,aAAA;AAAA,UA8FM,YAAA;EACf,GAAA,GAAM,OAAA;EACN,IAAA,GAAO,OAAA;EACP,OAAA,GAAU,OAAA;AAAA;;;AAHZ;iBASsB,WAAA,CACpB,KAAA,qBACA,MAAA,GAAS,eAAA,EACT,OAAA,GAAU,gBAAA,EACV,MAAA,GAAS,YAAA,GACR,OAAA,CAAQ,YAAA;;;;iBA8EW,gBAAA,CACpB,KAAA,YACA,MAAA,GAAS,eAAA,EACT,OAAA,GAAU,gBAAA,EACV,MAAA,GAAS,YAAA,GACR,OAAA,CAAQ,YAAA"}
@@ -1,7 +1,6 @@
1
1
  import { LLMExportFormat, ParsedSpec, SpecToMarkdownOptions } from "../types/llm-types.js";
2
2
 
3
3
  //#region src/formatters/spec-markdown.d.ts
4
-
5
4
  /**
6
5
  * Generate markdown from a parsed spec.
7
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"spec-markdown.d.ts","names":[],"sources":["../../src/formatters/spec-markdown.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;iBAuBgB,cAAA,OACR,oBACE;;;;;;;iBA4WM,yBAAA,OACR,qBACG;;;;iBAQK,0BAAA,QACP,sBACC;;;;iBAiCM,oBAAA,QACP,sBACC"}
1
+ {"version":3,"file":"spec-markdown.d.ts","names":[],"sources":["../../src/formatters/spec-markdown.ts"],"mappings":";;;;;;;;;;;iBAuBgB,cAAA,CACd,IAAA,EAAM,UAAA,EACN,MAAA,EAAQ,eAAA,EACR,cAAA;EAA2B,KAAA;EAAgB,QAAA;AAAA;;;;iBA2W7B,yBAAA,CACd,IAAA,EAAM,UAAA,EACN,OAAA,EAAS,qBAAA;;;;iBAQK,0BAAA,CACd,KAAA,EAAO,UAAA,IACP,MAAA,EAAQ,eAAA;;;;iBAiCM,oBAAA,CACd,KAAA,EAAO,UAAA,IACP,MAAA,EAAQ,eAAA"}
@@ -2,7 +2,6 @@ import { ParsedSpec } from "../types/llm-types.js";
2
2
  import { DocBlock } from "@contractspec/lib.contracts/docs";
3
3
 
4
4
  //#region src/formatters/spec-to-docblock.d.ts
5
-
6
5
  /**
7
6
  * Convert a parsed spec to a DocBlock for documentation generation.
8
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"spec-to-docblock.d.ts","names":[],"sources":["../../src/formatters/spec-to-docblock.ts"],"sourcesContent":[],"mappings":";;;;;;;AAOA;iBAAgB,qBAAA,OACR;;IAEL"}
1
+ {"version":3,"file":"spec-to-docblock.d.ts","names":[],"sources":["../../src/formatters/spec-to-docblock.ts"],"mappings":";;;;;;AAOA;iBAAgB,qBAAA,CACd,IAAA,EAAM,UAAA,EACN,OAAA;EAAY,QAAA;AAAA,IACX,QAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-config.d.ts","names":[],"sources":["../../src/templates/app-config.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,wBAAA,OAA+B"}
1
+ {"version":3,"file":"app-config.d.ts","names":[],"sources":["../../src/templates/app-config.ts"],"mappings":";;;iBAGgB,wBAAA,CAAyB,IAAA,EAAM,oBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-view.d.ts","names":[],"sources":["../../src/templates/data-view.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,oBAAA,OAA2B"}
1
+ {"version":3,"file":"data-view.d.ts","names":[],"sources":["../../src/templates/data-view.ts"],"mappings":";;;iBAGgB,oBAAA,CAAqB,IAAA,EAAM,gBAAA"}
@@ -1,7 +1,6 @@
1
1
  import { EventSpecData } from "../types/spec-types.js";
2
2
 
3
3
  //#region src/templates/event.d.ts
4
-
5
4
  /**
6
5
  * Generate event spec TypeScript code.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.ts","names":[],"sources":["../../src/templates/event.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAWgB,iBAAA,OAAwB"}
1
+ {"version":3,"file":"event.d.ts","names":[],"sources":["../../src/templates/event.ts"],"mappings":";;;;;;iBAWgB,iBAAA,CAAkB,IAAA,EAAM,aAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"experiment.d.ts","names":[],"sources":["../../src/templates/experiment.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,sBAAA,OAA6B"}
1
+ {"version":3,"file":"experiment.d.ts","names":[],"sources":["../../src/templates/experiment.ts"],"mappings":";;;iBAGgB,sBAAA,CAAuB,IAAA,EAAM,kBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","names":[],"sources":["../../src/templates/handler.ts"],"sourcesContent":[],"mappings":";;AAUA;AAyCA;AA6BA;;;;iBAtEgB,uBAAA;;;;iBAyCA,yBAAA;;;;iBA6BA,oBAAA"}
1
+ {"version":3,"file":"handler.d.ts","names":[],"sources":["../../src/templates/handler.ts"],"mappings":";;AAUA;;;;;AAyCA;iBAzCgB,uBAAA,CACd,QAAA,UACA,IAAA;;;;iBAuCc,yBAAA,CACd,aAAA,UACA,WAAA;;;;iBA2Bc,oBAAA,CACd,UAAA,UACA,IAAA"}
@@ -32,7 +32,6 @@ ${fields.map((field) => {
32
32
  switch (field.type) {
33
33
  case "number": return ` ${field.key}: 0`;
34
34
  case "boolean": return ` ${field.key}: true`;
35
- case "string":
36
35
  default: return ` ${field.key}: '${field.key.toUpperCase()}_VALUE'`;
37
36
  }
38
37
  }).join(",\n")}
@@ -69,7 +68,6 @@ function mapConfigType(type) {
69
68
  switch (type) {
70
69
  case "number": return "number";
71
70
  case "boolean": return "boolean";
72
- case "string":
73
71
  default: return "string";
74
72
  }
75
73
  }
@@ -78,7 +76,6 @@ function stabilityToEnum(stability) {
78
76
  case "beta": return "Beta";
79
77
  case "stable": return "Stable";
80
78
  case "deprecated": return "Deprecated";
81
- case "experimental":
82
79
  default: return "Experimental";
83
80
  }
84
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"integration-utils.js","names":[],"sources":["../../src/templates/integration-utils.ts"],"sourcesContent":["import type {\n IntegrationConfigFieldData,\n IntegrationSecretFieldData,\n IntegrationSpecData,\n Stability,\n} from '../types/spec-types';\n\nexport function renderConfigSchema(\n fields: IntegrationConfigFieldData[]\n): string {\n const requiredFields = fields.filter((field) => field.required);\n const requiredBlock =\n requiredFields.length > 0\n ? ` required: [${requiredFields\n .map((field) => `'${field.key}'`)\n .join(', ')}],\n`\n : '';\n\n const properties = fields.length\n ? fields\n .map((field) => {\n const description = field.description\n ? `, description: '${escape(field.description)}'`\n : '';\n return ` ${field.key}: { type: '${mapConfigType(\n field.type\n )}'${description} }`;\n })\n .join(',\\n')\n : '';\n\n return ` schema: {\n type: 'object',\n${requiredBlock} properties: {\n${properties || ' '}\n },\n },\\n`;\n}\n\nexport function renderSecretSchema(\n fields: IntegrationSecretFieldData[]\n): string {\n const requiredFields = fields.filter((field) => field.required);\n const requiredBlock =\n requiredFields.length > 0\n ? ` required: [${requiredFields\n .map((field) => `'${field.key}'`)\n .join(', ')}],\n`\n : '';\n\n const properties = fields.length\n ? fields\n .map((field) => {\n const description = field.description\n ? `, description: '${escape(field.description)}'`\n : '';\n return ` ${field.key}: { type: 'string'${description} }`;\n })\n .join(',\\n')\n : '';\n\n return ` schema: {\n type: 'object',\n${requiredBlock} properties: {\n${properties || ' '}\n },\n },\\n`;\n}\n\nexport function renderConfigExample(\n fields: IntegrationConfigFieldData[]\n): string {\n if (fields.length === 0) {\n return `{}`;\n }\n\n const exampleEntries = fields.map((field) => {\n switch (field.type) {\n case 'number':\n return ` ${field.key}: 0`;\n case 'boolean':\n return ` ${field.key}: true`;\n case 'string':\n default:\n return ` ${field.key}: '${field.key.toUpperCase()}_VALUE'`;\n }\n });\n\n return `{\n${exampleEntries.join(',\\n')}\n }`;\n}\n\nexport function renderSecretExample(\n fields: IntegrationSecretFieldData[]\n): string {\n if (fields.length === 0) {\n return `{}`;\n }\n\n const exampleEntries = fields.map(\n (field) => ` ${field.key}: '${field.key.toUpperCase()}_SECRET'`\n );\n\n return `{\n${exampleEntries.join(',\\n')}\n }`;\n}\n\nexport function renderConstraints(rpm?: number, rph?: number): string {\n if (rpm == null && rph == null) return '';\n const entries: string[] = [];\n if (rpm != null) entries.push(` rpm: ${rpm}`);\n if (rph != null) entries.push(` rph: ${rph}`);\n return ` constraints: {\n rateLimit: {\n${entries.join(',\\n')}\n },\n },\n`;\n}\n\nexport function renderByokSetup(\n modes: string[],\n instructions?: string,\n scopes?: string[]\n): string {\n if (!modes.includes('byok')) {\n return '';\n }\n\n const instructionsLine = instructions\n ? ` setupInstructions: '${escape(instructions)}',\\n`\n : '';\n const scopesLine =\n scopes && scopes.length\n ? ` requiredScopes: [${scopes\n .map((scope) => `'${escape(scope)}'`)\n .join(', ')}],\\n`\n : '';\n\n if (!instructionsLine && !scopesLine) {\n return '';\n }\n\n return ` byokSetup: {\n${instructionsLine}${scopesLine} },\n`;\n}\n\nexport function mapConfigType(\n type: IntegrationConfigFieldData['type']\n): string {\n switch (type) {\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'string':\n default:\n return 'string';\n }\n}\n\nexport function stabilityToEnum(stability: Stability): string {\n switch (stability) {\n case 'beta':\n return 'Beta';\n case 'stable':\n return 'Stable';\n case 'deprecated':\n return 'Deprecated';\n case 'experimental':\n default:\n return 'Experimental';\n }\n}\n\nexport function renderProvides(data: IntegrationSpecData): string {\n return data.capabilitiesProvided\n .map((cap) => ` { key: '${cap.key}', version: ${cap.version} }`)\n .join(',\\n');\n}\n\nexport function renderRequires(data: IntegrationSpecData): string {\n if (data.capabilitiesRequired.length === 0) return '';\n\n return ` requires: [\n${data.capabilitiesRequired\n .map((req) => {\n const version =\n typeof req.version === 'number' ? `, version: ${req.version}` : '';\n const optional = req.optional ? ', optional: true' : '';\n const reason = req.reason ? `, reason: '${escape(req.reason)}'` : '';\n return ` { key: '${req.key}'${version}${optional}${reason} }`;\n })\n .join(',\\n')}\n ],`;\n}\n\nexport function escape(value: string): string {\n return value.replace(/`/g, '\\\\`').replace(/'/g, \"\\\\'\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"integration-utils.js","names":[],"sources":["../../src/templates/integration-utils.ts"],"sourcesContent":["import type {\n IntegrationConfigFieldData,\n IntegrationSecretFieldData,\n IntegrationSpecData,\n Stability,\n} from '../types/spec-types';\n\nexport function renderConfigSchema(\n fields: IntegrationConfigFieldData[]\n): string {\n const requiredFields = fields.filter((field) => field.required);\n const requiredBlock =\n requiredFields.length > 0\n ? ` required: [${requiredFields\n .map((field) => `'${field.key}'`)\n .join(', ')}],\n`\n : '';\n\n const properties = fields.length\n ? fields\n .map((field) => {\n const description = field.description\n ? `, description: '${escape(field.description)}'`\n : '';\n return ` ${field.key}: { type: '${mapConfigType(\n field.type\n )}'${description} }`;\n })\n .join(',\\n')\n : '';\n\n return ` schema: {\n type: 'object',\n${requiredBlock} properties: {\n${properties || ' '}\n },\n },\\n`;\n}\n\nexport function renderSecretSchema(\n fields: IntegrationSecretFieldData[]\n): string {\n const requiredFields = fields.filter((field) => field.required);\n const requiredBlock =\n requiredFields.length > 0\n ? ` required: [${requiredFields\n .map((field) => `'${field.key}'`)\n .join(', ')}],\n`\n : '';\n\n const properties = fields.length\n ? fields\n .map((field) => {\n const description = field.description\n ? `, description: '${escape(field.description)}'`\n : '';\n return ` ${field.key}: { type: 'string'${description} }`;\n })\n .join(',\\n')\n : '';\n\n return ` schema: {\n type: 'object',\n${requiredBlock} properties: {\n${properties || ' '}\n },\n },\\n`;\n}\n\nexport function renderConfigExample(\n fields: IntegrationConfigFieldData[]\n): string {\n if (fields.length === 0) {\n return `{}`;\n }\n\n const exampleEntries = fields.map((field) => {\n switch (field.type) {\n case 'number':\n return ` ${field.key}: 0`;\n case 'boolean':\n return ` ${field.key}: true`;\n case 'string':\n default:\n return ` ${field.key}: '${field.key.toUpperCase()}_VALUE'`;\n }\n });\n\n return `{\n${exampleEntries.join(',\\n')}\n }`;\n}\n\nexport function renderSecretExample(\n fields: IntegrationSecretFieldData[]\n): string {\n if (fields.length === 0) {\n return `{}`;\n }\n\n const exampleEntries = fields.map(\n (field) => ` ${field.key}: '${field.key.toUpperCase()}_SECRET'`\n );\n\n return `{\n${exampleEntries.join(',\\n')}\n }`;\n}\n\nexport function renderConstraints(rpm?: number, rph?: number): string {\n if (rpm == null && rph == null) return '';\n const entries: string[] = [];\n if (rpm != null) entries.push(` rpm: ${rpm}`);\n if (rph != null) entries.push(` rph: ${rph}`);\n return ` constraints: {\n rateLimit: {\n${entries.join(',\\n')}\n },\n },\n`;\n}\n\nexport function renderByokSetup(\n modes: string[],\n instructions?: string,\n scopes?: string[]\n): string {\n if (!modes.includes('byok')) {\n return '';\n }\n\n const instructionsLine = instructions\n ? ` setupInstructions: '${escape(instructions)}',\\n`\n : '';\n const scopesLine =\n scopes && scopes.length\n ? ` requiredScopes: [${scopes\n .map((scope) => `'${escape(scope)}'`)\n .join(', ')}],\\n`\n : '';\n\n if (!instructionsLine && !scopesLine) {\n return '';\n }\n\n return ` byokSetup: {\n${instructionsLine}${scopesLine} },\n`;\n}\n\nexport function mapConfigType(\n type: IntegrationConfigFieldData['type']\n): string {\n switch (type) {\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'string':\n default:\n return 'string';\n }\n}\n\nexport function stabilityToEnum(stability: Stability): string {\n switch (stability) {\n case 'beta':\n return 'Beta';\n case 'stable':\n return 'Stable';\n case 'deprecated':\n return 'Deprecated';\n case 'experimental':\n default:\n return 'Experimental';\n }\n}\n\nexport function renderProvides(data: IntegrationSpecData): string {\n return data.capabilitiesProvided\n .map((cap) => ` { key: '${cap.key}', version: ${cap.version} }`)\n .join(',\\n');\n}\n\nexport function renderRequires(data: IntegrationSpecData): string {\n if (data.capabilitiesRequired.length === 0) return '';\n\n return ` requires: [\n${data.capabilitiesRequired\n .map((req) => {\n const version =\n typeof req.version === 'number' ? `, version: ${req.version}` : '';\n const optional = req.optional ? ', optional: true' : '';\n const reason = req.reason ? `, reason: '${escape(req.reason)}'` : '';\n return ` { key: '${req.key}'${version}${optional}${reason} }`;\n })\n .join(',\\n')}\n ],`;\n}\n\nexport function escape(value: string): string {\n return value.replace(/`/g, '\\\\`').replace(/'/g, \"\\\\'\");\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"integration.d.ts","names":[],"sources":["../../src/templates/integration.ts"],"sourcesContent":[],"mappings":";;;iBAegB,uBAAA,OAA8B"}
1
+ {"version":3,"file":"integration.d.ts","names":[],"sources":["../../src/templates/integration.ts"],"mappings":";;;iBAegB,uBAAA,CAAwB,IAAA,EAAM,mBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge.d.ts","names":[],"sources":["../../src/templates/knowledge.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,0BAAA,OACR"}
1
+ {"version":3,"file":"knowledge.d.ts","names":[],"sources":["../../src/templates/knowledge.ts"],"mappings":";;;iBAGgB,0BAAA,CACd,IAAA,EAAM,sBAAA"}
@@ -56,7 +56,6 @@ function stabilityToEnum(stability) {
56
56
  case "beta": return "Beta";
57
57
  case "stable": return "Stable";
58
58
  case "deprecated": return "Deprecated";
59
- case "experimental":
60
59
  default: return "Experimental";
61
60
  }
62
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge.js","names":[],"sources":["../../src/templates/knowledge.ts"],"sourcesContent":["import type { KnowledgeSpaceSpecData, Stability } from '../types/spec-types';\nimport { toPascalCase, escapeString } from './utils';\n\nexport function generateKnowledgeSpaceSpec(\n data: KnowledgeSpaceSpecData\n): string {\n const specName = toPascalCase(data.name.split('.').pop() ?? 'KnowledgeSpace');\n const varName = `${specName}KnowledgeSpace`;\n const registerFn = `register${specName}KnowledgeSpace`;\n\n const retention = renderRetention(data);\n const access = renderAccess(data);\n const indexing = renderIndexing(data);\n const policyComment =\n data.policyName && !data.policyVersion\n ? ` // defaults to latest version`\n : '';\n\n return `import { StabilityEnum } from '@contractspec/lib.contracts/ownership';\nimport type { KnowledgeSpaceSpec } from '@contractspec/lib.contracts/knowledge/spec';\nimport type { KnowledgeSpaceRegistry } from '@contractspec/lib.contracts/knowledge/spec';\n\nexport const ${varName}: KnowledgeSpaceSpec = {\n meta: {\n key: '${escapeString(data.name)}',\n version: ${data.version},\n category: '${data.category}',\n displayName: '${escape(data.displayName)}',\n title: '${escape(data.title)}',\n description: '${escape(data.description)}',\n domain: '${escape(data.domain)}',\n owners: [${data.owners.map((owner) => `'${escapeString(owner)}'`).join(', ')}],\n tags: [${data.tags.map((tag) => `'${escapeString(tag)}'`).join(', ')}],\n stability: StabilityEnum.${stabilityToEnum(data.stability)},\n },\n retention: ${retention},\n access: {\n${access}${data.policyName ? ` policy: { name: '${escapeString(data.policyName)}',${data.policyVersion ? ` version: ${data.policyVersion}` : ''} },${policyComment}\\n` : ''} },\n${indexing} description: '${escape(data.description || data.displayName)}',\n};\n\nexport function ${registerFn}(registry: KnowledgeSpaceRegistry): KnowledgeSpaceRegistry {\n return registry.register(${varName});\n}\n`;\n}\n\nfunction renderRetention(data: KnowledgeSpaceSpecData): string {\n const ttl =\n data.retention.ttlDays === null\n ? 'null'\n : typeof data.retention.ttlDays === 'number'\n ? String(data.retention.ttlDays)\n : 'null';\n const archive =\n typeof data.retention.archiveAfterDays === 'number'\n ? `, archiveAfterDays: ${data.retention.archiveAfterDays}`\n : '';\n return `{ ttlDays: ${ttl}${archive} }`;\n}\n\nfunction renderAccess(data: KnowledgeSpaceSpecData): string {\n const trustLine = ` trustLevel: '${data.trustLevel}',\\n`;\n const automationLine = ` automationWritable: ${data.automationWritable},\\n`;\n return `${trustLine}${automationLine}`;\n}\n\nfunction renderIndexing(data: KnowledgeSpaceSpecData): string {\n const entries: string[] = [];\n if (data.embeddingModel) {\n entries.push(` embeddingModel: '${escape(data.embeddingModel)}'`);\n }\n if (typeof data.chunkSize === 'number') {\n entries.push(` chunkSize: ${data.chunkSize}`);\n }\n if (data.vectorDbIntegration) {\n entries.push(\n ` vectorDbIntegration: '${escape(data.vectorDbIntegration)}'`\n );\n }\n if (entries.length === 0) {\n return '';\n }\n return ` indexing: {\\n${entries.join(',\\n')}\\n },\\n`;\n}\n\nfunction stabilityToEnum(stability: Stability): string {\n switch (stability) {\n case 'beta':\n return 'Beta';\n case 'stable':\n return 'Stable';\n case 'deprecated':\n return 'Deprecated';\n case 'experimental':\n default:\n return 'Experimental';\n }\n}\n\nfunction escape(value: string): string {\n return value.replace(/`/g, '\\\\`').replace(/'/g, \"\\\\'\");\n}\n"],"mappings":";;;AAGA,SAAgB,2BACd,MACQ;CACR,MAAM,WAAW,aAAa,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI,iBAAiB;CAC7E,MAAM,UAAU,GAAG,SAAS;CAC5B,MAAM,aAAa,WAAW,SAAS;CAEvC,MAAM,YAAY,gBAAgB,KAAK;CACvC,MAAM,SAAS,aAAa,KAAK;CACjC,MAAM,WAAW,eAAe,KAAK;CACrC,MAAM,gBACJ,KAAK,cAAc,CAAC,KAAK,gBACrB,mCACA;AAEN,QAAO;;;;eAIM,QAAQ;;YAEX,aAAa,KAAK,KAAK,CAAC;eACrB,KAAK,QAAQ;iBACX,KAAK,SAAS;oBACX,OAAO,KAAK,YAAY,CAAC;cAC/B,OAAO,KAAK,MAAM,CAAC;oBACb,OAAO,KAAK,YAAY,CAAC;eAC9B,OAAO,KAAK,OAAO,CAAC;eACpB,KAAK,OAAO,KAAK,UAAU,IAAI,aAAa,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;aACpE,KAAK,KAAK,KAAK,QAAQ,IAAI,aAAa,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;+BAC1C,gBAAgB,KAAK,UAAU,CAAC;;eAEhD,UAAU;;EAEvB,SAAS,KAAK,aAAa,wBAAwB,aAAa,KAAK,WAAW,CAAC,IAAI,KAAK,gBAAgB,aAAa,KAAK,kBAAkB,GAAG,KAAK,cAAc,MAAM,GAAG;EAC7K,SAAS,kBAAkB,OAAO,KAAK,eAAe,KAAK,YAAY,CAAC;;;kBAGxD,WAAW;6BACA,QAAQ;;;;AAKrC,SAAS,gBAAgB,MAAsC;AAW7D,QAAO,cATL,KAAK,UAAU,YAAY,OACvB,SACA,OAAO,KAAK,UAAU,YAAY,WAChC,OAAO,KAAK,UAAU,QAAQ,GAC9B,SAEN,OAAO,KAAK,UAAU,qBAAqB,WACvC,uBAAuB,KAAK,UAAU,qBACtC,GAC6B;;AAGrC,SAAS,aAAa,MAAsC;AAG1D,QAAO,GAFW,oBAAoB,KAAK,WAAW,QAC/B,2BAA2B,KAAK,mBAAmB;;AAI5E,SAAS,eAAe,MAAsC;CAC5D,MAAM,UAAoB,EAAE;AAC5B,KAAI,KAAK,eACP,SAAQ,KAAK,wBAAwB,OAAO,KAAK,eAAe,CAAC,GAAG;AAEtE,KAAI,OAAO,KAAK,cAAc,SAC5B,SAAQ,KAAK,kBAAkB,KAAK,YAAY;AAElD,KAAI,KAAK,oBACP,SAAQ,KACN,6BAA6B,OAAO,KAAK,oBAAoB,CAAC,GAC/D;AAEH,KAAI,QAAQ,WAAW,EACrB,QAAO;AAET,QAAO,kBAAkB,QAAQ,KAAK,MAAM,CAAC;;AAG/C,SAAS,gBAAgB,WAA8B;AACrD,SAAQ,WAAR;EACE,KAAK,OACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,aACH,QAAO;EACT,KAAK;EACL,QACE,QAAO;;;AAIb,SAAS,OAAO,OAAuB;AACrC,QAAO,MAAM,QAAQ,MAAM,MAAM,CAAC,QAAQ,MAAM,MAAM"}
1
+ {"version":3,"file":"knowledge.js","names":[],"sources":["../../src/templates/knowledge.ts"],"sourcesContent":["import type { KnowledgeSpaceSpecData, Stability } from '../types/spec-types';\nimport { toPascalCase, escapeString } from './utils';\n\nexport function generateKnowledgeSpaceSpec(\n data: KnowledgeSpaceSpecData\n): string {\n const specName = toPascalCase(data.name.split('.').pop() ?? 'KnowledgeSpace');\n const varName = `${specName}KnowledgeSpace`;\n const registerFn = `register${specName}KnowledgeSpace`;\n\n const retention = renderRetention(data);\n const access = renderAccess(data);\n const indexing = renderIndexing(data);\n const policyComment =\n data.policyName && !data.policyVersion\n ? ` // defaults to latest version`\n : '';\n\n return `import { StabilityEnum } from '@contractspec/lib.contracts/ownership';\nimport type { KnowledgeSpaceSpec } from '@contractspec/lib.contracts/knowledge/spec';\nimport type { KnowledgeSpaceRegistry } from '@contractspec/lib.contracts/knowledge/spec';\n\nexport const ${varName}: KnowledgeSpaceSpec = {\n meta: {\n key: '${escapeString(data.name)}',\n version: ${data.version},\n category: '${data.category}',\n displayName: '${escape(data.displayName)}',\n title: '${escape(data.title)}',\n description: '${escape(data.description)}',\n domain: '${escape(data.domain)}',\n owners: [${data.owners.map((owner) => `'${escapeString(owner)}'`).join(', ')}],\n tags: [${data.tags.map((tag) => `'${escapeString(tag)}'`).join(', ')}],\n stability: StabilityEnum.${stabilityToEnum(data.stability)},\n },\n retention: ${retention},\n access: {\n${access}${data.policyName ? ` policy: { name: '${escapeString(data.policyName)}',${data.policyVersion ? ` version: ${data.policyVersion}` : ''} },${policyComment}\\n` : ''} },\n${indexing} description: '${escape(data.description || data.displayName)}',\n};\n\nexport function ${registerFn}(registry: KnowledgeSpaceRegistry): KnowledgeSpaceRegistry {\n return registry.register(${varName});\n}\n`;\n}\n\nfunction renderRetention(data: KnowledgeSpaceSpecData): string {\n const ttl =\n data.retention.ttlDays === null\n ? 'null'\n : typeof data.retention.ttlDays === 'number'\n ? String(data.retention.ttlDays)\n : 'null';\n const archive =\n typeof data.retention.archiveAfterDays === 'number'\n ? `, archiveAfterDays: ${data.retention.archiveAfterDays}`\n : '';\n return `{ ttlDays: ${ttl}${archive} }`;\n}\n\nfunction renderAccess(data: KnowledgeSpaceSpecData): string {\n const trustLine = ` trustLevel: '${data.trustLevel}',\\n`;\n const automationLine = ` automationWritable: ${data.automationWritable},\\n`;\n return `${trustLine}${automationLine}`;\n}\n\nfunction renderIndexing(data: KnowledgeSpaceSpecData): string {\n const entries: string[] = [];\n if (data.embeddingModel) {\n entries.push(` embeddingModel: '${escape(data.embeddingModel)}'`);\n }\n if (typeof data.chunkSize === 'number') {\n entries.push(` chunkSize: ${data.chunkSize}`);\n }\n if (data.vectorDbIntegration) {\n entries.push(\n ` vectorDbIntegration: '${escape(data.vectorDbIntegration)}'`\n );\n }\n if (entries.length === 0) {\n return '';\n }\n return ` indexing: {\\n${entries.join(',\\n')}\\n },\\n`;\n}\n\nfunction stabilityToEnum(stability: Stability): string {\n switch (stability) {\n case 'beta':\n return 'Beta';\n case 'stable':\n return 'Stable';\n case 'deprecated':\n return 'Deprecated';\n case 'experimental':\n default:\n return 'Experimental';\n }\n}\n\nfunction escape(value: string): string {\n return value.replace(/`/g, '\\\\`').replace(/'/g, \"\\\\'\");\n}\n"],"mappings":";;;AAGA,SAAgB,2BACd,MACQ;CACR,MAAM,WAAW,aAAa,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI,iBAAiB;CAC7E,MAAM,UAAU,GAAG,SAAS;CAC5B,MAAM,aAAa,WAAW,SAAS;CAEvC,MAAM,YAAY,gBAAgB,KAAK;CACvC,MAAM,SAAS,aAAa,KAAK;CACjC,MAAM,WAAW,eAAe,KAAK;CACrC,MAAM,gBACJ,KAAK,cAAc,CAAC,KAAK,gBACrB,mCACA;AAEN,QAAO;;;;eAIM,QAAQ;;YAEX,aAAa,KAAK,KAAK,CAAC;eACrB,KAAK,QAAQ;iBACX,KAAK,SAAS;oBACX,OAAO,KAAK,YAAY,CAAC;cAC/B,OAAO,KAAK,MAAM,CAAC;oBACb,OAAO,KAAK,YAAY,CAAC;eAC9B,OAAO,KAAK,OAAO,CAAC;eACpB,KAAK,OAAO,KAAK,UAAU,IAAI,aAAa,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;aACpE,KAAK,KAAK,KAAK,QAAQ,IAAI,aAAa,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;+BAC1C,gBAAgB,KAAK,UAAU,CAAC;;eAEhD,UAAU;;EAEvB,SAAS,KAAK,aAAa,wBAAwB,aAAa,KAAK,WAAW,CAAC,IAAI,KAAK,gBAAgB,aAAa,KAAK,kBAAkB,GAAG,KAAK,cAAc,MAAM,GAAG;EAC7K,SAAS,kBAAkB,OAAO,KAAK,eAAe,KAAK,YAAY,CAAC;;;kBAGxD,WAAW;6BACA,QAAQ;;;;AAKrC,SAAS,gBAAgB,MAAsC;AAW7D,QAAO,cATL,KAAK,UAAU,YAAY,OACvB,SACA,OAAO,KAAK,UAAU,YAAY,WAChC,OAAO,KAAK,UAAU,QAAQ,GAC9B,SAEN,OAAO,KAAK,UAAU,qBAAqB,WACvC,uBAAuB,KAAK,UAAU,qBACtC,GAC6B;;AAGrC,SAAS,aAAa,MAAsC;AAG1D,QAAO,GAFW,oBAAoB,KAAK,WAAW,QAC/B,2BAA2B,KAAK,mBAAmB;;AAI5E,SAAS,eAAe,MAAsC;CAC5D,MAAM,UAAoB,EAAE;AAC5B,KAAI,KAAK,eACP,SAAQ,KAAK,wBAAwB,OAAO,KAAK,eAAe,CAAC,GAAG;AAEtE,KAAI,OAAO,KAAK,cAAc,SAC5B,SAAQ,KAAK,kBAAkB,KAAK,YAAY;AAElD,KAAI,KAAK,oBACP,SAAQ,KACN,6BAA6B,OAAO,KAAK,oBAAoB,CAAC,GAC/D;AAEH,KAAI,QAAQ,WAAW,EACrB,QAAO;AAET,QAAO,kBAAkB,QAAQ,KAAK,MAAM,CAAC;;AAG/C,SAAS,gBAAgB,WAA8B;AACrD,SAAQ,WAAR;EACE,KAAK,OACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,aACH,QAAO;EAET,QACE,QAAO;;;AAIb,SAAS,OAAO,OAAuB;AACrC,QAAO,MAAM,QAAQ,MAAM,MAAM,CAAC,QAAQ,MAAM,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"migration.d.ts","names":[],"sources":["../../src/templates/migration.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,qBAAA,OAA4B"}
1
+ {"version":3,"file":"migration.d.ts","names":[],"sources":["../../src/templates/migration.ts"],"mappings":";;;iBAGgB,qBAAA,CAAsB,IAAA,EAAM,iBAAA"}
@@ -43,7 +43,6 @@ function renderSteps(steps) {
43
43
  ${description}
44
44
  script: \`${escape(step.script ?? "")}\`,
45
45
  }`;
46
- case "validation":
47
46
  default: return ` {
48
47
  kind: 'validation',
49
48
  ${description}
@@ -1 +1 @@
1
- {"version":3,"file":"migration.js","names":[],"sources":["../../src/templates/migration.ts"],"sourcesContent":["import type { MigrationSpecData } from '../types/spec-types';\nimport { toPascalCase, escapeString } from './utils';\n\nexport function generateMigrationSpec(data: MigrationSpecData): string {\n const specName = toPascalCase(data.name.split('.').pop() ?? 'Migration');\n const migrationVar = `${specName}Migration`;\n\n const dependencies =\n data.dependencies.length > 0\n ? `dependencies: [${data.dependencies\n .map((dep) => `'${escapeString(dep)}'`)\n .join(', ')}],`\n : '';\n\n return `import type { MigrationSpec } from '@contractspec/lib.contracts/migrations';\n\nexport const ${migrationVar}: MigrationSpec = {\n meta: {\n key: '${escapeString(data.name)}',\n version: ${data.version},\n title: '${escape(data.title)}',\n description: '${escape(data.description ?? '')}',\n domain: '${escape(data.domain)}',\n owners: [${data.owners.map((owner) => `'${escapeString(owner)}'`).join(', ')}],\n tags: [${data.tags.map((tag) => `'${escapeString(tag)}'`).join(', ')}],\n stability: '${data.stability}',\n },\n plan: {\n up: [\n${renderSteps(data.up)}\n ],${\n data.down && data.down.length\n ? `\n down: [\n${renderSteps(data.down)}\n ],`\n : ''\n }\n },\n ${dependencies}\n};\n`;\n}\n\nfunction renderSteps(steps: MigrationSpecData['up']) {\n return steps\n .map((step) => {\n const description = step.description\n ? `description: '${escape(step.description)}',`\n : '';\n switch (step.kind) {\n case 'schema':\n return ` {\n kind: 'schema',\n ${description}\n sql: \\`${escape(step.sql ?? '')}\\`,\n }`;\n case 'data':\n return ` {\n kind: 'data',\n ${description}\n script: \\`${escape(step.script ?? '')}\\`,\n }`;\n case 'validation':\n default:\n return ` {\n kind: 'validation',\n ${description}\n assertion: \\`${escape(step.assertion ?? '')}\\`,\n }`;\n }\n })\n .join(',\\n');\n}\n\nfunction escape(value: string): string {\n return value.replace(/`/g, '\\\\`').replace(/'/g, \"\\\\'\");\n}\n"],"mappings":";;;AAGA,SAAgB,sBAAsB,MAAiC;CAErE,MAAM,eAAe,GADJ,aAAa,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI,YAAY,CACvC;CAEjC,MAAM,eACJ,KAAK,aAAa,SAAS,IACvB,kBAAkB,KAAK,aACpB,KAAK,QAAQ,IAAI,aAAa,IAAI,CAAC,GAAG,CACtC,KAAK,KAAK,CAAC,MACd;AAEN,QAAO;;eAEM,aAAa;;YAEhB,aAAa,KAAK,KAAK,CAAC;eACrB,KAAK,QAAQ;cACd,OAAO,KAAK,MAAM,CAAC;oBACb,OAAO,KAAK,eAAe,GAAG,CAAC;eACpC,OAAO,KAAK,OAAO,CAAC;eACpB,KAAK,OAAO,KAAK,UAAU,IAAI,aAAa,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;aACpE,KAAK,KAAK,KAAK,QAAQ,IAAI,aAAa,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;kBACvD,KAAK,UAAU;;;;EAI/B,YAAY,KAAK,GAAG,CAAC;QAEjB,KAAK,QAAQ,KAAK,KAAK,SACnB;;EAER,YAAY,KAAK,KAAK,CAAC;UAEf,GACL;;IAED,aAAa;;;;AAKjB,SAAS,YAAY,OAAgC;AACnD,QAAO,MACJ,KAAK,SAAS;EACb,MAAM,cAAc,KAAK,cACrB,iBAAiB,OAAO,KAAK,YAAY,CAAC,MAC1C;AACJ,UAAQ,KAAK,MAAb;GACE,KAAK,SACH,QAAO;;UAEP,YAAY;iBACL,OAAO,KAAK,OAAO,GAAG,CAAC;;GAEhC,KAAK,OACH,QAAO;;UAEP,YAAY;oBACF,OAAO,KAAK,UAAU,GAAG,CAAC;;GAEtC,KAAK;GACL,QACE,QAAO;;UAEP,YAAY;uBACC,OAAO,KAAK,aAAa,GAAG,CAAC;;;GAG9C,CACD,KAAK,MAAM;;AAGhB,SAAS,OAAO,OAAuB;AACrC,QAAO,MAAM,QAAQ,MAAM,MAAM,CAAC,QAAQ,MAAM,MAAM"}
1
+ {"version":3,"file":"migration.js","names":[],"sources":["../../src/templates/migration.ts"],"sourcesContent":["import type { MigrationSpecData } from '../types/spec-types';\nimport { toPascalCase, escapeString } from './utils';\n\nexport function generateMigrationSpec(data: MigrationSpecData): string {\n const specName = toPascalCase(data.name.split('.').pop() ?? 'Migration');\n const migrationVar = `${specName}Migration`;\n\n const dependencies =\n data.dependencies.length > 0\n ? `dependencies: [${data.dependencies\n .map((dep) => `'${escapeString(dep)}'`)\n .join(', ')}],`\n : '';\n\n return `import type { MigrationSpec } from '@contractspec/lib.contracts/migrations';\n\nexport const ${migrationVar}: MigrationSpec = {\n meta: {\n key: '${escapeString(data.name)}',\n version: ${data.version},\n title: '${escape(data.title)}',\n description: '${escape(data.description ?? '')}',\n domain: '${escape(data.domain)}',\n owners: [${data.owners.map((owner) => `'${escapeString(owner)}'`).join(', ')}],\n tags: [${data.tags.map((tag) => `'${escapeString(tag)}'`).join(', ')}],\n stability: '${data.stability}',\n },\n plan: {\n up: [\n${renderSteps(data.up)}\n ],${\n data.down && data.down.length\n ? `\n down: [\n${renderSteps(data.down)}\n ],`\n : ''\n }\n },\n ${dependencies}\n};\n`;\n}\n\nfunction renderSteps(steps: MigrationSpecData['up']) {\n return steps\n .map((step) => {\n const description = step.description\n ? `description: '${escape(step.description)}',`\n : '';\n switch (step.kind) {\n case 'schema':\n return ` {\n kind: 'schema',\n ${description}\n sql: \\`${escape(step.sql ?? '')}\\`,\n }`;\n case 'data':\n return ` {\n kind: 'data',\n ${description}\n script: \\`${escape(step.script ?? '')}\\`,\n }`;\n case 'validation':\n default:\n return ` {\n kind: 'validation',\n ${description}\n assertion: \\`${escape(step.assertion ?? '')}\\`,\n }`;\n }\n })\n .join(',\\n');\n}\n\nfunction escape(value: string): string {\n return value.replace(/`/g, '\\\\`').replace(/'/g, \"\\\\'\");\n}\n"],"mappings":";;;AAGA,SAAgB,sBAAsB,MAAiC;CAErE,MAAM,eAAe,GADJ,aAAa,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI,YAAY,CACvC;CAEjC,MAAM,eACJ,KAAK,aAAa,SAAS,IACvB,kBAAkB,KAAK,aACpB,KAAK,QAAQ,IAAI,aAAa,IAAI,CAAC,GAAG,CACtC,KAAK,KAAK,CAAC,MACd;AAEN,QAAO;;eAEM,aAAa;;YAEhB,aAAa,KAAK,KAAK,CAAC;eACrB,KAAK,QAAQ;cACd,OAAO,KAAK,MAAM,CAAC;oBACb,OAAO,KAAK,eAAe,GAAG,CAAC;eACpC,OAAO,KAAK,OAAO,CAAC;eACpB,KAAK,OAAO,KAAK,UAAU,IAAI,aAAa,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;aACpE,KAAK,KAAK,KAAK,QAAQ,IAAI,aAAa,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;kBACvD,KAAK,UAAU;;;;EAI/B,YAAY,KAAK,GAAG,CAAC;QAEjB,KAAK,QAAQ,KAAK,KAAK,SACnB;;EAER,YAAY,KAAK,KAAK,CAAC;UAEf,GACL;;IAED,aAAa;;;;AAKjB,SAAS,YAAY,OAAgC;AACnD,QAAO,MACJ,KAAK,SAAS;EACb,MAAM,cAAc,KAAK,cACrB,iBAAiB,OAAO,KAAK,YAAY,CAAC,MAC1C;AACJ,UAAQ,KAAK,MAAb;GACE,KAAK,SACH,QAAO;;UAEP,YAAY;iBACL,OAAO,KAAK,OAAO,GAAG,CAAC;;GAEhC,KAAK,OACH,QAAO;;UAEP,YAAY;oBACF,OAAO,KAAK,UAAU,GAAG,CAAC;;GAGtC,QACE,QAAO;;UAEP,YAAY;uBACC,OAAO,KAAK,aAAa,GAAG,CAAC;;;GAG9C,CACD,KAAK,MAAM;;AAGhB,SAAS,OAAO,OAAuB;AACrC,QAAO,MAAM,QAAQ,MAAM,MAAM,CAAC,QAAQ,MAAM,MAAM"}
@@ -1,7 +1,6 @@
1
1
  import { OperationSpecData } from "../types/spec-types.js";
2
2
 
3
3
  //#region src/templates/operation.d.ts
4
-
5
4
  /**
6
5
  * Generate operation spec TypeScript code.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"operation.d.ts","names":[],"sources":["../../src/templates/operation.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAWgB,qBAAA,OAA4B"}
1
+ {"version":3,"file":"operation.d.ts","names":[],"sources":["../../src/templates/operation.ts"],"mappings":";;;;;;iBAWgB,qBAAA,CAAsB,IAAA,EAAM,iBAAA"}
@@ -1,7 +1,6 @@
1
1
  import { PresentationSpecData } from "../types/spec-types.js";
2
2
 
3
3
  //#region src/templates/presentation.d.ts
4
-
5
4
  /**
6
5
  * Generate presentation spec TypeScript code.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"presentation.d.ts","names":[],"sources":["../../src/templates/presentation.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAWgB,wBAAA,OAA+B"}
1
+ {"version":3,"file":"presentation.d.ts","names":[],"sources":["../../src/templates/presentation.ts"],"mappings":";;;;;;iBAWgB,wBAAA,CAAyB,IAAA,EAAM,oBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","names":[],"sources":["../../src/templates/telemetry.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,qBAAA,OAA4B"}
1
+ {"version":3,"file":"telemetry.d.ts","names":[],"sources":["../../src/templates/telemetry.ts"],"mappings":";;;iBAGgB,qBAAA,CAAsB,IAAA,EAAM,iBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/templates/utils.ts"],"sourcesContent":[],"mappings":";;AAOA;AAQA;AAUA;AAUA;AAOA;iBAnCgB,WAAA;;;;iBAQA,YAAA;;;;iBAUA,WAAA;;;;iBAUA,UAAA;;;;iBAOA,YAAA"}
1
+ {"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/templates/utils.ts"],"mappings":";;AAOA;;;;;iBAAgB,WAAA,CAAY,GAAA;;;;iBAQZ,YAAA,CAAa,GAAA;AAU7B;;;AAAA,iBAAgB,WAAA,CAAY,GAAA;;AAU5B;;iBAAgB,UAAA,CAAW,GAAA;;;AAO3B;iBAAgB,YAAA,CAAa,KAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-runner.d.ts","names":[],"sources":["../../src/templates/workflow-runner.ts"],"sourcesContent":[],"mappings":";UAAU,qBAAA;EAAA,UAAA,EAAA,MAAA;EAOM,cAAA,EAAA,MAAA;EACd,UAAA,EAAA,MAAA;EACA,YAAA,EAAA,MAAA;;AAEA,iBAJc,8BAAA,CAId;EAAA,UAAA;EAAA,cAAA;EAAA,UAAA;EAAA;AAAA,CAAA,EACC,qBADD,CAAA,EAAA,MAAA"}
1
+ {"version":3,"file":"workflow-runner.d.ts","names":[],"sources":["../../src/templates/workflow-runner.ts"],"mappings":";UAAU,qBAAA;EACR,UAAA;EACA,cAAA;EACA,UAAA;EACA,YAAA;AAAA;AAAA,iBAGc,8BAAA,CAAA;EACd,UAAA;EACA,cAAA;EACA,UAAA;EACA;AAAA,GACC,qBAAA"}
@@ -1,7 +1,6 @@
1
1
  import { WorkflowSpecData } from "../types/spec-types.js";
2
2
 
3
3
  //#region src/templates/workflow.d.ts
4
-
5
4
  /**
6
5
  * Generate workflow spec TypeScript code.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","names":[],"sources":["../../src/templates/workflow.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAWgB,oBAAA,OAA2B"}
1
+ {"version":3,"file":"workflow.d.ts","names":[],"sources":["../../src/templates/workflow.ts"],"mappings":";;;;;;iBAWgB,oBAAA,CAAqB,IAAA,EAAM,gBAAA"}
@@ -2,7 +2,6 @@ import { Stability } from "./spec-types.js";
2
2
  import { ContractSpecType } from "@contractspec/lib.contracts";
3
3
 
4
4
  //#region src/types/analysis-types.d.ts
5
-
6
5
  /**
7
6
  * Spec type detected from file analysis.
8
7
  * Covers all contract types from @contractspec/lib.contracts.
@@ -1 +1 @@
1
- {"version":3,"file":"analysis-types.d.ts","names":[],"sources":["../../src/types/analysis-types.ts"],"sourcesContent":[],"mappings":";;;;;AAgBA;AAaA;AAmBA;AASA;AASiB,KAvDL,gBAAA,GAAmB,gBAwDhB,GAAA,SAAA;AAUf;;;AAMc,KAnEF,OAAA,GAmEE,WAAA,GAAA,OAAA,GAAA,cAAA,GAAA,YAAA,GAAA,YAAA,GAAA,QAAA,GAAA,MAAA;;;;;AAqBoB,KA3EtB,qBAAA,GA2EsB,SAAA,GAAA,OAAA,GAAA,OAAA,GAAA,cAAA,GAAA,YAAA,GAAA,QAAA,GAAA,MAAA,GAAA,SAAA,GAAA,YAAA,GAAA,aAAA,GAAA,UAAA,GAAA,SAAA,GAAA,WAAA,GAAA,SAAA;AAalC;;;AAeU,UApFO,OAAA,CAoFP;EACO,GAAA,EAAA,MAAA;EACF,OAAA,EAAA,MAAA;;;;;;AAeI,UA5FF,mBAAA,CA4FE;EAUF,IAAA,EAAA,WAAA,GAAiB,UAAA;EA6CtB,GAAA,EAAA,MAAA;EAKK,OAAA,CAAA,EAAA,MAAA;AAWjB;AAOA;AAUA;AAKA;UAhLiB,YAAA;QACT;;;;;;;;;UAUS,cAAA;;YAEL;;;SAGH;cACK;;;;;;;;;;;;kBAgBI;eACH;aACF;eAGE;;;;;;;;;;UAaE,iBAAA;;;;;;;;;cASH;;;cAKA;UACJ;iBACO;eACF;;cAID;cACA;;;QAIiB;UAAe;;;;;aAMjC;;;;;;;UAUI,iBAAA;;;;;;;;;cASH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoCF,gBAAA;;;;UAKK,gBAAA;QACT;;;;;;;;;UAUS,mBAAA;;;;;;UAOA,YAAA;;;;;;;;;KAUL,aAAA,GAAgB,YAAY;;;;UAKvB,gBAAA"}
1
+ {"version":3,"file":"analysis-types.d.ts","names":[],"sources":["../../src/types/analysis-types.ts"],"mappings":";;;;;;;;KAWY,gBAAA,GAAmB,gBAAA;;;;KAKnB,OAAA;AAaZ;;;;AAAA,KAAY,qBAAA;AAmBZ;;;AAAA,UAAiB,OAAA;EACf,GAAA;EACA,OAAA;AAAA;;;;;UAOe,mBAAA;EACf,IAAA;EACA,GAAA;EACA,OAAA;AAAA;;;;UAMe,YAAA;EACf,IAAA,EAAM,OAAA;EACN,GAAA;EACA,OAAA;EACA,UAAA;EACA,UAAA;AAAA;AAMF;;;AAAA,UAAiB,cAAA;EACf,QAAA;EACA,QAAA,EAAU,gBAAA;EACV,GAAA;EACA,OAAA;EACA,IAAA,GAAO,qBAAA;EACP,SAAA,GAAY,SAAA;EACZ,WAAA;EACA,IAAA;EACA,OAAA;EACA,MAAA;EACA,IAAA;EAGA,OAAA;EACA,KAAA;EACA,SAAA;EACA,UAAA;EACA,UAAA;EACA,aAAA;EAGA,aAAA,GAAgB,OAAA;EAChB,UAAA,GAAa,OAAA;EACb,QAAA,GAAW,OAAA;EAGX,UAAA,GAAa,mBAAA;EACb,YAAA;IACE,UAAA;IACA,QAAA;EAAA;EAIF,WAAA;AAAA;;;;UAMe,iBAAA;EACf,QAAA;EACA,GAAA;EACA,OAAA;EACA,KAAA;EACA,WAAA;EACA,IAAA;EACA,OAAA;EACA,MAAA;EACA,SAAA,GAAY,SAAA;EACZ,MAAA;EACA,IAAA;EAGA,UAAA,EAAY,OAAA;EACZ,MAAA,EAAQ,OAAA;EACR,aAAA,EAAe,OAAA;EACf,WAAA,EAAa,OAAA;EAGb,YAAA;IACE,QAAA,EAAU,OAAA;IACV,QAAA,EAAU,OAAA;EAAA;EAIZ,qBAAA;IAAyB,EAAA,EAAI,OAAA;IAAS,IAAA,EAAM,OAAA;EAAA;EAG5C,oBAAA;IACE,GAAA;IACA,OAAA;IACA,OAAA,EAAS,MAAA;EAAA;EAIX,WAAA;AAAA;;;;UAMe,iBAAA;EACf,QAAA;EACA,GAAA;EACA,OAAA;EACA,KAAA;EACA,WAAA;EACA,OAAA;EACA,IAAA;EACA,UAAA;EACA,SAAA,GAAY,SAAA;EACZ,MAAA;EACA,IAAA;EACA,MAAA;EAGA,IAAA;IACE,SAAA;IACA,SAAA;IACA,UAAA;EAAA;EAIF,QAAA;IACE,SAAA;IACA,OAAA;MAAW,OAAA;MAAkB,KAAA;IAAA;IAC7B,MAAA;MAAU,OAAA;MAAkB,WAAA;IAAA;IAC5B,GAAA;MAAO,OAAA;IAAA;EAAA;EAIT,WAAA;IACE,WAAA;IACA,OAAA;IACA,SAAA;IACA,SAAA;IACA,aAAA;IACA,QAAA;IACA,EAAA;IACA,IAAA;EAAA;AAAA;;;;KAOQ,gBAAA;;;;UAKK,gBAAA;EACf,IAAA,EAAM,gBAAA;EACN,IAAA;EACA,QAAA;EACA,QAAA;EACA,WAAA;AAAA;;;;UAMe,mBAAA;EACf,YAAA;AAAA;;;;UAMe,YAAA;EACf,GAAA;EACA,IAAA;EACA,YAAA;EACA,UAAA;AAAA;;AA3BF;;KAiCY,aAAA,GAAgB,GAAA,SAAY,YAAA;;;AA5BxC;UAiCiB,gBAAA;EACf,KAAA;EACA,MAAA;EACA,QAAA;AAAA"}
@@ -3,7 +3,6 @@ import { RuleSyncConfig } from "./rulesync-types.js";
3
3
  import { OpKind } from "@contractspec/lib.contracts";
4
4
 
5
5
  //#region src/types/generation-types.d.ts
6
-
7
6
  /**
8
7
  * Test target types.
9
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"generation-types.d.ts","names":[],"sources":["../../src/types/generation-types.ts"],"sourcesContent":[],"mappings":";;;;;;AAgBA;AAmCA;;KAxCY,UAAA;;;;UAKK,eAAA;;;;;;;;;;;;;;;;;;;;;;;;aA6BJ;;;;;UAMI,qBAAA;;SAER;qBACY"}
1
+ {"version":3,"file":"generation-types.d.ts","names":[],"sources":["../../src/types/generation-types.ts"],"mappings":";;;;;;;;KAWY,UAAA;AAKZ;;;AAAA,UAAiB,eAAA;EACf,UAAA;EACA,OAAA;EACA,SAAA;EAMA,cAAA;EACA,YAAA;EACA,SAAA;EACA,WAAA;IACE,UAAA;IACA,MAAA;IACA,aAAA;IACA,KAAA;IACA,SAAA;IACA,YAAA;IACA,SAAA;IACA,UAAA;IACA,SAAA;IACA,WAAA;IACA,SAAA;IACA,YAAA;IACA,SAAA;EAAA;EAEF,aAAA;EACA,WAAA;EACA,QAAA,GAAW,cAAA;AAAA;;AAMb;;UAAiB,qBAAA;EACf,WAAA;EACA,IAAA,GAAO,MAAA;EACP,gBAAA,GAAmB,gBAAA;AAAA"}
@@ -2,7 +2,6 @@ import { Stability } from "./spec-types.js";
2
2
  import { AnalyzedOperationKind, AnalyzedSpecType } from "./analysis-types.js";
3
3
 
4
4
  //#region src/types/llm-types.d.ts
5
-
6
5
  /**
7
6
  * LLM export format options.
8
7
  * - **full**: Complete information including source code and all details (for deep LLM context)
@@ -1 +1 @@
1
- {"version":3,"file":"llm-types.d.ts","names":[],"sources":["../../src/types/llm-types.ts"],"sourcesContent":[],"mappings":";;;;;AA8BA;AAQA;AAuBA;;;;AAkBkB,KAhEN,eAAA,GAgEM,MAAA,GAAA,QAAA,GAAA,SAAA;;;;AAcP,KAzEC,SAAA,GAyED,aAAA,GAAA,YAAA,GAAA,aAAA;;;AAQX;AAciB,KA1FL,gBAAA,GA0FoB,OAMtB,GAAA,UAAe,GAAA,UAAA;AAMzB;AAcA;;UA/GiB,OAAA;;;;;;;UAQA,cAAA;;;;;;;;cAQH;;;;;;;;;;;;;;UAeG,UAAA;;QAET;;YAEI;;SAEH;;;;;;;;;;;;kBAYS;;eAEH;;aAEF;;;;;;eAQE;;WAEJ;;kBAEO;;;;;UAMD,qBAAA;;UAEP;;;;;;;;;;;UAYO,eAAA;;;;;;UAMP;;;;;UAMO,kBAAA;;;;UAIP;;;;QAIF;;;;;UAMS,iBAAA"}
1
+ {"version":3,"file":"llm-types.d.ts","names":[],"sources":["../../src/types/llm-types.ts"],"mappings":";;;;;;AAoBA;;;;KALY,eAAA;AAUZ;;;AAAA,KALY,SAAA;;AAUZ;;KALY,gBAAA;;;AAaZ;UARiB,OAAA;EACf,IAAA;EACA,OAAA;AAAA;;;;UAMe,cAAA;EAUf;EARA,GAAA;EAYA;EAVA,OAAA;EAYO;EAVP,WAAA;EAiBe;EAff,SAAA,GAAY,SAAA;;EAEZ,MAAA;EAiBU;EAfV,IAAA;EA6BgB;EA3BhB,IAAA;EA+BW;EA7BX,OAAA;AAAA;;;;;UAOe,UAAA;EAIf;EAFA,IAAA,EAAM,cAAA;EAIN;EAFA,QAAA,EAAU,gBAAA;EAIV;EAFA,IAAA,GAAO,qBAAA;EAMP;EAJA,KAAA;EAQA;EANA,SAAA;EAQgB;EANhB,UAAA;EAQa;EANb,UAAA;EAQW;EANX,aAAA;EAUA;EARA,aAAA,GAAgB,OAAA;EAYH;EAVb,UAAA,GAAa,OAAA;EAYJ;EAVT,QAAA,GAAW,OAAA;EAYK;EAVhB,QAAA;EAUuB;EARvB,WAAA;EAcoC;EAVpC,UAAA,GAAa,OAAA;EAYU;EAVvB,MAAA,GAAS,OAAA;EAUD;EARR,aAAA,GAAgB,OAAA;AAAA;;;;UAMD,qBAAA;EAce;EAZ9B,MAAA,EAAQ,eAAA;EAkBe;EAhBvB,KAAA;EAcA;EAZA,aAAA;EAcQ;EAZR,mBAAA;AAAA;AAkBF;;;AAAA,UAZiB,eAAA;EAcf;EAZA,OAAA;EAcQ;EAZR,SAAA;EAgBA;EAdA,MAAA,EAAQ,eAAA;AAAA;;AAoBV;;UAdiB,kBAAA;EAciB;EAZhC,MAAA;EAgBA;EAdA,MAAA,EAAQ,iBAAA;EAkBR;EAhBA,WAAA;EAgBU;EAdV,IAAA,EAAM,gBAAA;AAAA;;;;UAMS,iBAAA;;EAEf,QAAA;;EAEA,OAAA;;EAEA,QAAA;;EAEA,UAAA;AAAA"}
@@ -1,7 +1,6 @@
1
1
  import { RuleSyncTarget } from "@contractspec/lib.contracts";
2
2
 
3
3
  //#region src/types/rulesync-types.d.ts
4
-
5
4
  /**
6
5
  * Configuration for AI agent rules synchronization.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"rulesync-types.d.ts","names":[],"sources":["../../src/types/rulesync-types.ts"],"sourcesContent":[],"mappings":";;;;;;;UASiB,cAAA;;;;;;;;WAQN"}
1
+ {"version":3,"file":"rulesync-types.d.ts","names":[],"sources":["../../src/types/rulesync-types.ts"],"mappings":";;;;;;UASiB,cAAA;EAIf;EAFA,OAAA;EAMA;EAJA,QAAA;EAMA;EAJA,KAAA;EAMS;EAJT,OAAA,EAAS,cAAA;;EAET,QAAA;;EAEA,SAAA;AAAA"}
@@ -1,7 +1,6 @@
1
1
  import { OpKind } from "@contractspec/lib.contracts";
2
2
 
3
3
  //#region src/types/spec-types.d.ts
4
-
5
4
  type SpecType = 'operation' | 'event' | 'presentation' | 'form' | 'feature' | 'workflow' | 'data-view' | 'migration' | 'telemetry' | 'experiment' | 'app-config' | 'integration' | 'knowledge';
6
5
  type PresentationKind = 'web_component' | 'markdown' | 'data';
7
6
  type Stability = 'experimental' | 'beta' | 'stable' | 'deprecated';
@@ -279,7 +278,7 @@ interface MigrationSpecData extends BaseSpecData {
279
278
  up: MigrationStepData[];
280
279
  down?: MigrationStepData[];
281
280
  }
282
- type IntegrationCategoryData = 'payments' | 'email' | 'calendar' | 'sms' | 'ai-llm' | 'ai-voice' | 'speech-to-text' | 'vector-db' | 'storage' | 'accounting' | 'crm' | 'helpdesk' | 'open-banking' | 'custom';
281
+ type IntegrationCategoryData = 'payments' | 'email' | 'calendar' | 'sms' | 'ai-llm' | 'ai-voice' | 'analytics' | 'speech-to-text' | 'vector-db' | 'storage' | 'accounting' | 'crm' | 'helpdesk' | 'project-management' | 'open-banking' | 'database' | 'custom';
283
282
  type IntegrationConfigFieldType = 'string' | 'number' | 'boolean';
284
283
  type IntegrationOwnershipModeData = 'managed' | 'byok';
285
284
  type IntegrationHealthCheckMethod = 'ping' | 'list' | 'custom';
@@ -1 +1 @@
1
- {"version":3,"file":"spec-types.d.ts","names":[],"sources":["../../src/types/spec-types.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"spec-types.d.ts","names":[],"sources":["../../src/types/spec-types.ts"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/module.workspace",
3
- "version": "1.56.0",
3
+ "version": "1.57.0",
4
4
  "description": "Workspace discovery and management module",
5
5
  "keywords": [
6
6
  "contractspec",
@@ -29,16 +29,16 @@
29
29
  "test": "bun test"
30
30
  },
31
31
  "dependencies": {
32
- "@contractspec/lib.contracts": "1.56.0",
33
- "@contractspec/lib.schema": "1.56.0",
32
+ "@contractspec/lib.contracts": "1.57.0",
33
+ "@contractspec/lib.schema": "1.57.0",
34
34
  "compare-versions": "^6.1.1",
35
35
  "ts-morph": "^27.0.2",
36
36
  "zod": "^4.3.5"
37
37
  },
38
38
  "devDependencies": {
39
- "@contractspec/tool.tsdown": "1.56.0",
40
- "@contractspec/tool.typescript": "1.56.0",
41
- "tsdown": "^0.19.0",
39
+ "@contractspec/tool.tsdown": "1.57.0",
40
+ "@contractspec/tool.typescript": "1.57.0",
41
+ "tsdown": "^0.20.3",
42
42
  "typescript": "^5.9.3"
43
43
  },
44
44
  "exports": {