paseo-req-kit 1.13.0-beta.2 → 1.13.0-beta.4
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/CHANGELOG.md +28 -0
- package/contracts/cli-json.md +3 -1
- package/contracts/state.md +3 -1
- package/contracts/usage-record.md +2 -0
- package/docs/guide//344/275/277/347/224/250/350/200/205/346/214/207/345/215/227.md +5 -2
- package/docs/guide//351/241/271/347/233/256/345/256/232/345/210/266/344/270/216/350/277/220/350/241/214/350/247/204/345/210/231.md +17 -4
- package/engine/src/api.ts +29 -5
- package/engine/src/card-cmd.ts +2 -0
- package/engine/src/config-view.ts +5 -0
- package/engine/src/config.ts +13 -0
- package/engine/src/estimate.ts +95 -0
- package/engine/src/factory.ts +13 -30
- package/engine/src/launch.ts +5 -0
- package/engine/src/main.ts +5 -1
- package/engine/src/messages.ts +7 -2
- package/engine/src/pipeline.ts +89 -1
- package/engine/src/records.ts +6 -0
- package/engine/src/review.ts +14 -3
- package/engine/src/state.ts +15 -0
- package/engine/src/stats.ts +83 -0
- package/engine/src/watchdog.ts +105 -0
- package/package.json +1 -1
- package/paseo-plugin/client/detail.tsx +14 -6
- package/paseo-plugin/client/format.ts +1 -0
- package/paseo-plugin/client/inbox.tsx +11 -7
- package/paseo-plugin/client/nav.ts +12 -0
- package/paseo-plugin/client/overview.tsx +1 -1
- package/paseo-plugin/client/review.tsx +46 -0
- package/paseo-plugin/client/stats.tsx +42 -0
- package/paseo-plugin/client/web.ts +17 -0
- package/paseo-plugin/index.client.tsx +4 -0
- package/paseo-plugin/index.server.ts +16 -0
- package/paseo-plugin/package.json +1 -1
- package/paseo-plugin/shared/contracts.ts +23 -1
- package/site-dist/404.html +2 -2
- package/site-dist/assets/{app.DWPPPhFm.js → app.n_bkEV-X.js} +1 -1
- package/site-dist/assets/changelog.md.RqcFias_.js +1 -0
- package/site-dist/assets/{changelog.md.CoelFFCL.lean.js → changelog.md.RqcFias_.lean.js} +1 -1
- package/site-dist/assets/chunks/@localSearchIndexroot.DQEikTmr.js +1 -0
- package/site-dist/assets/chunks/{VPLocalSearchBox.D3_9dRGY.js → VPLocalSearchBox.B54kK3Ge.js} +1 -1
- package/site-dist/assets/chunks/{theme.Bm8aLiLN.js → theme.BH3XHrL3.js} +2 -2
- package/site-dist/assets/{guide_getting-started.md.B4GJeoPz.js → guide_getting-started.md.Di4587Bu.js} +1 -1
- package/site-dist/assets/{guide_project.md.nGlTCo4D.js → guide_project.md.DnD2-Dsd.js} +3 -3
- package/site-dist/assets/{guide_project.md.nGlTCo4D.lean.js → guide_project.md.DnD2-Dsd.lean.js} +3 -3
- package/site-dist/assets/{guide_user.md.tiHFxIsQ.js → guide_user.md.Cenm9vlN.js} +1 -1
- package/site-dist/assets/{guide_user.md.tiHFxIsQ.lean.js → guide_user.md.Cenm9vlN.lean.js} +1 -1
- package/site-dist/assets/reference_contracts_cli-json.md.B7o8deSY.js +1 -0
- package/site-dist/assets/reference_contracts_cli-json.md.B7o8deSY.lean.js +1 -0
- package/site-dist/assets/reference_contracts_state.md.TRfzD5bc.js +1 -0
- package/site-dist/assets/{reference_contracts_state.md.5bNTC3ow.lean.js → reference_contracts_state.md.TRfzD5bc.lean.js} +1 -1
- package/site-dist/assets/{reference_contracts_usage-record.md._C0OXWeq.js → reference_contracts_usage-record.md.DBMNY4OP.js} +2 -2
- package/site-dist/assets/{reference_contracts_usage-record.md._C0OXWeq.lean.js → reference_contracts_usage-record.md.DBMNY4OP.lean.js} +2 -2
- package/site-dist/changelog.html +5 -5
- package/site-dist/guide/getting-started.html +5 -5
- package/site-dist/guide/how-it-works.html +4 -4
- package/site-dist/guide/index.html +4 -4
- package/site-dist/guide/install.html +4 -4
- package/site-dist/guide/maintainer.html +4 -4
- package/site-dist/guide/phases.html +4 -4
- package/site-dist/guide/project.html +6 -6
- package/site-dist/guide/user.html +5 -5
- package/site-dist/hashmap.json +1 -1
- package/site-dist/index.html +4 -4
- package/site-dist/reference/adr/0001-step-agents-under-origin-chat.html +4 -4
- package/site-dist/reference/adr/0002-no-directory-switch-in-chat.html +4 -4
- package/site-dist/reference/adr/0003-script-engine-not-hub.html +4 -4
- package/site-dist/reference/adr/0004-result-files.html +4 -4
- package/site-dist/reference/adr/0005-no-default-branch-local-commits-only.html +4 -4
- package/site-dist/reference/adr/0006-skill-install-targets.html +4 -4
- package/site-dist/reference/adr/0007-own-interview-skill.html +4 -4
- package/site-dist/reference/adr/0008-entries-do-not-call-entries.html +4 -4
- package/site-dist/reference/adr/0009-versioned-install-layout.html +4 -4
- package/site-dist/reference/adr/0010-generated-feature-overview.html +4 -4
- package/site-dist/reference/adr/0011-resume-after-completion.html +4 -4
- package/site-dist/reference/adr/0012-review-panel.html +4 -4
- package/site-dist/reference/adr/0013-no-release-tooling.html +4 -4
- package/site-dist/reference/adr/0014-notifier-slot.html +4 -4
- package/site-dist/reference/adr/0015-incremental-continue.html +4 -4
- package/site-dist/reference/adr/0016-upgrade-from-tags.html +4 -4
- package/site-dist/reference/adr/0017-use-paseo-capabilities.html +4 -4
- package/site-dist/reference/adr/0018-own-worktree-option.html +4 -4
- package/site-dist/reference/adr/0019-parallel-orchestration.html +4 -4
- package/site-dist/reference/adr/0020-scheduling-through-the-chat.html +4 -4
- package/site-dist/reference/adr/0021-npm-version-manager.html +4 -4
- package/site-dist/reference/adr/0022-develop-and-verify-phases.html +4 -4
- package/site-dist/reference/adr/0023-types-gate-slices.html +4 -4
- package/site-dist/reference/adr/0024-confirm-early-review-axes.html +4 -4
- package/site-dist/reference/adr/0025-joint-requirements.html +4 -4
- package/site-dist/reference/adr/0026-machine-records-and-api.html +4 -4
- package/site-dist/reference/adr/0027-paseo-plugin.html +4 -4
- package/site-dist/reference/adr/0028-external-integrations.html +4 -4
- package/site-dist/reference/adr/0029-requirements-from-cards.html +4 -4
- package/site-dist/reference/adr/0030-card-intake-process.html +4 -4
- package/site-dist/reference/adr/0031-fewer-interventions.html +4 -4
- package/site-dist/reference/adr/0032-npm-only-install.html +4 -4
- package/site-dist/reference/adr/0033-prototype-review-and-ui-check.html +4 -4
- package/site-dist/reference/adr/index.html +4 -4
- package/site-dist/reference/commands.html +4 -4
- package/site-dist/reference/config.html +4 -4
- package/site-dist/reference/contracts/cli-json.html +5 -5
- package/site-dist/reference/contracts/feature-files.html +4 -4
- package/site-dist/reference/contracts/index.html +4 -4
- package/site-dist/reference/contracts/notifier-event.html +4 -4
- package/site-dist/reference/contracts/result-file.html +4 -4
- package/site-dist/reference/contracts/spec.html +4 -4
- package/site-dist/reference/contracts/state.html +5 -5
- package/site-dist/reference/contracts/usage-record.html +6 -6
- package/site-dist/reference/contracts/verify.html +4 -4
- package/site-dist/reference/scope.html +4 -4
- package/paseo-plugin/client/review-link.tsx +0 -29
- package/site-dist/assets/changelog.md.CoelFFCL.js +0 -1
- package/site-dist/assets/chunks/@localSearchIndexroot.Hdq0-4L3.js +0 -1
- package/site-dist/assets/reference_contracts_cli-json.md.N-v2HNUd.js +0 -1
- package/site-dist/assets/reference_contracts_cli-json.md.N-v2HNUd.lean.js +0 -1
- package/site-dist/assets/reference_contracts_state.md.5bNTC3ow.js +0 -1
- /package/site-dist/assets/{guide_getting-started.md.B4GJeoPz.lean.js → guide_getting-started.md.Di4587Bu.lean.js} +0 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// "审查原型" (1.13): the prototype review page inside Paseo. On the web and desktop apps it is
|
|
2
|
+
// embedded in this screen; on phones (and as a fallback) it opens in the browser.
|
|
3
|
+
import type { PluginHostProps, PluginScreenProps } from "@getpaseo/plugin/client";
|
|
4
|
+
import { ExternalLink } from "@getpaseo/plugin/client/ui";
|
|
5
|
+
import { Text, View } from "react-native";
|
|
6
|
+
import { useReviewUrl } from "./data";
|
|
7
|
+
import { openReview } from "./nav";
|
|
8
|
+
import { Button, Status, useStyles } from "./ui";
|
|
9
|
+
import { canEmbedPages, embeddedPage } from "./web";
|
|
10
|
+
|
|
11
|
+
type Theme = PluginHostProps["theme"];
|
|
12
|
+
|
|
13
|
+
/** The button on a requirement with a prototype: primary while the design waits for confirmation. */
|
|
14
|
+
export function ReviewButton({ theme, repo, featureDir, title, waiting }: { theme: Theme; repo: string; featureDir: string; title: string; waiting: boolean }) {
|
|
15
|
+
return <Button theme={theme} primary={waiting} label={waiting ? "审查原型并确认方案" : "审查原型"} onPress={() => openReview({ repo, featureDir, title })} />;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function ReviewScreen({ theme, layout, params }: PluginScreenProps) {
|
|
19
|
+
const s = useStyles(theme, layout.compact);
|
|
20
|
+
const repo = params.repo ?? "";
|
|
21
|
+
const featureDir = params.featureDir ?? "";
|
|
22
|
+
const review = useReviewUrl(repo, featureDir, true);
|
|
23
|
+
if (!review.data) {
|
|
24
|
+
return (
|
|
25
|
+
<View style={[s.screen, { padding: 16 }]}>
|
|
26
|
+
<Status theme={theme} loading={review.isPending} error={review.error} />
|
|
27
|
+
</View>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
const { url, readOnly } = review.data;
|
|
31
|
+
const frame = canEmbedPages ? embeddedPage(url, `原型审查:${params.title ?? featureDir}`) : null;
|
|
32
|
+
return (
|
|
33
|
+
<View style={[s.screen, { gap: 6 }]}>
|
|
34
|
+
<View style={[s.row, { paddingHorizontal: 12, paddingTop: 8, justifyContent: "space-between" }]}>
|
|
35
|
+
<Text style={s.muted}>{readOnly ? "插件设为只读:可以看原型,不能提交意见或确认。" : "点原型上要改的地方提意见,双击文字直接改字;看完在右下角提交或确认方案。"}</Text>
|
|
36
|
+
<ExternalLink href={url}>在新窗口打开</ExternalLink>
|
|
37
|
+
</View>
|
|
38
|
+
{frame ?? (
|
|
39
|
+
<View style={[s.card, { margin: 12, gap: 8 }]}>
|
|
40
|
+
<Text style={s.text}>原型审查页在浏览器中打开效果最好(手机上屏幕较小,建议用电脑)。</Text>
|
|
41
|
+
<ExternalLink href={url}>打开原型审查页</ExternalLink>
|
|
42
|
+
</View>
|
|
43
|
+
)}
|
|
44
|
+
</View>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
@@ -7,6 +7,47 @@ import { useStats } from "./data";
|
|
|
7
7
|
import { minutes, tokens, TYPE_LABELS } from "./format";
|
|
8
8
|
import { Chip, Status, useStyles } from "./ui";
|
|
9
9
|
|
|
10
|
+
type Tokens = NonNullable<import("../shared/contracts").StatsSummary["tokens"]>;
|
|
11
|
+
|
|
12
|
+
const pct = (x: number) => `${Math.round(x * 100)}%`;
|
|
13
|
+
|
|
14
|
+
/** Where the tokens went (1.13): a bar per step and per model, and the share spent on rework. */
|
|
15
|
+
function TokenShare({ theme, compact, t }: { theme: import("@getpaseo/plugin/client").PluginHostProps["theme"]; compact: boolean; t: Tokens }) {
|
|
16
|
+
const s = useStyles(theme, compact);
|
|
17
|
+
const bar = (key: string, label: string, value: number, share: number, note: string) => (
|
|
18
|
+
<View key={key} style={{ gap: 2 }}>
|
|
19
|
+
<View style={[s.row, { justifyContent: "space-between", flexWrap: "nowrap" }]}>
|
|
20
|
+
<Text style={[s.text, { flexShrink: 1 }]}>{label}</Text>
|
|
21
|
+
<Text style={s.muted}>
|
|
22
|
+
{tokens(value)} · {pct(share)}
|
|
23
|
+
{note}
|
|
24
|
+
</Text>
|
|
25
|
+
</View>
|
|
26
|
+
<View style={{ height: 6, borderRadius: 3, backgroundColor: theme.colors.surface2, overflow: "hidden" }}>
|
|
27
|
+
<View style={{ width: `${Math.max(1, Math.round(share * 100))}%`, height: 6, backgroundColor: theme.colors.accent }} />
|
|
28
|
+
</View>
|
|
29
|
+
</View>
|
|
30
|
+
);
|
|
31
|
+
return (
|
|
32
|
+
<View style={[s.card, { gap: 10 }]}>
|
|
33
|
+
<Text style={s.heading}>token 花在哪</Text>
|
|
34
|
+
<Text style={s.text}>
|
|
35
|
+
合计 {tokens(t.total)} tokens
|
|
36
|
+
{t.rework ? `,其中返工(修订、修复、复验和第 2 轮起的评审)占 ${pct(t.rework.share)}` : ""}
|
|
37
|
+
{t.cachedShare !== null ? `;输入中 ${pct(t.cachedShare)} 来自提示缓存` : ""}
|
|
38
|
+
</Text>
|
|
39
|
+
{t.perRequirement.median !== null ? <Text style={s.muted}>每个完成的需求中位数 {tokens(t.perRequirement.median)}</Text> : null}
|
|
40
|
+
<View style={{ gap: 8 }}>{t.byStep.slice(0, 12).map((r) => bar(r.stepId, r.title, r.tokens, r.share, `(${r.steps} 次)`))}</View>
|
|
41
|
+
{t.byAgent.some((a) => a.agent !== "(未记录)") ? (
|
|
42
|
+
<>
|
|
43
|
+
<Text style={[s.text, { fontWeight: "600" }]}>按模型</Text>
|
|
44
|
+
<View style={{ gap: 8 }}>{t.byAgent.map((r) => bar(r.agent, r.agent, r.tokens, r.share, `(${r.steps} 步)`))}</View>
|
|
45
|
+
</>
|
|
46
|
+
) : null}
|
|
47
|
+
</View>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
10
51
|
function month(offset: number, now = new Date()): string {
|
|
11
52
|
const d = new Date(now.getFullYear(), now.getMonth() + offset, 1);
|
|
12
53
|
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}`;
|
|
@@ -50,6 +91,7 @@ export function StatsScreen({ theme, layout }: PluginScreenProps) {
|
|
|
50
91
|
{card("agent 合计用时", minutes(d.usage.agentMinutes), `输入 ${tokens(d.usage.inputTokens)},输出 ${tokens(d.usage.outputTokens)} tokens`)}
|
|
51
92
|
{d.usage.costUsd !== null ? card("费用", `$${d.usage.costUsd.toFixed(2)}`) : null}
|
|
52
93
|
</View>
|
|
94
|
+
{d.tokens?.total ? <TokenShare theme={theme} compact={layout.compact} t={d.tokens} /> : null}
|
|
53
95
|
{d.waits.length > 0 ? (
|
|
54
96
|
<View style={s.card}>
|
|
55
97
|
<Text style={s.heading}>等待</Text>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// The only file that uses web-only things (Paseo's rule for plugins): the prototype review page
|
|
2
|
+
// shown inside Paseo, in an iframe, on the web app and the desktop app. Phones get null and
|
|
3
|
+
// the screen offers a link instead.
|
|
4
|
+
import { createElement, type ReactElement } from "react";
|
|
5
|
+
import { Platform } from "react-native";
|
|
6
|
+
|
|
7
|
+
export const canEmbedPages = Platform.OS === "web";
|
|
8
|
+
|
|
9
|
+
export function embeddedPage(url: string, title: string): ReactElement | null {
|
|
10
|
+
if (Platform.OS !== "web") return null;
|
|
11
|
+
return createElement("iframe" as string, {
|
|
12
|
+
src: url,
|
|
13
|
+
title,
|
|
14
|
+
allow: "clipboard-read; clipboard-write",
|
|
15
|
+
style: { border: 0, width: "100%", height: "calc(100vh - 120px)", minHeight: 560, display: "block", background: "transparent" },
|
|
16
|
+
} as Record<string, unknown>);
|
|
17
|
+
}
|
|
@@ -2,7 +2,9 @@ import type { PluginClientContext, PluginScreenProps } from "@getpaseo/plugin/cl
|
|
|
2
2
|
import { ConfigScreen } from "./client/config";
|
|
3
3
|
import { RequirementScreen } from "./client/detail";
|
|
4
4
|
import { contributeLive } from "./client/live";
|
|
5
|
+
import { setScreenOpener } from "./client/nav";
|
|
5
6
|
import { OverviewScreen } from "./client/overview";
|
|
7
|
+
import { ReviewScreen } from "./client/review";
|
|
6
8
|
import { WorkspacePanel } from "./client/panel";
|
|
7
9
|
import { SettingsScreen } from "./client/settings";
|
|
8
10
|
import { RequirementsItem } from "./client/sidebar";
|
|
@@ -10,11 +12,13 @@ import { StatsScreen } from "./client/stats";
|
|
|
10
12
|
|
|
11
13
|
export default function contribute(client: PluginClientContext) {
|
|
12
14
|
const openScreen = (input: { screenId: string; params?: Record<string, string> }) => client.openScreen(input);
|
|
15
|
+
setScreenOpener(openScreen);
|
|
13
16
|
const Overview = (props: PluginScreenProps) => <OverviewScreen {...props} openScreen={openScreen} />;
|
|
14
17
|
|
|
15
18
|
client.addScreen({ id: "overview", title: "需求", Component: Overview });
|
|
16
19
|
client.addScreen({ id: "requirement", title: (params) => params.title || params.name || "需求", Component: RequirementScreen });
|
|
17
20
|
client.addScreen({ id: "stats", title: "需求统计", Component: StatsScreen });
|
|
21
|
+
client.addScreen({ id: "review", title: (params) => `审查原型:${params.title || params.featureDir?.split("/").pop() || ""}`, Component: ReviewScreen });
|
|
18
22
|
client.addScreen({ id: "config", title: "req-kit 配置", Component: ConfigScreen });
|
|
19
23
|
client.addSidebarHeaderItem({ id: "requirements", title: "需求(req-kit)", Component: RequirementsItem });
|
|
20
24
|
client.addWorkspacePanel({
|
|
@@ -39,7 +39,23 @@ export default function contribute(server: PluginServerContext) {
|
|
|
39
39
|
server.handle(configRpc, (input) => handlers.config(input));
|
|
40
40
|
server.handle(setAgentsRpc, (input) => handlers.setAgents(input));
|
|
41
41
|
server.handle(reviewUrlRpc, (input) => handlers.reviewUrl(input));
|
|
42
|
+
// 1.13: every few minutes, continue this machine's pipelines whose background process died
|
|
43
|
+
// (req api watchdog). Deterministic, no model involved; while it runs, pipelines do not ask
|
|
44
|
+
// their chats to check on them. Off when the plugin is read-only.
|
|
45
|
+
const check = async () => {
|
|
46
|
+
try {
|
|
47
|
+
await load();
|
|
48
|
+
if (readOnly) return;
|
|
49
|
+
await reqApi(kitHome)(["watchdog", "--by", "plugin"], { timeoutMs: 240_000 });
|
|
50
|
+
} catch {
|
|
51
|
+
// req-kit missing or a check failing: the next one tries again.
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const first = setTimeout(() => void check(), 60_000);
|
|
55
|
+
const timer = setInterval(() => void check(), 5 * 60_000);
|
|
42
56
|
return () => {
|
|
57
|
+
clearTimeout(first);
|
|
58
|
+
clearInterval(timer);
|
|
43
59
|
unsubscribe();
|
|
44
60
|
};
|
|
45
61
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { defineRpc, defineSettings } from "@getpaseo/plugin";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
|
|
6
|
-
export type Attention = "approval" | "business" | "interrupted" | "not_completed" | null;
|
|
6
|
+
export type Attention = "approval" | "business" | "permission" | "interrupted" | "not_completed" | null;
|
|
7
7
|
|
|
8
8
|
export interface Usage {
|
|
9
9
|
steps: number;
|
|
@@ -43,6 +43,8 @@ export interface Requirement {
|
|
|
43
43
|
reason: string | null;
|
|
44
44
|
card: { system: string; id: string; url: string | null; requester: string | null } | null;
|
|
45
45
|
canReply: boolean;
|
|
46
|
+
/** req-kit 1.13+, attention "permission": the step agent waiting for an approval. */
|
|
47
|
+
agentId?: string;
|
|
46
48
|
} | null;
|
|
47
49
|
}
|
|
48
50
|
|
|
@@ -74,6 +76,17 @@ export interface GateRun {
|
|
|
74
76
|
|
|
75
77
|
export interface RequirementDetail extends Requirement {
|
|
76
78
|
files: string[];
|
|
79
|
+
/** req-kit 1.13+: what to expect, from this machine's completed requirements of the same profile; null without enough history. */
|
|
80
|
+
estimate?: {
|
|
81
|
+
basis: number;
|
|
82
|
+
profile: string;
|
|
83
|
+
typicalAgentMinutes: number;
|
|
84
|
+
typicalTokens: number | null;
|
|
85
|
+
usedAgentMinutes: number;
|
|
86
|
+
usedTokens: number | null;
|
|
87
|
+
leftMinutes: number;
|
|
88
|
+
over: boolean;
|
|
89
|
+
} | null;
|
|
77
90
|
run: {
|
|
78
91
|
attempt: number;
|
|
79
92
|
startedAt: string;
|
|
@@ -104,6 +117,15 @@ export interface StatsSummary {
|
|
|
104
117
|
rework: { averageReviewRounds: number | null; withDefectRounds: number | null; gateRuns: number; gateFailed: number };
|
|
105
118
|
waits: Array<{ kind: string; label: string; requirements: number; averageMinutes: number }>;
|
|
106
119
|
usage: { agentMinutes: number; inputTokens: number | null; outputTokens: number | null; costUsd: number | null };
|
|
120
|
+
/** req-kit 1.13+: where the tokens went. */
|
|
121
|
+
tokens?: {
|
|
122
|
+
total: number | null;
|
|
123
|
+
cachedShare: number | null;
|
|
124
|
+
byStep: Array<{ stepId: string; title: string; steps: number; tokens: number; share: number }>;
|
|
125
|
+
byAgent: Array<{ agent: string; steps: number; tokens: number; share: number }>;
|
|
126
|
+
rework: { tokens: number; share: number } | null;
|
|
127
|
+
perRequirement: { median: number | null; byProfile: Array<{ profile: string; requirements: number; median: number | null }> };
|
|
128
|
+
};
|
|
107
129
|
}
|
|
108
130
|
|
|
109
131
|
export interface KitInfo {
|
package/site-dist/404.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<link rel="preload stylesheet" href="/assets/style.Dwsa4SMe.css" as="style">
|
|
10
10
|
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
|
|
11
11
|
|
|
12
|
-
<script type="module" src="/assets/app.
|
|
12
|
+
<script type="module" src="/assets/app.n_bkEV-X.js"></script>
|
|
13
13
|
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
|
14
14
|
<link rel="icon" type="image/svg+xml" href="/logo.svg">
|
|
15
15
|
<meta name="theme-color" content="#3f6fd8">
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
</head>
|
|
22
22
|
<body>
|
|
23
23
|
<div id="app"></div>
|
|
24
|
-
<script>window.__VP_HASH_MAP__=JSON.parse("{\"changelog.md\":\"
|
|
24
|
+
<script>window.__VP_HASH_MAP__=JSON.parse("{\"changelog.md\":\"RqcFias_\",\"guide_getting-started.md\":\"Di4587Bu\",\"guide_how-it-works.md\":\"D-kQsF1t\",\"guide_index.md\":\"CLnGCmGW\",\"guide_install.md\":\"DkCyZsOU\",\"guide_maintainer.md\":\"RZIzyCTV\",\"guide_phases.md\":\"BpGAb1re\",\"guide_project.md\":\"DnD2-Dsd\",\"guide_user.md\":\"Cenm9vlN\",\"index.md\":\"Cf_sSf_f\",\"reference_adr_0001-step-agents-under-origin-chat.md\":\"RtRTq7oi\",\"reference_adr_0002-no-directory-switch-in-chat.md\":\"BxtN-Aa2\",\"reference_adr_0003-script-engine-not-hub.md\":\"66EgZtqx\",\"reference_adr_0004-result-files.md\":\"DbqcCozI\",\"reference_adr_0005-no-default-branch-local-commits-only.md\":\"CkImA4s6\",\"reference_adr_0006-skill-install-targets.md\":\"CwY8YepV\",\"reference_adr_0007-own-interview-skill.md\":\"CryhxRyG\",\"reference_adr_0008-entries-do-not-call-entries.md\":\"DsRWAgeA\",\"reference_adr_0009-versioned-install-layout.md\":\"CSg1VqlW\",\"reference_adr_0010-generated-feature-overview.md\":\"D8F3MK-h\",\"reference_adr_0011-resume-after-completion.md\":\"BCrZrKjf\",\"reference_adr_0012-review-panel.md\":\"k9rrHFFc\",\"reference_adr_0013-no-release-tooling.md\":\"BQeJ8dEI\",\"reference_adr_0014-notifier-slot.md\":\"C23QR1xO\",\"reference_adr_0015-incremental-continue.md\":\"Buy7wwO8\",\"reference_adr_0016-upgrade-from-tags.md\":\"qfIW-tqJ\",\"reference_adr_0017-use-paseo-capabilities.md\":\"CjcGli87\",\"reference_adr_0018-own-worktree-option.md\":\"fVDpgGSE\",\"reference_adr_0019-parallel-orchestration.md\":\"DrfrV0To\",\"reference_adr_0020-scheduling-through-the-chat.md\":\"BqSemGFG\",\"reference_adr_0021-npm-version-manager.md\":\"CU3PG6y5\",\"reference_adr_0022-develop-and-verify-phases.md\":\"C6fQDLq4\",\"reference_adr_0023-types-gate-slices.md\":\"D2E6yyYQ\",\"reference_adr_0024-confirm-early-review-axes.md\":\"FmK_ke0x\",\"reference_adr_0025-joint-requirements.md\":\"ChoKvMUx\",\"reference_adr_0026-machine-records-and-api.md\":\"veybjBPq\",\"reference_adr_0027-paseo-plugin.md\":\"BMX33ZNU\",\"reference_adr_0028-external-integrations.md\":\"DtdMe8RK\",\"reference_adr_0029-requirements-from-cards.md\":\"BHd1SQPe\",\"reference_adr_0030-card-intake-process.md\":\"kLc-DG9_\",\"reference_adr_0031-fewer-interventions.md\":\"BDnQcz8g\",\"reference_adr_0032-npm-only-install.md\":\"C-3L1FkX\",\"reference_adr_0033-prototype-review-and-ui-check.md\":\"hFcQzmaa\",\"reference_adr_index.md\":\"BYF-Ofor\",\"reference_commands.md\":\"ClKbS-t8\",\"reference_config.md\":\"CRe27LaA\",\"reference_contracts_cli-json.md\":\"B7o8deSY\",\"reference_contracts_feature-files.md\":\"DSiA8OEH\",\"reference_contracts_index.md\":\"Bkznz4px\",\"reference_contracts_notifier-event.md\":\"CCfrkm_A\",\"reference_contracts_result-file.md\":\"DmR4fjB-\",\"reference_contracts_spec.md\":\"BwwS0L_j\",\"reference_contracts_state.md\":\"TRfzD5bc\",\"reference_contracts_usage-record.md\":\"DBMNY4OP\",\"reference_contracts_verify.md\":\"CbA88u6S\",\"reference_scope.md\":\"Kzqw8U_f\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"req-kit\",\"titleTemplate\":\":title · req-kit\",\"description\":\"在 Paseo 中用对话对齐需求,由一组 AI agent 在后台完成设计、实现、评审和验证。给测试、产品、项目经理用的需求开发体系。\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.svg\",\"siteTitle\":\"req-kit\",\"nav\":[{\"text\":\"指南\",\"link\":\"/guide/\",\"activeMatch\":\"^/guide/\"},{\"text\":\"参考\",\"link\":\"/reference/commands\",\"activeMatch\":\"^/reference/\"},{\"text\":\"更新记录\",\"link\":\"/changelog\"},{\"text\":\"v1.13.0-beta.4\",\"items\":[{\"text\":\"更新记录\",\"link\":\"/changelog\"},{\"text\":\"GitHub Releases\",\"link\":\"https://github.com/yiyisf/paseo-req-kit/releases\"},{\"text\":\"范围与取舍\",\"link\":\"/reference/scope\"}]}],\"sidebar\":{\"/guide/\":[{\"text\":\"开始\",\"items\":[{\"text\":\"req-kit 是什么\",\"link\":\"/guide/\"},{\"text\":\"快速开始\",\"link\":\"/guide/getting-started\"},{\"text\":\"工作原理\",\"link\":\"/guide/how-it-works\"}]},{\"text\":\"使用\",\"items\":[{\"text\":\"使用者指南\",\"link\":\"/guide/user\"},{\"text\":\"分阶段执行与提测\",\"link\":\"/guide/phases\"}]},{\"text\":\"安装与维护\",\"items\":[{\"text\":\"安装与升级\",\"link\":\"/guide/install\"},{\"text\":\"项目定制与运行规则\",\"link\":\"/guide/project\"},{\"text\":\"维护者指南\",\"link\":\"/guide/maintainer\"}]}],\"/reference/\":[{\"text\":\"参考\",\"items\":[{\"text\":\"命令\",\"link\":\"/reference/commands\"},{\"text\":\"配置项\",\"link\":\"/reference/config\"},{\"text\":\"范围与取舍\",\"link\":\"/reference/scope\"}]},{\"text\":\"文件格式约定\",\"collapsed\":false,\"items\":[{\"text\":\"总览\",\"link\":\"/reference/contracts/\"},{\"text\":\"需求说明 spec.md\",\"link\":\"/reference/contracts/spec\"},{\"text\":\"状态文件 state.json\",\"link\":\"/reference/contracts/state\"},{\"text\":\"结果文件\",\"link\":\"/reference/contracts/result-file\"},{\"text\":\"功能目录中的文件\",\"link\":\"/reference/contracts/feature-files\"},{\"text\":\"验证方法 verify.md\",\"link\":\"/reference/contracts/verify\"},{\"text\":\"外部通知事件\",\"link\":\"/reference/contracts/notifier-event\"},{\"text\":\"req api 的 JSON 输出\",\"link\":\"/reference/contracts/cli-json\"},{\"text\":\"需求索引与使用记录\",\"link\":\"/reference/contracts/usage-record\"}]},{\"text\":\"设计决定(ADR)\",\"collapsed\":true,\"items\":[{\"text\":\"总览\",\"link\":\"/reference/adr/\"},{\"text\":\"0001 步骤 agent 挂在发起的对话下\",\"link\":\"/reference/adr/0001-step-agents-under-origin-chat\"},{\"text\":\"0002 对话过程中不切换工作目录\",\"link\":\"/reference/adr/0002-no-directory-switch-in-chat\"},{\"text\":\"0003 第 3–11 步由脚本引擎驱动,不用 Hub 多步骤工作流\",\"link\":\"/reference/adr/0003-script-engine-not-hub\"},{\"text\":\"0004 步骤结论只看结果文件\",\"link\":\"/reference/adr/0004-result-files\"},{\"text\":\"0005 不在默认分支上运行,只做本地提交\",\"link\":\"/reference/adr/0005-no-default-branch-local-commits-only\"},{\"text\":\"0006 只安装到 ~/.agents/skills 和 ~/.claude/skills\",\"link\":\"/reference/adr/0006-skill-install-targets\"},{\"text\":\"0007 自带需求访谈 skill,不依赖外部 skill 包\",\"link\":\"/reference/adr/0007-own-interview-skill\"},{\"text\":\"0008 入口 skill 之间不互相调用\",\"link\":\"/reference/adr/0008-entries-do-not-call-entries\"},{\"text\":\"0009 程序与本机配置分开存放,按版本目录并存\",\"link\":\"/reference/adr/0009-versioned-install-layout\"},{\"text\":\"0010 需求总览现场生成,不维护 INDEX.md\",\"link\":\"/reference/adr/0010-generated-feature-overview\"},{\"text\":\"0011 完成后修改 spec 可以继续开发\",\"link\":\"/reference/adr/0011-resume-after-completion\"},{\"text\":\"0012 评审小组:首轮并行评审,评审者核实汇总\",\"link\":\"/reference/adr/0012-review-panel\"},{\"text\":\"0013 发布不使用 changesets 等工具\",\"link\":\"/reference/adr/0013-no-release-tooling\"},{\"text\":\"0014 外部通知只留接口,不内置任何 IM\",\"link\":\"/reference/adr/0014-notifier-slot\"},{\"text\":\"0015 需求变更后增量继续,而不是从零重做\",\"link\":\"/reference/adr/0015-incremental-continue\"},{\"text\":\"0016 一键升级:从 git 标签下载到 versions/ 再切换\",\"link\":\"/reference/adr/0016-upgrade-from-tags\"},{\"text\":\"0017 用好 Paseo 自身的能力:profile、工作区脚本、用量和时间线\",\"link\":\"/reference/adr/0017-use-paseo-capabilities\"},{\"text\":\"0018 可选:流水线为需求新建 worktree 工作区\",\"link\":\"/reference/adr/0018-own-worktree-option\"},{\"text\":\"0019 用 Paseo 的并行子 agent:确认前独立审阅、方案提案\",\"link\":\"/reference/adr/0019-parallel-orchestration\"},{\"text\":\"0020 调度:用 Paseo 定时任务把消息发回对话,排队在本机进行\",\"link\":\"/reference/adr/0020-scheduling-through-the-chat\"},{\"text\":\"0021 npm 分发:全局包是版本管理器,各版本仍装在 versions/ 下\",\"link\":\"/reference/adr/0021-npm-version-manager\"},{\"text\":\"0022 分阶段执行:研发阶段、闸口、测试验证阶段\",\"link\":\"/reference/adr/0022-develop-and-verify-phases\"},{\"text\":\"0023 需求类型、质量门、按切片实现\",\"link\":\"/reference/adr/0023-types-gate-slices\"},{\"text\":\"0024 让分歧更早暴露:验收例子、方案确认点、两个方向的评审、反复的问题变成规则\",\"link\":\"/reference/adr/0024-confirm-early-review-axes\"},{\"text\":\"0025 联合需求:一个需求同时改几个仓库\",\"link\":\"/reference/adr/0025-joint-requirements\"},{\"text\":\"0026 本机的需求索引、使用记录和 req api\",\"link\":\"/reference/adr/0026-machine-records-and-api\"},{\"text\":\"0027 Paseo 插件:随 req-kit 一起发布,只通过 req api 工作\",\"link\":\"/reference/adr/0027-paseo-plugin\"},{\"text\":\"0028 外部系统对接:命令写法在配置里,内容由 AI 整理,调用是确定的\",\"link\":\"/reference/adr/0028-external-integrations\"},{\"text\":\"0029 从卡片开始的需求:需求会话代替人,卡片描述代替对话\",\"link\":\"/reference/adr/0029-requirements-from-cards\"},{\"text\":\"0030 接单器:共享机器上定时接卡片、转达回复\",\"link\":\"/reference/adr/0030-card-intake-process\"},{\"text\":\"0031 少等人:每种中断都有自动的下一步\",\"link\":\"/reference/adr/0031-fewer-interventions\"},{\"text\":\"0032 安装、升级和文档只依赖 npm 源\",\"link\":\"/reference/adr/0032-npm-only-install\"},{\"text\":\"0033 原型审查页和不靠看图的界面检查\",\"link\":\"/reference/adr/0033-prototype-review-and-ui-check\"}]}]},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/yiyisf/paseo-req-kit\"}],\"editLink\":{\"pattern\":\"https://github.com/yiyisf/paseo-req-kit/edit/main/site/:path\",\"text\":\"在 GitHub 上编辑此页\"},\"footer\":{\"message\":\"以 MIT 许可发布。req-kit 是运行在 Paseo 上的社区项目。\",\"copyright\":\"Copyright © 2026 yiyisf\"},\"search\":{\"provider\":\"local\",\"options\":{\"translations\":{\"button\":{\"buttonText\":\"搜索文档\",\"buttonAriaLabel\":\"搜索文档\"},\"modal\":{\"noResultsText\":\"没有找到相关结果\",\"resetButtonTitle\":\"清除\",\"footer\":{\"selectText\":\"选择\",\"navigateText\":\"切换\",\"closeText\":\"关闭\"}}}}},\"outline\":{\"level\":[2,3],\"label\":\"本页内容\"},\"docFooter\":{\"prev\":\"上一页\",\"next\":\"下一页\"},\"lastUpdated\":{\"text\":\"最后更新\"},\"returnToTopLabel\":\"回到顶部\",\"sidebarMenuLabel\":\"目录\",\"darkModeSwitchLabel\":\"外观\",\"lightModeSwitchTitle\":\"切换到浅色\",\"darkModeSwitchTitle\":\"切换到深色\",\"externalLinkIcon\":true,\"notFound\":{\"title\":\"页面不存在\",\"quote\":\"这个页面可能已经移动或删除。\",\"linkText\":\"回到首页\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
|
|
25
25
|
|
|
26
26
|
</body>
|
|
27
27
|
</html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{R as p}from"./chunks/theme.
|
|
1
|
+
import{R as p}from"./chunks/theme.BH3XHrL3.js";import{R as s,a4 as i,a5 as u,a6 as c,a7 as l,a8 as f,a9 as d,aa as m,ab as h,ac as g,ad as A,d as v,u as R,v as w,s as y,ae as C,af as P,ag as b,a2 as E}from"./chunks/framework.B9qR_F1m.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=R();return w(()=>{y(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),P(),b(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
|