@a1st/aix-core 0.0.3
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/dist/backup.d.ts +12 -0
- package/dist/backup.d.ts.map +1 -0
- package/dist/backup.js +70 -0
- package/dist/backup.js.map +1 -0
- package/dist/cache/cleanup.d.ts +14 -0
- package/dist/cache/cleanup.d.ts.map +1 -0
- package/dist/cache/cleanup.js +61 -0
- package/dist/cache/cleanup.js.map +1 -0
- package/dist/cache/clear.d.ts +10 -0
- package/dist/cache/clear.d.ts.map +1 -0
- package/dist/cache/clear.js +30 -0
- package/dist/cache/clear.js.map +1 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +5 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/paths.d.ts +57 -0
- package/dist/cache/paths.d.ts.map +1 -0
- package/dist/cache/paths.js +86 -0
- package/dist/cache/paths.js.map +1 -0
- package/dist/cache/status.d.ts +21 -0
- package/dist/cache/status.d.ts.map +1 -0
- package/dist/cache/status.js +67 -0
- package/dist/cache/status.js.map +1 -0
- package/dist/discovery.d.ts +14 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +96 -0
- package/dist/discovery.js.map +1 -0
- package/dist/editors/adapters/base.d.ts +101 -0
- package/dist/editors/adapters/base.d.ts.map +1 -0
- package/dist/editors/adapters/base.js +399 -0
- package/dist/editors/adapters/base.js.map +1 -0
- package/dist/editors/adapters/claude-code.d.ts +27 -0
- package/dist/editors/adapters/claude-code.d.ts.map +1 -0
- package/dist/editors/adapters/claude-code.js +46 -0
- package/dist/editors/adapters/claude-code.js.map +1 -0
- package/dist/editors/adapters/codex.d.ts +30 -0
- package/dist/editors/adapters/codex.d.ts.map +1 -0
- package/dist/editors/adapters/codex.js +56 -0
- package/dist/editors/adapters/codex.js.map +1 -0
- package/dist/editors/adapters/cursor.d.ts +23 -0
- package/dist/editors/adapters/cursor.d.ts.map +1 -0
- package/dist/editors/adapters/cursor.js +39 -0
- package/dist/editors/adapters/cursor.js.map +1 -0
- package/dist/editors/adapters/index.d.ts +8 -0
- package/dist/editors/adapters/index.d.ts.map +1 -0
- package/dist/editors/adapters/index.js +8 -0
- package/dist/editors/adapters/index.js.map +1 -0
- package/dist/editors/adapters/vscode.d.ts +23 -0
- package/dist/editors/adapters/vscode.d.ts.map +1 -0
- package/dist/editors/adapters/vscode.js +36 -0
- package/dist/editors/adapters/vscode.js.map +1 -0
- package/dist/editors/adapters/windsurf.d.ts +23 -0
- package/dist/editors/adapters/windsurf.d.ts.map +1 -0
- package/dist/editors/adapters/windsurf.js +38 -0
- package/dist/editors/adapters/windsurf.js.map +1 -0
- package/dist/editors/adapters/zed.d.ts +29 -0
- package/dist/editors/adapters/zed.d.ts.map +1 -0
- package/dist/editors/adapters/zed.js +61 -0
- package/dist/editors/adapters/zed.js.map +1 -0
- package/dist/editors/import.d.ts +31 -0
- package/dist/editors/import.d.ts.map +1 -0
- package/dist/editors/import.js +271 -0
- package/dist/editors/import.js.map +1 -0
- package/dist/editors/index.d.ts +6 -0
- package/dist/editors/index.d.ts.map +1 -0
- package/dist/editors/index.js +4 -0
- package/dist/editors/index.js.map +1 -0
- package/dist/editors/install.d.ts +33 -0
- package/dist/editors/install.d.ts.map +1 -0
- package/dist/editors/install.js +186 -0
- package/dist/editors/install.js.map +1 -0
- package/dist/editors/strategies/claude-code/hooks.d.ts +13 -0
- package/dist/editors/strategies/claude-code/hooks.d.ts.map +1 -0
- package/dist/editors/strategies/claude-code/hooks.js +61 -0
- package/dist/editors/strategies/claude-code/hooks.js.map +1 -0
- package/dist/editors/strategies/claude-code/index.d.ts +5 -0
- package/dist/editors/strategies/claude-code/index.d.ts.map +1 -0
- package/dist/editors/strategies/claude-code/index.js +5 -0
- package/dist/editors/strategies/claude-code/index.js.map +1 -0
- package/dist/editors/strategies/claude-code/mcp.d.ts +10 -0
- package/dist/editors/strategies/claude-code/mcp.d.ts.map +1 -0
- package/dist/editors/strategies/claude-code/mcp.js +17 -0
- package/dist/editors/strategies/claude-code/mcp.js.map +1 -0
- package/dist/editors/strategies/claude-code/prompts.d.ts +18 -0
- package/dist/editors/strategies/claude-code/prompts.d.ts.map +1 -0
- package/dist/editors/strategies/claude-code/prompts.js +42 -0
- package/dist/editors/strategies/claude-code/prompts.js.map +1 -0
- package/dist/editors/strategies/claude-code/rules.d.ts +17 -0
- package/dist/editors/strategies/claude-code/rules.d.ts.map +1 -0
- package/dist/editors/strategies/claude-code/rules.js +61 -0
- package/dist/editors/strategies/claude-code/rules.js.map +1 -0
- package/dist/editors/strategies/codex/index.d.ts +4 -0
- package/dist/editors/strategies/codex/index.d.ts.map +1 -0
- package/dist/editors/strategies/codex/index.js +4 -0
- package/dist/editors/strategies/codex/index.js.map +1 -0
- package/dist/editors/strategies/codex/mcp.d.ts +18 -0
- package/dist/editors/strategies/codex/mcp.d.ts.map +1 -0
- package/dist/editors/strategies/codex/mcp.js +93 -0
- package/dist/editors/strategies/codex/mcp.js.map +1 -0
- package/dist/editors/strategies/codex/prompts.d.ts +37 -0
- package/dist/editors/strategies/codex/prompts.d.ts.map +1 -0
- package/dist/editors/strategies/codex/prompts.js +82 -0
- package/dist/editors/strategies/codex/prompts.js.map +1 -0
- package/dist/editors/strategies/codex/rules.d.ts +17 -0
- package/dist/editors/strategies/codex/rules.d.ts.map +1 -0
- package/dist/editors/strategies/codex/rules.js +35 -0
- package/dist/editors/strategies/codex/rules.js.map +1 -0
- package/dist/editors/strategies/cursor/hooks.d.ts +13 -0
- package/dist/editors/strategies/cursor/hooks.d.ts.map +1 -0
- package/dist/editors/strategies/cursor/hooks.js +54 -0
- package/dist/editors/strategies/cursor/hooks.js.map +1 -0
- package/dist/editors/strategies/cursor/index.d.ts +4 -0
- package/dist/editors/strategies/cursor/index.d.ts.map +1 -0
- package/dist/editors/strategies/cursor/index.js +4 -0
- package/dist/editors/strategies/cursor/index.js.map +1 -0
- package/dist/editors/strategies/cursor/prompts.d.ts +18 -0
- package/dist/editors/strategies/cursor/prompts.d.ts.map +1 -0
- package/dist/editors/strategies/cursor/prompts.js +67 -0
- package/dist/editors/strategies/cursor/prompts.js.map +1 -0
- package/dist/editors/strategies/cursor/rules.d.ts +17 -0
- package/dist/editors/strategies/cursor/rules.d.ts.map +1 -0
- package/dist/editors/strategies/cursor/rules.js +41 -0
- package/dist/editors/strategies/cursor/rules.js.map +1 -0
- package/dist/editors/strategies/index.d.ts +9 -0
- package/dist/editors/strategies/index.d.ts.map +1 -0
- package/dist/editors/strategies/index.js +10 -0
- package/dist/editors/strategies/index.js.map +1 -0
- package/dist/editors/strategies/shared/global-mcp.d.ts +74 -0
- package/dist/editors/strategies/shared/global-mcp.d.ts.map +1 -0
- package/dist/editors/strategies/shared/global-mcp.js +85 -0
- package/dist/editors/strategies/shared/global-mcp.js.map +1 -0
- package/dist/editors/strategies/shared/index.d.ts +8 -0
- package/dist/editors/strategies/shared/index.d.ts.map +1 -0
- package/dist/editors/strategies/shared/index.js +8 -0
- package/dist/editors/strategies/shared/index.js.map +1 -0
- package/dist/editors/strategies/shared/native-skills.d.ts +19 -0
- package/dist/editors/strategies/shared/native-skills.d.ts.map +1 -0
- package/dist/editors/strategies/shared/native-skills.js +72 -0
- package/dist/editors/strategies/shared/native-skills.js.map +1 -0
- package/dist/editors/strategies/shared/no-hooks.d.ts +13 -0
- package/dist/editors/strategies/shared/no-hooks.d.ts.map +1 -0
- package/dist/editors/strategies/shared/no-hooks.js +19 -0
- package/dist/editors/strategies/shared/no-hooks.js.map +1 -0
- package/dist/editors/strategies/shared/no-mcp.d.ts +16 -0
- package/dist/editors/strategies/shared/no-mcp.d.ts.map +1 -0
- package/dist/editors/strategies/shared/no-mcp.js +21 -0
- package/dist/editors/strategies/shared/no-mcp.js.map +1 -0
- package/dist/editors/strategies/shared/no-prompts.d.ts +17 -0
- package/dist/editors/strategies/shared/no-prompts.d.ts.map +1 -0
- package/dist/editors/strategies/shared/no-prompts.js +24 -0
- package/dist/editors/strategies/shared/no-prompts.js.map +1 -0
- package/dist/editors/strategies/shared/pointer-skills.d.ts +17 -0
- package/dist/editors/strategies/shared/pointer-skills.d.ts.map +1 -0
- package/dist/editors/strategies/shared/pointer-skills.js +72 -0
- package/dist/editors/strategies/shared/pointer-skills.js.map +1 -0
- package/dist/editors/strategies/shared/standard-mcp.d.ts +16 -0
- package/dist/editors/strategies/shared/standard-mcp.d.ts.map +1 -0
- package/dist/editors/strategies/shared/standard-mcp.js +68 -0
- package/dist/editors/strategies/shared/standard-mcp.js.map +1 -0
- package/dist/editors/strategies/types.d.ts +126 -0
- package/dist/editors/strategies/types.d.ts.map +1 -0
- package/dist/editors/strategies/types.js +2 -0
- package/dist/editors/strategies/types.js.map +1 -0
- package/dist/editors/strategies/vscode/index.d.ts +4 -0
- package/dist/editors/strategies/vscode/index.d.ts.map +1 -0
- package/dist/editors/strategies/vscode/index.js +4 -0
- package/dist/editors/strategies/vscode/index.js.map +1 -0
- package/dist/editors/strategies/vscode/mcp.d.ts +17 -0
- package/dist/editors/strategies/vscode/mcp.d.ts.map +1 -0
- package/dist/editors/strategies/vscode/mcp.js +85 -0
- package/dist/editors/strategies/vscode/mcp.js.map +1 -0
- package/dist/editors/strategies/vscode/prompts.d.ts +18 -0
- package/dist/editors/strategies/vscode/prompts.d.ts.map +1 -0
- package/dist/editors/strategies/vscode/prompts.js +81 -0
- package/dist/editors/strategies/vscode/prompts.js.map +1 -0
- package/dist/editors/strategies/vscode/rules.d.ts +17 -0
- package/dist/editors/strategies/vscode/rules.d.ts.map +1 -0
- package/dist/editors/strategies/vscode/rules.js +38 -0
- package/dist/editors/strategies/vscode/rules.js.map +1 -0
- package/dist/editors/strategies/windsurf/hooks.d.ts +13 -0
- package/dist/editors/strategies/windsurf/hooks.d.ts.map +1 -0
- package/dist/editors/strategies/windsurf/hooks.js +61 -0
- package/dist/editors/strategies/windsurf/hooks.js.map +1 -0
- package/dist/editors/strategies/windsurf/index.d.ts +6 -0
- package/dist/editors/strategies/windsurf/index.d.ts.map +1 -0
- package/dist/editors/strategies/windsurf/index.js +6 -0
- package/dist/editors/strategies/windsurf/index.js.map +1 -0
- package/dist/editors/strategies/windsurf/mcp.d.ts +8 -0
- package/dist/editors/strategies/windsurf/mcp.d.ts.map +1 -0
- package/dist/editors/strategies/windsurf/mcp.js +99 -0
- package/dist/editors/strategies/windsurf/mcp.js.map +1 -0
- package/dist/editors/strategies/windsurf/prompts.d.ts +18 -0
- package/dist/editors/strategies/windsurf/prompts.d.ts.map +1 -0
- package/dist/editors/strategies/windsurf/prompts.js +68 -0
- package/dist/editors/strategies/windsurf/prompts.js.map +1 -0
- package/dist/editors/strategies/windsurf/rules.d.ts +17 -0
- package/dist/editors/strategies/windsurf/rules.d.ts.map +1 -0
- package/dist/editors/strategies/windsurf/rules.js +55 -0
- package/dist/editors/strategies/windsurf/rules.js.map +1 -0
- package/dist/editors/strategies/windsurf/skills.d.ts +9 -0
- package/dist/editors/strategies/windsurf/skills.d.ts.map +1 -0
- package/dist/editors/strategies/windsurf/skills.js +11 -0
- package/dist/editors/strategies/windsurf/skills.js.map +1 -0
- package/dist/editors/strategies/zed/index.d.ts +4 -0
- package/dist/editors/strategies/zed/index.d.ts.map +1 -0
- package/dist/editors/strategies/zed/index.js +4 -0
- package/dist/editors/strategies/zed/index.js.map +1 -0
- package/dist/editors/strategies/zed/mcp.d.ts +17 -0
- package/dist/editors/strategies/zed/mcp.d.ts.map +1 -0
- package/dist/editors/strategies/zed/mcp.js +68 -0
- package/dist/editors/strategies/zed/mcp.js.map +1 -0
- package/dist/editors/strategies/zed/prompts.d.ts +18 -0
- package/dist/editors/strategies/zed/prompts.d.ts.map +1 -0
- package/dist/editors/strategies/zed/prompts.js +25 -0
- package/dist/editors/strategies/zed/prompts.js.map +1 -0
- package/dist/editors/strategies/zed/rules.d.ts +17 -0
- package/dist/editors/strategies/zed/rules.d.ts.map +1 -0
- package/dist/editors/strategies/zed/rules.js +33 -0
- package/dist/editors/strategies/zed/rules.js.map +1 -0
- package/dist/editors/types.d.ts +164 -0
- package/dist/editors/types.d.ts.map +1 -0
- package/dist/editors/types.js +2 -0
- package/dist/editors/types.js.map +1 -0
- package/dist/env/ci.d.ts +6 -0
- package/dist/env/ci.d.ts.map +1 -0
- package/dist/env/ci.js +22 -0
- package/dist/env/ci.js.map +1 -0
- package/dist/env/index.d.ts +2 -0
- package/dist/env/index.d.ts.map +1 -0
- package/dist/env/index.js +2 -0
- package/dist/env/index.js.map +1 -0
- package/dist/errors.d.ts +44 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +68 -0
- package/dist/errors.js.map +1 -0
- package/dist/format-error.d.ts +18 -0
- package/dist/format-error.d.ts.map +1 -0
- package/dist/format-error.js +113 -0
- package/dist/format-error.js.map +1 -0
- package/dist/fs/safe-rm.d.ts +20 -0
- package/dist/fs/safe-rm.d.ts.map +1 -0
- package/dist/fs/safe-rm.js +129 -0
- package/dist/fs/safe-rm.js.map +1 -0
- package/dist/git-loader.d.ts +21 -0
- package/dist/git-loader.d.ts.map +1 -0
- package/dist/git-loader.js +61 -0
- package/dist/git-loader.js.map +1 -0
- package/dist/global/comparison.d.ts +16 -0
- package/dist/global/comparison.d.ts.map +1 -0
- package/dist/global/comparison.js +52 -0
- package/dist/global/comparison.js.map +1 -0
- package/dist/global/index.d.ts +5 -0
- package/dist/global/index.d.ts.map +1 -0
- package/dist/global/index.js +4 -0
- package/dist/global/index.js.map +1 -0
- package/dist/global/processor.d.ts +26 -0
- package/dist/global/processor.d.ts.map +1 -0
- package/dist/global/processor.js +318 -0
- package/dist/global/processor.js.map +1 -0
- package/dist/global/tracking.d.ts +109 -0
- package/dist/global/tracking.d.ts.map +1 -0
- package/dist/global/tracking.js +193 -0
- package/dist/global/tracking.js.map +1 -0
- package/dist/global/types.d.ts +54 -0
- package/dist/global/types.d.ts.map +1 -0
- package/dist/global/types.js +2 -0
- package/dist/global/types.js.map +1 -0
- package/dist/import-writer.d.ts +37 -0
- package/dist/import-writer.d.ts.map +1 -0
- package/dist/import-writer.js +129 -0
- package/dist/import-writer.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/inheritance.d.ts +9 -0
- package/dist/inheritance.d.ts.map +1 -0
- package/dist/inheritance.js +133 -0
- package/dist/inheritance.js.map +1 -0
- package/dist/json.d.ts +75 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +123 -0
- package/dist/json.js.map +1 -0
- package/dist/loader.d.ts +35 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +147 -0
- package/dist/loader.js.map +1 -0
- package/dist/mcp/env.d.ts +28 -0
- package/dist/mcp/env.d.ts.map +1 -0
- package/dist/mcp/env.js +47 -0
- package/dist/mcp/env.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +4 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/normalize.d.ts +33 -0
- package/dist/mcp/normalize.d.ts.map +1 -0
- package/dist/mcp/normalize.js +29 -0
- package/dist/mcp/normalize.js.map +1 -0
- package/dist/mcp/templates.d.ts +18 -0
- package/dist/mcp/templates.d.ts.map +1 -0
- package/dist/mcp/templates.js +66 -0
- package/dist/mcp/templates.js.map +1 -0
- package/dist/merge.d.ts +29 -0
- package/dist/merge.d.ts.map +1 -0
- package/dist/merge.js +154 -0
- package/dist/merge.js.map +1 -0
- package/dist/npm/index.d.ts +2 -0
- package/dist/npm/index.d.ts.map +1 -0
- package/dist/npm/index.js +2 -0
- package/dist/npm/index.js.map +1 -0
- package/dist/npm/resolve.d.ts +16 -0
- package/dist/npm/resolve.d.ts.map +1 -0
- package/dist/npm/resolve.js +42 -0
- package/dist/npm/resolve.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/loader.d.ts +23 -0
- package/dist/prompts/loader.d.ts.map +1 -0
- package/dist/prompts/loader.js +115 -0
- package/dist/prompts/loader.js.map +1 -0
- package/dist/remote-loader.d.ts +29 -0
- package/dist/remote-loader.d.ts.map +1 -0
- package/dist/remote-loader.js +208 -0
- package/dist/remote-loader.js.map +1 -0
- package/dist/rules/index.d.ts +6 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +6 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/interpolate.d.ts +27 -0
- package/dist/rules/interpolate.d.ts.map +1 -0
- package/dist/rules/interpolate.js +48 -0
- package/dist/rules/interpolate.js.map +1 -0
- package/dist/rules/loader.d.ts +27 -0
- package/dist/rules/loader.d.ts.map +1 -0
- package/dist/rules/loader.js +94 -0
- package/dist/rules/loader.js.map +1 -0
- package/dist/rules/merger.d.ts +37 -0
- package/dist/rules/merger.d.ts.map +1 -0
- package/dist/rules/merger.js +93 -0
- package/dist/rules/merger.js.map +1 -0
- package/dist/rules/skill-rules.d.ts +13 -0
- package/dist/rules/skill-rules.d.ts.map +1 -0
- package/dist/rules/skill-rules.js +70 -0
- package/dist/rules/skill-rules.js.map +1 -0
- package/dist/rules/utils.d.ts +36 -0
- package/dist/rules/utils.d.ts.map +1 -0
- package/dist/rules/utils.js +82 -0
- package/dist/rules/utils.js.map +1 -0
- package/dist/skills/cache.d.ts +10 -0
- package/dist/skills/cache.d.ts.map +1 -0
- package/dist/skills/cache.js +20 -0
- package/dist/skills/cache.js.map +1 -0
- package/dist/skills/index.d.ts +9 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +9 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/parser.d.ts +6 -0
- package/dist/skills/parser.d.ts.map +1 -0
- package/dist/skills/parser.js +28 -0
- package/dist/skills/parser.js.map +1 -0
- package/dist/skills/reference-parser.d.ts +23 -0
- package/dist/skills/reference-parser.d.ts.map +1 -0
- package/dist/skills/reference-parser.js +162 -0
- package/dist/skills/reference-parser.js.map +1 -0
- package/dist/skills/resolve.d.ts +21 -0
- package/dist/skills/resolve.d.ts.map +1 -0
- package/dist/skills/resolve.js +43 -0
- package/dist/skills/resolve.js.map +1 -0
- package/dist/skills/resolvers/git.d.ts +8 -0
- package/dist/skills/resolvers/git.d.ts.map +1 -0
- package/dist/skills/resolvers/git.js +43 -0
- package/dist/skills/resolvers/git.js.map +1 -0
- package/dist/skills/resolvers/local.d.ts +7 -0
- package/dist/skills/resolvers/local.d.ts.map +1 -0
- package/dist/skills/resolvers/local.js +16 -0
- package/dist/skills/resolvers/local.js.map +1 -0
- package/dist/skills/resolvers/npm.d.ts +12 -0
- package/dist/skills/resolvers/npm.d.ts.map +1 -0
- package/dist/skills/resolvers/npm.js +28 -0
- package/dist/skills/resolvers/npm.js.map +1 -0
- package/dist/skills/validate.d.ts +11 -0
- package/dist/skills/validate.d.ts.map +1 -0
- package/dist/skills/validate.js +43 -0
- package/dist/skills/validate.js.map +1 -0
- package/dist/updater.d.ts +23 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +100 -0
- package/dist/updater.js.map +1 -0
- package/dist/url-parsing.d.ts +121 -0
- package/dist/url-parsing.d.ts.map +1 -0
- package/dist/url-parsing.js +199 -0
- package/dist/url-parsing.js.map +1 -0
- package/package.json +41 -0
package/dist/merge.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { deepMergeJson } from './json.js';
|
|
2
|
+
/**
|
|
3
|
+
* Filter a config to only include the specified scopes.
|
|
4
|
+
* @param config - Full config
|
|
5
|
+
* @param scopes - Scopes to include (if empty, returns empty partial)
|
|
6
|
+
* @returns Partial config with only specified sections
|
|
7
|
+
*/
|
|
8
|
+
export function filterConfigByScopes(config, scopes) {
|
|
9
|
+
if (scopes.length === 0) {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
const result = {};
|
|
13
|
+
for (const scope of scopes) {
|
|
14
|
+
switch (scope) {
|
|
15
|
+
case 'rules':
|
|
16
|
+
if (config.rules) {
|
|
17
|
+
result.rules = config.rules;
|
|
18
|
+
}
|
|
19
|
+
break;
|
|
20
|
+
case 'prompts':
|
|
21
|
+
if (config.prompts) {
|
|
22
|
+
result.prompts = config.prompts;
|
|
23
|
+
}
|
|
24
|
+
break;
|
|
25
|
+
case 'mcp':
|
|
26
|
+
if (config.mcp) {
|
|
27
|
+
result.mcp = config.mcp;
|
|
28
|
+
}
|
|
29
|
+
break;
|
|
30
|
+
case 'skills':
|
|
31
|
+
if (config.skills) {
|
|
32
|
+
result.skills = config.skills;
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
case 'editors':
|
|
36
|
+
if (config.editors) {
|
|
37
|
+
result.editors = config.editors;
|
|
38
|
+
}
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Remove entries set to false from an object.
|
|
46
|
+
*/
|
|
47
|
+
function filterFalseValues(obj) {
|
|
48
|
+
const result = { ...obj };
|
|
49
|
+
for (const key of Object.keys(result)) {
|
|
50
|
+
if (result[key] === false) {
|
|
51
|
+
delete result[key];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Merge two object configs with key-level replacement and false-value support.
|
|
58
|
+
* - Keys are merged, but if same key exists in both, remote value replaces local entirely
|
|
59
|
+
* - If remote has `false`, the key is removed (disables the entry)
|
|
60
|
+
* - If local has `false` and remote has an object, the object wins (re-enables)
|
|
61
|
+
* - Final result has all `false` values filtered out
|
|
62
|
+
*/
|
|
63
|
+
function mergeWithFalseSupport(local, remote) {
|
|
64
|
+
if (!remote) {
|
|
65
|
+
return filterFalseValues((local ?? {}));
|
|
66
|
+
}
|
|
67
|
+
if (!local) {
|
|
68
|
+
return filterFalseValues(remote);
|
|
69
|
+
}
|
|
70
|
+
const merged = { ...local };
|
|
71
|
+
for (const [key, remoteValue] of Object.entries(remote)) {
|
|
72
|
+
if (remoteValue === false) {
|
|
73
|
+
// Remote wants to disable - remove the entry
|
|
74
|
+
delete merged[key];
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// Remote has a value - it wins (including over local false)
|
|
78
|
+
merged[key] = remoteValue;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return filterFalseValues(merged);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Merge two AiJsonConfig objects. Remote config wins on conflicts.
|
|
85
|
+
*
|
|
86
|
+
* Merge strategy:
|
|
87
|
+
* - `skills`: Object merge by key, replace entire value on key conflict
|
|
88
|
+
* - `rules`: Object merge by key, replace entire value on key conflict
|
|
89
|
+
* - `prompts`: Object merge by key, replace entire value on key conflict
|
|
90
|
+
* - `mcp`: Object merge by key, replace entire value on key conflict
|
|
91
|
+
* - `editors`: Object merge by key, deep merge on key conflict
|
|
92
|
+
* - `$schema`, `extends`: Remote wins
|
|
93
|
+
*
|
|
94
|
+
* @param local - Existing local config
|
|
95
|
+
* @param remote - Remote config to merge in (may be partial if scope-filtered)
|
|
96
|
+
* @returns Merged config
|
|
97
|
+
*/
|
|
98
|
+
export function mergeConfigs(local, remote) {
|
|
99
|
+
// Start with local as base
|
|
100
|
+
const result = { ...local };
|
|
101
|
+
// Merge skills (key-level replacement with false support)
|
|
102
|
+
if (remote.skills !== undefined) {
|
|
103
|
+
result.skills = mergeWithFalseSupport(local.skills, remote.skills);
|
|
104
|
+
}
|
|
105
|
+
// Merge rules (key-level replacement with false support)
|
|
106
|
+
if (remote.rules !== undefined) {
|
|
107
|
+
result.rules = mergeWithFalseSupport(local.rules, remote.rules);
|
|
108
|
+
}
|
|
109
|
+
// Merge prompts (key-level replacement with false support)
|
|
110
|
+
if (remote.prompts !== undefined) {
|
|
111
|
+
result.prompts = mergeWithFalseSupport(local.prompts, remote.prompts);
|
|
112
|
+
}
|
|
113
|
+
// Merge mcp (with false support for disabling servers)
|
|
114
|
+
if (remote.mcp !== undefined) {
|
|
115
|
+
result.mcp = mergeWithFalseSupport(local.mcp, remote.mcp);
|
|
116
|
+
}
|
|
117
|
+
// Merge editors (deep merge, remote wins on key conflict)
|
|
118
|
+
if (remote.editors !== undefined) {
|
|
119
|
+
// Handle both array and object forms - normalize to object for merging
|
|
120
|
+
const localEditors = normalizeEditors(local.editors), remoteEditors = normalizeEditors(remote.editors);
|
|
121
|
+
result.editors = deepMergeJson(localEditors, remoteEditors);
|
|
122
|
+
}
|
|
123
|
+
// Metadata fields: remote wins
|
|
124
|
+
if (remote.$schema !== undefined) {
|
|
125
|
+
result.$schema = remote.$schema;
|
|
126
|
+
}
|
|
127
|
+
if (remote.extends !== undefined) {
|
|
128
|
+
result.extends = remote.extends;
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Normalize editors config to object form for merging.
|
|
134
|
+
* Array form: ["windsurf", { "cursor": {...} }] → { windsurf: { enabled: true }, cursor: {...} }
|
|
135
|
+
*/
|
|
136
|
+
function normalizeEditors(editors) {
|
|
137
|
+
if (!editors) {
|
|
138
|
+
return {};
|
|
139
|
+
}
|
|
140
|
+
if (Array.isArray(editors)) {
|
|
141
|
+
const result = {};
|
|
142
|
+
for (const item of editors) {
|
|
143
|
+
if (typeof item === 'string') {
|
|
144
|
+
result[item] = { enabled: true };
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
Object.assign(result, item);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
return editors;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../src/merge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAO1C;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CACjC,MAAoB,EACpB,MAAqB;IAErB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC1B,QAAQ,KAAK,EAAE,CAAC;YAChB,KAAK,OAAO;gBACT,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBAChB,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC/B,CAAC;gBACD,MAAM;YACT,KAAK,SAAS;gBACX,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACnC,CAAC;gBACD,MAAM;YACT,KAAK,KAAK;gBACP,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;oBACd,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC3B,CAAC;gBACD,MAAM;YACT,KAAK,QAAQ;gBACV,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBACjC,CAAC;gBACD,MAAM;YACT,KAAK,SAAS;gBACX,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACnC,CAAC;gBACD,MAAM;QACT,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAoC,GAAM;IACjE,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IAE1B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACJ,CAAC;IACD,OAAO,MAAW,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAC3B,KAAoB,EACpB,MAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,CAAC;QACX,OAAO,iBAAiB,CAAC,CAAC,KAAK,IAAI,EAAE,CAAM,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACV,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;YACzB,6CAA6C;YAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACL,4DAA4D;YAC3D,MAAkC,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;QAC1D,CAAC;IACJ,CAAC;IAED,OAAO,iBAAiB,CAAC,MAAM,CAAM,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAE,MAA6B;IAC5E,2BAA2B;IAC3B,MAAM,MAAM,GAAiB,EAAE,GAAG,KAAK,EAAE,CAAC;IAE1C,0DAA0D;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,GAAG,qBAAqB,CAClC,KAAK,CAAC,MAA6C,EACnD,MAAM,CAAC,MAA6C,CAC5B,CAAC;IAC/B,CAAC;IAED,yDAAyD;IACzD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,GAAG,qBAAqB,CACjC,KAAK,CAAC,KAA4C,EAClD,MAAM,CAAC,KAA4C,CACtC,CAAC;IACpB,CAAC;IAED,2DAA2D;IAC3D,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,qBAAqB,CACnC,KAAK,CAAC,OAA8C,EACpD,MAAM,CAAC,OAA8C,CACtC,CAAC;IACtB,CAAC;IAED,uDAAuD;IACvD,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,qBAAqB,CAC/B,KAAK,CAAC,GAA0C,EAChD,MAAM,CAAC,GAA0C,CAC5B,CAAC;IAC5B,CAAC;IAED,0DAA0D;IAC1D,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,uEAAuE;QACvE,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,EAC9C,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,CAAC,OAAO,GAAG,aAAa,CAC3B,YAAuC,EACvC,aAAwC,CACf,CAAC;IAChC,CAAC;IAED,+BAA+B;IAC/B,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IACnC,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,OAAO,MAAM,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAgC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACL,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IACjB,CAAC;IAED,OAAO,OAAkC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/npm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/npm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA0B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface NpmResolveOptions {
|
|
2
|
+
packageName: string;
|
|
3
|
+
subpath?: string;
|
|
4
|
+
version?: string;
|
|
5
|
+
projectRoot: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Resolve a path within an npm package.
|
|
9
|
+
* Returns the absolute filesystem path.
|
|
10
|
+
*
|
|
11
|
+
* Resolution modes:
|
|
12
|
+
* - No version: Resolve from project's node_modules only (error if not found)
|
|
13
|
+
* - With version: Auto-install to .aix/.tmp/node_modules cache
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveNpmPath(options: NpmResolveOptions): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/npm/resolve.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBhF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { dirname, join } from 'pathe';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { ensureDependencyInstalled } from 'nypm';
|
|
4
|
+
import { getAixDir, getNpmCacheDir } from '../cache/paths.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a path within an npm package.
|
|
7
|
+
* Returns the absolute filesystem path.
|
|
8
|
+
*
|
|
9
|
+
* Resolution modes:
|
|
10
|
+
* - No version: Resolve from project's node_modules only (error if not found)
|
|
11
|
+
* - With version: Auto-install to .aix/.tmp/node_modules cache
|
|
12
|
+
*/
|
|
13
|
+
export async function resolveNpmPath(options) {
|
|
14
|
+
const { packageName, subpath, version, projectRoot } = options;
|
|
15
|
+
if (version) {
|
|
16
|
+
// Auto-install mode: install specific version to cache
|
|
17
|
+
const aixDir = getAixDir(projectRoot), packageSpec = `${packageName}@${version}`;
|
|
18
|
+
await ensureDependencyInstalled(packageSpec, { cwd: aixDir });
|
|
19
|
+
const cachedRoot = join(getNpmCacheDir(projectRoot), packageName);
|
|
20
|
+
return subpath ? join(cachedRoot, subpath) : cachedRoot;
|
|
21
|
+
}
|
|
22
|
+
// Node modules mode: require package to be installed
|
|
23
|
+
const packageRoot = await tryFindPackageRoot(packageName, projectRoot);
|
|
24
|
+
if (!packageRoot) {
|
|
25
|
+
throw new Error(`Package "${packageName}" not found in node_modules. ` +
|
|
26
|
+
'Either install it via npm/yarn/pnpm, or add a "version" field to auto-install.');
|
|
27
|
+
}
|
|
28
|
+
return subpath ? join(packageRoot, subpath) : packageRoot;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Find package root by resolving package.json
|
|
32
|
+
*/
|
|
33
|
+
async function tryFindPackageRoot(packageName, projectRoot) {
|
|
34
|
+
try {
|
|
35
|
+
const pkgJsonPath = import.meta.resolve(`${packageName}/package.json`, `file://${projectRoot}/`);
|
|
36
|
+
return dirname(fileURLToPath(pkgJsonPath));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/npm/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAS9D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA0B;IAC5D,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAE/D,IAAI,OAAO,EAAE,CAAC;QACX,uDAAuD;QACvD,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,EAC/B,WAAW,GAAG,GAAG,WAAW,IAAI,OAAO,EAAE,CAAC;QAEhD,MAAM,yBAAyB,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9D,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;QAElE,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC3D,CAAC;IAED,qDAAqD;IACrD,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAEvE,IAAI,CAAC,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACZ,YAAY,WAAW,+BAA+B;YACnD,gFAAgF,CACrF,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC9B,WAAmB,EACnB,WAAmB;IAEnB,IAAI,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,WAAW,eAAe,EAAE,UAAU,WAAW,GAAG,CAAC,CAAC;QAEjG,OAAO,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACN,OAAO,SAAS,CAAC;IACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAqB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PromptValue, PromptsConfig } from '@a1st/aix-schema';
|
|
2
|
+
export interface LoadedPrompt {
|
|
3
|
+
name: string;
|
|
4
|
+
content: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
argumentHint?: string;
|
|
7
|
+
sourcePath?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Load a single prompt from any source.
|
|
11
|
+
* @param name - The prompt name (key from the prompts object)
|
|
12
|
+
* @param value - The prompt value (string shorthand or object)
|
|
13
|
+
* @param basePath - Base path for resolving relative paths
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadPrompt(name: string, value: PromptValue, basePath: string): Promise<LoadedPrompt>;
|
|
16
|
+
/**
|
|
17
|
+
* Load all prompts from a prompts config object.
|
|
18
|
+
* @param prompts - Prompts config object (keyed by name)
|
|
19
|
+
* @param basePath - Base path for resolving relative paths
|
|
20
|
+
* @returns Record of loaded prompts keyed by name
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadPrompts(prompts: PromptsConfig, basePath: string): Promise<Record<string, LoadedPrompt>>;
|
|
23
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/prompts/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAkCjF,MAAM,WAAW,YAAY;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CAuEvB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC9B,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAavC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve, dirname } from 'pathe';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { normalizeSourceRef } from '@a1st/aix-schema';
|
|
5
|
+
import { getPromptsCacheDir } from '../cache/paths.js';
|
|
6
|
+
import { loadFromGit } from '../git-loader.js';
|
|
7
|
+
import { resolveNpmPath } from '../npm/resolve.js';
|
|
8
|
+
/**
|
|
9
|
+
* Strip YAML frontmatter from markdown content and optionally extract metadata.
|
|
10
|
+
* Returns the content without frontmatter and any extracted metadata.
|
|
11
|
+
*/
|
|
12
|
+
function stripFrontmatter(content) {
|
|
13
|
+
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);
|
|
14
|
+
if (!frontmatterMatch) {
|
|
15
|
+
return { content };
|
|
16
|
+
}
|
|
17
|
+
const frontmatterContent = frontmatterMatch[1];
|
|
18
|
+
const contentWithoutFrontmatter = content.slice(frontmatterMatch[0].length);
|
|
19
|
+
// Parse simple key: value pairs from frontmatter
|
|
20
|
+
const metadata = {};
|
|
21
|
+
for (const line of frontmatterContent.split('\n')) {
|
|
22
|
+
const match = line.match(/^([\w-]+):\s*["']?([^"']*)["']?\s*$/);
|
|
23
|
+
if (match) {
|
|
24
|
+
metadata[match[1]] = match[2];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return { content: contentWithoutFrontmatter.trim(), metadata };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Load a single prompt from any source.
|
|
31
|
+
* @param name - The prompt name (key from the prompts object)
|
|
32
|
+
* @param value - The prompt value (string shorthand or object)
|
|
33
|
+
* @param basePath - Base path for resolving relative paths
|
|
34
|
+
*/
|
|
35
|
+
export async function loadPrompt(name, value, basePath) {
|
|
36
|
+
// Normalize string shorthand transparently
|
|
37
|
+
const promptObj = typeof value === 'string' ? normalizeSourceRef(value) : value;
|
|
38
|
+
const base = {
|
|
39
|
+
name,
|
|
40
|
+
description: promptObj.description,
|
|
41
|
+
argumentHint: promptObj.argumentHint,
|
|
42
|
+
};
|
|
43
|
+
// Inline content
|
|
44
|
+
if (promptObj.content) {
|
|
45
|
+
return {
|
|
46
|
+
...base,
|
|
47
|
+
content: promptObj.content,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Local file
|
|
51
|
+
if (promptObj.path) {
|
|
52
|
+
const fullPath = resolve(dirname(basePath), promptObj.path);
|
|
53
|
+
const rawContent = await readFile(fullPath, 'utf-8');
|
|
54
|
+
const { content, metadata } = stripFrontmatter(rawContent.trim());
|
|
55
|
+
return {
|
|
56
|
+
...base,
|
|
57
|
+
// Use frontmatter description if not explicitly provided
|
|
58
|
+
description: base.description ?? metadata?.description,
|
|
59
|
+
content,
|
|
60
|
+
sourcePath: fullPath,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Git repository
|
|
64
|
+
if (promptObj.git) {
|
|
65
|
+
const baseDir = dirname(basePath) || tmpdir();
|
|
66
|
+
const result = await loadFromGit({
|
|
67
|
+
git: promptObj.git,
|
|
68
|
+
cacheDir: getPromptsCacheDir(baseDir),
|
|
69
|
+
defaultFilePath: 'prompt.md',
|
|
70
|
+
});
|
|
71
|
+
const { content, metadata } = stripFrontmatter(result.content);
|
|
72
|
+
return {
|
|
73
|
+
...base,
|
|
74
|
+
// Use frontmatter description if not explicitly provided
|
|
75
|
+
description: base.description ?? metadata?.description,
|
|
76
|
+
content,
|
|
77
|
+
sourcePath: result.sourcePath,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// NPM package
|
|
81
|
+
if (promptObj.npm) {
|
|
82
|
+
const filePath = await resolveNpmPath({
|
|
83
|
+
packageName: promptObj.npm.npm,
|
|
84
|
+
subpath: promptObj.npm.path,
|
|
85
|
+
version: promptObj.npm.version,
|
|
86
|
+
projectRoot: dirname(basePath),
|
|
87
|
+
});
|
|
88
|
+
const rawContent = await readFile(filePath, 'utf-8');
|
|
89
|
+
const { content, metadata } = stripFrontmatter(rawContent.trim());
|
|
90
|
+
return {
|
|
91
|
+
...base,
|
|
92
|
+
description: base.description ?? metadata?.description,
|
|
93
|
+
content,
|
|
94
|
+
sourcePath: filePath,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
throw new Error(`Invalid prompt "${name}": no content source found`);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Load all prompts from a prompts config object.
|
|
101
|
+
* @param prompts - Prompts config object (keyed by name)
|
|
102
|
+
* @param basePath - Base path for resolving relative paths
|
|
103
|
+
* @returns Record of loaded prompts keyed by name
|
|
104
|
+
*/
|
|
105
|
+
export async function loadPrompts(prompts, basePath) {
|
|
106
|
+
// Filter out false values (disabled prompts)
|
|
107
|
+
const entries = Object.entries(prompts).filter(([, value]) => value !== false);
|
|
108
|
+
const loadedEntries = await Promise.all(entries.map(async ([name, value]) => {
|
|
109
|
+
// Type assertion safe because we filtered out false above
|
|
110
|
+
const loaded = await loadPrompt(name, value, basePath);
|
|
111
|
+
return [name, loaded];
|
|
112
|
+
}));
|
|
113
|
+
return Object.fromEntries(loadedEntries);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/prompts/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type RemoteSourceType = 'url' | 'git' | 'local';
|
|
2
|
+
export interface RemoteLoadResult {
|
|
3
|
+
/** Parsed config content */
|
|
4
|
+
content: Record<string, unknown>;
|
|
5
|
+
/** Base path/URL for resolving relative extends */
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
/** Source type */
|
|
8
|
+
source: RemoteSourceType;
|
|
9
|
+
/** Whether the base is a remote URL (for extends resolution) */
|
|
10
|
+
isRemote: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Load config from a remote URL (direct or blob URL).
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadFromUrl(url: string): Promise<RemoteLoadResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Load config from git shorthand (github:org/repo, github:org/repo/path#ref, etc.).
|
|
18
|
+
* If no path is specified, looks for ai.json at repo root.
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadFromGitShorthand(input: string): Promise<RemoteLoadResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Load config from a local file path.
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadFromLocalPath(path: string, cwd?: string): RemoteLoadResult;
|
|
25
|
+
/**
|
|
26
|
+
* Classify and load config from any source type.
|
|
27
|
+
*/
|
|
28
|
+
export declare function loadFromSource(source: string, cwd?: string): Promise<RemoteLoadResult>;
|
|
29
|
+
//# sourceMappingURL=remote-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-loader.d.ts","sourceRoot":"","sources":["../src/remote-loader.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC9B,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,gEAAgE;IAChE,QAAQ,EAAE,OAAO,CAAC;CACpB;AA4BD;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4BxE;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwDnF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,gBAAgB,CAoB7F;AA+DD;;GAEG;AACH,wBAAsB,cAAc,CACjC,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,MAAsB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAiC3B"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote config loading utilities for fetching ai.json from URLs, git repos, and local paths.
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
5
|
+
import { resolve, dirname } from 'pathe';
|
|
6
|
+
import { downloadTemplate } from 'giget';
|
|
7
|
+
import { parseJsonc } from '@a1st/aix-schema';
|
|
8
|
+
import { convertBlobToRawUrl, parseGitShorthand, parseGitHubRepoUrl, parseGitHubBlobUrl, parseGitLabBlobUrl, parseBitbucketBlobUrl, isLocalPath, } from './url-parsing.js';
|
|
9
|
+
import { ConfigNotFoundError, ConfigParseError, RemoteFetchError, UnsupportedUrlError, } from './errors.js';
|
|
10
|
+
const FETCH_TIMEOUT_MS = 30000;
|
|
11
|
+
/**
|
|
12
|
+
* Fetch content from a URL with timeout.
|
|
13
|
+
*/
|
|
14
|
+
async function fetchWithTimeout(url, timeoutMs = FETCH_TIMEOUT_MS) {
|
|
15
|
+
const controller = new AbortController(), timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
16
|
+
try {
|
|
17
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
18
|
+
if (!response.ok) {
|
|
19
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
20
|
+
}
|
|
21
|
+
return response.text();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
25
|
+
throw new Error(`Request timed out after ${timeoutMs}ms`, { cause: error });
|
|
26
|
+
}
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
clearTimeout(timeout);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Load config from a remote URL (direct or blob URL).
|
|
35
|
+
*/
|
|
36
|
+
export async function loadFromUrl(url) {
|
|
37
|
+
const rawUrl = convertBlobToRawUrl(url);
|
|
38
|
+
let content;
|
|
39
|
+
try {
|
|
40
|
+
content = await fetchWithTimeout(rawUrl);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
44
|
+
throw new RemoteFetchError(url, message);
|
|
45
|
+
}
|
|
46
|
+
const result = parseJsonc(content);
|
|
47
|
+
if (result.errors.length > 0) {
|
|
48
|
+
throw new ConfigParseError(`Parse error: ${result.errors[0]?.message}`, url);
|
|
49
|
+
}
|
|
50
|
+
// Compute base URL for relative extends (directory containing the file)
|
|
51
|
+
const baseUrl = rawUrl.substring(0, rawUrl.lastIndexOf('/') + 1);
|
|
52
|
+
return {
|
|
53
|
+
content: result.data,
|
|
54
|
+
baseUrl,
|
|
55
|
+
source: 'url',
|
|
56
|
+
isRemote: true,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Load config from git shorthand (github:org/repo, github:org/repo/path#ref, etc.).
|
|
61
|
+
* If no path is specified, looks for ai.json at repo root.
|
|
62
|
+
*/
|
|
63
|
+
export async function loadFromGitShorthand(input) {
|
|
64
|
+
const parsed = parseGitShorthand(input);
|
|
65
|
+
if (!parsed) {
|
|
66
|
+
throw new ConfigParseError(`Invalid git shorthand: ${input}`, input);
|
|
67
|
+
}
|
|
68
|
+
// Build the giget template string
|
|
69
|
+
let template = `${parsed.provider}:${parsed.user}/${parsed.repo}`;
|
|
70
|
+
if (parsed.subpath) {
|
|
71
|
+
template += `/${parsed.subpath}`;
|
|
72
|
+
}
|
|
73
|
+
if (parsed.ref) {
|
|
74
|
+
template += `#${parsed.ref}`;
|
|
75
|
+
}
|
|
76
|
+
let dir;
|
|
77
|
+
try {
|
|
78
|
+
const result = await downloadTemplate(template, { force: true, cwd: process.cwd() });
|
|
79
|
+
dir = result.dir;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
83
|
+
throw new RemoteFetchError(input, message);
|
|
84
|
+
}
|
|
85
|
+
// Look for ai.json - if subpath ends with .json, use it directly; otherwise look for ai.json in dir
|
|
86
|
+
let configPath;
|
|
87
|
+
if (parsed.subpath?.endsWith('.json')) {
|
|
88
|
+
// The subpath itself is the config file
|
|
89
|
+
configPath = resolve(dir, parsed.subpath.split('/').pop());
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
configPath = resolve(dir, 'ai.json');
|
|
93
|
+
}
|
|
94
|
+
if (!existsSync(configPath)) {
|
|
95
|
+
throw new ConfigNotFoundError(configPath);
|
|
96
|
+
}
|
|
97
|
+
const content = readFileSync(configPath, 'utf-8'), result = parseJsonc(content);
|
|
98
|
+
if (result.errors.length > 0) {
|
|
99
|
+
throw new ConfigParseError(`Parse error: ${result.errors[0]?.message}`, configPath);
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
content: result.data,
|
|
103
|
+
baseUrl: dirname(configPath),
|
|
104
|
+
source: 'git',
|
|
105
|
+
isRemote: false, // Local filesystem after download
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Load config from a local file path.
|
|
110
|
+
*/
|
|
111
|
+
export function loadFromLocalPath(path, cwd = process.cwd()) {
|
|
112
|
+
const absolutePath = resolve(cwd, path);
|
|
113
|
+
if (!existsSync(absolutePath)) {
|
|
114
|
+
throw new ConfigNotFoundError(absolutePath);
|
|
115
|
+
}
|
|
116
|
+
const content = readFileSync(absolutePath, 'utf-8'), result = parseJsonc(content);
|
|
117
|
+
if (result.errors.length > 0) {
|
|
118
|
+
throw new ConfigParseError(`Parse error: ${result.errors[0]?.message}`, absolutePath);
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
content: result.data,
|
|
122
|
+
baseUrl: dirname(absolutePath),
|
|
123
|
+
source: 'local',
|
|
124
|
+
isRemote: false,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if a URL points directly to a file (blob URL or direct file URL).
|
|
129
|
+
*/
|
|
130
|
+
function isDirectFileUrl(url) {
|
|
131
|
+
// Check for blob URLs
|
|
132
|
+
if (parseGitHubBlobUrl(url) || parseGitLabBlobUrl(url) || parseBitbucketBlobUrl(url)) {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
// Check for direct file URLs (ending in .json)
|
|
136
|
+
if (url.endsWith('.json')) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Load config from a GitHub/GitLab/Bitbucket repo URL (not a blob URL).
|
|
143
|
+
* Downloads the repo and looks for ai.json at the root.
|
|
144
|
+
*/
|
|
145
|
+
async function loadFromRepoUrl(url) {
|
|
146
|
+
// Try to parse as GitHub repo URL
|
|
147
|
+
const ghRepo = parseGitHubRepoUrl(url);
|
|
148
|
+
if (ghRepo) {
|
|
149
|
+
return loadFromGitShorthand(`github:${ghRepo.owner}/${ghRepo.repo}`);
|
|
150
|
+
}
|
|
151
|
+
// For other repo URLs, try using giget directly
|
|
152
|
+
let dir;
|
|
153
|
+
try {
|
|
154
|
+
const result = await downloadTemplate(url, { force: true, cwd: process.cwd() });
|
|
155
|
+
dir = result.dir;
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
159
|
+
throw new RemoteFetchError(url, message);
|
|
160
|
+
}
|
|
161
|
+
const configPath = resolve(dir, 'ai.json');
|
|
162
|
+
if (!existsSync(configPath)) {
|
|
163
|
+
throw new ConfigNotFoundError(configPath);
|
|
164
|
+
}
|
|
165
|
+
const content = readFileSync(configPath, 'utf-8'), result = parseJsonc(content);
|
|
166
|
+
if (result.errors.length > 0) {
|
|
167
|
+
throw new ConfigParseError(`Parse error: ${result.errors[0]?.message}`, configPath);
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
content: result.data,
|
|
171
|
+
baseUrl: dirname(configPath),
|
|
172
|
+
source: 'git',
|
|
173
|
+
isRemote: false,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Classify and load config from any source type.
|
|
178
|
+
*/
|
|
179
|
+
export async function loadFromSource(source, cwd = process.cwd()) {
|
|
180
|
+
// Git shorthand: github:org/repo, gitlab:org/repo, bitbucket:org/repo
|
|
181
|
+
if (source.startsWith('github:') || source.startsWith('gitlab:') || source.startsWith('bitbucket:')) {
|
|
182
|
+
return loadFromGitShorthand(source);
|
|
183
|
+
}
|
|
184
|
+
// HTTPS URL
|
|
185
|
+
if (source.startsWith('https://')) {
|
|
186
|
+
// If it's a direct file URL (blob or .json), fetch it
|
|
187
|
+
if (isDirectFileUrl(source)) {
|
|
188
|
+
return loadFromUrl(source);
|
|
189
|
+
}
|
|
190
|
+
// Otherwise, treat as repo URL and clone it
|
|
191
|
+
return loadFromRepoUrl(source);
|
|
192
|
+
}
|
|
193
|
+
// HTTP URL (reject for security)
|
|
194
|
+
if (source.startsWith('http://')) {
|
|
195
|
+
throw new UnsupportedUrlError(source);
|
|
196
|
+
}
|
|
197
|
+
// Local path (relative or absolute)
|
|
198
|
+
if (isLocalPath(source)) {
|
|
199
|
+
return loadFromLocalPath(source, cwd);
|
|
200
|
+
}
|
|
201
|
+
// If it looks like a file path without ./ prefix, try it as local
|
|
202
|
+
if (source.includes('/') || source.endsWith('.json')) {
|
|
203
|
+
return loadFromLocalPath(source, cwd);
|
|
204
|
+
}
|
|
205
|
+
// Unknown format
|
|
206
|
+
throw new UnsupportedUrlError(source);
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=remote-loader.js.map
|