@codedrifters/configulator 0.0.290 → 0.0.292
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/lib/index.d.mts +209 -9
- package/lib/index.d.ts +210 -10
- package/lib/index.js +640 -493
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +631 -493
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
package/lib/index.mjs
CHANGED
|
@@ -585,13 +585,16 @@ var agendaAnalystSubAgent = {
|
|
|
585
585
|
" `duration_min` \xB1 5 minutes. If it doesn't, adjust section times",
|
|
586
586
|
" or cut content \u2014 do not ship a math-broken agenda.",
|
|
587
587
|
"",
|
|
588
|
-
"7. **Create the folder `index.md` if missing.** Populate it
|
|
588
|
+
"7. **Create the folder `index.md` if missing.** Populate it",
|
|
589
|
+
" following the `stub-index-convention` rule:",
|
|
589
590
|
" - Frontmatter `title` (short sidebar label) and `description`",
|
|
590
591
|
" (one line).",
|
|
591
592
|
" - A 2\u20134 sentence summary of the meeting's objective and desired",
|
|
592
593
|
" outcomes pulled from the agenda.",
|
|
593
594
|
" - A `## Documents` section linking to `./agenda.md` (and",
|
|
594
595
|
" `./notes.md` once the meeting-analyst produces it).",
|
|
596
|
+
" - No body `# Heading` \u2014 the frontmatter `title:` already",
|
|
597
|
+
" renders as the page H1.",
|
|
595
598
|
"",
|
|
596
599
|
" Do NOT set `sidebar.hidden: true` on `index.md` \u2014 it is the page",
|
|
597
600
|
" that should appear in the sidebar.",
|
|
@@ -1355,8 +1358,6 @@ function renderIssueTemplatesStarterPage(_it) {
|
|
|
1355
1358
|
"description: Canonical gh issue create recipes \u2014 one per downstream phase label.",
|
|
1356
1359
|
"---",
|
|
1357
1360
|
"",
|
|
1358
|
-
"# Issue Templates",
|
|
1359
|
-
"",
|
|
1360
1361
|
"This page lists the canonical `gh issue create` recipe for every",
|
|
1361
1362
|
"downstream issue kind dispatched by an agent in this monorepo.",
|
|
1362
1363
|
"Bundles and agent prompts cite the matching section below instead",
|
|
@@ -2791,6 +2792,71 @@ function assertValidProductContextPath(value) {
|
|
|
2791
2792
|
}
|
|
2792
2793
|
}
|
|
2793
2794
|
|
|
2795
|
+
// src/agent/bundles/stub-index-convention.ts
|
|
2796
|
+
function renderStubIndexConventionRuleContent() {
|
|
2797
|
+
return [
|
|
2798
|
+
"# Section Index Pages",
|
|
2799
|
+
"",
|
|
2800
|
+
"When any agent creates or updates an `index.md` (or `README.md`)",
|
|
2801
|
+
"in a docs subdirectory under a Starlight content root, the file's",
|
|
2802
|
+
"body must include:",
|
|
2803
|
+
"",
|
|
2804
|
+
"1. **A 1\u20132 paragraph summary** of the section's purpose and how",
|
|
2805
|
+
" it fits into the larger research, requirements, or capability",
|
|
2806
|
+
" area. Readers landing on the page should understand what's in",
|
|
2807
|
+
" the section without falling back to the sidebar.",
|
|
2808
|
+
"",
|
|
2809
|
+
"2. **A grouped, linked listing of the directory's children**",
|
|
2810
|
+
" (table or bullet list). When a natural taxonomy exists (e.g.",
|
|
2811
|
+
" organizations grouped by sub-segment, regulations grouped by",
|
|
2812
|
+
" jurisdiction, capabilities grouped by tier), use it. Otherwise",
|
|
2813
|
+
" sort alphabetically by title. Every listing entry must link",
|
|
2814
|
+
" to the child page.",
|
|
2815
|
+
"",
|
|
2816
|
+
"3. **No body `# Heading`.** Starlight renders the frontmatter",
|
|
2817
|
+
" `title:` as the page H1 automatically \u2014 a body H1 produces a",
|
|
2818
|
+
" duplicate. The same no-body-H1 contract that applies to skill",
|
|
2819
|
+
" templates and inline agent templates also applies to every",
|
|
2820
|
+
" index page emitted by an agent.",
|
|
2821
|
+
"",
|
|
2822
|
+
"## When this applies",
|
|
2823
|
+
"",
|
|
2824
|
+
"The convention applies to every `index.md` / `README.md` file",
|
|
2825
|
+
"covered by the shared-index path globs documented in the",
|
|
2826
|
+
"`shared-editing-safety` rule:",
|
|
2827
|
+
"",
|
|
2828
|
+
"- `docs/src/content/docs/**/index.md`",
|
|
2829
|
+
"- `docs/src/content/docs/**/README.md`",
|
|
2830
|
+
"",
|
|
2831
|
+
"Any agent that scaffolds a new directory under a Starlight",
|
|
2832
|
+
"content root MUST populate the directory's index page following",
|
|
2833
|
+
"this contract \u2014 a one-sentence stub is not acceptable.",
|
|
2834
|
+
"",
|
|
2835
|
+
"## Reference shapes",
|
|
2836
|
+
"",
|
|
2837
|
+
"Existing rich indexes are the canonical reference shape. Examples:",
|
|
2838
|
+
"",
|
|
2839
|
+
"- A `<MEETINGS_ROOT>/<YYYY-MM-DD>-<slug>/index.md` populated by",
|
|
2840
|
+
" the `agenda-analyst` bundle: frontmatter `title` /",
|
|
2841
|
+
" `description`, a 2\u20134 sentence summary, and a `## Documents`",
|
|
2842
|
+
" section listing every page in the folder.",
|
|
2843
|
+
"- A regulations scope index that opens with two paragraphs of",
|
|
2844
|
+
" context and groups every linked regulation under a",
|
|
2845
|
+
" `## Regulations` table by jurisdiction.",
|
|
2846
|
+
"- A standards-organizations index that groups every linked",
|
|
2847
|
+
" organization under a `## Organizations` heading by role",
|
|
2848
|
+
" (governance, working group, implementer).",
|
|
2849
|
+
"",
|
|
2850
|
+
"## Out of scope",
|
|
2851
|
+
"",
|
|
2852
|
+
"- Auto-generated child listings via Astro/Starlight components.",
|
|
2853
|
+
" Agents emit hand-curated tables or bullet lists; the rule",
|
|
2854
|
+
" defines the shape, not the rendering technology.",
|
|
2855
|
+
"- Backfilling pre-existing stub indexes is a downstream-consumer",
|
|
2856
|
+
" cleanup task, not a configulator change."
|
|
2857
|
+
].join("\n");
|
|
2858
|
+
}
|
|
2859
|
+
|
|
2794
2860
|
// src/agent/bundles/base.ts
|
|
2795
2861
|
var createPackageSkill = {
|
|
2796
2862
|
name: "create-package",
|
|
@@ -3582,8 +3648,21 @@ function buildBaseBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
|
3582
3648
|
"| `status:in-progress` | A worker has claimed the issue and a branch exists. Set when the worker starts; cleared only when the worker opens a PR or the issue fails. |",
|
|
3583
3649
|
"| `status:ready-for-review` | A PR has been opened for this issue and is awaiting review and merge. Replaces `status:in-progress` at the moment the PR opens. |",
|
|
3584
3650
|
"| `status:needs-attention` | Automated triage has flagged the issue for human review (stale, failed worker, or ambiguous state). Humans reset this label manually. |",
|
|
3651
|
+
"| `status:deferred` | Captured for provenance only; should not be auto-dispatched. Used by consumers that want a low-priority backlog (e.g. people-profile follow-ups in research-heavy planning repos) to stay out of the orchestrator's queue until a human or a consumer-configured scheduled task promotes it. |",
|
|
3585
3652
|
"| `status:done` | The change has shipped. Set when the PR merges and the issue closes. |",
|
|
3586
3653
|
"",
|
|
3654
|
+
"### Configurable filing-site defaults",
|
|
3655
|
+
"",
|
|
3656
|
+
"The bundle-shipped `gh issue create` recipes default to",
|
|
3657
|
+
"`status:ready` + `priority:medium`. Consumers can override the",
|
|
3658
|
+
"defaults per-phase-label via",
|
|
3659
|
+
"`AgentConfigOptions.issueDefaults` \u2014 e.g. flip every",
|
|
3660
|
+
"`people:research` filing to `status:deferred` + `priority:low`",
|
|
3661
|
+
"without touching the bundle source. See the **`issueDefaults`**",
|
|
3662
|
+
"section in the configulator agent-config docs for the full",
|
|
3663
|
+
"schema and consumer example. `status:deferred` is a valid",
|
|
3664
|
+
"override value reserved for this exact use case.",
|
|
3665
|
+
"",
|
|
3587
3666
|
"### Blocking Rules",
|
|
3588
3667
|
"",
|
|
3589
3668
|
"Two rules force `status:blocked` \u2014 both are non-negotiable:",
|
|
@@ -3876,6 +3955,16 @@ function buildBaseBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
|
3876
3955
|
},
|
|
3877
3956
|
tags: ["workflow"]
|
|
3878
3957
|
},
|
|
3958
|
+
{
|
|
3959
|
+
name: "stub-index-convention",
|
|
3960
|
+
description: "Section-index convention: every agent-emitted `index.md` / `README.md` under a Starlight docs root carries a contextual summary plus a grouped, linked listing of the directory's children \u2014 and no body `# Heading` (Starlight renders the frontmatter `title:` as the page H1).",
|
|
3961
|
+
scope: AGENT_RULE_SCOPE.ALWAYS,
|
|
3962
|
+
content: renderStubIndexConventionRuleContent(),
|
|
3963
|
+
platforms: {
|
|
3964
|
+
cursor: { exclude: true }
|
|
3965
|
+
},
|
|
3966
|
+
tags: ["workflow"]
|
|
3967
|
+
},
|
|
3879
3968
|
{
|
|
3880
3969
|
name: "skill-evals",
|
|
3881
3970
|
description: "Skill eval harness contract: declarative prompt/expected-output regression suites per skill at `<skillsRoot>/<skill-name>/evals/evals.json`, parameterised by a shared product-context fixture so the same eval shape works across every configulator-consuming project without forking fixtures.",
|
|
@@ -4151,8 +4240,6 @@ function buildBcmWriterSubAgent(paths) {
|
|
|
4151
4240
|
" tier: L1 | L2 | L3",
|
|
4152
4241
|
" ---",
|
|
4153
4242
|
"",
|
|
4154
|
-
" # BCM Outline: <Capability Name>",
|
|
4155
|
-
"",
|
|
4156
4243
|
" ## Capability Name",
|
|
4157
4244
|
" <noun or noun phrase \u2014 never a verb>",
|
|
4158
4245
|
"",
|
|
@@ -4232,8 +4319,6 @@ function buildBcmWriterSubAgent(paths) {
|
|
|
4232
4319
|
" date: YYYY-MM-DD",
|
|
4233
4320
|
" ---",
|
|
4234
4321
|
"",
|
|
4235
|
-
" # <Capability Name>",
|
|
4236
|
-
"",
|
|
4237
4322
|
" ## Capability Definitions",
|
|
4238
4323
|
" <1\u20132 sentences from the outline's Proposed Definition, refined>",
|
|
4239
4324
|
"",
|
|
@@ -4643,8 +4728,6 @@ title: "Business Model: <Segment Name>"
|
|
|
4643
4728
|
description: "Business Model Canvas analysis for the <segment name> segment of the <industry> industry."
|
|
4644
4729
|
---
|
|
4645
4730
|
|
|
4646
|
-
# Business Model: <Segment Name>
|
|
4647
|
-
|
|
4648
4731
|
| Field | Value |
|
|
4649
4732
|
|-------|-------|
|
|
4650
4733
|
| **Industry** | <industry name> |
|
|
@@ -5028,8 +5111,6 @@ function buildBusinessModelsAnalystSubAgent(paths) {
|
|
|
5028
5111
|
" status: complete",
|
|
5029
5112
|
" ---",
|
|
5030
5113
|
"",
|
|
5031
|
-
" # Business Model Scan: <Industry Name>",
|
|
5032
|
-
"",
|
|
5033
5114
|
" ## Source Inputs",
|
|
5034
5115
|
" - Industry plan: <relative path>",
|
|
5035
5116
|
" - Prior research: <relative path> (optional)",
|
|
@@ -5117,8 +5198,12 @@ function buildBusinessModelsAnalystSubAgent(paths) {
|
|
|
5117
5198
|
"",
|
|
5118
5199
|
"7. **Create the segment index** at",
|
|
5119
5200
|
" `<BUSINESS_MODELS_ROOT>/<industry>/segments/<SEGMENT_SLUG>/index.md`",
|
|
5120
|
-
" if it does not already exist.
|
|
5121
|
-
"
|
|
5201
|
+
" if it does not already exist. Follow the",
|
|
5202
|
+
" `stub-index-convention` rule: a 1\u20132 paragraph summary of the",
|
|
5203
|
+
" segment plus a linked listing of every page in the folder",
|
|
5204
|
+
" (`./business-model.md` and any value-stream / capability pages",
|
|
5205
|
+
" that land later). No body `# Heading` \u2014 the frontmatter",
|
|
5206
|
+
" `title:` already renders as the page H1.",
|
|
5122
5207
|
"",
|
|
5123
5208
|
"8. **Create one `business-models:complete` issue** with",
|
|
5124
5209
|
" `Depends on: #<canvas-issue>`. Its body references the path to",
|
|
@@ -5647,8 +5732,92 @@ function buildBusinessModelsBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
|
5647
5732
|
}
|
|
5648
5733
|
var businessModelsBundle = buildBusinessModelsBundle();
|
|
5649
5734
|
|
|
5735
|
+
// src/agent/bundles/issue-defaults.ts
|
|
5736
|
+
var VALID_STATUS_VALUES = [
|
|
5737
|
+
"ready",
|
|
5738
|
+
"blocked",
|
|
5739
|
+
"in-progress",
|
|
5740
|
+
"ready-for-review",
|
|
5741
|
+
"needs-attention",
|
|
5742
|
+
"done",
|
|
5743
|
+
"deferred"
|
|
5744
|
+
];
|
|
5745
|
+
var VALID_PRIORITY_VALUES = [
|
|
5746
|
+
"critical",
|
|
5747
|
+
"high",
|
|
5748
|
+
"medium",
|
|
5749
|
+
"low",
|
|
5750
|
+
"trivial"
|
|
5751
|
+
];
|
|
5752
|
+
var DEFAULT_ISSUE_STATUS = "ready";
|
|
5753
|
+
var DEFAULT_ISSUE_PRIORITY = "medium";
|
|
5754
|
+
var DEFAULT_RESOLVED_ISSUE_DEFAULTS = {
|
|
5755
|
+
defaults: {
|
|
5756
|
+
status: DEFAULT_ISSUE_STATUS,
|
|
5757
|
+
priority: DEFAULT_ISSUE_PRIORITY
|
|
5758
|
+
},
|
|
5759
|
+
overrides: {}
|
|
5760
|
+
};
|
|
5761
|
+
function resolveIssueDefaults(config) {
|
|
5762
|
+
if (config === void 0) {
|
|
5763
|
+
return DEFAULT_RESOLVED_ISSUE_DEFAULTS;
|
|
5764
|
+
}
|
|
5765
|
+
const overrides = {};
|
|
5766
|
+
for (const [phaseLabel, override] of Object.entries(config)) {
|
|
5767
|
+
assertValidPhaseLabel(phaseLabel);
|
|
5768
|
+
assertValidOverride(phaseLabel, override);
|
|
5769
|
+
overrides[phaseLabel] = {
|
|
5770
|
+
status: override.status ?? DEFAULT_ISSUE_STATUS,
|
|
5771
|
+
priority: override.priority ?? DEFAULT_ISSUE_PRIORITY
|
|
5772
|
+
};
|
|
5773
|
+
}
|
|
5774
|
+
return {
|
|
5775
|
+
defaults: {
|
|
5776
|
+
status: DEFAULT_ISSUE_STATUS,
|
|
5777
|
+
priority: DEFAULT_ISSUE_PRIORITY
|
|
5778
|
+
},
|
|
5779
|
+
overrides
|
|
5780
|
+
};
|
|
5781
|
+
}
|
|
5782
|
+
function validateIssueDefaultsConfig(config) {
|
|
5783
|
+
return resolveIssueDefaults(config);
|
|
5784
|
+
}
|
|
5785
|
+
function labelsForPhase(resolved, phaseLabel) {
|
|
5786
|
+
return resolved.overrides[phaseLabel] ?? resolved.defaults;
|
|
5787
|
+
}
|
|
5788
|
+
function assertValidPhaseLabel(phaseLabel) {
|
|
5789
|
+
if (typeof phaseLabel !== "string" || phaseLabel.trim() === "") {
|
|
5790
|
+
throw new Error(
|
|
5791
|
+
"AgentConfigOptions.issueDefaults: phase-label keys must be non-empty strings (e.g. `people:research`)."
|
|
5792
|
+
);
|
|
5793
|
+
}
|
|
5794
|
+
}
|
|
5795
|
+
function assertValidOverride(phaseLabel, override) {
|
|
5796
|
+
if (override === null || typeof override !== "object" || Array.isArray(override)) {
|
|
5797
|
+
throw new Error(
|
|
5798
|
+
`AgentConfigOptions.issueDefaults["${phaseLabel}"] must be an object with optional \`status\` and \`priority\` fields.`
|
|
5799
|
+
);
|
|
5800
|
+
}
|
|
5801
|
+
const { status, priority } = override;
|
|
5802
|
+
if (status === void 0 && priority === void 0) {
|
|
5803
|
+
throw new Error(
|
|
5804
|
+
`AgentConfigOptions.issueDefaults["${phaseLabel}"] must declare at least one of \`status\` or \`priority\`. Empty entries are rejected because they are almost always a typo on the field name.`
|
|
5805
|
+
);
|
|
5806
|
+
}
|
|
5807
|
+
if (status !== void 0 && !VALID_STATUS_VALUES.includes(status)) {
|
|
5808
|
+
throw new Error(
|
|
5809
|
+
`AgentConfigOptions.issueDefaults["${phaseLabel}"].status="${status}" is not a recognised status value. Allowed values: ${VALID_STATUS_VALUES.join(", ")}.`
|
|
5810
|
+
);
|
|
5811
|
+
}
|
|
5812
|
+
if (priority !== void 0 && !VALID_PRIORITY_VALUES.includes(priority)) {
|
|
5813
|
+
throw new Error(
|
|
5814
|
+
`AgentConfigOptions.issueDefaults["${phaseLabel}"].priority="${priority}" is not a recognised priority value. Allowed values: ${VALID_PRIORITY_VALUES.join(", ")}.`
|
|
5815
|
+
);
|
|
5816
|
+
}
|
|
5817
|
+
}
|
|
5818
|
+
|
|
5650
5819
|
// src/agent/bundles/company-profile.ts
|
|
5651
|
-
function buildCompanyProfileAnalystSubAgent(paths) {
|
|
5820
|
+
function buildCompanyProfileAnalystSubAgent(paths, issueDefaults) {
|
|
5652
5821
|
return {
|
|
5653
5822
|
name: "company-profile-analyst",
|
|
5654
5823
|
description: "Researches an external company (competitor, vendor, partner, customer, etc.) from public sources and produces a structured markdown profile, then enqueues downstream `people:research` and `software:research` issues for notable people and software products surfaced during profiling. Also handles profile enrichment against business-model canvases (`company:match`), maintenance refreshes on a configurable staleness cadence (`company:refresh`), and cross-profile competitive synthesis for a segment (`company:analyze`). One company or segment per session, tracked by company:* GitHub issue labels.",
|
|
@@ -5909,8 +6078,6 @@ function buildCompanyProfileAnalystSubAgent(paths) {
|
|
|
5909
6078
|
" parent_issue: <N>",
|
|
5910
6079
|
" ---",
|
|
5911
6080
|
"",
|
|
5912
|
-
" # Research Notes: <company name>",
|
|
5913
|
-
"",
|
|
5914
6081
|
" ## Framing",
|
|
5915
6082
|
" <why this company was requested and what to learn>",
|
|
5916
6083
|
"",
|
|
@@ -5972,8 +6139,6 @@ function buildCompanyProfileAnalystSubAgent(paths) {
|
|
|
5972
6139
|
" referencedIn: []",
|
|
5973
6140
|
" ---",
|
|
5974
6141
|
"",
|
|
5975
|
-
" # <company name>",
|
|
5976
|
-
"",
|
|
5977
6142
|
" ## Summary",
|
|
5978
6143
|
" <2\u20134 sentence elevator description: what they do, who they sell to>",
|
|
5979
6144
|
"",
|
|
@@ -6062,8 +6227,8 @@ function buildCompanyProfileAnalystSubAgent(paths) {
|
|
|
6062
6227
|
"",
|
|
6063
6228
|
" - `type:people-profile`",
|
|
6064
6229
|
" - `people:research`",
|
|
6065
|
-
|
|
6066
|
-
|
|
6230
|
+
` - \`priority:${labelsForPhase(issueDefaults, "people:research").priority}\``,
|
|
6231
|
+
` - \`status:${labelsForPhase(issueDefaults, "people:research").status}\``,
|
|
6067
6232
|
"",
|
|
6068
6233
|
" The issue body must include:",
|
|
6069
6234
|
" - A **discovery source** line naming this company profile",
|
|
@@ -6079,8 +6244,8 @@ function buildCompanyProfileAnalystSubAgent(paths) {
|
|
|
6079
6244
|
"",
|
|
6080
6245
|
" - `type:software-profile`",
|
|
6081
6246
|
" - `software:research`",
|
|
6082
|
-
|
|
6083
|
-
|
|
6247
|
+
` - \`priority:${labelsForPhase(issueDefaults, "software:research").priority}\``,
|
|
6248
|
+
` - \`status:${labelsForPhase(issueDefaults, "software:research").status}\``,
|
|
6084
6249
|
"",
|
|
6085
6250
|
" The issue body must include:",
|
|
6086
6251
|
" - A **discovery source** line naming this company profile",
|
|
@@ -6384,8 +6549,6 @@ function buildCompanyProfileAnalystSubAgent(paths) {
|
|
|
6384
6549
|
" - <relative path to profile 2>",
|
|
6385
6550
|
" ---",
|
|
6386
6551
|
"",
|
|
6387
|
-
" # <segment name> Competitive Analysis",
|
|
6388
|
-
"",
|
|
6389
6552
|
" ## Market Overview",
|
|
6390
6553
|
" <landscape summary \u2014 total players, market structure, trends",
|
|
6391
6554
|
" visible from the profiles>",
|
|
@@ -6523,47 +6686,52 @@ function buildCompanyProfileAnalystSubAgent(paths) {
|
|
|
6523
6686
|
].join("\n")
|
|
6524
6687
|
};
|
|
6525
6688
|
}
|
|
6526
|
-
|
|
6527
|
-
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
|
|
6534
|
-
|
|
6535
|
-
|
|
6536
|
-
|
|
6537
|
-
|
|
6538
|
-
|
|
6539
|
-
|
|
6540
|
-
|
|
6541
|
-
|
|
6542
|
-
|
|
6543
|
-
|
|
6544
|
-
|
|
6545
|
-
|
|
6546
|
-
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
|
|
6551
|
-
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
|
|
6557
|
-
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
|
|
6565
|
-
|
|
6566
|
-
|
|
6689
|
+
function buildProfileCompanyEvalsJson(issueDefaults) {
|
|
6690
|
+
const research = labelsForPhase(issueDefaults, "company:research");
|
|
6691
|
+
return JSON.stringify(
|
|
6692
|
+
{
|
|
6693
|
+
skill_name: "profile-company",
|
|
6694
|
+
evals: [
|
|
6695
|
+
{
|
|
6696
|
+
id: 1,
|
|
6697
|
+
prompt: "/profile-company Acme Registration \u2014 they're a mid-market B2B event platform we ran into at a trade show last month. framing: competitive analysis for our self-service registration feature.",
|
|
6698
|
+
expected_output: `A \`company:research\` issue is created with \`type:company-profile\`, \`priority:${research.priority}\`, and \`status:${research.status}\`. The issue body carries the company name, an inferred or stated type (likely \`competitor\` given the framing), the framing text, and any supplied overrides. Phase 1 produces a research-notes file under the project's notes directory with sources annotated by tier (T1/T2/T3/T4) and date. Phase 2 opens a \`company:draft\` issue and may additionally open \`people:research\` issues for notable leaders surfaced and \`software:research\` issues for adjacent product mentions. The skill does not author person profiles, software profiles, or comparative analyses itself.`,
|
|
6699
|
+
files: [],
|
|
6700
|
+
product_context_refs: [
|
|
6701
|
+
"Mission",
|
|
6702
|
+
"Domain Vocabulary",
|
|
6703
|
+
"In-Scope Capabilities"
|
|
6704
|
+
]
|
|
6705
|
+
},
|
|
6706
|
+
{
|
|
6707
|
+
id: 2,
|
|
6708
|
+
prompt: "Profile a startup called Lumen Events. Their current company page lists a 150-person team but a TechCrunch article from six months ago said they were at 80 people. Handle the conflict.",
|
|
6709
|
+
expected_output: "The `company:research` issue body captures the conflict up-front under a dedicated conflict-resolution note. The research notes file annotates the live company page as a T1 living source and the TechCrunch article as a T3 secondary source. Conflict resolution follows the documented hierarchy: T1 wins on headcount (a fast-decay claim), so the current-state profile records 150 employees. The profile adds an inline note flagging that the T3 source is six months old and may simply be stale. Sources section lists each citation with tier, access date or publish date, and URL.",
|
|
6710
|
+
files: [],
|
|
6711
|
+
product_context_refs: ["Domain Vocabulary"]
|
|
6712
|
+
},
|
|
6713
|
+
{
|
|
6714
|
+
id: 3,
|
|
6715
|
+
prompt: "/profile-company Acme Registration \u2014 we already have a profile for them but it's nine months old. Refresh it.",
|
|
6716
|
+
expected_output: "The pipeline routes through the refresh phase (not a fresh profile). It reads the existing profile slug and refuses to create a second profile under a new slug. When the existing profile is younger than the configured staleness threshold and `force: true` is not set, the refresh phase exits early and appends a revision-history row noting the review. When the profile is past cadence (nine months qualifies for most fast-decay fields), the refresh updates fast-decay claims in place (headcount, leadership, pricing, product features) while preserving stable history, and appends a revision-history row citing what changed and which sources were re-checked. No new profile file is created.",
|
|
6717
|
+
files: [],
|
|
6718
|
+
product_context_refs: ["Domain Vocabulary"]
|
|
6719
|
+
}
|
|
6720
|
+
]
|
|
6721
|
+
},
|
|
6722
|
+
null,
|
|
6723
|
+
2
|
|
6724
|
+
);
|
|
6725
|
+
}
|
|
6726
|
+
function buildProfileCompanyReferenceFiles(issueDefaults) {
|
|
6727
|
+
return [
|
|
6728
|
+
{
|
|
6729
|
+
path: "evals/evals.json",
|
|
6730
|
+
content: buildProfileCompanyEvalsJson(issueDefaults)
|
|
6731
|
+
}
|
|
6732
|
+
];
|
|
6733
|
+
}
|
|
6734
|
+
function buildProfileCompanySkill(paths, issueDefaults) {
|
|
6567
6735
|
return {
|
|
6568
6736
|
name: "profile-company",
|
|
6569
6737
|
description: "Kick off a company-profile pipeline. Creates a company:research issue for the given company and dispatches Phase 1 (Research) in the company-profile-analyst agent.",
|
|
@@ -6572,7 +6740,7 @@ function buildProfileCompanySkill(paths) {
|
|
|
6572
6740
|
context: "fork",
|
|
6573
6741
|
agent: "company-profile-analyst",
|
|
6574
6742
|
platforms: { cursor: { exclude: true } },
|
|
6575
|
-
referenceFiles:
|
|
6743
|
+
referenceFiles: buildProfileCompanyReferenceFiles(issueDefaults),
|
|
6576
6744
|
instructions: [
|
|
6577
6745
|
"# Profile Company",
|
|
6578
6746
|
"",
|
|
@@ -6603,7 +6771,7 @@ function buildProfileCompanySkill(paths) {
|
|
|
6603
6771
|
"## Steps",
|
|
6604
6772
|
"",
|
|
6605
6773
|
"1. Create a `company:research` issue with `type:company-profile`,",
|
|
6606
|
-
|
|
6774
|
+
` \`priority:${labelsForPhase(issueDefaults, "company:research").priority}\`, and \`status:${labelsForPhase(issueDefaults, "company:research").status}\`. Body must include the`,
|
|
6607
6775
|
" company name, selected type, framing, and any overrides.",
|
|
6608
6776
|
"2. Execute Phase 1 (Research) of the company-profile-analyst agent.",
|
|
6609
6777
|
"3. Phase 1 creates the `company:draft` issue. Phase 2 may create a",
|
|
@@ -6627,7 +6795,7 @@ function buildProfileCompanySkill(paths) {
|
|
|
6627
6795
|
].join("\n")
|
|
6628
6796
|
};
|
|
6629
6797
|
}
|
|
6630
|
-
function buildMatchCompanySkill(paths) {
|
|
6798
|
+
function buildMatchCompanySkill(paths, issueDefaults) {
|
|
6631
6799
|
return {
|
|
6632
6800
|
name: "match-company",
|
|
6633
6801
|
description: "Kick off a company-profile match (enrichment) cycle. Creates a company:match issue for an existing profile and dispatches Phase 4 (Match) in the company-profile-analyst agent. Match enriches the profile with business-model, segment, and size context from existing docs \u2014 no web searches.",
|
|
@@ -6677,7 +6845,7 @@ function buildMatchCompanySkill(paths) {
|
|
|
6677
6845
|
"## Steps",
|
|
6678
6846
|
"",
|
|
6679
6847
|
"1. Create a `company:match` issue with `type:company-profile`,",
|
|
6680
|
-
|
|
6848
|
+
` \`priority:${labelsForPhase(issueDefaults, "company:match").priority}\`, and \`status:${labelsForPhase(issueDefaults, "company:match").status}\`. Body must include the`,
|
|
6681
6849
|
" profile path and any overrides.",
|
|
6682
6850
|
"2. Execute Phase 4 (Match) of the company-profile-analyst agent.",
|
|
6683
6851
|
"",
|
|
@@ -6692,7 +6860,7 @@ function buildMatchCompanySkill(paths) {
|
|
|
6692
6860
|
].join("\n")
|
|
6693
6861
|
};
|
|
6694
6862
|
}
|
|
6695
|
-
function buildRefreshCompanySkill(paths) {
|
|
6863
|
+
function buildRefreshCompanySkill(paths, issueDefaults) {
|
|
6696
6864
|
return {
|
|
6697
6865
|
name: "refresh-company",
|
|
6698
6866
|
description: "Kick off a company-profile refresh cycle. Creates a company:refresh issue for an existing profile and dispatches Phase 5 (Refresh) in the company-profile-analyst agent. Refresh re-verifies the profile with 4\u20136 targeted web searches and updates it in place. Respects a configurable staleness threshold so profiles younger than the threshold exit early.",
|
|
@@ -6750,7 +6918,7 @@ function buildRefreshCompanySkill(paths) {
|
|
|
6750
6918
|
"## Steps",
|
|
6751
6919
|
"",
|
|
6752
6920
|
"1. Create a `company:refresh` issue with `type:company-profile`,",
|
|
6753
|
-
|
|
6921
|
+
` \`priority:${labelsForPhase(issueDefaults, "company:refresh").priority}\`, and \`status:${labelsForPhase(issueDefaults, "company:refresh").status}\`. Body must include the`,
|
|
6754
6922
|
" profile path and any overrides.",
|
|
6755
6923
|
"2. Execute Phase 5 (Refresh) of the company-profile-analyst agent.",
|
|
6756
6924
|
"",
|
|
@@ -6766,7 +6934,7 @@ function buildRefreshCompanySkill(paths) {
|
|
|
6766
6934
|
].join("\n")
|
|
6767
6935
|
};
|
|
6768
6936
|
}
|
|
6769
|
-
function buildAnalyzeSegmentSkill(paths) {
|
|
6937
|
+
function buildAnalyzeSegmentSkill(paths, issueDefaults) {
|
|
6770
6938
|
return {
|
|
6771
6939
|
name: "analyze-segment",
|
|
6772
6940
|
description: "Kick off a segment-level competitive-analysis cycle. Creates a company:analyze issue for the target segment and dispatches Phase 6 (Analyze) in the company-profile-analyst agent. Analyze synthesizes every profile in the segment into one competitive-analysis document. Blocks on open company:draft issues for the segment.",
|
|
@@ -6823,7 +6991,7 @@ function buildAnalyzeSegmentSkill(paths) {
|
|
|
6823
6991
|
"## Steps",
|
|
6824
6992
|
"",
|
|
6825
6993
|
"1. Create a `company:analyze` issue with `type:company-profile`,",
|
|
6826
|
-
|
|
6994
|
+
` \`priority:${labelsForPhase(issueDefaults, "company:analyze").priority}\`, and \`status:${labelsForPhase(issueDefaults, "company:analyze").status}\`. Body must include the`,
|
|
6827
6995
|
" segment slug and any overrides.",
|
|
6828
6996
|
"2. Execute Phase 6 (Analyze) of the company-profile-analyst agent.",
|
|
6829
6997
|
"",
|
|
@@ -6840,7 +7008,7 @@ function buildAnalyzeSegmentSkill(paths) {
|
|
|
6840
7008
|
].join("\n")
|
|
6841
7009
|
};
|
|
6842
7010
|
}
|
|
6843
|
-
function buildCompanyProfileBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
7011
|
+
function buildCompanyProfileBundle(paths = DEFAULT_AGENT_PATHS, issueDefaults = DEFAULT_RESOLVED_ISSUE_DEFAULTS) {
|
|
6844
7012
|
return {
|
|
6845
7013
|
name: "company-profile",
|
|
6846
7014
|
description: "Company research and profiling pipeline: research, draft profile, followup, match, refresh, analyze. Enabled by default; domain-neutral; filesystem-durable between phases. Phase 3 (Followup) hands surfaced people and software products off to the `people-profile` and `software-profile` bundles via `people:research` and `software:research` issues. Phase 4 (Match) enriches profiles against business-model canvases. Phase 5 (Refresh) re-verifies profiles on a configurable staleness cadence. Phase 6 (Analyze) synthesizes profiles in a segment into a competitive-analysis document.",
|
|
@@ -6893,12 +7061,12 @@ function buildCompanyProfileBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
|
6893
7061
|
}
|
|
6894
7062
|
],
|
|
6895
7063
|
skills: [
|
|
6896
|
-
buildProfileCompanySkill(paths),
|
|
6897
|
-
buildMatchCompanySkill(paths),
|
|
6898
|
-
buildRefreshCompanySkill(paths),
|
|
6899
|
-
buildAnalyzeSegmentSkill(paths)
|
|
7064
|
+
buildProfileCompanySkill(paths, issueDefaults),
|
|
7065
|
+
buildMatchCompanySkill(paths, issueDefaults),
|
|
7066
|
+
buildRefreshCompanySkill(paths, issueDefaults),
|
|
7067
|
+
buildAnalyzeSegmentSkill(paths, issueDefaults)
|
|
6900
7068
|
],
|
|
6901
|
-
subAgents: [buildCompanyProfileAnalystSubAgent(paths)],
|
|
7069
|
+
subAgents: [buildCompanyProfileAnalystSubAgent(paths, issueDefaults)],
|
|
6902
7070
|
labels: [
|
|
6903
7071
|
{
|
|
6904
7072
|
name: "type:company-profile",
|
|
@@ -6948,8 +7116,6 @@ archetype: <ARCHETYPE_SLUG>
|
|
|
6948
7116
|
segment: <SEGMENT_SLUG>
|
|
6949
7117
|
---
|
|
6950
7118
|
|
|
6951
|
-
# <Customer Archetype Name>
|
|
6952
|
-
|
|
6953
7119
|
| Field | Value |
|
|
6954
7120
|
|-------|-------|
|
|
6955
7121
|
| **Archetype** | <short noun phrase identifying the archetype> |
|
|
@@ -7080,7 +7246,8 @@ var CUSTOMER_PROFILE_REFERENCE_FILES = [
|
|
|
7080
7246
|
content: TEMPLATE_CUSTOMER_PROFILE
|
|
7081
7247
|
}
|
|
7082
7248
|
];
|
|
7083
|
-
function buildCustomerProfileAnalystSubAgent(paths) {
|
|
7249
|
+
function buildCustomerProfileAnalystSubAgent(paths, issueDefaults) {
|
|
7250
|
+
void issueDefaults;
|
|
7084
7251
|
return {
|
|
7085
7252
|
name: "customer-profile-analyst",
|
|
7086
7253
|
description: "Authors customer-archetype research through a 3-phase pipeline (discover \u2192 profile \u2192 competitors). Segments customer archetypes, profiles each archetype's goals, jobs-to-be-done, constraints, and buying process, then maps competitor features (from the shared software-profile feature matrix) to each archetype's needs and hands off unmet-need gaps to the requirements-analyst as req:scan seeds. One phase per session, tracked by customer:* GitHub issue labels with filesystem-based durability between phases.",
|
|
@@ -7315,8 +7482,6 @@ function buildCustomerProfileAnalystSubAgent(paths) {
|
|
|
7315
7482
|
" scope: <SCOPE_SLUG>",
|
|
7316
7483
|
" ---",
|
|
7317
7484
|
"",
|
|
7318
|
-
" # Customer Discovery: <Scope>",
|
|
7319
|
-
"",
|
|
7320
7485
|
" ## Scope Context",
|
|
7321
7486
|
" - **Scope:** <SCOPE_SLUG>",
|
|
7322
7487
|
" - **Sources scanned:** <counts by source type>",
|
|
@@ -7462,8 +7627,6 @@ function buildCustomerProfileAnalystSubAgent(paths) {
|
|
|
7462
7627
|
" archetype: <ARCHETYPE_SLUG>",
|
|
7463
7628
|
" ---",
|
|
7464
7629
|
"",
|
|
7465
|
-
" # Competitors: <Archetype Name>",
|
|
7466
|
-
"",
|
|
7467
7630
|
" ## Market Overview",
|
|
7468
7631
|
" <Brief overview of the competitive landscape this archetype",
|
|
7469
7632
|
" evaluates.>",
|
|
@@ -7667,7 +7830,7 @@ function buildCustomerProfileAnalystSubAgent(paths) {
|
|
|
7667
7830
|
].join("\n")
|
|
7668
7831
|
};
|
|
7669
7832
|
}
|
|
7670
|
-
function buildDiscoverCustomersSkill(paths) {
|
|
7833
|
+
function buildDiscoverCustomersSkill(paths, issueDefaults) {
|
|
7671
7834
|
return {
|
|
7672
7835
|
name: "discover-customers",
|
|
7673
7836
|
description: "Kick off the discover phase of a customer-research campaign. Creates a customer:discover issue for the supplied scope (industry, segment, or the consuming project as a whole) and dispatches Phase 1 of the customer-profile-analyst, which scans existing documentation for archetype candidates, writes a discovery report, and creates downstream customer:profile issues.",
|
|
@@ -7709,7 +7872,7 @@ function buildDiscoverCustomersSkill(paths) {
|
|
|
7709
7872
|
"## Steps",
|
|
7710
7873
|
"",
|
|
7711
7874
|
"1. Create a `customer:discover` issue with `type:customer-profile`,",
|
|
7712
|
-
|
|
7875
|
+
` \`priority:${labelsForPhase(issueDefaults, "customer:discover").priority}\`, and \`status:${labelsForPhase(issueDefaults, "customer:discover").status}\`. The body must include the`,
|
|
7713
7876
|
" scope slug and any known archetypes to include or exclude.",
|
|
7714
7877
|
"2. Execute Phase 1 (Discover) of the customer-profile-analyst agent.",
|
|
7715
7878
|
"3. Phase 1 writes the discovery report and creates one",
|
|
@@ -7724,7 +7887,7 @@ function buildDiscoverCustomersSkill(paths) {
|
|
|
7724
7887
|
].join("\n")
|
|
7725
7888
|
};
|
|
7726
7889
|
}
|
|
7727
|
-
function buildProfileCustomerSkill(paths) {
|
|
7890
|
+
function buildProfileCustomerSkill(paths, issueDefaults) {
|
|
7728
7891
|
return {
|
|
7729
7892
|
name: "profile-customer",
|
|
7730
7893
|
description: "Kick off the profile phase for one customer archetype. Creates a customer:profile issue for the supplied archetype and dispatches Phase 2 of the customer-profile-analyst, which populates the archetype page with segment, goals, jobs-to-be-done, constraints, buying process, technology landscape, and regulatory applicability using the ship-with customer-profile-page template.",
|
|
@@ -7784,7 +7947,7 @@ function buildProfileCustomerSkill(paths) {
|
|
|
7784
7947
|
"## Steps",
|
|
7785
7948
|
"",
|
|
7786
7949
|
"1. Create a `customer:profile` issue with `type:customer-profile`,",
|
|
7787
|
-
|
|
7950
|
+
` \`priority:${labelsForPhase(issueDefaults, "customer:profile").priority}\`, and \`status:${labelsForPhase(issueDefaults, "customer:profile").status}\`. The body must include the`,
|
|
7788
7951
|
" archetype slug and (optionally) the segment slug.",
|
|
7789
7952
|
"2. Execute Phase 2 (Profile) of the customer-profile-analyst agent.",
|
|
7790
7953
|
" The agent runs 4\u20138 targeted web searches and populates the",
|
|
@@ -7804,7 +7967,7 @@ function buildProfileCustomerSkill(paths) {
|
|
|
7804
7967
|
].join("\n")
|
|
7805
7968
|
};
|
|
7806
7969
|
}
|
|
7807
|
-
function buildAnalyzeCustomerCompetitorsSkill(paths) {
|
|
7970
|
+
function buildAnalyzeCustomerCompetitorsSkill(paths, issueDefaults) {
|
|
7808
7971
|
return {
|
|
7809
7972
|
name: "analyze-customer-competitors",
|
|
7810
7973
|
description: "Kick off the competitors phase for one customer archetype. Creates a customer:competitors issue for the supplied archetype and dispatches Phase 3 of the customer-profile-analyst, which maps rows from the shared software-profile feature matrix to the archetype's needs, identifies unmet needs, and hands off each unmet need as a req:scan seed to the requirements-analyst bundle.",
|
|
@@ -7858,8 +8021,8 @@ function buildAnalyzeCustomerCompetitorsSkill(paths) {
|
|
|
7858
8021
|
"## Steps",
|
|
7859
8022
|
"",
|
|
7860
8023
|
"1. Create a `customer:competitors` issue with",
|
|
7861
|
-
|
|
7862
|
-
|
|
8024
|
+
` \`type:customer-profile\`, \`priority:${labelsForPhase(issueDefaults, "customer:competitors").priority}\`, and`,
|
|
8025
|
+
` \`status:${labelsForPhase(issueDefaults, "customer:competitors").status}\` (or \`status:blocked\` when still dependent on a`,
|
|
7863
8026
|
" Phase 2 profile issue). Body must include the archetype page",
|
|
7864
8027
|
" path.",
|
|
7865
8028
|
"2. Execute Phase 3 (Competitors) of the customer-profile-analyst",
|
|
@@ -7884,7 +8047,7 @@ function buildAnalyzeCustomerCompetitorsSkill(paths) {
|
|
|
7884
8047
|
].join("\n")
|
|
7885
8048
|
};
|
|
7886
8049
|
}
|
|
7887
|
-
function buildCustomerProfileBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
8050
|
+
function buildCustomerProfileBundle(paths = DEFAULT_AGENT_PATHS, issueDefaults = DEFAULT_RESOLVED_ISSUE_DEFAULTS) {
|
|
7888
8051
|
return {
|
|
7889
8052
|
name: "customer-profile",
|
|
7890
8053
|
description: "Customer-archetype research pipeline: discover, profile, competitors. 3 phases with customer:* phase labels. Segments customer archetypes, profiles each archetype's goals, jobs-to-be-done, constraints, and buying process, then maps competitor features (from the shared software-profile feature matrix) to each archetype's needs and hands off unmet-need gaps to the requirements-analyst bundle as req:scan seeds. Enabled by default; domain-neutral; customer-centric (distinct from company-profile); filesystem-durable between phases.",
|
|
@@ -7955,11 +8118,11 @@ function buildCustomerProfileBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
|
7955
8118
|
}
|
|
7956
8119
|
],
|
|
7957
8120
|
skills: [
|
|
7958
|
-
buildDiscoverCustomersSkill(paths),
|
|
7959
|
-
buildProfileCustomerSkill(paths),
|
|
7960
|
-
buildAnalyzeCustomerCompetitorsSkill(paths)
|
|
8121
|
+
buildDiscoverCustomersSkill(paths, issueDefaults),
|
|
8122
|
+
buildProfileCustomerSkill(paths, issueDefaults),
|
|
8123
|
+
buildAnalyzeCustomerCompetitorsSkill(paths, issueDefaults)
|
|
7961
8124
|
],
|
|
7962
|
-
subAgents: [buildCustomerProfileAnalystSubAgent(paths)],
|
|
8125
|
+
subAgents: [buildCustomerProfileAnalystSubAgent(paths, issueDefaults)],
|
|
7963
8126
|
labels: [
|
|
7964
8127
|
{
|
|
7965
8128
|
name: "type:customer-profile",
|
|
@@ -9165,7 +9328,7 @@ var githubWorkflowBundle = {
|
|
|
9165
9328
|
};
|
|
9166
9329
|
|
|
9167
9330
|
// src/agent/bundles/industry-discovery.ts
|
|
9168
|
-
function buildIndustryDiscoveryAnalystSubAgent(paths) {
|
|
9331
|
+
function buildIndustryDiscoveryAnalystSubAgent(paths, issueDefaults) {
|
|
9169
9332
|
return {
|
|
9170
9333
|
name: "industry-discovery-analyst",
|
|
9171
9334
|
description: "Discovers candidate industry verticals, scores each against a configurable capability/fit rubric, and creates planning issues for verticals that clear the threshold. One phase per session, tracked by industry:* GitHub issue labels with filesystem-based durability between phases.",
|
|
@@ -9370,8 +9533,6 @@ function buildIndustryDiscoveryAnalystSubAgent(paths) {
|
|
|
9370
9533
|
" candidate_count: <N>",
|
|
9371
9534
|
" ---",
|
|
9372
9535
|
"",
|
|
9373
|
-
" # Industry Candidates: <scope>",
|
|
9374
|
-
"",
|
|
9375
9536
|
" ## Scope",
|
|
9376
9537
|
" <verbatim scope statement from the issue>",
|
|
9377
9538
|
"",
|
|
@@ -9432,8 +9593,6 @@ function buildIndustryDiscoveryAnalystSubAgent(paths) {
|
|
|
9432
9593
|
" threshold: <0.0\u20131.0>",
|
|
9433
9594
|
" ---",
|
|
9434
9595
|
"",
|
|
9435
|
-
" # Industry Evaluation: <scope>",
|
|
9436
|
-
"",
|
|
9437
9596
|
" ## Fit Rubric",
|
|
9438
9597
|
" <verbatim rubric table, including weights and threshold>",
|
|
9439
9598
|
"",
|
|
@@ -9490,8 +9649,6 @@ function buildIndustryDiscoveryAnalystSubAgent(paths) {
|
|
|
9490
9649
|
" evaluation_source: <EVALUATIONS_DIR>/<DISCOVERY_SLUG>.evaluation.md",
|
|
9491
9650
|
" ---",
|
|
9492
9651
|
"",
|
|
9493
|
-
" # Industry Plan: <scope>",
|
|
9494
|
-
"",
|
|
9495
9652
|
" ## Cleared Verticals",
|
|
9496
9653
|
" | Vertical | Score | Downstream Issue |",
|
|
9497
9654
|
" |----------|-------|------------------|",
|
|
@@ -9509,8 +9666,8 @@ function buildIndustryDiscoveryAnalystSubAgent(paths) {
|
|
|
9509
9666
|
"4. **Create one `research:scope` issue per cleared vertical.** This",
|
|
9510
9667
|
" assumes the `research-pipeline` bundle is enabled in the consuming",
|
|
9511
9668
|
" project. Each downstream issue should:",
|
|
9512
|
-
|
|
9513
|
-
|
|
9669
|
+
` - Carry \`type:research\`, \`research:scope\`, \`priority:${labelsForPhase(issueDefaults, "research:scope").priority}\`, and`,
|
|
9670
|
+
` \`status:${labelsForPhase(issueDefaults, "research:scope").status}\` labels`,
|
|
9514
9671
|
" - Include the research question framed for the vertical (what the",
|
|
9515
9672
|
" downstream research needs to answer)",
|
|
9516
9673
|
" - Cite the evaluation row that justified advancing the vertical",
|
|
@@ -9561,7 +9718,7 @@ function buildIndustryDiscoveryAnalystSubAgent(paths) {
|
|
|
9561
9718
|
].join("\n")
|
|
9562
9719
|
};
|
|
9563
9720
|
}
|
|
9564
|
-
function buildDiscoverIndustriesSkill(paths) {
|
|
9721
|
+
function buildDiscoverIndustriesSkill(paths, issueDefaults) {
|
|
9565
9722
|
return {
|
|
9566
9723
|
name: "discover-industries",
|
|
9567
9724
|
description: "Kick off an industry-discovery pipeline. Creates an industry:discover issue carrying the discovery scope and dispatches Phase 1 (Discover) in the industry-discovery-analyst agent.",
|
|
@@ -9603,7 +9760,7 @@ function buildDiscoverIndustriesSkill(paths) {
|
|
|
9603
9760
|
"## Steps",
|
|
9604
9761
|
"",
|
|
9605
9762
|
"1. Create an `industry:discover` issue with `type:industry-discovery`,",
|
|
9606
|
-
|
|
9763
|
+
` \`priority:${labelsForPhase(issueDefaults, "industry:discover").priority}\`, and \`status:${labelsForPhase(issueDefaults, "industry:discover").status}\`. Body must include the`,
|
|
9607
9764
|
" verbatim scope, authorized sources, and any overrides.",
|
|
9608
9765
|
"2. Execute Phase 1 (Discover) of the industry-discovery-analyst",
|
|
9609
9766
|
" agent.",
|
|
@@ -9624,7 +9781,7 @@ function buildDiscoverIndustriesSkill(paths) {
|
|
|
9624
9781
|
].join("\n")
|
|
9625
9782
|
};
|
|
9626
9783
|
}
|
|
9627
|
-
function buildIndustryDiscoveryBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
9784
|
+
function buildIndustryDiscoveryBundle(paths = DEFAULT_AGENT_PATHS, issueDefaults = DEFAULT_RESOLVED_ISSUE_DEFAULTS) {
|
|
9628
9785
|
return {
|
|
9629
9786
|
name: "industry-discovery",
|
|
9630
9787
|
description: "Industry-vertical discovery pipeline: discover candidates, evaluate against a fit rubric, plan downstream research. Enabled by default; domain-neutral; filesystem-durable between phases.",
|
|
@@ -9658,8 +9815,8 @@ function buildIndustryDiscoveryBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
|
9658
9815
|
tags: ["workflow"]
|
|
9659
9816
|
}
|
|
9660
9817
|
],
|
|
9661
|
-
skills: [buildDiscoverIndustriesSkill(paths)],
|
|
9662
|
-
subAgents: [buildIndustryDiscoveryAnalystSubAgent(paths)],
|
|
9818
|
+
skills: [buildDiscoverIndustriesSkill(paths, issueDefaults)],
|
|
9819
|
+
subAgents: [buildIndustryDiscoveryAnalystSubAgent(paths, issueDefaults)],
|
|
9663
9820
|
labels: [
|
|
9664
9821
|
{
|
|
9665
9822
|
name: "type:industry-discovery",
|
|
@@ -9944,8 +10101,6 @@ function buildMaintenanceAuditSubAgent(paths) {
|
|
|
9944
10101
|
" status: complete",
|
|
9945
10102
|
" ---",
|
|
9946
10103
|
"",
|
|
9947
|
-
" # Maintenance Audit: <AUDIT_SLUG>",
|
|
9948
|
-
"",
|
|
9949
10104
|
" ## Scope",
|
|
9950
10105
|
" - **Docs root:** `<DOCS_ROOT>`",
|
|
9951
10106
|
" - **Checks run:** <list of check categories>",
|
|
@@ -10067,8 +10222,6 @@ function buildMaintenanceAuditSubAgent(paths) {
|
|
|
10067
10222
|
" status: complete",
|
|
10068
10223
|
" ---",
|
|
10069
10224
|
"",
|
|
10070
|
-
" # Maintenance Fix: <AUDIT_SLUG>",
|
|
10071
|
-
"",
|
|
10072
10225
|
" ## Source Audit Report",
|
|
10073
10226
|
" <link to the Phase 1 audit report>",
|
|
10074
10227
|
"",
|
|
@@ -10169,8 +10322,6 @@ function buildMaintenanceAuditSubAgent(paths) {
|
|
|
10169
10322
|
" status: complete",
|
|
10170
10323
|
" ---",
|
|
10171
10324
|
"",
|
|
10172
|
-
" # Maintenance Verify: <AUDIT_SLUG>",
|
|
10173
|
-
"",
|
|
10174
10325
|
" ## Source Reports",
|
|
10175
10326
|
" - Scan report: <link>",
|
|
10176
10327
|
" - Fix report: <link>",
|
|
@@ -12844,80 +12995,81 @@ function buildCheckBlockedScript(tiers, scopeGate, runRatio) {
|
|
|
12844
12995
|
"}",
|
|
12845
12996
|
"",
|
|
12846
12997
|
"cmd_eligible() {",
|
|
12847
|
-
"
|
|
12848
|
-
|
|
12849
|
-
|
|
12850
|
-
|
|
12851
|
-
"",
|
|
12852
|
-
"
|
|
12853
|
-
|
|
12854
|
-
|
|
12855
|
-
|
|
12856
|
-
"
|
|
12857
|
-
"
|
|
12998
|
+
" # Bucketed scan: walk priority levels critical \u2192 high \u2192 medium \u2192 low \u2192",
|
|
12999
|
+
" # trivial, fetching one bucket at a time. The first bucket with at",
|
|
13000
|
+
" # least one survivor (after the Depends-on filter) short-circuits the",
|
|
13001
|
+
" # loop \u2014 lower-priority buckets are never queried in the common case.",
|
|
13002
|
+
" # This guarantees that every higher-priority issue is visible even",
|
|
13003
|
+
" # when the global ready backlog exceeds 50, at the cost of up to one",
|
|
13004
|
+
" # extra `gh issue list` call per empty bucket above the first hit.",
|
|
13005
|
+
" local level",
|
|
13006
|
+
" for level in critical high medium low trivial; do",
|
|
13007
|
+
" local issues",
|
|
13008
|
+
' issues=$(gh issue list --label "status:ready" --label "priority:${level}" --state open \\',
|
|
13009
|
+
' --search "sort:created-asc" \\',
|
|
13010
|
+
' --json number,title,body,labels --limit 50 2>/dev/null || echo "[]")',
|
|
13011
|
+
"",
|
|
13012
|
+
" local count",
|
|
13013
|
+
` count=$(echo "$issues" | jq 'length')`,
|
|
13014
|
+
' if [[ "$count" -eq 0 ]]; then',
|
|
13015
|
+
" continue",
|
|
13016
|
+
" fi",
|
|
12858
13017
|
"",
|
|
12859
|
-
"
|
|
12860
|
-
`
|
|
12861
|
-
"
|
|
12862
|
-
'
|
|
12863
|
-
'
|
|
12864
|
-
'
|
|
12865
|
-
'
|
|
12866
|
-
" ')",
|
|
13018
|
+
" local issue_data",
|
|
13019
|
+
` issue_data=$(echo "$issues" | jq -r '`,
|
|
13020
|
+
" .[] |",
|
|
13021
|
+
' (.body | split("\\n") | map(select(test("Depends on:"; "i"))) | .[0] // "") as $dep_line |',
|
|
13022
|
+
' (.labels | map(.name) | map(select(startswith("type:"))) | .[0] // "") as $type_label |',
|
|
13023
|
+
' "\\(.number)\\t\\(.title)\\t\\($dep_line)\\t\\($type_label)"',
|
|
13024
|
+
" ')",
|
|
12867
13025
|
"",
|
|
12868
|
-
'
|
|
12869
|
-
"
|
|
12870
|
-
'
|
|
13026
|
+
' local results=""',
|
|
13027
|
+
" while IFS=$'\\t' read -r num title dep_line type_label; do",
|
|
13028
|
+
' [[ -z "$num" ]] && continue',
|
|
12871
13029
|
"",
|
|
12872
|
-
'
|
|
12873
|
-
'
|
|
12874
|
-
'
|
|
12875
|
-
"
|
|
13030
|
+
' local deps=""',
|
|
13031
|
+
' if [[ -n "$dep_line" ]]; then',
|
|
13032
|
+
' deps=$(parse_deps "$dep_line")',
|
|
13033
|
+
" fi",
|
|
12876
13034
|
"",
|
|
12877
|
-
"
|
|
12878
|
-
"
|
|
12879
|
-
'
|
|
12880
|
-
'
|
|
12881
|
-
"
|
|
12882
|
-
'
|
|
12883
|
-
"
|
|
12884
|
-
'
|
|
12885
|
-
"
|
|
12886
|
-
"
|
|
12887
|
-
"
|
|
13035
|
+
" # Check if any dep is still open.",
|
|
13036
|
+
" local has_open_dep=false",
|
|
13037
|
+
' local open_deps=""',
|
|
13038
|
+
' if [[ -n "${deps// /}" ]]; then',
|
|
13039
|
+
" for dep in $deps; do",
|
|
13040
|
+
' if ! is_closed "$dep"; then',
|
|
13041
|
+
" has_open_dep=true",
|
|
13042
|
+
' open_deps="${open_deps}#${dep} "',
|
|
13043
|
+
" fi",
|
|
13044
|
+
" done",
|
|
13045
|
+
" fi",
|
|
12888
13046
|
"",
|
|
12889
|
-
"
|
|
12890
|
-
'
|
|
12891
|
-
"
|
|
12892
|
-
"
|
|
13047
|
+
" if $has_open_dep; then",
|
|
13048
|
+
' echo "SKIP #${num} \u2014 dep ${open_deps% } still open"',
|
|
13049
|
+
" continue",
|
|
13050
|
+
" fi",
|
|
12893
13051
|
"",
|
|
12894
|
-
"
|
|
12895
|
-
|
|
12896
|
-
|
|
12897
|
-
'
|
|
12898
|
-
' *priority:critical*) priority_key=0; priority="critical" ;;',
|
|
12899
|
-
' *priority:high*) priority_key=1; priority="high" ;;',
|
|
12900
|
-
' *priority:medium*) priority_key=2; priority="medium" ;;',
|
|
12901
|
-
' *priority:low*) priority_key=3; priority="low" ;;',
|
|
12902
|
-
' *priority:trivial*) priority_key=4; priority="trivial" ;;',
|
|
12903
|
-
" esac",
|
|
13052
|
+
" # Funnel-tier sort key (0-4; 0 dispatches first within a bucket).",
|
|
13053
|
+
' local type_value="${type_label#type:}"',
|
|
13054
|
+
" local tier_key",
|
|
13055
|
+
' tier_key=$(tier_of "$type_value")',
|
|
12904
13056
|
"",
|
|
12905
|
-
|
|
12906
|
-
'
|
|
12907
|
-
" local tier_key",
|
|
12908
|
-
' tier_key=$(tier_of "$type_value")',
|
|
13057
|
+
' local label_info=""',
|
|
13058
|
+
' [[ -n "$type_label" ]] && label_info=" ${type_label}"',
|
|
12909
13059
|
"",
|
|
12910
|
-
'
|
|
12911
|
-
'
|
|
13060
|
+
' results="${results}${tier_key}\\t${num}\\tPICK #${num} priority:${level} tier:${tier_key}${label_info} \\"${title}\\"\\n"',
|
|
13061
|
+
' done <<< "$issue_data"',
|
|
12912
13062
|
"",
|
|
12913
|
-
|
|
12914
|
-
|
|
13063
|
+
" # Within this bucket: sort by funnel tier asc \u2192 issue number asc",
|
|
13064
|
+
" # (FIFO). If any PICK lines survived the Depends-on filter, emit",
|
|
13065
|
+
" # them and short-circuit before querying lower-priority buckets.",
|
|
13066
|
+
' if [[ -n "$results" ]]; then',
|
|
13067
|
+
` printf '%b' "$results" | sort -t$'\\t' -k1,1n -k2,2n | cut -f3`,
|
|
13068
|
+
" return 0",
|
|
13069
|
+
" fi",
|
|
13070
|
+
" done",
|
|
12915
13071
|
"",
|
|
12916
|
-
|
|
12917
|
-
" # (asc, lower tier wins on priority tie), then issue number (FIFO).",
|
|
12918
|
-
' if [[ -n "$results" ]]; then',
|
|
12919
|
-
` printf '%b' "$results" | sort -t$'\\t' -k1,1n -k2,2n -k3,3n | cut -f4`,
|
|
12920
|
-
" fi",
|
|
13072
|
+
' echo "NO_READY_ISSUES"',
|
|
12921
13073
|
"}",
|
|
12922
13074
|
"",
|
|
12923
13075
|
"cmd_stale() {",
|
|
@@ -13352,9 +13504,25 @@ var orchestratorSubAgent = {
|
|
|
13352
13504
|
".claude/procedures/check-blocked.sh eligible",
|
|
13353
13505
|
"```",
|
|
13354
13506
|
"",
|
|
13507
|
+
"The script walks the priority buckets **critical \u2192 high \u2192 medium \u2192 low",
|
|
13508
|
+
"\u2192 trivial** in order, querying one bucket at a time and short-circuiting",
|
|
13509
|
+
"on the first non-empty bucket whose survivors clear the `Depends on:`",
|
|
13510
|
+
"filter. Each bucket is fetched with",
|
|
13511
|
+
'`gh issue list --label "status:ready" --label "priority:<level>" --limit 50`,',
|
|
13512
|
+
"so every higher-priority issue is visible even when the global ready",
|
|
13513
|
+
"backlog exceeds 50 \u2014 a `priority:critical` filing can never be hidden",
|
|
13514
|
+
"behind 50 older medium/low issues. The cost in the common case (the",
|
|
13515
|
+
"first bucket the script queries is non-empty) is **one `gh issue list`",
|
|
13516
|
+
"call**, identical to the previous single-fetch implementation; the",
|
|
13517
|
+
"worst case is five calls when every higher-priority bucket is empty",
|
|
13518
|
+
"or fully dep-blocked. Per-priority bucket size is still capped at 50",
|
|
13519
|
+
"issues \u2014 see the **Orchestrator Conventions** section in `CLAUDE.md`.",
|
|
13520
|
+
"",
|
|
13355
13521
|
"The script emits `PICK` lines sorted by **priority desc \u2192 funnel tier asc",
|
|
13356
|
-
"\u2192 issue number asc
|
|
13357
|
-
"
|
|
13522
|
+
"\u2192 issue number asc** (priority order is enforced by the bucket walk;",
|
|
13523
|
+
"the in-bucket sort handles funnel tier and FIFO). Each line carries",
|
|
13524
|
+
"both `priority:<level>` and `tier:<n>` so the sort is legible at a",
|
|
13525
|
+
"glance:",
|
|
13358
13526
|
"",
|
|
13359
13527
|
"```",
|
|
13360
13528
|
'PICK #42 priority:high tier:1 type:research "FHIR extension analysis"',
|
|
@@ -13985,7 +14153,7 @@ var ORCHESTRATOR_CONVENTIONS_PREAMBLE = [
|
|
|
13985
14153
|
"- The orchestrator **never** implements code, creates branches, pushes commits, **or merges PRs** \u2014 it triages issues, picks the next work item, and delegates implementation to other sub-agents. Approved-PR merging is owned by the `pr-reviewer` sub-agent (invoked via `/review-pr` / `/review-prs`).",
|
|
13986
14154
|
"- All triage queries use `.claude/procedures/check-blocked.sh` for token efficiency",
|
|
13987
14155
|
"- The queue scan reads only `priority:*` and `status:*` labels \u2014 type-routing (which typed agent handles a given `type:*` label) is the `issue-worker`'s concern, not the orchestrator's. The orchestrator's funnel-tier sort is a tie-breaker on `priority:*`, not a routing decision.",
|
|
13988
|
-
"- Priority order: critical > high > medium > low > trivial, then **funnel tier asc** (lower tier wins ties), then FIFO by issue number",
|
|
14156
|
+
"- Priority order: critical > high > medium > low > trivial, then **funnel tier asc** (lower tier wins ties), then FIFO by issue number. Phase E's queue scan walks each priority bucket in turn (one `gh issue list` call per bucket, **capped at 50 issues per bucket**) and short-circuits on the first bucket whose survivors clear the `Depends on:` filter, so every higher-priority issue is visible even when the global ready backlog is much larger than 50.",
|
|
13989
14157
|
"- Stale thresholds: 72h for in-progress, 168h for blocked",
|
|
13990
14158
|
"- Flagged issues get `status:needs-attention` \u2014 they are not auto-reset",
|
|
13991
14159
|
"",
|
|
@@ -14072,7 +14240,7 @@ var orchestratorBundle = {
|
|
|
14072
14240
|
};
|
|
14073
14241
|
|
|
14074
14242
|
// src/agent/bundles/people-profile.ts
|
|
14075
|
-
function buildPeopleProfileAnalystSubAgent(paths) {
|
|
14243
|
+
function buildPeopleProfileAnalystSubAgent(paths, issueDefaults) {
|
|
14076
14244
|
return {
|
|
14077
14245
|
name: "people-profile-analyst",
|
|
14078
14246
|
description: "Researches an individual person (colleague, customer contact, vendor contact, partner contact, industry expert, or connector) from public sources and produces a structured markdown profile cross-linked to companies, software, and meeting notes, then enqueues downstream `company:research` and `software:research` issues for unprofiled companies and software products surfaced during profiling. Also handles maintenance refreshes on a configurable staleness cadence (`people:refresh`). One person per session, tracked by people:* GitHub issue labels.",
|
|
@@ -14337,8 +14505,6 @@ function buildPeopleProfileAnalystSubAgent(paths) {
|
|
|
14337
14505
|
" parent_issue: <N>",
|
|
14338
14506
|
" ---",
|
|
14339
14507
|
"",
|
|
14340
|
-
" # Research Notes: <person name>",
|
|
14341
|
-
"",
|
|
14342
14508
|
" ## Framing",
|
|
14343
14509
|
" <why this person was requested and what to learn>",
|
|
14344
14510
|
"",
|
|
@@ -14400,8 +14566,6 @@ function buildPeopleProfileAnalystSubAgent(paths) {
|
|
|
14400
14566
|
" notes: <NOTES_DIR>/<PERSON_SLUG>.notes.md",
|
|
14401
14567
|
" ---",
|
|
14402
14568
|
"",
|
|
14403
|
-
" # <person name>",
|
|
14404
|
-
"",
|
|
14405
14569
|
" ## Summary",
|
|
14406
14570
|
" <2\u20134 sentence elevator description: who they are, what they do,",
|
|
14407
14571
|
" why they matter to this project>",
|
|
@@ -14513,8 +14677,8 @@ function buildPeopleProfileAnalystSubAgent(paths) {
|
|
|
14513
14677
|
"",
|
|
14514
14678
|
" - `type:company-profile`",
|
|
14515
14679
|
" - `company:research`",
|
|
14516
|
-
|
|
14517
|
-
|
|
14680
|
+
` - \`priority:${labelsForPhase(issueDefaults, "company:research").priority}\``,
|
|
14681
|
+
` - \`status:${labelsForPhase(issueDefaults, "company:research").status}\``,
|
|
14518
14682
|
"",
|
|
14519
14683
|
" The issue body must include:",
|
|
14520
14684
|
" - A **discovery source** line naming this person profile",
|
|
@@ -14533,8 +14697,8 @@ function buildPeopleProfileAnalystSubAgent(paths) {
|
|
|
14533
14697
|
"",
|
|
14534
14698
|
" - `type:software-profile`",
|
|
14535
14699
|
" - `software:research`",
|
|
14536
|
-
|
|
14537
|
-
|
|
14700
|
+
` - \`priority:${labelsForPhase(issueDefaults, "software:research").priority}\``,
|
|
14701
|
+
` - \`status:${labelsForPhase(issueDefaults, "software:research").status}\``,
|
|
14538
14702
|
"",
|
|
14539
14703
|
" The issue body must include:",
|
|
14540
14704
|
" - A **discovery source** line naming this person profile",
|
|
@@ -14753,7 +14917,7 @@ function buildPeopleProfileAnalystSubAgent(paths) {
|
|
|
14753
14917
|
].join("\n")
|
|
14754
14918
|
};
|
|
14755
14919
|
}
|
|
14756
|
-
function buildProfilePersonSkill(paths) {
|
|
14920
|
+
function buildProfilePersonSkill(paths, issueDefaults) {
|
|
14757
14921
|
return {
|
|
14758
14922
|
name: "profile-person",
|
|
14759
14923
|
description: "Kick off a people-profile pipeline. Creates a people:research issue for the given person and dispatches Phase 1 (Research) in the people-profile-analyst agent. Phase 3 (Followup) enqueues downstream `company:research` and `software:research` issues for unprofiled, genuinely-relevant entities surfaced in the profile.",
|
|
@@ -14804,7 +14968,7 @@ function buildProfilePersonSkill(paths) {
|
|
|
14804
14968
|
"## Steps",
|
|
14805
14969
|
"",
|
|
14806
14970
|
"1. Create a `people:research` issue with `type:people-profile`,",
|
|
14807
|
-
|
|
14971
|
+
` \`priority:${labelsForPhase(issueDefaults, "people:research").priority}\`, and \`status:${labelsForPhase(issueDefaults, "people:research").status}\`. Body must include the`,
|
|
14808
14972
|
" person's name, selected role, primary company, framing, and any",
|
|
14809
14973
|
" overrides.",
|
|
14810
14974
|
"2. Execute Phase 1 (Research) of the people-profile-analyst agent.",
|
|
@@ -14829,7 +14993,7 @@ function buildProfilePersonSkill(paths) {
|
|
|
14829
14993
|
].join("\n")
|
|
14830
14994
|
};
|
|
14831
14995
|
}
|
|
14832
|
-
function buildRefreshPersonSkill(paths) {
|
|
14996
|
+
function buildRefreshPersonSkill(paths, issueDefaults) {
|
|
14833
14997
|
return {
|
|
14834
14998
|
name: "refresh-person",
|
|
14835
14999
|
description: "Kick off a people-profile refresh cycle. Creates a people:refresh issue for an existing profile and dispatches Phase 4 (Refresh) in the people-profile-analyst agent. Refresh re-verifies the profile's narrow delta set (role, employer, primary public channel) with 3\u20135 targeted web searches and updates it in place. Respects a configurable staleness threshold so profiles younger than the threshold exit early.",
|
|
@@ -14896,7 +15060,7 @@ function buildRefreshPersonSkill(paths) {
|
|
|
14896
15060
|
"## Steps",
|
|
14897
15061
|
"",
|
|
14898
15062
|
"1. Create a `people:refresh` issue with `type:people-profile`,",
|
|
14899
|
-
|
|
15063
|
+
` \`priority:${labelsForPhase(issueDefaults, "people:refresh").priority}\`, and \`status:${labelsForPhase(issueDefaults, "people:refresh").status}\`. Body must include the`,
|
|
14900
15064
|
" profile path and any overrides.",
|
|
14901
15065
|
"2. Execute Phase 4 (Refresh) of the people-profile-analyst agent.",
|
|
14902
15066
|
"",
|
|
@@ -14910,7 +15074,7 @@ function buildRefreshPersonSkill(paths) {
|
|
|
14910
15074
|
].join("\n")
|
|
14911
15075
|
};
|
|
14912
15076
|
}
|
|
14913
|
-
function buildPeopleProfileBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
15077
|
+
function buildPeopleProfileBundle(paths = DEFAULT_AGENT_PATHS, issueDefaults = DEFAULT_RESOLVED_ISSUE_DEFAULTS) {
|
|
14914
15078
|
return {
|
|
14915
15079
|
name: "people-profile",
|
|
14916
15080
|
description: "People research and profiling pipeline: research, draft profile, followup, refresh. Enabled by default; domain-neutral; filesystem-durable between phases. Cross-references existing companies, software, and meeting notes, and Phase 3 (Followup) hands unprofiled, genuinely-relevant companies and software products off to the `company-profile` and `software-profile` bundles via `company:research` and `software:research` issues. Phase 4 (Refresh) re-verifies profiles on a configurable staleness cadence.",
|
|
@@ -14954,8 +15118,11 @@ function buildPeopleProfileBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
|
14954
15118
|
tags: ["workflow"]
|
|
14955
15119
|
}
|
|
14956
15120
|
],
|
|
14957
|
-
skills: [
|
|
14958
|
-
|
|
15121
|
+
skills: [
|
|
15122
|
+
buildProfilePersonSkill(paths, issueDefaults),
|
|
15123
|
+
buildRefreshPersonSkill(paths, issueDefaults)
|
|
15124
|
+
],
|
|
15125
|
+
subAgents: [buildPeopleProfileAnalystSubAgent(paths, issueDefaults)],
|
|
14959
15126
|
labels: [
|
|
14960
15127
|
{
|
|
14961
15128
|
name: "type:people-profile",
|
|
@@ -16985,8 +17152,6 @@ jurisdiction: <federal | state | provincial | international | local>
|
|
|
16985
17152
|
industry: <industry-slug or 'platform'>
|
|
16986
17153
|
---
|
|
16987
17154
|
|
|
16988
|
-
# <Regulation Name>
|
|
16989
|
-
|
|
16990
17155
|
| Field | Value |
|
|
16991
17156
|
|-------|-------|
|
|
16992
17157
|
| **Official name** | <full legal name> |
|
|
@@ -17122,7 +17287,8 @@ var REGULATORY_RESEARCH_REFERENCE_FILES = [
|
|
|
17122
17287
|
content: TEMPLATE_REGULATION
|
|
17123
17288
|
}
|
|
17124
17289
|
];
|
|
17125
|
-
function buildRegulatoryResearchAnalystSubAgent(paths) {
|
|
17290
|
+
function buildRegulatoryResearchAnalystSubAgent(paths, issueDefaults) {
|
|
17291
|
+
void issueDefaults;
|
|
17126
17292
|
return {
|
|
17127
17293
|
name: "regulatory-research-analyst",
|
|
17128
17294
|
description: "Authors jurisdictional compliance research through a 3-phase pipeline (scan \u2192 research \u2192 impact). Enumerates applicable regulations by jurisdiction and business activity, researches each in depth, and produces an impact analysis that hands off actionable obligations to the requirements-analyst as req:scan seeds in the SEC category. One phase per session, tracked by regulatory:* GitHub issue labels with filesystem-based durability between phases.",
|
|
@@ -17357,8 +17523,6 @@ function buildRegulatoryResearchAnalystSubAgent(paths) {
|
|
|
17357
17523
|
" scope: <SCOPE_SLUG>",
|
|
17358
17524
|
" ---",
|
|
17359
17525
|
"",
|
|
17360
|
-
" # Regulatory Scan: <Scope>",
|
|
17361
|
-
"",
|
|
17362
17526
|
" ## Scope Context",
|
|
17363
17527
|
" - **Scope type:** <industry / jurisdiction / platform>",
|
|
17364
17528
|
" - **Scope identifier:** <SCOPE_SLUG>",
|
|
@@ -17409,7 +17573,12 @@ function buildRegulatoryResearchAnalystSubAgent(paths) {
|
|
|
17409
17573
|
"",
|
|
17410
17574
|
"7. **Create or update the scope index page** at",
|
|
17411
17575
|
" `<SCOPE_INDEX_PAGE>` so downstream regulations link back to a",
|
|
17412
|
-
" coherent landing page for the scope.",
|
|
17576
|
+
" coherent landing page for the scope. Follow the",
|
|
17577
|
+
" `stub-index-convention` rule: the body must carry a 1\u20132",
|
|
17578
|
+
" paragraph contextual summary plus a grouped, linked listing of",
|
|
17579
|
+
" every regulation in the scope (e.g. by jurisdiction). No body",
|
|
17580
|
+
" `# Heading` \u2014 the frontmatter `title:` already renders as the",
|
|
17581
|
+
" page H1.",
|
|
17413
17582
|
"",
|
|
17414
17583
|
"8. **Commit and push** the scan report and the scope index page.",
|
|
17415
17584
|
" Close the scan issue.",
|
|
@@ -17679,7 +17848,7 @@ function buildRegulatoryResearchAnalystSubAgent(paths) {
|
|
|
17679
17848
|
].join("\n")
|
|
17680
17849
|
};
|
|
17681
17850
|
}
|
|
17682
|
-
function buildScanRegulatoryLandscapeSkill(paths) {
|
|
17851
|
+
function buildScanRegulatoryLandscapeSkill(paths, issueDefaults) {
|
|
17683
17852
|
return {
|
|
17684
17853
|
name: "scan-regulatory-landscape",
|
|
17685
17854
|
description: "Kick off the scan phase of a regulatory-research campaign. Creates a regulatory:scan issue for the supplied scope (industry, jurisdiction, or platform) and dispatches Phase 1 of the regulatory-research-analyst, which writes a scan report and creates downstream regulatory:research issues.",
|
|
@@ -17726,7 +17895,7 @@ function buildScanRegulatoryLandscapeSkill(paths) {
|
|
|
17726
17895
|
"## Steps",
|
|
17727
17896
|
"",
|
|
17728
17897
|
"1. Create a `regulatory:scan` issue with `type:regulatory-research`,",
|
|
17729
|
-
|
|
17898
|
+
` \`priority:${labelsForPhase(issueDefaults, "regulatory:scan").priority}\`, and \`status:${labelsForPhase(issueDefaults, "regulatory:scan").status}\`. The body must include the`,
|
|
17730
17899
|
" scope slug, the scope type, and any known regulations to include",
|
|
17731
17900
|
" or exclude.",
|
|
17732
17901
|
"2. Execute Phase 1 (Scan) of the regulatory-research-analyst agent.",
|
|
@@ -17743,7 +17912,7 @@ function buildScanRegulatoryLandscapeSkill(paths) {
|
|
|
17743
17912
|
].join("\n")
|
|
17744
17913
|
};
|
|
17745
17914
|
}
|
|
17746
|
-
function buildResearchRegulationSkill(paths) {
|
|
17915
|
+
function buildResearchRegulationSkill(paths, issueDefaults) {
|
|
17747
17916
|
return {
|
|
17748
17917
|
name: "research-regulation",
|
|
17749
17918
|
description: "Kick off the research phase for one regulation. Creates a regulatory:research issue for the supplied scope and regulation and dispatches Phase 2 of the regulatory-research-analyst, which populates the regulation page with scope, triggers, key requirements, jurisdiction variations, enforcement, and penalties using the ship-with regulation-page template.",
|
|
@@ -17802,8 +17971,8 @@ function buildResearchRegulationSkill(paths) {
|
|
|
17802
17971
|
"## Steps",
|
|
17803
17972
|
"",
|
|
17804
17973
|
"1. Create a `regulatory:research` issue with",
|
|
17805
|
-
|
|
17806
|
-
|
|
17974
|
+
` \`type:regulatory-research\`, \`priority:${labelsForPhase(issueDefaults, "regulatory:research").priority}\`, and`,
|
|
17975
|
+
` \`status:${labelsForPhase(issueDefaults, "regulatory:research").status}\`. The body must include the scope slug and the`,
|
|
17807
17976
|
" regulation slug.",
|
|
17808
17977
|
"2. Execute Phase 2 (Research) of the regulatory-research-analyst",
|
|
17809
17978
|
" agent. The agent runs 6\u201312 targeted web searches and populates",
|
|
@@ -17821,7 +17990,7 @@ function buildResearchRegulationSkill(paths) {
|
|
|
17821
17990
|
].join("\n")
|
|
17822
17991
|
};
|
|
17823
17992
|
}
|
|
17824
|
-
function buildImpactRegulationSkill(paths) {
|
|
17993
|
+
function buildImpactRegulationSkill(paths, issueDefaults) {
|
|
17825
17994
|
return {
|
|
17826
17995
|
name: "impact-regulation",
|
|
17827
17996
|
description: "Kick off the impact phase for one regulation. Creates a regulatory:impact issue for the supplied regulation and dispatches Phase 3 of the regulatory-research-analyst, which assesses product impact, documents capability gaps, and hands off each actionable obligation as a req:scan seed in the SEC (security & compliance) category for the requirements-analyst bundle to consume.",
|
|
@@ -17868,8 +18037,8 @@ function buildImpactRegulationSkill(paths) {
|
|
|
17868
18037
|
"## Steps",
|
|
17869
18038
|
"",
|
|
17870
18039
|
"1. Create a `regulatory:impact` issue with",
|
|
17871
|
-
|
|
17872
|
-
|
|
18040
|
+
` \`type:regulatory-research\`, \`priority:${labelsForPhase(issueDefaults, "regulatory:impact").priority}\`, and`,
|
|
18041
|
+
` \`status:${labelsForPhase(issueDefaults, "regulatory:impact").status}\` (or \`status:blocked\` when still dependent on a`,
|
|
17873
18042
|
" Phase 2 research issue). Body must include the regulation page",
|
|
17874
18043
|
" path.",
|
|
17875
18044
|
"2. Execute Phase 3 (Impact) of the regulatory-research-analyst",
|
|
@@ -17890,7 +18059,7 @@ function buildImpactRegulationSkill(paths) {
|
|
|
17890
18059
|
].join("\n")
|
|
17891
18060
|
};
|
|
17892
18061
|
}
|
|
17893
|
-
function buildRegulatoryResearchBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
18062
|
+
function buildRegulatoryResearchBundle(paths = DEFAULT_AGENT_PATHS, issueDefaults = DEFAULT_RESOLVED_ISSUE_DEFAULTS) {
|
|
17894
18063
|
return {
|
|
17895
18064
|
name: "regulatory-research",
|
|
17896
18065
|
description: "Regulatory compliance research pipeline: scan, research, impact. 3 phases with regulatory:* phase labels. Enumerates jurisdictional regulations by industry and activity, researches each in depth with specific section citations, and hands off actionable obligations to the requirements-analyst bundle as req:scan seeds that become SEC (security & compliance) requirements. Enabled by default; domain-neutral; documents obligations without interpreting them; filesystem-durable between phases.",
|
|
@@ -17957,11 +18126,11 @@ function buildRegulatoryResearchBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
|
17957
18126
|
}
|
|
17958
18127
|
],
|
|
17959
18128
|
skills: [
|
|
17960
|
-
buildScanRegulatoryLandscapeSkill(paths),
|
|
17961
|
-
buildResearchRegulationSkill(paths),
|
|
17962
|
-
buildImpactRegulationSkill(paths)
|
|
18129
|
+
buildScanRegulatoryLandscapeSkill(paths, issueDefaults),
|
|
18130
|
+
buildResearchRegulationSkill(paths, issueDefaults),
|
|
18131
|
+
buildImpactRegulationSkill(paths, issueDefaults)
|
|
17963
18132
|
],
|
|
17964
|
-
subAgents: [buildRegulatoryResearchAnalystSubAgent(paths)],
|
|
18133
|
+
subAgents: [buildRegulatoryResearchAnalystSubAgent(paths, issueDefaults)],
|
|
17965
18134
|
labels: [
|
|
17966
18135
|
{
|
|
17967
18136
|
name: "type:regulatory-research",
|
|
@@ -18267,8 +18436,6 @@ function buildRequirementsAnalystSubAgent(paths) {
|
|
|
18267
18436
|
" status: complete",
|
|
18268
18437
|
" ---",
|
|
18269
18438
|
"",
|
|
18270
|
-
" # Requirements Scan: <scope>",
|
|
18271
|
-
"",
|
|
18272
18439
|
" ## Source Documents Reviewed",
|
|
18273
18440
|
" - <path> \u2014 <brief description>",
|
|
18274
18441
|
"",
|
|
@@ -18404,42 +18571,32 @@ function buildRequirementsAnalystSubAgent(paths) {
|
|
|
18404
18571
|
" directory under `<REQUIREMENTS_ROOT>/<category>/` to find the next",
|
|
18405
18572
|
" available `NNN` for each proposed requirement.",
|
|
18406
18573
|
"",
|
|
18407
|
-
"5. **Create requirement issues.** For each proposal
|
|
18574
|
+
"5. **Create requirement issues.** For each proposal, file a",
|
|
18575
|
+
" `req:write` issue using the canonical recipe documented in",
|
|
18576
|
+
" `## Template: req:write` of",
|
|
18577
|
+
" `docs/src/content/docs/agents/issue-templates.md`.",
|
|
18408
18578
|
"",
|
|
18409
18579
|
" All `type:requirement` issues default to `priority:medium` (override",
|
|
18410
18580
|
" only if the proposal's priority was explicitly High or Low). Each",
|
|
18411
18581
|
" issue must also carry the `req:write` phase label plus the matching",
|
|
18412
18582
|
" `tier:*` label so the downstream `requirements-writer` bundle picks",
|
|
18413
|
-
" it up with the correct tier.",
|
|
18583
|
+
" it up with the correct tier. Concretely, the label list includes",
|
|
18584
|
+
' `--label "type:requirement"`, `--label "req:write"`,',
|
|
18585
|
+
' `--label "tier:<tier-slug>"`, `--label "status:ready"`, and',
|
|
18586
|
+
' `--label "priority:medium"`.',
|
|
18414
18587
|
"",
|
|
18415
|
-
"
|
|
18416
|
-
"
|
|
18417
|
-
'
|
|
18418
|
-
' --label "type:requirement" --label "req:write" --label "tier:<tier-slug>" --label "status:ready" --label "priority:medium" \\',
|
|
18419
|
-
' --body "## Objective',
|
|
18420
|
-
" Write <PREFIX>-<NNN> \u2014 <title>.",
|
|
18588
|
+
" The body must carry the three writer-required fields in an",
|
|
18589
|
+
" `## Objective` block, written as bold-prefixed lines so the",
|
|
18590
|
+
" writer's intake parser can pull them out:",
|
|
18421
18591
|
"",
|
|
18422
|
-
"
|
|
18423
|
-
"
|
|
18424
|
-
"
|
|
18592
|
+
" - `**Category:** <BR/FR/NFR/TR/ADR/SEC/DR/INT/OPS/UX/MT>`",
|
|
18593
|
+
" - `**Tier:** <platform/industry/customer-workflow/consumer-app>`",
|
|
18594
|
+
" - `**Output Path:** <REQUIREMENTS_ROOT>/<category-dir>/<PREFIX>-<NNN>-<slug>.md`",
|
|
18425
18595
|
"",
|
|
18426
|
-
"
|
|
18427
|
-
" -
|
|
18428
|
-
"
|
|
18429
|
-
"",
|
|
18430
|
-
" ## Inputs / Read",
|
|
18431
|
-
" - **Depends on:** (none)",
|
|
18432
|
-
" - **Read:** <RESEARCH_REQUIREMENTS_ROOT>/req-proposals-<scope>-<date>.md, <source docs>",
|
|
18433
|
-
"",
|
|
18434
|
-
" ## Acceptance Criteria",
|
|
18435
|
-
" - [ ] Requirement document follows <category> template",
|
|
18436
|
-
" - [ ] Traceability links to source BCM/competitive/product doc",
|
|
18437
|
-
" - [ ] Registry index updated",
|
|
18438
|
-
" - [ ] Decision authority rules followed (direct write vs. proposed)",
|
|
18439
|
-
"",
|
|
18440
|
-
" ## Scope Size",
|
|
18441
|
-
' small"',
|
|
18442
|
-
" ```",
|
|
18596
|
+
" Then under `## Inputs / Read`, list the proposals file",
|
|
18597
|
+
" (`<RESEARCH_REQUIREMENTS_ROOT>/req-proposals-<scope>-<date>.md`)",
|
|
18598
|
+
" and any source documents the writer should consult (BCM model",
|
|
18599
|
+
" docs, competitive analyses, product docs).",
|
|
18443
18600
|
"",
|
|
18444
18601
|
" When one of Category / Tier / Output Path could not be derived",
|
|
18445
18602
|
" from the proposal (for example, the proposal omitted the Tier",
|
|
@@ -18615,8 +18772,6 @@ var TEMPLATE_BR = `---
|
|
|
18615
18772
|
title: "BR-NNN: [Business Requirement Title]"
|
|
18616
18773
|
---
|
|
18617
18774
|
|
|
18618
|
-
# BR-NNN: [Business Requirement Title]
|
|
18619
|
-
|
|
18620
18775
|
## Metadata
|
|
18621
18776
|
|
|
18622
18777
|
| Field | Value |
|
|
@@ -18724,8 +18879,6 @@ var TEMPLATE_FR = `---
|
|
|
18724
18879
|
title: "FR-NNN: [Functional Requirement Title]"
|
|
18725
18880
|
---
|
|
18726
18881
|
|
|
18727
|
-
# FR-NNN: [Functional Requirement Title]
|
|
18728
|
-
|
|
18729
18882
|
## Metadata
|
|
18730
18883
|
|
|
18731
18884
|
| Field | Value |
|
|
@@ -18865,8 +19018,6 @@ var TEMPLATE_NFR = `---
|
|
|
18865
19018
|
title: "NFR-NNN: [Non-Functional Requirement Title]"
|
|
18866
19019
|
---
|
|
18867
19020
|
|
|
18868
|
-
# NFR-NNN: [Non-Functional Requirement Title]
|
|
18869
|
-
|
|
18870
19021
|
## Metadata
|
|
18871
19022
|
|
|
18872
19023
|
| Field | Value |
|
|
@@ -18967,8 +19118,6 @@ var TEMPLATE_TR = `---
|
|
|
18967
19118
|
title: "TR-NNN: [Technical Requirement Title]"
|
|
18968
19119
|
---
|
|
18969
19120
|
|
|
18970
|
-
# TR-NNN: [Technical Requirement Title]
|
|
18971
|
-
|
|
18972
19121
|
## Metadata
|
|
18973
19122
|
|
|
18974
19123
|
| Field | Value |
|
|
@@ -19120,8 +19269,6 @@ var TEMPLATE_ADR = `---
|
|
|
19120
19269
|
title: "ADR-NNN: [Decision Title]"
|
|
19121
19270
|
---
|
|
19122
19271
|
|
|
19123
|
-
# ADR-NNN: [Decision Title]
|
|
19124
|
-
|
|
19125
19272
|
## Metadata
|
|
19126
19273
|
|
|
19127
19274
|
| Field | Value |
|
|
@@ -19250,8 +19397,6 @@ var TEMPLATE_SEC = `---
|
|
|
19250
19397
|
title: "SEC-NNN: [Security Requirement Title]"
|
|
19251
19398
|
---
|
|
19252
19399
|
|
|
19253
|
-
# SEC-NNN: [Security Requirement Title]
|
|
19254
|
-
|
|
19255
19400
|
## Metadata
|
|
19256
19401
|
|
|
19257
19402
|
| Field | Value |
|
|
@@ -19363,8 +19508,6 @@ var TEMPLATE_DR = `---
|
|
|
19363
19508
|
title: "DR-NNN: [Data Requirement Title]"
|
|
19364
19509
|
---
|
|
19365
19510
|
|
|
19366
|
-
# DR-NNN: [Data Requirement Title]
|
|
19367
|
-
|
|
19368
19511
|
## Metadata
|
|
19369
19512
|
|
|
19370
19513
|
| Field | Value |
|
|
@@ -19479,8 +19622,6 @@ var TEMPLATE_INT = `---
|
|
|
19479
19622
|
title: "INT-NNN: [Integration Requirement Title]"
|
|
19480
19623
|
---
|
|
19481
19624
|
|
|
19482
|
-
# INT-NNN: [Integration Requirement Title]
|
|
19483
|
-
|
|
19484
19625
|
## Metadata
|
|
19485
19626
|
|
|
19486
19627
|
| Field | Value |
|
|
@@ -19612,8 +19753,6 @@ var TEMPLATE_OPS = `---
|
|
|
19612
19753
|
title: "OPS-NNN: [Operational Requirement Title]"
|
|
19613
19754
|
---
|
|
19614
19755
|
|
|
19615
|
-
# OPS-NNN: [Operational Requirement Title]
|
|
19616
|
-
|
|
19617
19756
|
## Metadata
|
|
19618
19757
|
|
|
19619
19758
|
| Field | Value |
|
|
@@ -19728,8 +19867,6 @@ var TEMPLATE_UX = `---
|
|
|
19728
19867
|
title: "UX-NNN: [UX Requirement Title]"
|
|
19729
19868
|
---
|
|
19730
19869
|
|
|
19731
|
-
# UX-NNN: [UX Requirement Title]
|
|
19732
|
-
|
|
19733
19870
|
## Metadata
|
|
19734
19871
|
|
|
19735
19872
|
| Field | Value |
|
|
@@ -19846,8 +19983,6 @@ var TEMPLATE_MT = `---
|
|
|
19846
19983
|
title: "MT-NNN: [Multi-Tenancy Requirement Title]"
|
|
19847
19984
|
---
|
|
19848
19985
|
|
|
19849
|
-
# MT-NNN: [Multi-Tenancy Requirement Title]
|
|
19850
|
-
|
|
19851
19986
|
## Metadata
|
|
19852
19987
|
|
|
19853
19988
|
| Field | Value |
|
|
@@ -20000,8 +20135,6 @@ var TEMPLATE_REQUIREMENTS_README = `---
|
|
|
20000
20135
|
title: "[Project Name] \u2014 Requirements Documentation"
|
|
20001
20136
|
---
|
|
20002
20137
|
|
|
20003
|
-
# [Project Name] \u2014 Requirements Documentation
|
|
20004
|
-
|
|
20005
20138
|
This directory contains the structured requirements taxonomy for [Project Name]. It covers the full lifecycle from business intent through operational concerns, providing traceability between strategic goals and implementation work.
|
|
20006
20139
|
|
|
20007
20140
|
## Taxonomy Overview
|
|
@@ -20758,12 +20891,9 @@ function buildRequirementsWriterSubAgent(paths) {
|
|
|
20758
20891
|
"tier: platform",
|
|
20759
20892
|
"---",
|
|
20760
20893
|
"",
|
|
20761
|
-
"# FR-001: User Registration",
|
|
20762
|
-
"",
|
|
20763
20894
|
"...",
|
|
20764
20895
|
"```",
|
|
20765
20896
|
"",
|
|
20766
|
-
"The `title` value must match the document's `# Heading` line.",
|
|
20767
20897
|
"Titles containing colons must be wrapped in double quotes. The",
|
|
20768
20898
|
"`tier` field must be one of `platform`, `industry`,",
|
|
20769
20899
|
"`customer-workflow`, or `consumer-app` (use whatever tier slugs the",
|
|
@@ -22827,8 +22957,6 @@ function buildResearchAnalystSubAgent(paths) {
|
|
|
22827
22957
|
" slice_count: <N>",
|
|
22828
22958
|
" ---",
|
|
22829
22959
|
"",
|
|
22830
|
-
" # Research Scope: <question>",
|
|
22831
|
-
"",
|
|
22832
22960
|
" ## Question",
|
|
22833
22961
|
" <verbatim question from the issue>",
|
|
22834
22962
|
"",
|
|
@@ -22898,8 +23026,6 @@ function buildResearchAnalystSubAgent(paths) {
|
|
|
22898
23026
|
" parent_issue: <N>",
|
|
22899
23027
|
" ---",
|
|
22900
23028
|
"",
|
|
22901
|
-
" # Slice NN: <title>",
|
|
22902
|
-
"",
|
|
22903
23029
|
" ## Question",
|
|
22904
23030
|
" <the slice-level question>",
|
|
22905
23031
|
"",
|
|
@@ -22964,8 +23090,6 @@ function buildResearchAnalystSubAgent(paths) {
|
|
|
22964
23090
|
" slices_read: <count>",
|
|
22965
23091
|
" ---",
|
|
22966
23092
|
"",
|
|
22967
|
-
" # Verification Report: <question>",
|
|
22968
|
-
"",
|
|
22969
23093
|
" ## Acceptance Criteria Coverage",
|
|
22970
23094
|
" - [x] <criterion> \u2014 covered by slice(s) <NN, NN>",
|
|
22971
23095
|
" - [ ] <criterion> \u2014 **not covered**; gap noted in deliverable",
|
|
@@ -23308,7 +23432,7 @@ var slackBundle = {
|
|
|
23308
23432
|
};
|
|
23309
23433
|
|
|
23310
23434
|
// src/agent/bundles/software-profile.ts
|
|
23311
|
-
function buildSoftwareProfileAnalystSubAgent(paths) {
|
|
23435
|
+
function buildSoftwareProfileAnalystSubAgent(paths, issueDefaults) {
|
|
23312
23436
|
return {
|
|
23313
23437
|
name: "software-profile-analyst",
|
|
23314
23438
|
description: "Researches a software product (competitor, adjacent, incumbent, enabler, infrastructure, or ecosystem-tool) from public sources, produces a structured markdown profile, contributes rows to a shared feature matrix ranked against configurable segment-importance weights, maps features back to the BCM capability model and flags unmapped features, then enqueues downstream `bcm:outline`, `company:research`, and `people:research` issues for new sub-capabilities, the vendor company, and primary-attribution founders/leaders surfaced during profiling. One product per session, tracked by software:* GitHub issue labels.",
|
|
@@ -23573,8 +23697,6 @@ function buildSoftwareProfileAnalystSubAgent(paths) {
|
|
|
23573
23697
|
" parent_issue: <N>",
|
|
23574
23698
|
" ---",
|
|
23575
23699
|
"",
|
|
23576
|
-
" # Research Notes: <product name>",
|
|
23577
|
-
"",
|
|
23578
23700
|
" ## Framing",
|
|
23579
23701
|
" <why this product was requested and what to learn>",
|
|
23580
23702
|
"",
|
|
@@ -23635,8 +23757,6 @@ function buildSoftwareProfileAnalystSubAgent(paths) {
|
|
|
23635
23757
|
" notes: <NOTES_DIR>/<PRODUCT_SLUG>.notes.md",
|
|
23636
23758
|
" ---",
|
|
23637
23759
|
"",
|
|
23638
|
-
" # <product name>",
|
|
23639
|
-
"",
|
|
23640
23760
|
" ## Summary",
|
|
23641
23761
|
" <2\u20134 sentence elevator description: what it does, who it's for>",
|
|
23642
23762
|
"",
|
|
@@ -23721,8 +23841,6 @@ function buildSoftwareProfileAnalystSubAgent(paths) {
|
|
|
23721
23841
|
"updated: YYYY-MM-DD",
|
|
23722
23842
|
"---",
|
|
23723
23843
|
"",
|
|
23724
|
-
"# Software Feature Matrix",
|
|
23725
|
-
"",
|
|
23726
23844
|
"| product | feature | <segment-1> | <segment-2> | ... | score | source |",
|
|
23727
23845
|
"|---------|---------|-------------|-------------|-----|-------|--------|",
|
|
23728
23846
|
"| <slug> | <feature-name> | 0\u20131 | 0\u20131 | ... | <weighted-sum> | <profile-path> |",
|
|
@@ -23853,8 +23971,8 @@ function buildSoftwareProfileAnalystSubAgent(paths) {
|
|
|
23853
23971
|
"",
|
|
23854
23972
|
" - `type:bcm-document`",
|
|
23855
23973
|
" - `bcm:outline`",
|
|
23856
|
-
|
|
23857
|
-
|
|
23974
|
+
` - \`priority:${labelsForPhase(issueDefaults, "bcm:outline").priority}\``,
|
|
23975
|
+
` - \`status:${labelsForPhase(issueDefaults, "bcm:outline").status}\``,
|
|
23858
23976
|
"",
|
|
23859
23977
|
" The issue body must include:",
|
|
23860
23978
|
" - A **discovery source** line naming this software profile",
|
|
@@ -23922,7 +24040,7 @@ function buildSoftwareProfileAnalystSubAgent(paths) {
|
|
|
23922
24040
|
" `Follow-up Candidates > Adjacent products to evaluate`. Each new",
|
|
23923
24041
|
" issue follows the same 4-phase pipeline \u2014 start it in the",
|
|
23924
24042
|
" `software:research` phase with `type:software-profile`,",
|
|
23925
|
-
|
|
24043
|
+
` \`priority:${labelsForPhase(issueDefaults, "software:research").priority}\`, and \`status:${labelsForPhase(issueDefaults, "software:research").status}\`.`,
|
|
23926
24044
|
"",
|
|
23927
24045
|
"3. **Enqueue a `company:research` issue for the vendor company** if",
|
|
23928
24046
|
" no matching profile already exists under `<COMPANY_PROFILES_DIR>/`.",
|
|
@@ -23933,8 +24051,8 @@ function buildSoftwareProfileAnalystSubAgent(paths) {
|
|
|
23933
24051
|
"",
|
|
23934
24052
|
" - `type:company-profile`",
|
|
23935
24053
|
" - `company:research`",
|
|
23936
|
-
|
|
23937
|
-
|
|
24054
|
+
` - \`priority:${labelsForPhase(issueDefaults, "company:research").priority}\``,
|
|
24055
|
+
` - \`status:${labelsForPhase(issueDefaults, "company:research").status}\``,
|
|
23938
24056
|
"",
|
|
23939
24057
|
" The issue body must include:",
|
|
23940
24058
|
" - A **discovery source** line naming this software profile",
|
|
@@ -23952,8 +24070,8 @@ function buildSoftwareProfileAnalystSubAgent(paths) {
|
|
|
23952
24070
|
"",
|
|
23953
24071
|
" - `type:people-profile`",
|
|
23954
24072
|
" - `people:research`",
|
|
23955
|
-
|
|
23956
|
-
|
|
24073
|
+
` - \`priority:${labelsForPhase(issueDefaults, "people:research").priority}\``,
|
|
24074
|
+
` - \`status:${labelsForPhase(issueDefaults, "people:research").status}\``,
|
|
23957
24075
|
"",
|
|
23958
24076
|
" The issue body must include:",
|
|
23959
24077
|
" - A **discovery source** line naming this software profile",
|
|
@@ -24096,7 +24214,7 @@ function buildSoftwareProfileAnalystSubAgent(paths) {
|
|
|
24096
24214
|
].join("\n")
|
|
24097
24215
|
};
|
|
24098
24216
|
}
|
|
24099
|
-
function buildProfileSoftwareSkill(paths) {
|
|
24217
|
+
function buildProfileSoftwareSkill(paths, issueDefaults) {
|
|
24100
24218
|
return {
|
|
24101
24219
|
name: "profile-software",
|
|
24102
24220
|
description: "Kick off a software-profile pipeline. Creates a software:research issue for the given product and dispatches Phase 1 (Research) in the software-profile-analyst agent. Phase 4 (Map) writes a BCM capability mapping onto the profile and enqueues `bcm:outline` issues for unmapped features. Phase 5 (Followup) enqueues downstream `company:research` and `people:research` issues for the vendor company and primary-attribution founders/leaders surfaced in the profile.",
|
|
@@ -24143,7 +24261,7 @@ function buildProfileSoftwareSkill(paths) {
|
|
|
24143
24261
|
"## Steps",
|
|
24144
24262
|
"",
|
|
24145
24263
|
"1. Create a `software:research` issue with `type:software-profile`,",
|
|
24146
|
-
|
|
24264
|
+
` \`priority:${labelsForPhase(issueDefaults, "software:research").priority}\`, and \`status:${labelsForPhase(issueDefaults, "software:research").status}\`. Body must include the`,
|
|
24147
24265
|
" product name, selected type, framing, and any overrides.",
|
|
24148
24266
|
"2. Execute Phase 1 (Research) of the software-profile-analyst",
|
|
24149
24267
|
" agent.",
|
|
@@ -24176,7 +24294,7 @@ function buildProfileSoftwareSkill(paths) {
|
|
|
24176
24294
|
].join("\n")
|
|
24177
24295
|
};
|
|
24178
24296
|
}
|
|
24179
|
-
function buildMapSoftwareSkill(paths) {
|
|
24297
|
+
function buildMapSoftwareSkill(paths, issueDefaults) {
|
|
24180
24298
|
return {
|
|
24181
24299
|
name: "map-software",
|
|
24182
24300
|
description: "Kick off a standalone software-capability mapping session. Creates a software:map issue for an already-profiled product and dispatches Phase 4 (Map) in the software-profile-analyst agent. Produces the `## Capability Mapping` section on the profile and enqueues `bcm:outline` issues for unmapped features above the configured threshold.",
|
|
@@ -24231,7 +24349,7 @@ function buildMapSoftwareSkill(paths) {
|
|
|
24231
24349
|
"## Steps",
|
|
24232
24350
|
"",
|
|
24233
24351
|
"1. Create a `software:map` issue with `type:software-profile`,",
|
|
24234
|
-
|
|
24352
|
+
` \`priority:${labelsForPhase(issueDefaults, "software:map").priority}\`, and \`status:${labelsForPhase(issueDefaults, "software:map").status}\`. Body must include the`,
|
|
24235
24353
|
" profile path and any overrides.",
|
|
24236
24354
|
"2. Execute Phase 4 (Map) of the software-profile-analyst agent.",
|
|
24237
24355
|
"3. Phase 4 writes the `## Capability Mapping` section, enqueues",
|
|
@@ -24253,7 +24371,7 @@ function buildMapSoftwareSkill(paths) {
|
|
|
24253
24371
|
].join("\n")
|
|
24254
24372
|
};
|
|
24255
24373
|
}
|
|
24256
|
-
function buildSoftwareProfileBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
24374
|
+
function buildSoftwareProfileBundle(paths = DEFAULT_AGENT_PATHS, issueDefaults = DEFAULT_RESOLVED_ISSUE_DEFAULTS) {
|
|
24257
24375
|
return {
|
|
24258
24376
|
name: "software-profile",
|
|
24259
24377
|
description: "Software research, profiling, feature-matrix, and capability-mapping pipeline: research, profile, matrix, map, followup. Enabled by default; domain-neutral; filesystem-durable between phases; ranks features against configurable segment-importance weights and maps features back to the BCM capability model. Phase 4 (Map) hands unmapped features off to the `bcm-writer` bundle via `bcm:outline` issues. Phase 5 (Followup) hands the vendor company and primary-attribution founders/leaders off to the `company-profile` and `people-profile` bundles via `company:research` and `people:research` issues.",
|
|
@@ -24306,8 +24424,11 @@ function buildSoftwareProfileBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
|
24306
24424
|
tags: ["workflow"]
|
|
24307
24425
|
}
|
|
24308
24426
|
],
|
|
24309
|
-
skills: [
|
|
24310
|
-
|
|
24427
|
+
skills: [
|
|
24428
|
+
buildProfileSoftwareSkill(paths, issueDefaults),
|
|
24429
|
+
buildMapSoftwareSkill(paths, issueDefaults)
|
|
24430
|
+
],
|
|
24431
|
+
subAgents: [buildSoftwareProfileAnalystSubAgent(paths, issueDefaults)],
|
|
24311
24432
|
labels: [
|
|
24312
24433
|
{
|
|
24313
24434
|
name: "type:software-profile",
|
|
@@ -24350,8 +24471,6 @@ title: "<Standard Name>"
|
|
|
24350
24471
|
description: "Overview and cross-version comparison of <Standard Name>."
|
|
24351
24472
|
---
|
|
24352
24473
|
|
|
24353
|
-
# <Standard Name>
|
|
24354
|
-
|
|
24355
24474
|
| Field | Value |
|
|
24356
24475
|
|-------|-------|
|
|
24357
24476
|
| **Standard** | <standard name> |
|
|
@@ -24467,7 +24586,8 @@ var STANDARDS_COMPARE_REFERENCE_FILES = [
|
|
|
24467
24586
|
content: TEMPLATE_COMPARISON_GRID
|
|
24468
24587
|
}
|
|
24469
24588
|
];
|
|
24470
|
-
function buildStandardsResearchAnalystSubAgent(paths) {
|
|
24589
|
+
function buildStandardsResearchAnalystSubAgent(paths, issueDefaults) {
|
|
24590
|
+
void issueDefaults;
|
|
24471
24591
|
return {
|
|
24472
24592
|
name: "standards-research-analyst",
|
|
24473
24593
|
description: "Authors version-aware interoperability standards research through a 5-phase pipeline (scope \u2192 research \u2192 compare \u2192 extension \u2192 organizations). Researches one standard version per session, synthesizes cross-version comparisons, profiles extensions/profiles/implementation guides, and profiles standards-body organizations. Hands off canonical company and people profiles to the company-profile and people-profile bundles via company:research and people:research issues. One phase per session, tracked by standards:* GitHub issue labels with filesystem-based durability between phases.",
|
|
@@ -24669,8 +24789,6 @@ function buildStandardsResearchAnalystSubAgent(paths) {
|
|
|
24669
24789
|
" standard: <STANDARD_SLUG>",
|
|
24670
24790
|
" ---",
|
|
24671
24791
|
"",
|
|
24672
|
-
" # Query Plan: <Standard Name>",
|
|
24673
|
-
"",
|
|
24674
24792
|
" ## Context",
|
|
24675
24793
|
" <1\u20132 paragraphs on why this standard matters to the consuming",
|
|
24676
24794
|
" project and what gaps this research campaign fills.>",
|
|
@@ -24872,7 +24990,14 @@ function buildStandardsResearchAnalystSubAgent(paths) {
|
|
|
24872
24990
|
" the overview page, then populate each section from the version",
|
|
24873
24991
|
" pages.",
|
|
24874
24992
|
"",
|
|
24875
|
-
"4. **Write the overview page** at `<OVERVIEW_PAGE>`.
|
|
24993
|
+
"4. **Write the overview page** at `<OVERVIEW_PAGE>`. Follow",
|
|
24994
|
+
" the `stub-index-convention` rule: the body opens with a",
|
|
24995
|
+
" 1\u20132 paragraph contextual summary of the standard and its",
|
|
24996
|
+
" versions, and the version pages, modules, and extensions",
|
|
24997
|
+
" sections below double as the grouped, linked listing of",
|
|
24998
|
+
" every child page in the standard's folder. No body",
|
|
24999
|
+
" `# Heading` \u2014 the frontmatter `title:` already renders as",
|
|
25000
|
+
" the page H1. Required sections to fill:",
|
|
24876
25001
|
" - **Version Timeline** \u2014 publication dates, status, milestones",
|
|
24877
25002
|
" - **Module / Resource Maturity Progression** \u2014 matrix with",
|
|
24878
25003
|
" modules as rows and versions as columns, using the standard's",
|
|
@@ -25249,7 +25374,7 @@ function buildStandardsResearchAnalystSubAgent(paths) {
|
|
|
25249
25374
|
].join("\n")
|
|
25250
25375
|
};
|
|
25251
25376
|
}
|
|
25252
|
-
function buildScopeStandardsResearchSkill(paths) {
|
|
25377
|
+
function buildScopeStandardsResearchSkill(paths, issueDefaults) {
|
|
25253
25378
|
return {
|
|
25254
25379
|
name: "scope-standards-research",
|
|
25255
25380
|
description: "Kick off the scope phase of an interoperability-standards research campaign. Creates a standards:scope issue for the supplied standard and dispatches Phase 1 of the standards-research-analyst, which writes a query plan and creates downstream standards:research, standards:compare, and standards:organizations issues.",
|
|
@@ -25296,7 +25421,7 @@ function buildScopeStandardsResearchSkill(paths) {
|
|
|
25296
25421
|
"## Steps",
|
|
25297
25422
|
"",
|
|
25298
25423
|
"1. Create a `standards:scope` issue with `type:standards-research`,",
|
|
25299
|
-
|
|
25424
|
+
` \`priority:${labelsForPhase(issueDefaults, "standards:scope").priority}\`, and \`status:${labelsForPhase(issueDefaults, "standards:scope").status}\`. The body must include the`,
|
|
25300
25425
|
" standard slug, the list of target versions (or a request to",
|
|
25301
25426
|
" enumerate), and any known governance bodies.",
|
|
25302
25427
|
"2. Execute Phase 1 (Scope) of the standards-research-analyst agent.",
|
|
@@ -25315,7 +25440,7 @@ function buildScopeStandardsResearchSkill(paths) {
|
|
|
25315
25440
|
].join("\n")
|
|
25316
25441
|
};
|
|
25317
25442
|
}
|
|
25318
|
-
function buildResearchStandardSkill(paths) {
|
|
25443
|
+
function buildResearchStandardSkill(paths, issueDefaults) {
|
|
25319
25444
|
return {
|
|
25320
25445
|
name: "research-standard",
|
|
25321
25446
|
description: "Kick off the research phase for one version of an interoperability standard. Creates a standards:research issue for the supplied standard and version and dispatches Phase 2 of the standards-research-analyst, which populates the version page with status, key changes, resources, adoption, and governance touch-points.",
|
|
@@ -25361,7 +25486,7 @@ function buildResearchStandardSkill(paths) {
|
|
|
25361
25486
|
"## Steps",
|
|
25362
25487
|
"",
|
|
25363
25488
|
"1. Create a `standards:research` issue with",
|
|
25364
|
-
|
|
25489
|
+
` \`type:standards-research\`, \`priority:${labelsForPhase(issueDefaults, "standards:research").priority}\`, and \`status:${labelsForPhase(issueDefaults, "standards:research").status}\`.`,
|
|
25365
25490
|
" The body must include the standard slug and the version slug.",
|
|
25366
25491
|
"2. Execute Phase 2 (Research) of the standards-research-analyst",
|
|
25367
25492
|
" agent. The agent runs 6\u201310 targeted web searches and populates",
|
|
@@ -25380,7 +25505,7 @@ function buildResearchStandardSkill(paths) {
|
|
|
25380
25505
|
].join("\n")
|
|
25381
25506
|
};
|
|
25382
25507
|
}
|
|
25383
|
-
function buildCompareStandardsSkill(paths) {
|
|
25508
|
+
function buildCompareStandardsSkill(paths, issueDefaults) {
|
|
25384
25509
|
return {
|
|
25385
25510
|
name: "compare-standards",
|
|
25386
25511
|
description: "Kick off the compare phase across researched versions of an interoperability standard. Creates a standards:compare issue for the supplied standard and dispatches Phase 3 of the standards-research-analyst, which synthesizes the overview page using the ship-with comparison-grid template.",
|
|
@@ -25433,7 +25558,7 @@ function buildCompareStandardsSkill(paths) {
|
|
|
25433
25558
|
"## Steps",
|
|
25434
25559
|
"",
|
|
25435
25560
|
"1. Create a `standards:compare` issue with",
|
|
25436
|
-
|
|
25561
|
+
` \`type:standards-research\`, \`priority:${labelsForPhase(issueDefaults, "standards:compare").priority}\`, and \`status:${labelsForPhase(issueDefaults, "standards:compare").status}\`.`,
|
|
25437
25562
|
" Body must include the standard slug and the list of version",
|
|
25438
25563
|
" pages under comparison.",
|
|
25439
25564
|
"2. Execute Phase 3 (Compare) of the standards-research-analyst",
|
|
@@ -25450,7 +25575,7 @@ function buildCompareStandardsSkill(paths) {
|
|
|
25450
25575
|
].join("\n")
|
|
25451
25576
|
};
|
|
25452
25577
|
}
|
|
25453
|
-
function buildExtensionStandardSkill(paths) {
|
|
25578
|
+
function buildExtensionStandardSkill(paths, issueDefaults) {
|
|
25454
25579
|
return {
|
|
25455
25580
|
name: "extension-standard",
|
|
25456
25581
|
description: "Kick off the extension phase for one domain entity against an interoperability standard. Creates a standards:extension issue for the supplied standard and domain entity and dispatches Phase 4 of the standards-research-analyst, which analyzes the gap and hands off a Proposed ADR to the requirements pipeline.",
|
|
@@ -25500,7 +25625,7 @@ function buildExtensionStandardSkill(paths) {
|
|
|
25500
25625
|
"## Steps",
|
|
25501
25626
|
"",
|
|
25502
25627
|
"1. Create a `standards:extension` issue with",
|
|
25503
|
-
|
|
25628
|
+
` \`type:standards-research\`, \`priority:${labelsForPhase(issueDefaults, "standards:extension").priority}\`, and \`status:${labelsForPhase(issueDefaults, "standards:extension").status}\`.`,
|
|
25504
25629
|
" The body must include the standard slug, the entity slug, the",
|
|
25505
25630
|
" closest resource, and a link to the source BCM or canvas",
|
|
25506
25631
|
" document.",
|
|
@@ -25520,7 +25645,7 @@ function buildExtensionStandardSkill(paths) {
|
|
|
25520
25645
|
].join("\n")
|
|
25521
25646
|
};
|
|
25522
25647
|
}
|
|
25523
|
-
function buildOrganizationsStandardSkill(paths) {
|
|
25648
|
+
function buildOrganizationsStandardSkill(paths, issueDefaults) {
|
|
25524
25649
|
return {
|
|
25525
25650
|
name: "organizations-standard",
|
|
25526
25651
|
description: "Kick off the organizations phase for one standards-body organization. Creates a standards:organizations issue for the supplied standard and organization and dispatches Phase 5 of the standards-research-analyst, which writes a standards-organization page and hands off canonical company and people profiles to the company-profile and people-profile bundles.",
|
|
@@ -25566,7 +25691,7 @@ function buildOrganizationsStandardSkill(paths) {
|
|
|
25566
25691
|
"## Steps",
|
|
25567
25692
|
"",
|
|
25568
25693
|
"1. Create a `standards:organizations` issue with",
|
|
25569
|
-
|
|
25694
|
+
` \`type:standards-research\`, \`priority:${labelsForPhase(issueDefaults, "standards:organizations").priority}\`, and \`status:${labelsForPhase(issueDefaults, "standards:organizations").status}\`.`,
|
|
25570
25695
|
" Body must include the standard slug, the organization slug, and",
|
|
25571
25696
|
" the organization's governance role.",
|
|
25572
25697
|
"2. Execute Phase 5 (Organizations) of the",
|
|
@@ -25587,7 +25712,7 @@ function buildOrganizationsStandardSkill(paths) {
|
|
|
25587
25712
|
].join("\n")
|
|
25588
25713
|
};
|
|
25589
25714
|
}
|
|
25590
|
-
function buildStandardsResearchBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
25715
|
+
function buildStandardsResearchBundle(paths = DEFAULT_AGENT_PATHS, issueDefaults = DEFAULT_RESOLVED_ISSUE_DEFAULTS) {
|
|
25591
25716
|
return {
|
|
25592
25717
|
name: "standards-research",
|
|
25593
25718
|
description: "Interoperability-standards research pipeline: scope, research, compare, extension, organizations. 5 phases with standards:* phase labels. Version-aware research, cross-version comparison, extension/profile profiling, and standards-body organization profiling. Hands off canonical profiles to company-profile and people-profile via company:research and people:research issues, extension ADRs to requirements-writer via req:write, and domain-entity mappings to bcm-writer. Enabled by default; domain-neutral; filesystem-durable between phases.",
|
|
@@ -25653,13 +25778,13 @@ function buildStandardsResearchBundle(paths = DEFAULT_AGENT_PATHS) {
|
|
|
25653
25778
|
}
|
|
25654
25779
|
],
|
|
25655
25780
|
skills: [
|
|
25656
|
-
buildScopeStandardsResearchSkill(paths),
|
|
25657
|
-
buildResearchStandardSkill(paths),
|
|
25658
|
-
buildCompareStandardsSkill(paths),
|
|
25659
|
-
buildExtensionStandardSkill(paths),
|
|
25660
|
-
buildOrganizationsStandardSkill(paths)
|
|
25781
|
+
buildScopeStandardsResearchSkill(paths, issueDefaults),
|
|
25782
|
+
buildResearchStandardSkill(paths, issueDefaults),
|
|
25783
|
+
buildCompareStandardsSkill(paths, issueDefaults),
|
|
25784
|
+
buildExtensionStandardSkill(paths, issueDefaults),
|
|
25785
|
+
buildOrganizationsStandardSkill(paths, issueDefaults)
|
|
25661
25786
|
],
|
|
25662
|
-
subAgents: [buildStandardsResearchAnalystSubAgent(paths)],
|
|
25787
|
+
subAgents: [buildStandardsResearchAnalystSubAgent(paths, issueDefaults)],
|
|
25663
25788
|
labels: [
|
|
25664
25789
|
{
|
|
25665
25790
|
name: "type:standards-research",
|
|
@@ -26883,7 +27008,7 @@ function renderPriorityRulesSection(rules) {
|
|
|
26883
27008
|
}
|
|
26884
27009
|
|
|
26885
27010
|
// src/agent/bundles/index.ts
|
|
26886
|
-
function buildBuiltInBundles(paths = DEFAULT_AGENT_PATHS) {
|
|
27011
|
+
function buildBuiltInBundles(paths = DEFAULT_AGENT_PATHS, issueDefaults = DEFAULT_RESOLVED_ISSUE_DEFAULTS) {
|
|
26887
27012
|
return [
|
|
26888
27013
|
buildBaseBundle(paths),
|
|
26889
27014
|
upstreamConfigulatorDocsBundle,
|
|
@@ -26904,15 +27029,15 @@ function buildBuiltInBundles(paths = DEFAULT_AGENT_PATHS) {
|
|
|
26904
27029
|
buildRequirementsWriterBundle(paths),
|
|
26905
27030
|
buildRequirementsReviewerBundle(paths),
|
|
26906
27031
|
buildResearchPipelineBundle(paths),
|
|
26907
|
-
buildCompanyProfileBundle(paths),
|
|
26908
|
-
buildCustomerProfileBundle(paths),
|
|
26909
|
-
buildPeopleProfileBundle(paths),
|
|
26910
|
-
buildSoftwareProfileBundle(paths),
|
|
26911
|
-
buildIndustryDiscoveryBundle(paths),
|
|
27032
|
+
buildCompanyProfileBundle(paths, issueDefaults),
|
|
27033
|
+
buildCustomerProfileBundle(paths, issueDefaults),
|
|
27034
|
+
buildPeopleProfileBundle(paths, issueDefaults),
|
|
27035
|
+
buildSoftwareProfileBundle(paths, issueDefaults),
|
|
27036
|
+
buildIndustryDiscoveryBundle(paths, issueDefaults),
|
|
26912
27037
|
buildBusinessModelsBundle(paths),
|
|
26913
27038
|
buildBcmWriterBundle(paths),
|
|
26914
|
-
buildStandardsResearchBundle(paths),
|
|
26915
|
-
buildRegulatoryResearchBundle(paths),
|
|
27039
|
+
buildStandardsResearchBundle(paths, issueDefaults),
|
|
27040
|
+
buildRegulatoryResearchBundle(paths, issueDefaults),
|
|
26916
27041
|
buildMaintenanceAuditBundle(paths),
|
|
26917
27042
|
buildDocsSyncBundle(paths)
|
|
26918
27043
|
];
|
|
@@ -26951,6 +27076,152 @@ function prefix(rel, entry) {
|
|
|
26951
27076
|
return path.posix.join(rel, entry);
|
|
26952
27077
|
}
|
|
26953
27078
|
|
|
27079
|
+
// src/agent/renderers/cursor-renderer.ts
|
|
27080
|
+
import { JsonFile as JsonFile2 } from "projen";
|
|
27081
|
+
import { TextFile as TextFile2 } from "projen/lib/textfile";
|
|
27082
|
+
var GENERATED_MARKER = "# ~~ Generated by @codedrifters/configulator. Edits welcome \u2014 please contribute improvements back. ~~";
|
|
27083
|
+
var CursorRenderer = class _CursorRenderer {
|
|
27084
|
+
/**
|
|
27085
|
+
* Render all Cursor configuration files.
|
|
27086
|
+
*/
|
|
27087
|
+
static render(component, rules, skills, subAgents, mcpServers, settings) {
|
|
27088
|
+
_CursorRenderer.renderRules(component, rules);
|
|
27089
|
+
_CursorRenderer.renderSkills(component, skills);
|
|
27090
|
+
_CursorRenderer.renderSubAgents(component, subAgents);
|
|
27091
|
+
_CursorRenderer.renderMcpServers(component, mcpServers);
|
|
27092
|
+
_CursorRenderer.renderHooks(component, settings);
|
|
27093
|
+
_CursorRenderer.renderIgnoreFiles(component, settings);
|
|
27094
|
+
}
|
|
27095
|
+
static renderRules(component, rules) {
|
|
27096
|
+
for (const rule of rules) {
|
|
27097
|
+
if (rule.platforms?.cursor?.exclude) continue;
|
|
27098
|
+
const lines = [];
|
|
27099
|
+
const description = rule.platforms?.cursor?.description ?? rule.description;
|
|
27100
|
+
const isAlways = rule.scope === AGENT_RULE_SCOPE.ALWAYS;
|
|
27101
|
+
lines.push("---");
|
|
27102
|
+
lines.push(`description: "${description}"`);
|
|
27103
|
+
lines.push(`alwaysApply: ${isAlways}`);
|
|
27104
|
+
if (!isAlways && rule.filePatterns && rule.filePatterns.length > 0) {
|
|
27105
|
+
lines.push(`path: ${JSON.stringify([...rule.filePatterns])}`);
|
|
27106
|
+
}
|
|
27107
|
+
lines.push("---");
|
|
27108
|
+
lines.push("");
|
|
27109
|
+
lines.push(...rule.content.split("\n"));
|
|
27110
|
+
new TextFile2(component, `.cursor/rules/${rule.name}.mdc`, { lines });
|
|
27111
|
+
}
|
|
27112
|
+
}
|
|
27113
|
+
static renderSkills(component, skills) {
|
|
27114
|
+
for (const skill of skills) {
|
|
27115
|
+
if (skill.platforms?.cursor?.exclude) continue;
|
|
27116
|
+
const lines = [];
|
|
27117
|
+
lines.push("---");
|
|
27118
|
+
lines.push(`name: "${skill.name}"`);
|
|
27119
|
+
lines.push(`description: "${skill.description}"`);
|
|
27120
|
+
if (skill.disableModelInvocation) {
|
|
27121
|
+
lines.push(`disable-model-invocation: true`);
|
|
27122
|
+
}
|
|
27123
|
+
if (skill.userInvocable === false) {
|
|
27124
|
+
lines.push(`user-invocable: false`);
|
|
27125
|
+
}
|
|
27126
|
+
if (skill.context) {
|
|
27127
|
+
lines.push(`context: "${skill.context}"`);
|
|
27128
|
+
}
|
|
27129
|
+
if (skill.agent) {
|
|
27130
|
+
lines.push(`agent: "${skill.agent}"`);
|
|
27131
|
+
}
|
|
27132
|
+
if (skill.shell) {
|
|
27133
|
+
lines.push(`shell: "${skill.shell}"`);
|
|
27134
|
+
}
|
|
27135
|
+
if (skill.allowedTools && skill.allowedTools.length > 0) {
|
|
27136
|
+
lines.push(`allowed-tools:`);
|
|
27137
|
+
for (const tool of skill.allowedTools) {
|
|
27138
|
+
lines.push(` - "${tool}"`);
|
|
27139
|
+
}
|
|
27140
|
+
}
|
|
27141
|
+
lines.push("---");
|
|
27142
|
+
lines.push("");
|
|
27143
|
+
lines.push(...skill.instructions.split("\n"));
|
|
27144
|
+
new TextFile2(component, `.cursor/skills/${skill.name}/SKILL.md`, {
|
|
27145
|
+
lines
|
|
27146
|
+
});
|
|
27147
|
+
if (skill.referenceFiles && skill.referenceFiles.length > 0) {
|
|
27148
|
+
for (const file of skill.referenceFiles) {
|
|
27149
|
+
new TextFile2(component, `.cursor/skills/${skill.name}/${file.path}`, {
|
|
27150
|
+
lines: file.content.split("\n")
|
|
27151
|
+
});
|
|
27152
|
+
}
|
|
27153
|
+
}
|
|
27154
|
+
}
|
|
27155
|
+
}
|
|
27156
|
+
static renderSubAgents(component, subAgents) {
|
|
27157
|
+
for (const agent of subAgents) {
|
|
27158
|
+
if (agent.platforms?.cursor?.exclude) continue;
|
|
27159
|
+
const lines = [];
|
|
27160
|
+
lines.push("---");
|
|
27161
|
+
lines.push(`name: ${agent.name}`);
|
|
27162
|
+
lines.push(`description: >-`);
|
|
27163
|
+
lines.push(` ${agent.description}`);
|
|
27164
|
+
if (agent.platforms?.cursor?.readonly) {
|
|
27165
|
+
lines.push(`readonly: true`);
|
|
27166
|
+
}
|
|
27167
|
+
if (agent.platforms?.cursor?.isBackground) {
|
|
27168
|
+
lines.push(`is_background: true`);
|
|
27169
|
+
}
|
|
27170
|
+
lines.push("---");
|
|
27171
|
+
lines.push("");
|
|
27172
|
+
lines.push(...agent.prompt.split("\n"));
|
|
27173
|
+
new TextFile2(component, `.cursor/agents/${agent.name}.md`, { lines });
|
|
27174
|
+
}
|
|
27175
|
+
}
|
|
27176
|
+
static renderMcpServers(component, mcpServers) {
|
|
27177
|
+
const serverNames = Object.keys(mcpServers);
|
|
27178
|
+
if (serverNames.length === 0) return;
|
|
27179
|
+
const obj = { mcpServers: {} };
|
|
27180
|
+
const servers = obj.mcpServers;
|
|
27181
|
+
for (const [name, config] of Object.entries(mcpServers)) {
|
|
27182
|
+
const server = {};
|
|
27183
|
+
if (config.transport) server.transport = config.transport;
|
|
27184
|
+
if (config.command) server.command = config.command;
|
|
27185
|
+
if (config.args) server.args = [...config.args];
|
|
27186
|
+
if (config.url) server.url = config.url;
|
|
27187
|
+
if (config.headers && Object.keys(config.headers).length > 0) {
|
|
27188
|
+
server.headers = { ...config.headers };
|
|
27189
|
+
}
|
|
27190
|
+
if (config.env) server.env = { ...config.env };
|
|
27191
|
+
servers[name] = server;
|
|
27192
|
+
}
|
|
27193
|
+
new JsonFile2(component, ".cursor/mcp.json", { obj });
|
|
27194
|
+
}
|
|
27195
|
+
static renderHooks(component, settings) {
|
|
27196
|
+
if (!settings?.hooks) return;
|
|
27197
|
+
const hooks = {};
|
|
27198
|
+
const hookEntries = settings.hooks;
|
|
27199
|
+
for (const [event, actions] of Object.entries(hookEntries)) {
|
|
27200
|
+
if (actions && actions.length > 0) {
|
|
27201
|
+
hooks[event] = actions.map((h) => ({
|
|
27202
|
+
command: h.command
|
|
27203
|
+
}));
|
|
27204
|
+
}
|
|
27205
|
+
}
|
|
27206
|
+
if (Object.keys(hooks).length === 0) return;
|
|
27207
|
+
new JsonFile2(component, ".cursor/hooks.json", {
|
|
27208
|
+
obj: { version: 1, hooks }
|
|
27209
|
+
});
|
|
27210
|
+
}
|
|
27211
|
+
static renderIgnoreFiles(component, settings) {
|
|
27212
|
+
if (settings?.ignorePatterns && settings.ignorePatterns.length > 0) {
|
|
27213
|
+
new TextFile2(component, ".cursorignore", {
|
|
27214
|
+
lines: [GENERATED_MARKER, "", ...settings.ignorePatterns]
|
|
27215
|
+
});
|
|
27216
|
+
}
|
|
27217
|
+
if (settings?.indexingIgnorePatterns && settings.indexingIgnorePatterns.length > 0) {
|
|
27218
|
+
new TextFile2(component, ".cursorindexingignore", {
|
|
27219
|
+
lines: [GENERATED_MARKER, "", ...settings.indexingIgnorePatterns]
|
|
27220
|
+
});
|
|
27221
|
+
}
|
|
27222
|
+
}
|
|
27223
|
+
};
|
|
27224
|
+
|
|
26954
27225
|
// src/agent/template-resolver.ts
|
|
26955
27226
|
var FALLBACKS = {
|
|
26956
27227
|
"repository.owner": "<owner>",
|
|
@@ -27006,9 +27277,9 @@ function resolveTemplateVariables(template, metadata) {
|
|
|
27006
27277
|
}
|
|
27007
27278
|
|
|
27008
27279
|
// src/agent/renderers/claude-renderer.ts
|
|
27009
|
-
import { JsonFile as
|
|
27010
|
-
import { TextFile as
|
|
27011
|
-
var
|
|
27280
|
+
import { JsonFile as JsonFile3 } from "projen";
|
|
27281
|
+
import { TextFile as TextFile3 } from "projen/lib/textfile";
|
|
27282
|
+
var GENERATED_MARKER2 = "<!-- ~~ Generated by @codedrifters/configulator. Edits welcome \u2014 please contribute improvements back. ~~ -->";
|
|
27012
27283
|
var ClaudeRenderer = class _ClaudeRenderer {
|
|
27013
27284
|
/**
|
|
27014
27285
|
* Render all Claude Code configuration files.
|
|
@@ -27030,12 +27301,12 @@ var ClaudeRenderer = class _ClaudeRenderer {
|
|
|
27030
27301
|
return target === CLAUDE_RULE_TARGET.CLAUDE_MD;
|
|
27031
27302
|
});
|
|
27032
27303
|
if (claudeMdRules.length === 0) return;
|
|
27033
|
-
const lines = [
|
|
27304
|
+
const lines = [GENERATED_MARKER2, ""];
|
|
27034
27305
|
for (let i = 0; i < claudeMdRules.length; i++) {
|
|
27035
27306
|
if (i > 0) lines.push("", "---", "");
|
|
27036
27307
|
lines.push(...claudeMdRules[i].content.split("\n"));
|
|
27037
27308
|
}
|
|
27038
|
-
new
|
|
27309
|
+
new TextFile3(component, "CLAUDE.md", { lines });
|
|
27039
27310
|
}
|
|
27040
27311
|
static renderScopedRules(component, rules) {
|
|
27041
27312
|
const scopedRules = rules.filter((r) => {
|
|
@@ -27055,7 +27326,7 @@ var ClaudeRenderer = class _ClaudeRenderer {
|
|
|
27055
27326
|
lines.push("");
|
|
27056
27327
|
}
|
|
27057
27328
|
lines.push(...rule.content.split("\n"));
|
|
27058
|
-
new
|
|
27329
|
+
new TextFile3(component, `.claude/rules/${rule.name}.md`, { lines });
|
|
27059
27330
|
}
|
|
27060
27331
|
}
|
|
27061
27332
|
static renderSettings(component, mcpServers, settings) {
|
|
@@ -27180,7 +27451,7 @@ var ClaudeRenderer = class _ClaudeRenderer {
|
|
|
27180
27451
|
hasContent = true;
|
|
27181
27452
|
}
|
|
27182
27453
|
if (!hasContent) return;
|
|
27183
|
-
new
|
|
27454
|
+
new JsonFile3(component, ".claude/settings.json", { obj });
|
|
27184
27455
|
}
|
|
27185
27456
|
static buildSandboxObj(sandbox) {
|
|
27186
27457
|
const obj = {};
|
|
@@ -27267,12 +27538,12 @@ var ClaudeRenderer = class _ClaudeRenderer {
|
|
|
27267
27538
|
lines.push("---");
|
|
27268
27539
|
lines.push("");
|
|
27269
27540
|
lines.push(...skill.instructions.split("\n"));
|
|
27270
|
-
new
|
|
27541
|
+
new TextFile3(component, `.claude/skills/${skill.name}/SKILL.md`, {
|
|
27271
27542
|
lines
|
|
27272
27543
|
});
|
|
27273
27544
|
if (skill.referenceFiles && skill.referenceFiles.length > 0) {
|
|
27274
27545
|
for (const file of skill.referenceFiles) {
|
|
27275
|
-
new
|
|
27546
|
+
new TextFile3(component, `.claude/skills/${skill.name}/${file.path}`, {
|
|
27276
27547
|
lines: file.content.split("\n")
|
|
27277
27548
|
});
|
|
27278
27549
|
}
|
|
@@ -27330,7 +27601,7 @@ var ClaudeRenderer = class _ClaudeRenderer {
|
|
|
27330
27601
|
lines.push("---");
|
|
27331
27602
|
lines.push("");
|
|
27332
27603
|
lines.push(...agent.prompt.split("\n"));
|
|
27333
|
-
new
|
|
27604
|
+
new TextFile3(component, `.claude/agents/${agent.name}.md`, { lines });
|
|
27334
27605
|
}
|
|
27335
27606
|
}
|
|
27336
27607
|
static buildMcpServerObj(config) {
|
|
@@ -27347,7 +27618,7 @@ var ClaudeRenderer = class _ClaudeRenderer {
|
|
|
27347
27618
|
}
|
|
27348
27619
|
static renderProcedures(component, procedures) {
|
|
27349
27620
|
for (const proc of procedures) {
|
|
27350
|
-
new
|
|
27621
|
+
new TextFile3(component, `.claude/procedures/${proc.name}`, {
|
|
27351
27622
|
lines: proc.content.split("\n"),
|
|
27352
27623
|
executable: true
|
|
27353
27624
|
});
|
|
@@ -27374,152 +27645,6 @@ var CopilotRenderer = class {
|
|
|
27374
27645
|
}
|
|
27375
27646
|
};
|
|
27376
27647
|
|
|
27377
|
-
// src/agent/renderers/cursor-renderer.ts
|
|
27378
|
-
import { JsonFile as JsonFile3 } from "projen";
|
|
27379
|
-
import { TextFile as TextFile3 } from "projen/lib/textfile";
|
|
27380
|
-
var GENERATED_MARKER2 = "# ~~ Generated by @codedrifters/configulator. Edits welcome \u2014 please contribute improvements back. ~~";
|
|
27381
|
-
var CursorRenderer = class _CursorRenderer {
|
|
27382
|
-
/**
|
|
27383
|
-
* Render all Cursor configuration files.
|
|
27384
|
-
*/
|
|
27385
|
-
static render(component, rules, skills, subAgents, mcpServers, settings) {
|
|
27386
|
-
_CursorRenderer.renderRules(component, rules);
|
|
27387
|
-
_CursorRenderer.renderSkills(component, skills);
|
|
27388
|
-
_CursorRenderer.renderSubAgents(component, subAgents);
|
|
27389
|
-
_CursorRenderer.renderMcpServers(component, mcpServers);
|
|
27390
|
-
_CursorRenderer.renderHooks(component, settings);
|
|
27391
|
-
_CursorRenderer.renderIgnoreFiles(component, settings);
|
|
27392
|
-
}
|
|
27393
|
-
static renderRules(component, rules) {
|
|
27394
|
-
for (const rule of rules) {
|
|
27395
|
-
if (rule.platforms?.cursor?.exclude) continue;
|
|
27396
|
-
const lines = [];
|
|
27397
|
-
const description = rule.platforms?.cursor?.description ?? rule.description;
|
|
27398
|
-
const isAlways = rule.scope === AGENT_RULE_SCOPE.ALWAYS;
|
|
27399
|
-
lines.push("---");
|
|
27400
|
-
lines.push(`description: "${description}"`);
|
|
27401
|
-
lines.push(`alwaysApply: ${isAlways}`);
|
|
27402
|
-
if (!isAlways && rule.filePatterns && rule.filePatterns.length > 0) {
|
|
27403
|
-
lines.push(`path: ${JSON.stringify([...rule.filePatterns])}`);
|
|
27404
|
-
}
|
|
27405
|
-
lines.push("---");
|
|
27406
|
-
lines.push("");
|
|
27407
|
-
lines.push(...rule.content.split("\n"));
|
|
27408
|
-
new TextFile3(component, `.cursor/rules/${rule.name}.mdc`, { lines });
|
|
27409
|
-
}
|
|
27410
|
-
}
|
|
27411
|
-
static renderSkills(component, skills) {
|
|
27412
|
-
for (const skill of skills) {
|
|
27413
|
-
if (skill.platforms?.cursor?.exclude) continue;
|
|
27414
|
-
const lines = [];
|
|
27415
|
-
lines.push("---");
|
|
27416
|
-
lines.push(`name: "${skill.name}"`);
|
|
27417
|
-
lines.push(`description: "${skill.description}"`);
|
|
27418
|
-
if (skill.disableModelInvocation) {
|
|
27419
|
-
lines.push(`disable-model-invocation: true`);
|
|
27420
|
-
}
|
|
27421
|
-
if (skill.userInvocable === false) {
|
|
27422
|
-
lines.push(`user-invocable: false`);
|
|
27423
|
-
}
|
|
27424
|
-
if (skill.context) {
|
|
27425
|
-
lines.push(`context: "${skill.context}"`);
|
|
27426
|
-
}
|
|
27427
|
-
if (skill.agent) {
|
|
27428
|
-
lines.push(`agent: "${skill.agent}"`);
|
|
27429
|
-
}
|
|
27430
|
-
if (skill.shell) {
|
|
27431
|
-
lines.push(`shell: "${skill.shell}"`);
|
|
27432
|
-
}
|
|
27433
|
-
if (skill.allowedTools && skill.allowedTools.length > 0) {
|
|
27434
|
-
lines.push(`allowed-tools:`);
|
|
27435
|
-
for (const tool of skill.allowedTools) {
|
|
27436
|
-
lines.push(` - "${tool}"`);
|
|
27437
|
-
}
|
|
27438
|
-
}
|
|
27439
|
-
lines.push("---");
|
|
27440
|
-
lines.push("");
|
|
27441
|
-
lines.push(...skill.instructions.split("\n"));
|
|
27442
|
-
new TextFile3(component, `.cursor/skills/${skill.name}/SKILL.md`, {
|
|
27443
|
-
lines
|
|
27444
|
-
});
|
|
27445
|
-
if (skill.referenceFiles && skill.referenceFiles.length > 0) {
|
|
27446
|
-
for (const file of skill.referenceFiles) {
|
|
27447
|
-
new TextFile3(component, `.cursor/skills/${skill.name}/${file.path}`, {
|
|
27448
|
-
lines: file.content.split("\n")
|
|
27449
|
-
});
|
|
27450
|
-
}
|
|
27451
|
-
}
|
|
27452
|
-
}
|
|
27453
|
-
}
|
|
27454
|
-
static renderSubAgents(component, subAgents) {
|
|
27455
|
-
for (const agent of subAgents) {
|
|
27456
|
-
if (agent.platforms?.cursor?.exclude) continue;
|
|
27457
|
-
const lines = [];
|
|
27458
|
-
lines.push("---");
|
|
27459
|
-
lines.push(`name: ${agent.name}`);
|
|
27460
|
-
lines.push(`description: >-`);
|
|
27461
|
-
lines.push(` ${agent.description}`);
|
|
27462
|
-
if (agent.platforms?.cursor?.readonly) {
|
|
27463
|
-
lines.push(`readonly: true`);
|
|
27464
|
-
}
|
|
27465
|
-
if (agent.platforms?.cursor?.isBackground) {
|
|
27466
|
-
lines.push(`is_background: true`);
|
|
27467
|
-
}
|
|
27468
|
-
lines.push("---");
|
|
27469
|
-
lines.push("");
|
|
27470
|
-
lines.push(...agent.prompt.split("\n"));
|
|
27471
|
-
new TextFile3(component, `.cursor/agents/${agent.name}.md`, { lines });
|
|
27472
|
-
}
|
|
27473
|
-
}
|
|
27474
|
-
static renderMcpServers(component, mcpServers) {
|
|
27475
|
-
const serverNames = Object.keys(mcpServers);
|
|
27476
|
-
if (serverNames.length === 0) return;
|
|
27477
|
-
const obj = { mcpServers: {} };
|
|
27478
|
-
const servers = obj.mcpServers;
|
|
27479
|
-
for (const [name, config] of Object.entries(mcpServers)) {
|
|
27480
|
-
const server = {};
|
|
27481
|
-
if (config.transport) server.transport = config.transport;
|
|
27482
|
-
if (config.command) server.command = config.command;
|
|
27483
|
-
if (config.args) server.args = [...config.args];
|
|
27484
|
-
if (config.url) server.url = config.url;
|
|
27485
|
-
if (config.headers && Object.keys(config.headers).length > 0) {
|
|
27486
|
-
server.headers = { ...config.headers };
|
|
27487
|
-
}
|
|
27488
|
-
if (config.env) server.env = { ...config.env };
|
|
27489
|
-
servers[name] = server;
|
|
27490
|
-
}
|
|
27491
|
-
new JsonFile3(component, ".cursor/mcp.json", { obj });
|
|
27492
|
-
}
|
|
27493
|
-
static renderHooks(component, settings) {
|
|
27494
|
-
if (!settings?.hooks) return;
|
|
27495
|
-
const hooks = {};
|
|
27496
|
-
const hookEntries = settings.hooks;
|
|
27497
|
-
for (const [event, actions] of Object.entries(hookEntries)) {
|
|
27498
|
-
if (actions && actions.length > 0) {
|
|
27499
|
-
hooks[event] = actions.map((h) => ({
|
|
27500
|
-
command: h.command
|
|
27501
|
-
}));
|
|
27502
|
-
}
|
|
27503
|
-
}
|
|
27504
|
-
if (Object.keys(hooks).length === 0) return;
|
|
27505
|
-
new JsonFile3(component, ".cursor/hooks.json", {
|
|
27506
|
-
obj: { version: 1, hooks }
|
|
27507
|
-
});
|
|
27508
|
-
}
|
|
27509
|
-
static renderIgnoreFiles(component, settings) {
|
|
27510
|
-
if (settings?.ignorePatterns && settings.ignorePatterns.length > 0) {
|
|
27511
|
-
new TextFile3(component, ".cursorignore", {
|
|
27512
|
-
lines: [GENERATED_MARKER2, "", ...settings.ignorePatterns]
|
|
27513
|
-
});
|
|
27514
|
-
}
|
|
27515
|
-
if (settings?.indexingIgnorePatterns && settings.indexingIgnorePatterns.length > 0) {
|
|
27516
|
-
new TextFile3(component, ".cursorindexingignore", {
|
|
27517
|
-
lines: [GENERATED_MARKER2, "", ...settings.indexingIgnorePatterns]
|
|
27518
|
-
});
|
|
27519
|
-
}
|
|
27520
|
-
}
|
|
27521
|
-
};
|
|
27522
|
-
|
|
27523
27648
|
// src/agent/agent-config.ts
|
|
27524
27649
|
var DEFAULT_CLAUDE_ALLOW = [
|
|
27525
27650
|
// ── Git ──────────────────────────────────────────────────────────────
|
|
@@ -27745,7 +27870,10 @@ var AgentConfig = class _AgentConfig extends Component8 {
|
|
|
27745
27870
|
*/
|
|
27746
27871
|
get pathAwareBundles() {
|
|
27747
27872
|
if (!this.cachedBundles) {
|
|
27748
|
-
this.cachedBundles = buildBuiltInBundles(
|
|
27873
|
+
this.cachedBundles = buildBuiltInBundles(
|
|
27874
|
+
this.resolvedPaths,
|
|
27875
|
+
resolveIssueDefaults(this.options.issueDefaults)
|
|
27876
|
+
);
|
|
27749
27877
|
}
|
|
27750
27878
|
return this.cachedBundles;
|
|
27751
27879
|
}
|
|
@@ -27791,6 +27919,7 @@ var AgentConfig = class _AgentConfig extends Component8 {
|
|
|
27791
27919
|
this.project.gitignore.addPatterns(`/${resolvedRunRatio.stateFilePath}`);
|
|
27792
27920
|
}
|
|
27793
27921
|
validateUnblockDependentsConfig(this.options.unblockDependents);
|
|
27922
|
+
validateIssueDefaultsConfig(this.options.issueDefaults);
|
|
27794
27923
|
const resolvedProgressFiles = validateProgressFilesConfig(
|
|
27795
27924
|
this.options.progressFiles
|
|
27796
27925
|
);
|
|
@@ -32678,6 +32807,8 @@ export {
|
|
|
32678
32807
|
DEFAULT_DISPATCH_MODEL,
|
|
32679
32808
|
DEFAULT_DISPATCH_TO_HOUSEKEEPING_RATIO,
|
|
32680
32809
|
DEFAULT_HOUSEKEEPING_MODEL,
|
|
32810
|
+
DEFAULT_ISSUE_PRIORITY,
|
|
32811
|
+
DEFAULT_ISSUE_STATUS,
|
|
32681
32812
|
DEFAULT_ISSUE_TEMPLATES_BUNDLE_PATH_PATTERNS,
|
|
32682
32813
|
DEFAULT_ISSUE_TEMPLATES_EMIT_CHECKER,
|
|
32683
32814
|
DEFAULT_ISSUE_TEMPLATES_EMIT_STARTER,
|
|
@@ -32694,6 +32825,7 @@ export {
|
|
|
32694
32825
|
DEFAULT_PROGRESS_FILES_STALE_AFTER_HOURS,
|
|
32695
32826
|
DEFAULT_PROGRESS_FILES_STATE_DIR,
|
|
32696
32827
|
DEFAULT_REQUIRE_PRODUCT_CONTEXT,
|
|
32828
|
+
DEFAULT_RESOLVED_ISSUE_DEFAULTS,
|
|
32697
32829
|
DEFAULT_SAMPLE_COMPILER_OPTIONS,
|
|
32698
32830
|
DEFAULT_SCHEDULED_TASKS_ROOT,
|
|
32699
32831
|
DEFAULT_SCHEDULED_TASK_ENTRIES,
|
|
@@ -32745,6 +32877,8 @@ export {
|
|
|
32745
32877
|
TypeScriptConfig,
|
|
32746
32878
|
TypeScriptProject,
|
|
32747
32879
|
UNKNOWN_TYPE_FALLBACK_TIER,
|
|
32880
|
+
VALID_PRIORITY_VALUES,
|
|
32881
|
+
VALID_STATUS_VALUES,
|
|
32748
32882
|
VERSION,
|
|
32749
32883
|
VERSION_KEYS_SKIP,
|
|
32750
32884
|
VERSION_NPM_PACKAGES,
|
|
@@ -32803,6 +32937,7 @@ export {
|
|
|
32803
32937
|
githubWorkflowBundle,
|
|
32804
32938
|
industryDiscoveryBundle,
|
|
32805
32939
|
jestBundle,
|
|
32940
|
+
labelsForPhase,
|
|
32806
32941
|
maintenanceAuditBundle,
|
|
32807
32942
|
meetingAnalysisBundle,
|
|
32808
32943
|
orchestratorBundle,
|
|
@@ -32845,6 +32980,7 @@ export {
|
|
|
32845
32980
|
renderSkillEvalsRuleContent,
|
|
32846
32981
|
renderSkillEvalsRunnerScript,
|
|
32847
32982
|
renderSourceTierExamples,
|
|
32983
|
+
renderStubIndexConventionRuleContent,
|
|
32848
32984
|
renderUnblockDependentsScript,
|
|
32849
32985
|
renderUnblockDependentsSection,
|
|
32850
32986
|
requirementsAnalystBundle,
|
|
@@ -32855,6 +32991,7 @@ export {
|
|
|
32855
32991
|
resolveAgentTiers,
|
|
32856
32992
|
resolveAstroProjectOutdir,
|
|
32857
32993
|
resolveAwsCdkProjectOutdir,
|
|
32994
|
+
resolveIssueDefaults,
|
|
32858
32995
|
resolveIssueTemplates,
|
|
32859
32996
|
resolveModelAlias,
|
|
32860
32997
|
resolveOrchestratorAssets,
|
|
@@ -32878,6 +33015,7 @@ export {
|
|
|
32878
33015
|
typescriptBundle,
|
|
32879
33016
|
upstreamConfigulatorDocsBundle,
|
|
32880
33017
|
validateAgentTierConfig,
|
|
33018
|
+
validateIssueDefaultsConfig,
|
|
32881
33019
|
validateIssueTemplatesConfig,
|
|
32882
33020
|
validateMonorepoLayout,
|
|
32883
33021
|
validateProgressFilesConfig,
|