@3fn/core 13.0.0 → 14.1.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 (284) hide show
  1. package/.kiro/agents/ada-prompt.md +80 -132
  2. package/.kiro/agents/ada-prompt.md.attribution.json +45 -0
  3. package/.kiro/agents/ada.json +44 -59
  4. package/.kiro/agents/ada.json.attribution.json +13 -0
  5. package/.kiro/agents/data-prompt.md +83 -74
  6. package/.kiro/agents/data-prompt.md.attribution.json +53 -0
  7. package/.kiro/agents/data.json +31 -38
  8. package/.kiro/agents/data.json.attribution.json +13 -0
  9. package/.kiro/agents/kenya-prompt.md +83 -72
  10. package/.kiro/agents/kenya-prompt.md.attribution.json +53 -0
  11. package/.kiro/agents/kenya.json +27 -35
  12. package/.kiro/agents/kenya.json.attribution.json +13 -0
  13. package/.kiro/agents/leonardo-prompt.md +176 -234
  14. package/.kiro/agents/leonardo-prompt.md.attribution.json +45 -0
  15. package/.kiro/agents/leonardo.json +28 -36
  16. package/.kiro/agents/leonardo.json.attribution.json +13 -0
  17. package/.kiro/agents/lina-prompt.md +110 -151
  18. package/.kiro/agents/lina-prompt.md.attribution.json +53 -0
  19. package/.kiro/agents/lina.json +46 -59
  20. package/.kiro/agents/lina.json.attribution.json +13 -0
  21. package/.kiro/agents/sparky-prompt.md +89 -72
  22. package/.kiro/agents/sparky-prompt.md.attribution.json +53 -0
  23. package/.kiro/agents/sparky.json +37 -37
  24. package/.kiro/agents/sparky.json.attribution.json +13 -0
  25. package/.kiro/agents/stacy-prompt.md +74 -48
  26. package/.kiro/agents/stacy-prompt.md.attribution.json +45 -0
  27. package/.kiro/agents/stacy.json +28 -30
  28. package/.kiro/agents/stacy.json.attribution.json +13 -0
  29. package/.kiro/agents/thurgood-prompt.md +94 -138
  30. package/.kiro/agents/thurgood-prompt.md.attribution.json +45 -0
  31. package/.kiro/agents/thurgood.json +31 -35
  32. package/.kiro/agents/thurgood.json.attribution.json +13 -0
  33. package/.kiro/steering/AI-Collaboration-Principles.md +3 -3
  34. package/.kiro/steering/Civitas-System-Overview.md +7 -16
  35. package/.kiro/steering/DesignerPunk-Systems-Overview.md +6 -6
  36. package/.kiro/steering/Spec-Feedback-Protocol.md +2 -11
  37. package/.kiro/steering/Task-Completion-Protocol.md +98 -17
  38. package/.kiro/steering/core-goals.md +3 -3
  39. package/.kiro/steering/personal-note.md +1 -1
  40. package/.kiro/steering/start-up-tasks.md +17 -6
  41. package/application-mcp-server/src/index.ts +26 -0
  42. package/dist/ComponentTokens.android.kt +12 -12
  43. package/dist/ComponentTokens.ios.swift +12 -12
  44. package/dist/ComponentTokens.web.css +3 -3
  45. package/dist/DesignTokens.android.kt +1 -1
  46. package/dist/DesignTokens.dtcg.json +8 -5
  47. package/dist/DesignTokens.figma.json +2 -2
  48. package/dist/DesignTokens.ios.swift +1 -1
  49. package/dist/DesignTokens.web.css +1 -1
  50. package/dist/android/DesignTokens.android.kt +1 -1
  51. package/dist/blend/OklchBlendCalculator.js +1 -0
  52. package/dist/blend/ThemeAwareBlendUtilities.web.d.ts +13 -2
  53. package/dist/blend/ThemeAwareBlendUtilities.web.js +6 -1
  54. package/dist/browser/designerpunk.esm.js +36 -90
  55. package/dist/browser/designerpunk.esm.min.js +33 -36
  56. package/dist/browser/designerpunk.umd.js +36 -90
  57. package/dist/browser/designerpunk.umd.min.js +47 -50
  58. package/dist/browser/tokens.css +3 -3
  59. package/dist/build/tokens/defineComponentTokens.d.ts +10 -0
  60. package/dist/build/tokens/defineComponentTokens.js +26 -0
  61. package/dist/components/core/Avatar-Base/avatar.tokens.d.ts +21 -26
  62. package/dist/components/core/Avatar-Base/avatar.tokens.js +31 -34
  63. package/dist/components/core/Avatar-Base/index.d.ts +1 -1
  64. package/dist/components/core/Avatar-Base/index.js +2 -2
  65. package/dist/components/core/Avatar-Base/platforms/web/Avatar.web.js +24 -5
  66. package/dist/components/core/Button-CTA/examples/BasicUsage.d.ts +16 -28
  67. package/dist/components/core/Button-CTA/examples/BasicUsage.js +18 -43
  68. package/dist/components/core/Button-CTA/platforms/web/ButtonCTA.web.d.ts +3 -15
  69. package/dist/components/core/Button-CTA/platforms/web/ButtonCTA.web.js +9 -58
  70. package/dist/components/core/Button-CTA/types.d.ts +0 -24
  71. package/dist/components/core/Button-CTA/types.js +6 -0
  72. package/dist/components/core/Button-Icon/buttonIcon.tokens.d.ts +28 -14
  73. package/dist/components/core/Button-Icon/buttonIcon.tokens.js +35 -20
  74. package/dist/components/core/Input-Text-Base/types.d.ts +13 -1
  75. package/dist/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.js +11 -2
  76. package/dist/generators/DTCGFormatGenerator.js +8 -0
  77. package/dist/generators/TokenFileGenerator.js +7 -2
  78. package/dist/integration/BuildErrorHandler.js +2 -2
  79. package/dist/ios/DesignTokens.ios.swift +1 -1
  80. package/dist/mcp/application-mcp.js +24 -0
  81. package/dist/mcp/docs-mcp.js +130 -15
  82. package/dist/mcp/product-mcp.js +25 -0
  83. package/dist/tokens/OpacityTokens.js +1 -1
  84. package/dist/tokens/component/progress.d.ts +65 -5
  85. package/dist/tokens/component/progress.js +79 -18
  86. package/dist/tokens/semantic/BlendTokens.d.ts +10 -3
  87. package/dist/tokens/semantic/BlendTokens.js +17 -5
  88. package/dist/tokens/semantic/OpacityTokens.d.ts +4 -4
  89. package/dist/tokens/semantic/OpacityTokens.js +4 -4
  90. package/dist/types/ComponentTypes.d.ts +1 -1
  91. package/dist/types/generated/TokenTypes.d.ts +1 -1
  92. package/dist/types/generated/TokenTypes.js +1 -1
  93. package/dist/validators/StemmaTokenUsageValidator.js +3 -2
  94. package/dist/web/DesignTokens.web.css +1 -1
  95. package/governance/BUILD-SYSTEM-SETUP.md +1 -2
  96. package/governance/Component-Development-Guide.md +23 -13
  97. package/governance/Component-Development-Standards.md +21 -20
  98. package/governance/Component-Family-Avatar.md +6 -7
  99. package/governance/Component-Family-Badge.md +19 -20
  100. package/governance/Component-Family-Button.md +30 -43
  101. package/governance/Component-Family-Chip.md +14 -15
  102. package/governance/Component-Family-Container.md +12 -13
  103. package/governance/Component-Family-Data-Display.md +1 -2
  104. package/governance/Component-Family-Divider.md +1 -2
  105. package/governance/Component-Family-Form-Inputs.md +65 -65
  106. package/governance/Component-Family-Icon.md +9 -10
  107. package/governance/Component-Family-Loading.md +1 -2
  108. package/governance/Component-Family-Modal.md +1 -2
  109. package/governance/Component-Family-Navigation.md +1 -2
  110. package/governance/Component-Family-Progress.md +0 -1
  111. package/governance/Component-Inheritance-Structures.md +219 -99
  112. package/governance/Component-MCP-Document-Template.md +6 -5
  113. package/governance/Component-Primitive-vs-Semantic-Philosophy.md +1 -1
  114. package/governance/Component-Quick-Reference.md +33 -33
  115. package/governance/Component-Readiness-Status.md +59 -44
  116. package/governance/Component-Templates.md +57 -61
  117. package/governance/Contract-System-Reference.md +7 -7
  118. package/governance/MCP-Integration-Guide.md +1 -1
  119. package/governance/Process-Cross-Reference-Standards.md +31 -13
  120. package/governance/Process-Development-Workflow.md +49 -59
  121. package/governance/Process-File-Organization.md +25 -28
  122. package/governance/Process-Hook-Operations.md +22 -11
  123. package/governance/Process-Orchestration-Model-Selection.md +92 -0
  124. package/governance/Process-Spec-Planning.md +98 -52
  125. package/governance/Process-Task-Type-Definitions.md +80 -4
  126. package/governance/Product-Handoff-Protocol.md +2 -0
  127. package/governance/Rosetta-System-Architecture.md +13 -11
  128. package/governance/Test-Behavioral-Contract-Validation.md +38 -31
  129. package/governance/Test-Failure-Audit-Methodology.md +1 -1
  130. package/governance/Token-Family-Accessibility.md +1 -2
  131. package/governance/Token-Family-Blend.md +18 -16
  132. package/governance/Token-Family-Blur.md +0 -1
  133. package/governance/Token-Family-Border.md +1 -2
  134. package/governance/Token-Family-Color.md +0 -1
  135. package/governance/Token-Family-Glow.md +1 -2
  136. package/governance/Token-Family-Layering.md +0 -1
  137. package/governance/Token-Family-Motion.md +1 -2
  138. package/governance/Token-Family-Opacity.md +0 -1
  139. package/governance/Token-Family-Radius.md +1 -2
  140. package/governance/Token-Family-Responsive.md +1 -2
  141. package/governance/Token-Family-Shadow.md +1 -2
  142. package/governance/Token-Family-Sizing.md +0 -1
  143. package/governance/Token-Family-Spacing.md +1 -2
  144. package/governance/Token-Family-Typography.md +1 -2
  145. package/governance/Token-Governance.md +8 -8
  146. package/governance/Token-Quick-Reference.md +47 -34
  147. package/governance/Token-Resolution-Patterns.md +1 -1
  148. package/governance/Token-Semantic-Structure.md +1 -1
  149. package/governance/Web-Authoring-Standards.md +5 -5
  150. package/governance/browser-distribution-guide.md +1 -4
  151. package/governance/classification-map.md +474 -0
  152. package/governance/completion-documentation-guide.md +23 -37
  153. package/governance/component-meta-authoring-guide.md +1 -1
  154. package/governance/cross-platform-vs-platform-specific-decision-framework.md +1 -1
  155. package/governance/platform-implementation-guidelines.md +2 -3
  156. package/governance/release-management-system.md +28 -63
  157. package/governance/rosetta-system-principles.md +8 -6
  158. package/governance/stemma-system-principles.md +18 -17
  159. package/mcp-server/src/index.ts +24 -6
  160. package/mcp-server/src/indexer/DocumentIndexer.ts +119 -9
  161. package/mcp-server/src/indexer/__tests__/bare-id-crossrefs.test.ts +250 -0
  162. package/mcp-server/src/indexer/cross-ref-parser.ts +29 -1
  163. package/mcp-server/src/indexer/index-health.ts +27 -2
  164. package/mcp-server/src/query/__tests__/find-docs-calibration.test.ts +11 -26
  165. package/mcp-server/src/relocation-integrity-gate/__tests__/relocation-integrity-gate.test.ts +72 -5
  166. package/mcp-server/src/relocation-integrity-gate/relocation-integrity-gate.ts +81 -24
  167. package/mcp-server/src/tools/list-cross-references.ts +2 -2
  168. package/package.json +24 -26
  169. package/src/__tests__/browser-distribution/css-bundling.test.ts +6 -4
  170. package/src/__tests__/console-allowlist.json +14 -0
  171. package/src/__tests__/console-fail-setup.ts +169 -0
  172. package/src/__tests__/integration/Spec107-DesignLanguageContext.test.ts +16 -0
  173. package/src/__tests__/stemma-system/behavioral-contract-validation.test.ts +70 -17
  174. package/src/__tests__/stemma-system/contract-catalog-name-validation.test.ts +28 -0
  175. package/src/__tests__/stemma-system/form-inputs-contracts.test.ts +223 -16
  176. package/src/__tests__/stemma-system/input-text-native-base-call-alignment.test.ts +298 -0
  177. package/src/blend/OklchBlendCalculator.ts +3 -0
  178. package/src/blend/ThemeAwareBlendUtilities.android.kt +3 -0
  179. package/src/blend/ThemeAwareBlendUtilities.ios.swift +3 -0
  180. package/src/blend/ThemeAwareBlendUtilities.web.ts +9 -1
  181. package/src/blend/__tests__/InteractionStateAudit.test.ts +12 -9
  182. package/src/build/errors/__tests__/ErrorHandler.integration.test.ts +8 -0
  183. package/src/build/errors/__tests__/ErrorHandler.test.ts +5 -0
  184. package/src/build/tokens/__tests__/defineComponentTokens.test.ts +113 -0
  185. package/src/build/tokens/defineComponentTokens.ts +43 -1
  186. package/src/build/workflow/__tests__/CICDIntegration.test.ts +12 -1
  187. package/src/cli/__tests__/init.test.ts +45 -11
  188. package/src/components/core/Avatar-Base/Avatar-Base.schema.yaml +1 -1
  189. package/src/components/core/Avatar-Base/__tests__/Avatar.accessibility.test.ts +121 -7
  190. package/src/components/core/Avatar-Base/__tests__/Avatar.image.test.ts +3 -0
  191. package/src/components/core/Avatar-Base/__tests__/Avatar.test.ts +15 -6
  192. package/src/components/core/Avatar-Base/avatar.tokens.ts +31 -34
  193. package/src/components/core/Avatar-Base/contracts.yaml +11 -1
  194. package/src/components/core/Avatar-Base/index.ts +1 -1
  195. package/src/components/core/Avatar-Base/platforms/web/Avatar.web.ts +24 -5
  196. package/src/components/core/Badge-Count-Base/contracts.yaml +1 -1
  197. package/src/components/core/Badge-Label-Base/contracts.yaml +1 -1
  198. package/src/components/core/Button-CTA/Button-CTA.schema.yaml +2 -12
  199. package/src/components/core/Button-CTA/README.md +3 -6
  200. package/src/components/core/Button-CTA/__tests__/ButtonCTA.test.ts +35 -89
  201. package/src/components/core/Button-CTA/__tests__/setup.test.ts +0 -2
  202. package/src/components/core/Button-CTA/__tests__/test-utils.ts +0 -2
  203. package/src/components/core/Button-CTA/contracts.yaml +6 -29
  204. package/src/components/core/Button-CTA/examples/BasicUsage.html +2 -14
  205. package/src/components/core/Button-CTA/examples/BasicUsage.tsx +17 -44
  206. package/src/components/core/Button-CTA/platforms/android/ButtonCTA.android.kt +12 -20
  207. package/src/components/core/Button-CTA/platforms/ios/ButtonCTA.ios.swift +12 -51
  208. package/src/components/core/Button-CTA/platforms/web/ButtonCTA.web.css +2 -26
  209. package/src/components/core/Button-CTA/platforms/web/ButtonCTA.web.ts +18 -71
  210. package/src/components/core/Button-CTA/types.ts +10 -28
  211. package/src/components/core/Button-Icon/buttonIcon.tokens.ts +43 -27
  212. package/src/components/core/Chip-Base/__tests__/ChipBase.test.ts +13 -0
  213. package/src/components/core/Chip-Filter/__tests__/ChipFilter.test.ts +13 -0
  214. package/src/components/core/Chip-Input/__tests__/ChipInput.test.ts +13 -0
  215. package/src/components/core/Input-Text-Base/Input-Text-Base.schema.yaml +30 -2
  216. package/src/components/core/Input-Text-Base/README.md +25 -2
  217. package/src/components/core/Input-Text-Base/__tests__/focusIndicators.test.ts +16 -15
  218. package/src/components/core/Input-Text-Base/contracts.yaml +90 -0
  219. package/src/components/core/Input-Text-Base/platforms/android/InputTextBase.android.kt +26 -12
  220. package/src/components/core/Input-Text-Base/platforms/ios/InputTextBase.ios.swift +195 -59
  221. package/src/components/core/Input-Text-Base/types.ts +13 -1
  222. package/src/components/core/Input-Text-Email/Input-Text-Email.schema.yaml +5 -1
  223. package/src/components/core/Input-Text-Email/README.md +8 -7
  224. package/src/components/core/Input-Text-Email/platforms/android/InputTextEmail.android.kt +1 -4
  225. package/src/components/core/Input-Text-Email/platforms/ios/InputTextEmail.ios.swift +2 -16
  226. package/src/components/core/Input-Text-Password/Input-Text-Password.schema.yaml +10 -3
  227. package/src/components/core/Input-Text-Password/README.md +9 -8
  228. package/src/components/core/Input-Text-Password/contracts.yaml +5 -0
  229. package/src/components/core/Input-Text-Password/platforms/android/InputTextPassword.android.kt +17 -7
  230. package/src/components/core/Input-Text-Password/platforms/ios/InputTextPassword.ios.swift +22 -20
  231. package/src/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.ts +11 -2
  232. package/src/components/core/Input-Text-PhoneNumber/Input-Text-PhoneNumber.schema.yaml +5 -1
  233. package/src/components/core/Input-Text-PhoneNumber/README.md +9 -8
  234. package/src/components/core/Input-Text-PhoneNumber/platforms/android/InputTextPhoneNumber.android.kt +2 -5
  235. package/src/components/core/Input-Text-PhoneNumber/platforms/ios/InputTextPhoneNumber.ios.swift +3 -17
  236. package/src/components/core/Nav-Header-App/contracts.yaml +1 -1
  237. package/src/components/core/Nav-SegmentedChoice-Base/contracts.yaml +1 -1
  238. package/src/components/core/Progress-Indicator-Connector-Base/contracts.yaml +1 -1
  239. package/src/components/core/Progress-Indicator-Label-Base/contracts.yaml +1 -1
  240. package/src/components/core/Progress-Indicator-Node-Base/contracts.yaml +1 -1
  241. package/src/components/core/Progress-Stepper-Base/__tests__/StepperBase.test.ts +5 -2
  242. package/src/components/core/Progress-Stepper-Detailed/__tests__/StepperDetailed.test.ts +5 -2
  243. package/src/generators/DTCGFormatGenerator.ts +6 -0
  244. package/src/generators/TokenFileGenerator.ts +7 -2
  245. package/src/generators/__tests__/DTCGConfigOptions.test.ts +14 -5
  246. package/src/integration/BuildErrorHandler.ts +2 -2
  247. package/src/tokens/OpacityTokens.ts +1 -1
  248. package/src/tokens/__tests__/OpacityTokens.test.ts +3 -1
  249. package/src/tokens/__tests__/ProgressTokenCompliance.test.ts +5 -3
  250. package/src/tokens/__tests__/ProgressTokenFormulas.test.ts +11 -11
  251. package/src/tokens/__tests__/ProgressTokenTranslation.test.ts +22 -20
  252. package/src/tokens/component/progress.ts +83 -21
  253. package/src/tokens/semantic/BlendTokens.ts +26 -5
  254. package/src/tokens/semantic/OpacityTokens.ts +4 -4
  255. package/src/types/ComponentTypes.ts +1 -1
  256. package/src/types/generated/TokenTypes.ts +1 -1
  257. package/src/validators/StemmaTokenUsageValidator.ts +3 -2
  258. package/token-index/components.yaml +8 -8
  259. package/token-index/semantics.yaml +1 -2
  260. package/src/tools/release/__tests__/ChangeClassifier.test.ts +0 -133
  261. package/src/tools/release/__tests__/ChangeExtractor.test.ts +0 -222
  262. package/src/tools/release/__tests__/GitHubPublisher.test.ts +0 -240
  263. package/src/tools/release/__tests__/NotesRenderer.test.ts +0 -142
  264. package/src/tools/release/__tests__/NpmPublisher.test.ts +0 -289
  265. package/src/tools/release/__tests__/PipelineIntegration.test.ts +0 -188
  266. package/src/tools/release/__tests__/ReleasePipeline.test.ts +0 -192
  267. package/src/tools/release/__tests__/SemanticVersionValidator.test.ts +0 -49
  268. package/src/tools/release/__tests__/SummaryScanner.test.ts +0 -141
  269. package/src/tools/release/__tests__/TagResolver.test.ts +0 -91
  270. package/src/tools/release/__tests__/VersionCalculator.test.ts +0 -270
  271. package/src/tools/release/__tests__/helpers/NpmMockHelper.ts +0 -80
  272. package/src/tools/release/cli/ReleasePipeline.ts +0 -165
  273. package/src/tools/release/cli/release-tool.ts +0 -107
  274. package/src/tools/release/pipeline/ChangeClassifier.ts +0 -61
  275. package/src/tools/release/pipeline/ChangeExtractor.ts +0 -87
  276. package/src/tools/release/pipeline/NotesRenderer.ts +0 -66
  277. package/src/tools/release/pipeline/SummaryScanner.ts +0 -70
  278. package/src/tools/release/pipeline/TagResolver.ts +0 -40
  279. package/src/tools/release/pipeline/VersionCalculator.ts +0 -375
  280. package/src/tools/release/publishers/GitHubPublisher.ts +0 -228
  281. package/src/tools/release/publishers/NpmPublisher.ts +0 -196
  282. package/src/tools/release/release-config.json +0 -5
  283. package/src/tools/release/types/index.ts +0 -282
  284. package/src/tools/release/validators/SemanticVersionValidator.ts +0 -67
@@ -14341,6 +14341,7 @@ function resolveSection(content, filePath, opts) {
14341
14341
  }
14342
14342
 
14343
14343
  // mcp-server/src/indexer/cross-ref-parser.ts
14344
+ var BARE_ID_GRAMMAR = /^[a-z0-9][a-z0-9-]*$/;
14344
14345
  function extractCrossReferences(content, _filePath) {
14345
14346
  const lines = content.split("\n");
14346
14347
  const references = [];
@@ -14363,6 +14364,14 @@ function extractCrossReferences(content, _filePath) {
14363
14364
  section: currentSection,
14364
14365
  lineNumber: i + 1
14365
14366
  });
14367
+ } else if (BARE_ID_GRAMMAR.test(target) && !/[/.:#]/.test(target)) {
14368
+ references.push({
14369
+ target,
14370
+ context,
14371
+ section: currentSection,
14372
+ lineNumber: i + 1,
14373
+ kind: "id-candidate"
14374
+ });
14366
14375
  }
14367
14376
  }
14368
14377
  }
@@ -14380,7 +14389,7 @@ function estimateTokenCount(content) {
14380
14389
  var fs = __toESM(require("fs"));
14381
14390
  var path = __toESM(require("path"));
14382
14391
  function determineIndexHealth(options) {
14383
- const { indexedDocuments, directoryPath, lastIndexTime } = options;
14392
+ const { indexedDocuments, directoryPath, lastIndexTime, crossRefTotals } = options;
14384
14393
  const errors = [];
14385
14394
  const warnings = [];
14386
14395
  const expectedDocs = getExpectedDocuments(directoryPath);
@@ -14400,7 +14409,15 @@ function determineIndexHealth(options) {
14400
14409
  if (malformedDocs.length > 0) {
14401
14410
  warnings.push(`Malformed metadata: ${malformedDocs.join(", ")}`);
14402
14411
  }
14412
+ if (crossRefTotals && crossRefTotals.droppedBareIdCount > 0) {
14413
+ warnings.push(
14414
+ `${crossRefTotals.droppedBareIdCount} unresolved bare-id link targets \u2014 run scan-cross-references.sh for the list`
14415
+ );
14416
+ }
14403
14417
  const metrics = calculateIndexMetrics(indexedDocuments);
14418
+ if (crossRefTotals) {
14419
+ metrics.totalCrossReferences = crossRefTotals.validatedCount;
14420
+ }
14404
14421
  let status;
14405
14422
  if (errors.length > 0) {
14406
14423
  status = "failed";
@@ -14664,6 +14681,25 @@ var DocumentIndexer = class {
14664
14681
  this.idIndex = /* @__PURE__ */ new Map();
14665
14682
  // id → indexedKey
14666
14683
  this.legacyPathIndex = /* @__PURE__ */ new Map();
14684
+ // normalizedLegacyPath → indexedKey
14685
+ /**
14686
+ * Validated cross-references per indexed key (Spec 119-B OB-1, Decision 1:
14687
+ * extract-then-validate at INDEX time, one validation point). indexFile
14688
+ * stores the raw parser output (bare-id candidates still tagged); the
14689
+ * post-index validation pass (or reindexFile's inline pass) replaces it with
14690
+ * the validated, TAG-STRIPPED set — the candidate tag never escapes the
14691
+ * indexer. All read surfaces (list_cross_references, getDocumentSummary,
14692
+ * index-health metrics) consume THIS map, never re-extract, so the
14693
+ * crossReferences count is a stable index property.
14694
+ */
14695
+ this.crossRefsByKey = /* @__PURE__ */ new Map();
14696
+ /**
14697
+ * Bare-id candidates dropped by validation (target not in idIndex) — the
14698
+ * typo-suspicious class. Surfaced on two channels (design Component 6):
14699
+ * scan-cross-references.sh lists individually; index-health emits ONE
14700
+ * aggregate warning when count > 0.
14701
+ */
14702
+ this.droppedIdCandidates = [];
14667
14703
  this.logsDirectory = logsDirectory;
14668
14704
  }
14669
14705
  /**
@@ -14682,11 +14718,14 @@ var DocumentIndexer = class {
14682
14718
  this.documentContent.clear();
14683
14719
  this.idIndex.clear();
14684
14720
  this.legacyPathIndex.clear();
14721
+ this.crossRefsByKey.clear();
14722
+ this.droppedIdCandidates = [];
14685
14723
  const files = this.scanDirectory(directoryPath);
14686
14724
  for (const filePath of files) {
14687
14725
  await this.indexFile(filePath);
14688
14726
  }
14689
14727
  this.seedLegacyPaths();
14728
+ this.validateAllCrossReferences();
14690
14729
  this.lastIndexTime = (/* @__PURE__ */ new Date()).toISOString();
14691
14730
  this.logIndexStateChange("indexing_completed", {
14692
14731
  directoryPath,
@@ -14704,10 +14743,13 @@ var DocumentIndexer = class {
14704
14743
  this.pruneAddressingEntriesForKey(filePath);
14705
14744
  this.documentMap.delete(filePath);
14706
14745
  this.documentContent.delete(filePath);
14746
+ this.crossRefsByKey.delete(filePath);
14747
+ this.droppedIdCandidates = this.droppedIdCandidates.filter((d) => d.sourceKey !== filePath);
14707
14748
  this.lastIndexTime = (/* @__PURE__ */ new Date()).toISOString();
14708
14749
  return;
14709
14750
  }
14710
14751
  await this.indexFile(filePath);
14752
+ this.validateCrossReferencesForKey(filePath);
14711
14753
  this.lastIndexTime = (/* @__PURE__ */ new Date()).toISOString();
14712
14754
  }
14713
14755
  /**
@@ -14745,10 +14787,11 @@ var DocumentIndexer = class {
14745
14787
  * @param filePath - Path to document
14746
14788
  */
14747
14789
  getDocumentSummary(filePath) {
14748
- const content = this.getDocumentContent(filePath);
14790
+ const { indexedKey } = this.resolveRef(filePath);
14791
+ const content = this.documentContent.get(indexedKey);
14749
14792
  const metadata = extractMetadata(content);
14750
14793
  const outline = extractHeadingStructure(content);
14751
- const crossReferences = extractCrossReferences(content, filePath);
14794
+ const crossReferences = this.crossRefsByKey.get(indexedKey) ?? [];
14752
14795
  const crossReferenceInfo = crossReferences.map((ref) => ({
14753
14796
  target: ref.target,
14754
14797
  context: ref.context,
@@ -14858,12 +14901,65 @@ ${candidateLines}`
14858
14901
  /**
14859
14902
  * List cross-references in a document
14860
14903
  * Returns links without following them
14861
- *
14862
- * @param filePath - Path to document
14904
+ *
14905
+ * Spec 119-B OB-1: the incoming ref routes through the SAME resolver chain
14906
+ * as every other document-addressed tool (id → indexed key → legacy path,
14907
+ * D5), and the result is the VALIDATED index-time set — `.md` path refs
14908
+ * unchanged, bare-id refs enumerated with target = the doc id; dropped
14909
+ * candidates never appear. Public shape unchanged (no kind tag).
14910
+ *
14911
+ * @param filePath - Document ref: id, indexed relative path, or legacy path
14863
14912
  */
14864
14913
  listCrossReferences(filePath) {
14865
- const content = this.getDocumentContent(filePath);
14866
- return extractCrossReferences(content, filePath);
14914
+ const { indexedKey } = this.resolveRef(filePath);
14915
+ return this.crossRefsByKey.get(indexedKey) ?? [];
14916
+ }
14917
+ /**
14918
+ * Bare-id candidates dropped by validation (Spec 119-B OB-1) — the
14919
+ * typo-suspicious class surfaced via index-health's aggregate warning and
14920
+ * scan-cross-references.sh's individual listing.
14921
+ */
14922
+ getDroppedIdCandidates() {
14923
+ return this.droppedIdCandidates;
14924
+ }
14925
+ /**
14926
+ * Validate ALL stored cross-reference sets against the completed idIndex
14927
+ * (the post-index hook — Spec 119-B OB-1, Decision 1's single validation
14928
+ * point). Resets the dropped-candidate record.
14929
+ */
14930
+ validateAllCrossReferences() {
14931
+ this.droppedIdCandidates = [];
14932
+ for (const key of this.crossRefsByKey.keys()) {
14933
+ this.validateCrossReferencesForKey(key);
14934
+ }
14935
+ }
14936
+ /**
14937
+ * Validate one document's stored cross-references against the CURRENT
14938
+ * idIndex. `.md` path refs pass through untouched; bare-id candidates are
14939
+ * kept iff their target is a known doc id (tag stripped — it never escapes
14940
+ * the indexer) and dropped-with-record otherwise.
14941
+ */
14942
+ validateCrossReferencesForKey(key) {
14943
+ const raw = this.crossRefsByKey.get(key);
14944
+ if (!raw) return;
14945
+ this.droppedIdCandidates = this.droppedIdCandidates.filter((d) => d.sourceKey !== key);
14946
+ const validated = [];
14947
+ for (const ref of raw) {
14948
+ if (ref.kind !== "id-candidate") {
14949
+ validated.push(ref);
14950
+ } else if (this.idIndex.has(ref.target)) {
14951
+ const { kind: _kind, ...publicRef } = ref;
14952
+ validated.push(publicRef);
14953
+ } else {
14954
+ this.droppedIdCandidates.push({
14955
+ sourceKey: key,
14956
+ target: ref.target,
14957
+ section: ref.section,
14958
+ lineNumber: ref.lineNumber
14959
+ });
14960
+ }
14961
+ }
14962
+ this.crossRefsByKey.set(key, validated);
14867
14963
  }
14868
14964
  /**
14869
14965
  * Validate metadata for a document
@@ -14957,6 +15053,7 @@ ${candidateLines}`
14957
15053
  viability: frontmatter.viability
14958
15054
  };
14959
15055
  this.documentMap.set(filePath, documentMetadata);
15056
+ this.crossRefsByKey.set(filePath, extractCrossReferences(content, filePath));
14960
15057
  for (const [existingId, existingKey] of this.idIndex) {
14961
15058
  if (existingKey === filePath && existingId !== id) this.idIndex.delete(existingId);
14962
15059
  }
@@ -15119,10 +15216,16 @@ ${candidateLines}`
15119
15216
  this.logIndexStateChange("validation_completed", { status: health2.status, errors: health2.errors });
15120
15217
  return health2;
15121
15218
  }
15219
+ let validatedCount = 0;
15220
+ for (const refs of this.crossRefsByKey.values()) validatedCount += refs.length;
15122
15221
  const health = determineIndexHealth({
15123
15222
  indexedDocuments: this.documentContent,
15124
15223
  directoryPath: this.directoryPath,
15125
- lastIndexTime: this.lastIndexTime
15224
+ lastIndexTime: this.lastIndexTime,
15225
+ crossRefTotals: {
15226
+ validatedCount,
15227
+ droppedBareIdCount: this.droppedIdCandidates.length
15228
+ }
15126
15229
  });
15127
15230
  this.logIndexStateChange("validation_completed", {
15128
15231
  status: health.status,
@@ -16421,13 +16524,13 @@ function formatMcpResponse4(result) {
16421
16524
  // mcp-server/src/tools/list-cross-references.ts
16422
16525
  var listCrossReferencesTool = {
16423
16526
  name: "list_cross_references",
16424
- description: "List cross-references in a document. Returns all referenced documents with context, source section, and line number.",
16527
+ description: "List cross-references in a document. Returns all referenced documents with context, source section, and line number. Enumerates both `.md`-path links (target = the linked path, verbatim) and bare-id links validated against the doc-id index (target = the doc id); unresolvable bare-id targets are excluded (surfaced via index-health). Addressing contract (D5): the `path` parameter resolves through the same strategy chain as the other document tools \u2014 doc id, then indexed relative path, then legacy `.kiro/steering/\u2026` path.",
16425
16528
  inputSchema: {
16426
16529
  type: "object",
16427
16530
  properties: {
16428
16531
  path: {
16429
16532
  type: "string",
16430
- description: 'Document path (e.g., ".kiro/steering/Component Development Guide.md")'
16533
+ description: 'Document ref: doc id (e.g., "token-governance"), indexed relative path, or legacy `.kiro/steering/\u2026` path \u2014 same resolver chain as get_document_summary'
16431
16534
  }
16432
16535
  },
16433
16536
  required: ["path"]
@@ -16851,7 +16954,15 @@ var MCPDocumentationServer = class {
16851
16954
  this.isRunning = false;
16852
16955
  }
16853
16956
  /**
16854
- * Set up graceful shutdown handlers
16957
+ * Set up graceful shutdown handlers.
16958
+ *
16959
+ * stdin EOF ('end'/'close') is a first-class shutdown trigger: a stdio MCP server
16960
+ * whose parent client died (or gracefully closed the pipe) has no one to serve, but
16961
+ * the file watcher keeps the event loop alive forever — found live at Spec 122 U3
16962
+ * (~230 orphaned servers accumulated across harness runs, wedging later boots).
16963
+ * Self-exiting on EOF also makes graceful client closes immediate: the MCP SDK's
16964
+ * StdioClientTransport.close() ends stdin and waits up to 2s for exactly this exit
16965
+ * before escalating to SIGTERM.
16855
16966
  */
16856
16967
  setupShutdownHandlers() {
16857
16968
  const shutdown = async () => {
@@ -16860,6 +16971,8 @@ var MCPDocumentationServer = class {
16860
16971
  };
16861
16972
  process.on("SIGINT", shutdown);
16862
16973
  process.on("SIGTERM", shutdown);
16974
+ process.stdin.on("end", shutdown);
16975
+ process.stdin.on("close", shutdown);
16863
16976
  }
16864
16977
  };
16865
16978
  async function main() {
@@ -16882,10 +16995,12 @@ async function main() {
16882
16995
  const server = new MCPDocumentationServer(steeringDir);
16883
16996
  await server.start();
16884
16997
  }
16885
- main().catch((error2) => {
16886
- console.error("[MCP Server] Fatal error:", error2);
16887
- process.exit(1);
16888
- });
16998
+ if (require.main === module) {
16999
+ main().catch((error2) => {
17000
+ console.error("[MCP Server] Fatal error:", error2);
17001
+ process.exit(1);
17002
+ });
17003
+ }
16889
17004
  // Annotate the CommonJS export names for ESM import in node:
16890
17005
  0 && (module.exports = {
16891
17006
  MCPDocumentationServer,
@@ -24567,6 +24567,31 @@ var ProductMCPServer = class {
24567
24567
  const transport = new StdioServerTransport();
24568
24568
  await this.server.connect(transport);
24569
24569
  console.error(`[${SERVER_NAME4}] Server running on stdio`);
24570
+ this.setupShutdownHandlers();
24571
+ }
24572
+ /**
24573
+ * Self-exit on stdin EOF and fatal signals. A stdio MCP server whose parent client
24574
+ * died (or gracefully closed the pipe) has no one to serve, but the file watcher
24575
+ * keeps the event loop alive forever — found live at Spec 122 U3 (~230 orphaned
24576
+ * servers accumulated across harness runs, this server the most-leaked of the
24577
+ * three). Exiting on EOF also makes graceful client closes immediate: the MCP
24578
+ * SDK's StdioClientTransport.close() ends stdin and waits up to 2s for exactly
24579
+ * this exit before escalating to SIGTERM.
24580
+ */
24581
+ setupShutdownHandlers() {
24582
+ let shuttingDown = false;
24583
+ const shutdown = async () => {
24584
+ if (shuttingDown) return;
24585
+ shuttingDown = true;
24586
+ console.error(`[${SERVER_NAME4}] Shutting down...`);
24587
+ this.fileWatcher?.close();
24588
+ await this.server.close();
24589
+ process.exit(0);
24590
+ };
24591
+ process.on("SIGINT", shutdown);
24592
+ process.on("SIGTERM", shutdown);
24593
+ process.stdin.on("end", shutdown);
24594
+ process.stdin.on("close", shutdown);
24570
24595
  }
24571
24596
  startFileWatcher() {
24572
24597
  if (!fs7.existsSync(this.productDir)) return;
@@ -108,7 +108,7 @@ exports.opacityTokens = {
108
108
  category: PrimitiveToken_1.TokenCategory.OPACITY,
109
109
  baseValue: exports.OPACITY_BASE_VALUE * 6,
110
110
  familyBaseValue: exports.OPACITY_BASE_VALUE,
111
- description: 'Disabled state - faded, very strong overlay',
111
+ description: 'Very strong transparency - background scrims and modal overlays (referenced by opacity.heavy)',
112
112
  mathematicalRelationship: 'base × 6 = 0.08 × 6 = 0.48',
113
113
  baselineGridAlignment: false,
114
114
  isStrategicFlexibility: false,
@@ -19,16 +19,34 @@
19
19
  * @see .kiro/specs/048-progress-family/requirements.md (Requirements 5.7-5.15)
20
20
  * @see .kiro/specs/048-progress-family/design.md (Size Variant, Token Usage sections)
21
21
  */
22
+ import type { RegisteredComponentToken } from '../../registries/ComponentTokenRegistry';
22
23
  /**
23
- * Progress Indicator component tokens defined using the hybrid authoring API.
24
+ * ONE CALL PER FAMILY.
25
+ *
26
+ * Every token registered by a single defineComponentTokens() call is stamped with that
27
+ * call's `family`, and the family drives platform output — notably the primitive class
28
+ * name emitted for reference-path tokens (TokenFileGenerator.getFamilyClassName) and the
29
+ * Android `.dp` suffix. These 10 tokens span THREE primitive families, so they require
30
+ * three calls. A single `family: 'spacing'` call previously produced
31
+ * `SpacingTokens.size150` / `SpacingTokens.borderWidth100` — members no generated platform
32
+ * file defines — the same defect fixed for Button-Icon in PR #126.
33
+ *
34
+ * The three branded results MUST NOT be spread/merged into one registration object: the
35
+ * rich metadata rides on a non-enumerable brand (src/build/tokens/defineComponentTokens.ts,
36
+ * TOKEN_CONTRACT_BRAND) that a spread silently drops. The harvest in loadComponentTokens
37
+ * collects each branded export separately. Use {@link progressTokenValues} for flat
38
+ * value lookups and {@link getProgressRegisteredTokens} for the rich metadata.
39
+ *
40
+ * All three calls declare `component: 'Progress'`, so platform output is still a single
41
+ * `ProgressTokens` Swift enum / Kotlin object.
42
+ */
43
+ /**
44
+ * Node dimension tokens — reference sizing primitives (dimensions, not spacing).
24
45
  *
25
- * 13 tokens organized by concept:
26
46
  * - node.size.{sm|md|lg} — base node dimensions
27
47
  * - node.size.{sm|md|lg}.current — emphasized node dimensions (+4px)
28
- * - node.gap.{sm|md|lg} — spacing between nodes
29
- * - connector.thickness — connector line width
30
48
  */
31
- export declare const ProgressTokens: import("../../build/tokens").ComponentTokenValues<{
49
+ export declare const ProgressSizingTokens: import("../../build/tokens").ComponentTokenValues<{
32
50
  'node.size.sm': {
33
51
  reference: import("../../types").PrimitiveToken;
34
52
  reasoning: string;
@@ -53,6 +71,13 @@ export declare const ProgressTokens: import("../../build/tokens").ComponentToken
53
71
  reference: import("../../types").PrimitiveToken;
54
72
  reasoning: string;
55
73
  };
74
+ }>;
75
+ /**
76
+ * Node gap tokens — reference spacing primitives (gaps are spacing, not sizing).
77
+ *
78
+ * - node.gap.{sm|md|lg} — spacing between nodes
79
+ */
80
+ export declare const ProgressSpacingTokens: import("../../build/tokens").ComponentTokenValues<{
56
81
  'node.gap.sm': {
57
82
  reference: import("../../types").PrimitiveToken;
58
83
  reasoning: string;
@@ -65,11 +90,46 @@ export declare const ProgressTokens: import("../../build/tokens").ComponentToken
65
90
  reference: import("../../types").PrimitiveToken;
66
91
  reasoning: string;
67
92
  };
93
+ }>;
94
+ /**
95
+ * Connector tokens — line connecting nodes in steppers. References a borderWidth primitive.
96
+ *
97
+ * - connector.thickness — connector line width
98
+ */
99
+ export declare const ProgressBorderWidthTokens: import("../../build/tokens").ComponentTokenValues<{
68
100
  'connector.thickness': {
69
101
  reference: import("../../types").PrimitiveToken;
70
102
  reasoning: string;
71
103
  };
72
104
  }>;
105
+ /**
106
+ * Flat value map across all three Progress token calls — a READ-ONLY convenience for
107
+ * value lookups (`progressTokenValues['node.size.md']`).
108
+ *
109
+ * NOT a registration surface: spreading drops the non-enumerable brand, so this object
110
+ * deliberately harvests to zero and cannot double-register. For the rich metadata use
111
+ * {@link getProgressRegisteredTokens}, never `getTokenContract(progressTokenValues)`.
112
+ */
113
+ export declare const progressTokenValues: {
114
+ 'connector.thickness': number;
115
+ 'node.gap.sm': number;
116
+ 'node.gap.md': number;
117
+ 'node.gap.lg': number;
118
+ 'node.size.sm': number;
119
+ 'node.size.md': number;
120
+ 'node.size.lg': number;
121
+ 'node.size.sm.current': number;
122
+ 'node.size.md.current': number;
123
+ 'node.size.lg.current': number;
124
+ };
125
+ /**
126
+ * All Progress component tokens with their rich metadata, concatenated across the three
127
+ * family calls in declaration order (sizing → spacing → borderWidth).
128
+ *
129
+ * This is the brand-safe replacement for `getTokenContract(ProgressTokens)`, which is no
130
+ * longer meaningful now that Progress registers through three calls.
131
+ */
132
+ export declare function getProgressRegisteredTokens(): RegisteredComponentToken[];
73
133
  /**
74
134
  * Expected token count for governance validation
75
135
  *
@@ -21,7 +21,8 @@
21
21
  * @see .kiro/specs/048-progress-family/design.md (Size Variant, Token Usage sections)
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.progressComponentTokenNames = exports.PROGRESS_COMPONENT_TOKEN_COUNT = exports.ProgressTokens = void 0;
24
+ exports.progressComponentTokenNames = exports.PROGRESS_COMPONENT_TOKEN_COUNT = exports.progressTokenValues = exports.ProgressBorderWidthTokens = exports.ProgressSpacingTokens = exports.ProgressSizingTokens = void 0;
25
+ exports.getProgressRegisteredTokens = getProgressRegisteredTokens;
25
26
  exports.validateProgressComponentTokenCount = validateProgressComponentTokenCount;
26
27
  exports.getProgressComponentToken = getProgressComponentToken;
27
28
  exports.getAllProgressComponentTokens = getAllProgressComponentTokens;
@@ -30,20 +31,37 @@ const SpacingTokens_1 = require("../../tokens/SpacingTokens");
30
31
  const SizingTokens_1 = require("../../tokens/SizingTokens");
31
32
  const BorderWidthTokens_1 = require("../../tokens/BorderWidthTokens");
32
33
  /**
33
- * Progress Indicator component tokens defined using the hybrid authoring API.
34
+ * ONE CALL PER FAMILY.
35
+ *
36
+ * Every token registered by a single defineComponentTokens() call is stamped with that
37
+ * call's `family`, and the family drives platform output — notably the primitive class
38
+ * name emitted for reference-path tokens (TokenFileGenerator.getFamilyClassName) and the
39
+ * Android `.dp` suffix. These 10 tokens span THREE primitive families, so they require
40
+ * three calls. A single `family: 'spacing'` call previously produced
41
+ * `SpacingTokens.size150` / `SpacingTokens.borderWidth100` — members no generated platform
42
+ * file defines — the same defect fixed for Button-Icon in PR #126.
43
+ *
44
+ * The three branded results MUST NOT be spread/merged into one registration object: the
45
+ * rich metadata rides on a non-enumerable brand (src/build/tokens/defineComponentTokens.ts,
46
+ * TOKEN_CONTRACT_BRAND) that a spread silently drops. The harvest in loadComponentTokens
47
+ * collects each branded export separately. Use {@link progressTokenValues} for flat
48
+ * value lookups and {@link getProgressRegisteredTokens} for the rich metadata.
49
+ *
50
+ * All three calls declare `component: 'Progress'`, so platform output is still a single
51
+ * `ProgressTokens` Swift enum / Kotlin object.
52
+ */
53
+ /**
54
+ * Node dimension tokens — reference sizing primitives (dimensions, not spacing).
34
55
  *
35
- * 13 tokens organized by concept:
36
56
  * - node.size.{sm|md|lg} — base node dimensions
37
57
  * - node.size.{sm|md|lg}.current — emphasized node dimensions (+4px)
38
- * - node.gap.{sm|md|lg} — spacing between nodes
39
- * - connector.thickness — connector line width
40
58
  */
41
- exports.ProgressTokens = (0, tokens_1.defineComponentTokens)({
59
+ exports.ProgressSizingTokens = (0, tokens_1.defineComponentTokens)({
42
60
  component: 'Progress',
43
- family: 'spacing',
61
+ family: 'sizing',
44
62
  tokens: {
45
63
  // ========================================================================
46
- // BASE NODE SIZES — reference sizing primitives (dimensions, not spacing)
64
+ // BASE NODE SIZES
47
65
  // ========================================================================
48
66
  'node.size.sm': {
49
67
  reference: SizingTokens_1.sizingTokens.size150,
@@ -58,7 +76,7 @@ exports.ProgressTokens = (0, tokens_1.defineComponentTokens)({
58
76
  reasoning: 'Large node base size (20px). Inactive dots in desktop contexts.',
59
77
  },
60
78
  // ========================================================================
61
- // CURRENT NODE SIZES — reference sizing primitives directly (+4px emphasis)
79
+ // CURRENT NODE SIZES — +4px emphasis
62
80
  // Provides non-color visual differentiation of active position
63
81
  // ========================================================================
64
82
  'node.size.sm.current': {
@@ -73,9 +91,17 @@ exports.ProgressTokens = (0, tokens_1.defineComponentTokens)({
73
91
  reference: SizingTokens_1.sizingTokens.size300,
74
92
  reasoning: 'Current node emphasis for lg (24px). +4px over base 20px for non-color visual differentiation.',
75
93
  },
76
- // ========================================================================
77
- // GAP TOKENS — spacing between nodes (gaps are spacing, not sizing)
78
- // ========================================================================
94
+ },
95
+ });
96
+ /**
97
+ * Node gap tokens — reference spacing primitives (gaps are spacing, not sizing).
98
+ *
99
+ * - node.gap.{sm|md|lg} — spacing between nodes
100
+ */
101
+ exports.ProgressSpacingTokens = (0, tokens_1.defineComponentTokens)({
102
+ component: 'Progress',
103
+ family: 'spacing',
104
+ tokens: {
79
105
  'node.gap.sm': {
80
106
  reference: SpacingTokens_1.spacingTokens.space075,
81
107
  reasoning: 'Small gap between nodes (6px = 0.75× base). Tight spacing for compact pagination dots in mobile contexts.',
@@ -88,15 +114,50 @@ exports.ProgressTokens = (0, tokens_1.defineComponentTokens)({
88
114
  reference: SpacingTokens_1.spacingTokens.space150,
89
115
  reasoning: 'Large gap between nodes (12px = 1.5× base). Generous spacing for detailed steppers with labels in desktop contexts.',
90
116
  },
91
- // ========================================================================
92
- // CONNECTOR TOKENS — line connecting nodes in steppers
93
- // ========================================================================
117
+ },
118
+ });
119
+ /**
120
+ * Connector tokens — line connecting nodes in steppers. References a borderWidth primitive.
121
+ *
122
+ * - connector.thickness — connector line width
123
+ */
124
+ exports.ProgressBorderWidthTokens = (0, tokens_1.defineComponentTokens)({
125
+ component: 'Progress',
126
+ family: 'borderWidth',
127
+ tokens: {
94
128
  'connector.thickness': {
95
129
  reference: BorderWidthTokens_1.borderWidthTokens.borderWidth100,
96
130
  reasoning: 'Connector line thickness (1px). References borderDefault primitive for consistent border treatment across the design system.',
97
131
  },
98
132
  },
99
133
  });
134
+ /**
135
+ * Flat value map across all three Progress token calls — a READ-ONLY convenience for
136
+ * value lookups (`progressTokenValues['node.size.md']`).
137
+ *
138
+ * NOT a registration surface: spreading drops the non-enumerable brand, so this object
139
+ * deliberately harvests to zero and cannot double-register. For the rich metadata use
140
+ * {@link getProgressRegisteredTokens}, never `getTokenContract(progressTokenValues)`.
141
+ */
142
+ exports.progressTokenValues = {
143
+ ...exports.ProgressSizingTokens,
144
+ ...exports.ProgressSpacingTokens,
145
+ ...exports.ProgressBorderWidthTokens,
146
+ };
147
+ /**
148
+ * All Progress component tokens with their rich metadata, concatenated across the three
149
+ * family calls in declaration order (sizing → spacing → borderWidth).
150
+ *
151
+ * This is the brand-safe replacement for `getTokenContract(ProgressTokens)`, which is no
152
+ * longer meaningful now that Progress registers through three calls.
153
+ */
154
+ function getProgressRegisteredTokens() {
155
+ return [
156
+ ...((0, tokens_1.getTokenContract)(exports.ProgressSizingTokens) ?? []),
157
+ ...((0, tokens_1.getTokenContract)(exports.ProgressSpacingTokens) ?? []),
158
+ ...((0, tokens_1.getTokenContract)(exports.ProgressBorderWidthTokens) ?? []),
159
+ ];
160
+ }
100
161
  // ============================================================================
101
162
  // Constants and Utilities
102
163
  // ============================================================================
@@ -128,18 +189,18 @@ exports.progressComponentTokenNames = [
128
189
  * Validate that the progress component token count matches the expected count (13)
129
190
  */
130
191
  function validateProgressComponentTokenCount() {
131
- return Object.keys(exports.ProgressTokens).length === exports.PROGRESS_COMPONENT_TOKEN_COUNT;
192
+ return Object.keys(exports.progressTokenValues).length === exports.PROGRESS_COMPONENT_TOKEN_COUNT;
132
193
  }
133
194
  /**
134
195
  * Get a single progress component token value by key
135
196
  */
136
197
  function getProgressComponentToken(key) {
137
- return exports.ProgressTokens[key];
198
+ return exports.progressTokenValues[key];
138
199
  }
139
200
  /**
140
201
  * Get all progress component token entries as key-value pairs
141
202
  */
142
203
  function getAllProgressComponentTokens() {
143
- return Object.entries(exports.ProgressTokens).map(([name, value]) => ({ name, value }));
204
+ return Object.entries(exports.progressTokenValues).map(([name, value]) => ({ name, value }));
144
205
  }
145
206
  //# sourceMappingURL=progress.js.map
@@ -16,7 +16,7 @@
16
16
  * - blendHoverLighter: Hover feedback on dark backgrounds (8% lighter)
17
17
  * - blendPressedDarker: Pressed state feedback with darkening (12% darker)
18
18
  * - blendFocusSaturate: Focus state with increased saturation (8% more saturated)
19
- * - blendDisabledDesaturate: Disabled state with decreased saturation (12% less saturated)
19
+ * - blendDisabledDesaturate: DEPRECATED 2026-07-15 — DesignerPunk has no disabled states
20
20
  * - blendContainerHoverDarker: Subtle container hover feedback (4% darker)
21
21
  * - color.icon.opticalBalance: Icon optical weight compensation (8% lighter)
22
22
  *
@@ -42,6 +42,12 @@ export interface SemanticBlendToken {
42
42
  context: string;
43
43
  /** Detailed description of semantic meaning and appropriate usage */
44
44
  description: string;
45
+ /** Token is deprecated — do not use in new work; flows to DTCG $extensions.designerpunk.deprecated */
46
+ deprecated?: boolean;
47
+ /** ISO date the deprecation took effect */
48
+ deprecatedSince?: string;
49
+ /** Why the token was deprecated and what to do instead */
50
+ deprecatedReason?: string;
45
51
  }
46
52
  /**
47
53
  * Semantic blend tokens for common interaction states
@@ -87,8 +93,9 @@ export declare function validateBlendTokenCount(): boolean;
87
93
  * → Creates vibrant, attention-drawing appearance for focused elements
88
94
  *
89
95
  * 5. Disabled states?
90
- * → Use blend.disabledDesaturate (12% less saturated)
91
- * → Creates muted appearance indicating non-interactive state
96
+ * → DO NOT style disabled states. DesignerPunk does not support disabled states —
97
+ * if an action is unavailable, do not render the component (adjudicated 2026-07-15).
98
+ * → blend.disabledDesaturate is DEPRECATED and scheduled for removal at the next major.
92
99
  *
93
100
  * 6. Large container/surface hover?
94
101
  * → Use blend.containerHoverDarker (4% darker)
@@ -17,7 +17,7 @@
17
17
  * - blendHoverLighter: Hover feedback on dark backgrounds (8% lighter)
18
18
  * - blendPressedDarker: Pressed state feedback with darkening (12% darker)
19
19
  * - blendFocusSaturate: Focus state with increased saturation (8% more saturated)
20
- * - blendDisabledDesaturate: Disabled state with decreased saturation (12% less saturated)
20
+ * - blendDisabledDesaturate: DEPRECATED 2026-07-15 — DesignerPunk has no disabled states
21
21
  * - blendContainerHoverDarker: Subtle container hover feedback (4% darker)
22
22
  * - color.icon.opticalBalance: Icon optical weight compensation (8% lighter)
23
23
  *
@@ -84,6 +84,14 @@ exports.blendTokens = {
84
84
  context: 'Focus state feedback - more vibrant, attention-drawing color',
85
85
  description: 'Blend for focus states with saturation increase (8% more saturated) - creates energized, attention-drawing appearance for focused interactive elements'
86
86
  },
87
+ /**
88
+ * @deprecated 2026-07-15 — DesignerPunk does not support disabled states
89
+ * (Button-CTA disabled-state adjudication, ruled REMOVE; the no-disabled-states
90
+ * philosophy holds corpus-wide). If an action is unavailable, do not render the
91
+ * component. Retained for backward compatibility; scheduled for removal in the
92
+ * next major version of @3fn/core. For non-disabled desaturation needs, use the
93
+ * generic desaturate utilities with primitive blend tokens.
94
+ */
87
95
  'blend.disabledDesaturate': {
88
96
  name: 'blend.disabledDesaturate',
89
97
  primitiveReferences: {
@@ -91,8 +99,11 @@ exports.blendTokens = {
91
99
  },
92
100
  direction: BlendTokens_1.BlendDirection.DESATURATE,
93
101
  category: 'interaction',
94
- context: 'Disabled state appearance - muted, inactive color',
95
- description: 'Blend for disabled states with desaturation (12% less saturated) - creates muted, inactive appearance indicating non-interactive state'
102
+ context: 'DEPRECATED - disabled states are not supported in DesignerPunk',
103
+ description: 'DEPRECATED (2026-07-15): DesignerPunk does not support disabled states — if an action is unavailable, do not render the component. Formerly: blend for disabled states with desaturation (12% less saturated). Scheduled for removal in the next major version.',
104
+ deprecated: true,
105
+ deprecatedSince: '2026-07-15',
106
+ deprecatedReason: 'No-disabled-states philosophy holds corpus-wide (Button-CTA adjudication, 2026-07-15). Unavailable actions should not be rendered; state_loading covers in-flight async actions.'
96
107
  },
97
108
  'blend.containerHoverDarker': {
98
109
  name: 'blend.containerHoverDarker',
@@ -166,8 +177,9 @@ function validateBlendTokenCount() {
166
177
  * → Creates vibrant, attention-drawing appearance for focused elements
167
178
  *
168
179
  * 5. Disabled states?
169
- * → Use blend.disabledDesaturate (12% less saturated)
170
- * → Creates muted appearance indicating non-interactive state
180
+ * → DO NOT style disabled states. DesignerPunk does not support disabled states —
181
+ * if an action is unavailable, do not render the component (adjudicated 2026-07-15).
182
+ * → blend.disabledDesaturate is DEPRECATED and scheduled for removal at the next major.
171
183
  *
172
184
  * 6. Large container/surface hover?
173
185
  * → Use blend.containerHoverDarker (4% darker)