@fifine/aim-studio 0.0.1
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/LICENSE +21 -0
- package/README.md +159 -0
- package/bin/aim.js +3 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +513 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/update.d.ts +27 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +1275 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/configurators/claude.d.ts +32 -0
- package/dist/configurators/claude.d.ts.map +1 -0
- package/dist/configurators/claude.js +98 -0
- package/dist/configurators/claude.js.map +1 -0
- package/dist/configurators/index.d.ts +51 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +113 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/shared.d.ts +12 -0
- package/dist/configurators/shared.d.ts.map +1 -0
- package/dist/configurators/shared.js +21 -0
- package/dist/configurators/shared.js.map +1 -0
- package/dist/configurators/workflow.d.ts +28 -0
- package/dist/configurators/workflow.d.ts.map +1 -0
- package/dist/configurators/workflow.js +147 -0
- package/dist/configurators/workflow.js.map +1 -0
- package/dist/constants/paths.d.ts +68 -0
- package/dist/constants/paths.d.ts.map +1 -0
- package/dist/constants/paths.js +77 -0
- package/dist/constants/paths.js.map +1 -0
- package/dist/constants/version.d.ts +9 -0
- package/dist/constants/version.d.ts.map +1 -0
- package/dist/constants/version.js +15 -0
- package/dist/constants/version.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/index.d.ts +54 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +160 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/manifests/0.0.1.json +9 -0
- package/dist/migrations/manifests/0.1.9.json +30 -0
- package/dist/migrations/manifests/0.2.0.json +49 -0
- package/dist/migrations/manifests/0.2.12.json +9 -0
- package/dist/migrations/manifests/0.2.13.json +9 -0
- package/dist/migrations/manifests/0.2.14.json +175 -0
- package/dist/migrations/manifests/0.2.15.json +33 -0
- package/dist/migrations/manifests/0.3.0-beta.0.json +278 -0
- package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
- package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
- package/dist/templates/CLAUDE.md +71 -0
- package/dist/templates/aim/gitignore.txt +29 -0
- package/dist/templates/aim/index.d.ts +49 -0
- package/dist/templates/aim/index.d.ts.map +1 -0
- package/dist/templates/aim/index.js +92 -0
- package/dist/templates/aim/index.js.map +1 -0
- package/dist/templates/aim/scripts/__init__.py +5 -0
- package/dist/templates/aim/scripts/add_session.py +392 -0
- package/dist/templates/aim/scripts/common/__init__.py +80 -0
- package/dist/templates/aim/scripts/common/cli_adapter.py +435 -0
- package/dist/templates/aim/scripts/common/developer.py +190 -0
- package/dist/templates/aim/scripts/common/git_context.py +383 -0
- package/dist/templates/aim/scripts/common/paths.py +347 -0
- package/dist/templates/aim/scripts/common/phase.py +253 -0
- package/dist/templates/aim/scripts/common/registry.py +366 -0
- package/dist/templates/aim/scripts/common/task_queue.py +255 -0
- package/dist/templates/aim/scripts/common/task_utils.py +178 -0
- package/dist/templates/aim/scripts/common/worktree.py +219 -0
- package/dist/templates/aim/scripts/create_bootstrap.py +290 -0
- package/dist/templates/aim/scripts/get_context.py +16 -0
- package/dist/templates/aim/scripts/get_developer.py +26 -0
- package/dist/templates/aim/scripts/init_developer.py +51 -0
- package/dist/templates/aim/scripts/multi_agent/__init__.py +5 -0
- package/dist/templates/aim/scripts/multi_agent/cleanup.py +403 -0
- package/dist/templates/aim/scripts/multi_agent/create_pr.py +329 -0
- package/dist/templates/aim/scripts/multi_agent/plan.py +233 -0
- package/dist/templates/aim/scripts/multi_agent/start.py +461 -0
- package/dist/templates/aim/scripts/multi_agent/status.py +817 -0
- package/dist/templates/aim/scripts/task.py +1068 -0
- package/dist/templates/aim/scripts-shell-archive/add-session.sh +384 -0
- package/dist/templates/aim/scripts-shell-archive/common/developer.sh +129 -0
- package/dist/templates/aim/scripts-shell-archive/common/git-context.sh +263 -0
- package/dist/templates/aim/scripts-shell-archive/common/paths.sh +208 -0
- package/dist/templates/aim/scripts-shell-archive/common/phase.sh +150 -0
- package/dist/templates/aim/scripts-shell-archive/common/registry.sh +247 -0
- package/dist/templates/aim/scripts-shell-archive/common/task-queue.sh +142 -0
- package/dist/templates/aim/scripts-shell-archive/common/task-utils.sh +151 -0
- package/dist/templates/aim/scripts-shell-archive/common/worktree.sh +128 -0
- package/dist/templates/aim/scripts-shell-archive/create-bootstrap.sh +299 -0
- package/dist/templates/aim/scripts-shell-archive/get-context.sh +7 -0
- package/dist/templates/aim/scripts-shell-archive/get-developer.sh +15 -0
- package/dist/templates/aim/scripts-shell-archive/init-developer.sh +34 -0
- package/dist/templates/aim/scripts-shell-archive/multi-agent/cleanup.sh +396 -0
- package/dist/templates/aim/scripts-shell-archive/multi-agent/create-pr.sh +241 -0
- package/dist/templates/aim/scripts-shell-archive/multi-agent/plan.sh +207 -0
- package/dist/templates/aim/scripts-shell-archive/multi-agent/start.sh +317 -0
- package/dist/templates/aim/scripts-shell-archive/multi-agent/status.sh +828 -0
- package/dist/templates/aim/scripts-shell-archive/task.sh +1204 -0
- package/dist/templates/aim/tasks/.gitkeep +0 -0
- package/dist/templates/aim/workflow.md +258 -0
- package/dist/templates/aim/worktree.yaml +47 -0
- package/dist/templates/claude/agents/check.md +122 -0
- package/dist/templates/claude/agents/debug.md +106 -0
- package/dist/templates/claude/agents/dispatch.md +230 -0
- package/dist/templates/claude/agents/implement.md +96 -0
- package/dist/templates/claude/agents/plan.md +396 -0
- package/dist/templates/claude/agents/research.md +120 -0
- package/dist/templates/claude/agents/story.md +53 -0
- package/dist/templates/claude/commands/aim/before-backend-dev.md +13 -0
- package/dist/templates/claude/commands/aim/before-frontend-dev.md +13 -0
- package/dist/templates/claude/commands/aim/break-loop.md +153 -0
- package/dist/templates/claude/commands/aim/check-backend.md +13 -0
- package/dist/templates/claude/commands/aim/check-cross-layer.md +153 -0
- package/dist/templates/claude/commands/aim/check-frontend.md +13 -0
- package/dist/templates/claude/commands/aim/check-story.md +59 -0
- package/dist/templates/claude/commands/aim/create-command.md +154 -0
- package/dist/templates/claude/commands/aim/export.md +187 -0
- package/dist/templates/claude/commands/aim/finish-work.md +104 -0
- package/dist/templates/claude/commands/aim/integrate-skill.md +219 -0
- package/dist/templates/claude/commands/aim/onboard.md +358 -0
- package/dist/templates/claude/commands/aim/parallel.md +217 -0
- package/dist/templates/claude/commands/aim/portrait.md +170 -0
- package/dist/templates/claude/commands/aim/record-session.md +92 -0
- package/dist/templates/claude/commands/aim/start.md +112 -0
- package/dist/templates/claude/commands/aim/story.md +140 -0
- package/dist/templates/claude/commands/aim/update-spec.md +285 -0
- package/dist/templates/claude/commands/aim/visualize.md +182 -0
- package/dist/templates/claude/commands/trellis/before-backend-dev.md +13 -0
- package/dist/templates/claude/commands/trellis/before-frontend-dev.md +13 -0
- package/dist/templates/claude/commands/trellis/break-loop.md +125 -0
- package/dist/templates/claude/commands/trellis/check-backend.md +13 -0
- package/dist/templates/claude/commands/trellis/check-cross-layer.md +153 -0
- package/dist/templates/claude/commands/trellis/check-frontend.md +13 -0
- package/dist/templates/claude/commands/trellis/create-command.md +154 -0
- package/dist/templates/claude/commands/trellis/finish-work.md +129 -0
- package/dist/templates/claude/commands/trellis/integrate-skill.md +219 -0
- package/dist/templates/claude/commands/trellis/onboard.md +358 -0
- package/dist/templates/claude/commands/trellis/parallel.md +193 -0
- package/dist/templates/claude/commands/trellis/record-session.md +62 -0
- package/dist/templates/claude/commands/trellis/start.md +280 -0
- package/dist/templates/claude/commands/trellis/update-spec.md +285 -0
- package/dist/templates/claude/hooks/inject-subagent-context.py +772 -0
- package/dist/templates/claude/hooks/ralph-loop.py +388 -0
- package/dist/templates/claude/hooks/session-start.py +142 -0
- package/dist/templates/claude/index.d.ts +54 -0
- package/dist/templates/claude/index.d.ts.map +1 -0
- package/dist/templates/claude/index.js +85 -0
- package/dist/templates/claude/index.js.map +1 -0
- package/dist/templates/claude/settings.json +41 -0
- package/dist/templates/extract.d.ts +68 -0
- package/dist/templates/extract.d.ts.map +1 -0
- package/dist/templates/extract.js +128 -0
- package/dist/templates/extract.js.map +1 -0
- package/dist/templates/markdown/agents.md +25 -0
- package/dist/templates/markdown/gitignore.txt +12 -0
- package/dist/templates/markdown/index.d.ts +32 -0
- package/dist/templates/markdown/index.d.ts.map +1 -0
- package/dist/templates/markdown/index.js +58 -0
- package/dist/templates/markdown/index.js.map +1 -0
- package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/index.md +40 -0
- package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
- package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/script-conventions.md +467 -0
- package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
- package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
- package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md +118 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +92 -0
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +94 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md +394 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +319 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +89 -0
- package/dist/templates/markdown/spec/story/character.md.txt +95 -0
- package/dist/templates/markdown/spec/story/index.md.txt +31 -0
- package/dist/templates/markdown/spec/story/script.md.txt +313 -0
- package/dist/templates/markdown/spec/story/world.md.txt +92 -0
- package/dist/templates/markdown/workspace-index.md +123 -0
- package/dist/templates/markdown/worktree.yaml.txt +58 -0
- package/dist/templates/trellis/gitignore.txt +29 -0
- package/dist/templates/trellis/index.d.ts +49 -0
- package/dist/templates/trellis/index.d.ts.map +1 -0
- package/dist/templates/trellis/index.js +92 -0
- package/dist/templates/trellis/index.js.map +1 -0
- package/dist/templates/trellis/scripts/__init__.py +5 -0
- package/dist/templates/trellis/scripts/add_session.py +392 -0
- package/dist/templates/trellis/scripts/common/__init__.py +80 -0
- package/dist/templates/trellis/scripts/common/cli_adapter.py +435 -0
- package/dist/templates/trellis/scripts/common/developer.py +190 -0
- package/dist/templates/trellis/scripts/common/git_context.py +383 -0
- package/dist/templates/trellis/scripts/common/paths.py +347 -0
- package/dist/templates/trellis/scripts/common/phase.py +253 -0
- package/dist/templates/trellis/scripts/common/registry.py +366 -0
- package/dist/templates/trellis/scripts/common/task_queue.py +255 -0
- package/dist/templates/trellis/scripts/common/task_utils.py +178 -0
- package/dist/templates/trellis/scripts/common/worktree.py +219 -0
- package/dist/templates/trellis/scripts/create_bootstrap.py +290 -0
- package/dist/templates/trellis/scripts/get_context.py +16 -0
- package/dist/templates/trellis/scripts/get_developer.py +26 -0
- package/dist/templates/trellis/scripts/init_developer.py +51 -0
- package/dist/templates/trellis/scripts/multi_agent/__init__.py +5 -0
- package/dist/templates/trellis/scripts/multi_agent/cleanup.py +403 -0
- package/dist/templates/trellis/scripts/multi_agent/create_pr.py +329 -0
- package/dist/templates/trellis/scripts/multi_agent/plan.py +233 -0
- package/dist/templates/trellis/scripts/multi_agent/start.py +461 -0
- package/dist/templates/trellis/scripts/multi_agent/status.py +817 -0
- package/dist/templates/trellis/scripts/task.py +1056 -0
- package/dist/templates/trellis/scripts-shell-archive/add-session.sh +384 -0
- package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +129 -0
- package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +263 -0
- package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +208 -0
- package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +150 -0
- package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +247 -0
- package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +142 -0
- package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +151 -0
- package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +128 -0
- package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +299 -0
- package/dist/templates/trellis/scripts-shell-archive/get-context.sh +7 -0
- package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +15 -0
- package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +34 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +396 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +241 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +207 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +317 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +828 -0
- package/dist/templates/trellis/scripts-shell-archive/task.sh +1204 -0
- package/dist/templates/trellis/tasks/.gitkeep +0 -0
- package/dist/templates/trellis/workflow.md +416 -0
- package/dist/templates/trellis/worktree.yaml +47 -0
- package/dist/types/ai-tools.d.ts +48 -0
- package/dist/types/ai-tools.d.ts.map +1 -0
- package/dist/types/ai-tools.js +32 -0
- package/dist/types/ai-tools.js.map +1 -0
- package/dist/types/migration.d.ts +86 -0
- package/dist/types/migration.d.ts.map +1 -0
- package/dist/types/migration.js +8 -0
- package/dist/types/migration.js.map +1 -0
- package/dist/utils/compare-versions.d.ts +12 -0
- package/dist/utils/compare-versions.d.ts.map +1 -0
- package/dist/utils/compare-versions.js +76 -0
- package/dist/utils/compare-versions.js.map +1 -0
- package/dist/utils/file-writer.d.ts +23 -0
- package/dist/utils/file-writer.d.ts.map +1 -0
- package/dist/utils/file-writer.js +140 -0
- package/dist/utils/file-writer.js.map +1 -0
- package/dist/utils/project-detector.d.ts +16 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +188 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/dist/utils/template-fetcher.d.ts +51 -0
- package/dist/utils/template-fetcher.d.ts.map +1 -0
- package/dist/utils/template-fetcher.js +174 -0
- package/dist/utils/template-fetcher.js.map +1 -0
- package/dist/utils/template-hash.d.ts +78 -0
- package/dist/utils/template-hash.d.ts.map +1 -0
- package/dist/utils/template-hash.js +239 -0
- package/dist/utils/template-hash.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compare two semver versions (handles prerelease versions)
|
|
3
|
+
* Returns: -1 if a < b, 0 if a == b, 1 if a > b
|
|
4
|
+
*
|
|
5
|
+
* Semver rules:
|
|
6
|
+
* - 0.3.0-beta.1 < 0.3.0 (prerelease is less than release)
|
|
7
|
+
* - 0.3.0-alpha < 0.3.0-beta (alphabetically)
|
|
8
|
+
* - 0.3.0-beta.1 < 0.3.0-beta.2 (numerically)
|
|
9
|
+
* - 0.3.0-beta.16 < 0.3.0-rc.0 (alphabetically: "beta" < "rc")
|
|
10
|
+
*/
|
|
11
|
+
export function compareVersions(a, b) {
|
|
12
|
+
// Split into base version and prerelease parts
|
|
13
|
+
const [aBase, aPrerelease] = a.split("-", 2);
|
|
14
|
+
const [bBase, bPrerelease] = b.split("-", 2);
|
|
15
|
+
// Parse base version (only numeric parts before any hyphen)
|
|
16
|
+
const parseBase = (v) => v.split(".").map((n) => parseInt(n, 10) || 0);
|
|
17
|
+
const aBaseParts = parseBase(aBase);
|
|
18
|
+
const bBaseParts = parseBase(bBase);
|
|
19
|
+
const maxBaseLen = Math.max(aBaseParts.length, bBaseParts.length);
|
|
20
|
+
// Compare base versions first
|
|
21
|
+
for (let i = 0; i < maxBaseLen; i++) {
|
|
22
|
+
const aVal = aBaseParts[i] ?? 0;
|
|
23
|
+
const bVal = bBaseParts[i] ?? 0;
|
|
24
|
+
if (aVal < bVal)
|
|
25
|
+
return -1;
|
|
26
|
+
if (aVal > bVal)
|
|
27
|
+
return 1;
|
|
28
|
+
}
|
|
29
|
+
// Base versions are equal, compare prerelease
|
|
30
|
+
// No prerelease > prerelease (1.0.0 > 1.0.0-beta)
|
|
31
|
+
if (!aPrerelease && bPrerelease)
|
|
32
|
+
return 1;
|
|
33
|
+
if (aPrerelease && !bPrerelease)
|
|
34
|
+
return -1;
|
|
35
|
+
if (!aPrerelease && !bPrerelease)
|
|
36
|
+
return 0;
|
|
37
|
+
// Both have prerelease, compare them (guaranteed non-null by checks above)
|
|
38
|
+
// Split prerelease by dots and compare each part
|
|
39
|
+
const aPre = aPrerelease.split(".");
|
|
40
|
+
const bPre = bPrerelease.split(".");
|
|
41
|
+
const maxPreLen = Math.max(aPre.length, bPre.length);
|
|
42
|
+
for (let i = 0; i < maxPreLen; i++) {
|
|
43
|
+
const aP = aPre[i];
|
|
44
|
+
const bP = bPre[i];
|
|
45
|
+
// Missing part means shorter prerelease comes first
|
|
46
|
+
if (aP === undefined)
|
|
47
|
+
return -1;
|
|
48
|
+
if (bP === undefined)
|
|
49
|
+
return 1;
|
|
50
|
+
// Try numeric comparison first
|
|
51
|
+
const aNum = parseInt(aP, 10);
|
|
52
|
+
const bNum = parseInt(bP, 10);
|
|
53
|
+
const aIsNum = !isNaN(aNum) && String(aNum) === aP;
|
|
54
|
+
const bIsNum = !isNaN(bNum) && String(bNum) === bP;
|
|
55
|
+
// Numeric identifiers have lower precedence than string identifiers
|
|
56
|
+
if (aIsNum && !bIsNum)
|
|
57
|
+
return -1;
|
|
58
|
+
if (!aIsNum && bIsNum)
|
|
59
|
+
return 1;
|
|
60
|
+
if (aIsNum && bIsNum) {
|
|
61
|
+
if (aNum < bNum)
|
|
62
|
+
return -1;
|
|
63
|
+
if (aNum > bNum)
|
|
64
|
+
return 1;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// String comparison
|
|
68
|
+
if (aP < bP)
|
|
69
|
+
return -1;
|
|
70
|
+
if (aP > bP)
|
|
71
|
+
return 1;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=compare-versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-versions.js","sourceRoot":"","sources":["../../src/utils/compare-versions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type WriteMode = "ask" | "force" | "skip" | "append";
|
|
2
|
+
export interface WriteOptions {
|
|
3
|
+
mode: WriteMode;
|
|
4
|
+
}
|
|
5
|
+
export declare function setWriteMode(mode: WriteMode): void;
|
|
6
|
+
export declare function getWriteMode(): WriteMode;
|
|
7
|
+
/**
|
|
8
|
+
* Write file with conflict handling
|
|
9
|
+
* - If file doesn't exist: write directly
|
|
10
|
+
* - If file exists and content is identical: skip silently
|
|
11
|
+
* - If file exists and mode is 'force': overwrite
|
|
12
|
+
* - If file exists and mode is 'skip': skip
|
|
13
|
+
* - If file exists and mode is 'append': append to end
|
|
14
|
+
* - If file exists and mode is 'ask': prompt user
|
|
15
|
+
*/
|
|
16
|
+
export declare function writeFile(filePath: string, content: string, options?: {
|
|
17
|
+
executable?: boolean;
|
|
18
|
+
}): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Ensure directory exists
|
|
21
|
+
*/
|
|
22
|
+
export declare function ensureDir(dirPath: string): void;
|
|
23
|
+
//# sourceMappingURL=file-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-writer.d.ts","sourceRoot":"","sources":["../../src/utils/file-writer.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;CACjB;AASD,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAElD;AAED,wBAAgB,YAAY,IAAI,SAAS,CAExC;AA6BD;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,OAAO,CAAC,OAAO,CAAC,CAwGlB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import inquirer from "inquirer";
|
|
5
|
+
// Global write mode (set from CLI options)
|
|
6
|
+
let globalWriteMode = "ask";
|
|
7
|
+
export function setWriteMode(mode) {
|
|
8
|
+
globalWriteMode = mode;
|
|
9
|
+
}
|
|
10
|
+
export function getWriteMode() {
|
|
11
|
+
return globalWriteMode;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get relative path from cwd for display
|
|
15
|
+
*/
|
|
16
|
+
function getRelativePath(filePath) {
|
|
17
|
+
const cwd = process.cwd();
|
|
18
|
+
const relativePath = path.relative(cwd, filePath);
|
|
19
|
+
return relativePath || path.basename(filePath);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Append content to file
|
|
23
|
+
*/
|
|
24
|
+
function appendToFile(filePath, content, options) {
|
|
25
|
+
const existingContent = fs.readFileSync(filePath, "utf-8");
|
|
26
|
+
const newContent = existingContent.endsWith("\n")
|
|
27
|
+
? existingContent + content
|
|
28
|
+
: existingContent + "\n" + content;
|
|
29
|
+
fs.writeFileSync(filePath, newContent);
|
|
30
|
+
if (options?.executable) {
|
|
31
|
+
fs.chmodSync(filePath, "755");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Write file with conflict handling
|
|
36
|
+
* - If file doesn't exist: write directly
|
|
37
|
+
* - If file exists and content is identical: skip silently
|
|
38
|
+
* - If file exists and mode is 'force': overwrite
|
|
39
|
+
* - If file exists and mode is 'skip': skip
|
|
40
|
+
* - If file exists and mode is 'append': append to end
|
|
41
|
+
* - If file exists and mode is 'ask': prompt user
|
|
42
|
+
*/
|
|
43
|
+
export async function writeFile(filePath, content, options) {
|
|
44
|
+
const exists = fs.existsSync(filePath);
|
|
45
|
+
const displayPath = getRelativePath(filePath);
|
|
46
|
+
if (!exists) {
|
|
47
|
+
// File doesn't exist, write directly
|
|
48
|
+
fs.writeFileSync(filePath, content);
|
|
49
|
+
if (options?.executable) {
|
|
50
|
+
fs.chmodSync(filePath, "755");
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
// File exists, check if content is identical
|
|
55
|
+
const existingContent = fs.readFileSync(filePath, "utf-8");
|
|
56
|
+
if (existingContent === content) {
|
|
57
|
+
// Content identical, skip silently (no output)
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
// File exists with different content, handle based on mode
|
|
61
|
+
const mode = globalWriteMode;
|
|
62
|
+
if (mode === "force") {
|
|
63
|
+
fs.writeFileSync(filePath, content);
|
|
64
|
+
if (options?.executable) {
|
|
65
|
+
fs.chmodSync(filePath, "755");
|
|
66
|
+
}
|
|
67
|
+
console.log(chalk.yellow(` ↻ Overwritten: ${displayPath}`));
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
if (mode === "skip") {
|
|
71
|
+
console.log(chalk.gray(` ○ Skipped: ${displayPath} (already exists)`));
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
if (mode === "append") {
|
|
75
|
+
appendToFile(filePath, content, options);
|
|
76
|
+
console.log(chalk.blue(` + Appended: ${displayPath}`));
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
// mode === 'ask': Interactive prompt
|
|
80
|
+
const { action } = await inquirer.prompt([
|
|
81
|
+
{
|
|
82
|
+
type: "list",
|
|
83
|
+
name: "action",
|
|
84
|
+
message: `File "${displayPath}" already exists. What would you like to do?`,
|
|
85
|
+
choices: [
|
|
86
|
+
{ name: "Skip (keep existing)", value: "skip" },
|
|
87
|
+
{ name: "Overwrite", value: "overwrite" },
|
|
88
|
+
{ name: "Append to end", value: "append" },
|
|
89
|
+
{ name: "Skip all remaining conflicts", value: "skip-all" },
|
|
90
|
+
{ name: "Overwrite all remaining conflicts", value: "overwrite-all" },
|
|
91
|
+
{ name: "Append all remaining conflicts", value: "append-all" },
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
]);
|
|
95
|
+
if (action === "skip") {
|
|
96
|
+
console.log(chalk.gray(` ○ Skipped: ${displayPath}`));
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (action === "overwrite") {
|
|
100
|
+
fs.writeFileSync(filePath, content);
|
|
101
|
+
if (options?.executable) {
|
|
102
|
+
fs.chmodSync(filePath, "755");
|
|
103
|
+
}
|
|
104
|
+
console.log(chalk.yellow(` ↻ Overwritten: ${displayPath}`));
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
if (action === "append") {
|
|
108
|
+
appendToFile(filePath, content, options);
|
|
109
|
+
console.log(chalk.blue(` + Appended: ${displayPath}`));
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
if (action === "skip-all") {
|
|
113
|
+
globalWriteMode = "skip";
|
|
114
|
+
console.log(chalk.gray(` ○ Skipped: ${displayPath}`));
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
if (action === "overwrite-all") {
|
|
118
|
+
globalWriteMode = "force";
|
|
119
|
+
fs.writeFileSync(filePath, content);
|
|
120
|
+
if (options?.executable) {
|
|
121
|
+
fs.chmodSync(filePath, "755");
|
|
122
|
+
}
|
|
123
|
+
console.log(chalk.yellow(` ↻ Overwritten: ${displayPath}`));
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
if (action === "append-all") {
|
|
127
|
+
globalWriteMode = "append";
|
|
128
|
+
appendToFile(filePath, content, options);
|
|
129
|
+
console.log(chalk.blue(` + Appended: ${displayPath}`));
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Ensure directory exists
|
|
136
|
+
*/
|
|
137
|
+
export function ensureDir(dirPath) {
|
|
138
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=file-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-writer.js","sourceRoot":"","sources":["../../src/utils/file-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project type detected by analyzing project files
|
|
3
|
+
*/
|
|
4
|
+
export type ProjectType = "frontend" | "backend" | "fullstack" | "story" | "unknown";
|
|
5
|
+
/**
|
|
6
|
+
* Detect project type by analyzing project files
|
|
7
|
+
*
|
|
8
|
+
* @param cwd - Current working directory to analyze
|
|
9
|
+
* @returns Detected project type
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectProjectType(cwd: string): ProjectType;
|
|
12
|
+
/**
|
|
13
|
+
* Get human-readable description of project type
|
|
14
|
+
*/
|
|
15
|
+
export declare function getProjectTypeDescription(type: ProjectType): string;
|
|
16
|
+
//# sourceMappingURL=project-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detector.d.ts","sourceRoot":"","sources":["../../src/utils/project-detector.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAiKrF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAqB1D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAanE"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Files that indicate a frontend project
|
|
5
|
+
*/
|
|
6
|
+
const FRONTEND_INDICATORS = [
|
|
7
|
+
// Package managers with frontend deps
|
|
8
|
+
"package.json", // Will check for frontend dependencies
|
|
9
|
+
// Build tools
|
|
10
|
+
"vite.config.ts",
|
|
11
|
+
"vite.config.js",
|
|
12
|
+
"next.config.js",
|
|
13
|
+
"next.config.ts",
|
|
14
|
+
"next.config.mjs",
|
|
15
|
+
"nuxt.config.ts",
|
|
16
|
+
"nuxt.config.js",
|
|
17
|
+
"webpack.config.js",
|
|
18
|
+
"rollup.config.js",
|
|
19
|
+
// Framework configs
|
|
20
|
+
"svelte.config.js",
|
|
21
|
+
"astro.config.mjs",
|
|
22
|
+
"angular.json",
|
|
23
|
+
"vue.config.js",
|
|
24
|
+
// Source directories
|
|
25
|
+
"src/App.tsx",
|
|
26
|
+
"src/App.jsx",
|
|
27
|
+
"src/App.vue",
|
|
28
|
+
"src/app/page.tsx",
|
|
29
|
+
"app/page.tsx",
|
|
30
|
+
"pages/index.tsx",
|
|
31
|
+
"pages/index.jsx",
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* Files that indicate a backend project
|
|
35
|
+
*/
|
|
36
|
+
const BACKEND_INDICATORS = [
|
|
37
|
+
// Go
|
|
38
|
+
"go.mod",
|
|
39
|
+
"go.sum",
|
|
40
|
+
// Rust
|
|
41
|
+
"Cargo.toml",
|
|
42
|
+
"Cargo.lock",
|
|
43
|
+
// Python
|
|
44
|
+
"requirements.txt",
|
|
45
|
+
"pyproject.toml",
|
|
46
|
+
"setup.py",
|
|
47
|
+
"Pipfile",
|
|
48
|
+
"poetry.lock",
|
|
49
|
+
// Java/Kotlin
|
|
50
|
+
"pom.xml",
|
|
51
|
+
"build.gradle",
|
|
52
|
+
"build.gradle.kts",
|
|
53
|
+
// Ruby
|
|
54
|
+
"Gemfile",
|
|
55
|
+
// PHP
|
|
56
|
+
"composer.json",
|
|
57
|
+
// .NET
|
|
58
|
+
"*.csproj",
|
|
59
|
+
"*.fsproj",
|
|
60
|
+
// Elixir
|
|
61
|
+
"mix.exs",
|
|
62
|
+
// Node.js backend indicators
|
|
63
|
+
"server.ts",
|
|
64
|
+
"server.js",
|
|
65
|
+
"src/server.ts",
|
|
66
|
+
"src/index.ts", // Could be backend entry
|
|
67
|
+
];
|
|
68
|
+
/**
|
|
69
|
+
* Frontend dependencies in package.json
|
|
70
|
+
*/
|
|
71
|
+
const FRONTEND_DEPS = [
|
|
72
|
+
"react",
|
|
73
|
+
"vue",
|
|
74
|
+
"svelte",
|
|
75
|
+
"angular",
|
|
76
|
+
"@angular/core",
|
|
77
|
+
"next",
|
|
78
|
+
"nuxt",
|
|
79
|
+
"astro",
|
|
80
|
+
"solid-js",
|
|
81
|
+
"preact",
|
|
82
|
+
"lit",
|
|
83
|
+
"@remix-run/react",
|
|
84
|
+
];
|
|
85
|
+
/**
|
|
86
|
+
* Backend dependencies in package.json
|
|
87
|
+
*/
|
|
88
|
+
const BACKEND_DEPS = [
|
|
89
|
+
"express",
|
|
90
|
+
"fastify",
|
|
91
|
+
"hono",
|
|
92
|
+
"koa",
|
|
93
|
+
"hapi",
|
|
94
|
+
"nest",
|
|
95
|
+
"@nestjs/core",
|
|
96
|
+
"fastapi",
|
|
97
|
+
"flask",
|
|
98
|
+
"django",
|
|
99
|
+
];
|
|
100
|
+
/**
|
|
101
|
+
* Check if a file exists in the project directory
|
|
102
|
+
*/
|
|
103
|
+
function fileExists(cwd, filename) {
|
|
104
|
+
// Handle glob patterns like *.csproj
|
|
105
|
+
if (filename.includes("*")) {
|
|
106
|
+
const dir = path.dirname(filename) || ".";
|
|
107
|
+
const pattern = path.basename(filename);
|
|
108
|
+
const searchDir = path.join(cwd, dir);
|
|
109
|
+
if (!fs.existsSync(searchDir))
|
|
110
|
+
return false;
|
|
111
|
+
try {
|
|
112
|
+
const files = fs.readdirSync(searchDir);
|
|
113
|
+
const regex = new RegExp("^" + pattern.replace(/\*/g, ".*").replace(/\./g, "\\.") + "$");
|
|
114
|
+
return files.some((f) => regex.test(f));
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return fs.existsSync(path.join(cwd, filename));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check package.json for frontend/backend dependencies
|
|
124
|
+
*/
|
|
125
|
+
function checkPackageJson(cwd) {
|
|
126
|
+
const packageJsonPath = path.join(cwd, "package.json");
|
|
127
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
128
|
+
return { hasFrontend: false, hasBackend: false };
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const content = fs.readFileSync(packageJsonPath, "utf-8");
|
|
132
|
+
const pkg = JSON.parse(content);
|
|
133
|
+
const allDeps = {
|
|
134
|
+
...pkg.dependencies,
|
|
135
|
+
...pkg.devDependencies,
|
|
136
|
+
};
|
|
137
|
+
const depNames = Object.keys(allDeps ?? {});
|
|
138
|
+
const hasFrontend = FRONTEND_DEPS.some((dep) => depNames.includes(dep));
|
|
139
|
+
const hasBackend = BACKEND_DEPS.some((dep) => depNames.includes(dep));
|
|
140
|
+
return { hasFrontend, hasBackend };
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return { hasFrontend: false, hasBackend: false };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Detect project type by analyzing project files
|
|
148
|
+
*
|
|
149
|
+
* @param cwd - Current working directory to analyze
|
|
150
|
+
* @returns Detected project type
|
|
151
|
+
*/
|
|
152
|
+
export function detectProjectType(cwd) {
|
|
153
|
+
// Check for file indicators
|
|
154
|
+
const hasFrontendFiles = FRONTEND_INDICATORS.some((f) => fileExists(cwd, f));
|
|
155
|
+
const hasBackendFiles = BACKEND_INDICATORS.some((f) => fileExists(cwd, f));
|
|
156
|
+
// Check package.json dependencies
|
|
157
|
+
const { hasFrontend: hasFrontendDeps, hasBackend: hasBackendDeps } = checkPackageJson(cwd);
|
|
158
|
+
const isFrontend = hasFrontendFiles || hasFrontendDeps;
|
|
159
|
+
const isBackend = hasBackendFiles || hasBackendDeps;
|
|
160
|
+
if (isFrontend && isBackend) {
|
|
161
|
+
return "fullstack";
|
|
162
|
+
}
|
|
163
|
+
else if (isFrontend) {
|
|
164
|
+
return "frontend";
|
|
165
|
+
}
|
|
166
|
+
else if (isBackend) {
|
|
167
|
+
return "backend";
|
|
168
|
+
}
|
|
169
|
+
return "unknown";
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get human-readable description of project type
|
|
173
|
+
*/
|
|
174
|
+
export function getProjectTypeDescription(type) {
|
|
175
|
+
switch (type) {
|
|
176
|
+
case "frontend":
|
|
177
|
+
return "Frontend project (UI/client-side)";
|
|
178
|
+
case "backend":
|
|
179
|
+
return "Backend project (server-side/API)";
|
|
180
|
+
case "fullstack":
|
|
181
|
+
return "Fullstack project (frontend + backend)";
|
|
182
|
+
case "story":
|
|
183
|
+
return "Story project (Comic/Novel creation)";
|
|
184
|
+
case "unknown":
|
|
185
|
+
return "Unknown project type (defaults to fullstack)";
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=project-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../src/utils/project-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote template fetcher for AIM Studio CLI
|
|
3
|
+
*
|
|
4
|
+
* Fetches spec templates from the official docs repository:
|
|
5
|
+
* https://github.com/mindfold-ai/docs/tree/main/marketplace
|
|
6
|
+
*/
|
|
7
|
+
export interface SpecTemplate {
|
|
8
|
+
id: string;
|
|
9
|
+
type: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
path: string;
|
|
13
|
+
tags?: string[];
|
|
14
|
+
}
|
|
15
|
+
export type TemplateStrategy = "skip" | "overwrite" | "append";
|
|
16
|
+
/**
|
|
17
|
+
* Fetch available templates from the remote index
|
|
18
|
+
* Returns empty array on network error (allows fallback to blank)
|
|
19
|
+
*/
|
|
20
|
+
export declare function fetchTemplateIndex(): Promise<SpecTemplate[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Find a template by ID from the index
|
|
23
|
+
*/
|
|
24
|
+
export declare function findTemplate(templateId: string): Promise<SpecTemplate | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Get the installation path for a template type
|
|
27
|
+
*/
|
|
28
|
+
export declare function getInstallPath(cwd: string, templateType: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Download a template with the specified strategy
|
|
31
|
+
*
|
|
32
|
+
* @param templatePath - Path in the docs repo (e.g., "marketplace/specs/electron-fullstack")
|
|
33
|
+
* @param destDir - Destination directory
|
|
34
|
+
* @param strategy - How to handle existing directory: skip, overwrite, or append
|
|
35
|
+
* @returns true if template was downloaded, false if skipped
|
|
36
|
+
*/
|
|
37
|
+
export declare function downloadWithStrategy(templatePath: string, destDir: string, strategy: TemplateStrategy): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Download a template by ID
|
|
40
|
+
*
|
|
41
|
+
* @param cwd - Current working directory
|
|
42
|
+
* @param templateId - Template ID from the index
|
|
43
|
+
* @param strategy - How to handle existing directory
|
|
44
|
+
* @returns Object with success status and message
|
|
45
|
+
*/
|
|
46
|
+
export declare function downloadTemplateById(cwd: string, templateId: string, strategy: TemplateStrategy): Promise<{
|
|
47
|
+
success: boolean;
|
|
48
|
+
message: string;
|
|
49
|
+
skipped?: boolean;
|
|
50
|
+
}>;
|
|
51
|
+
//# sourceMappingURL=template-fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-fetcher.d.ts","sourceRoot":"","sources":["../../src/utils/template-fetcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4BH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAOD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAM/D;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAYlE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAG9B;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,OAAO,CAAC,CAmClB;AA2BD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CA6CnE"}
|