SYMBOL INDEX (787 symbols across 61 files) FILE: src/core-skills/bmad-distillator/scripts/analyze_sources.py function resolve_inputs (line 82) | def resolve_inputs(inputs: list[str]) -> list[Path]: function detect_doc_type (line 113) | def detect_doc_type(filename: str) -> str: function suggest_groups (line 122) | def suggest_groups(files: list[Path]) -> list[dict]: function analyze (line 186) | def analyze(inputs: list[str], output_path: str | None = None) -> None: function output_json (line 269) | def output_json(data: dict, output_path: str | None) -> None: function main (line 280) | def main() -> None: FILE: src/core-skills/bmad-distillator/scripts/tests/test_analyze_sources.py function temp_dir (line 26) | def temp_dir(): class TestResolveInputs (line 47) | class TestResolveInputs: method test_single_file (line 48) | def test_single_file(self, temp_dir): method test_folder_recursion (line 54) | def test_folder_recursion(self, temp_dir): method test_folder_skips_excluded_dirs (line 61) | def test_folder_skips_excluded_dirs(self, temp_dir): method test_folder_skips_non_text_files (line 66) | def test_folder_skips_non_text_files(self, temp_dir): method test_glob_pattern (line 71) | def test_glob_pattern(self, temp_dir): method test_deduplication (line 79) | def test_deduplication(self, temp_dir): method test_mixed_inputs (line 84) | def test_mixed_inputs(self, temp_dir): method test_nonexistent_path (line 92) | def test_nonexistent_path(self): class TestDetectDocType (line 97) | class TestDetectDocType: method test_detection (line 116) | def test_detection(self, filename, expected): class TestSuggestGroups (line 120) | class TestSuggestGroups: method test_groups_brief_with_discovery_notes (line 121) | def test_groups_brief_with_discovery_notes(self, temp_dir): method test_standalone_files (line 134) | def test_standalone_files(self, temp_dir): method test_mixed_grouped_and_standalone (line 144) | def test_mixed_grouped_and_standalone(self, temp_dir): class TestAnalyze (line 157) | class TestAnalyze: method test_basic_analysis (line 158) | def test_basic_analysis(self, temp_dir): method test_routing_single_small_input (line 168) | def test_routing_single_small_input(self, temp_dir): method test_routing_fanout_many_files (line 175) | def test_routing_fanout_many_files(self, temp_dir): method test_folder_analysis (line 184) | def test_folder_analysis(self, temp_dir): method test_no_files_found (line 192) | def test_no_files_found(self): method test_stdout_output (line 199) | def test_stdout_output(self, temp_dir, capsys): FILE: src/core-skills/bmad-init/scripts/bmad_init.py function find_project_root (line 48) | def find_project_root(llm_provided=None): function load_module_yaml (line 80) | def load_module_yaml(path): function find_core_module_yaml (line 114) | def find_core_module_yaml(): function find_target_module_yaml (line 119) | def find_target_module_yaml(module_code, project_root, skill_path=None): function load_config_file (line 149) | def load_config_file(path): function load_module_config (line 159) | def load_module_config(module_code, project_root): function resolve_project_root_placeholder (line 165) | def resolve_project_root_placeholder(value, project_root): function parse_var_specs (line 174) | def parse_var_specs(vars_string): function expand_template (line 198) | def expand_template(value, context): function apply_result_template (line 214) | def apply_result_template(var_def, raw_value, context): function cmd_load (line 234) | def cmd_load(args): function cmd_check (line 281) | def cmd_check(args): function cmd_resolve_defaults (line 347) | def cmd_resolve_defaults(args): function cmd_write (line 405) | def cmd_write(args): function _write_config_file (line 525) | def _write_config_file(path, data, module_label): function main (line 539) | def main(): FILE: src/core-skills/bmad-init/scripts/tests/test_bmad_init.py class TestFindProjectRoot (line 33) | class TestFindProjectRoot(unittest.TestCase): method test_finds_bmad_folder (line 35) | def test_finds_bmad_folder(self): method test_llm_provided_with_bmad (line 49) | def test_llm_provided_with_bmad(self): method test_llm_provided_without_bmad_still_returns_dir (line 58) | def test_llm_provided_without_bmad_still_returns_dir(self): class TestParseVarSpecs (line 68) | class TestParseVarSpecs(unittest.TestCase): method test_vars_with_defaults (line 70) | def test_vars_with_defaults(self): method test_vars_without_defaults (line 76) | def test_vars_without_defaults(self): method test_mixed_vars (line 81) | def test_mixed_vars(self): method test_colon_in_default (line 86) | def test_colon_in_default(self): method test_empty_string (line 90) | def test_empty_string(self): method test_none (line 93) | def test_none(self): class TestResolveProjectRootPlaceholder (line 97) | class TestResolveProjectRootPlaceholder(unittest.TestCase): method test_resolve_placeholder (line 99) | def test_resolve_placeholder(self): method test_no_placeholder (line 103) | def test_no_placeholder(self): method test_none (line 107) | def test_none(self): method test_non_string (line 110) | def test_non_string(self): class TestExpandTemplate (line 114) | class TestExpandTemplate(unittest.TestCase): method test_basic_expansion (line 116) | def test_basic_expansion(self): method test_multiple_placeholders (line 120) | def test_multiple_placeholders(self): method test_none_value (line 127) | def test_none_value(self): method test_non_string (line 130) | def test_non_string(self): class TestApplyResultTemplate (line 134) | class TestApplyResultTemplate(unittest.TestCase): method test_with_result_template (line 136) | def test_with_result_template(self): method test_without_result_template (line 141) | def test_without_result_template(self): method test_value_only_template (line 145) | def test_value_only_template(self): class TestLoadModuleYaml (line 151) | class TestLoadModuleYaml(unittest.TestCase): method setUp (line 153) | def setUp(self): method tearDown (line 156) | def tearDown(self): method test_loads_core_module_yaml (line 159) | def test_loads_core_module_yaml(self): method test_loads_module_with_directories (line 177) | def test_loads_module_with_directories(self): method test_returns_none_for_missing (line 192) | def test_returns_none_for_missing(self): method test_returns_none_for_empty (line 196) | def test_returns_none_for_empty(self): class TestFindCoreModuleYaml (line 203) | class TestFindCoreModuleYaml(unittest.TestCase): method test_returns_path_to_resources (line 205) | def test_returns_path_to_resources(self): class TestFindTargetModuleYaml (line 210) | class TestFindTargetModuleYaml(unittest.TestCase): method setUp (line 212) | def setUp(self): method tearDown (line 216) | def tearDown(self): method test_finds_in_skill_assets (line 219) | def test_finds_in_skill_assets(self): method test_finds_in_skill_root (line 229) | def test_finds_in_skill_root(self): method test_finds_in_bmad_module_dir (line 237) | def test_finds_in_bmad_module_dir(self): method test_returns_none_when_not_found (line 245) | def test_returns_none_when_not_found(self): method test_skill_path_takes_priority (line 249) | def test_skill_path_takes_priority(self): class TestLoadConfigFile (line 264) | class TestLoadConfigFile(unittest.TestCase): method setUp (line 266) | def setUp(self): method tearDown (line 269) | def tearDown(self): method test_loads_flat_yaml (line 272) | def test_loads_flat_yaml(self): method test_returns_none_for_missing (line 278) | def test_returns_none_for_missing(self): class TestLoadModuleConfig (line 283) | class TestLoadModuleConfig(unittest.TestCase): method setUp (line 285) | def setUp(self): method tearDown (line 307) | def tearDown(self): method test_load_core (line 310) | def test_load_core(self): method test_load_module_includes_core_vars (line 315) | def test_load_module_includes_core_vars(self): method test_missing_module (line 323) | def test_missing_module(self): FILE: test/test-file-refs-csv.js constant FIXTURES (line 24) | const FIXTURES = path.join(__dirname, 'fixtures/file-refs-csv'); function test (line 30) | function test(name, fn) { function assert (line 42) | function assert(condition, message) { function loadFixture (line 46) | function loadFixture(relativePath) { FILE: test/test-install-to-bmad.js function assert (line 33) | function assert(condition, testName, errorMessage = '') { function runTests (line 46) | async function runTests() { FILE: test/test-installation-components.js function assert (line 38) | function assert(condition, testName, errorMessage = '') { function createTestBmadFixture (line 51) | async function createTestBmadFixture() { function createSkillCollisionFixture (line 84) | async function createSkillCollisionFixture() { function runTests (line 141) | async function runTests() { FILE: test/test-rehype-plugins.mjs function assert (line 38) | function assert(condition, testName, errorMessage = '') { constant CONTENT_DIR (line 55) | const CONTENT_DIR = '/project/src/content/docs'; constant STD_FILE (line 56) | const STD_FILE = { path: '/project/src/content/docs/guide/intro.md' }; constant STD_OPTS (line 57) | const STD_OPTS = { contentDir: CONTENT_DIR }; constant BASE (line 58) | const BASE = '/BMAD-METHOD/'; function transform (line 60) | function transform(tree, file, options = {}) { function transformBase (line 66) | function transformBase(tree, options = {}) { function makeAnchorTree (line 72) | function makeAnchorTree(href) { function makeElementTree (line 86) | function makeElementTree(tagName, properties) { function getHref (line 100) | function getHref(tree) { function getSrc (line 104) | function getSrc(tree) { function getRawValue (line 108) | function getRawValue(tree) { function runTests (line 116) | function runTests() { FILE: test/test-workflow-path-regex.js function assert (line 22) | function assert(condition, testName, errorMessage = '') { constant SOURCE_REGEX (line 41) | const SOURCE_REGEX = /\{project-root\}\/(?:_bmad)\/([^/]+)\/workflows\/(... constant INSTALL_REGEX (line 45) | const INSTALL_REGEX = /\{project-root\}\/(?:_bmad)\/([^/]+)\/workflows\/... FILE: tools/build-docs.mjs constant PROJECT_ROOT (line 22) | const PROJECT_ROOT = path.dirname(path.dirname(fileURLToPath(import.meta... constant BUILD_DIR (line 23) | const BUILD_DIR = path.join(PROJECT_ROOT, 'build'); constant REPO_URL (line 25) | const REPO_URL = 'https://github.com/bmad-code-org/BMAD-METHOD'; constant LLM_MAX_CHARS (line 30) | const LLM_MAX_CHARS = 600_000; constant LLM_WARN_CHARS (line 31) | const LLM_WARN_CHARS = 500_000; constant LLM_EXCLUDE_PATTERNS (line 33) | const LLM_EXCLUDE_PATTERNS = [ function main (line 54) | async function main() { function generateArtifacts (line 96) | async function generateArtifacts(docsDir) { function buildAstroSite (line 117) | function buildAstroSite() { function generateLlmsTxt (line 143) | function generateLlmsTxt(outputDir) { function generateLlmsFullTxt (line 191) | function generateLlmsFullTxt(docsDir, outputDir) { function compareLlmDocs (line 237) | function compareLlmDocs(a, b) { function getLlmSortKey (line 245) | function getLlmSortKey(filePath) { function getAllMarkdownFiles (line 261) | function getAllMarkdownFiles(dir, baseDir = dir) { function shouldExcludeFromLlm (line 285) | function shouldExcludeFromLlm(filePath) { function readMarkdownContent (line 295) | function readMarkdownContent(filePath) { function validateLlmSize (line 308) | function validateLlmSize(content) { function runAstroBuild (line 324) | function runAstroBuild() { function copyArtifactsToSite (line 343) | function copyArtifactsToSite(artifactsDir, siteDir) { function printBuildSummary (line 360) | function printBuildSummary(docsDir, artifactsDir, siteDir) { function listDirectoryContents (line 375) | function listDirectoryContents(dir) { function formatFileSize (line 396) | function formatFileSize(bytes) { function cleanBuildDirectory (line 413) | function cleanBuildDirectory() { function printHeader (line 426) | function printHeader(title) { function printBanner (line 436) | function printBanner(title) { function checkDocLinks (line 451) | function checkDocLinks() { FILE: tools/cli/bmad-cli.js function checkForUpdate (line 22) | async function checkForUpdate() { FILE: tools/cli/installers/lib/core/config-collector.js class ConfigCollector (line 8) | class ConfigCollector { method constructor (line 9) | constructor() { method _getModuleManager (line 20) | _getModuleManager() { method findBmadDir (line 34) | async findBmadDir(projectDir) { method detectExistingBmadFolder (line 68) | async detectExistingBmadFolder(projectDir) { method loadExistingConfig (line 97) | async loadExistingConfig(projectDir) { method scanModuleSchemas (line 151) | async scanModuleSchemas(modules) { method collectAllConfigurations (line 217) | async collectAllConfigurations(modules, projectDir, options = {}) { method collectModuleConfigQuick (line 348) | async collectModuleConfigQuick(moduleName, projectDir, silentMode = tr... method processResultTemplate (line 571) | processResultTemplate(resultTemplate, value) { method getDefaultUsername (line 630) | getDefaultUsername() { method collectModuleConfig (line 652) | async collectModuleConfig(moduleName, projectDir, skipLoadExisting = f... method replacePlaceholders (line 946) | replacePlaceholders(str, currentModule = null, moduleConfig = null) { method buildQuestion (line 989) | async buildQuestion(moduleName, key, item, moduleConfig = null) { method displayModulePostConfigNotes (line 1219) | async displayModulePostConfigNotes(moduleName, moduleConfig) { method deepMerge (line 1266) | deepMerge(target, source) { FILE: tools/cli/installers/lib/core/custom-module-cache.js class CustomModuleCache (line 12) | class CustomModuleCache { method constructor (line 13) | constructor(bmadDir) { method ensureCacheDir (line 22) | async ensureCacheDir() { method getCacheManifest (line 29) | async getCacheManifest() { method updateCacheManifest (line 42) | async updateCacheManifest(manifest) { method hashFileStream (line 59) | async hashFileStream(filePath, hash) { method calculateHash (line 71) | async calculateHash(sourcePath) { method cacheModule (line 114) | async cacheModule(moduleId, sourcePath, metadata = {}) { method getCachedModule (line 179) | async getCachedModule(moduleId) { method getAllCachedModules (line 213) | async getAllCachedModules() { method removeCachedModule (line 231) | async removeCachedModule(moduleId) { method syncCache (line 249) | async syncCache(moduleIds) { FILE: tools/cli/installers/lib/core/dependency-resolver.js class DependencyResolver (line 11) | class DependencyResolver { method constructor (line 12) | constructor() { method resolve (line 25) | async resolve(bmadDir, selectedModules = [], options = {}) { method collectPrimaryFiles (line 69) | async collectPrimaryFiles(bmadDir, modules, options = {}) { method parseDependencies (line 146) | async parseDependencies(files) { method parseCommandReferences (line 220) | parseCommandReferences(content) { method parseFileReferences (line 244) | parseFileReferences(content) { method resolveDependencyPaths (line 289) | async resolveDependencyPaths(bmadDir, dependencies) { method resolveSingleDependency (line 305) | async resolveSingleDependency(bmadDir, dep) { method resolveCommandToPath (line 491) | async resolveCommandToPath(bmadDir, command) { method resolveTransitiveDependencies (line 547) | async resolveTransitiveDependencies(bmadDir, directDeps) { method getModuleFromPath (line 583) | getModuleFromPath(bmadDir, filePath) { method organizeByModule (line 614) | organizeByModule(bmadDir, files) { method reportResults (line 665) | async reportResults(organized, selectedModules) { method createWebBundle (line 708) | async createWebBundle(resolution) { FILE: tools/cli/installers/lib/core/detector.js class Detector (line 6) | class Detector { method detect (line 12) | async detect(bmadDir) { method detectLegacy (line 142) | async detectLegacy(projectDir) { method checkMigrationNeeded (line 192) | async checkMigrationNeeded(projectDir) { method detectLegacyV4 (line 210) | async detectLegacyV4(projectDir) { FILE: tools/cli/installers/lib/core/ide-config-manager.js class IdeConfigManager (line 10) | class IdeConfigManager { method constructor (line 11) | constructor() {} method getIdeConfigDir (line 18) | getIdeConfigDir(bmadDir) { method getIdeConfigPath (line 28) | getIdeConfigPath(bmadDir, ideName) { method saveIdeConfig (line 38) | async saveIdeConfig(bmadDir, ideName, configuration) { method loadIdeConfig (line 85) | async loadIdeConfig(bmadDir, ideName) { method loadAllIdeConfigs (line 107) | async loadAllIdeConfigs(bmadDir) { method hasIdeConfig (line 139) | async hasIdeConfig(bmadDir, ideName) { method deleteIdeConfig (line 149) | async deleteIdeConfig(bmadDir, ideName) { FILE: tools/cli/installers/lib/core/installer.js class Installer (line 20) | class Installer { method constructor (line 21) | constructor() { method findBmadDir (line 43) | async findBmadDir(projectDir) { method copyFileWithPlaceholderReplacement (line 81) | async copyFileWithPlaceholderReplacement(sourcePath, targetPath) { method collectToolConfigurations (line 115) | async collectToolConfigurations( method install (line 229) | async install(originalConfig) { method renderInstallSummary (line 1374) | async renderInstallSummary(results, context = {}) { method update (line 1444) | async update(config) { method getStatus (line 1573) | async getStatus(directory) { method getAvailableModules (line 1582) | async getAvailableModules() { method uninstall (line 1595) | async uninstall(directory, options = {}) { method uninstallIdeConfigs (line 1635) | async uninstallIdeConfigs(projectDir, existingInstall, options = {}) { method uninstallOutputFolder (line 1651) | async uninstallOutputFolder(projectDir, outputFolder) { method uninstallModules (line 1670) | async uninstallModules(projectDir) { method getOutputFolder (line 1685) | async getOutputFolder(projectDir) { method _readOutputFolder (line 1696) | async _readOutputFolder(bmadDir) { method mergeModuleHelpCatalogs (line 1750) | async mergeModuleHelpCatalogs(bmadDir) { method parseCSVLine (line 1931) | parseCSVLine(line) { method escapeCSVField (line 1965) | escapeCSVField(field) { method createDirectoryStructure (line 1977) | async createDirectoryStructure(bmadDir) { method generateModuleConfigs (line 1989) | async generateModuleConfigs(bmadDir, moduleConfigs) { method installCoreWithDependencies (line 2085) | async installCoreWithDependencies(bmadDir, coreFiles) { method installModuleWithDependencies (line 2097) | async installModuleWithDependencies(moduleName, bmadDir, moduleFiles) { method installPartialModule (line 2127) | async installPartialModule(moduleName, bmadDir, files) { method installCore (line 2226) | async installCore(bmadDir) { method copyCoreFiles (line 2247) | async copyCoreFiles(sourcePath, targetPath) { method getFileList (line 2313) | async getFileList(dir, baseDir = dir) { method processAgentFiles (line 2336) | async processAgentFiles(modulePath, moduleName) { method updateCore (line 2386) | async updateCore(bmadDir, force = false) { method quickUpdate (line 2410) | async quickUpdate(config) { method compileAgents (line 2651) | async compileAgents(config) { method promptUpdateAction (line 2757) | async promptUpdateAction() { method handleLegacyV4Migration (line 2770) | async handleLegacyV4Migration(_projectDir, _legacyV4) { method readFilesManifest (line 2812) | async readFilesManifest(bmadDir) { method detectCustomFiles (line 2869) | async detectCustomFiles(bmadDir, existingFilesManifest) { method handleMissingCustomSources (line 2988) | async handleMissingCustomSources(customModuleSources, bmadDir, project... FILE: tools/cli/installers/lib/core/manifest-generator.js class ManifestGenerator (line 21) | class ManifestGenerator { method constructor (line 22) | constructor() { method loadSkillManifest (line 34) | async loadSkillManifest(dirPath) { method getCanonicalId (line 39) | getCanonicalId(manifest, filename) { method getArtifactType (line 44) | getArtifactType(manifest, filename) { method getInstallToBmad (line 49) | getInstallToBmad(manifest, filename) { method isNativeSkillDirType (line 59) | isNativeSkillDirType(artifactType) { method hasNativeSkillManifest (line 69) | hasNativeSkillManifest(manifest) { method cleanForCSV (line 82) | cleanForCSV(text) { method generateManifests (line 93) | async generateManifests(bmadDir, selectedModules, installedFiles = [],... method collectSkills (line 178) | async collectSkills() { method parseSkillMd (line 295) | async parseSkillMd(skillMdPath, dir, dirName, debug = false) { method collectWorkflows (line 341) | async collectWorkflows(selectedModules) { method getWorkflowsFromPath (line 362) | async getWorkflowsFromPath(basePath, moduleName, subDir = 'workflows') { method collectAgents (line 488) | async collectAgents(selectedModules) { method getAgentsFromDir (line 520) | async getAgentsFromDir(dirPath, moduleName, relativePath = '') { method collectTasks (line 641) | async collectTasks(selectedModules) { method getTasksFromDir (line 658) | async getTasksFromDir(dirPath, moduleName) { method collectTools (line 744) | async collectTools(selectedModules) { method getToolsFromDir (line 761) | async getToolsFromDir(dirPath, moduleName) { method writeMainManifest (line 848) | async writeMainManifest(cfgDir) { method getPreservedCsvRows (line 936) | async getPreservedCsvRows(csvPath, moduleColumnIndex, expectedColumns,... method upgradeRowToSchema (line 988) | upgradeRowToSchema(rowValues, oldColumns, newColumns, defaultValues) { method writeWorkflowManifest (line 1014) | async writeWorkflowManifest(cfgDir) { method writeSkillManifest (line 1057) | async writeSkillManifest(cfgDir) { method writeAgentManifest (line 1083) | async writeAgentManifest(cfgDir) { method writeTaskManifest (line 1157) | async writeTaskManifest(cfgDir) { method writeToolManifest (line 1221) | async writeToolManifest(cfgDir) { method calculateFileHash (line 1289) | async calculateFileHash(filePath) { method writeFilesManifest (line 1301) | async writeFilesManifest(cfgDir) { method scanInstalledModules (line 1368) | async scanInstalledModules(bmadDir) { method _hasSkillManifestRecursive (line 1413) | async _hasSkillManifestRecursive(dir) { FILE: tools/cli/installers/lib/core/manifest.js class Manifest (line 7) | class Manifest { method create (line 14) | async create(bmadDir, data, installedFiles = []) { method read (line 74) | async read(bmadDir) { method update (line 117) | async update(bmadDir, updates, installedFiles = null) { method _readRaw (line 225) | async _readRaw(bmadDir) { method _flattenManifest (line 246) | _flattenManifest(manifest) { method addModule (line 269) | async addModule(bmadDir, moduleName, options = {}) { method removeModule (line 315) | async removeModule(bmadDir, moduleName) { method updateModuleVersion (line 334) | async updateModuleVersion(bmadDir, moduleName, versionInfo) { method getModuleVersion (line 357) | async getModuleVersion(bmadDir, moduleName) { method getAllModuleVersions (line 371) | async getAllModuleVersions(bmadDir) { method _writeRaw (line 385) | async _writeRaw(bmadDir, manifestData) { method addIde (line 408) | async addIde(bmadDir, ideName) { method calculateFileHash (line 429) | async calculateFileHash(filePath) { method parseInstalledFiles (line 444) | async parseInstalledFiles(installedFiles, bmadDir) { method extractXmlNodeAttributes (line 503) | extractXmlNodeAttributes(content, filePath, relativePath) { method generateManifestCsv (line 540) | generateManifestCsv(data, fileMetadata, moduleConfigs = {}) { method parseManifestCsv (line 590) | parseManifestCsv(csvContent) { method parseCsvLine (line 691) | parseCsvLine(line) { method escapeCsv (line 728) | escapeCsv(text) { method unescapeCsv (line 745) | unescapeCsv(text) { method loadModuleConfigs (line 763) | async loadModuleConfigs(modules) { method addCustomModule (line 791) | async addCustomModule(bmadDir, customModule) { method removeCustomModule (line 819) | async removeCustomModule(bmadDir, moduleId) { method getModuleVersionInfo (line 839) | async getModuleVersionInfo(moduleName, bmadDir, moduleSourcePath = nul... method fetchNpmVersion (line 928) | async fetchNpmVersion(packageName) { method checkForUpdates (line 970) | async checkForUpdates(bmadDir) { method compareVersions (line 1004) | compareVersions(v1, v2) { FILE: tools/cli/installers/lib/custom/handler.js class CustomHandler (line 12) | class CustomHandler { method constructor (line 13) | constructor() { method findCustomContent (line 23) | async findCustomContent(projectRoot) { method getCustomInfo (line 82) | async getCustomInfo(configPath, projectRoot = null) { method install (line 127) | async install(customPath, bmadDir, config, fileTrackingCallback = null) { method findFilesRecursively (line 205) | async findFilesRecursively(dir, extensions) { method copyDirectory (line 234) | async copyDirectory(sourceDir, targetDir, results, fileTrackingCallbac... method compileAndCopyAgents (line 294) | async compileAndCopyAgents(sourceAgentsPath, targetAgentsPath, bmadDir... FILE: tools/cli/installers/lib/ide/_base-ide.js class BaseIdeSetup (line 12) | class BaseIdeSetup { method constructor (line 13) | constructor(name, displayName = null, preferred = false) { method setBmadFolderName (line 29) | setBmadFolderName(bmadFolderName) { method getAgentCommandHeader (line 37) | async getAgentCommandHeader() { method setup (line 48) | async setup(projectDir, bmadDir, options = {}) { method cleanup (line 56) | async cleanup(projectDir, options = {}) { method installCustomAgentLauncher (line 78) | async installCustomAgentLauncher(projectDir, agentName, agentPath, met... method detect (line 89) | async detect(projectDir) { method getAgents (line 122) | async getAgents(bmadDir) { method getTasks (line 194) | async getTasks(bmadDir, standaloneOnly = false) { method getTools (line 240) | async getTools(bmadDir, standaloneOnly = false) { method getWorkflows (line 286) | async getWorkflows(bmadDir, standaloneOnly = false) { method findWorkflowFiles (line 332) | async findWorkflowFiles(dir, rootDir = null) { method scanDirectory (line 386) | async scanDirectory(dir, ext, rootDir = null) { method scanDirectoryWithStandalone (line 430) | async scanDirectoryWithStandalone(dir, ext, rootDir = null) { method processContent (line 510) | processContent(content, metadata = {}, projectDir = null) { method ensureDir (line 536) | async ensureDir(dirPath) { method writeFile (line 545) | async writeFile(filePath, content) { method copyFile (line 564) | async copyFile(source, dest) { method exists (line 604) | async exists(pathToCheck) { method pathExists (line 613) | async pathExists(pathToCheck) { method readFile (line 622) | async readFile(filePath) { method formatTitle (line 631) | formatTitle(name) { method flattenFilename (line 646) | flattenFilename(relativePath) { method createAgentConfig (line 656) | async createAgentConfig(bmadDir, agent) { FILE: tools/cli/installers/lib/ide/_config-driven.js class ConfigDrivenIdeSetup (line 25) | class ConfigDrivenIdeSetup extends BaseIdeSetup { method constructor (line 26) | constructor(platformCode, platformConfig) { method detect (line 44) | async detect(projectDir) { method setup (line 67) | async setup(projectDir, bmadDir, options = {}) { method installToTarget (line 117) | async installToTarget(projectDir, bmadDir, config, options) { method installToMultipleTargets (line 179) | async installToMultipleTargets(projectDir, bmadDir, targets, options) { method writeAgentArtifacts (line 204) | async writeAgentArtifacts(targetPath, artifacts, templateType, config ... method writeWorkflowArtifacts (line 233) | async writeWorkflowArtifacts(targetPath, artifacts, templateType, conf... method writeTaskToolArtifacts (line 264) | async writeTaskToolArtifacts(targetPath, artifacts, templateType, conf... method loadTemplate (line 316) | async loadTemplate(templateType, artifactType, config = {}, fallbackTe... method loadSplitTemplates (line 365) | async loadSplitTemplates(templateType, artifactType, headerTpl, bodyTp... method getDefaultTemplate (line 406) | getDefaultTemplate(artifactType) { method renderTemplate (line 440) | renderTemplate(template, artifact) { method writeSkillFile (line 487) | async writeSkillFile(targetPath, artifact, content) { method transformToSkillFormat (line 516) | transformToSkillFormat(content, skillName) { method installCustomAgentLauncher (line 556) | async installCustomAgentLauncher(projectDir, agentName, agentPath, met... method generateFilename (line 611) | generateFilename(artifact, artifactType, extension = '.md') { method installVerbatimSkills (line 642) | async installVerbatimSkills(projectDir, bmadDir, targetPath, config) { method printSummary (line 712) | async printSummary(results, targetDir, options = {}) { method cleanup (line 727) | async cleanup(projectDir, options = {}) { method isGlobalPath (line 781) | isGlobalPath(p) { method warnGlobalLegacy (line 790) | async warnGlobalLegacy(legacyDir, options = {}) { method cleanupTarget (line 816) | async cleanupTarget(projectDir, targetDir, options = {}) { method cleanupCopilotInstructions (line 874) | async cleanupCopilotInstructions(projectDir, options = {}) { method cleanupKiloModes (line 912) | async cleanupKiloModes(projectDir, options = {}) { method cleanupRovoDevPrompts (line 949) | async cleanupRovoDevPrompts(projectDir, options = {}) { method findAncestorConflict (line 991) | async findAncestorConflict(projectDir) { method removeEmptyParents (line 1026) | async removeEmptyParents(projectDir, relativeDir) { FILE: tools/cli/installers/lib/ide/manager.js class IdeManager (line 11) | class IdeManager { method constructor (line 12) | constructor() { method setBmadFolderName (line 22) | setBmadFolderName(bmadFolderName) { method ensureInitialized (line 35) | async ensureInitialized() { method loadHandlers (line 45) | async loadHandlers() { method loadConfigDrivenHandlers (line 53) | async loadConfigDrivenHandlers() { method getAvailableIdes (line 75) | getAvailableIdes() { method getPreferredIdes (line 113) | getPreferredIdes() { method getOtherIdes (line 121) | getOtherIdes() { method setup (line 132) | async setup(ideName, projectDir, bmadDir, options = {}) { method cleanup (line 185) | async cleanup(projectDir, options = {}) { method cleanupByList (line 208) | async cleanupByList(projectDir, ideList, options = {}) { method getSupportedIdes (line 238) | getSupportedIdes() { method isSupported (line 247) | isSupported(ideName) { method detectInstalledIdes (line 256) | async detectInstalledIdes(projectDir) { method installCustomAgentLaunchers (line 277) | async installCustomAgentLaunchers(ides, projectDir, agentName, agentPa... FILE: tools/cli/installers/lib/ide/platform-codes.js constant PLATFORM_CODES_PATH (line 5) | const PLATFORM_CODES_PATH = path.join(__dirname, 'platform-codes.yaml'); function loadPlatformCodes (line 13) | async function loadPlatformCodes() { function getPlatformInfo (line 32) | function getPlatformInfo(platformCode) { function getPreferredPlatforms (line 44) | async function getPreferredPlatforms() { function getPlatformsByCategory (line 56) | async function getPlatformsByCategory(category) { function getConfigDrivenPlatforms (line 67) | async function getConfigDrivenPlatforms() { function getCustomInstallerPlatforms (line 78) | async function getCustomInstallerPlatforms() { function clearCache (line 88) | function clearCache() { FILE: tools/cli/installers/lib/ide/shared/agent-command-generator.js class AgentCommandGenerator (line 9) | class AgentCommandGenerator { method constructor (line 10) | constructor(bmadFolderName = BMAD_FOLDER_NAME) { method collectAgentArtifacts (line 21) | async collectAgentArtifacts(bmadDir, selectedModules = []) { method generateLauncherContent (line 71) | async generateLauncherContent(agent) { method writeAgentLaunchers (line 93) | async writeAgentLaunchers(baseCommandsDir, artifacts) { method writeColonArtifacts (line 118) | async writeColonArtifacts(baseCommandsDir, artifacts) { method writeDashArtifacts (line 145) | async writeDashArtifacts(baseCommandsDir, artifacts) { method getCustomAgentColonName (line 167) | getCustomAgentColonName(agentName) { method getCustomAgentDashName (line 176) | getCustomAgentDashName(agentName) { FILE: tools/cli/installers/lib/ide/shared/bmad-artifacts.js function getAgentsFromBmad (line 9) | async function getAgentsFromBmad(bmadDir, selectedModules = []) { function getTasksFromBmad (line 62) | async function getTasksFromBmad(bmadDir, selectedModules = []) { function getAgentsFromDir (line 82) | async function getAgentsFromDir(dirPath, moduleName, relativePath = '') { function getTasksFromDir (line 139) | async function getTasksFromDir(dirPath, moduleName) { FILE: tools/cli/installers/lib/ide/shared/module-injections.js function loadModuleInjectionConfig (line 7) | async function loadModuleInjectionConfig(handler, moduleName) { function shouldApplyInjection (line 26) | function shouldApplyInjection(injection, subagentChoices) { function filterAgentInstructions (line 56) | function filterAgentInstructions(content, selectedFiles) { function resolveSubagentFiles (line 92) | async function resolveSubagentFiles(handlerBaseDir, subagentConfig, suba... FILE: tools/cli/installers/lib/ide/shared/path-utils.js constant TYPE_SEGMENTS (line 19) | const TYPE_SEGMENTS = ['workflows', 'tasks', 'tools']; constant AGENT_SEGMENT (line 20) | const AGENT_SEGMENT = 'agents'; constant BMAD_FOLDER_NAME (line 23) | const BMAD_FOLDER_NAME = '_bmad'; function toDashName (line 37) | function toDashName(module, type, name) { function toDashPath (line 65) | function toDashPath(relativePath) { function customAgentDashName (line 100) | function customAgentDashName(agentName) { function isDashFormat (line 109) | function isDashFormat(filename) { function parseDashName (line 125) | function parseDashName(filename) { function toUnderscoreName (line 205) | function toUnderscoreName(module, type, name) { function toUnderscorePath (line 220) | function toUnderscorePath(relativePath) { function customAgentUnderscoreName (line 236) | function customAgentUnderscoreName(agentName) { function isUnderscoreFormat (line 244) | function isUnderscoreFormat(filename) { function parseUnderscoreName (line 252) | function parseUnderscoreName(filename) { function resolveSkillName (line 324) | function resolveSkillName(artifact) { FILE: tools/cli/installers/lib/ide/shared/skill-manifest.js function loadSkillManifest (line 12) | async function loadSkillManifest(dirPath) { function getCanonicalId (line 33) | function getCanonicalId(manifest, filename) { function getArtifactType (line 54) | function getArtifactType(manifest, filename) { function getInstallToBmad (line 75) | function getInstallToBmad(manifest, filename) { FILE: tools/cli/installers/lib/ide/shared/task-tool-command-generator.js class TaskToolCommandGenerator (line 9) | class TaskToolCommandGenerator { method constructor (line 17) | constructor(bmadFolderName = BMAD_FOLDER_NAME) { method collectTaskToolArtifacts (line 26) | async collectTaskToolArtifacts(bmadDir) { method generateTaskToolCommands (line 101) | async generateTaskToolCommands(projectDir, bmadDir, baseCommandsDir = ... method generateCommandContent (line 144) | generateCommandContent(item, type) { method loadTaskManifest (line 194) | async loadTaskManifest(bmadDir) { method loadToolManifest (line 211) | async loadToolManifest(bmadDir) { method generateColonTaskToolCommands (line 234) | async generateColonTaskToolCommands(projectDir, bmadDir, baseCommandsD... method generateDashTaskToolCommands (line 278) | async generateDashTaskToolCommands(projectDir, bmadDir, baseCommandsDi... method writeColonArtifacts (line 321) | async writeColonArtifacts(baseCommandsDir, artifacts) { method writeDashArtifacts (line 349) | async writeDashArtifacts(baseCommandsDir, artifacts) { FILE: tools/cli/installers/lib/ide/shared/workflow-command-generator.js class WorkflowCommandGenerator (line 9) | class WorkflowCommandGenerator { method constructor (line 10) | constructor(bmadFolderName = BMAD_FOLDER_NAME) { method collectWorkflowArtifacts (line 14) | async collectWorkflowArtifacts(bmadDir) { method createModuleWorkflowLaunchers (line 80) | async createModuleWorkflowLaunchers(baseCommandsDir, workflowsByModule) { method groupWorkflowsByModule (line 90) | groupWorkflowsByModule(workflows) { method buildModuleWorkflowLaunchers (line 107) | buildModuleWorkflowLaunchers(groupedWorkflows) { method buildLauncherContent (line 117) | buildLauncherContent(module, moduleWorkflows) { method transformWorkflowPath (line 146) | transformWorkflowPath(workflowPath) { method loadWorkflowManifest (line 164) | async loadWorkflowManifest(bmadDir) { FILE: tools/cli/installers/lib/message-loader.js class MessageLoader (line 9) | class MessageLoader { method constructor (line 10) | constructor() {} method load (line 16) | load() { method getStartMessage (line 37) | getStartMessage() { method getEndMessage (line 46) | getEndMessage() { method displayStartMessage (line 54) | async displayStartMessage() { method displayEndMessage (line 64) | async displayEndMessage() { method isCurrent (line 76) | isCurrent(currentVersion) { FILE: tools/cli/installers/lib/modules/external-manager.js class ExternalModuleManager (line 12) | class ExternalModuleManager { method constructor (line 13) | constructor() { method loadExternalModulesConfig (line 22) | async loadExternalModulesConfig() { method listAvailable (line 42) | async listAvailable() { method getModuleByCode (line 71) | async getModuleByCode(code) { method getModuleByKey (line 81) | async getModuleByKey(key) { method hasModule (line 110) | async hasModule(code) { method getModuleUrl (line 120) | async getModuleUrl(code) { method getModuleDefinition (line 130) | async getModuleDefinition(code) { FILE: tools/cli/installers/lib/modules/manager.js class ModuleManager (line 27) | class ModuleManager { method constructor (line 28) | constructor(options = {}) { method setBmadFolderName (line 39) | setBmadFolderName(bmadFolderName) { method setCoreConfig (line 47) | setCoreConfig(coreConfig) { method setCustomModulePaths (line 55) | setCustomModulePaths(customModulePaths) { method copyFileWithPlaceholderReplacement (line 65) | async copyFileWithPlaceholderReplacement(sourcePath, targetPath, overw... method copyDirectoryWithPlaceholderReplacement (line 75) | async copyDirectoryWithPlaceholderReplacement(sourceDir, targetDir, ov... method copySidecarToMemory (line 100) | async copySidecarToMemory(sourceSidecarPath, agentName, bmadMemoryPath... method listAvailable (line 194) | async listAvailable() { method getModuleInfo (line 236) | async getModuleInfo(modulePath, defaultName, sourceDescription) { method findModuleSource (line 296) | async findModuleSource(moduleCode, options = {}) { method isExternalModule (line 326) | async isExternalModule(moduleCode) { method getExternalCacheDir (line 334) | getExternalCacheDir() { method cloneExternalModule (line 345) | async cloneExternalModule(moduleCode, options = {}) { method findExternalModuleSource (line 496) | async findExternalModuleSource(moduleCode, options = {}) { method install (line 524) | async install(moduleName, bmadDir, fileTrackingCallback = null, option... method update (line 606) | async update(moduleName, bmadDir, force = false, options = {}) { method remove (line 645) | async remove(moduleName, bmadDir) { method isInstalled (line 666) | async isInstalled(moduleName, bmadDir) { method getInstalledInfo (line 677) | async getInstalledInfo(moduleName, bmadDir) { method copyModuleWithFiltering (line 711) | async copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCall... method compileModuleAgents (line 784) | async compileModuleAgents(sourcePath, targetPath, moduleName, bmadDir,... method findAgentFiles (line 960) | async findAgentFiles(dir) { method processAgentFiles (line 986) | async processAgentFiles(modulePath, moduleName) { method findAgentMdFiles (line 1011) | async findAgentMdFiles(dir) { method vendorCrossModuleWorkflows (line 1039) | async vendorCrossModuleWorkflows(sourcePath, targetPath, moduleName) { method createModuleDirectories (line 1139) | async createModuleDirectories(moduleName, bmadDir, options = {}) { method processModuleConfig (line 1304) | async processModuleConfig(modulePath, moduleName) { method syncModule (line 1327) | async syncModule(sourcePath, targetPath) { method getFileList (line 1357) | async getFileList(dir, baseDir = dir) { FILE: tools/cli/lib/activation-builder.js class ActivationBuilder (line 8) | class ActivationBuilder { method constructor (line 9) | constructor() { method loadFragment (line 19) | async loadFragment(fragmentName) { method buildActivation (line 44) | async buildActivation(profile, metadata = {}, agentSpecificActions = [... method buildHandlers (line 79) | async buildHandlers(profile) { method buildSteps (line 102) | async buildSteps(metadata = {}, agentSpecificActions = [], forWebBundl... method indent (line 149) | indent(content, spaces) { method clearCache (line 160) | clearCache() { FILE: tools/cli/lib/agent-analyzer.js class AgentAnalyzer (line 7) | class AgentAnalyzer { method analyzeAgentObject (line 13) | analyzeAgentObject(agentYaml) { method analyzeAgentFile (line 80) | async analyzeAgentFile(filePath) { method needsHandler (line 92) | needsHandler(profile, handlerType) { FILE: tools/cli/lib/agent-party-generator.js method generateAgentParty (line 12) | generateAgentParty(agentDetails, options = {}) { method extractAgentDetails (line 83) | extractAgentDetails(content, moduleName, agentName) { method extractAttribute (line 122) | extractAttribute(xml, tagName, attrName) { method applyConfigOverrides (line 134) | applyConfigOverrides(details, configContent) { method writeAgentParty (line 186) | async writeAgentParty(filePath, agentDetails, options = {}) { FILE: tools/cli/lib/agent/compiler.js function buildFrontmatter (line 21) | function buildFrontmatter(metadata, agentName) { function buildPersonaXml (line 42) | function buildPersonaXml(persona) { function buildPromptsXml (line 82) | function buildPromptsXml(prompts) { function buildMemoriesXml (line 106) | function buildMemoriesXml(memories) { function buildMenuXml (line 127) | function buildMenuXml(menuItems) { function buildNestedHandlers (line 173) | function buildNestedHandlers(triggers) { function processExecArray (line 208) | function processExecArray(execArray) { function compileToXml (line 254) | async function compileToXml(agentYaml, agentName = '', targetPath = '') { function compileAgent (line 324) | async function compileAgent(yamlContent, answers = {}, agentName = '', t... function filterCustomizationData (line 450) | function filterCustomizationData(data) { function compileAgentFile (line 481) | function compileAgentFile(yamlPath, options = {}) { FILE: tools/cli/lib/agent/installer.js function findBmadConfig (line 18) | function findBmadConfig(startPath = process.cwd()) { function resolvePath (line 44) | function resolvePath(pathStr, context) { function discoverAgents (line 53) | function discoverAgents(searchPath) { function loadAgentConfig (line 119) | function loadAgentConfig(yamlPath) { function promptInstallQuestions (line 147) | async function promptInstallQuestions(installConfig, defaults, presetAns... function installAgent (line 204) | function installAgent(agentInfo, answers, targetPath, options = {}) { function updateAgentId (line 240) | function updateAgentId(compiledContent, targetPath) { function detectBmadProject (line 250) | function detectBmadProject(targetPath) { function escapeCsvField (line 282) | function escapeCsvField(value) { function parseCsvLine (line 296) | function parseCsvLine(line) { function checkManifestForAgent (line 331) | function checkManifestForAgent(manifestFile, agentName) { function checkManifestForPath (line 363) | function checkManifestForPath(manifestFile, agentPath) { function updateManifestEntry (line 396) | function updateManifestEntry(manifestFile, agentData, lineNumber) { function addToManifest (line 422) | function addToManifest(manifestFile, agentData) { function saveAgentSource (line 453) | function saveAgentSource(agentInfo, cfgFolder, agentName, answers = {}) { function createIdeSlashCommands (line 536) | async function createIdeSlashCommands(projectRoot, agentName, agentPath,... function updateManifestYaml (line 566) | function updateManifestYaml(manifestPath, agentName, agentType) { function extractManifestData (line 617) | function extractManifestData(xmlContent, metadata, agentPath, moduleName... FILE: tools/cli/lib/agent/template-engine.js function processTemplate (line 12) | function processTemplate(content, variables = {}) { function processConditionals (line 30) | function processConditionals(content, variables) { function processVariables (line 63) | function processVariables(content, variables) { function cleanupEmptyLines (line 82) | function cleanupEmptyLines(content) { function extractInstallConfig (line 92) | function extractInstallConfig(agentYaml) { function stripInstallConfig (line 101) | function stripInstallConfig(agentYaml) { function processAgentYaml (line 115) | function processAgentYaml(agentYaml, variables) { function getDefaultValues (line 127) | function getDefaultValues(installConfig) { FILE: tools/cli/lib/cli-utils.js method getVersion (line 9) | getVersion() { method displayLogo (line 22) | async displayLogo(_clearScreen = true) { method displaySection (line 52) | async displaySection(title, subtitle = null) { method displayBox (line 61) | async displayBox(content, options = {}) { method displayModuleConfigHeader (line 84) | async displayModuleConfigHeader(moduleName, header = null, subheader = n... method displayModuleNoConfig (line 95) | async displayModuleNoConfig(moduleName, header = null, subheader = null) { method displayStep (line 106) | async displayStep(current, total, description) { method displayComplete (line 115) | async displayComplete(message) { method displayError (line 127) | async displayError(message) { method formatList (line 140) | formatList(items, prefix = '\u2022') { method clearLines (line 148) | clearLines(lines) { method displayModuleComplete (line 160) | displayModuleComplete(moduleName, clearScreen = false) { method expandPath (line 170) | expandPath(inputPath) { FILE: tools/cli/lib/config.js class Config (line 9) | class Config { method loadYaml (line 15) | async loadYaml(configPath) { method saveYaml (line 29) | async saveYaml(configPath, config) { method processConfig (line 47) | async processConfig(configPath, replacements = {}) { method mergeConfigs (line 77) | mergeConfigs(base, override) { method deepMerge (line 87) | deepMerge(target, source) { method isObject (line 112) | isObject(item) { method validateConfig (line 122) | validateConfig(config, schema) { method getValue (line 176) | getValue(config, path, defaultValue = null) { method setValue (line 197) | setValue(config, path, value) { FILE: tools/cli/lib/file-ops.js class FileOps (line 8) | class FileOps { method copyDirectory (line 15) | async copyDirectory(source, dest, options = {}) { method syncDirectory (line 31) | async syncDirectory(source, dest) { method getFileList (line 82) | async getFileList(dir) { method getFileHash (line 112) | async getFileHash(filePath) { method shouldIgnore (line 128) | shouldIgnore(filePath) { method ensureDir (line 152) | async ensureDir(dir) { method remove (line 160) | async remove(targetPath) { method readFile (line 171) | async readFile(filePath) { method writeFile (line 180) | async writeFile(filePath, content) { method exists (line 190) | async exists(targetPath) { method stat (line 199) | async stat(targetPath) { FILE: tools/cli/lib/platform-codes.js class PlatformCodes (line 10) | class PlatformCodes { method constructor (line 11) | constructor() { method loadConfig (line 19) | loadConfig() { method getAllPlatforms (line 38) | getAllPlatforms() { method getPlatform (line 47) | getPlatform(code) { method isValidPlatform (line 56) | isValidPlatform(code) { method getPreferredPlatforms (line 64) | getPreferredPlatforms() { method getPlatformsByCategory (line 75) | getPlatformsByCategory(category) { method getDisplayName (line 86) | getDisplayName(code) { method isValidFormat (line 96) | isValidFormat(code) { method getCodes (line 109) | getCodes() { FILE: tools/cli/lib/project-root.js function findProjectRoot (line 8) | function findProjectRoot(startPath = __dirname) { function getProjectRoot (line 42) | function getProjectRoot() { function getSourcePath (line 52) | function getSourcePath(...segments) { function getModulePath (line 62) | function getModulePath(moduleName, ...segments) { FILE: tools/cli/lib/prompts.js function getClack (line 18) | async function getClack() { function getClackCore (line 29) | async function getClackCore() { function getPicocolors (line 40) | async function getPicocolors() { function handleCancel (line 53) | async function handleCancel(value, message = 'Operation cancelled') { function intro (line 66) | async function intro(message) { function outro (line 75) | async function outro(message) { function note (line 85) | async function note(message, title) { function spinner (line 95) | async function spinner() { function select (line 147) | async function select(options) { function multiselect (line 189) | async function multiselect(options) { function defaultAutocompleteFilter (line 239) | function defaultAutocompleteFilter(search, option) { function autocompleteMultiselect (line 258) | async function autocompleteMultiselect(options) { function confirm (line 394) | async function confirm(options) { function text (line 420) | async function text(options) { function password (line 489) | async function password(options) { function group (line 507) | async function group(prompts, options = {}) { function tasks (line 526) | async function tasks(taskList) { method info (line 535) | async info(message) { method success (line 539) | async success(message) { method warn (line 543) | async warn(message) { method error (line 547) | async error(message) { method message (line 551) | async message(message) { method step (line 555) | async step(message) { function cancel (line 565) | async function cancel(message = 'Operation cancelled') { function box (line 576) | async function box(content, title, options) { function progress (line 586) | async function progress(options) { function taskLog (line 596) | async function taskLog(options) { function pathPrompt (line 610) | async function pathPrompt(options) { function autocomplete (line 627) | async function autocomplete(options) { function selectKey (line 641) | async function selectKey(options) { method info (line 652) | async info(generator) { method success (line 656) | async success(generator) { method step (line 660) | async step(generator) { method warn (line 664) | async warn(generator) { method error (line 668) | async error(generator) { method message (line 672) | async message(generator, options) { function getColor (line 682) | async function getColor() { function prompt (line 692) | async function prompt(questions) { FILE: tools/cli/lib/ui.js class Separator (line 11) | class Separator { method constructor (line 12) | constructor(text = '────────') { class UI (line 25) | class UI { method promptInstall (line 31) | async promptInstall(options = {}) { method promptToolSelection (line 591) | async promptToolSelection(projectDir, options = {}) { method promptUpdate (line 783) | async promptUpdate() { method confirm (line 803) | async confirm(message, defaultValue = false) { method getConfirmedDirectory (line 814) | async getConfirmedDirectory() { method getExistingInstallation (line 832) | async getExistingInstallation(directory) { method collectCoreConfig (line 851) | async collectCoreConfig(directory, options = {}) { method getModuleChoices (line 929) | async getModuleChoices(installedModuleIds, customContentConfig = null) { method selectAllModules (line 1013) | async selectAllModules(installedModuleIds = new Set()) { method getDefaultModules (line 1110) | async getDefaultModules(installedModuleIds = new Set()) { method promptForDirectory (line 1136) | async promptForDirectory() { method displayDirectoryInfo (line 1160) | async displayDirectoryInfo(directory) { method confirmDirectory (line 1191) | async confirmDirectory(directory) { method validateDirectorySync (line 1225) | validateDirectorySync(input) { method validateDirectory (line 1281) | async validateDirectory(input) { method findExistingParentSync (line 1337) | findExistingParentSync(targetPath) { method findExistingParent (line 1358) | async findExistingParent(targetPath) { method expandUserPath (line 1379) | expandUserPath(inputPath) { method loadExistingConfigurations (line 1412) | async loadExistingConfigurations(directory) { method getConfiguredIdes (line 1443) | async getConfiguredIdes(directory) { method validateCustomContentPathSync (line 1458) | validateCustomContentPathSync(input) { method promptCustomContentSource (line 1507) | async promptCustomContentSource() { method handleCustomModulesInModifyFlow (line 1590) | async handleCustomModulesInModifyFlow(directory, selectedModules) { method isLegacyVersion (line 1734) | isLegacyVersion(installedVersion) { method showLegacyVersionWarning (line 1749) | async showLegacyVersionWarning(installedVersion, currentVersion, bmadF... method displayModuleVersions (line 1810) | async displayModuleVersions(modules, availableUpdates = []) { method promptUpdateSelection (line 1845) | async promptUpdateSelection(availableUpdates) { method displayStatus (line 1891) | async displayStatus(statusData) { method displaySelectedTools (line 1922) | async displaySelectedTools(selectedIdes, preferredIdes, allTools) { FILE: tools/cli/lib/xml-handler.js class XmlHandler (line 11) | class XmlHandler { method constructor (line 12) | constructor() { method loadActivationTemplate (line 46) | async loadActivationTemplate() { method injectActivation (line 56) | async injectActivation(agentContent, metadata = {}) { method injectActivationSimple (line 130) | injectActivationSimple(agentContent, metadata = {}) { method buildFromYaml (line 141) | async buildFromYaml(yamlPath, customizePath = null, metadata = {}) { method isYamlAgent (line 172) | isYamlAgent(filePath) { FILE: tools/cli/lib/xml-to-markdown.js function convertXmlToMarkdown (line 4) | function convertXmlToMarkdown(xmlFilePath) { function main (line 54) | function main() { FILE: tools/cli/lib/yaml-format.js function initializeModules (line 10) | async function initializeModules() { function formatYamlContent (line 21) | async function formatYamlContent(content, filename) { function processMarkdownFile (line 75) | async function processMarkdownFile(filePath) { function processYamlFile (line 126) | async function processYamlFile(filePath) { function lintYamlFile (line 142) | async function lintYamlFile(filePath) { function main (line 155) | async function main() { FILE: tools/cli/lib/yaml-xml-builder.js class YamlXmlBuilder (line 12) | class YamlXmlBuilder { method constructor (line 13) | constructor() { method deepMerge (line 24) | deepMerge(target, source) { method isObject (line 54) | isObject(item) { method loadAndMergeAgent (line 64) | async loadAndMergeAgent(agentYamlPath, customizeYamlPath = null) { method convertToXml (line 145) | async convertToXml(agentYaml, buildMetadata = {}) { method buildPersonaXml (line 239) | buildPersonaXml(persona) { method buildMemoriesXml (line 275) | buildMemoriesXml(memories) { method buildPromptsXml (line 293) | buildPromptsXml(prompts) { method buildCommandsXml (line 335) | buildCommandsXml(menuItems, forWebBundle = false) { method buildNestedHandlers (line 394) | buildNestedHandlers(triggers) { method processExecArray (line 430) | processExecArray(execArray) { method calculateFileHash (line 472) | async calculateFileHash(filePath) { method buildFromYaml (line 488) | async buildFromYaml(agentYamlPath, customizeYamlPath = null, options =... method buildAgent (line 551) | async buildAgent(agentYamlPath, customizeYamlPath, outputPath, options... FILE: tools/fix-doc-links.js constant DOCS_ROOT (line 20) | const DOCS_ROOT = path.resolve(__dirname, '../docs'); constant DRY_RUN (line 21) | const DRY_RUN = !process.argv.includes('--write'); constant ALL_MARKDOWN_LINKS_REGEX (line 25) | const ALL_MARKDOWN_LINKS_REGEX = /\[([^\]]*)\]\(([^)]+)\)/g; function getMarkdownFiles (line 30) | function getMarkdownFiles(dir) { function convertToRepoRelative (line 63) | function convertToRepoRelative(href, currentFilePath) { function processFile (line 167) | function processFile(filePath) { function validateLink (line 216) | function validateLink(repoRelativePath) { FILE: tools/format-workflow-md.js class WorkflowFormatter (line 14) | class WorkflowFormatter { method constructor (line 15) | constructor(options = {}) { method format (line 24) | format(filePath) { method formatContent (line 50) | formatContent(content) { method isXMLLine (line 99) | isXMLLine(line) { method formatXMLLine (line 106) | formatXMLLine(line, currentIndent, checkDepth, lineIndex, allLines) { method isSelfClosingTag (line 172) | isSelfClosingTag(line) { method isBlockLevelTag (line 185) | isBlockLevelTag(tagName) { function main (line 193) | function main() { FILE: tools/lib/xml-utils.js function escapeXml (line 6) | function escapeXml(text) { FILE: tools/migrate-custom-module-paths.js function findBmadDir (line 14) | function findBmadDir(projectDir = process.cwd()) { function updateManifest (line 30) | async function updateManifest(manifestPath, projectRoot) { function migrate (line 85) | async function migrate(directory) { FILE: tools/validate-doc-links.js constant DOCS_ROOT (line 21) | const DOCS_ROOT = path.resolve(__dirname, '../docs'); constant DRY_RUN (line 22) | const DRY_RUN = !process.argv.includes('--write'); constant LINK_REGEX (line 25) | const LINK_REGEX = /\[([^\]]*)\]\(((?:\.{1,2}\/|\/)[^)]+|[\w][^)\s]*\.md... constant STATIC_ASSET_EXTENSIONS (line 28) | const STATIC_ASSET_EXTENSIONS = ['.zip', '.txt', '.pdf', '.png', '.jpg',... constant CUSTOM_PAGE_ROUTES (line 31) | const CUSTOM_PAGE_ROUTES = new Set([]); constant HEADING_PATTERN (line 34) | const HEADING_PATTERN = /^#{1,6}\s+(.+)$/gm; function getMarkdownFiles (line 39) | function getMarkdownFiles(dir) { function stripCodeBlocks (line 67) | function stripCodeBlocks(content) { function headingToAnchor (line 74) | function headingToAnchor(heading) { function extractAnchors (line 87) | function extractAnchors(content) { function resolveLink (line 111) | function resolveLink(siteRelativePath, sourceFile) { function findFileWithContext (line 180) | function findFileWithContext(brokenPath) { function fileToSiteRelative (line 216) | function fileToSiteRelative(filePath) { function processFile (line 229) | function processFile(filePath) { function applyFixes (line 311) | function applyFixes(content, issues) { FILE: tools/validate-file-refs.js constant PROJECT_ROOT (line 34) | const PROJECT_ROOT = path.resolve(__dirname, '..'); constant SRC_DIR (line 35) | const SRC_DIR = path.join(PROJECT_ROOT, 'src'); constant VERBOSE (line 36) | const VERBOSE = process.argv.includes('--verbose'); constant STRICT (line 37) | const STRICT = process.argv.includes('--strict'); constant SCAN_EXTENSIONS (line 42) | const SCAN_EXTENSIONS = new Set(['.yaml', '.yml', '.md', '.xml', '.csv']); constant SKIP_DIRS (line 45) | const SKIP_DIRS = new Set(['node_modules', '.git']); constant PROJECT_ROOT_REF (line 48) | const PROJECT_ROOT_REF = /\{project-root\}\/_bmad\/([^\s'"<>})\]`]+)/g; constant BMAD_SHORTHAND_REF (line 51) | const BMAD_SHORTHAND_REF = /\{_bmad\}\/([^\s'"<>})\]`]+)/g; constant EXEC_ATTR (line 54) | const EXEC_ATTR = /exec="([^"]+)"/g; constant INVOKE_TASK (line 57) | const INVOKE_TASK = /([^<]+)<\/invoke-task>/g; constant RELATIVE_PATH_QUOTED (line 60) | const RELATIVE_PATH_QUOTED = /['"](\.\.\/?[^'"]+\.(?:md|yaml|yml|xml|jso... constant RELATIVE_PATH_DOT (line 61) | const RELATIVE_PATH_DOT = /['"](\.\/[^'"]+\.(?:md|yaml|yml|xml|json|csv|... constant STEP_META (line 64) | const STEP_META = /(?:thisStepFile|nextStepFile|continueStepFile|skipToS... constant LOAD_DIRECTIVE (line 67) | const LOAD_DIRECTIVE = /Load[:\s]+`(\.[^`]+)`/g; constant ABS_PATH_LEAK (line 70) | const ABS_PATH_LEAK = /(?:\/Users\/|\/home\/|[A-Z]:\\\\)/; function escapeAnnotation (line 74) | function escapeAnnotation(str) { function escapeTableCell (line 78) | function escapeTableCell(str) { constant INSTALL_ONLY_PATHS (line 83) | const INSTALL_ONLY_PATHS = ['_config/']; constant INSTALL_GENERATED_FILES (line 86) | const INSTALL_GENERATED_FILES = ['config.yaml']; constant UNRESOLVABLE_VARS (line 89) | const UNRESOLVABLE_VARS = [ function getSourceFiles (line 112) | function getSourceFiles(dir) { function stripCodeBlocks (line 137) | function stripCodeBlocks(content) { function stripJsonExampleBlocks (line 141) | function stripJsonExampleBlocks(content) { function mapInstalledToSource (line 149) | function mapInstalledToSource(refPath) { function isResolvable (line 170) | function isResolvable(refStr) { function isInstallOnly (line 179) | function isInstallOnly(cleanedPath) { function extractYamlRefs (line 192) | function extractYamlRefs(filePath, content) { function offsetToLine (line 249) | function offsetToLine(content, offset) { function extractMarkdownRefs (line 257) | function extractMarkdownRefs(filePath, content) { function extractCsvRefs (line 296) | function extractCsvRefs(filePath, content) { function resolveRef (line 340) | function resolveRef(ref) { function checkAbsolutePathLeaks (line 383) | function checkAbsolutePathLeaks(filePath, content) { FILE: tools/validate-skills.js constant PROJECT_ROOT (line 33) | const PROJECT_ROOT = path.resolve(__dirname, '..'); constant SRC_DIR (line 34) | const SRC_DIR = path.join(PROJECT_ROOT, 'src'); constant STRICT (line 39) | const STRICT = args.includes('--strict'); constant JSON_OUTPUT (line 40) | const JSON_OUTPUT = args.includes('--json'); constant NAME_REGEX (line 45) | const NAME_REGEX = /^bmad-[a-z0-9]+(-[a-z0-9]+)*$/; constant STEP_FILENAME_REGEX (line 46) | const STEP_FILENAME_REGEX = /^step-\d{2}[a-z]?-[a-z0-9-]+\.md$/; constant TIME_ESTIMATE_PATTERNS (line 47) | const TIME_ESTIMATE_PATTERNS = [/takes?\s+\d+\s*min/i, /~\s*\d+\s*min/i,... constant SEVERITY_ORDER (line 49) | const SEVERITY_ORDER = { CRITICAL: 0, HIGH: 1, MEDIUM: 2, LOW: 3 }; function escapeAnnotation (line 53) | function escapeAnnotation(str) { function escapeTableCell (line 57) | function escapeTableCell(str) { function parseFrontmatter (line 67) | function parseFrontmatter(content) { function parseFrontmatterMultiline (line 106) | function parseFrontmatterMultiline(content) { function stripQuotes (line 153) | function stripQuotes(value) { function safeReadFile (line 166) | function safeReadFile(filePath, findings, relFile) { function stripCodeBlocks (line 184) | function stripCodeBlocks(content) { function discoverSkillDirs (line 190) | function discoverSkillDirs(rootDirs) { function collectSkillFiles (line 222) | function collectSkillFiles(skillDir) { function validateSkill (line 244) | function validateSkill(skillDir) { function formatHumanReadable (line 577) | function formatHumanReadable(results) { function formatJson (line 668) | function formatJson(results) { FILE: website/src/lib/site-url.mjs function getSiteUrl (line 7) | function getSiteUrl() { FILE: website/src/rehype-base-paths.js function rehypeBasePaths (line 25) | function rehypeBasePaths(options = {}) { FILE: website/src/rehype-markdown-links.js function rehypeMarkdownLinks (line 23) | function rehypeMarkdownLinks(options = {}) { function findFirstDelimiter (line 93) | function findFirstDelimiter(str) { function detectContentDir (line 102) | function detectContentDir(filePath) {