@shepai/cli 1.156.0-pr491.8a75139 → 1.156.0-pr492.c465926
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 +1 -1
- package/dist/packages/core/src/application/use-cases/features/resolve-merged-features.use-case.d.ts +28 -0
- package/dist/packages/core/src/application/use-cases/features/resolve-merged-features.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/resolve-merged-features.use-case.js +94 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -0
- package/dist/packages/core/src/infrastructure/services/git/pr-branding.d.ts +1 -1
- package/dist/packages/core/src/infrastructure/services/git/pr-branding.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/pr-branding.js +1 -1
- package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/ui.command.js +8 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.js +2 -2
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +3 -3
- package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.js +12 -12
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +6 -6
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +11 -11
- package/dist/src/presentation/web/components/features/version/version-page-client.js +1 -1
- package/dist/src/presentation/web/dev-server.js +8 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_651cb3c2._.js → _0470f226._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_651cb3c2._.js.map → _0470f226._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
- package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_a81f0c6e._.js → _49422452._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_a81f0c6e._.js.map → _49422452._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_5f69c13f._.js +1 -1
- package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_2a2ef2c8._.js → _6efb17ff._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_2a2ef2c8._.js.map → _6efb17ff._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
- package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
- package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cb5a021e._.js +1 -1
- package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d86175ae._.js +1 -1
- package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d8bedf13._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
- package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +45 -45
- package/web/.next/static/chunks/{5e4685c23943adeb.js → 12f4909480716274.js} +1 -1
- package/web/.next/static/chunks/1535ca264cc51688.js +1 -0
- package/web/.next/static/chunks/{891987a18822095a.js → 1aef94553e4c7da4.js} +1 -1
- package/web/.next/static/chunks/{08ff9ace090d2691.js → 3e1e0f9bde3530d2.js} +1 -1
- package/web/.next/static/chunks/{e4fb17ae2aaffa9c.js → 43967a7326d83ea0.js} +1 -1
- package/web/.next/static/chunks/{d67b0c57d27fc3c5.js → 4cde55461bc680cd.js} +2 -2
- package/web/.next/static/chunks/{32f0296b12f8e234.js → 4f1e567bf3b02716.js} +2 -2
- package/web/.next/static/chunks/{a59d6684b099f03c.js → 5b7ce6a24a5e32a9.js} +1 -1
- package/web/.next/static/chunks/{093443eed9d7c21d.js → 7db2d7244d198023.js} +1 -1
- package/web/.next/static/chunks/{a75361ace8441fe1.js → 95febd9c9532119a.js} +2 -2
- package/web/.next/static/chunks/{45887253006aae6a.js → b1fb4b6f65f3eca6.js} +1 -1
- package/web/.next/static/chunks/{146b78db5daf2d19.js → cd444fa3aca8f1e2.js} +1 -1
- package/web/.next/static/chunks/e8bf321494da78f7.js +1 -0
- package/web/.next/static/chunks/02fcb64dbbbdf23e.js +0 -1
- package/web/.next/static/chunks/a3014ad1ff61fc87.js +0 -1
- /package/web/.next/static/{tlmwCGmYXRU5lkxEVtve9 → -aEY-UNBCed_KLrBdxJyk}/_buildManifest.js +0 -0
- /package/web/.next/static/{tlmwCGmYXRU5lkxEVtve9 → -aEY-UNBCed_KLrBdxJyk}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{tlmwCGmYXRU5lkxEVtve9 → -aEY-UNBCed_KLrBdxJyk}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
_Manage 10 features at once — isolated branches, automatic commits, CI watching, and PRs — from a dashboard or the terminal._
|
|
15
15
|
|
|
16
|
-
[](https://github.com/shep-ai/cli/actions/workflows/ci.yml)
|
|
17
17
|
[](https://www.npmjs.com/package/@shepai/cli)
|
|
18
18
|
[](https://opensource.org/licenses/MIT)
|
|
19
19
|
|
package/dist/packages/core/src/application/use-cases/features/resolve-merged-features.use-case.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResolveMergedFeaturesUseCase
|
|
3
|
+
*
|
|
4
|
+
* Checks features in the Review lifecycle to see if their branch has already
|
|
5
|
+
* been merged into the repository's default branch. If so, transitions them
|
|
6
|
+
* to Maintain (done) and completes the associated agent run.
|
|
7
|
+
*
|
|
8
|
+
* This resolves "action needed" features that are out of sync — the branch
|
|
9
|
+
* was merged externally but the feature record was never updated.
|
|
10
|
+
*
|
|
11
|
+
* Called on first page load to catch stale Review features.
|
|
12
|
+
*/
|
|
13
|
+
import type { IFeatureRepository } from '../../ports/output/repositories/feature-repository.interface.js';
|
|
14
|
+
import type { IGitPrService } from '../../ports/output/services/git-pr-service.interface.js';
|
|
15
|
+
import type { IAgentRunRepository } from '../../ports/output/agents/agent-run-repository.interface.js';
|
|
16
|
+
export declare class ResolveMergedFeaturesUseCase {
|
|
17
|
+
private readonly featureRepo;
|
|
18
|
+
private readonly gitPrService;
|
|
19
|
+
private readonly agentRunRepo;
|
|
20
|
+
constructor(featureRepo: IFeatureRepository, gitPrService: IGitPrService, agentRunRepo: IAgentRunRepository);
|
|
21
|
+
/**
|
|
22
|
+
* Scan all Review features and transition any whose branch has been merged.
|
|
23
|
+
*
|
|
24
|
+
* @returns Number of features resolved to Maintain.
|
|
25
|
+
*/
|
|
26
|
+
execute(): Promise<number>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=resolve-merged-features.use-case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-merged-features.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/resolve-merged-features.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAC7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AAEvG,qBACa,4BAA4B;IAEP,OAAO,CAAC,QAAQ,CAAC,WAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFb,WAAW,EAAE,kBAAkB,EACpC,YAAY,EAAE,aAAa,EACrB,YAAY,EAAE,mBAAmB;IAGnF;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAsDjC"}
|
package/dist/packages/core/src/application/use-cases/features/resolve-merged-features.use-case.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResolveMergedFeaturesUseCase
|
|
3
|
+
*
|
|
4
|
+
* Checks features in the Review lifecycle to see if their branch has already
|
|
5
|
+
* been merged into the repository's default branch. If so, transitions them
|
|
6
|
+
* to Maintain (done) and completes the associated agent run.
|
|
7
|
+
*
|
|
8
|
+
* This resolves "action needed" features that are out of sync — the branch
|
|
9
|
+
* was merged externally but the feature record was never updated.
|
|
10
|
+
*
|
|
11
|
+
* Called on first page load to catch stale Review features.
|
|
12
|
+
*/
|
|
13
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
14
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
15
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
17
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
18
|
+
};
|
|
19
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
21
|
+
};
|
|
22
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
23
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
24
|
+
};
|
|
25
|
+
import { injectable, inject } from 'tsyringe';
|
|
26
|
+
import { SdlcLifecycle, AgentRunStatus } from '../../../domain/generated/output.js';
|
|
27
|
+
let ResolveMergedFeaturesUseCase = class ResolveMergedFeaturesUseCase {
|
|
28
|
+
featureRepo;
|
|
29
|
+
gitPrService;
|
|
30
|
+
agentRunRepo;
|
|
31
|
+
constructor(featureRepo, gitPrService, agentRunRepo) {
|
|
32
|
+
this.featureRepo = featureRepo;
|
|
33
|
+
this.gitPrService = gitPrService;
|
|
34
|
+
this.agentRunRepo = agentRunRepo;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Scan all Review features and transition any whose branch has been merged.
|
|
38
|
+
*
|
|
39
|
+
* @returns Number of features resolved to Maintain.
|
|
40
|
+
*/
|
|
41
|
+
async execute() {
|
|
42
|
+
const reviewFeatures = await this.featureRepo.list({
|
|
43
|
+
lifecycle: SdlcLifecycle.Review,
|
|
44
|
+
});
|
|
45
|
+
let resolved = 0;
|
|
46
|
+
for (const feature of reviewFeatures) {
|
|
47
|
+
if (!feature.repositoryPath || !feature.branch)
|
|
48
|
+
continue;
|
|
49
|
+
try {
|
|
50
|
+
// Check if the repo has a remote — verifyMerge needs remote refs
|
|
51
|
+
const hasRemote = await this.gitPrService.hasRemote(feature.repositoryPath);
|
|
52
|
+
if (!hasRemote)
|
|
53
|
+
continue;
|
|
54
|
+
const defaultBranch = await this.gitPrService.getDefaultBranch(feature.repositoryPath);
|
|
55
|
+
// Sync remote refs so merge-base check uses latest state
|
|
56
|
+
try {
|
|
57
|
+
await this.gitPrService.syncMain(feature.repositoryPath, defaultBranch);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Sync failure is non-fatal — proceed with potentially stale refs
|
|
61
|
+
}
|
|
62
|
+
const isMerged = await this.gitPrService.verifyMerge(feature.repositoryPath, feature.branch, defaultBranch);
|
|
63
|
+
if (isMerged) {
|
|
64
|
+
feature.lifecycle = SdlcLifecycle.Maintain;
|
|
65
|
+
feature.updatedAt = new Date();
|
|
66
|
+
await this.featureRepo.update(feature);
|
|
67
|
+
// Complete the associated agent run if one exists
|
|
68
|
+
if (feature.agentRunId) {
|
|
69
|
+
try {
|
|
70
|
+
await this.agentRunRepo.updateStatus(feature.agentRunId, AgentRunStatus.completed);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Non-fatal — feature lifecycle is already updated
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
resolved++;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Skip features where git operations fail (repo deleted, etc.)
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return resolved;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
ResolveMergedFeaturesUseCase = __decorate([
|
|
88
|
+
injectable(),
|
|
89
|
+
__param(0, inject('IFeatureRepository')),
|
|
90
|
+
__param(1, inject('IGitPrService')),
|
|
91
|
+
__param(2, inject('IAgentRunRepository')),
|
|
92
|
+
__metadata("design:paramtypes", [Object, Object, Object])
|
|
93
|
+
], ResolveMergedFeaturesUseCase);
|
|
94
|
+
export { ResolveMergedFeaturesUseCase };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAkJrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA4arE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -90,6 +90,7 @@ import { UpgradeCliUseCase } from '../../application/use-cases/upgrade/upgrade-c
|
|
|
90
90
|
import { SyncRepositoryMainUseCase } from '../../application/use-cases/repositories/sync-repository-main.use-case.js';
|
|
91
91
|
import { RebaseFeatureOnMainUseCase } from '../../application/use-cases/features/rebase-feature-on-main.use-case.js';
|
|
92
92
|
import { GetBranchSyncStatusUseCase } from '../../application/use-cases/features/get-branch-sync-status.use-case.js';
|
|
93
|
+
import { ResolveMergedFeaturesUseCase } from '../../application/use-cases/features/resolve-merged-features.use-case.js';
|
|
93
94
|
import { ConflictResolutionService } from '../services/agents/conflict-resolution/conflict-resolution.service.js';
|
|
94
95
|
// Interactive session use cases
|
|
95
96
|
import { StartInteractiveSessionUseCase } from '../../application/use-cases/interactive/start-interactive-session.use-case.js';
|
|
@@ -332,6 +333,7 @@ export async function initializeContainer() {
|
|
|
332
333
|
container.registerSingleton(SyncRepositoryMainUseCase);
|
|
333
334
|
container.registerSingleton(RebaseFeatureOnMainUseCase);
|
|
334
335
|
container.registerSingleton(GetBranchSyncStatusUseCase);
|
|
336
|
+
container.registerSingleton(ResolveMergedFeaturesUseCase);
|
|
335
337
|
// Session repositories (per-AgentType string tokens)
|
|
336
338
|
container.register(`IAgentSessionRepository:${AgentType.ClaudeCode}`, {
|
|
337
339
|
useFactory: () => new ClaudeCodeSessionRepository(),
|
|
@@ -449,6 +451,9 @@ export async function initializeContainer() {
|
|
|
449
451
|
container.register('GetBranchSyncStatusUseCase', {
|
|
450
452
|
useFactory: (c) => c.resolve(GetBranchSyncStatusUseCase),
|
|
451
453
|
});
|
|
454
|
+
container.register('ResolveMergedFeaturesUseCase', {
|
|
455
|
+
useFactory: (c) => c.resolve(ResolveMergedFeaturesUseCase),
|
|
456
|
+
});
|
|
452
457
|
// Register interactive session infrastructure
|
|
453
458
|
container.register('IInteractiveSessionRepository', {
|
|
454
459
|
useFactory: (c) => {
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* PR creation paths (agent-driven, fork-and-PR, etc.).
|
|
7
7
|
*/
|
|
8
8
|
/** The branding line to append to PR bodies. */
|
|
9
|
-
export declare const PR_BRANDING = "Built with Shep \uD83D\uDC11 [Shep Bot](https://github.com/shep-ai/
|
|
9
|
+
export declare const PR_BRANDING = "Built with Shep \uD83D\uDC11 [Shep Bot](https://github.com/shep-ai/cli)";
|
|
10
10
|
/**
|
|
11
11
|
* Ensure a PR body carries the correct Shep branding.
|
|
12
12
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-branding.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/pr-branding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gDAAgD;AAChD,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"pr-branding.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/pr-branding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gDAAgD;AAChD,eAAO,MAAM,WAAW,4EACmD,CAAC;AAS5E;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAapD"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* PR creation paths (agent-driven, fork-and-PR, etc.).
|
|
7
7
|
*/
|
|
8
8
|
/** The branding line to append to PR bodies. */
|
|
9
|
-
export const PR_BRANDING = 'Built with Shep \uD83D\uDC11 [Shep Bot](https://github.com/shep-ai/
|
|
9
|
+
export const PR_BRANDING = 'Built with Shep \uD83D\uDC11 [Shep Bot](https://github.com/shep-ai/cli)';
|
|
10
10
|
/**
|
|
11
11
|
* Pattern matching common AI-tool attribution footers that should be
|
|
12
12
|
* replaced (e.g. "Generated with Claude Code", "Co-Authored-By: Claude").
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAkC1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAkC1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAyGzC"}
|
|
@@ -73,6 +73,14 @@ Examples:
|
|
|
73
73
|
const db = getExistingConnection();
|
|
74
74
|
initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db, gitForkService);
|
|
75
75
|
getPrSyncWatcher().start();
|
|
76
|
+
// Fire-and-forget: resolve stale Review features whose branch was already merged
|
|
77
|
+
try {
|
|
78
|
+
const resolveMerged = container.resolve('ResolveMergedFeaturesUseCase');
|
|
79
|
+
void resolveMerged.execute();
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Non-fatal — use case may not be registered in all configurations
|
|
83
|
+
}
|
|
76
84
|
const url = `http://localhost:${port}`;
|
|
77
85
|
messages.success(t('cli:commands.ui.serverReady', { url: fmt.code(url) }));
|
|
78
86
|
messages.info(t('cli:commands.ui.pressCtrlC'));
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js
CHANGED
|
@@ -393,7 +393,7 @@ export const MultipleRejections = {
|
|
|
393
393
|
},
|
|
394
394
|
{
|
|
395
395
|
iteration: 4,
|
|
396
|
-
message: "I've test and created a feature but the screenshots seems to be broken https://github.com/shep-ai/
|
|
396
|
+
message: "I've test and created a feature but the screenshots seems to be broken https://github.com/shep-ai/cli/pull/258 fix",
|
|
397
397
|
phase: 'merge',
|
|
398
398
|
timestamp: '2025-01-15T10:25:00Z',
|
|
399
399
|
},
|
|
@@ -116,7 +116,7 @@ const mergeReviewFeature = {
|
|
|
116
116
|
baseBranch: 'main',
|
|
117
117
|
hasPlan: true,
|
|
118
118
|
pr: {
|
|
119
|
-
url: 'https://github.com/shep-ai/
|
|
119
|
+
url: 'https://github.com/shep-ai/cli/pull/42',
|
|
120
120
|
number: 42,
|
|
121
121
|
status: PrStatus.Open,
|
|
122
122
|
ciStatus: CiStatus.Success,
|
|
@@ -228,7 +228,7 @@ const productFixture = {
|
|
|
228
228
|
};
|
|
229
229
|
const mergeFixture = {
|
|
230
230
|
pr: {
|
|
231
|
-
url: 'https://github.com/shep-ai/
|
|
231
|
+
url: 'https://github.com/shep-ai/cli/pull/42',
|
|
232
232
|
number: 42,
|
|
233
233
|
status: PrStatus.Open,
|
|
234
234
|
commitHash: 'a1b2c3d4e5f6789',
|
|
@@ -3,7 +3,7 @@ import { fn } from '@storybook/test';
|
|
|
3
3
|
import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
4
4
|
import { MergeReview } from './merge-review.js';
|
|
5
5
|
const fullPr = {
|
|
6
|
-
url: 'https://github.com/shep-ai/
|
|
6
|
+
url: 'https://github.com/shep-ai/cli/pull/42',
|
|
7
7
|
number: 42,
|
|
8
8
|
status: PrStatus.Open,
|
|
9
9
|
commitHash: 'a1b2c3d4e5f6789',
|
package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js
CHANGED
|
@@ -14,8 +14,8 @@ const meta = {
|
|
|
14
14
|
export default meta;
|
|
15
15
|
const repoData = {
|
|
16
16
|
id: 'repo-1',
|
|
17
|
-
name: 'shep-ai/
|
|
18
|
-
repositoryPath: '/home/user/shep-ai/
|
|
17
|
+
name: 'shep-ai/cli',
|
|
18
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
19
19
|
};
|
|
20
20
|
function DrawerTrigger({ data, label }) {
|
|
21
21
|
const [selected, setSelected] = useState(null);
|
|
@@ -27,7 +27,7 @@ export const Default = {
|
|
|
27
27
|
export const LongPath = {
|
|
28
28
|
render: () => (_jsx(DrawerTrigger, { data: {
|
|
29
29
|
...repoData,
|
|
30
|
-
repositoryPath: '/home/user/projects/company/some-very-long-path/shep-ai/
|
|
30
|
+
repositoryPath: '/home/user/projects/company/some-very-long-path/shep-ai/cli',
|
|
31
31
|
}, label: "Open Long Path" })),
|
|
32
32
|
};
|
|
33
33
|
export const WithoutPath = {
|
package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export interface RepositoryNodeData {
|
|
|
3
3
|
[key: string]: unknown;
|
|
4
4
|
/** Repository domain entity ID (UUID), used for delete operations */
|
|
5
5
|
id?: string;
|
|
6
|
-
/** Repository name, e.g. "shep-ai/
|
|
6
|
+
/** Repository name, e.g. "shep-ai/cli" */
|
|
7
7
|
name: string;
|
|
8
8
|
/** Absolute path to the repository root, used for IDE/shell actions */
|
|
9
9
|
repositoryPath?: string;
|
package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-node-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,
|
|
1
|
+
{"version":3,"file":"repository-node-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+GAA+G;IAC/G,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oHAAoH;IACpH,aAAa,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC"}
|
package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.js
CHANGED
|
@@ -14,7 +14,7 @@ const meta = {
|
|
|
14
14
|
layout: 'centered',
|
|
15
15
|
},
|
|
16
16
|
args: {
|
|
17
|
-
name: 'shep-ai/
|
|
17
|
+
name: 'shep-ai/cli',
|
|
18
18
|
branch: 'main',
|
|
19
19
|
commitMessage: 'feat: add dark mode toggle',
|
|
20
20
|
committer: 'Jane Doe',
|
|
@@ -45,7 +45,7 @@ export const LongName = {
|
|
|
45
45
|
const onAdd = () => undefined;
|
|
46
46
|
const multipleRepos = [
|
|
47
47
|
{
|
|
48
|
-
name: 'shep-ai/
|
|
48
|
+
name: 'shep-ai/cli',
|
|
49
49
|
branch: 'main',
|
|
50
50
|
commitMessage: 'feat: add dark mode toggle',
|
|
51
51
|
committer: 'Jane Doe',
|
|
@@ -84,7 +84,7 @@ export const Multiple = {
|
|
|
84
84
|
};
|
|
85
85
|
const multipleReposWithButton = [
|
|
86
86
|
{
|
|
87
|
-
name: 'shep-ai/
|
|
87
|
+
name: 'shep-ai/cli',
|
|
88
88
|
onAdd,
|
|
89
89
|
branch: 'main',
|
|
90
90
|
commitMessage: 'feat: add dark mode toggle',
|
|
@@ -126,7 +126,7 @@ export const MultipleWithButton = {
|
|
|
126
126
|
};
|
|
127
127
|
export const WithPulseAdd = {
|
|
128
128
|
args: {
|
|
129
|
-
repositoryPath: '/home/user/shep-ai/
|
|
129
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
130
130
|
pulseAdd: true,
|
|
131
131
|
},
|
|
132
132
|
argTypes: {
|
|
@@ -136,13 +136,13 @@ export const WithPulseAdd = {
|
|
|
136
136
|
};
|
|
137
137
|
export const WithActions = {
|
|
138
138
|
args: {
|
|
139
|
-
repositoryPath: '/home/user/shep-ai/
|
|
139
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
140
140
|
},
|
|
141
141
|
render: (args) => _jsx(RepositoryNodeCanvas, { data: args }),
|
|
142
142
|
};
|
|
143
143
|
export const WithActionsAndAddButton = {
|
|
144
144
|
args: {
|
|
145
|
-
repositoryPath: '/home/user/shep-ai/
|
|
145
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
146
146
|
},
|
|
147
147
|
argTypes: {
|
|
148
148
|
onAdd: { action: 'onAdd' },
|
|
@@ -153,7 +153,7 @@ const onDelete = () => undefined;
|
|
|
153
153
|
export const WithDeleteButton = {
|
|
154
154
|
args: {
|
|
155
155
|
id: 'repo-abc-123',
|
|
156
|
-
repositoryPath: '/home/user/shep-ai/
|
|
156
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
157
157
|
},
|
|
158
158
|
argTypes: {
|
|
159
159
|
onDelete: { action: 'onDelete' },
|
|
@@ -163,8 +163,8 @@ export const WithDeleteButton = {
|
|
|
163
163
|
const multipleReposWithActions = [
|
|
164
164
|
{
|
|
165
165
|
id: 'r1',
|
|
166
|
-
name: 'shep-ai/
|
|
167
|
-
repositoryPath: '/home/user/shep-ai/
|
|
166
|
+
name: 'shep-ai/cli',
|
|
167
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
168
168
|
onAdd,
|
|
169
169
|
onDelete,
|
|
170
170
|
branch: 'main',
|
|
@@ -217,7 +217,7 @@ export const MultipleWithActions = {
|
|
|
217
217
|
};
|
|
218
218
|
export const WithGitInfo = {
|
|
219
219
|
args: {
|
|
220
|
-
repositoryPath: '/home/user/shep-ai/
|
|
220
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
221
221
|
branch: 'feat/repo-node-enrichment',
|
|
222
222
|
commitMessage: 'feat(web): enrich repository node with branch and commit info',
|
|
223
223
|
committer: 'Ariel Shadkhan',
|
|
@@ -227,7 +227,7 @@ export const WithGitInfo = {
|
|
|
227
227
|
};
|
|
228
228
|
export const WithGitInfoBehind = {
|
|
229
229
|
args: {
|
|
230
|
-
repositoryPath: '/home/user/shep-ai/
|
|
230
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
231
231
|
branch: 'feat/old-feature-branch',
|
|
232
232
|
commitMessage: 'fix: resolve merge conflict in auth module',
|
|
233
233
|
committer: 'Jane Doe',
|
|
@@ -237,7 +237,7 @@ export const WithGitInfoBehind = {
|
|
|
237
237
|
};
|
|
238
238
|
export const GitInfoLoading = {
|
|
239
239
|
args: {
|
|
240
|
-
repositoryPath: '/home/user/shep-ai/
|
|
240
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
241
241
|
gitInfoStatus: 'loading',
|
|
242
242
|
},
|
|
243
243
|
render: (args) => _jsx(RepositoryNodeCanvas, { data: args }),
|
package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js
CHANGED
|
@@ -267,7 +267,7 @@ const repoNode = {
|
|
|
267
267
|
type: 'repositoryNode',
|
|
268
268
|
position: { x: 50, y: 162 },
|
|
269
269
|
data: {
|
|
270
|
-
name: 'shep-ai/
|
|
270
|
+
name: 'shep-ai/cli',
|
|
271
271
|
},
|
|
272
272
|
};
|
|
273
273
|
const repoFeatureNodes = [
|
|
@@ -320,7 +320,7 @@ const singleRepoSingleFeatureNodes = [
|
|
|
320
320
|
id: 'repo-1',
|
|
321
321
|
type: 'repositoryNode',
|
|
322
322
|
position: { x: 50, y: 127 },
|
|
323
|
-
data: { name: 'shep-ai/
|
|
323
|
+
data: { name: 'shep-ai/cli' },
|
|
324
324
|
},
|
|
325
325
|
{
|
|
326
326
|
id: 'feat-1',
|
|
@@ -352,7 +352,7 @@ const singleRepoMultiFeatNodes = [
|
|
|
352
352
|
id: 'repo-1',
|
|
353
353
|
type: 'repositoryNode',
|
|
354
354
|
position: { x: 50, y: 162 },
|
|
355
|
-
data: { name: 'shep-ai/
|
|
355
|
+
data: { name: 'shep-ai/cli' },
|
|
356
356
|
},
|
|
357
357
|
{
|
|
358
358
|
id: 'feat-1',
|
|
@@ -416,7 +416,7 @@ const multiRepoNodes = [
|
|
|
416
416
|
id: 'repo-1',
|
|
417
417
|
type: 'repositoryNode',
|
|
418
418
|
position: { x: 50, y: 86 },
|
|
419
|
-
data: { name: 'shep-ai/
|
|
419
|
+
data: { name: 'shep-ai/cli' },
|
|
420
420
|
},
|
|
421
421
|
{
|
|
422
422
|
id: 'repo-2',
|
|
@@ -470,7 +470,7 @@ const mixedRepoFeatureNodesRaw = [
|
|
|
470
470
|
id: 'repo-1',
|
|
471
471
|
type: 'repositoryNode',
|
|
472
472
|
position: { x: 0, y: 0 },
|
|
473
|
-
data: { name: 'shep-ai/
|
|
473
|
+
data: { name: 'shep-ai/cli' },
|
|
474
474
|
},
|
|
475
475
|
{
|
|
476
476
|
id: 'repo-2',
|
|
@@ -591,7 +591,7 @@ const fastModeNodesRaw = [
|
|
|
591
591
|
id: 'repo-1',
|
|
592
592
|
type: 'repositoryNode',
|
|
593
593
|
position: { x: 0, y: 0 },
|
|
594
|
-
data: { name: 'shep-ai/
|
|
594
|
+
data: { name: 'shep-ai/cli' },
|
|
595
595
|
},
|
|
596
596
|
{
|
|
597
597
|
id: 'feat-fast-1',
|
|
@@ -313,15 +313,15 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
313
313
|
}) })] }) }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("div", { id: "section-language", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: _jsx(LanguageSettingsSection, { language: settings.user?.preferredLanguage ?? Language.English }) }), _jsxs("div", { id: "section-agent", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: Bot, title: t('settings.agent.sectionTitle'), description: t('settings.agent.sectionDescription'), testId: "agent-settings-section", children: _jsx(SettingsRow, { label: t('settings.agent.agentAndModel'), description: t('settings.agent.agentAndModelDescription'), htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-55" }) }) }), _jsx(SectionHint, { links: [
|
|
314
314
|
{
|
|
315
315
|
label: t('settings.agent.links.agentSystem'),
|
|
316
|
-
href: 'https://github.com/shep-ai/
|
|
316
|
+
href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/agent-system.md',
|
|
317
317
|
},
|
|
318
318
|
{
|
|
319
319
|
label: t('settings.agent.links.addingAgents'),
|
|
320
|
-
href: 'https://github.com/shep-ai/
|
|
320
|
+
href: 'https://github.com/shep-ai/cli/blob/main/docs/development/adding-agents.md',
|
|
321
321
|
},
|
|
322
322
|
{
|
|
323
323
|
label: t('settings.agent.links.configurationGuide'),
|
|
324
|
-
href: 'https://github.com/shep-ai/
|
|
324
|
+
href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
|
|
325
325
|
},
|
|
326
326
|
], children: t('settings.agent.hint') })] }), _jsxs("div", { id: "section-environment", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Terminal, title: t('settings.environment.sectionTitle'), description: t('settings.environment.sectionDescription'), testId: "environment-settings-section", children: [_jsx(SettingsRow, { label: t('settings.environment.defaultEditor'), description: t('settings.environment.defaultEditorDescription'), htmlFor: "default-editor", children: _jsxs(Select, { value: editor, onValueChange: (v) => {
|
|
327
327
|
setEditor(v);
|
|
@@ -356,7 +356,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
356
356
|
}, children: [_jsx(SelectTrigger, { id: "terminal-preference", "data-testid": "terminal-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: terminalOptions.map((opt) => (_jsx(SelectItem, { value: opt.id, children: opt.name }, opt.id))) })] }) })] }), _jsx(SectionHint, { links: [
|
|
357
357
|
{
|
|
358
358
|
label: t('settings.environment.links.configurationGuide'),
|
|
359
|
-
href: 'https://github.com/shep-ai/
|
|
359
|
+
href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
|
|
360
360
|
},
|
|
361
361
|
], children: t('settings.environment.hint') })] }), _jsxs("div", { id: "section-workflow", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: GitBranch, title: t('settings.workflow.title'), description: t('settings.workflow.sectionDescription'), testId: "workflow-settings-section", children: [_jsx(SubsectionLabel, { children: t('settings.workflow.subsections.approve') }), _jsx(SwitchRow, { label: t('settings.workflow.autoApprovePrd'), description: t('settings.workflow.autoApprovePrdDescription'), id: "allow-prd", testId: "switch-allow-prd", checked: allowPrd, onChange: (v) => {
|
|
362
362
|
setAllowPrd(v);
|
|
@@ -397,11 +397,11 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
397
397
|
} })] }), _jsx(SectionHint, { links: [
|
|
398
398
|
{
|
|
399
399
|
label: t('settings.workflow.links.approvalGates'),
|
|
400
|
-
href: 'https://github.com/shep-ai/
|
|
400
|
+
href: 'https://github.com/shep-ai/cli/blob/main/specs/016-hitl-approval-gates/spec.yaml',
|
|
401
401
|
},
|
|
402
402
|
{
|
|
403
403
|
label: t('settings.workflow.links.pushAndPrFlags'),
|
|
404
|
-
href: 'https://github.com/shep-ai/
|
|
404
|
+
href: 'https://github.com/shep-ai/cli/blob/main/specs/037-feature-pr-push-flags/spec.yaml',
|
|
405
405
|
},
|
|
406
406
|
], children: t('settings.workflow.hint') })] }), _jsxs("div", { id: "section-ci", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Activity, title: t('settings.ci.title'), description: t('settings.ci.description'), testId: "ci-settings-section", children: [_jsx(SettingsRow, { label: t('settings.ci.maxFixAttempts'), description: t('settings.ci.maxFixAttemptsDescription'), htmlFor: "ci-max-fix", children: _jsx(NumberStepper, { id: "ci-max-fix", testId: "ci-max-fix-input", placeholder: "3", value: ciMaxFix, onChange: setCiMaxFix, onBlur: () => {
|
|
407
407
|
if (ciMaxFix !== originalCiMaxFix)
|
|
@@ -421,11 +421,11 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
421
421
|
} })] }), _jsx(SectionHint, { links: [
|
|
422
422
|
{
|
|
423
423
|
label: t('settings.ci.links.cicdPipeline'),
|
|
424
|
-
href: 'https://github.com/shep-ai/
|
|
424
|
+
href: 'https://github.com/shep-ai/cli/blob/main/docs/development/cicd.md',
|
|
425
425
|
},
|
|
426
426
|
{
|
|
427
427
|
label: t('settings.ci.links.ciSecurityGates'),
|
|
428
|
-
href: 'https://github.com/shep-ai/
|
|
428
|
+
href: 'https://github.com/shep-ai/cli/blob/main/specs/003-cicd-security-gates/spec.md',
|
|
429
429
|
},
|
|
430
430
|
], children: t('settings.ci.hint') })] }), _jsxs("div", { id: "section-stage-timeouts", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Timer, title: t('settings.stageTimeouts.title'), description: t('settings.stageTimeouts.description'), testId: "stage-timeouts-settings-section", children: [_jsx(SubsectionLabel, { children: t('settings.stageTimeouts.subsections.featureAgent') }), _jsx(SettingsRow, { label: t('settings.stageTimeouts.analyze'), description: t('settings.stageTimeouts.analyzeDescription'), htmlFor: "timeout-analyze", children: _jsx(TimeoutSlider, { id: "timeout-analyze", testId: "timeout-analyze-input", value: analyzeTimeout, onChange: setAnalyzeTimeout, onBlur: () => {
|
|
431
431
|
if (analyzeTimeout !== originalAnalyzeTimeout)
|
|
@@ -498,7 +498,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
498
498
|
} })] }), _jsx(SectionHint, { links: [
|
|
499
499
|
{
|
|
500
500
|
label: t('settings.notifications.links.notificationSystem'),
|
|
501
|
-
href: 'https://github.com/shep-ai/
|
|
501
|
+
href: 'https://github.com/shep-ai/cli/blob/main/specs/021-agent-notifications/spec.yaml',
|
|
502
502
|
},
|
|
503
503
|
], children: t('settings.notifications.hint') })] }), _jsxs("div", { id: "section-feature-flags", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Flag, title: t('settings.featureFlags.title'), description: t('settings.featureFlags.sectionDescription'), badge: t('settings.featureFlags.badge'), testId: "feature-flags-settings-section", children: [_jsx(SwitchRow, { label: t('settings.featureFlags.skills'), description: t('settings.featureFlags.skillsDescription'), id: "flag-skills", testId: "switch-flag-skills", checked: flags.skills, onChange: (v) => {
|
|
504
504
|
const newFlags = { ...flags, skills: v };
|
|
@@ -564,11 +564,11 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
564
564
|
} }) })] }), _jsx(SectionHint, { children: t('settings.interactiveAgent.hint') })] }), _jsxs("div", { id: "section-database", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Database, title: t('settings.database.title'), description: t('settings.database.sectionDescription'), testId: "database-settings-section", children: [_jsx(SettingsRow, { label: t('settings.database.location'), description: t('settings.database.locationDescription'), children: _jsx("span", { className: "text-muted-foreground max-w-50 truncate font-mono text-xs", "data-testid": "shep-home-path", children: shepHome }) }), _jsx(SettingsRow, { label: t('settings.database.size'), children: _jsx("span", { className: "text-muted-foreground text-xs", "data-testid": "db-file-size", children: dbFileSize }) })] }), _jsx(SectionHint, { links: [
|
|
565
565
|
{
|
|
566
566
|
label: t('settings.database.links.settingsService'),
|
|
567
|
-
href: 'https://github.com/shep-ai/
|
|
567
|
+
href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/settings-service.md',
|
|
568
568
|
},
|
|
569
569
|
{
|
|
570
570
|
label: t('settings.database.links.settingsSpec'),
|
|
571
|
-
href: 'https://github.com/shep-ai/
|
|
571
|
+
href: 'https://github.com/shep-ai/cli/blob/main/specs/005-global-settings-service/spec.md',
|
|
572
572
|
},
|
|
573
573
|
], children: t('settings.database.hint') })] })] })] }));
|
|
574
574
|
}
|
|
@@ -9,5 +9,5 @@ function InfoRow({ label, value, badge, badgeVariant = 'secondary' }) {
|
|
|
9
9
|
return (_jsxs("div", { className: "flex items-center justify-between py-2", children: [_jsx("span", { className: "text-muted-foreground text-sm", children: label }), badge ? (_jsx(Badge, { variant: badgeVariant, children: value })) : (_jsx("span", { className: "font-mono text-sm", children: value }))] }));
|
|
10
10
|
}
|
|
11
11
|
export default function VersionPageClient({ versionInfo, systemInfo }) {
|
|
12
|
-
return (_jsx("div", { className: "flex flex-col items-center justify-center p-4", children: _jsxs("div", { className: "w-full max-w-2xl space-y-6", children: [_jsxs("div", { className: "text-center", children: [_jsx("h1", { className: "text-3xl font-bold tracking-tight", children: versionInfo.name }), _jsx("p", { className: "text-muted-foreground mt-2", children: versionInfo.description }), _jsx("div", { className: "mt-4", children: _jsxs(Badge, { variant: "default", "data-testid": "version-badge", children: ["v", versionInfo.version] }) })] }), _jsxs(Tabs, { defaultValue: "overview", className: "w-full", children: [_jsxs(TabsList, { className: "grid w-full grid-cols-3", children: [_jsx(TabsTrigger, { value: "overview", children: "Overview" }), _jsx(TabsTrigger, { value: "system", children: "System" }), _jsx(TabsTrigger, { value: "features", children: "Features" })] }), _jsx(TabsContent, { value: "overview", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Package Information" }), _jsx(CardDescription, { children: "Details about the Shep AI CLI package" })] }), _jsxs(CardContent, { className: "space-y-1", children: [_jsx(InfoRow, { label: "Package", value: versionInfo.name }), _jsx(InfoRow, { label: "Version", value: `v${versionInfo.version}`, badge: true, badgeVariant: "default" }), _jsx(InfoRow, { label: "License", value: "MIT", badge: true, badgeVariant: "outline" }), _jsx(InfoRow, { label: "Author", value: "Shep AI" })] })] }) }), _jsx(TabsContent, { value: "system", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "System Information" }), _jsx(CardDescription, { children: "Runtime environment details" })] }), _jsxs(CardContent, { className: "space-y-1", children: [_jsx(InfoRow, { label: "Node.js", value: systemInfo.nodeVersion, badge: true, badgeVariant: "secondary" }), _jsx(InfoRow, { label: "Platform", value: `${systemInfo.platform} ${systemInfo.arch}` })] })] }) }), _jsx(TabsContent, { value: "features", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Key Features" }), _jsx(CardDescription, { children: "What Shep AI can do for you" })] }), _jsx(CardContent, { children: _jsxs("ul", { className: "space-y-2 text-sm", children: [_jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "AI" }), _jsx("span", { children: "Autonomous code generation" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "SDLC" }), _jsx("span", { children: "Full development lifecycle automation" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "CLI" }), _jsx("span", { children: "Powerful command-line interface" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "Web" }), _jsx("span", { children: "Modern web UI dashboard" })] })] }) })] }) })] }), _jsxs("div", { className: "flex justify-center gap-4", children: [_jsx(Button, { asChild: true, variant: "outline", children: _jsx(Link, { href: "/", children: "Back to Home" }) }), _jsx(Button, { asChild: true, children: _jsx("a", { href: "https://github.com/shep-ai/
|
|
12
|
+
return (_jsx("div", { className: "flex flex-col items-center justify-center p-4", children: _jsxs("div", { className: "w-full max-w-2xl space-y-6", children: [_jsxs("div", { className: "text-center", children: [_jsx("h1", { className: "text-3xl font-bold tracking-tight", children: versionInfo.name }), _jsx("p", { className: "text-muted-foreground mt-2", children: versionInfo.description }), _jsx("div", { className: "mt-4", children: _jsxs(Badge, { variant: "default", "data-testid": "version-badge", children: ["v", versionInfo.version] }) })] }), _jsxs(Tabs, { defaultValue: "overview", className: "w-full", children: [_jsxs(TabsList, { className: "grid w-full grid-cols-3", children: [_jsx(TabsTrigger, { value: "overview", children: "Overview" }), _jsx(TabsTrigger, { value: "system", children: "System" }), _jsx(TabsTrigger, { value: "features", children: "Features" })] }), _jsx(TabsContent, { value: "overview", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Package Information" }), _jsx(CardDescription, { children: "Details about the Shep AI CLI package" })] }), _jsxs(CardContent, { className: "space-y-1", children: [_jsx(InfoRow, { label: "Package", value: versionInfo.name }), _jsx(InfoRow, { label: "Version", value: `v${versionInfo.version}`, badge: true, badgeVariant: "default" }), _jsx(InfoRow, { label: "License", value: "MIT", badge: true, badgeVariant: "outline" }), _jsx(InfoRow, { label: "Author", value: "Shep AI" })] })] }) }), _jsx(TabsContent, { value: "system", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "System Information" }), _jsx(CardDescription, { children: "Runtime environment details" })] }), _jsxs(CardContent, { className: "space-y-1", children: [_jsx(InfoRow, { label: "Node.js", value: systemInfo.nodeVersion, badge: true, badgeVariant: "secondary" }), _jsx(InfoRow, { label: "Platform", value: `${systemInfo.platform} ${systemInfo.arch}` })] })] }) }), _jsx(TabsContent, { value: "features", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Key Features" }), _jsx(CardDescription, { children: "What Shep AI can do for you" })] }), _jsx(CardContent, { children: _jsxs("ul", { className: "space-y-2 text-sm", children: [_jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "AI" }), _jsx("span", { children: "Autonomous code generation" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "SDLC" }), _jsx("span", { children: "Full development lifecycle automation" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "CLI" }), _jsx("span", { children: "Powerful command-line interface" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "Web" }), _jsx("span", { children: "Modern web UI dashboard" })] })] }) })] }) })] }), _jsxs("div", { className: "flex justify-center gap-4", children: [_jsx(Button, { asChild: true, variant: "outline", children: _jsx(Link, { href: "/", children: "Back to Home" }) }), _jsx(Button, { asChild: true, children: _jsx("a", { href: "https://github.com/shep-ai/cli", target: "_blank", rel: "noopener noreferrer", children: "View on GitHub" }) })] })] }) }));
|
|
13
13
|
}
|
|
@@ -69,6 +69,14 @@ async function main() {
|
|
|
69
69
|
const db = getExistingConnection();
|
|
70
70
|
initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db, gitForkService);
|
|
71
71
|
getPrSyncWatcher().start();
|
|
72
|
+
// Fire-and-forget: resolve stale Review features whose branch was already merged
|
|
73
|
+
try {
|
|
74
|
+
const resolveMerged = container.resolve('ResolveMergedFeaturesUseCase');
|
|
75
|
+
void resolveMerged.execute();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Non-fatal — use case may not be registered in all configurations
|
|
79
|
+
}
|
|
72
80
|
}
|
|
73
81
|
catch (error) {
|
|
74
82
|
console.warn('[dev-server] DI initialization failed — features will be empty:', error);
|