@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.
- package/.kiro/agents/ada-prompt.md +80 -132
- package/.kiro/agents/ada-prompt.md.attribution.json +45 -0
- package/.kiro/agents/ada.json +44 -59
- package/.kiro/agents/ada.json.attribution.json +13 -0
- package/.kiro/agents/data-prompt.md +83 -74
- package/.kiro/agents/data-prompt.md.attribution.json +53 -0
- package/.kiro/agents/data.json +31 -38
- package/.kiro/agents/data.json.attribution.json +13 -0
- package/.kiro/agents/kenya-prompt.md +83 -72
- package/.kiro/agents/kenya-prompt.md.attribution.json +53 -0
- package/.kiro/agents/kenya.json +27 -35
- package/.kiro/agents/kenya.json.attribution.json +13 -0
- package/.kiro/agents/leonardo-prompt.md +176 -234
- package/.kiro/agents/leonardo-prompt.md.attribution.json +45 -0
- package/.kiro/agents/leonardo.json +28 -36
- package/.kiro/agents/leonardo.json.attribution.json +13 -0
- package/.kiro/agents/lina-prompt.md +110 -151
- package/.kiro/agents/lina-prompt.md.attribution.json +53 -0
- package/.kiro/agents/lina.json +46 -59
- package/.kiro/agents/lina.json.attribution.json +13 -0
- package/.kiro/agents/sparky-prompt.md +89 -72
- package/.kiro/agents/sparky-prompt.md.attribution.json +53 -0
- package/.kiro/agents/sparky.json +37 -37
- package/.kiro/agents/sparky.json.attribution.json +13 -0
- package/.kiro/agents/stacy-prompt.md +74 -48
- package/.kiro/agents/stacy-prompt.md.attribution.json +45 -0
- package/.kiro/agents/stacy.json +28 -30
- package/.kiro/agents/stacy.json.attribution.json +13 -0
- package/.kiro/agents/thurgood-prompt.md +94 -138
- package/.kiro/agents/thurgood-prompt.md.attribution.json +45 -0
- package/.kiro/agents/thurgood.json +31 -35
- package/.kiro/agents/thurgood.json.attribution.json +13 -0
- package/.kiro/steering/AI-Collaboration-Principles.md +3 -3
- package/.kiro/steering/Civitas-System-Overview.md +7 -16
- package/.kiro/steering/DesignerPunk-Systems-Overview.md +6 -6
- package/.kiro/steering/Spec-Feedback-Protocol.md +2 -11
- package/.kiro/steering/Task-Completion-Protocol.md +98 -17
- package/.kiro/steering/core-goals.md +3 -3
- package/.kiro/steering/personal-note.md +1 -1
- package/.kiro/steering/start-up-tasks.md +17 -6
- package/application-mcp-server/src/index.ts +26 -0
- package/dist/ComponentTokens.android.kt +12 -12
- package/dist/ComponentTokens.ios.swift +12 -12
- package/dist/ComponentTokens.web.css +3 -3
- package/dist/DesignTokens.android.kt +1 -1
- package/dist/DesignTokens.dtcg.json +8 -5
- package/dist/DesignTokens.figma.json +2 -2
- package/dist/DesignTokens.ios.swift +1 -1
- package/dist/DesignTokens.web.css +1 -1
- package/dist/android/DesignTokens.android.kt +1 -1
- package/dist/blend/OklchBlendCalculator.js +1 -0
- package/dist/blend/ThemeAwareBlendUtilities.web.d.ts +13 -2
- package/dist/blend/ThemeAwareBlendUtilities.web.js +6 -1
- package/dist/browser/designerpunk.esm.js +36 -90
- package/dist/browser/designerpunk.esm.min.js +33 -36
- package/dist/browser/designerpunk.umd.js +36 -90
- package/dist/browser/designerpunk.umd.min.js +47 -50
- package/dist/browser/tokens.css +3 -3
- package/dist/build/tokens/defineComponentTokens.d.ts +10 -0
- package/dist/build/tokens/defineComponentTokens.js +26 -0
- package/dist/components/core/Avatar-Base/avatar.tokens.d.ts +21 -26
- package/dist/components/core/Avatar-Base/avatar.tokens.js +31 -34
- package/dist/components/core/Avatar-Base/index.d.ts +1 -1
- package/dist/components/core/Avatar-Base/index.js +2 -2
- package/dist/components/core/Avatar-Base/platforms/web/Avatar.web.js +24 -5
- package/dist/components/core/Button-CTA/examples/BasicUsage.d.ts +16 -28
- package/dist/components/core/Button-CTA/examples/BasicUsage.js +18 -43
- package/dist/components/core/Button-CTA/platforms/web/ButtonCTA.web.d.ts +3 -15
- package/dist/components/core/Button-CTA/platforms/web/ButtonCTA.web.js +9 -58
- package/dist/components/core/Button-CTA/types.d.ts +0 -24
- package/dist/components/core/Button-CTA/types.js +6 -0
- package/dist/components/core/Button-Icon/buttonIcon.tokens.d.ts +28 -14
- package/dist/components/core/Button-Icon/buttonIcon.tokens.js +35 -20
- package/dist/components/core/Input-Text-Base/types.d.ts +13 -1
- package/dist/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.js +11 -2
- package/dist/generators/DTCGFormatGenerator.js +8 -0
- package/dist/generators/TokenFileGenerator.js +7 -2
- package/dist/integration/BuildErrorHandler.js +2 -2
- package/dist/ios/DesignTokens.ios.swift +1 -1
- package/dist/mcp/application-mcp.js +24 -0
- package/dist/mcp/docs-mcp.js +130 -15
- package/dist/mcp/product-mcp.js +25 -0
- package/dist/tokens/OpacityTokens.js +1 -1
- package/dist/tokens/component/progress.d.ts +65 -5
- package/dist/tokens/component/progress.js +79 -18
- package/dist/tokens/semantic/BlendTokens.d.ts +10 -3
- package/dist/tokens/semantic/BlendTokens.js +17 -5
- package/dist/tokens/semantic/OpacityTokens.d.ts +4 -4
- package/dist/tokens/semantic/OpacityTokens.js +4 -4
- package/dist/types/ComponentTypes.d.ts +1 -1
- package/dist/types/generated/TokenTypes.d.ts +1 -1
- package/dist/types/generated/TokenTypes.js +1 -1
- package/dist/validators/StemmaTokenUsageValidator.js +3 -2
- package/dist/web/DesignTokens.web.css +1 -1
- package/governance/BUILD-SYSTEM-SETUP.md +1 -2
- package/governance/Component-Development-Guide.md +23 -13
- package/governance/Component-Development-Standards.md +21 -20
- package/governance/Component-Family-Avatar.md +6 -7
- package/governance/Component-Family-Badge.md +19 -20
- package/governance/Component-Family-Button.md +30 -43
- package/governance/Component-Family-Chip.md +14 -15
- package/governance/Component-Family-Container.md +12 -13
- package/governance/Component-Family-Data-Display.md +1 -2
- package/governance/Component-Family-Divider.md +1 -2
- package/governance/Component-Family-Form-Inputs.md +65 -65
- package/governance/Component-Family-Icon.md +9 -10
- package/governance/Component-Family-Loading.md +1 -2
- package/governance/Component-Family-Modal.md +1 -2
- package/governance/Component-Family-Navigation.md +1 -2
- package/governance/Component-Family-Progress.md +0 -1
- package/governance/Component-Inheritance-Structures.md +219 -99
- package/governance/Component-MCP-Document-Template.md +6 -5
- package/governance/Component-Primitive-vs-Semantic-Philosophy.md +1 -1
- package/governance/Component-Quick-Reference.md +33 -33
- package/governance/Component-Readiness-Status.md +59 -44
- package/governance/Component-Templates.md +57 -61
- package/governance/Contract-System-Reference.md +7 -7
- package/governance/MCP-Integration-Guide.md +1 -1
- package/governance/Process-Cross-Reference-Standards.md +31 -13
- package/governance/Process-Development-Workflow.md +49 -59
- package/governance/Process-File-Organization.md +25 -28
- package/governance/Process-Hook-Operations.md +22 -11
- package/governance/Process-Orchestration-Model-Selection.md +92 -0
- package/governance/Process-Spec-Planning.md +98 -52
- package/governance/Process-Task-Type-Definitions.md +80 -4
- package/governance/Product-Handoff-Protocol.md +2 -0
- package/governance/Rosetta-System-Architecture.md +13 -11
- package/governance/Test-Behavioral-Contract-Validation.md +38 -31
- package/governance/Test-Failure-Audit-Methodology.md +1 -1
- package/governance/Token-Family-Accessibility.md +1 -2
- package/governance/Token-Family-Blend.md +18 -16
- package/governance/Token-Family-Blur.md +0 -1
- package/governance/Token-Family-Border.md +1 -2
- package/governance/Token-Family-Color.md +0 -1
- package/governance/Token-Family-Glow.md +1 -2
- package/governance/Token-Family-Layering.md +0 -1
- package/governance/Token-Family-Motion.md +1 -2
- package/governance/Token-Family-Opacity.md +0 -1
- package/governance/Token-Family-Radius.md +1 -2
- package/governance/Token-Family-Responsive.md +1 -2
- package/governance/Token-Family-Shadow.md +1 -2
- package/governance/Token-Family-Sizing.md +0 -1
- package/governance/Token-Family-Spacing.md +1 -2
- package/governance/Token-Family-Typography.md +1 -2
- package/governance/Token-Governance.md +8 -8
- package/governance/Token-Quick-Reference.md +47 -34
- package/governance/Token-Resolution-Patterns.md +1 -1
- package/governance/Token-Semantic-Structure.md +1 -1
- package/governance/Web-Authoring-Standards.md +5 -5
- package/governance/browser-distribution-guide.md +1 -4
- package/governance/classification-map.md +474 -0
- package/governance/completion-documentation-guide.md +23 -37
- package/governance/component-meta-authoring-guide.md +1 -1
- package/governance/cross-platform-vs-platform-specific-decision-framework.md +1 -1
- package/governance/platform-implementation-guidelines.md +2 -3
- package/governance/release-management-system.md +28 -63
- package/governance/rosetta-system-principles.md +8 -6
- package/governance/stemma-system-principles.md +18 -17
- package/mcp-server/src/index.ts +24 -6
- package/mcp-server/src/indexer/DocumentIndexer.ts +119 -9
- package/mcp-server/src/indexer/__tests__/bare-id-crossrefs.test.ts +250 -0
- package/mcp-server/src/indexer/cross-ref-parser.ts +29 -1
- package/mcp-server/src/indexer/index-health.ts +27 -2
- package/mcp-server/src/query/__tests__/find-docs-calibration.test.ts +11 -26
- package/mcp-server/src/relocation-integrity-gate/__tests__/relocation-integrity-gate.test.ts +72 -5
- package/mcp-server/src/relocation-integrity-gate/relocation-integrity-gate.ts +81 -24
- package/mcp-server/src/tools/list-cross-references.ts +2 -2
- package/package.json +24 -26
- package/src/__tests__/browser-distribution/css-bundling.test.ts +6 -4
- package/src/__tests__/console-allowlist.json +14 -0
- package/src/__tests__/console-fail-setup.ts +169 -0
- package/src/__tests__/integration/Spec107-DesignLanguageContext.test.ts +16 -0
- package/src/__tests__/stemma-system/behavioral-contract-validation.test.ts +70 -17
- package/src/__tests__/stemma-system/contract-catalog-name-validation.test.ts +28 -0
- package/src/__tests__/stemma-system/form-inputs-contracts.test.ts +223 -16
- package/src/__tests__/stemma-system/input-text-native-base-call-alignment.test.ts +298 -0
- package/src/blend/OklchBlendCalculator.ts +3 -0
- package/src/blend/ThemeAwareBlendUtilities.android.kt +3 -0
- package/src/blend/ThemeAwareBlendUtilities.ios.swift +3 -0
- package/src/blend/ThemeAwareBlendUtilities.web.ts +9 -1
- package/src/blend/__tests__/InteractionStateAudit.test.ts +12 -9
- package/src/build/errors/__tests__/ErrorHandler.integration.test.ts +8 -0
- package/src/build/errors/__tests__/ErrorHandler.test.ts +5 -0
- package/src/build/tokens/__tests__/defineComponentTokens.test.ts +113 -0
- package/src/build/tokens/defineComponentTokens.ts +43 -1
- package/src/build/workflow/__tests__/CICDIntegration.test.ts +12 -1
- package/src/cli/__tests__/init.test.ts +45 -11
- package/src/components/core/Avatar-Base/Avatar-Base.schema.yaml +1 -1
- package/src/components/core/Avatar-Base/__tests__/Avatar.accessibility.test.ts +121 -7
- package/src/components/core/Avatar-Base/__tests__/Avatar.image.test.ts +3 -0
- package/src/components/core/Avatar-Base/__tests__/Avatar.test.ts +15 -6
- package/src/components/core/Avatar-Base/avatar.tokens.ts +31 -34
- package/src/components/core/Avatar-Base/contracts.yaml +11 -1
- package/src/components/core/Avatar-Base/index.ts +1 -1
- package/src/components/core/Avatar-Base/platforms/web/Avatar.web.ts +24 -5
- package/src/components/core/Badge-Count-Base/contracts.yaml +1 -1
- package/src/components/core/Badge-Label-Base/contracts.yaml +1 -1
- package/src/components/core/Button-CTA/Button-CTA.schema.yaml +2 -12
- package/src/components/core/Button-CTA/README.md +3 -6
- package/src/components/core/Button-CTA/__tests__/ButtonCTA.test.ts +35 -89
- package/src/components/core/Button-CTA/__tests__/setup.test.ts +0 -2
- package/src/components/core/Button-CTA/__tests__/test-utils.ts +0 -2
- package/src/components/core/Button-CTA/contracts.yaml +6 -29
- package/src/components/core/Button-CTA/examples/BasicUsage.html +2 -14
- package/src/components/core/Button-CTA/examples/BasicUsage.tsx +17 -44
- package/src/components/core/Button-CTA/platforms/android/ButtonCTA.android.kt +12 -20
- package/src/components/core/Button-CTA/platforms/ios/ButtonCTA.ios.swift +12 -51
- package/src/components/core/Button-CTA/platforms/web/ButtonCTA.web.css +2 -26
- package/src/components/core/Button-CTA/platforms/web/ButtonCTA.web.ts +18 -71
- package/src/components/core/Button-CTA/types.ts +10 -28
- package/src/components/core/Button-Icon/buttonIcon.tokens.ts +43 -27
- package/src/components/core/Chip-Base/__tests__/ChipBase.test.ts +13 -0
- package/src/components/core/Chip-Filter/__tests__/ChipFilter.test.ts +13 -0
- package/src/components/core/Chip-Input/__tests__/ChipInput.test.ts +13 -0
- package/src/components/core/Input-Text-Base/Input-Text-Base.schema.yaml +30 -2
- package/src/components/core/Input-Text-Base/README.md +25 -2
- package/src/components/core/Input-Text-Base/__tests__/focusIndicators.test.ts +16 -15
- package/src/components/core/Input-Text-Base/contracts.yaml +90 -0
- package/src/components/core/Input-Text-Base/platforms/android/InputTextBase.android.kt +26 -12
- package/src/components/core/Input-Text-Base/platforms/ios/InputTextBase.ios.swift +195 -59
- package/src/components/core/Input-Text-Base/types.ts +13 -1
- package/src/components/core/Input-Text-Email/Input-Text-Email.schema.yaml +5 -1
- package/src/components/core/Input-Text-Email/README.md +8 -7
- package/src/components/core/Input-Text-Email/platforms/android/InputTextEmail.android.kt +1 -4
- package/src/components/core/Input-Text-Email/platforms/ios/InputTextEmail.ios.swift +2 -16
- package/src/components/core/Input-Text-Password/Input-Text-Password.schema.yaml +10 -3
- package/src/components/core/Input-Text-Password/README.md +9 -8
- package/src/components/core/Input-Text-Password/contracts.yaml +5 -0
- package/src/components/core/Input-Text-Password/platforms/android/InputTextPassword.android.kt +17 -7
- package/src/components/core/Input-Text-Password/platforms/ios/InputTextPassword.ios.swift +22 -20
- package/src/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.ts +11 -2
- package/src/components/core/Input-Text-PhoneNumber/Input-Text-PhoneNumber.schema.yaml +5 -1
- package/src/components/core/Input-Text-PhoneNumber/README.md +9 -8
- package/src/components/core/Input-Text-PhoneNumber/platforms/android/InputTextPhoneNumber.android.kt +2 -5
- package/src/components/core/Input-Text-PhoneNumber/platforms/ios/InputTextPhoneNumber.ios.swift +3 -17
- package/src/components/core/Nav-Header-App/contracts.yaml +1 -1
- package/src/components/core/Nav-SegmentedChoice-Base/contracts.yaml +1 -1
- package/src/components/core/Progress-Indicator-Connector-Base/contracts.yaml +1 -1
- package/src/components/core/Progress-Indicator-Label-Base/contracts.yaml +1 -1
- package/src/components/core/Progress-Indicator-Node-Base/contracts.yaml +1 -1
- package/src/components/core/Progress-Stepper-Base/__tests__/StepperBase.test.ts +5 -2
- package/src/components/core/Progress-Stepper-Detailed/__tests__/StepperDetailed.test.ts +5 -2
- package/src/generators/DTCGFormatGenerator.ts +6 -0
- package/src/generators/TokenFileGenerator.ts +7 -2
- package/src/generators/__tests__/DTCGConfigOptions.test.ts +14 -5
- package/src/integration/BuildErrorHandler.ts +2 -2
- package/src/tokens/OpacityTokens.ts +1 -1
- package/src/tokens/__tests__/OpacityTokens.test.ts +3 -1
- package/src/tokens/__tests__/ProgressTokenCompliance.test.ts +5 -3
- package/src/tokens/__tests__/ProgressTokenFormulas.test.ts +11 -11
- package/src/tokens/__tests__/ProgressTokenTranslation.test.ts +22 -20
- package/src/tokens/component/progress.ts +83 -21
- package/src/tokens/semantic/BlendTokens.ts +26 -5
- package/src/tokens/semantic/OpacityTokens.ts +4 -4
- package/src/types/ComponentTypes.ts +1 -1
- package/src/types/generated/TokenTypes.ts +1 -1
- package/src/validators/StemmaTokenUsageValidator.ts +3 -2
- package/token-index/components.yaml +8 -8
- package/token-index/semantics.yaml +1 -2
- package/src/tools/release/__tests__/ChangeClassifier.test.ts +0 -133
- package/src/tools/release/__tests__/ChangeExtractor.test.ts +0 -222
- package/src/tools/release/__tests__/GitHubPublisher.test.ts +0 -240
- package/src/tools/release/__tests__/NotesRenderer.test.ts +0 -142
- package/src/tools/release/__tests__/NpmPublisher.test.ts +0 -289
- package/src/tools/release/__tests__/PipelineIntegration.test.ts +0 -188
- package/src/tools/release/__tests__/ReleasePipeline.test.ts +0 -192
- package/src/tools/release/__tests__/SemanticVersionValidator.test.ts +0 -49
- package/src/tools/release/__tests__/SummaryScanner.test.ts +0 -141
- package/src/tools/release/__tests__/TagResolver.test.ts +0 -91
- package/src/tools/release/__tests__/VersionCalculator.test.ts +0 -270
- package/src/tools/release/__tests__/helpers/NpmMockHelper.ts +0 -80
- package/src/tools/release/cli/ReleasePipeline.ts +0 -165
- package/src/tools/release/cli/release-tool.ts +0 -107
- package/src/tools/release/pipeline/ChangeClassifier.ts +0 -61
- package/src/tools/release/pipeline/ChangeExtractor.ts +0 -87
- package/src/tools/release/pipeline/NotesRenderer.ts +0 -66
- package/src/tools/release/pipeline/SummaryScanner.ts +0 -70
- package/src/tools/release/pipeline/TagResolver.ts +0 -40
- package/src/tools/release/pipeline/VersionCalculator.ts +0 -375
- package/src/tools/release/publishers/GitHubPublisher.ts +0 -228
- package/src/tools/release/publishers/NpmPublisher.ts +0 -196
- package/src/tools/release/release-config.json +0 -5
- package/src/tools/release/types/index.ts +0 -282
- package/src/tools/release/validators/SemanticVersionValidator.ts +0 -67
package/dist/mcp/docs-mcp.js
CHANGED
|
@@ -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
|
|
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 =
|
|
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
|
-
*
|
|
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
|
|
14866
|
-
return
|
|
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
|
|
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
|
-
|
|
16886
|
-
|
|
16887
|
-
|
|
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,
|
package/dist/mcp/product-mcp.js
CHANGED
|
@@ -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: '
|
|
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
|
-
*
|
|
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
|
|
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.
|
|
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
|
-
*
|
|
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.
|
|
59
|
+
exports.ProgressSizingTokens = (0, tokens_1.defineComponentTokens)({
|
|
42
60
|
component: 'Progress',
|
|
43
|
-
family: '
|
|
61
|
+
family: 'sizing',
|
|
44
62
|
tokens: {
|
|
45
63
|
// ========================================================================
|
|
46
|
-
// BASE NODE SIZES
|
|
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 —
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
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
|
-
* →
|
|
91
|
-
*
|
|
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:
|
|
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: '
|
|
95
|
-
description: '
|
|
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
|
-
* →
|
|
170
|
-
*
|
|
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)
|