Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
5dbcf9d
artifacts and example of the claude workflow
TheLarkInn Feb 7, 2026
0683ab2
add atomic workflow plugin to rushstack
TheLarkInn Feb 9, 2026
e99ba6d
Untrack research/ directory that was accidentally committed
TheLarkInn Feb 9, 2026
89f3ba6
feat(rush-lib): add publishTarget field to rush.json project schema
TheLarkInn Feb 10, 2026
01c3ee6
feat(rush-lib): add publishTarget to IRushConfigurationProjectJson
TheLarkInn Feb 10, 2026
3cb77df
feat(rush-lib): add publishTargets getter to RushConfigurationProject
TheLarkInn Feb 10, 2026
13dfb42
feat(rush-lib): add publishTarget validation rules
TheLarkInn Feb 10, 2026
fba09e0
test(rush-lib): add comprehensive publishTarget validation tests
TheLarkInn Feb 10, 2026
f02571f
feat(rush-lib): create IPublishProvider interface and types
TheLarkInn Feb 10, 2026
148068c
feat(rush-lib): export IPublishProvider types from public API
TheLarkInn Feb 10, 2026
381360f
feat(rush-lib): add registerPublishProviderFactory to RushSession
TheLarkInn Feb 10, 2026
895c676
test(rush-lib): add unit tests for publish provider factory registration
TheLarkInn Feb 10, 2026
9cad3b7
feat(rush-lib): create publish.schema.json for config/publish.json
TheLarkInn Feb 10, 2026
b5d735d
feat(rush-lib): add IPublishJson interface and riggable config loader
TheLarkInn Feb 10, 2026
619e8c0
test(rush-lib): add unit tests for riggable config/publish.json loading
TheLarkInn Feb 10, 2026
732921c
feat(rush-npm-publish-plugin): create package structure
TheLarkInn Feb 10, 2026
18bc9aa
feat(rush-npm-publish-plugin): implement NpmPublishProvider
TheLarkInn Feb 11, 2026
186aa1b
feat(rush-lib): register rush-npm-publish-plugin as built-in plugin
TheLarkInn Feb 11, 2026
e335dca
test(rush-npm-publish-plugin): add unit tests for NpmPublishProvider
TheLarkInn Feb 11, 2026
486acea
feat(rush-lib): add per-project publish config loading to PublishAction
TheLarkInn Feb 11, 2026
1cbf8f7
feat(rush-lib): refactor PublishAction to dispatch via publish providers
TheLarkInn Feb 11, 2026
1d80df2
feat(rush-vscode-publish-plugin): create VSIX publish provider plugin
TheLarkInn Feb 11, 2026
aac9cc7
feat(rush-lib): add beforePublish and afterPublish lifecycle hooks
TheLarkInn Feb 11, 2026
6c61a5f
feat(rush): enable VS Code extensions for VSIX publishing
TheLarkInn Feb 11, 2026
f3b9c82
test(rush-lib): verify VS Code extension publishTarget configuration
TheLarkInn Feb 11, 2026
98b9c97
test(rush-lib): verify version bump eligibility and publish dispatch …
TheLarkInn Feb 11, 2026
0d2064c
Delete CLAUDE.md
TheLarkInn Feb 11, 2026
47c2319
remove mcp file
TheLarkInn Feb 11, 2026
aad8dbe
remove ai artifacts
TheLarkInn Feb 11, 2026
9b994ed
rename fixtures appropriately
TheLarkInn Feb 11, 2026
37c223b
address PR feedback
TheLarkInn Feb 11, 2026
55528d3
implement pack for base publish provider and use in both providers
TheLarkInn Feb 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -135,5 +135,4 @@ playwright-report/
test-results/

# Claude Code local configuration
.claude/*.local.json

.claude/*.local.json
2 changes: 2 additions & 0 deletions apps/rush/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
"@rushstack/rush-amazon-s3-build-cache-plugin": "workspace:*",
"@rushstack/rush-azure-storage-build-cache-plugin": "workspace:*",
"@rushstack/rush-http-build-cache-plugin": "workspace:*",
"@rushstack/rush-npm-publish-plugin": "workspace:*",
"@rushstack/rush-vscode-publish-plugin": "workspace:*",
"@types/heft-jest": "1.0.1",
"@types/semver": "7.5.0"
}
Expand Down
2 changes: 2 additions & 0 deletions apps/rush/src/start-dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ includePlugin('rush-azure-storage-build-cache-plugin');
includePlugin('rush-http-build-cache-plugin');
// Including this here so that developers can reuse it without installing the plugin a second time
includePlugin('rush-azure-interactive-auth-plugin', '@rushstack/rush-azure-storage-build-cache-plugin');
includePlugin('rush-npm-publish-plugin');
includePlugin('rush-vscode-publish-plugin');

const currentPackageVersion: string = PackageJsonLookup.loadOwnPackageJson(__dirname).version;
RushCommandSelector.execute(currentPackageVersion, rushLib, {
Expand Down
62 changes: 62 additions & 0 deletions common/config/subspaces/default/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

71 changes: 71 additions & 0 deletions common/reviews/api/rush-lib.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,22 @@ export class ChangeManager {
static createEmptyChangeFiles(rushConfiguration: RushConfiguration, projectName: string, emailAddress: string): string | undefined;
}

// @beta
export enum ChangeType {
// (undocumented)
dependency = 1,
// (undocumented)
hotfix = 2,
// (undocumented)
major = 5,
// (undocumented)
minor = 4,
// (undocumented)
none = 0,
// (undocumented)
patch = 3
}

// Warning: (ae-forgotten-export) The symbol "IBuildCacheJson" needs to be exported by the entry point index.d.ts
//
// @beta (undocumented)
Expand Down Expand Up @@ -799,6 +815,51 @@ export type _IProjectBuildCacheOptions = _IOperationBuildCacheOptions & {
phaseName: string;
};

// @beta
export interface IPublishCommand extends IRushCommand {
readonly dryRun: boolean;
}

// @beta
export interface IPublishProjectInfo {
readonly changeType: ChangeType;
readonly newVersion: string;
readonly previousVersion: string;
readonly project: RushConfigurationProject;
readonly providerConfig: Record<string, unknown> | undefined;
}

// @beta
export interface IPublishProvider {
checkExistsAsync(options: IPublishProviderCheckExistsOptions): Promise<boolean>;
packAsync(options: IPublishProviderPackOptions): Promise<void>;
readonly providerName: string;
publishAsync(options: IPublishProviderPublishOptions): Promise<void>;
}

// @beta
export interface IPublishProviderCheckExistsOptions {
readonly project: RushConfigurationProject;
readonly providerConfig: Record<string, unknown> | undefined;
readonly version: string;
}

// @beta
export interface IPublishProviderPackOptions {
readonly dryRun: boolean;
readonly logger: ILogger;
readonly projects: ReadonlyArray<IPublishProjectInfo>;
readonly releaseFolder: string;
}

// @beta
export interface IPublishProviderPublishOptions {
readonly dryRun: boolean;
readonly logger: ILogger;
readonly projects: ReadonlyArray<IPublishProjectInfo>;
readonly tag: string | undefined;
}

// @beta
export interface IRushCommand {
readonly actionName: string;
Expand Down Expand Up @@ -1202,6 +1263,9 @@ export class ProjectChangeAnalyzer {
_tryGetSnapshotProviderAsync(projectConfigurations: ReadonlyMap<RushConfigurationProject, RushProjectConfiguration>, terminal: ITerminal, projectSelection?: ReadonlySet<RushConfigurationProject>): Promise<GetInputsSnapshotAsyncFn | undefined>;
}

// @beta
export type PublishProviderFactory = () => Promise<IPublishProvider>;

// @public
export class RepoStateFile {
readonly filePath: string;
Expand Down Expand Up @@ -1389,6 +1453,7 @@ export class RushConfigurationProject {
readonly projectRushConfigFolder: string;
readonly projectRushTempFolder: string;
readonly publishFolder: string;
get publishTargets(): ReadonlyArray<string>;
readonly reviewCategory: string | undefined;
readonly rushConfiguration: RushConfiguration;
get shouldPublish(): boolean;
Expand Down Expand Up @@ -1492,11 +1557,13 @@ export class RushLifecycleHooks {
subspace: Subspace,
variant: string | undefined
]>;
readonly afterPublish: AsyncSeriesHook<[command: IPublishCommand]>;
readonly beforeInstall: AsyncSeriesHook<[
command: IGlobalCommand,
subspace: Subspace,
variant: string | undefined
]>;
readonly beforePublish: AsyncSeriesHook<[command: IPublishCommand]>;
readonly flushTelemetry: AsyncParallelHook<[ReadonlyArray<ITelemetryData>]>;
readonly initialize: AsyncSeriesHook<IRushCommand>;
readonly runAnyGlobalCustomCommand: AsyncSeriesHook<IGlobalCommand>;
Expand Down Expand Up @@ -1536,12 +1603,16 @@ export class RushSession {
// (undocumented)
getLogger(name: string): ILogger;
// (undocumented)
getPublishProviderFactory(publishTargetName: string): PublishProviderFactory | undefined;
// (undocumented)
readonly hooks: RushLifecycleHooks;
// (undocumented)
registerCloudBuildCacheProviderFactory(cacheProviderName: string, factory: CloudBuildCacheProviderFactory): void;
// (undocumented)
registerCobuildLockProviderFactory(cobuildLockProviderName: string, factory: CobuildLockProviderFactory): void;
// (undocumented)
registerPublishProviderFactory(publishTargetName: string, factory: PublishProviderFactory): void;
// (undocumented)
get terminalProvider(): ITerminalProvider;
}

Expand Down
3 changes: 2 additions & 1 deletion libraries/rush-lib/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@
"publishOnlyDependencies": {
"@rushstack/rush-amazon-s3-build-cache-plugin": "workspace:*",
"@rushstack/rush-azure-storage-build-cache-plugin": "workspace:*",
"@rushstack/rush-http-build-cache-plugin": "workspace:*"
"@rushstack/rush-http-build-cache-plugin": "workspace:*",
"@rushstack/rush-npm-publish-plugin": "workspace:*"
},
"sideEffects": [
"lib-esnext/start-pnpm.js",
Expand Down
2 changes: 2 additions & 0 deletions libraries/rush-lib/scripts/plugins-prepublish.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ delete packageJson['publishOnlyDependencies'];
packageJson.dependencies['@rushstack/rush-amazon-s3-build-cache-plugin'] = packageJson.version;
packageJson.dependencies['@rushstack/rush-azure-storage-build-cache-plugin'] = packageJson.version;
packageJson.dependencies['@rushstack/rush-http-build-cache-plugin'] = packageJson.version;
packageJson.dependencies['@rushstack/rush-npm-publish-plugin'] = packageJson.version;
packageJson.dependencies['@rushstack/rush-vscode-publish-plugin'] = packageJson.version;

JsonFile.save(packageJson, packageJsonPath, { updateExistingFile: true });
1 change: 1 addition & 0 deletions libraries/rush-lib/src/api/ChangeManagement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export interface IChangeFile {

/**
* Represents all of the types of change requests.
* @beta
*/
export enum ChangeType {
none = 0,
Expand Down
53 changes: 53 additions & 0 deletions libraries/rush-lib/src/api/PublishConfiguration.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.

import { ProjectConfigurationFile, InheritanceType } from '@rushstack/heft-config-file';

import publishSchemaJson from '../schemas/publish.schema.json';

/**
* Represents the parsed contents of a project's `config/publish.json` file.
* @public
*/
export interface IPublishJson {
/**
* An object whose keys are publish target names (e.g. 'npm', 'vsix') and whose
* values are provider-specific configuration objects.
*/
providers?: Record<string, Record<string, unknown>>;
}

/**
* The `ProjectConfigurationFile` instance for loading `config/publish.json` with
* rig resolution and property inheritance.
*
* @remarks
* The `providers` property uses custom inheritance: child provider sections are
* shallow-merged over parent provider sections. This means a project can override
* specific provider configs from a rig while inheriting others.
*
* @internal
*/
export const PUBLISH_CONFIGURATION_FILE: ProjectConfigurationFile<IPublishJson> =
new ProjectConfigurationFile<IPublishJson>({
projectRelativeFilePath: 'config/publish.json',
jsonSchemaObject: publishSchemaJson,
propertyInheritance: {
providers: {
inheritanceType: InheritanceType.custom,
inheritanceFunction: (
child: Record<string, Record<string, unknown>> | undefined,
parent: Record<string, Record<string, unknown>> | undefined
): Record<string, Record<string, unknown>> | undefined => {
if (!child) {
return parent;
}
if (!parent) {
return child;
}
// Shallow merge: child provider sections override parent provider sections
return { ...parent, ...child };
}
}
}
});
Loading
Loading