@codedrifters/configulator 0.0.345 → 0.0.346

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.mjs CHANGED
@@ -1677,6 +1677,19 @@ function assertValidBundlePathPatterns(value) {
1677
1677
  }
1678
1678
 
1679
1679
  // src/agent/bundles/paths.ts
1680
+ var DEFAULT_REQUIREMENT_CATEGORY_DIRS = Object.freeze({
1681
+ business: "business",
1682
+ functional: "functional",
1683
+ nonFunctional: "non-functional",
1684
+ technical: "technical",
1685
+ architecturalDecisions: "architectural-decisions",
1686
+ security: "security",
1687
+ data: "data",
1688
+ integration: "integration",
1689
+ operational: "operational",
1690
+ ux: "ux",
1691
+ multiTenancy: "multi-tenancy"
1692
+ });
1680
1693
  var DEFAULT_AGENT_PATHS = Object.freeze({
1681
1694
  docsRoot: "docs/src/content/docs",
1682
1695
  researchRoot: "docs/research",
@@ -1688,7 +1701,8 @@ var DEFAULT_AGENT_PATHS = Object.freeze({
1688
1701
  peopleRoot: "docs/src/content/docs/profiles/people",
1689
1702
  companiesRoot: "docs/src/content/docs/profiles/companies",
1690
1703
  softwareRoot: "docs/src/content/docs/profiles/software",
1691
- industriesRoot: "docs/src/content/docs/profiles/industries"
1704
+ industriesRoot: "docs/src/content/docs/profiles/industries",
1705
+ requirementCategoryDirs: DEFAULT_REQUIREMENT_CATEGORY_DIRS
1692
1706
  });
1693
1707
  function resolveAgentPaths(paths) {
1694
1708
  const docsRoot = paths?.docsRoot ?? DEFAULT_AGENT_PATHS.docsRoot;
@@ -1702,6 +1716,20 @@ function resolveAgentPaths(paths) {
1702
1716
  const companiesRoot = paths?.companiesRoot ?? `${profilesRoot}/companies`;
1703
1717
  const softwareRoot = paths?.softwareRoot ?? `${profilesRoot}/software`;
1704
1718
  const industriesRoot = paths?.industriesRoot ?? `${profilesRoot}/industries`;
1719
+ const categoryOverrides = paths?.requirementCategoryDirs;
1720
+ const requirementCategoryDirs = {
1721
+ business: categoryOverrides?.business ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.business,
1722
+ functional: categoryOverrides?.functional ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.functional,
1723
+ nonFunctional: categoryOverrides?.nonFunctional ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.nonFunctional,
1724
+ technical: categoryOverrides?.technical ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.technical,
1725
+ architecturalDecisions: categoryOverrides?.architecturalDecisions ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.architecturalDecisions,
1726
+ security: categoryOverrides?.security ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.security,
1727
+ data: categoryOverrides?.data ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.data,
1728
+ integration: categoryOverrides?.integration ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.integration,
1729
+ operational: categoryOverrides?.operational ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.operational,
1730
+ ux: categoryOverrides?.ux ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.ux,
1731
+ multiTenancy: categoryOverrides?.multiTenancy ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.multiTenancy
1732
+ };
1705
1733
  return {
1706
1734
  docsRoot,
1707
1735
  researchRoot,
@@ -1713,7 +1741,8 @@ function resolveAgentPaths(paths) {
1713
1741
  peopleRoot,
1714
1742
  companiesRoot,
1715
1743
  softwareRoot,
1716
- industriesRoot
1744
+ industriesRoot,
1745
+ requirementCategoryDirs
1717
1746
  };
1718
1747
  }
1719
1748
 
@@ -6157,7 +6186,7 @@ function buildScanBusinessModelsSkill(paths, issueDefaults) {
6157
6186
  "Optional extensions in the issue body:",
6158
6187
  "- `plan: <path>` \u2014 path to the industry-discovery plan file that",
6159
6188
  " cleared this industry for downstream research (e.g.",
6160
- " `docs/industries/plans/<slug>.plan.md`)",
6189
+ ` \`${paths.industriesRoot}/plans/<slug>.plan.md\`)`,
6161
6190
  "- `sources: <list>` \u2014 additional authorized input paths",
6162
6191
  "- `exclude: <segment list>` \u2014 segments already covered to skip",
6163
6192
  "- `slug: <kebab-case>` \u2014 override the derived industry slug",
@@ -6557,15 +6586,15 @@ function buildCompanyProfileAnalystSubAgent(paths, issueDefaults, tier) {
6557
6586
  "",
6558
6587
  "| Placeholder | Meaning | Default |",
6559
6588
  "|-------------|---------|---------|",
6560
- "| `<COMPANY_ROOT>` | Root folder for company profiles | `docs/companies/` |",
6589
+ `| \`<COMPANY_ROOT>\` | Root folder for company profiles | \`${paths.companiesRoot}/\` |`,
6561
6590
  "| `<PROFILES_DIR>` | Final company profile files | `<COMPANY_ROOT>/profiles/` |",
6562
6591
  "| `<NOTES_DIR>` | Research-notes files from Phase 1 | `<COMPANY_ROOT>/notes/` |",
6563
6592
  "| `<ANALYSIS_DIR>` | Segment-level competitive-analysis documents from Phase 6 | `<COMPANY_ROOT>/analysis/` |",
6564
6593
  "| `<COMPANY_SLUG>` | Short kebab-case slug identifying the company | derived from the company name |",
6565
6594
  "| `<SEGMENT_SLUG>` | Short kebab-case slug identifying the industry segment | derived from the segment name |",
6566
6595
  `| \`<BUSINESS_MODELS_ROOT>\` | Where existing business-model canvases live (consumed by Phase 4) | \`${paths.docsRoot}/industry-research/\` |`,
6567
- "| `<PEOPLE_PROFILES_DIR>` | Where existing people profiles live (for duplicate detection during followup) | `docs/people/profiles/` |",
6568
- "| `<SOFTWARE_PROFILES_DIR>` | Where existing software profiles live (for duplicate detection during followup) | `docs/software/profiles/` |",
6596
+ `| \`<PEOPLE_PROFILES_DIR>\` | Where existing people profiles live (for duplicate detection during followup) | \`${paths.peopleRoot}/profiles/\` |`,
6597
+ `| \`<SOFTWARE_PROFILES_DIR>\` | Where existing software profiles live (for duplicate detection during followup) | \`${paths.softwareRoot}/profiles/\` |`,
6569
6598
  "",
6570
6599
  `If \`${paths.docsRoot}/project-context.md\` specifies a different company-research`,
6571
6600
  "tree (for example by reusing the research-pipeline deliverables",
@@ -7388,8 +7417,8 @@ function buildProfileCompanySkill(paths, issueDefaults) {
7388
7417
  `If the project has no override in \`${paths.docsRoot}/project-context.md\` or`,
7389
7418
  "`agentConfig.rules`, outputs land under:",
7390
7419
  "",
7391
- "- `docs/companies/notes/<slug>.notes.md`",
7392
- "- `docs/companies/profiles/<slug>.md`",
7420
+ `- \`${paths.companiesRoot}/notes/<slug>.notes.md\``,
7421
+ `- \`${paths.companiesRoot}/profiles/<slug>.md\``,
7393
7422
  "",
7394
7423
  "## Steps",
7395
7424
  "",
@@ -7594,7 +7623,7 @@ function buildAnalyzeSegmentSkill(paths, issueDefaults) {
7594
7623
  `If the project has no override in \`${paths.docsRoot}/project-context.md\` or`,
7595
7624
  "`agentConfig.rules`, outputs land under:",
7596
7625
  "",
7597
- "- `docs/companies/analysis/<segment-slug>.md`",
7626
+ `- \`${paths.companiesRoot}/analysis/<segment-slug>.md\``,
7598
7627
  "",
7599
7628
  "## Blocking Rule",
7600
7629
  "",
@@ -8026,7 +8055,7 @@ function buildCustomerProfileAnalystSubAgent(paths, issueDefaults, tier) {
8026
8055
  "| `<COMPETITORS_DIR>` | Per-archetype competitor analyses | `<CUSTOMER_ROOT>/competitors/` |",
8027
8056
  "| `<COMPETITORS_PAGE>` | One-archetype competitor-analysis page | `<COMPETITORS_DIR>/<ARCHETYPE_SLUG>.md` |",
8028
8057
  "| `<DISCOVERY_DIR>` | Discovery reports written during Phase 1 | `<researchRoot>/customer/` |",
8029
- "| `<MATRIX_FILE>` | Shared software-profile feature-matrix file | `docs/software/feature-matrix.md` |",
8058
+ `| \`<MATRIX_FILE>\` | Shared software-profile feature-matrix file | \`${paths.softwareRoot}/feature-matrix.md\` |`,
8030
8059
  "| `<SCOPE_SLUG>` | Short kebab-case slug identifying the discovery scope | derived from the discover issue |",
8031
8060
  "| `<ARCHETYPE_SLUG>` | Short kebab-case slug identifying one archetype | derived from the profile issue |",
8032
8061
  "",
@@ -8659,7 +8688,7 @@ function buildAnalyzeCustomerCompetitorsSkill(paths, issueDefaults) {
8659
8688
  "",
8660
8689
  "Optional extensions:",
8661
8690
  "- `matrix_file: <path>` \u2014 override for the shared feature-matrix",
8662
- " file. Defaults to `docs/software/feature-matrix.md`.",
8691
+ ` file. Defaults to \`${paths.softwareRoot}/feature-matrix.md\`.`,
8663
8692
  "",
8664
8693
  "## Default Paths",
8665
8694
  "",
@@ -10505,7 +10534,7 @@ function buildIndustryDiscoveryAnalystSubAgent(paths, issueDefaults) {
10505
10534
  "",
10506
10535
  "| Placeholder | Meaning | Default |",
10507
10536
  "|-------------|---------|---------|",
10508
- "| `<INDUSTRY_ROOT>` | Root folder for all industry-discovery outputs | `docs/industries/` |",
10537
+ `| \`<INDUSTRY_ROOT>\` | Root folder for all industry-discovery outputs | \`${paths.industriesRoot}/\` |`,
10509
10538
  "| `<CANDIDATES_DIR>` | Candidate-list files (Phase 1) | `<INDUSTRY_ROOT>/candidates/` |",
10510
10539
  "| `<EVALUATIONS_DIR>` | Evaluation files with per-candidate scores (Phase 2) | `<INDUSTRY_ROOT>/evaluations/` |",
10511
10540
  "| `<PLANS_DIR>` | Plan files summarizing downstream research (Phase 3) | `<INDUSTRY_ROOT>/plans/` |",
@@ -10826,9 +10855,9 @@ function buildDiscoverIndustriesSkill(paths, issueDefaults) {
10826
10855
  `If the project has no override in \`${paths.docsRoot}/project-context.md\` or`,
10827
10856
  "`agentConfig.rules`, outputs land under:",
10828
10857
  "",
10829
- "- `docs/industries/candidates/<slug>.candidates.md`",
10830
- "- `docs/industries/evaluations/<slug>.evaluation.md`",
10831
- "- `docs/industries/plans/<slug>.plan.md`",
10858
+ `- \`${paths.industriesRoot}/candidates/<slug>.candidates.md\``,
10859
+ `- \`${paths.industriesRoot}/evaluations/<slug>.evaluation.md\``,
10860
+ `- \`${paths.industriesRoot}/plans/<slug>.plan.md\``,
10832
10861
  "",
10833
10862
  "## Steps",
10834
10863
  "",
@@ -16459,13 +16488,13 @@ function buildPeopleProfileAnalystSubAgent(paths, issueDefaults, tier) {
16459
16488
  "",
16460
16489
  "| Placeholder | Meaning | Default |",
16461
16490
  "|-------------|---------|---------|",
16462
- "| `<PEOPLE_ROOT>` | Root folder for person profiles | `docs/people/` |",
16491
+ `| \`<PEOPLE_ROOT>\` | Root folder for person profiles | \`${paths.peopleRoot}/\` |`,
16463
16492
  "| `<PROFILES_DIR>` | Final person profile files | `<PEOPLE_ROOT>/profiles/` |",
16464
16493
  "| `<NOTES_DIR>` | Research-notes files from Phase 1 | `<PEOPLE_ROOT>/notes/` |",
16465
16494
  "| `<PERSON_SLUG>` | Short kebab-case slug identifying the person | derived from the person's name |",
16466
- "| `<COMPANIES_DIR>` | Where existing company profiles live (for cross-references and duplicate detection during followup) | `docs/companies/profiles/` |",
16467
- "| `<SOFTWARE_DIR>` | Where existing software profiles live (for cross-references and duplicate detection during followup) | `docs/software/profiles/` |",
16468
- "| `<MEETINGS_DIR>` | Where meeting notes live (for cross-references) | `docs/meetings/` |",
16495
+ `| \`<COMPANIES_DIR>\` | Where existing company profiles live (for cross-references and duplicate detection during followup) | \`${paths.companiesRoot}/profiles/\` |`,
16496
+ `| \`<SOFTWARE_DIR>\` | Where existing software profiles live (for cross-references and duplicate detection during followup) | \`${paths.softwareRoot}/profiles/\` |`,
16497
+ `| \`<MEETINGS_DIR>\` | Where meeting notes live (for cross-references) | \`${paths.meetingsRoot}/\` |`,
16469
16498
  "",
16470
16499
  `If \`${paths.docsRoot}/project-context.md\` specifies a different people-research`,
16471
16500
  "tree or cross-reference target, prefer that. Otherwise fall back to",
@@ -17037,14 +17066,14 @@ function buildProfilePersonSkill(paths, issueDefaults) {
17037
17066
  `If the project has no override in \`${paths.docsRoot}/project-context.md\` or`,
17038
17067
  "`agentConfig.rules`, outputs land under:",
17039
17068
  "",
17040
- "- `docs/people/notes/<slug>.notes.md`",
17041
- "- `docs/people/profiles/<slug>.md`",
17069
+ `- \`${paths.peopleRoot}/notes/<slug>.notes.md\``,
17070
+ `- \`${paths.peopleRoot}/profiles/<slug>.md\``,
17042
17071
  "",
17043
17072
  "Cross-references are resolved against:",
17044
17073
  "",
17045
- "- `docs/companies/profiles/`",
17046
- "- `docs/software/profiles/`",
17047
- "- `docs/meetings/`",
17074
+ `- \`${paths.companiesRoot}/profiles/\``,
17075
+ `- \`${paths.softwareRoot}/profiles/\``,
17076
+ `- \`${paths.meetingsRoot}/\``,
17048
17077
  "",
17049
17078
  "## Steps",
17050
17079
  "",
@@ -20803,7 +20832,7 @@ function buildRequirementsAnalystSubAgent(paths, issueDefaults) {
20803
20832
  `| \`<COMPETITIVE_ROOT>\` | Competitive analysis docs | \`${paths.docsRoot}/business-strategy/competitive/\` |`,
20804
20833
  `| \`<PRODUCT_ROOT>\` | Product roadmap / entity taxonomy | \`${paths.docsRoot}/product/\` |`,
20805
20834
  `| \`<MEETINGS_ROOT>\` | Meeting extracts | \`${paths.docsRoot}/research/meetings/\` |`,
20806
- `| \`<RESEARCH_REQUIREMENTS_ROOT>\` | Scan reports and proposals | \`${paths.docsRoot}/research/requirements/\` |`,
20835
+ `| \`<RESEARCH_REQUIREMENTS_ROOT>\` | Scan reports and proposals | \`${paths.researchRequirementsRoot}/\` |`,
20807
20836
  `| \`<REQUIREMENTS_ROOT>\` | Final requirement documents (owned by requirements-writer) | \`${paths.requirementsRoot}/\` |`,
20808
20837
  "| `<PREFIX>` | Project-specific requirement ID prefix | e.g. `VRTX`, `ACME` |",
20809
20838
  "",
@@ -21224,7 +21253,7 @@ function buildRequirementsAnalystBundle(paths = DEFAULT_AGENT_PATHS, issueDefaul
21224
21253
  var requirementsAnalystBundle = buildRequirementsAnalystBundle();
21225
21254
 
21226
21255
  // src/agent/bundles/requirements-writer.ts
21227
- var TEMPLATE_BR = `---
21256
+ var templateBr = (paths) => `---
21228
21257
  title: "BR-NNN: [Business Requirement Title]"
21229
21258
  ---
21230
21259
 
@@ -21293,9 +21322,9 @@ Other business requirements, external factors, or organizational decisions this
21293
21322
 
21294
21323
  ## Traceability
21295
21324
 
21296
- - **Decomposes into:** [FR-NNN](../functional/FR-NNN-slug.md), [FR-NNN](../functional/FR-NNN-slug.md)
21297
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
21298
- - **Related:** [SEC-NNN](../security/SEC-NNN-slug.md)
21325
+ - **Decomposes into:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md), [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
21326
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
21327
+ - **Related:** [SEC-NNN](../${paths.requirementCategoryDirs.security}/SEC-NNN-slug.md)
21299
21328
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
21300
21329
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
21301
21330
 
@@ -21331,7 +21360,7 @@ Other business requirements, external factors, or organizational decisions this
21331
21360
  |---|---|---|
21332
21361
  | YYYY-MM-DD | [Name] | Initial draft |
21333
21362
  `;
21334
- var TEMPLATE_FR = `---
21363
+ var templateFr = (paths) => `---
21335
21364
  title: "FR-NNN: [Functional Requirement Title]"
21336
21365
  ---
21337
21366
 
@@ -21432,9 +21461,9 @@ What data is created, read, updated, or deleted by this feature. Reference DR do
21432
21461
 
21433
21462
  ## Traceability
21434
21463
 
21435
- - **Implements:** [BR-NNN](../business/BR-NNN-slug.md)
21436
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
21437
- - **Related:** [INT-NNN](../integration/INT-NNN-slug.md)
21464
+ - **Implements:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
21465
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
21466
+ - **Related:** [INT-NNN](../${paths.requirementCategoryDirs.integration}/INT-NNN-slug.md)
21438
21467
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
21439
21468
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
21440
21469
 
@@ -21470,7 +21499,7 @@ What data is created, read, updated, or deleted by this feature. Reference DR do
21470
21499
  |---|---|---|
21471
21500
  | YYYY-MM-DD | [Name] | Initial draft |
21472
21501
  `;
21473
- var TEMPLATE_NFR = `---
21502
+ var templateNfr = (paths) => `---
21474
21503
  title: "NFR-NNN: [Non-Functional Requirement Title]"
21475
21504
  ---
21476
21505
 
@@ -21532,9 +21561,9 @@ How compliance with this requirement will be monitored in production. Reference
21532
21561
 
21533
21562
  ## Traceability
21534
21563
 
21535
- - **Supports:** [BR-NNN](../business/BR-NNN-slug.md)
21536
- - **Constrains:** [FR-NNN](../functional/FR-NNN-slug.md)
21537
- - **Monitored by:** [OPS-NNN](../operational/OPS-NNN-slug.md)
21564
+ - **Supports:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
21565
+ - **Constrains:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
21566
+ - **Monitored by:** [OPS-NNN](../${paths.requirementCategoryDirs.operational}/OPS-NNN-slug.md)
21538
21567
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
21539
21568
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
21540
21569
 
@@ -21570,7 +21599,7 @@ How compliance with this requirement will be monitored in production. Reference
21570
21599
  |---|---|---|
21571
21600
  | YYYY-MM-DD | [Name] | Initial draft |
21572
21601
  `;
21573
- var TEMPLATE_TR = `---
21602
+ var templateTr = (paths) => `---
21574
21603
  title: "TR-NNN: [Technical Requirement Title]"
21575
21604
  ---
21576
21605
 
@@ -21683,9 +21712,9 @@ Other technologies this choice interacts with, and any known compatibility const
21683
21712
 
21684
21713
  ## Traceability
21685
21714
 
21686
- - **Justified by:** [ADR-NNN](../architectural-decisions/ADR-NNN-slug.md)
21687
- - **Supports:** [FR-NNN](../functional/FR-NNN-slug.md)
21688
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
21715
+ - **Justified by:** [ADR-NNN](../${paths.requirementCategoryDirs.architecturalDecisions}/ADR-NNN-slug.md)
21716
+ - **Supports:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
21717
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
21689
21718
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
21690
21719
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
21691
21720
 
@@ -21721,7 +21750,7 @@ Other technologies this choice interacts with, and any known compatibility const
21721
21750
  |---|---|---|
21722
21751
  | YYYY-MM-DD | [Name] | Initial draft |
21723
21752
  `;
21724
- var TEMPLATE_ADR = `---
21753
+ var templateAdr = (paths) => `---
21725
21754
  title: "ADR-NNN: [Decision Title]"
21726
21755
  ---
21727
21756
 
@@ -21811,8 +21840,8 @@ High-level guidance for implementing this decision. Detailed implementation goes
21811
21840
 
21812
21841
  ## Traceability
21813
21842
 
21814
- - **Supports:** [BR-NNN](../business/BR-NNN-slug.md)
21815
- - **Implemented by:** [TR-NNN](../technical/TR-NNN-slug.md)
21843
+ - **Supports:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
21844
+ - **Implemented by:** [TR-NNN](../${paths.requirementCategoryDirs.technical}/TR-NNN-slug.md)
21816
21845
  - **Related:** [ADR-NNN](ADR-NNN-slug.md)
21817
21846
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
21818
21847
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
@@ -21849,7 +21878,7 @@ High-level guidance for implementing this decision. Detailed implementation goes
21849
21878
  |---|---|---|
21850
21879
  | YYYY-MM-DD | [Name] | Initial draft |
21851
21880
  `;
21852
- var TEMPLATE_SEC = `---
21881
+ var templateSec = (paths) => `---
21853
21882
  title: "SEC-NNN: [Security Requirement Title]"
21854
21883
  ---
21855
21884
 
@@ -21921,10 +21950,10 @@ How compliance with this security requirement will be verified.
21921
21950
 
21922
21951
  ## Traceability
21923
21952
 
21924
- - **Protects:** [FR-NNN](../functional/FR-NNN-slug.md)
21925
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
21926
- - **Implements:** [BR-NNN](../business/BR-NNN-slug.md)
21927
- - **Related data:** [DR-NNN](../data/DR-NNN-slug.md)
21953
+ - **Protects:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
21954
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
21955
+ - **Implements:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
21956
+ - **Related data:** [DR-NNN](../${paths.requirementCategoryDirs.data}/DR-NNN-slug.md)
21928
21957
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
21929
21958
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
21930
21959
 
@@ -21960,7 +21989,7 @@ How compliance with this security requirement will be verified.
21960
21989
  |---|---|---|
21961
21990
  | YYYY-MM-DD | [Name] | Initial draft |
21962
21991
  `;
21963
- var TEMPLATE_DR = `---
21992
+ var templateDr = (paths) => `---
21964
21993
  title: "DR-NNN: [Data Requirement Title]"
21965
21994
  ---
21966
21995
 
@@ -22036,9 +22065,9 @@ How this data is classified and what handling rules apply based on that classifi
22036
22065
 
22037
22066
  ## Traceability
22038
22067
 
22039
- - **Supports:** [FR-NNN](../functional/FR-NNN-slug.md)
22040
- - **Protected by:** [SEC-NNN](../security/SEC-NNN-slug.md)
22041
- - **Stored per:** [TR-NNN](../technical/TR-NNN-slug.md)
22068
+ - **Supports:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
22069
+ - **Protected by:** [SEC-NNN](../${paths.requirementCategoryDirs.security}/SEC-NNN-slug.md)
22070
+ - **Stored per:** [TR-NNN](../${paths.requirementCategoryDirs.technical}/TR-NNN-slug.md)
22042
22071
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22043
22072
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22044
22073
 
@@ -22074,7 +22103,7 @@ How this data is classified and what handling rules apply based on that classifi
22074
22103
  |---|---|---|
22075
22104
  | YYYY-MM-DD | [Name] | Initial draft |
22076
22105
  `;
22077
- var TEMPLATE_INT = `---
22106
+ var templateInt = (paths) => `---
22078
22107
  title: "INT-NNN: [Integration Requirement Title]"
22079
22108
  ---
22080
22109
 
@@ -22167,9 +22196,9 @@ What happens when this integration is unavailable. How does the system degrade g
22167
22196
 
22168
22197
  ## Traceability
22169
22198
 
22170
- - **Enables:** [FR-NNN](../functional/FR-NNN-slug.md)
22171
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
22172
- - **Secured by:** [SEC-NNN](../security/SEC-NNN-slug.md)
22199
+ - **Enables:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
22200
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
22201
+ - **Secured by:** [SEC-NNN](../${paths.requirementCategoryDirs.security}/SEC-NNN-slug.md)
22173
22202
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22174
22203
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22175
22204
 
@@ -22205,7 +22234,7 @@ What happens when this integration is unavailable. How does the system degrade g
22205
22234
  |---|---|---|
22206
22235
  | YYYY-MM-DD | [Name] | Initial draft |
22207
22236
  `;
22208
- var TEMPLATE_OPS = `---
22237
+ var templateOps = (paths) => `---
22209
22238
  title: "OPS-NNN: [Operational Requirement Title]"
22210
22239
  ---
22211
22240
 
@@ -22281,9 +22310,9 @@ If this applies to an existing system, document the current operational posture.
22281
22310
 
22282
22311
  ## Traceability
22283
22312
 
22284
- - **Monitors:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
22285
- - **Supports:** [BR-NNN](../business/BR-NNN-slug.md)
22286
- - **Uses:** [TR-NNN](../technical/TR-NNN-slug.md)
22313
+ - **Monitors:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
22314
+ - **Supports:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
22315
+ - **Uses:** [TR-NNN](../${paths.requirementCategoryDirs.technical}/TR-NNN-slug.md)
22287
22316
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22288
22317
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22289
22318
 
@@ -22319,7 +22348,7 @@ If this applies to an existing system, document the current operational posture.
22319
22348
  |---|---|---|
22320
22349
  | YYYY-MM-DD | [Name] | Initial draft |
22321
22350
  `;
22322
- var TEMPLATE_UX = `---
22351
+ var templateUx = (paths) => `---
22323
22352
  title: "UX-NNN: [UX Requirement Title]"
22324
22353
  ---
22325
22354
 
@@ -22397,9 +22426,9 @@ Reference to the project's design system, component library, or style guide if o
22397
22426
 
22398
22427
  ## Traceability
22399
22428
 
22400
- - **Enhances:** [FR-NNN](../functional/FR-NNN-slug.md)
22401
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
22402
- - **Supports:** [BR-NNN](../business/BR-NNN-slug.md)
22429
+ - **Enhances:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
22430
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
22431
+ - **Supports:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
22403
22432
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22404
22433
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22405
22434
 
@@ -22435,7 +22464,7 @@ Reference to the project's design system, component library, or style guide if o
22435
22464
  |---|---|---|
22436
22465
  | YYYY-MM-DD | [Name] | Initial draft |
22437
22466
  `;
22438
- var TEMPLATE_MT = `---
22467
+ var templateMt = (paths) => `---
22439
22468
  title: "MT-NNN: [Multi-Tenancy Requirement Title]"
22440
22469
  ---
22441
22470
 
@@ -22514,9 +22543,9 @@ How the system prevents one tenant from degrading the experience of others.
22514
22543
 
22515
22544
  ## Traceability
22516
22545
 
22517
- - **Implements:** [BR-NNN](../business/BR-NNN-slug.md)
22518
- - **Secured by:** [SEC-NNN](../security/SEC-NNN-slug.md)
22519
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
22546
+ - **Implements:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
22547
+ - **Secured by:** [SEC-NNN](../${paths.requirementCategoryDirs.security}/SEC-NNN-slug.md)
22548
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
22520
22549
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22521
22550
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22522
22551
 
@@ -22587,7 +22616,7 @@ Use [\`_template-{PREFIX}.md\`](../templates/_template-{PREFIX}.md) for all new
22587
22616
  - Every document must include YAML frontmatter with a \`title\` field
22588
22617
  - Every document must include a \`## Traceability\` section
22589
22618
  `;
22590
- var TEMPLATE_REQUIREMENTS_README = `---
22619
+ var templateRequirementsReadme = (paths) => `---
22591
22620
  title: "[Project Name] \u2014 Requirements Documentation"
22592
22621
  ---
22593
22622
 
@@ -22597,17 +22626,17 @@ This directory contains the structured requirements taxonomy for [Project Name].
22597
22626
 
22598
22627
  | Category | Prefix | Directory | Purpose |
22599
22628
  |---|---|---|---|
22600
- | Business Requirements | BR | [\`business/\`](business/README.md) | Strategic intent, stakeholders, success metrics |
22601
- | Functional Requirements | FR | [\`functional/\`](functional/README.md) | User stories, flows, acceptance criteria |
22602
- | Non-Functional Requirements | NFR | [\`non-functional/\`](non-functional/README.md) | Performance, scalability, availability targets |
22603
- | Technical Requirements | TR | [\`technical/\`](technical/README.md) | Technology choices, framework decisions |
22604
- | Architectural Decisions | ADR | [\`architectural-decisions/\`](architectural-decisions/README.md) | Context, decision, consequences (standard ADR format) |
22605
- | Security & Compliance | SEC | [\`security/\`](security/README.md) | Auth, encryption, audit, regulatory |
22606
- | Data Requirements | DR | [\`data/\`](data/README.md) | Data models, retention, classification, RPO/RTO |
22607
- | Integration Requirements | INT | [\`integration/\`](integration/README.md) | APIs, third-party systems, protocols |
22608
- | Operational Requirements | OPS | [\`operational/\`](operational/README.md) | Deployment, monitoring, alerting, logging |
22609
- | UX Requirements | UX | [\`ux/\`](ux/README.md) | Accessibility, responsiveness, i18n |
22610
- | Multi-Tenancy & Licensing | MT | [\`multi-tenancy/\`](multi-tenancy/README.md) | Tenant isolation, feature gating, billing |
22629
+ | Business Requirements | BR | [\`${paths.requirementCategoryDirs.business}/\`](${paths.requirementCategoryDirs.business}/README.md) | Strategic intent, stakeholders, success metrics |
22630
+ | Functional Requirements | FR | [\`${paths.requirementCategoryDirs.functional}/\`](${paths.requirementCategoryDirs.functional}/README.md) | User stories, flows, acceptance criteria |
22631
+ | Non-Functional Requirements | NFR | [\`${paths.requirementCategoryDirs.nonFunctional}/\`](${paths.requirementCategoryDirs.nonFunctional}/README.md) | Performance, scalability, availability targets |
22632
+ | Technical Requirements | TR | [\`${paths.requirementCategoryDirs.technical}/\`](${paths.requirementCategoryDirs.technical}/README.md) | Technology choices, framework decisions |
22633
+ | Architectural Decisions | ADR | [\`${paths.requirementCategoryDirs.architecturalDecisions}/\`](${paths.requirementCategoryDirs.architecturalDecisions}/README.md) | Context, decision, consequences (standard ADR format) |
22634
+ | Security & Compliance | SEC | [\`${paths.requirementCategoryDirs.security}/\`](${paths.requirementCategoryDirs.security}/README.md) | Auth, encryption, audit, regulatory |
22635
+ | Data Requirements | DR | [\`${paths.requirementCategoryDirs.data}/\`](${paths.requirementCategoryDirs.data}/README.md) | Data models, retention, classification, RPO/RTO |
22636
+ | Integration Requirements | INT | [\`${paths.requirementCategoryDirs.integration}/\`](${paths.requirementCategoryDirs.integration}/README.md) | APIs, third-party systems, protocols |
22637
+ | Operational Requirements | OPS | [\`${paths.requirementCategoryDirs.operational}/\`](${paths.requirementCategoryDirs.operational}/README.md) | Deployment, monitoring, alerting, logging |
22638
+ | UX Requirements | UX | [\`${paths.requirementCategoryDirs.ux}/\`](${paths.requirementCategoryDirs.ux}/README.md) | Accessibility, responsiveness, i18n |
22639
+ | Multi-Tenancy & Licensing | MT | [\`${paths.requirementCategoryDirs.multiTenancy}/\`](${paths.requirementCategoryDirs.multiTenancy}/README.md) | Tenant isolation, feature gating, billing |
22611
22640
 
22612
22641
  Each directory contains a \`README.md\` with detailed guidance on what belongs in that category (and what doesn't), common disambiguation tips, and project-specific context. When unsure where a requirement belongs, start with the category README.
22613
22642
 
@@ -22673,9 +22702,9 @@ Example:
22673
22702
  \`\`\`markdown
22674
22703
  ## Traceability
22675
22704
 
22676
- - **Implements:** [FR-001](../functional/FR-001-user-registration.md)
22677
- - **Constrained by:** [NFR-001](../non-functional/NFR-001-uptime-sla.md)
22678
- - **Related:** [SEC-001](../security/SEC-001-multi-tenant-auth.md)
22705
+ - **Implements:** [FR-001](../${paths.requirementCategoryDirs.functional}/FR-001-user-registration.md)
22706
+ - **Constrained by:** [NFR-001](../${paths.requirementCategoryDirs.nonFunctional}/NFR-001-uptime-sla.md)
22707
+ - **Related:** [SEC-001](../${paths.requirementCategoryDirs.security}/SEC-001-multi-tenant-auth.md)
22679
22708
  \`\`\`
22680
22709
 
22681
22710
  ### Link Types
@@ -23069,35 +23098,70 @@ var WRITE_REQUIREMENT_EVALS_JSON = JSON.stringify(
23069
23098
  null,
23070
23099
  2
23071
23100
  );
23072
- var REQUIREMENTS_WRITER_REFERENCE_FILES = [
23073
- { path: "_references/templates/_template-BR.md", content: TEMPLATE_BR },
23074
- { path: "_references/templates/_template-FR.md", content: TEMPLATE_FR },
23075
- { path: "_references/templates/_template-NFR.md", content: TEMPLATE_NFR },
23076
- { path: "_references/templates/_template-TR.md", content: TEMPLATE_TR },
23077
- { path: "_references/templates/_template-ADR.md", content: TEMPLATE_ADR },
23078
- { path: "_references/templates/_template-SEC.md", content: TEMPLATE_SEC },
23079
- { path: "_references/templates/_template-DR.md", content: TEMPLATE_DR },
23080
- { path: "_references/templates/_template-INT.md", content: TEMPLATE_INT },
23081
- { path: "_references/templates/_template-OPS.md", content: TEMPLATE_OPS },
23082
- { path: "_references/templates/_template-UX.md", content: TEMPLATE_UX },
23083
- { path: "_references/templates/_template-MT.md", content: TEMPLATE_MT },
23084
- {
23085
- path: "_references/templates/_template-category-README.md",
23086
- content: TEMPLATE_CATEGORY_README
23087
- },
23088
- {
23089
- path: "_references/templates/_template-requirements-README.md",
23090
- content: TEMPLATE_REQUIREMENTS_README
23091
- },
23092
- {
23093
- path: "_references/standards-and-frameworks.md",
23094
- content: STANDARDS_AND_FRAMEWORKS
23095
- },
23096
- {
23097
- path: "evals/evals.json",
23098
- content: WRITE_REQUIREMENT_EVALS_JSON
23099
- }
23100
- ];
23101
+ function buildRequirementsWriterReferenceFiles(paths) {
23102
+ return [
23103
+ {
23104
+ path: "_references/templates/_template-BR.md",
23105
+ content: templateBr(paths)
23106
+ },
23107
+ {
23108
+ path: "_references/templates/_template-FR.md",
23109
+ content: templateFr(paths)
23110
+ },
23111
+ {
23112
+ path: "_references/templates/_template-NFR.md",
23113
+ content: templateNfr(paths)
23114
+ },
23115
+ {
23116
+ path: "_references/templates/_template-TR.md",
23117
+ content: templateTr(paths)
23118
+ },
23119
+ {
23120
+ path: "_references/templates/_template-ADR.md",
23121
+ content: templateAdr(paths)
23122
+ },
23123
+ {
23124
+ path: "_references/templates/_template-SEC.md",
23125
+ content: templateSec(paths)
23126
+ },
23127
+ {
23128
+ path: "_references/templates/_template-DR.md",
23129
+ content: templateDr(paths)
23130
+ },
23131
+ {
23132
+ path: "_references/templates/_template-INT.md",
23133
+ content: templateInt(paths)
23134
+ },
23135
+ {
23136
+ path: "_references/templates/_template-OPS.md",
23137
+ content: templateOps(paths)
23138
+ },
23139
+ {
23140
+ path: "_references/templates/_template-UX.md",
23141
+ content: templateUx(paths)
23142
+ },
23143
+ {
23144
+ path: "_references/templates/_template-MT.md",
23145
+ content: templateMt(paths)
23146
+ },
23147
+ {
23148
+ path: "_references/templates/_template-category-README.md",
23149
+ content: TEMPLATE_CATEGORY_README
23150
+ },
23151
+ {
23152
+ path: "_references/templates/_template-requirements-README.md",
23153
+ content: templateRequirementsReadme(paths)
23154
+ },
23155
+ {
23156
+ path: "_references/standards-and-frameworks.md",
23157
+ content: STANDARDS_AND_FRAMEWORKS
23158
+ },
23159
+ {
23160
+ path: "evals/evals.json",
23161
+ content: WRITE_REQUIREMENT_EVALS_JSON
23162
+ }
23163
+ ];
23164
+ }
23101
23165
  function buildRequirementsWriterSubAgent(paths) {
23102
23166
  return {
23103
23167
  name: "requirements-writer",
@@ -23297,13 +23361,13 @@ function buildRequirementsWriterSubAgent(paths) {
23297
23361
  "1. Write the requirement itself (FR, DR, INT, OPS, etc.) with full",
23298
23362
  " detail.",
23299
23363
  "2. Where the requirement needs a technology decision, add a note:",
23300
- ' *"Technology selection pending \u2014 see [ADR-NNN](../architectural-decisions/ADR-NNN-slug.md)"*.',
23364
+ ` *"Technology selection pending \u2014 see [ADR-NNN](../${paths.requirementCategoryDirs.architecturalDecisions}/ADR-NNN-slug.md)"*.`,
23301
23365
  "3. Create the corresponding ADR or TR as `Proposed` with options,",
23302
23366
  " pros/cons, and recommendation.",
23303
23367
  '4. In the ADR/TR open items, add: *"Human decision required.',
23304
23368
  ' Dependent requirements: [list]"*.',
23305
23369
  "5. In the original requirement's open items, add a cross-reference:",
23306
- ' *"Blocked by [ADR-NNN](../architectural-decisions/ADR-NNN-slug.md) \u2014',
23370
+ ` *"Blocked by [ADR-NNN](../${paths.requirementCategoryDirs.architecturalDecisions}/ADR-NNN-slug.md) \u2014`,
23307
23371
  ' technology selection pending human review."*',
23308
23372
  "",
23309
23373
  "This creates a clear chain: the requirement is understood, the",
@@ -23390,9 +23454,9 @@ function buildRequirementsWriterSubAgent(paths) {
23390
23454
  "```markdown",
23391
23455
  "## Traceability",
23392
23456
  "",
23393
- "- **Implements:** [BR-001](../business/BR-001-self-service-onboarding.md)",
23394
- "- **Constrained by:** [NFR-001](../non-functional/NFR-001-api-response-times.md)",
23395
- "- **Related:** [SEC-001](../security/SEC-001-authentication-framework.md)",
23457
+ `- **Implements:** [BR-001](../${paths.requirementCategoryDirs.business}/BR-001-self-service-onboarding.md)`,
23458
+ `- **Constrained by:** [NFR-001](../${paths.requirementCategoryDirs.nonFunctional}/NFR-001-api-response-times.md)`,
23459
+ `- **Related:** [SEC-001](../${paths.requirementCategoryDirs.security}/SEC-001-authentication-framework.md)`,
23396
23460
  "```",
23397
23461
  "",
23398
23462
  "### Link Types",
@@ -23452,7 +23516,7 @@ function buildRequirementsWriterSubAgent(paths) {
23452
23516
  "",
23453
23517
  "Number each item within its subsection. Assign a priority. Call out",
23454
23518
  "interdependencies with open items in other documents using the",
23455
- "format: `-> Depends on: [FR-001 Open Item #2](../functional/FR-001-slug.md#open-items)`.",
23519
+ `format: \`-> Depends on: [FR-001 Open Item #2](../${paths.requirementCategoryDirs.functional}/FR-001-slug.md#open-items)\`.`,
23456
23520
  "",
23457
23521
  "The `## Open Items` section is **not optional** \u2014 it appears in every",
23458
23522
  'document, even if a subsection is empty (write "None identified.").',
@@ -23711,7 +23775,7 @@ function buildWriteRequirementSkill(paths, issueDefaults) {
23711
23775
  context: "fork",
23712
23776
  agent: "requirements-writer",
23713
23777
  platforms: { cursor: { exclude: true } },
23714
- referenceFiles: REQUIREMENTS_WRITER_REFERENCE_FILES,
23778
+ referenceFiles: buildRequirementsWriterReferenceFiles(paths),
23715
23779
  instructions: [
23716
23780
  "# Write Requirement",
23717
23781
  "",
@@ -24023,7 +24087,7 @@ function buildRequirementsReviewerSubAgent(paths, issueDefaults) {
24023
24087
  "1. **Full audit** \u2014 every requirement document under",
24024
24088
  " `<REQUIREMENTS_ROOT>` across all categories",
24025
24089
  "2. **Category audit** \u2014 every document in one category directory",
24026
- " (e.g., all FRs under `<REQUIREMENTS_ROOT>/functional/`)",
24090
+ ` (e.g., all FRs under \`<REQUIREMENTS_ROOT>/${paths.requirementCategoryDirs.functional}/\`)`,
24027
24091
  "3. **Single document** \u2014 one specific requirement file",
24028
24092
  "4. **Targeted check** \u2014 one or more checks from the catalog below,",
24029
24093
  ' run across the documents in scope (e.g., "check all traceability',
@@ -24451,7 +24515,7 @@ function buildRequirementsReviewerSubAgent(paths, issueDefaults) {
24451
24515
  "",
24452
24516
  "Each finding must cite the file path and the specific check that",
24453
24517
  'produced it (e.g., "Check 4: Cross-Reference Integrity \u2014 target',
24454
- "file `../security/SEC-007-audit-logs.md` does not exist on",
24518
+ `file \`../${paths.requirementCategoryDirs.security}/SEC-007-audit-logs.md\` does not exist on`,
24455
24519
  'disk").',
24456
24520
  "",
24457
24521
  "---",
@@ -26065,13 +26129,13 @@ function buildSoftwareProfileAnalystSubAgent(paths, issueDefaults, tier) {
26065
26129
  "",
26066
26130
  "| Placeholder | Meaning | Default |",
26067
26131
  "|-------------|---------|---------|",
26068
- "| `<SOFTWARE_ROOT>` | Root folder for software profiles | `docs/software/` |",
26132
+ `| \`<SOFTWARE_ROOT>\` | Root folder for software profiles | \`${paths.softwareRoot}/\` |`,
26069
26133
  "| `<PROFILES_DIR>` | Final software profile files | `<SOFTWARE_ROOT>/profiles/` |",
26070
26134
  "| `<NOTES_DIR>` | Research-notes files from Phase 1 | `<SOFTWARE_ROOT>/notes/` |",
26071
26135
  "| `<MATRIX_FILE>` | Shared feature-matrix file | `<SOFTWARE_ROOT>/feature-matrix.md` |",
26072
26136
  "| `<PRODUCT_SLUG>` | Short kebab-case slug identifying the product | derived from the product name |",
26073
- "| `<COMPANY_PROFILES_DIR>` | Where existing company profiles live (for duplicate detection during followup) | `docs/companies/profiles/` |",
26074
- "| `<PEOPLE_PROFILES_DIR>` | Where existing people profiles live (for duplicate detection during followup) | `docs/people/profiles/` |",
26137
+ `| \`<COMPANY_PROFILES_DIR>\` | Where existing company profiles live (for duplicate detection during followup) | \`${paths.companiesRoot}/profiles/\` |`,
26138
+ `| \`<PEOPLE_PROFILES_DIR>\` | Where existing people profiles live (for duplicate detection during followup) | \`${paths.peopleRoot}/profiles/\` |`,
26075
26139
  `| \`<BCM_DOC_ROOT>\` | Root folder for BCM capability-model documents (used by Phase 4 to locate capabilities) | \`${paths.bcmRoot}/\` |`,
26076
26140
  "| `<BCM_CAPABILITY_MAP>` | Capability-map file that lists the L1/L2/L3 hierarchy | `<BCM_DOC_ROOT>/capability-map.md` |",
26077
26141
  "| `<UNMAPPED_THRESHOLD>` | Minimum number of unmapped features on a single profile that triggers a `bcm:outline` follow-up for that feature cluster | `1` (every unmapped feature triggers a `bcm:outline`) |",
@@ -26741,9 +26805,9 @@ function buildProfileSoftwareSkill(paths, issueDefaults) {
26741
26805
  `If the project has no override in \`${paths.docsRoot}/project-context.md\` or`,
26742
26806
  "`agentConfig.rules`, outputs land under:",
26743
26807
  "",
26744
- "- `docs/software/notes/<slug>.notes.md`",
26745
- "- `docs/software/profiles/<slug>.md`",
26746
- "- `docs/software/feature-matrix.md` (shared across all products)",
26808
+ `- \`${paths.softwareRoot}/notes/<slug>.notes.md\``,
26809
+ `- \`${paths.softwareRoot}/profiles/<slug>.md\``,
26810
+ `- \`${paths.softwareRoot}/feature-matrix.md\` (shared across all products)`,
26747
26811
  "",
26748
26812
  "## Steps",
26749
26813
  "",
@@ -26829,7 +26893,7 @@ function buildMapSoftwareSkill(paths, issueDefaults) {
26829
26893
  `- \`${paths.bcmRoot}/\` \u2014 BCM capability-model documents`,
26830
26894
  `- \`${paths.bcmRoot}/capability-map.md\` \u2014 capability map`,
26831
26895
  "",
26832
- "and writes back to `docs/software/profiles/<slug>.md` under the",
26896
+ `and writes back to \`${paths.softwareRoot}/profiles/<slug>.md\` under the`,
26833
26897
  "`## Capability Mapping` section only. No other section of the",
26834
26898
  "profile is rewritten.",
26835
26899
  "",
@@ -37497,6 +37561,7 @@ export {
37497
37561
  DEFAULT_PROGRESS_FILES_FORMAT,
37498
37562
  DEFAULT_PROGRESS_FILES_STALE_AFTER_HOURS,
37499
37563
  DEFAULT_PROGRESS_FILES_STATE_DIR,
37564
+ DEFAULT_REQUIREMENT_CATEGORY_DIRS,
37500
37565
  DEFAULT_REQUIRE_PRODUCT_CONTEXT,
37501
37566
  DEFAULT_RESOLVED_ISSUE_DEFAULTS,
37502
37567
  DEFAULT_SAMPLE_COMPILER_OPTIONS,