@codedrifters/configulator 0.0.207 → 0.0.208

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 CHANGED
@@ -1016,6 +1016,23 @@ declare const companyProfileBundle: AgentRuleBundle;
1016
1016
  */
1017
1017
  declare const githubWorkflowBundle: AgentRuleBundle;
1018
1018
 
1019
+ /**
1020
+ * Industry-discovery bundle — opt-in only.
1021
+ *
1022
+ * Consuming projects enable it explicitly with
1023
+ * `includeBundles: ["industry-discovery"]`. `appliesWhen` always returns
1024
+ * `false` so the bundle never auto-detects — industry discovery is a
1025
+ * deliberate project-level choice, not a universal default.
1026
+ *
1027
+ * Ships a sub-agent (`industry-discovery-analyst`), a user-invocable
1028
+ * skill (`/discover-industries`), and `type:industry-discovery` plus
1029
+ * `industry:*` phase labels.
1030
+ *
1031
+ * The bundle assumes the `research-pipeline` bundle is also enabled so
1032
+ * Phase 3 can hand off cleared verticals via `research:scope` issues.
1033
+ */
1034
+ declare const industryDiscoveryBundle: AgentRuleBundle;
1035
+
1019
1036
  /**
1020
1037
  * Jest bundle — auto-detected when Jest is in dependencies.
1021
1038
  */
@@ -3471,4 +3488,4 @@ declare const COMPLETE_JOB_ID = "complete";
3471
3488
  */
3472
3489
  declare function addBuildCompleteJob(buildWorkflow: BuildWorkflow): void;
3473
3490
 
3474
- export { AGENT_MODEL, AGENT_PLATFORM, AGENT_RULE_SCOPE, AgentConfig, type AgentConfigOptions, type AgentModel, type AgentPlatform, type AgentPlatformOverrides, type AgentProcedure, type AgentRule, type AgentRuleBundle, type AgentRuleScope, type AgentSkill, type AgentSubAgent, type AgentSubAgentPlatformOverrides, type ApproveMergeUpgradeOptions, AstroConfig, type AstroConfigOptions, type AstroIntegrationSpec, AstroOutput, AstroProject, type AstroProjectOptions, type AwsAccount, AwsCdkProject, type AwsCdkProjectOptions, AwsDeployWorkflow, AwsDeploymentConfig, AwsDeploymentTarget, type AwsDeploymentTargetOptions, type AwsLocalDeploymentConfig, type AwsOrganization, type AwsRegion, AwsTeardownWorkflow, type AwsTeardownWorkflowOptions, BUILT_IN_BUNDLES, CLAUDE_RULE_TARGET, COMPLETE_JOB_ID, type CiDeploymentConfig, type ClassTypeOptions, type ClaudeAutoModeConfig, type ClaudeHookAction, type ClaudeHookEntry, type ClaudeHooksConfig, type ClaudePermissionsConfig, type ClaudeRuleTarget, type ClaudeSandboxConfig, type ClaudeSettingsConfig, type CopilotHandoff, type CursorHookAction, type CursorHooksConfig, type CursorSettingsConfig, DEFAULT_PRIORITY_LABELS, DEFAULT_STATUS_LABELS, DEFAULT_TEARDOWN_BRANCH_PATTERNS, DEFAULT_TYPE_LABELS, type DeployWorkflowOptions, type DeploymentMetadata, type GitBranch, type GitHubBoardMetadata, type GitHubProjectMetadata, type GitHubSprintMetadata, type IDependencyResolver, JsiiFaker, type LabelDefinition, MCP_TRANSPORT, MERGE_METHODS, MIMIMUM_RELEASE_AGE, MINIMUM_RELEASE_AGE, type McpServerConfig, type McpTransport, type MergeMethod, MonorepoProject, type MonorepoProjectOptions, type OrganizationMetadata, PROD_DEPLOY_NAME, PnpmWorkspace, type PnpmWorkspaceOptions, ProjectMetadata, type ProjectMetadataOptions, ROOT_CI_TASK_NAME, ROOT_TURBO_TASK_NAME, type RemoteCacheOptions, type RepositoryMetadata, ResetTask, type ResetTaskOptions, type ResolvedProjectMetadata, type SlackMetadata, type StarlightEditLink, type StarlightLogo, StarlightProject, type StarlightProjectOptions, type StarlightSidebarItem, type StarlightSocialLink, type SyncLabelsOptions, type TemplateResolveResult, TestRunner, TurboRepo, type TurboRepoOptions, TurboRepoTask, type TurboRepoTaskOptions, TypeScriptConfig, TypeScriptProject, type TypeScriptProjectOptions, VERSION, VERSION_KEYS_SKIP, VERSION_NPM_PACKAGES, VSCodeConfig, type VersionKey, Vitest, type VitestConfigOptions, type VitestOptions, addApproveMergeUpgradeWorkflow, addBuildCompleteJob, addSyncLabelsWorkflow, awsCdkBundle, baseBundle, companyProfileBundle, getLatestEligibleVersion, githubWorkflowBundle, jestBundle, meetingAnalysisBundle, orchestratorBundle, peopleProfileBundle, pnpmBundle, prReviewBundle, projenBundle, requirementsAnalystBundle, researchPipelineBundle, resolveModelAlias, resolveTemplateVariables, slackBundle, softwareProfileBundle, turborepoBundle, typescriptBundle, vitestBundle };
3491
+ export { AGENT_MODEL, AGENT_PLATFORM, AGENT_RULE_SCOPE, AgentConfig, type AgentConfigOptions, type AgentModel, type AgentPlatform, type AgentPlatformOverrides, type AgentProcedure, type AgentRule, type AgentRuleBundle, type AgentRuleScope, type AgentSkill, type AgentSubAgent, type AgentSubAgentPlatformOverrides, type ApproveMergeUpgradeOptions, AstroConfig, type AstroConfigOptions, type AstroIntegrationSpec, AstroOutput, AstroProject, type AstroProjectOptions, type AwsAccount, AwsCdkProject, type AwsCdkProjectOptions, AwsDeployWorkflow, AwsDeploymentConfig, AwsDeploymentTarget, type AwsDeploymentTargetOptions, type AwsLocalDeploymentConfig, type AwsOrganization, type AwsRegion, AwsTeardownWorkflow, type AwsTeardownWorkflowOptions, BUILT_IN_BUNDLES, CLAUDE_RULE_TARGET, COMPLETE_JOB_ID, type CiDeploymentConfig, type ClassTypeOptions, type ClaudeAutoModeConfig, type ClaudeHookAction, type ClaudeHookEntry, type ClaudeHooksConfig, type ClaudePermissionsConfig, type ClaudeRuleTarget, type ClaudeSandboxConfig, type ClaudeSettingsConfig, type CopilotHandoff, type CursorHookAction, type CursorHooksConfig, type CursorSettingsConfig, DEFAULT_PRIORITY_LABELS, DEFAULT_STATUS_LABELS, DEFAULT_TEARDOWN_BRANCH_PATTERNS, DEFAULT_TYPE_LABELS, type DeployWorkflowOptions, type DeploymentMetadata, type GitBranch, type GitHubBoardMetadata, type GitHubProjectMetadata, type GitHubSprintMetadata, type IDependencyResolver, JsiiFaker, type LabelDefinition, MCP_TRANSPORT, MERGE_METHODS, MIMIMUM_RELEASE_AGE, MINIMUM_RELEASE_AGE, type McpServerConfig, type McpTransport, type MergeMethod, MonorepoProject, type MonorepoProjectOptions, type OrganizationMetadata, PROD_DEPLOY_NAME, PnpmWorkspace, type PnpmWorkspaceOptions, ProjectMetadata, type ProjectMetadataOptions, ROOT_CI_TASK_NAME, ROOT_TURBO_TASK_NAME, type RemoteCacheOptions, type RepositoryMetadata, ResetTask, type ResetTaskOptions, type ResolvedProjectMetadata, type SlackMetadata, type StarlightEditLink, type StarlightLogo, StarlightProject, type StarlightProjectOptions, type StarlightSidebarItem, type StarlightSocialLink, type SyncLabelsOptions, type TemplateResolveResult, TestRunner, TurboRepo, type TurboRepoOptions, TurboRepoTask, type TurboRepoTaskOptions, TypeScriptConfig, TypeScriptProject, type TypeScriptProjectOptions, VERSION, VERSION_KEYS_SKIP, VERSION_NPM_PACKAGES, VSCodeConfig, type VersionKey, Vitest, type VitestConfigOptions, type VitestOptions, addApproveMergeUpgradeWorkflow, addBuildCompleteJob, addSyncLabelsWorkflow, awsCdkBundle, baseBundle, companyProfileBundle, getLatestEligibleVersion, githubWorkflowBundle, industryDiscoveryBundle, jestBundle, meetingAnalysisBundle, orchestratorBundle, peopleProfileBundle, pnpmBundle, prReviewBundle, projenBundle, requirementsAnalystBundle, researchPipelineBundle, resolveModelAlias, resolveTemplateVariables, slackBundle, softwareProfileBundle, turborepoBundle, typescriptBundle, vitestBundle };
package/lib/index.d.ts CHANGED
@@ -1065,6 +1065,23 @@ declare const companyProfileBundle: AgentRuleBundle;
1065
1065
  */
1066
1066
  declare const githubWorkflowBundle: AgentRuleBundle;
1067
1067
 
1068
+ /**
1069
+ * Industry-discovery bundle — opt-in only.
1070
+ *
1071
+ * Consuming projects enable it explicitly with
1072
+ * `includeBundles: ["industry-discovery"]`. `appliesWhen` always returns
1073
+ * `false` so the bundle never auto-detects — industry discovery is a
1074
+ * deliberate project-level choice, not a universal default.
1075
+ *
1076
+ * Ships a sub-agent (`industry-discovery-analyst`), a user-invocable
1077
+ * skill (`/discover-industries`), and `type:industry-discovery` plus
1078
+ * `industry:*` phase labels.
1079
+ *
1080
+ * The bundle assumes the `research-pipeline` bundle is also enabled so
1081
+ * Phase 3 can hand off cleared verticals via `research:scope` issues.
1082
+ */
1083
+ declare const industryDiscoveryBundle: AgentRuleBundle;
1084
+
1068
1085
  /**
1069
1086
  * Jest bundle — auto-detected when Jest is in dependencies.
1070
1087
  */
@@ -3520,5 +3537,5 @@ declare const COMPLETE_JOB_ID = "complete";
3520
3537
  */
3521
3538
  declare function addBuildCompleteJob(buildWorkflow: BuildWorkflow): void;
3522
3539
 
3523
- export { AGENT_MODEL, AGENT_PLATFORM, AGENT_RULE_SCOPE, AgentConfig, AstroConfig, AstroOutput, AstroProject, AwsCdkProject, AwsDeployWorkflow, AwsDeploymentConfig, AwsDeploymentTarget, AwsTeardownWorkflow, BUILT_IN_BUNDLES, CLAUDE_RULE_TARGET, COMPLETE_JOB_ID, DEFAULT_PRIORITY_LABELS, DEFAULT_STATUS_LABELS, DEFAULT_TEARDOWN_BRANCH_PATTERNS, DEFAULT_TYPE_LABELS, JsiiFaker, MCP_TRANSPORT, MERGE_METHODS, MIMIMUM_RELEASE_AGE, MINIMUM_RELEASE_AGE, MonorepoProject, PROD_DEPLOY_NAME, PnpmWorkspace, ProjectMetadata, ROOT_CI_TASK_NAME, ROOT_TURBO_TASK_NAME, ResetTask, StarlightProject, TestRunner, TurboRepo, TurboRepoTask, TypeScriptConfig, TypeScriptProject, VERSION, VERSION_KEYS_SKIP, VERSION_NPM_PACKAGES, VSCodeConfig, Vitest, addApproveMergeUpgradeWorkflow, addBuildCompleteJob, addSyncLabelsWorkflow, awsCdkBundle, baseBundle, companyProfileBundle, getLatestEligibleVersion, githubWorkflowBundle, jestBundle, meetingAnalysisBundle, orchestratorBundle, peopleProfileBundle, pnpmBundle, prReviewBundle, projenBundle, requirementsAnalystBundle, researchPipelineBundle, resolveModelAlias, resolveTemplateVariables, slackBundle, softwareProfileBundle, turborepoBundle, typescriptBundle, vitestBundle };
3540
+ export { AGENT_MODEL, AGENT_PLATFORM, AGENT_RULE_SCOPE, AgentConfig, AstroConfig, AstroOutput, AstroProject, AwsCdkProject, AwsDeployWorkflow, AwsDeploymentConfig, AwsDeploymentTarget, AwsTeardownWorkflow, BUILT_IN_BUNDLES, CLAUDE_RULE_TARGET, COMPLETE_JOB_ID, DEFAULT_PRIORITY_LABELS, DEFAULT_STATUS_LABELS, DEFAULT_TEARDOWN_BRANCH_PATTERNS, DEFAULT_TYPE_LABELS, JsiiFaker, MCP_TRANSPORT, MERGE_METHODS, MIMIMUM_RELEASE_AGE, MINIMUM_RELEASE_AGE, MonorepoProject, PROD_DEPLOY_NAME, PnpmWorkspace, ProjectMetadata, ROOT_CI_TASK_NAME, ROOT_TURBO_TASK_NAME, ResetTask, StarlightProject, TestRunner, TurboRepo, TurboRepoTask, TypeScriptConfig, TypeScriptProject, VERSION, VERSION_KEYS_SKIP, VERSION_NPM_PACKAGES, VSCodeConfig, Vitest, addApproveMergeUpgradeWorkflow, addBuildCompleteJob, addSyncLabelsWorkflow, awsCdkBundle, baseBundle, companyProfileBundle, getLatestEligibleVersion, githubWorkflowBundle, industryDiscoveryBundle, jestBundle, meetingAnalysisBundle, orchestratorBundle, peopleProfileBundle, pnpmBundle, prReviewBundle, projenBundle, requirementsAnalystBundle, researchPipelineBundle, resolveModelAlias, resolveTemplateVariables, slackBundle, softwareProfileBundle, turborepoBundle, typescriptBundle, vitestBundle };
3524
3541
  export type { AgentConfigOptions, AgentModel, AgentPlatform, AgentPlatformOverrides, AgentProcedure, AgentRule, AgentRuleBundle, AgentRuleScope, AgentSkill, AgentSubAgent, AgentSubAgentPlatformOverrides, ApproveMergeUpgradeOptions, AstroConfigOptions, AstroIntegrationSpec, AstroProjectOptions, AwsAccount, AwsCdkProjectOptions, AwsDeploymentTargetOptions, AwsLocalDeploymentConfig, AwsOrganization, AwsRegion, AwsTeardownWorkflowOptions, CiDeploymentConfig, ClassTypeOptions, ClaudeAutoModeConfig, ClaudeHookAction, ClaudeHookEntry, ClaudeHooksConfig, ClaudePermissionsConfig, ClaudeRuleTarget, ClaudeSandboxConfig, ClaudeSettingsConfig, CopilotHandoff, CursorHookAction, CursorHooksConfig, CursorSettingsConfig, DeployWorkflowOptions, DeploymentMetadata, GitBranch, GitHubBoardMetadata, GitHubProjectMetadata, GitHubSprintMetadata, IDependencyResolver, LabelDefinition, McpServerConfig, McpTransport, MergeMethod, MonorepoProjectOptions, OrganizationMetadata, PnpmWorkspaceOptions, ProjectMetadataOptions, RemoteCacheOptions, RepositoryMetadata, ResetTaskOptions, ResolvedProjectMetadata, SlackMetadata, StarlightEditLink, StarlightLogo, StarlightProjectOptions, StarlightSidebarItem, StarlightSocialLink, SyncLabelsOptions, TemplateResolveResult, TurboRepoOptions, TurboRepoTaskOptions, TypeScriptProjectOptions, VersionKey, VitestConfigOptions, VitestOptions };
package/lib/index.js CHANGED
@@ -225,6 +225,7 @@ __export(index_exports, {
225
225
  companyProfileBundle: () => companyProfileBundle,
226
226
  getLatestEligibleVersion: () => getLatestEligibleVersion,
227
227
  githubWorkflowBundle: () => githubWorkflowBundle,
228
+ industryDiscoveryBundle: () => industryDiscoveryBundle,
228
229
  jestBundle: () => jestBundle,
229
230
  meetingAnalysisBundle: () => meetingAnalysisBundle,
230
231
  orchestratorBundle: () => orchestratorBundle,
@@ -1589,6 +1590,521 @@ var githubWorkflowBundle = {
1589
1590
  ]
1590
1591
  };
1591
1592
 
1593
+ // src/agent/bundles/industry-discovery.ts
1594
+ var industryDiscoveryAnalystSubAgent = {
1595
+ name: "industry-discovery-analyst",
1596
+ 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.",
1597
+ model: AGENT_MODEL.POWERFUL,
1598
+ maxTurns: 80,
1599
+ platforms: { cursor: { exclude: true } },
1600
+ prompt: [
1601
+ "# Industry Discovery Analyst Agent",
1602
+ "",
1603
+ "You run a structured industry-discovery pipeline: enumerate candidate",
1604
+ "industry verticals, score each against a configurable capability/fit",
1605
+ "rubric, and plan downstream research for the verticals that clear the",
1606
+ "configured threshold. Each phase runs as its **own agent session**,",
1607
+ "triggered by a GitHub issue with an `industry:*` phase label. You",
1608
+ "handle exactly **one phase per session** \u2014 read the issue to determine",
1609
+ "which phase to execute.",
1610
+ "",
1611
+ "This agent is **domain-neutral**. It makes no assumptions about what",
1612
+ "the consuming project sells, which industries matter, or what the",
1613
+ "scoring rubric should weight. All domain-specific vocabulary, scoring",
1614
+ "inputs, output locations, and threshold values come from the invoking",
1615
+ "issue body, `docs/project-context.md`, or the consuming project's",
1616
+ "configuration.",
1617
+ "",
1618
+ "Follow your project's shared agent conventions (`AGENTS.md`,",
1619
+ "`CLAUDE.md`, or equivalent) for all commit, branch, and PR rules.",
1620
+ "",
1621
+ "---",
1622
+ "",
1623
+ ...PROJECT_CONTEXT_READER_SECTION,
1624
+ "## Design Principles",
1625
+ "",
1626
+ "1. **Discover broadly, evaluate narrowly.** Phase 1 casts a wide net",
1627
+ " for candidate verticals; Phase 2 applies the rubric to each one;",
1628
+ " Phase 3 only plans downstream research for verticals that clear the",
1629
+ " threshold.",
1630
+ "2. **Filesystem durability.** Every phase persists its output to a",
1631
+ " file on disk before closing its issue. Downstream phases read those",
1632
+ " files \u2014 never rely on session memory.",
1633
+ "3. **Issue graph = state machine.** Phase ordering is encoded with",
1634
+ " `Depends on: #N` links between phase issues. A phase runs only",
1635
+ " after its predecessor is closed.",
1636
+ "4. **Generic over specific.** No hardcoded industry taxonomies,",
1637
+ " companies, or source projects. Use placeholders that the skill",
1638
+ " invocation or consuming project fills in.",
1639
+ "5. **Configurable rubric.** The fit rubric \u2014 criteria, weights, and",
1640
+ " threshold \u2014 comes from `docs/project-context.md` or the invoking",
1641
+ " issue body. Never invent weights or pass/fail cutoffs without an",
1642
+ " authoritative source.",
1643
+ "6. **Planning only.** This pipeline produces candidate lists,",
1644
+ " evaluations, and planning issues \u2014 it does not itself perform the",
1645
+ " downstream research. Research is delegated to the",
1646
+ " `research-pipeline` bundle via `research:scope` issues.",
1647
+ "",
1648
+ "---",
1649
+ "",
1650
+ "## State Machine Overview",
1651
+ "",
1652
+ "```",
1653
+ "\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510",
1654
+ "\u2502 1. DISCOVER \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. EVALUATE \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 3. PLAN \u2502",
1655
+ "\u2502 Enumerate \u2502 \u2502 Score each \u2502 \u2502 For each vertical\u2502",
1656
+ "\u2502 candidate \u2502 \u2502 candidate against \u2502 \u2502 that clears the \u2502",
1657
+ "\u2502 industry \u2502 \u2502 the configured fit \u2502 \u2502 threshold, open \u2502",
1658
+ "\u2502 verticals into a \u2502 \u2502 rubric; write an \u2502 \u2502 a research:scope \u2502",
1659
+ "\u2502 bounded \u2502 \u2502 evaluation file \u2502 \u2502 issue downstream \u2502",
1660
+ "\u2502 candidate file \u2502 \u2502 with per-candidate \u2502 \u2502 \u2502",
1661
+ "\u2502 \u2502 \u2502 scores \u2502 \u2502 \u2502",
1662
+ "\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
1663
+ "```",
1664
+ "",
1665
+ "**Issue labels encode the phase:**",
1666
+ "",
1667
+ "| Label | Phase | Session work |",
1668
+ "|-------|-------|-------------|",
1669
+ "| `industry:discover` | 1. Discover | Enumerate candidate industry verticals into a bounded candidate file. Create the evaluate issue. |",
1670
+ "| `industry:evaluate` | 2. Evaluate | Score each candidate against the fit rubric. Write an evaluation file. Create the plan issue. |",
1671
+ "| `industry:plan` | 3. Plan | Read the evaluation. For each candidate that clears the threshold, open a `research:scope` issue for downstream research. |",
1672
+ "",
1673
+ "All issues also carry `type:industry-discovery` and a `status:*` label.",
1674
+ "",
1675
+ "**Issue count per discovery cycle:** 1 discover + 1 evaluate + 1 plan =",
1676
+ "**3 sessions**, plus `M` `research:scope` issues created by Phase 3,",
1677
+ "where `M` is the number of verticals that clear the threshold.",
1678
+ "",
1679
+ "**Shortened paths:**",
1680
+ "- Discover phase determines the scope is unworkable (no candidate",
1681
+ " verticals, scope out of bounds) \u2192 discover issue closes with a",
1682
+ " justification and no downstream issues are created \u2192 **1 session**.",
1683
+ "- Evaluate phase determines no candidate clears the threshold \u2192 plan",
1684
+ " issue closes with a justification and no `research:scope` issues are",
1685
+ " created \u2192 **3 sessions, 0 downstream issues**.",
1686
+ "",
1687
+ "---",
1688
+ "",
1689
+ "## Configurable Paths",
1690
+ "",
1691
+ "The pipeline uses these placeholders. Consuming projects override the",
1692
+ "defaults by passing paths in the `/discover-industries` skill",
1693
+ "invocation or by extending this rule in their own `agentConfig.rules`.",
1694
+ "",
1695
+ "| Placeholder | Meaning | Default |",
1696
+ "|-------------|---------|---------|",
1697
+ "| `<INDUSTRY_ROOT>` | Root folder for all industry-discovery outputs | `docs/industries/` |",
1698
+ "| `<CANDIDATES_DIR>` | Candidate-list files (Phase 1) | `<INDUSTRY_ROOT>/candidates/` |",
1699
+ "| `<EVALUATIONS_DIR>` | Evaluation files with per-candidate scores (Phase 2) | `<INDUSTRY_ROOT>/evaluations/` |",
1700
+ "| `<PLANS_DIR>` | Plan files summarizing downstream research (Phase 3) | `<INDUSTRY_ROOT>/plans/` |",
1701
+ "| `<DISCOVERY_SLUG>` | Short kebab-case slug identifying one discovery cycle | derived from the scope |",
1702
+ "",
1703
+ "If `docs/project-context.md` specifies a different industry-discovery",
1704
+ "tree, prefer that. Otherwise fall back to the defaults above.",
1705
+ "",
1706
+ "---",
1707
+ "",
1708
+ "## Fit Rubric Convention",
1709
+ "",
1710
+ "The fit rubric is the scoring framework Phase 2 uses to evaluate each",
1711
+ "candidate vertical. It is **not invented by this agent** \u2014 it must come",
1712
+ "from an authoritative source, resolved in this order:",
1713
+ "",
1714
+ "1. **Invoking issue body.** If the issue body includes a `## Fit",
1715
+ " Rubric` section, use it verbatim.",
1716
+ "2. **`docs/project-context.md`.** If the project context file includes",
1717
+ " a `## Industry Fit Rubric` section, use it.",
1718
+ "3. **Default scaffold.** If neither source defines a rubric, write a",
1719
+ " placeholder rubric with `TODO:` weights and flag the evaluate issue",
1720
+ " with `status:needs-attention` \u2014 do not silently invent weights.",
1721
+ "",
1722
+ "The rubric has this shape:",
1723
+ "",
1724
+ "```markdown",
1725
+ "## Industry Fit Rubric",
1726
+ "",
1727
+ "| Criterion | Weight | Description |",
1728
+ "|-----------|--------|-------------|",
1729
+ "| <name> | <0.0\u20131.0> | <what high vs. low looks like> |",
1730
+ "",
1731
+ "**Threshold:** <0.0\u20131.0> \u2014 verticals scoring at or above this value",
1732
+ "advance to Phase 3 (Plan).",
1733
+ "",
1734
+ "**Scoring scale:** per-criterion score is 0.0\u20131.0; the final score is",
1735
+ "the weighted average of the criteria.",
1736
+ "```",
1737
+ "",
1738
+ "---",
1739
+ "",
1740
+ "## Agent Loop",
1741
+ "",
1742
+ "Run this loop exactly once per session. Never start a second issue.",
1743
+ "",
1744
+ "1. Claim one open `type:industry-discovery` issue using phase",
1745
+ " priority: `industry:discover` > `industry:evaluate` > `industry:plan`.",
1746
+ "2. Transition `status:ready` \u2192 `status:in-progress` and create the",
1747
+ " branch per your project's branch-naming convention.",
1748
+ "3. Execute the phase handler that matches the issue's `industry:*`",
1749
+ " label.",
1750
+ "4. Commit, push, open a PR (if applicable), and close the issue per",
1751
+ " your project's PR workflow.",
1752
+ "",
1753
+ "---",
1754
+ "",
1755
+ "## Phase 1: Discover (`industry:discover`)",
1756
+ "",
1757
+ "**Goal:** Enumerate candidate industry verticals into a bounded",
1758
+ "candidate file.",
1759
+ "",
1760
+ "**Budget:** Limited discovery research. Read the scope, the project",
1761
+ "context, and any cited source material. Write one candidate file and",
1762
+ "create one evaluate issue. Do not score in this phase.",
1763
+ "",
1764
+ "### Steps",
1765
+ "",
1766
+ "1. **Read the discovery scope** from the issue body. The body should",
1767
+ " include:",
1768
+ " - The scope statement (what kind of industry verticals to look for,",
1769
+ " what to exclude)",
1770
+ " - Authorized source categories (e.g. public web, industry reports,",
1771
+ " a cited local file path) \u2014 if absent, default to public web only",
1772
+ " - Optional: `<DISCOVERY_SLUG>` override, custom output paths,",
1773
+ " candidate-count hints (default target: 8\u201320 candidates)",
1774
+ "",
1775
+ "2. **Derive `<DISCOVERY_SLUG>`** if not supplied \u2014 a 3\u20135 word",
1776
+ " kebab-case summary of the scope. Ensure the slug is not already in",
1777
+ " use under `<CANDIDATES_DIR>/`.",
1778
+ "",
1779
+ "3. **Enumerate candidate verticals.** Aim for 8\u201320 distinct candidate",
1780
+ " verticals unless the scope states otherwise. Each candidate should:",
1781
+ " - Be a recognizable industry vertical or sub-vertical (not a single",
1782
+ " company, not a product category)",
1783
+ " - Be within the scope defined in the issue",
1784
+ " - Have at least a brief description and one cited source",
1785
+ "",
1786
+ "4. **Write the candidate file** to",
1787
+ " `<CANDIDATES_DIR>/<DISCOVERY_SLUG>.candidates.md`:",
1788
+ "",
1789
+ " ```markdown",
1790
+ " ---",
1791
+ ' title: "Industry Candidates: <scope>"',
1792
+ " slug: <DISCOVERY_SLUG>",
1793
+ " date: YYYY-MM-DD",
1794
+ " parent_issue: <N>",
1795
+ " candidate_count: <N>",
1796
+ " ---",
1797
+ "",
1798
+ " # Industry Candidates: <scope>",
1799
+ "",
1800
+ " ## Scope",
1801
+ " <verbatim scope statement from the issue>",
1802
+ "",
1803
+ " ## Authorized Sources",
1804
+ " - <source category or path>",
1805
+ "",
1806
+ " ## Candidates",
1807
+ " ### <vertical name>",
1808
+ " - **Description:** <1\u20132 sentences>",
1809
+ " - **Why in scope:** <why this vertical matches the scope>",
1810
+ " - **Sources:** <citations>",
1811
+ "",
1812
+ " ## Out of Scope",
1813
+ " <verticals deliberately excluded from this cycle and why>",
1814
+ " ```",
1815
+ "",
1816
+ "5. **Create one `industry:evaluate` issue** with",
1817
+ " `Depends on: #<discover-issue>`. Its body references the candidate",
1818
+ " file path and the fit rubric source (invoking issue, project",
1819
+ " context, or scaffold).",
1820
+ "",
1821
+ "6. **Commit and push** the candidate file. Close the discover issue.",
1822
+ "",
1823
+ "---",
1824
+ "",
1825
+ "## Phase 2: Evaluate (`industry:evaluate`)",
1826
+ "",
1827
+ "**Goal:** Score every candidate against the fit rubric and produce an",
1828
+ "evaluation file.",
1829
+ "",
1830
+ "**Budget:** No broad exploratory research \u2014 evaluate what the candidate",
1831
+ "file already captured, pulling targeted clarifications only when a",
1832
+ "criterion cannot be scored. Write one evaluation file.",
1833
+ "",
1834
+ "### Steps",
1835
+ "",
1836
+ "1. **Read the candidate file** referenced in the issue body.",
1837
+ "",
1838
+ "2. **Resolve the fit rubric** per the Fit Rubric Convention above.",
1839
+ " If neither the invoking issue nor `docs/project-context.md` defines",
1840
+ " a rubric, emit a scaffold and flag `status:needs-attention` \u2014 do not",
1841
+ " silently invent weights or thresholds.",
1842
+ "",
1843
+ "3. **Score each candidate.** For each criterion, assign a 0.0\u20131.0",
1844
+ " score and cite at least one source for the score. Compute the",
1845
+ " weighted-average final score.",
1846
+ "",
1847
+ "4. **Write the evaluation file** to",
1848
+ " `<EVALUATIONS_DIR>/<DISCOVERY_SLUG>.evaluation.md`:",
1849
+ "",
1850
+ " ```markdown",
1851
+ " ---",
1852
+ ' title: "Industry Evaluation: <scope>"',
1853
+ " slug: <DISCOVERY_SLUG>",
1854
+ " date: YYYY-MM-DD",
1855
+ " parent_issue: <N>",
1856
+ " candidates_source: <CANDIDATES_DIR>/<DISCOVERY_SLUG>.candidates.md",
1857
+ " threshold: <0.0\u20131.0>",
1858
+ " ---",
1859
+ "",
1860
+ " # Industry Evaluation: <scope>",
1861
+ "",
1862
+ " ## Fit Rubric",
1863
+ " <verbatim rubric table, including weights and threshold>",
1864
+ "",
1865
+ " ## Scored Candidates",
1866
+ "",
1867
+ " | Vertical | Weighted Score | Clears Threshold |",
1868
+ " |----------|----------------|------------------|",
1869
+ " | <name> | 0.73 | yes |",
1870
+ "",
1871
+ " ### <vertical name> \u2014 0.73",
1872
+ " - **<criterion>:** 0.8 \u2014 <one-line justification + citation>",
1873
+ " - **<criterion>:** 0.6 \u2014 <one-line justification + citation>",
1874
+ " - **Notes:** <anything the rubric could not capture>",
1875
+ "",
1876
+ " ## Gaps / Open Questions",
1877
+ " <criteria that could not be scored for one or more candidates>",
1878
+ " ```",
1879
+ "",
1880
+ "5. **Create one `industry:plan` issue** with",
1881
+ " `Depends on: #<evaluate-issue>`. Its body references the evaluation",
1882
+ " file path and lists the verticals that clear the threshold (if any).",
1883
+ "",
1884
+ "6. **Commit and push** the evaluation file. Close the evaluate issue.",
1885
+ "",
1886
+ "---",
1887
+ "",
1888
+ "## Phase 3: Plan (`industry:plan`)",
1889
+ "",
1890
+ "**Goal:** For each vertical that clears the threshold, open a",
1891
+ "`research:scope` issue so the `research-pipeline` bundle can pick it up",
1892
+ "and produce a research deliverable.",
1893
+ "",
1894
+ "**Budget:** No new web searches. Read the evaluation, write a plan",
1895
+ "file, and create one downstream research issue per cleared vertical.",
1896
+ "",
1897
+ "### Steps",
1898
+ "",
1899
+ "1. **Read the evaluation file** referenced in the issue body.",
1900
+ "",
1901
+ "2. **Identify cleared verticals.** Any vertical whose weighted score",
1902
+ " meets or exceeds the threshold advances. If the evaluation flagged",
1903
+ " scoring gaps that block a pass/fail decision, treat the vertical as",
1904
+ " **not cleared** and note it in the plan.",
1905
+ "",
1906
+ "3. **Write the plan file** to",
1907
+ " `<PLANS_DIR>/<DISCOVERY_SLUG>.plan.md`:",
1908
+ "",
1909
+ " ```markdown",
1910
+ " ---",
1911
+ ' title: "Industry Plan: <scope>"',
1912
+ " slug: <DISCOVERY_SLUG>",
1913
+ " date: YYYY-MM-DD",
1914
+ " parent_issue: <N>",
1915
+ " evaluation_source: <EVALUATIONS_DIR>/<DISCOVERY_SLUG>.evaluation.md",
1916
+ " ---",
1917
+ "",
1918
+ " # Industry Plan: <scope>",
1919
+ "",
1920
+ " ## Cleared Verticals",
1921
+ " | Vertical | Score | Downstream Issue |",
1922
+ " |----------|-------|------------------|",
1923
+ " | <name> | 0.73 | #<research-scope-issue> |",
1924
+ "",
1925
+ " ## Not Cleared",
1926
+ " | Vertical | Score | Reason |",
1927
+ " |----------|-------|--------|",
1928
+ " | <name> | 0.41 | below threshold |",
1929
+ "",
1930
+ " ## Notes",
1931
+ " <anything the plan author wants to preserve for future iterations>",
1932
+ " ```",
1933
+ "",
1934
+ "4. **Create one `research:scope` issue per cleared vertical.** This",
1935
+ " assumes the `research-pipeline` bundle is enabled in the consuming",
1936
+ " project. Each downstream issue should:",
1937
+ " - Carry `type:research`, `research:scope`, `priority:medium`, and",
1938
+ " `status:ready` labels",
1939
+ " - Include the research question framed for the vertical (what the",
1940
+ " downstream research needs to answer)",
1941
+ " - Cite the evaluation row that justified advancing the vertical",
1942
+ " - Reference the plan file path for traceability",
1943
+ "",
1944
+ "5. **Cross-link** \u2014 update the plan file's `## Cleared Verticals`",
1945
+ " table so each row references its newly-created `research:scope`",
1946
+ " issue number.",
1947
+ "",
1948
+ "6. **Commit and push** the plan file. Close the plan issue.",
1949
+ "",
1950
+ "---",
1951
+ "",
1952
+ "## Output Boundaries",
1953
+ "",
1954
+ "This agent writes **only** to:",
1955
+ "",
1956
+ "- `<CANDIDATES_DIR>/` \u2014 candidate files (Phase 1)",
1957
+ "- `<EVALUATIONS_DIR>/` \u2014 evaluation files (Phase 2)",
1958
+ "- `<PLANS_DIR>/` \u2014 plan files (Phase 3, cross-linked with downstream",
1959
+ " research issue numbers)",
1960
+ "",
1961
+ "The pipeline produces **candidate lists, evaluations, and plans**. It",
1962
+ "does not itself perform the downstream research, write industry",
1963
+ "profiles, or publish deliverables \u2014 those are the responsibility of",
1964
+ "specialized downstream agents (notably `research-analyst` from the",
1965
+ "`research-pipeline` bundle) that pick up the `research:scope` issues",
1966
+ "this pipeline creates. Keep this boundary clean so the industry",
1967
+ "discovery pipeline stays generic.",
1968
+ "",
1969
+ "---",
1970
+ "",
1971
+ "## Rules",
1972
+ "",
1973
+ "- **One phase per session.** Never run two phases back-to-back in a",
1974
+ " single session.",
1975
+ "- **Persist before closing.** Every phase must write its output file",
1976
+ " before closing its issue.",
1977
+ "- **Do not invent the rubric.** If no authoritative rubric is",
1978
+ " available, emit a scaffold and flag `status:needs-attention` \u2014 never",
1979
+ " silently guess weights or thresholds.",
1980
+ "- **Cite everything.** Every candidate, score, and pass/fail decision",
1981
+ " must carry at least one source citation.",
1982
+ "- **Produce plans, not downstream work.** Do not open profile,",
1983
+ " requirement, or comparison issues from this pipeline. Downstream",
1984
+ " research is delegated to the `research-pipeline` bundle via",
1985
+ " `research:scope` issues."
1986
+ ].join("\n")
1987
+ };
1988
+ var discoverIndustriesSkill = {
1989
+ name: "discover-industries",
1990
+ 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.",
1991
+ disableModelInvocation: true,
1992
+ userInvocable: true,
1993
+ context: "fork",
1994
+ agent: "industry-discovery-analyst",
1995
+ platforms: { cursor: { exclude: true } },
1996
+ instructions: [
1997
+ "# Discover Industries",
1998
+ "",
1999
+ "Kick off an industry-discovery pipeline. Creates an",
2000
+ "`industry:discover` issue carrying the discovery scope and dispatches",
2001
+ "Phase 1 (Discover) in the industry-discovery-analyst agent.",
2002
+ "",
2003
+ "## Usage",
2004
+ "",
2005
+ "/discover-industries <scope>",
2006
+ "",
2007
+ "Optional extensions in the issue body:",
2008
+ "- `sources: <list>` \u2014 authorized source categories or file paths",
2009
+ "- `candidates: <N>` \u2014 override the default candidate-count target",
2010
+ " (default range 8\u201320)",
2011
+ "- `slug: <kebab-case>` \u2014 override the derived discovery slug",
2012
+ "- `rubric: inline` \u2014 include an inline `## Fit Rubric` section to use",
2013
+ " for Phase 2; otherwise the agent falls back to",
2014
+ " `docs/project-context.md` or a scaffold",
2015
+ "- `threshold: <0.0\u20131.0>` \u2014 override the rubric's default threshold",
2016
+ "",
2017
+ "## Default Paths",
2018
+ "",
2019
+ "If the project has no override in `docs/project-context.md` or",
2020
+ "`agentConfig.rules`, outputs land under:",
2021
+ "",
2022
+ "- `docs/industries/candidates/<slug>.candidates.md`",
2023
+ "- `docs/industries/evaluations/<slug>.evaluation.md`",
2024
+ "- `docs/industries/plans/<slug>.plan.md`",
2025
+ "",
2026
+ "## Steps",
2027
+ "",
2028
+ "1. Create an `industry:discover` issue with `type:industry-discovery`,",
2029
+ " `priority:medium`, and `status:ready`. Body must include the",
2030
+ " verbatim scope, authorized sources, and any overrides.",
2031
+ "2. Execute Phase 1 (Discover) of the industry-discovery-analyst",
2032
+ " agent.",
2033
+ "3. Phase 1 creates an `industry:evaluate` issue, which Phase 2 follows",
2034
+ " with an `industry:plan` issue. Each downstream issue declares its",
2035
+ " `Depends on:` predecessor. Phase 3 creates one `research:scope`",
2036
+ " issue for each vertical that clears the threshold.",
2037
+ "",
2038
+ "## Output",
2039
+ "",
2040
+ "- A candidate file under the project's candidates directory",
2041
+ "- An evaluation file with per-candidate scores under the evaluations",
2042
+ " directory",
2043
+ "- A plan file under the plans directory, cross-linked to downstream",
2044
+ " research issues",
2045
+ "- One `research:scope` issue per cleared vertical \u2014 picked up by the",
2046
+ " `research-pipeline` bundle's `research-analyst` agent"
2047
+ ].join("\n")
2048
+ };
2049
+ var industryDiscoveryBundle = {
2050
+ name: "industry-discovery",
2051
+ description: "Industry-vertical discovery pipeline: discover candidates, evaluate against a fit rubric, plan downstream research. Opt-in only; domain-neutral; filesystem-durable between phases.",
2052
+ appliesWhen: () => false,
2053
+ rules: [
2054
+ {
2055
+ name: "industry-discovery-workflow",
2056
+ description: "Describes the 3-phase industry-discovery pipeline, the industry:* label taxonomy, and the handoff to the research-pipeline bundle.",
2057
+ scope: AGENT_RULE_SCOPE.ALWAYS,
2058
+ content: [
2059
+ "# Industry Discovery Workflow",
2060
+ "",
2061
+ "Use `/discover-industries <scope>` to kick off an industry-vertical",
2062
+ "discovery pipeline. The pipeline runs in 3 phases \u2014 discover,",
2063
+ "evaluate, plan \u2014 each tracked by its own GitHub issue labeled",
2064
+ "`industry:discover`, `industry:evaluate`, or `industry:plan`. All",
2065
+ "issues carry `type:industry-discovery`.",
2066
+ "",
2067
+ "The pipeline produces **candidate lists, evaluations, and plans**.",
2068
+ "Verticals that clear the configured fit threshold are handed off",
2069
+ "to the `research-pipeline` bundle via `research:scope` issues for",
2070
+ "downstream deliverables.",
2071
+ "",
2072
+ "See the `industry-discovery-analyst` agent definition for full",
2073
+ "workflow details, default paths, the fit rubric convention, and",
2074
+ "phase-by-phase instructions."
2075
+ ].join("\n"),
2076
+ platforms: {
2077
+ cursor: { exclude: true }
2078
+ },
2079
+ tags: ["workflow"]
2080
+ }
2081
+ ],
2082
+ skills: [discoverIndustriesSkill],
2083
+ subAgents: [industryDiscoveryAnalystSubAgent],
2084
+ labels: [
2085
+ {
2086
+ name: "type:industry-discovery",
2087
+ color: "1D76DB",
2088
+ description: "Work that discovers, evaluates, or plans research on industry verticals"
2089
+ },
2090
+ {
2091
+ name: "industry:discover",
2092
+ color: "C5DEF5",
2093
+ description: "Phase 1: enumerate candidate industry verticals into a bounded candidate file"
2094
+ },
2095
+ {
2096
+ name: "industry:evaluate",
2097
+ color: "BFDADC",
2098
+ description: "Phase 2: score candidate verticals against the configured fit rubric"
2099
+ },
2100
+ {
2101
+ name: "industry:plan",
2102
+ color: "D4C5F9",
2103
+ description: "Phase 3: plan downstream research for verticals that clear the fit threshold"
2104
+ }
2105
+ ]
2106
+ };
2107
+
1592
2108
  // src/agent/bundles/jest.ts
1593
2109
  var jestBundle = {
1594
2110
  name: "jest",
@@ -6263,7 +6779,8 @@ var BUILT_IN_BUNDLES = [
6263
6779
  researchPipelineBundle,
6264
6780
  companyProfileBundle,
6265
6781
  peopleProfileBundle,
6266
- softwareProfileBundle
6782
+ softwareProfileBundle,
6783
+ industryDiscoveryBundle
6267
6784
  ];
6268
6785
 
6269
6786
  // src/agent/bundles/scope.ts
@@ -9786,6 +10303,7 @@ var TypeScriptConfig = class extends import_projen22.Component {
9786
10303
  companyProfileBundle,
9787
10304
  getLatestEligibleVersion,
9788
10305
  githubWorkflowBundle,
10306
+ industryDiscoveryBundle,
9789
10307
  jestBundle,
9790
10308
  meetingAnalysisBundle,
9791
10309
  orchestratorBundle,