@savvy-web/silk-effects 0.6.1 → 1.0.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/README.md +48 -17
- package/_virtual/_rolldown/runtime.js +18 -0
- package/changesets/api/categories.js +247 -0
- package/changesets/api/changelog.js +134 -0
- package/changesets/api/dependency-table.js +163 -0
- package/changesets/api/linter.js +168 -0
- package/changesets/api/transformer.js +140 -0
- package/changesets/categories/index.js +299 -0
- package/changesets/categories/types.js +66 -0
- package/changesets/changelog/formatting.js +119 -0
- package/changesets/changelog/getDependencyReleaseLine.js +114 -0
- package/changesets/changelog/getReleaseLine.js +122 -0
- package/changesets/changelog/index.js +99 -0
- package/changesets/constants.js +43 -0
- package/changesets/errors.js +305 -0
- package/changesets/index.js +146 -0
- package/changesets/markdownlint/index.js +29 -0
- package/changesets/markdownlint/rules/content-structure.js +98 -0
- package/changesets/markdownlint/rules/dependency-table-format.js +170 -0
- package/changesets/markdownlint/rules/heading-hierarchy.js +61 -0
- package/changesets/markdownlint/rules/required-sections.js +54 -0
- package/changesets/markdownlint/rules/uncategorized-content.js +54 -0
- package/changesets/markdownlint/rules/utils.js +30 -0
- package/changesets/remark/plugins/aggregate-dependency-tables.js +47 -0
- package/changesets/remark/plugins/contributor-footnotes.js +123 -0
- package/changesets/remark/plugins/deduplicate-items.js +30 -0
- package/changesets/remark/plugins/issue-link-refs.js +58 -0
- package/changesets/remark/plugins/merge-sections.js +43 -0
- package/changesets/remark/plugins/normalize-format.js +47 -0
- package/changesets/remark/plugins/reorder-sections.js +34 -0
- package/changesets/remark/presets.js +119 -0
- package/changesets/remark/rules/content-structure.js +22 -0
- package/changesets/remark/rules/dependency-table-format.js +40 -0
- package/changesets/remark/rules/heading-hierarchy.js +19 -0
- package/changesets/remark/rules/required-sections.js +17 -0
- package/changesets/remark/rules/uncategorized-content.js +31 -0
- package/changesets/schemas/changeset.js +146 -0
- package/changesets/schemas/dependency-table.js +189 -0
- package/changesets/schemas/git.js +69 -0
- package/changesets/schemas/github.js +175 -0
- package/changesets/schemas/options.js +182 -0
- package/changesets/schemas/package-scope.js +128 -0
- package/changesets/schemas/primitives.js +72 -0
- package/changesets/schemas/version-files.js +151 -0
- package/changesets/services/branch-analyzer.js +278 -0
- package/changesets/services/changelog.js +50 -0
- package/changesets/services/config-inspector.js +390 -0
- package/changesets/services/github.js +178 -0
- package/changesets/services/markdown.js +106 -0
- package/changesets/services/workspace-snapshot.js +182 -0
- package/changesets/utils/commit-parser.js +80 -0
- package/changesets/utils/dep-diff.js +77 -0
- package/changesets/utils/dependency-table.js +347 -0
- package/changesets/utils/issue-refs.js +101 -0
- package/changesets/utils/jsonpath.js +175 -0
- package/changesets/utils/logger.js +50 -0
- package/changesets/utils/markdown-link.js +57 -0
- package/changesets/utils/publishability.js +39 -0
- package/changesets/utils/remark-pipeline.js +79 -0
- package/changesets/utils/section-parser.js +94 -0
- package/changesets/utils/strip-frontmatter.js +46 -0
- package/changesets/utils/version-blocks.js +108 -0
- package/changesets/utils/version-files.js +336 -0
- package/changesets/utils/worktree-snapshot.js +142 -0
- package/changesets/vendor/github-info.js +55 -0
- package/commitlint/config/factory.js +69 -0
- package/commitlint/config/plugins.js +227 -0
- package/commitlint/config/rules.js +155 -0
- package/commitlint/config/schema.js +46 -0
- package/commitlint/detection/dco.js +53 -0
- package/commitlint/detection/scopes.js +45 -0
- package/commitlint/formatter/format.js +85 -0
- package/commitlint/formatter/messages.js +79 -0
- package/commitlint/hook/diagnostics/branch.js +36 -0
- package/commitlint/hook/diagnostics/cache.js +37 -0
- package/commitlint/hook/diagnostics/commitlint-config.js +36 -0
- package/commitlint/hook/diagnostics/open-issues.js +56 -0
- package/commitlint/hook/diagnostics/package-manager.js +51 -0
- package/commitlint/hook/diagnostics/signing.js +107 -0
- package/commitlint/hook/envelope.js +46 -0
- package/commitlint/hook/output.js +45 -0
- package/commitlint/hook/parse-bash-command.js +105 -0
- package/commitlint/hook/rules/closes-trailer.js +31 -0
- package/commitlint/hook/rules/forbidden-content.js +32 -0
- package/commitlint/hook/rules/plan-leakage.js +36 -0
- package/commitlint/hook/rules/signing-flag-conflict.js +25 -0
- package/commitlint/hook/rules/soft-wrap.js +37 -0
- package/commitlint/hook/rules/types.js +14 -0
- package/commitlint/hook/rules/verbosity.js +31 -0
- package/commitlint/hook/silence-logger.js +39 -0
- package/commitlint/index.js +146 -0
- package/commitlint/prompt/config.js +91 -0
- package/commitlint/prompt/emojis.js +74 -0
- package/commitlint/prompt/prompter.js +135 -0
- package/commitlint/static.js +73 -0
- package/errors/BiomeSyncError.js +21 -0
- package/errors/ChangesetConfigError.js +20 -0
- package/errors/ConfigNotFoundError.js +21 -0
- package/errors/SectionParseError.js +16 -0
- package/errors/SectionValidationError.js +16 -0
- package/errors/SectionWriteError.js +16 -0
- package/errors/TagFormatError.js +20 -0
- package/errors/ToolNotFoundError.js +11 -0
- package/errors/ToolResolutionError.js +11 -0
- package/errors/ToolVersionMismatchError.js +11 -0
- package/errors/VersioningDetectionError.js +20 -0
- package/errors/WorkspaceAnalysisError.js +21 -0
- package/index.d.ts +9743 -8380
- package/index.js +36 -6657
- package/lint/Handler.js +39 -0
- package/lint/cli/sections.js +65 -0
- package/lint/cli/templates/markdownlint.gen.js +183 -0
- package/lint/config/Preset.js +152 -0
- package/lint/config/createConfig.js +89 -0
- package/lint/handlers/Biome.js +179 -0
- package/lint/handlers/Markdown.js +139 -0
- package/lint/handlers/PackageJson.js +130 -0
- package/lint/handlers/PnpmWorkspace.js +141 -0
- package/lint/handlers/ShellScripts.js +58 -0
- package/lint/handlers/TypeScript.js +134 -0
- package/lint/handlers/Yaml.js +167 -0
- package/lint/index.js +52 -0
- package/lint/utils/Command.js +285 -0
- package/lint/utils/Filter.js +100 -0
- package/lint/utils/Workspace.js +86 -0
- package/package.json +52 -63
- package/schemas/CommentStyle.js +16 -0
- package/schemas/ResolvedTool.js +63 -0
- package/schemas/SavvySections.js +113 -0
- package/schemas/SectionBlock.js +70 -0
- package/schemas/SectionDefinition.js +121 -0
- package/schemas/SectionResults.js +12 -0
- package/schemas/TagStrategySchemas.js +18 -0
- package/schemas/ToolDefinition.js +39 -0
- package/schemas/ToolResults.js +14 -0
- package/schemas/VersioningSchemas.js +95 -0
- package/schemas/WorkspaceAnalysisSchemas.js +190 -0
- package/services/BiomeSchemaSync.js +133 -0
- package/services/ChangesetConfig.js +78 -0
- package/services/ChangesetConfigReader.js +106 -0
- package/services/ConfigDiscovery.js +71 -0
- package/services/ManagedSection.js +288 -0
- package/services/SilkPublishability.js +193 -0
- package/services/SilkWorkspaceAnalyzer.js +213 -0
- package/services/TagStrategy.js +54 -0
- package/services/ToolDiscovery.js +229 -0
- package/services/VersioningStrategy.js +67 -0
- package/tsdoc-metadata.json +11 -11
- package/turbo/digest.js +127 -0
- package/turbo/errors.js +48 -0
- package/turbo/index.js +32 -0
- package/turbo/schemas/DryRun.js +57 -0
- package/turbo/schemas/results.js +61 -0
- package/turbo/services/TurboInspector.js +100 -0
- 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 };
|