agentplugged 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE-METHOD +21 -0
- package/README.md +240 -16
- package/dist/agent-commands.js +46532 -0
- package/dist/bin.js +13 -0
- package/dist/cli.js +44 -0
- package/dist/esm.js +920 -0
- package/dist/forge-follow.js +231 -0
- package/dist/helpers.js +18526 -0
- package/dist/helpers2.js +1 -0
- package/dist/launcher-env.js +13 -0
- package/dist/launcher.js +308 -0
- package/dist/libsodium-wrappers.js +4384 -0
- package/dist/libsodium-wrappers2.js +4384 -0
- package/dist/main.js +17732 -0
- package/dist/method/LICENSE +21 -0
- package/dist/method/agents/alex/SKILL.md +87 -0
- package/dist/method/agents/alex/agent.yaml +94 -0
- package/dist/method/agents/chloe/SKILL.md +97 -0
- package/dist/method/agents/chloe/agent.yaml +87 -0
- package/dist/method/agents/ethan/SKILL.md +55 -0
- package/dist/method/agents/ethan/agent.yaml +94 -0
- package/dist/method/agents/hugo/SKILL.md +52 -0
- package/dist/method/agents/hugo/agent.yaml +93 -0
- package/dist/method/agents/iris/SKILL.md +69 -0
- package/dist/method/agents/iris/agent.yaml +86 -0
- package/dist/method/agents/izzy/SKILL.md +137 -0
- package/dist/method/agents/izzy/agent.yaml +104 -0
- package/dist/method/agents/jade/SKILL.md +54 -0
- package/dist/method/agents/jade/agent.yaml +94 -0
- package/dist/method/agents/julien/SKILL.md +96 -0
- package/dist/method/agents/julien/agent.yaml +95 -0
- package/dist/method/agents/lina/SKILL.md +54 -0
- package/dist/method/agents/lina/agent.yaml +94 -0
- package/dist/method/agents/lou/SKILL.md +67 -0
- package/dist/method/agents/lou/agent.yaml +84 -0
- package/dist/method/agents/maya/SKILL.md +82 -0
- package/dist/method/agents/maya/agent.yaml +98 -0
- package/dist/method/agents/milo/SKILL.md +79 -0
- package/dist/method/agents/milo/agent.yaml +80 -0
- package/dist/method/agents/noah/SKILL.md +80 -0
- package/dist/method/agents/noah/agent.yaml +73 -0
- package/dist/method/agents/noah/references/conduct.md +98 -0
- package/dist/method/agents/noah/references/decisions.md +122 -0
- package/dist/method/agents/noah/references/environment.md +72 -0
- package/dist/method/agents/noah/references/facts.md +13 -0
- package/dist/method/agents/noah/references/journey.md +80 -0
- package/dist/method/agents/noah/references/team.md +195 -0
- package/dist/method/agents/omar/SKILL.md +92 -0
- package/dist/method/agents/omar/agent.yaml +86 -0
- package/dist/method/agents/quentin/SKILL.md +78 -0
- package/dist/method/agents/quentin/agent.yaml +82 -0
- package/dist/method/agents/sam/SKILL.md +54 -0
- package/dist/method/agents/sam/agent.yaml +94 -0
- package/dist/method/agents/stella/SKILL.md +80 -0
- package/dist/method/agents/stella/agent.yaml +89 -0
- package/dist/method/agents/tess/SKILL.md +64 -0
- package/dist/method/agents/tess/agent.yaml +94 -0
- package/dist/method/agents/zoe/SKILL.md +85 -0
- package/dist/method/agents/zoe/agent.yaml +91 -0
- package/dist/method/doctor.yaml +1029 -0
- package/dist/method/models.yaml +73 -0
- package/dist/method/skills/.gitkeep +0 -0
- package/dist/method/skills/acceptance-qa/SKILL.md +40 -0
- package/dist/method/skills/acceptance-qa/references/run.md +54 -0
- package/dist/method/skills/acceptance-qa/references/scenarios.md +32 -0
- package/dist/method/skills/acceptance-qa/references/verdicts.md +43 -0
- package/dist/method/skills/api-e2e-tests/SKILL.md +61 -0
- package/dist/method/skills/api-e2e-tests/references/ci.md +33 -0
- package/dist/method/skills/api-e2e-tests/references/frameworks.md +58 -0
- package/dist/method/skills/api-e2e-tests/references/generate.md +67 -0
- package/dist/method/skills/audit-pillars/SKILL.md +28 -0
- package/dist/method/skills/audit-pillars/references/accessibility.md +13 -0
- package/dist/method/skills/audit-pillars/references/architecture.md +13 -0
- package/dist/method/skills/audit-pillars/references/dependencies.md +13 -0
- package/dist/method/skills/audit-pillars/references/format.md +20 -0
- package/dist/method/skills/audit-pillars/references/interface.md +13 -0
- package/dist/method/skills/audit-pillars/references/method.md +33 -0
- package/dist/method/skills/audit-pillars/references/performance.md +17 -0
- package/dist/method/skills/audit-pillars/references/quality.md +11 -0
- package/dist/method/skills/audit-pillars/references/security.md +13 -0
- package/dist/method/skills/audit-pillars/references/tests.md +17 -0
- package/dist/method/skills/chain-stories/SKILL.md +30 -0
- package/dist/method/skills/chain-stories/references/attempts.md +19 -0
- package/dist/method/skills/chain-stories/references/stops.md +27 -0
- package/dist/method/skills/check-readiness/SKILL.md +34 -0
- package/dist/method/skills/check-readiness/references/judge.md +21 -0
- package/dist/method/skills/check-readiness/references/settle.md +17 -0
- package/dist/method/skills/check-requirements/SKILL.md +97 -0
- package/dist/method/skills/check-requirements/references/engine-proofs.md +43 -0
- package/dist/method/skills/check-requirements/references/proofs-and-gaps.md +45 -0
- package/dist/method/skills/correct-course/SKILL.md +15 -0
- package/dist/method/skills/correct-course/references/gestures.md +20 -0
- package/dist/method/skills/correct-course/references/starts.md +18 -0
- package/dist/method/skills/correct-course/references/steps.md +14 -0
- package/dist/method/skills/critique-deliverable/SKILL.md +25 -0
- package/dist/method/skills/critique-deliverable/references/assumption-audit.md +11 -0
- package/dist/method/skills/critique-deliverable/references/choose.md +27 -0
- package/dist/method/skills/critique-deliverable/references/compare-existing.md +13 -0
- package/dist/method/skills/critique-deliverable/references/devils-advocate.md +13 -0
- package/dist/method/skills/critique-deliverable/references/divergence.md +15 -0
- package/dist/method/skills/critique-deliverable/references/domain-expert.md +14 -0
- package/dist/method/skills/critique-deliverable/references/extreme-user.md +13 -0
- package/dist/method/skills/critique-deliverable/references/failure-modes.md +13 -0
- package/dist/method/skills/critique-deliverable/references/first-principles.md +12 -0
- package/dist/method/skills/critique-deliverable/references/format.md +25 -0
- package/dist/method/skills/critique-deliverable/references/gestures.md +24 -0
- package/dist/method/skills/critique-deliverable/references/inversion.md +13 -0
- package/dist/method/skills/critique-deliverable/references/judgment.md +14 -0
- package/dist/method/skills/critique-deliverable/references/pre-mortem.md +12 -0
- package/dist/method/skills/critique-deliverable/references/reconcile.md +15 -0
- package/dist/method/skills/critique-deliverable/references/red-team.md +12 -0
- package/dist/method/skills/critique-deliverable/references/reframe.md +12 -0
- package/dist/method/skills/critique-deliverable/references/second-order.md +12 -0
- package/dist/method/skills/critique-deliverable/references/socratic.md +15 -0
- package/dist/method/skills/critique-deliverable/references/steelman.md +13 -0
- package/dist/method/skills/critique-deliverable/references/subtraction.md +12 -0
- package/dist/method/skills/deep-research/SKILL.md +43 -0
- package/dist/method/skills/deep-research/assets/page-template.md +37 -0
- package/dist/method/skills/deep-research/references/candidates.md +29 -0
- package/dist/method/skills/deep-research/references/external.md +37 -0
- package/dist/method/skills/deep-research/references/page-format.md +51 -0
- package/dist/method/skills/deep-research/references/types.md +31 -0
- package/dist/method/skills/develop-story/SKILL.md +211 -0
- package/dist/method/skills/develop-story/evals/cases.yaml +45 -0
- package/dist/method/skills/develop-story/references/acceptance-tests.md +73 -0
- package/dist/method/skills/develop-story/references/self-check.md +46 -0
- package/dist/method/skills/diagnose-bug/SKILL.md +73 -0
- package/dist/method/skills/diagnose-bug/references/hypotheses.md +45 -0
- package/dist/method/skills/diagnose-bug/references/probes.md +40 -0
- package/dist/method/skills/generate-knowledge-base/SKILL.md +251 -0
- package/dist/method/skills/generate-knowledge-base/assets/guide-template.md +49 -0
- package/dist/method/skills/generate-knowledge-base/assets/index-template.md +58 -0
- package/dist/method/skills/generate-knowledge-base/assets/page-template.md +61 -0
- package/dist/method/skills/generate-knowledge-base/assets/release-notes-template.md +38 -0
- package/dist/method/skills/generate-knowledge-base/references/kb-checklist.md +49 -0
- package/dist/method/skills/generate-knowledge-base/references/living-docs.md +81 -0
- package/dist/method/skills/generate-knowledge-base/references/repository-scan.md +48 -0
- package/dist/method/skills/generate-knowledge-base/references/reuse-map.md +21 -0
- package/dist/method/skills/ideation/SKILL.md +44 -0
- package/dist/method/skills/ideation/assets/session-template.md +46 -0
- package/dist/method/skills/ideation/references/choose.md +21 -0
- package/dist/method/skills/ideation/references/close.md +17 -0
- package/dist/method/skills/ideation/references/converge.md +24 -0
- package/dist/method/skills/ideation/references/gestures.md +15 -0
- package/dist/method/skills/ideation/references/stances.md +21 -0
- package/dist/method/skills/ideation/references/techniques-borrowed.md +8 -0
- package/dist/method/skills/ideation/references/techniques-deep.md +12 -0
- package/dist/method/skills/ideation/references/techniques-frames.md +12 -0
- package/dist/method/skills/ideation/references/techniques-futures.md +8 -0
- package/dist/method/skills/ideation/references/techniques-limits.md +9 -0
- package/dist/method/skills/ideation/references/techniques-people.md +7 -0
- package/dist/method/skills/ideation/references/techniques-sparks.md +10 -0
- package/dist/method/skills/ideation/references/techniques-together.md +11 -0
- package/dist/method/skills/improve-code/SKILL.md +74 -0
- package/dist/method/skills/improve-code/references/axes.md +45 -0
- package/dist/method/skills/improve-session/SKILL.md +47 -0
- package/dist/method/skills/order-merges/SKILL.md +71 -0
- package/dist/method/skills/pitch/SKILL.md +40 -0
- package/dist/method/skills/pitch/assets/deck-template.md +31 -0
- package/dist/method/skills/pitch/assets/design-template.md +45 -0
- package/dist/method/skills/pitch/assets/narrative-template.md +40 -0
- package/dist/method/skills/pitch/references/deck-types.md +17 -0
- package/dist/method/skills/pitch/references/deck.md +24 -0
- package/dist/method/skills/pitch/references/design-implementation.md +25 -0
- package/dist/method/skills/pitch/references/design-methods.md +45 -0
- package/dist/method/skills/pitch/references/design-thinking.md +28 -0
- package/dist/method/skills/pitch/references/story-frameworks.md +39 -0
- package/dist/method/skills/pitch/references/story.md +22 -0
- package/dist/method/skills/plan-sprint/SKILL.md +162 -0
- package/dist/method/skills/quick-lane/SKILL.md +143 -0
- package/dist/method/skills/resolve-merge-conflict/SKILL.md +83 -0
- package/dist/method/skills/review-story/SKILL.md +96 -0
- package/dist/method/skills/review-story/evals/cases.yaml +59 -0
- package/dist/method/skills/review-story/references/amend-story.md +16 -0
- package/dist/method/skills/review-story/references/export.md +20 -0
- package/dist/method/skills/review-story/references/format.md +33 -0
- package/dist/method/skills/review-story/references/free-review.md +22 -0
- package/dist/method/skills/review-story/references/judge.md +44 -0
- package/dist/method/skills/review-story/references/lens-adversarial.md +15 -0
- package/dist/method/skills/review-story/references/lens-edge-cases.md +24 -0
- package/dist/method/skills/review-story/references/lens-prose.md +11 -0
- package/dist/method/skills/review-story/references/lens-relevance.md +13 -0
- package/dist/method/skills/review-story/references/lens-security.md +10 -0
- package/dist/method/skills/review-story/references/lens-structure.md +16 -0
- package/dist/method/skills/review-story/references/lens-verification-gaps.md +13 -0
- package/dist/method/skills/review-story/references/pass-assertions.md +17 -0
- package/dist/method/skills/review-story/references/pass-removals.md +13 -0
- package/dist/method/skills/review-tests/SKILL.md +32 -0
- package/dist/method/skills/review-tests/references/check.md +25 -0
- package/dist/method/skills/review-tests/references/grid.md +27 -0
- package/dist/method/skills/round-table/SKILL.md +31 -0
- package/dist/method/skills/round-table/evals/cases.yaml +27 -0
- package/dist/method/skills/round-table/references/cast.md +14 -0
- package/dist/method/skills/round-table/references/gestures.md +24 -0
- package/dist/method/skills/round-table/references/guests.md +17 -0
- package/dist/method/skills/round-table/references/independence.md +21 -0
- package/dist/method/skills/round-table/references/rooms.md +29 -0
- package/dist/method/skills/round-table/references/three-views.md +17 -0
- package/dist/method/skills/round-table/references/turns.md +19 -0
- package/dist/method/skills/run-retrospective/SKILL.md +201 -0
- package/dist/method/skills/security-review-architecture/SKILL.md +129 -0
- package/dist/method/skills/security-review-architecture/assets/architecture-review-template.md +47 -0
- package/dist/method/skills/security-review-architecture/references/spec-review.md +48 -0
- package/dist/method/skills/setup-ci/SKILL.md +121 -0
- package/dist/method/skills/setup-ci/assets/github-actions.yml +52 -0
- package/dist/method/skills/setup-ci/assets/gitlab-ci.yml +34 -0
- package/dist/method/skills/split-into-stories/SKILL.md +205 -0
- package/dist/method/skills/split-into-stories/assets/epic.md.tmpl +31 -0
- package/dist/method/skills/split-into-stories/assets/story.md.tmpl +36 -0
- package/dist/method/skills/strategy/SKILL.md +44 -0
- package/dist/method/skills/strategy/assets/innovation-template.md +60 -0
- package/dist/method/skills/strategy/assets/problem-template.md +54 -0
- package/dist/method/skills/strategy/references/costs.md +28 -0
- package/dist/method/skills/strategy/references/gestures.md +24 -0
- package/dist/method/skills/strategy/references/innovate-frameworks.md +48 -0
- package/dist/method/skills/strategy/references/innovate.md +40 -0
- package/dist/method/skills/strategy/references/solve-methods.md +45 -0
- package/dist/method/skills/strategy/references/solve.md +35 -0
- package/dist/method/skills/test-idea/SKILL.md +29 -0
- package/dist/method/skills/test-idea/assets/forge-template.md +27 -0
- package/dist/method/skills/test-idea/assets/prfaq-template.md +33 -0
- package/dist/method/skills/test-idea/references/bets.md +14 -0
- package/dist/method/skills/test-idea/references/concept.md +24 -0
- package/dist/method/skills/test-idea/references/faq.md +34 -0
- package/dist/method/skills/test-idea/references/forge.md +36 -0
- package/dist/method/skills/test-idea/references/personas.md +23 -0
- package/dist/method/skills/test-idea/references/prfaq.md +33 -0
- package/dist/method/skills/test-idea/references/verdict.md +26 -0
- package/dist/method/skills/workshop/SKILL.md +40 -0
- package/dist/method/skills/workshop/references/analyze.md +36 -0
- package/dist/method/skills/workshop/references/create.md +45 -0
- package/dist/method/skills/workshop/references/customize.md +45 -0
- package/dist/method/skills/workshop/references/evaluate.md +44 -0
- package/dist/method/skills/workshop/references/rules.md +35 -0
- package/dist/method/skills/write-architecture/SKILL.md +233 -0
- package/dist/method/skills/write-architecture/assets/architecture-template.md +110 -0
- package/dist/method/skills/write-architecture/references/guard.md +40 -0
- package/dist/method/skills/write-architecture/references/self-check.md +47 -0
- package/dist/method/skills/write-brand/SKILL.md +36 -0
- package/dist/method/skills/write-brand/assets/brand-template.md +59 -0
- package/dist/method/skills/write-brand/assets/identity-page.html +141 -0
- package/dist/method/skills/write-brand/assets/identity-template.md +132 -0
- package/dist/method/skills/write-brand/references/identity.md +38 -0
- package/dist/method/skills/write-brand/references/platform.md +29 -0
- package/dist/method/skills/write-brand/references/rules.md +43 -0
- package/dist/method/skills/write-brief/SKILL.md +171 -0
- package/dist/method/skills/write-brief/assets/brief-template.md +87 -0
- package/dist/method/skills/write-brief/assets/research-note-template.md +43 -0
- package/dist/method/skills/write-brief/references/brief-checklist.md +37 -0
- package/dist/method/skills/write-content/SKILL.md +233 -0
- package/dist/method/skills/write-content/assets/campaign-template.md +94 -0
- package/dist/method/skills/write-content/assets/content-template.md +76 -0
- package/dist/method/skills/write-content/references/content-checklist.md +67 -0
- package/dist/method/skills/write-positioning/SKILL.md +218 -0
- package/dist/method/skills/write-positioning/assets/page-template.md +85 -0
- package/dist/method/skills/write-positioning/assets/positioning-template.md +79 -0
- package/dist/method/skills/write-positioning/references/positioning-checklist.md +44 -0
- package/dist/method/skills/write-positioning/references/seo-checklist.md +62 -0
- package/dist/method/skills/write-prd/SKILL.md +204 -0
- package/dist/method/skills/write-prd/assets/prd-template.md +121 -0
- package/dist/method/skills/write-prd/evals/cases.yaml +46 -0
- package/dist/method/skills/write-prd/references/prd-checklist.md +68 -0
- package/dist/method/skills/write-sales/SKILL.md +236 -0
- package/dist/method/skills/write-sales/assets/offer-template.md +93 -0
- package/dist/method/skills/write-sales/assets/sequence-template.md +110 -0
- package/dist/method/skills/write-sales/references/before-you-send.md +54 -0
- package/dist/method/skills/write-sales/references/sales-checklist.md +71 -0
- package/dist/method/skills/write-spec/SKILL.md +25 -0
- package/dist/method/skills/write-spec/assets/spec-template.md +59 -0
- package/dist/method/skills/write-spec/references/spec-guide.md +47 -0
- package/dist/method/skills/write-ux-spec/SKILL.md +191 -0
- package/dist/method/skills/write-ux-spec/assets/mockup-page.html +36 -0
- package/dist/method/skills/write-ux-spec/assets/ux-template.md +206 -0
- package/dist/method/skills/write-ux-spec/references/accessibility-check.md +74 -0
- package/dist/method/skills/write-ux-spec/references/mockups.md +71 -0
- package/dist/method/skills/write-ux-spec/references/tokens-and-sketches.md +83 -0
- package/dist/method/skills/write-ux-spec/references/ux-checklist.md +74 -0
- package/dist/product-root.js +21527 -0
- package/dist/rolldown-runtime.js +38 -0
- package/dist/webauthn-verify.js +1 -0
- package/dist/webauthn-verify2.js +107 -0
- package/dist/webauthn.js +9798 -0
- package/package.json +56 -14
- package/bin.mjs +0 -228
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { hr as CHECKPOINT_CLOSED_EVENT_TYPES, in as MERGE_EVENT_TYPES, pi as CHECKPOINT_EVENT_TYPES } from "./webauthn.js";
|
|
2
|
+
import { $s as storyReviewDone, Bl as loadMethodConfig, Du as checkpointPayload, Ku as METHOD_CONFIG_PATH, Mt as storyWeight, Ou as truncate, Sl as storiesIn, c as project, ds as settledPoints, fr as targetBranch, gu as isSkipped, ln as resolvePullRequestSettings, lr as deliveryRemote, vc as forgeRepositoryOf, wr as storyFiles, xt as removeMergedWorktree, yc as isRepositoryPullRequest } from "./agent-commands.js";
|
|
3
|
+
//#region ../../packages/core/dist/journey/merge-point.js
|
|
4
|
+
/** True when a merge point was opened for the story since it went to review (open, or answered). */
|
|
5
|
+
function openedSince(checkpoints, id, since) {
|
|
6
|
+
const from = Date.parse(since);
|
|
7
|
+
return checkpoints.some((checkpoint) => checkpoint.type === "story" && checkpoint.source === "merge" && checkpoint.story === id && !(Date.parse(checkpoint.opened_at) < from));
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The stories in review that the engine opens a merge point for: the review skipped, or (a security
|
|
11
|
+
* review the creator skipped while the quality review was in) the review closed by that skip, and no
|
|
12
|
+
* merge point opened since the story went to review.
|
|
13
|
+
*/
|
|
14
|
+
function dueMergePoints(state) {
|
|
15
|
+
const stories = state.stories ?? {};
|
|
16
|
+
const checkpoints = Object.values(state.checkpoints ?? {});
|
|
17
|
+
const due = [];
|
|
18
|
+
for (const [id, story] of Object.entries(stories)) {
|
|
19
|
+
if (story.started === void 0 || story.merged !== void 0) continue;
|
|
20
|
+
if (story.status !== "in_review" || story.status_by === null) continue;
|
|
21
|
+
const reviewSkipped = isSkipped(state, "story_review", id);
|
|
22
|
+
const securitySkipped = isSkipped(state, "story_security", id);
|
|
23
|
+
const ciSkipped = isSkipped(state, "story_ci", id);
|
|
24
|
+
if (!reviewSkipped && !(securitySkipped && storyReviewDone(story, void 0, ciSkipped))) continue;
|
|
25
|
+
if (openedSince(checkpoints, id, story.status_by.at)) continue;
|
|
26
|
+
due.push({
|
|
27
|
+
story: id,
|
|
28
|
+
skipped: [...reviewSkipped ? ["review"] : securitySkipped ? ["security"] : [], ...ciSkipped ? ["ci"] : []]
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return due.sort((a, b) => a.story < b.story ? -1 : a.story > b.story ? 1 : 0);
|
|
32
|
+
}
|
|
33
|
+
/** What each skipped check is called in the creator's question. */
|
|
34
|
+
const WORDS = {
|
|
35
|
+
review: "its independent review",
|
|
36
|
+
security: "its security review",
|
|
37
|
+
ci: "its CI"
|
|
38
|
+
};
|
|
39
|
+
/** The merge checkpoint the engine opens for such a story (source `merge`, a medium risk). */
|
|
40
|
+
function skippedMergeCheckpoint(point) {
|
|
41
|
+
const what = point.skipped.map((entry) => WORDS[entry] ?? entry).join(" and ");
|
|
42
|
+
return {
|
|
43
|
+
...checkpointPayload({
|
|
44
|
+
type: "story",
|
|
45
|
+
risk: "medium",
|
|
46
|
+
title: truncate(`Merge story ${point.story}`, 120),
|
|
47
|
+
summary: truncate(`You skipped ${what} for story ${point.story}: it is ready to merge as it stands. Approve and the engine merges its pull request into the main branch with your forge's tool, then removes its worktree (a git revert of the merge undoes it); ask for changes to send it back to its developer with your note.`, 2e3)
|
|
48
|
+
}),
|
|
49
|
+
source: "merge"
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region ../../packages/core/dist/merge/forge-follow.js
|
|
54
|
+
/**
|
|
55
|
+
* The engine follows the forge. What the creator does on GitHub or GitLab is their own
|
|
56
|
+
* gesture, never one to "regularise": a pull request merged by hand is recorded as the creator's
|
|
57
|
+
* merge (`story.merged`, source `forge`, with the account, the date and the commit the forge gives),
|
|
58
|
+
* the story is done, and the points that waited for it are closed. The points whose object is
|
|
59
|
+
* settled (a story merged, a review done again, a request replaced) are closed by the engine with
|
|
60
|
+
* their reason (`checkpoint.closed`), so that none is ever shown to the creator.
|
|
61
|
+
*
|
|
62
|
+
* Read at `next`, `get_state` and `check_ci`. Best effort: it never throws, never asks anything,
|
|
63
|
+
* and a forge that cannot be reached leaves things as they are.
|
|
64
|
+
*/
|
|
65
|
+
const DEFAULT_THROTTLE_MS = 2e4;
|
|
66
|
+
/** When the forge was last read, by journal (the journal object stands for the product here). */
|
|
67
|
+
const lastRead = /* @__PURE__ */ new WeakMap();
|
|
68
|
+
/** The stories whose pull request the forge may have merged: started, not merged, with one. */
|
|
69
|
+
function followable(state) {
|
|
70
|
+
return Object.entries(storiesIn(state)).filter(([, story]) => story.started !== void 0 && story.merged === void 0 && story.pull_request !== void 0);
|
|
71
|
+
}
|
|
72
|
+
/** The `story.merged` payload of a pull request the forge shows merged, or undefined. */
|
|
73
|
+
async function forgeMerge(context, config, state, id, story) {
|
|
74
|
+
const forge = context.storyForge;
|
|
75
|
+
const started = story.started;
|
|
76
|
+
const pr = story.pull_request;
|
|
77
|
+
if (forge?.pullRequest === void 0 || started === void 0 || pr === void 0) return;
|
|
78
|
+
const inspection = await forge.inspect(started.branch, started.base);
|
|
79
|
+
if (!inspection.repository) return void 0;
|
|
80
|
+
const remote = deliveryRemote(inspection.remotes, started.base_ref);
|
|
81
|
+
if (remote === void 0) return void 0;
|
|
82
|
+
const located = forgeRepositoryOf(remote.url);
|
|
83
|
+
if (!("forge" in located) || located.forge !== pr.forge) return void 0;
|
|
84
|
+
if (!isRepositoryPullRequest(located, pr.url, pr.number)) return void 0;
|
|
85
|
+
const current = await forge.pullRequest(located, pr.number);
|
|
86
|
+
if (current.state !== "merged") return void 0;
|
|
87
|
+
if (current.base !== void 0 && current.base !== null && current.base !== targetBranch(started.base_ref, inspection.remotes)) return;
|
|
88
|
+
const commit = current.head ?? pr.head;
|
|
89
|
+
const settings = await resolvePullRequestSettings(config, context.mainBranch);
|
|
90
|
+
const files = await storyFiles(context, started, commit).catch(() => void 0);
|
|
91
|
+
const weight = await storyWeight(context, files?.diff, commit);
|
|
92
|
+
const checkpoints = state.checkpoints ?? {};
|
|
93
|
+
const open = Object.values(checkpoints).find((checkpoint) => checkpoint.story === id && checkpoint.source === "merge" && checkpoint.status === "open");
|
|
94
|
+
return {
|
|
95
|
+
...open === void 0 ? {} : { checkpoint: open.id },
|
|
96
|
+
forge: pr.forge,
|
|
97
|
+
pr: pr.number,
|
|
98
|
+
url: pr.url,
|
|
99
|
+
commit,
|
|
100
|
+
...current.merge_commit === null ? {} : { merge_commit: current.merge_commit },
|
|
101
|
+
method: settings.merge_method,
|
|
102
|
+
files: files?.files ?? [],
|
|
103
|
+
...files?.truncated === true ? { files_truncated: true } : {},
|
|
104
|
+
...weight === void 0 ? {} : { weight },
|
|
105
|
+
source: "forge",
|
|
106
|
+
already: true,
|
|
107
|
+
merged_by: current.merged_by ?? "forge",
|
|
108
|
+
merged_at: current.merged_at ?? new Date((context.now ?? Date.now)()).toISOString()
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The stories whose working copy is gone from the disk, among those a permission point still open
|
|
113
|
+
* is about: started, not merged, no folder checked out and nothing at the expected
|
|
114
|
+
* place. Only the disk of this machine says so, so the engine reads it here; a repository it cannot
|
|
115
|
+
* read leaves every story as it is (never a point closed on a doubt).
|
|
116
|
+
*/
|
|
117
|
+
async function goneWorktrees(context, state) {
|
|
118
|
+
const workspace = context.storyWorkspace;
|
|
119
|
+
const gone = /* @__PURE__ */ new Set();
|
|
120
|
+
if (workspace === void 0) return gone;
|
|
121
|
+
const stories = storiesIn(state);
|
|
122
|
+
const checkpoints = state.checkpoints ?? {};
|
|
123
|
+
const asked = /* @__PURE__ */ new Set();
|
|
124
|
+
for (const checkpoint of Object.values(checkpoints)) if (checkpoint.status === "open" && checkpoint.type === "permission" && checkpoint.story !== null) asked.add(checkpoint.story);
|
|
125
|
+
for (const id of asked) {
|
|
126
|
+
const started = Object.hasOwn(stories, id) ? stories[id]?.started : void 0;
|
|
127
|
+
if (started === void 0 || stories[id]?.merged !== void 0) continue;
|
|
128
|
+
try {
|
|
129
|
+
const seen = await workspace.inspect({
|
|
130
|
+
id,
|
|
131
|
+
branch: started.branch,
|
|
132
|
+
path: ""
|
|
133
|
+
});
|
|
134
|
+
if (seen.repository && seen.branch !== null && seen.checkedOut === null && !seen.target.exists) gone.add(id);
|
|
135
|
+
} catch {}
|
|
136
|
+
}
|
|
137
|
+
return gone;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Reads the forge and the journal, and writes what follows: the merges the creator did on the forge,
|
|
141
|
+
* then the closing of the points whose object is settled. Returns how many events it wrote (0 when
|
|
142
|
+
* nothing changed or anything went wrong). `force` reads the forge even if it was read a moment ago.
|
|
143
|
+
*/
|
|
144
|
+
async function followForge(context, options = {}) {
|
|
145
|
+
try {
|
|
146
|
+
const journal = context.journal;
|
|
147
|
+
if (journal === void 0 || !await context.files.exists(METHOD_CONFIG_PATH)) return 0;
|
|
148
|
+
const loaded = await loadMethodConfig(context.files);
|
|
149
|
+
if (!("config" in loaded)) return 0;
|
|
150
|
+
const config = loaded.config;
|
|
151
|
+
const product = config.product_id ?? await journal.productId();
|
|
152
|
+
if (product === null) return 0;
|
|
153
|
+
const clock = context.now ?? Date.now;
|
|
154
|
+
const throttle = context.forgeThrottleMs ?? DEFAULT_THROTTLE_MS;
|
|
155
|
+
const before = lastRead.get(journal);
|
|
156
|
+
const readForge = options.force === true || before === void 0 || clock() - before >= throttle;
|
|
157
|
+
let written = 0;
|
|
158
|
+
const merged = [];
|
|
159
|
+
if (readForge) {
|
|
160
|
+
lastRead.set(journal, clock());
|
|
161
|
+
const state = (await project(context, config, await journal.list())).state;
|
|
162
|
+
const drafts = [];
|
|
163
|
+
for (const [id, story] of followable(state)) {
|
|
164
|
+
const payload = await forgeMerge(context, config, state, id, story).catch(() => void 0);
|
|
165
|
+
if (payload === void 0) continue;
|
|
166
|
+
drafts.push({
|
|
167
|
+
type: MERGE_EVENT_TYPES.merged,
|
|
168
|
+
actor: { kind: "system" },
|
|
169
|
+
product,
|
|
170
|
+
story: id,
|
|
171
|
+
provenance: "trusted",
|
|
172
|
+
payload
|
|
173
|
+
});
|
|
174
|
+
merged.push({
|
|
175
|
+
id,
|
|
176
|
+
branch: story.started.branch
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
if (drafts.length > 0) {
|
|
180
|
+
const events = await journal.appendAll(drafts, { precondition: async (current) => {
|
|
181
|
+
const latest = (await project(context, config, current)).state;
|
|
182
|
+
for (const entry of merged) if (storiesIn(latest)[entry.id]?.merged !== void 0) throw new Error("merged meanwhile");
|
|
183
|
+
} });
|
|
184
|
+
written += events.length;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const state = (await project(context, config, await journal.list())).state;
|
|
188
|
+
const gone = await goneWorktrees(context, state);
|
|
189
|
+
const settledContext = {
|
|
190
|
+
now: clock(),
|
|
191
|
+
gone: (story) => gone.has(story)
|
|
192
|
+
};
|
|
193
|
+
const settled = settledPoints(state, settledContext);
|
|
194
|
+
if (settled.length > 0) {
|
|
195
|
+
const events = await journal.appendAll(settled.map((point) => ({
|
|
196
|
+
type: CHECKPOINT_CLOSED_EVENT_TYPES.closed,
|
|
197
|
+
actor: { kind: "system" },
|
|
198
|
+
product,
|
|
199
|
+
provenance: "trusted",
|
|
200
|
+
payload: {
|
|
201
|
+
checkpoint: point.checkpoint,
|
|
202
|
+
reason: point.reason,
|
|
203
|
+
...point.ref === void 0 ? {} : { ref: point.ref }
|
|
204
|
+
}
|
|
205
|
+
})));
|
|
206
|
+
written += events.length;
|
|
207
|
+
}
|
|
208
|
+
const due = dueMergePoints(state);
|
|
209
|
+
if (due.length > 0) {
|
|
210
|
+
const events = await journal.appendAll(due.map((point) => ({
|
|
211
|
+
type: CHECKPOINT_EVENT_TYPES.opened,
|
|
212
|
+
actor: { kind: "system" },
|
|
213
|
+
product,
|
|
214
|
+
story: point.story,
|
|
215
|
+
provenance: "trusted",
|
|
216
|
+
payload: { ...skippedMergeCheckpoint(point) }
|
|
217
|
+
})), { precondition: async (current) => {
|
|
218
|
+
const latest = (await project(context, config, current)).state;
|
|
219
|
+
const still = new Set(dueMergePoints(latest).map((point) => point.story));
|
|
220
|
+
if (!due.every((point) => still.has(point.story))) throw new Error("opened meanwhile");
|
|
221
|
+
} });
|
|
222
|
+
written += events.length;
|
|
223
|
+
}
|
|
224
|
+
for (const entry of merged) await removeMergedWorktree(context, entry.id, entry.branch);
|
|
225
|
+
return written;
|
|
226
|
+
} catch {
|
|
227
|
+
return 0;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//#endregion
|
|
231
|
+
export { followForge };
|