@savvy-web/silk-effects 0.6.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +48 -17
  2. package/_virtual/_rolldown/runtime.js +18 -0
  3. package/changesets/api/categories.js +247 -0
  4. package/changesets/api/changelog.js +134 -0
  5. package/changesets/api/dependency-table.js +163 -0
  6. package/changesets/api/linter.js +168 -0
  7. package/changesets/api/transformer.js +140 -0
  8. package/changesets/categories/index.js +299 -0
  9. package/changesets/categories/types.js +66 -0
  10. package/changesets/changelog/formatting.js +119 -0
  11. package/changesets/changelog/getDependencyReleaseLine.js +114 -0
  12. package/changesets/changelog/getReleaseLine.js +122 -0
  13. package/changesets/changelog/index.js +99 -0
  14. package/changesets/constants.js +43 -0
  15. package/changesets/errors.js +305 -0
  16. package/changesets/index.js +146 -0
  17. package/changesets/markdownlint/index.js +29 -0
  18. package/changesets/markdownlint/rules/content-structure.js +98 -0
  19. package/changesets/markdownlint/rules/dependency-table-format.js +170 -0
  20. package/changesets/markdownlint/rules/heading-hierarchy.js +61 -0
  21. package/changesets/markdownlint/rules/required-sections.js +54 -0
  22. package/changesets/markdownlint/rules/uncategorized-content.js +54 -0
  23. package/changesets/markdownlint/rules/utils.js +30 -0
  24. package/changesets/remark/plugins/aggregate-dependency-tables.js +47 -0
  25. package/changesets/remark/plugins/contributor-footnotes.js +123 -0
  26. package/changesets/remark/plugins/deduplicate-items.js +30 -0
  27. package/changesets/remark/plugins/issue-link-refs.js +58 -0
  28. package/changesets/remark/plugins/merge-sections.js +43 -0
  29. package/changesets/remark/plugins/normalize-format.js +47 -0
  30. package/changesets/remark/plugins/reorder-sections.js +34 -0
  31. package/changesets/remark/presets.js +119 -0
  32. package/changesets/remark/rules/content-structure.js +22 -0
  33. package/changesets/remark/rules/dependency-table-format.js +40 -0
  34. package/changesets/remark/rules/heading-hierarchy.js +19 -0
  35. package/changesets/remark/rules/required-sections.js +17 -0
  36. package/changesets/remark/rules/uncategorized-content.js +31 -0
  37. package/changesets/schemas/changeset.js +146 -0
  38. package/changesets/schemas/dependency-table.js +189 -0
  39. package/changesets/schemas/git.js +69 -0
  40. package/changesets/schemas/github.js +175 -0
  41. package/changesets/schemas/options.js +182 -0
  42. package/changesets/schemas/package-scope.js +128 -0
  43. package/changesets/schemas/primitives.js +72 -0
  44. package/changesets/schemas/version-files.js +151 -0
  45. package/changesets/services/branch-analyzer.js +278 -0
  46. package/changesets/services/changelog.js +50 -0
  47. package/changesets/services/config-inspector.js +390 -0
  48. package/changesets/services/github.js +178 -0
  49. package/changesets/services/markdown.js +106 -0
  50. package/changesets/services/workspace-snapshot.js +182 -0
  51. package/changesets/utils/commit-parser.js +80 -0
  52. package/changesets/utils/dep-diff.js +77 -0
  53. package/changesets/utils/dependency-table.js +347 -0
  54. package/changesets/utils/issue-refs.js +101 -0
  55. package/changesets/utils/jsonpath.js +175 -0
  56. package/changesets/utils/logger.js +50 -0
  57. package/changesets/utils/markdown-link.js +57 -0
  58. package/changesets/utils/publishability.js +39 -0
  59. package/changesets/utils/remark-pipeline.js +79 -0
  60. package/changesets/utils/section-parser.js +94 -0
  61. package/changesets/utils/strip-frontmatter.js +46 -0
  62. package/changesets/utils/version-blocks.js +108 -0
  63. package/changesets/utils/version-files.js +336 -0
  64. package/changesets/utils/worktree-snapshot.js +142 -0
  65. package/changesets/vendor/github-info.js +55 -0
  66. package/commitlint/config/factory.js +69 -0
  67. package/commitlint/config/plugins.js +227 -0
  68. package/commitlint/config/rules.js +155 -0
  69. package/commitlint/config/schema.js +46 -0
  70. package/commitlint/detection/dco.js +53 -0
  71. package/commitlint/detection/scopes.js +45 -0
  72. package/commitlint/formatter/format.js +85 -0
  73. package/commitlint/formatter/messages.js +79 -0
  74. package/commitlint/hook/diagnostics/branch.js +36 -0
  75. package/commitlint/hook/diagnostics/cache.js +37 -0
  76. package/commitlint/hook/diagnostics/commitlint-config.js +36 -0
  77. package/commitlint/hook/diagnostics/open-issues.js +56 -0
  78. package/commitlint/hook/diagnostics/package-manager.js +51 -0
  79. package/commitlint/hook/diagnostics/signing.js +107 -0
  80. package/commitlint/hook/envelope.js +46 -0
  81. package/commitlint/hook/output.js +45 -0
  82. package/commitlint/hook/parse-bash-command.js +105 -0
  83. package/commitlint/hook/rules/closes-trailer.js +31 -0
  84. package/commitlint/hook/rules/forbidden-content.js +32 -0
  85. package/commitlint/hook/rules/plan-leakage.js +36 -0
  86. package/commitlint/hook/rules/signing-flag-conflict.js +25 -0
  87. package/commitlint/hook/rules/soft-wrap.js +37 -0
  88. package/commitlint/hook/rules/types.js +14 -0
  89. package/commitlint/hook/rules/verbosity.js +31 -0
  90. package/commitlint/hook/silence-logger.js +39 -0
  91. package/commitlint/index.js +146 -0
  92. package/commitlint/prompt/config.js +91 -0
  93. package/commitlint/prompt/emojis.js +74 -0
  94. package/commitlint/prompt/prompter.js +135 -0
  95. package/commitlint/static.js +73 -0
  96. package/errors/BiomeSyncError.js +21 -0
  97. package/errors/ChangesetConfigError.js +20 -0
  98. package/errors/ConfigNotFoundError.js +21 -0
  99. package/errors/SectionParseError.js +16 -0
  100. package/errors/SectionValidationError.js +16 -0
  101. package/errors/SectionWriteError.js +16 -0
  102. package/errors/TagFormatError.js +20 -0
  103. package/errors/ToolNotFoundError.js +11 -0
  104. package/errors/ToolResolutionError.js +11 -0
  105. package/errors/ToolVersionMismatchError.js +11 -0
  106. package/errors/VersioningDetectionError.js +20 -0
  107. package/errors/WorkspaceAnalysisError.js +21 -0
  108. package/index.d.ts +9743 -8380
  109. package/index.js +36 -6657
  110. package/lint/Handler.js +39 -0
  111. package/lint/cli/sections.js +65 -0
  112. package/lint/cli/templates/markdownlint.gen.js +183 -0
  113. package/lint/config/Preset.js +152 -0
  114. package/lint/config/createConfig.js +89 -0
  115. package/lint/handlers/Biome.js +179 -0
  116. package/lint/handlers/Markdown.js +139 -0
  117. package/lint/handlers/PackageJson.js +130 -0
  118. package/lint/handlers/PnpmWorkspace.js +141 -0
  119. package/lint/handlers/ShellScripts.js +58 -0
  120. package/lint/handlers/TypeScript.js +134 -0
  121. package/lint/handlers/Yaml.js +167 -0
  122. package/lint/index.js +52 -0
  123. package/lint/utils/Command.js +285 -0
  124. package/lint/utils/Filter.js +100 -0
  125. package/lint/utils/Workspace.js +86 -0
  126. package/package.json +52 -63
  127. package/schemas/CommentStyle.js +16 -0
  128. package/schemas/ResolvedTool.js +63 -0
  129. package/schemas/SavvySections.js +113 -0
  130. package/schemas/SectionBlock.js +70 -0
  131. package/schemas/SectionDefinition.js +121 -0
  132. package/schemas/SectionResults.js +12 -0
  133. package/schemas/TagStrategySchemas.js +18 -0
  134. package/schemas/ToolDefinition.js +39 -0
  135. package/schemas/ToolResults.js +14 -0
  136. package/schemas/VersioningSchemas.js +95 -0
  137. package/schemas/WorkspaceAnalysisSchemas.js +190 -0
  138. package/services/BiomeSchemaSync.js +133 -0
  139. package/services/ChangesetConfig.js +78 -0
  140. package/services/ChangesetConfigReader.js +106 -0
  141. package/services/ConfigDiscovery.js +71 -0
  142. package/services/ManagedSection.js +288 -0
  143. package/services/SilkPublishability.js +193 -0
  144. package/services/SilkWorkspaceAnalyzer.js +213 -0
  145. package/services/TagStrategy.js +54 -0
  146. package/services/ToolDiscovery.js +229 -0
  147. package/services/VersioningStrategy.js +67 -0
  148. package/tsdoc-metadata.json +11 -11
  149. package/turbo/digest.js +127 -0
  150. package/turbo/errors.js +48 -0
  151. package/turbo/index.js +32 -0
  152. package/turbo/schemas/DryRun.js +57 -0
  153. package/turbo/schemas/results.js +61 -0
  154. package/turbo/services/TurboInspector.js +100 -0
  155. package/utils/ToolCommand.js +40 -0
@@ -0,0 +1,61 @@
1
+ import { Schema } from "effect";
2
+
3
+ //#region src/turbo/schemas/results.ts
4
+ /** Per-package cache outcome for one task. */
5
+ const PackageCacheStatus = Schema.Struct({
6
+ package: Schema.String,
7
+ taskId: Schema.String,
8
+ hash: Schema.String,
9
+ status: Schema.Literal("HIT", "MISS"),
10
+ timeSaved: Schema.Number
11
+ }).annotations({ identifier: "PackageCacheStatus" });
12
+ /** The hash-contributor breakdown explaining a single MISS. */
13
+ const MissExplanation = Schema.Struct({
14
+ package: Schema.String,
15
+ taskId: Schema.String,
16
+ hash: Schema.String,
17
+ inputFileCount: Schema.Number,
18
+ hashedEnvVars: Schema.Array(Schema.String),
19
+ externalDependenciesHash: Schema.String,
20
+ dependsOn: Schema.Array(Schema.String)
21
+ }).annotations({ identifier: "MissExplanation" });
22
+ /** Global-hash component summary (every task inherits this). */
23
+ const GlobalHashSummary = Schema.Struct({
24
+ rootKey: Schema.String,
25
+ globalFileCount: Schema.Number,
26
+ externalDependenciesHash: Schema.String,
27
+ internalDependenciesHash: Schema.String,
28
+ globalEnvVars: Schema.Array(Schema.String)
29
+ }).annotations({ identifier: "GlobalHashSummary" });
30
+ /** Result of `TurboInspector.diagnoseCache`. */
31
+ const CacheDiagnosis = Schema.Struct({
32
+ task: Schema.String,
33
+ totalTasks: Schema.Number,
34
+ hits: Schema.Number,
35
+ misses: Schema.Number,
36
+ statuses: Schema.Array(PackageCacheStatus),
37
+ explanations: Schema.Array(MissExplanation),
38
+ global: GlobalHashSummary
39
+ }).annotations({ identifier: "CacheDiagnosis" });
40
+ /** One node in the task graph. */
41
+ const GraphNode = Schema.Struct({
42
+ taskId: Schema.String,
43
+ package: Schema.String,
44
+ dependsOn: Schema.Array(Schema.String)
45
+ }).annotations({ identifier: "GraphNode" });
46
+ /** Result of `TurboInspector.taskGraph`. */
47
+ const TaskGraphResult = Schema.Struct({
48
+ task: Schema.optional(Schema.String),
49
+ nodeCount: Schema.Number,
50
+ nodes: Schema.Array(GraphNode),
51
+ criticalPath: Schema.Array(Schema.String)
52
+ }).annotations({ identifier: "TaskGraphResult" });
53
+ /** Result of `TurboInspector.affected`. */
54
+ const AffectedResult = Schema.Struct({
55
+ base: Schema.String,
56
+ packages: Schema.Array(Schema.String),
57
+ dependents: Schema.Array(Schema.String)
58
+ }).annotations({ identifier: "AffectedResult" });
59
+
60
+ //#endregion
61
+ export { AffectedResult, CacheDiagnosis, GlobalHashSummary, GraphNode, MissExplanation, PackageCacheStatus, TaskGraphResult };
@@ -0,0 +1,100 @@
1
+ import { ToolDefinition } from "../../schemas/ToolDefinition.js";
2
+ import { ToolDiscovery } from "../../services/ToolDiscovery.js";
3
+ import { TurboDigest } from "../digest.js";
4
+ import { DryRunParseError, NotATurboRepoError, TurboExecError, TurboNotInstalledError } from "../errors.js";
5
+ import { TurboDryRun } from "../schemas/DryRun.js";
6
+ import { Context, Effect, Layer, Schema } from "effect";
7
+ import { Command, CommandExecutor, FileSystem } from "@effect/platform";
8
+
9
+ //#region src/turbo/services/TurboInspector.ts
10
+ /**
11
+ * Read-only Turborepo inspector. All operations use `--dry` and never execute tasks.
12
+ * Surfaced through the MCP `turbo_inspect` tool.
13
+ *
14
+ * @remarks
15
+ * Methods take an explicit `cwd` (the MCP tool handler resolves the workspace root
16
+ * and passes it). Output is decoded with {@link TurboDryRun} and digested by
17
+ * {@link TurboDigest}.
18
+ *
19
+ * @since 0.7.0
20
+ */
21
+ var TurboInspector = class extends Context.Tag("@savvy-web/silk-effects/TurboInspector")() {};
22
+ const TURBO = ToolDefinition.make({ name: "turbo" });
23
+ /** Default task used by {@link TurboInspector.taskGraph} and {@link TurboInspector.affected}. */
24
+ const DEFAULT_BUILD_TASK = "build:dev";
25
+ /** Default git ref `affected` compares against — matches Turborepo's own `--affected` default. */
26
+ const DEFAULT_AFFECTED_BASE = "main";
27
+ /**
28
+ * Live implementation of {@link TurboInspector}.
29
+ *
30
+ * @remarks
31
+ * Requires {@link ToolDiscovery} to resolve the `turbo` binary, plus
32
+ * `CommandExecutor` and `FileSystem` from `@effect/platform`. Mirrors
33
+ * `ToolDiscoveryLive`: the executor is captured at layer construction and
34
+ * discharged onto each command effect with `Effect.provideService`, keeping
35
+ * the public method effects at `R = never`.
36
+ *
37
+ * @since 0.7.0
38
+ */
39
+ const TurboInspectorLive = Layer.effect(TurboInspector, Effect.gen(function* () {
40
+ const discovery = yield* ToolDiscovery;
41
+ const executor = yield* CommandExecutor.CommandExecutor;
42
+ const fs = yield* FileSystem.FileSystem;
43
+ const runTurbo = (cwd, args, env) => discovery.require(TURBO).pipe(Effect.mapError((e) => new TurboNotInstalledError({ reason: e.reason })), Effect.flatMap((resolved) => {
44
+ const command = resolved.exec(...args).workingDirectory(cwd);
45
+ return Effect.provideService((env ? command.env(env) : command).string(), CommandExecutor.CommandExecutor, executor).pipe(Effect.mapError((e) => new TurboExecError({
46
+ args: [...args],
47
+ reason: String(e)
48
+ })));
49
+ }));
50
+ /** Run a read-only `git` command in `cwd` and return its non-empty output lines. */
51
+ const runGit = (cwd, args) => Effect.provideService(Command.string(Command.workingDirectory(Command.make("git", ...args), cwd)), CommandExecutor.CommandExecutor, executor).pipe(Effect.mapError((e) => new TurboExecError({
52
+ args: ["git", ...args],
53
+ reason: String(e)
54
+ })), Effect.map((stdout) => stdout.split("\n").map((line) => line.trim()).filter((line) => line.length > 0)));
55
+ const ensureTurboRepo = (cwd) => fs.exists(`${cwd}/turbo.json`).pipe(Effect.catchAll(() => Effect.succeed(false)), Effect.flatMap((ok) => ok ? Effect.void : Effect.fail(new NotATurboRepoError({ cwd }))));
56
+ const dryRun = (task, cwd, args, env) => ensureTurboRepo(cwd).pipe(Effect.flatMap(() => runTurbo(cwd, args, env)), Effect.flatMap((stdout) => Effect.try({
57
+ try: () => JSON.parse(stdout),
58
+ catch: (e) => new DryRunParseError({
59
+ task,
60
+ reason: `invalid JSON: ${String(e)}`
61
+ })
62
+ })), Effect.flatMap((json) => Schema.decodeUnknown(TurboDryRun)(json).pipe(Effect.mapError((e) => new DryRunParseError({
63
+ task,
64
+ reason: String(e)
65
+ })))));
66
+ return TurboInspector.of({
67
+ diagnoseCache: (task, cwd) => dryRun(task, cwd, [
68
+ "run",
69
+ task,
70
+ "--dry=json"
71
+ ]).pipe(Effect.map((dry) => TurboDigest.cacheDiagnosis(task, dry))),
72
+ taskGraph: (cwd, task) => {
73
+ const t = task ?? DEFAULT_BUILD_TASK;
74
+ return dryRun(t, cwd, [
75
+ "run",
76
+ t,
77
+ "--dry=json"
78
+ ]).pipe(Effect.map((dry) => TurboDigest.taskGraph(dry, task)));
79
+ },
80
+ affected: (cwd, base) => {
81
+ const ref = base ?? DEFAULT_AFFECTED_BASE;
82
+ return Effect.all({
83
+ changedFiles: runGit(cwd, [
84
+ "diff",
85
+ "--name-only",
86
+ `${ref}...HEAD`
87
+ ]),
88
+ dry: dryRun(`${DEFAULT_BUILD_TASK} --affected`, cwd, [
89
+ "run",
90
+ DEFAULT_BUILD_TASK,
91
+ "--affected",
92
+ "--dry=json"
93
+ ], { TURBO_SCM_BASE: ref })
94
+ }).pipe(Effect.map(({ changedFiles, dry }) => TurboDigest.affected(ref, changedFiles, dry)));
95
+ }
96
+ });
97
+ }));
98
+
99
+ //#endregion
100
+ export { TurboInspector, TurboInspectorLive };
@@ -0,0 +1,40 @@
1
+ import { Command } from "@effect/platform";
2
+
3
+ //#region src/utils/ToolCommand.ts
4
+ /**
5
+ * Wraps `@effect/platform` {@link Command.Command} with instance method ergonomics.
6
+ *
7
+ * Use `yield* cmd.string()` instead of `yield* Command.string(cmd)`.
8
+ *
9
+ * @since 0.2.0
10
+ */
11
+ var ToolCommand = class ToolCommand {
12
+ command;
13
+ constructor(command) {
14
+ this.command = command;
15
+ }
16
+ string(encoding) {
17
+ return Command.string(this.command, encoding);
18
+ }
19
+ exitCode() {
20
+ return Command.exitCode(this.command);
21
+ }
22
+ lines(encoding) {
23
+ return Command.lines(this.command, encoding);
24
+ }
25
+ stream() {
26
+ return Command.stream(this.command);
27
+ }
28
+ env(environment) {
29
+ return new ToolCommand(Command.env(this.command, environment));
30
+ }
31
+ workingDirectory(cwd) {
32
+ return new ToolCommand(Command.workingDirectory(this.command, cwd));
33
+ }
34
+ stdin(input) {
35
+ return new ToolCommand(Command.feed(this.command, input));
36
+ }
37
+ };
38
+
39
+ //#endregion
40
+ export { ToolCommand };