@soleri/cli 1.9.0 → 1.10.0

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.
Files changed (93) hide show
  1. package/README.md +4 -0
  2. package/dist/commands/agent.d.ts +8 -0
  3. package/dist/commands/agent.js +150 -0
  4. package/dist/commands/agent.js.map +1 -0
  5. package/dist/commands/create.js +30 -4
  6. package/dist/commands/create.js.map +1 -1
  7. package/dist/commands/install-knowledge.js +65 -3
  8. package/dist/commands/install-knowledge.js.map +1 -1
  9. package/dist/commands/install.d.ts +2 -0
  10. package/dist/commands/install.js +80 -0
  11. package/dist/commands/install.js.map +1 -0
  12. package/dist/commands/pack.d.ts +10 -0
  13. package/dist/commands/pack.js +512 -0
  14. package/dist/commands/pack.js.map +1 -0
  15. package/dist/commands/skills.d.ts +8 -0
  16. package/dist/commands/skills.js +167 -0
  17. package/dist/commands/skills.js.map +1 -0
  18. package/dist/commands/uninstall.d.ts +2 -0
  19. package/dist/commands/uninstall.js +74 -0
  20. package/dist/commands/uninstall.js.map +1 -0
  21. package/dist/hook-packs/installer.d.ts +0 -7
  22. package/dist/hook-packs/installer.js +1 -14
  23. package/dist/hook-packs/installer.js.map +1 -1
  24. package/dist/hook-packs/installer.ts +1 -18
  25. package/dist/hook-packs/registry.d.ts +2 -1
  26. package/dist/hook-packs/registry.ts +1 -1
  27. package/dist/main.js +40 -1
  28. package/dist/main.js.map +1 -1
  29. package/dist/prompts/archetypes.d.ts +1 -0
  30. package/dist/prompts/archetypes.js +177 -62
  31. package/dist/prompts/archetypes.js.map +1 -1
  32. package/dist/prompts/create-wizard.js +98 -49
  33. package/dist/prompts/create-wizard.js.map +1 -1
  34. package/dist/prompts/playbook.d.ts +8 -7
  35. package/dist/prompts/playbook.js +201 -15
  36. package/dist/prompts/playbook.js.map +1 -1
  37. package/dist/utils/checks.d.ts +0 -1
  38. package/dist/utils/checks.js +1 -1
  39. package/dist/utils/checks.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/__tests__/archetypes.test.ts +84 -0
  42. package/src/__tests__/doctor.test.ts +2 -2
  43. package/src/__tests__/wizard-e2e.mjs +508 -0
  44. package/src/commands/agent.ts +181 -0
  45. package/src/commands/create.ts +146 -104
  46. package/src/commands/install-knowledge.ts +75 -4
  47. package/src/commands/install.ts +101 -0
  48. package/src/commands/pack.ts +585 -0
  49. package/src/commands/skills.ts +191 -0
  50. package/src/commands/uninstall.ts +93 -0
  51. package/src/hook-packs/installer.ts +1 -18
  52. package/src/hook-packs/registry.ts +1 -1
  53. package/src/main.ts +42 -1
  54. package/src/prompts/archetypes.ts +193 -62
  55. package/src/prompts/create-wizard.ts +114 -58
  56. package/src/prompts/playbook.ts +207 -21
  57. package/src/utils/checks.ts +1 -1
  58. package/code-reviewer/.claude/hookify.focus-ring-required.local.md +0 -21
  59. package/code-reviewer/.claude/hookify.no-ai-attribution.local.md +0 -18
  60. package/code-reviewer/.claude/hookify.no-any-types.local.md +0 -18
  61. package/code-reviewer/.claude/hookify.no-console-log.local.md +0 -21
  62. package/code-reviewer/.claude/hookify.no-important.local.md +0 -18
  63. package/code-reviewer/.claude/hookify.no-inline-styles.local.md +0 -21
  64. package/code-reviewer/.claude/hookify.semantic-html.local.md +0 -18
  65. package/code-reviewer/.claude/hookify.ux-touch-targets.local.md +0 -18
  66. package/code-reviewer/.mcp.json +0 -11
  67. package/code-reviewer/README.md +0 -346
  68. package/code-reviewer/package-lock.json +0 -4484
  69. package/code-reviewer/package.json +0 -45
  70. package/code-reviewer/scripts/copy-assets.js +0 -15
  71. package/code-reviewer/scripts/setup.sh +0 -130
  72. package/code-reviewer/skills/brainstorming/SKILL.md +0 -170
  73. package/code-reviewer/skills/code-patrol/SKILL.md +0 -176
  74. package/code-reviewer/skills/context-resume/SKILL.md +0 -143
  75. package/code-reviewer/skills/executing-plans/SKILL.md +0 -201
  76. package/code-reviewer/skills/fix-and-learn/SKILL.md +0 -164
  77. package/code-reviewer/skills/health-check/SKILL.md +0 -225
  78. package/code-reviewer/skills/second-opinion/SKILL.md +0 -142
  79. package/code-reviewer/skills/systematic-debugging/SKILL.md +0 -230
  80. package/code-reviewer/skills/verification-before-completion/SKILL.md +0 -170
  81. package/code-reviewer/skills/writing-plans/SKILL.md +0 -207
  82. package/code-reviewer/src/__tests__/facades.test.ts +0 -598
  83. package/code-reviewer/src/activation/activate.ts +0 -125
  84. package/code-reviewer/src/activation/claude-md-content.ts +0 -217
  85. package/code-reviewer/src/activation/inject-claude-md.ts +0 -113
  86. package/code-reviewer/src/extensions/index.ts +0 -47
  87. package/code-reviewer/src/extensions/ops/example.ts +0 -28
  88. package/code-reviewer/src/identity/persona.ts +0 -62
  89. package/code-reviewer/src/index.ts +0 -278
  90. package/code-reviewer/src/intelligence/data/architecture.json +0 -5
  91. package/code-reviewer/src/intelligence/data/code-review.json +0 -5
  92. package/code-reviewer/tsconfig.json +0 -30
  93. package/code-reviewer/vitest.config.ts +0 -23
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Skills CLI — convenience aliases for `soleri pack --type skills`.
3
+ *
4
+ * Provides `soleri skills list|install|remove|info` as thin wrappers
5
+ * around the unified pack system.
6
+ */
7
+ import { join } from 'node:path';
8
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
9
+ import * as p from '@clack/prompts';
10
+ import { PackLockfile, inferPackType, resolvePack } from '@soleri/core';
11
+ import { detectAgent } from '../utils/agent-context.js';
12
+ const LOCKFILE_NAME = 'soleri.lock';
13
+ function getLockfilePath() {
14
+ const ctx = detectAgent();
15
+ if (!ctx) {
16
+ p.log.error('No agent project detected in current directory.');
17
+ process.exit(1);
18
+ }
19
+ return join(ctx.agentPath, LOCKFILE_NAME);
20
+ }
21
+ export function registerSkills(program) {
22
+ const skills = program
23
+ .command('skills')
24
+ .description('Manage skill packs (alias for pack --type skills)');
25
+ // ─── list ──────────────────────────────────────────────────
26
+ skills
27
+ .command('list')
28
+ .description('List installed skill packs')
29
+ .action(() => {
30
+ const lockfile = new PackLockfile(getLockfilePath());
31
+ const entries = lockfile.list().filter((e) => e.type === 'skills' || e.type === 'bundle');
32
+ if (entries.length === 0) {
33
+ p.log.info('No skill packs installed.');
34
+ return;
35
+ }
36
+ p.log.info(`${entries.length} skill pack(s) installed:\n`);
37
+ for (const entry of entries) {
38
+ const badge = entry.source === 'built-in' ? ' [built-in]' : entry.source === 'npm' ? ' [npm]' : '';
39
+ console.log(` ${entry.id}@${entry.version}${badge}`);
40
+ if (entry.skills.length > 0)
41
+ console.log(` skills: ${entry.skills.join(', ')}`);
42
+ }
43
+ });
44
+ // ─── install ───────────────────────────────────────────────
45
+ skills
46
+ .command('install')
47
+ .argument('<pack>', 'Skill pack name, path, or npm package')
48
+ .option('--version <ver>', 'Specific version to install')
49
+ .description('Install a skill pack')
50
+ .action(async (packName, opts) => {
51
+ const lockfilePath = getLockfilePath();
52
+ const lockfile = new PackLockfile(lockfilePath);
53
+ const ctx = detectAgent();
54
+ if (!ctx)
55
+ return;
56
+ if (lockfile.has(packName)) {
57
+ p.log.warn(`Pack "${packName}" is already installed.`);
58
+ return;
59
+ }
60
+ const s = p.spinner();
61
+ s.start(`Resolving skill pack: ${packName}...`);
62
+ try {
63
+ const resolved = resolvePack(packName, {
64
+ builtinDirs: getBuiltinDirs(ctx.agentPath),
65
+ version: opts.version,
66
+ });
67
+ const manifestPath = join(resolved.directory, 'soleri-pack.json');
68
+ if (!existsSync(manifestPath)) {
69
+ s.stop('Install failed');
70
+ p.log.error(`No soleri-pack.json found in ${resolved.directory}`);
71
+ process.exit(1);
72
+ return;
73
+ }
74
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
75
+ const packType = inferPackType(manifest);
76
+ if (packType !== 'skills' && packType !== 'bundle') {
77
+ s.stop('Install failed');
78
+ p.log.error(`Pack "${packName}" is type "${packType}", not a skill pack.`);
79
+ process.exit(1);
80
+ return;
81
+ }
82
+ const skillsDir = join(resolved.directory, manifest.skills?.dir ?? 'skills');
83
+ const skillsList = existsSync(skillsDir) ? listMdFiles(skillsDir) : [];
84
+ const entry = {
85
+ id: manifest.id,
86
+ version: manifest.version,
87
+ type: packType,
88
+ source: resolved.source,
89
+ directory: resolved.directory,
90
+ integrity: PackLockfile.computeIntegrity(manifestPath),
91
+ installedAt: new Date().toISOString(),
92
+ vaultEntries: 0,
93
+ skills: skillsList,
94
+ hooks: [],
95
+ facadesRegistered: false,
96
+ };
97
+ lockfile.set(entry);
98
+ lockfile.save();
99
+ s.stop(`Installed ${manifest.id}@${manifest.version}`);
100
+ if (skillsList.length > 0) {
101
+ p.log.info(` Skills: ${skillsList.join(', ')}`);
102
+ }
103
+ }
104
+ catch (err) {
105
+ s.stop('Install failed');
106
+ p.log.error(err instanceof Error ? err.message : String(err));
107
+ process.exit(1);
108
+ }
109
+ });
110
+ // ─── remove ────────────────────────────────────────────────
111
+ skills
112
+ .command('remove')
113
+ .argument('<packId>', 'Skill pack ID to remove')
114
+ .description('Remove a skill pack')
115
+ .action((packId) => {
116
+ const lockfile = new PackLockfile(getLockfilePath());
117
+ if (!lockfile.has(packId)) {
118
+ p.log.error(`Skill pack "${packId}" is not installed.`);
119
+ process.exit(1);
120
+ }
121
+ lockfile.remove(packId);
122
+ lockfile.save();
123
+ p.log.success(`Removed ${packId}`);
124
+ });
125
+ // ─── info ──────────────────────────────────────────────────
126
+ skills
127
+ .command('info')
128
+ .argument('<packId>', 'Skill pack ID')
129
+ .description('Show info about a skill pack')
130
+ .action((packId) => {
131
+ const lockfile = new PackLockfile(getLockfilePath());
132
+ const entry = lockfile.get(packId);
133
+ if (!entry) {
134
+ p.log.error(`Skill pack "${packId}" is not installed.`);
135
+ process.exit(1);
136
+ return;
137
+ }
138
+ console.log(`\n Pack: ${entry.id}`);
139
+ console.log(` Version: ${entry.version}`);
140
+ console.log(` Source: ${entry.source}`);
141
+ console.log(` Installed: ${entry.installedAt}`);
142
+ if (entry.skills.length > 0)
143
+ console.log(` Skills: ${entry.skills.join(', ')}`);
144
+ console.log('');
145
+ });
146
+ }
147
+ // ─── Helpers ──────────────────────────────────────────────────────────
148
+ function getBuiltinDirs(agentPath) {
149
+ const dirs = [];
150
+ const nmPacks = join(agentPath, 'node_modules', '@soleri');
151
+ if (existsSync(nmPacks)) {
152
+ dirs.push(nmPacks);
153
+ }
154
+ return dirs;
155
+ }
156
+ function listMdFiles(dir) {
157
+ try {
158
+ const { basename } = require('node:path');
159
+ return readdirSync(dir)
160
+ .filter((f) => f.endsWith('.md'))
161
+ .map((f) => basename(f, '.md'));
162
+ }
163
+ catch {
164
+ return [];
165
+ }
166
+ }
167
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerUninstall(program: Command): void;
@@ -0,0 +1,74 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import * as p from '@clack/prompts';
5
+ import { detectAgent } from '../utils/agent-context.js';
6
+ function uninstallClaude(agentId) {
7
+ const configPath = join(homedir(), '.claude.json');
8
+ if (!existsSync(configPath)) {
9
+ p.log.warn(`~/.claude.json not found — nothing to remove.`);
10
+ return;
11
+ }
12
+ let config;
13
+ try {
14
+ config = JSON.parse(readFileSync(configPath, 'utf-8'));
15
+ }
16
+ catch {
17
+ p.log.error(`Failed to parse ${configPath}.`);
18
+ process.exit(1);
19
+ }
20
+ const servers = config.mcpServers;
21
+ if (!servers || !(agentId in servers)) {
22
+ p.log.warn(`${agentId} not found in ~/.claude.json — nothing to remove.`);
23
+ return;
24
+ }
25
+ delete servers[agentId];
26
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
27
+ p.log.success(`Removed ${agentId} from ~/.claude.json`);
28
+ }
29
+ function uninstallCodex(agentId) {
30
+ const configPath = join(homedir(), '.codex', 'config.toml');
31
+ if (!existsSync(configPath)) {
32
+ p.log.warn(`~/.codex/config.toml not found — nothing to remove.`);
33
+ return;
34
+ }
35
+ let content = readFileSync(configPath, 'utf-8');
36
+ const sectionRegex = new RegExp(`\\[mcp_servers\\.${escapeRegExp(agentId)}\\][^\\[]*`, 's');
37
+ if (!sectionRegex.test(content)) {
38
+ p.log.warn(`${agentId} not found in ~/.codex/config.toml — nothing to remove.`);
39
+ return;
40
+ }
41
+ content = content.replace(sectionRegex, '').trim();
42
+ writeFileSync(configPath, content + '\n', 'utf-8');
43
+ p.log.success(`Removed ${agentId} from ~/.codex/config.toml`);
44
+ }
45
+ function escapeRegExp(s) {
46
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
47
+ }
48
+ export function registerUninstall(program) {
49
+ program
50
+ .command('uninstall')
51
+ .argument('[dir]', 'Agent directory (defaults to cwd)')
52
+ .option('--target <target>', 'Registration target: claude, codex, or both', 'claude')
53
+ .description('Remove agent MCP server entry from editor config')
54
+ .action(async (dir, opts) => {
55
+ const resolvedDir = dir ? resolve(dir) : undefined;
56
+ const ctx = detectAgent(resolvedDir);
57
+ if (!ctx) {
58
+ p.log.error('Not in an agent project. Run from an agent directory or pass its path.');
59
+ process.exit(1);
60
+ }
61
+ const target = (opts?.target ?? 'claude');
62
+ if (target !== 'claude' && target !== 'codex' && target !== 'both') {
63
+ p.log.error(`Invalid target "${target}". Use: claude, codex, or both`);
64
+ process.exit(1);
65
+ }
66
+ if (target === 'claude' || target === 'both') {
67
+ uninstallClaude(ctx.agentId);
68
+ }
69
+ if (target === 'codex' || target === 'both') {
70
+ uninstallCodex(ctx.agentId);
71
+ }
72
+ });
73
+ }
74
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
@@ -23,10 +23,3 @@ export declare function removePack(packName: string, options?: {
23
23
  export declare function isPackInstalled(packName: string, options?: {
24
24
  projectDir?: string;
25
25
  }): boolean | 'partial';
26
- /**
27
- * Get the installed version of a hook from its file header.
28
- * Returns null if no version found or file doesn't exist.
29
- */
30
- export declare function getInstalledHookVersion(hook: string, options?: {
31
- projectDir?: string;
32
- }): string | null;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Hook pack installer — copies hookify files to ~/.claude/ (global) or project .claude/ (local).
3
3
  */
4
- import { existsSync, copyFileSync, unlinkSync, mkdirSync, readFileSync } from 'node:fs';
4
+ import { existsSync, copyFileSync, unlinkSync, mkdirSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
6
  import { homedir } from 'node:os';
7
7
  import { getPack } from './registry.js';
@@ -106,17 +106,4 @@ export function isPackInstalled(packName, options) {
106
106
  return true;
107
107
  return 'partial';
108
108
  }
109
- /**
110
- * Get the installed version of a hook from its file header.
111
- * Returns null if no version found or file doesn't exist.
112
- */
113
- export function getInstalledHookVersion(hook, options) {
114
- const claudeDir = resolveClaudeDir(options?.projectDir);
115
- const filePath = join(claudeDir, `hookify.${hook}.local.md`);
116
- if (!existsSync(filePath))
117
- return null;
118
- const content = readFileSync(filePath, 'utf-8');
119
- const match = content.match(/^# Version: (.+)$/m);
120
- return match ? match[1] : null;
121
- }
122
109
  //# sourceMappingURL=installer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/hook-packs/installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/hook-packs/installer.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Hook pack installer — copies hookify files to ~/.claude/ (global) or project .claude/ (local).
3
3
  */
4
- import { existsSync, copyFileSync, unlinkSync, mkdirSync, readFileSync } from 'node:fs';
4
+ import { existsSync, copyFileSync, unlinkSync, mkdirSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
6
  import { homedir } from 'node:os';
7
7
  import { getPack } from './registry.js';
@@ -126,20 +126,3 @@ export function isPackInstalled(
126
126
  if (present === pack.manifest.hooks.length) return true;
127
127
  return 'partial';
128
128
  }
129
-
130
- /**
131
- * Get the installed version of a hook from its file header.
132
- * Returns null if no version found or file doesn't exist.
133
- */
134
- export function getInstalledHookVersion(
135
- hook: string,
136
- options?: { projectDir?: string },
137
- ): string | null {
138
- const claudeDir = resolveClaudeDir(options?.projectDir);
139
- const filePath = join(claudeDir, `hookify.${hook}.local.md`);
140
- if (!existsSync(filePath)) return null;
141
-
142
- const content = readFileSync(filePath, 'utf-8');
143
- const match = content.match(/^# Version: (.+)$/m);
144
- return match ? match[1] : null;
145
- }
@@ -1,4 +1,4 @@
1
- export interface HookPackManifest {
1
+ interface HookPackManifest {
2
2
  name: string;
3
3
  description: string;
4
4
  hooks: string[];
@@ -23,3 +23,4 @@ export declare function getPack(name: string): {
23
23
  * Get names of packs that are fully installed in ~/.claude/.
24
24
  */
25
25
  export declare function getInstalledPacks(): string[];
26
+ export {};
@@ -6,7 +6,7 @@ import { join, dirname } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
  import { homedir } from 'node:os';
8
8
 
9
- export interface HookPackManifest {
9
+ interface HookPackManifest {
10
10
  name: string;
11
11
  description: string;
12
12
  hooks: string[];
package/dist/main.js CHANGED
@@ -12,13 +12,47 @@ import { registerGovernance } from './commands/governance.js';
12
12
  import { registerTest } from './commands/test.js';
13
13
  import { registerUpgrade } from './commands/upgrade.js';
14
14
  import { registerExtend } from './commands/extend.js';
15
+ import { registerInstall } from './commands/install.js';
16
+ import { registerUninstall } from './commands/uninstall.js';
17
+ import { registerPack } from './commands/pack.js';
18
+ import { registerSkills } from './commands/skills.js';
19
+ import { registerAgent } from './commands/agent.js';
15
20
  const require = createRequire(import.meta.url);
16
21
  const { version } = require('../package.json');
22
+ const RESET = '\x1b[0m';
23
+ const BOLD = '\x1b[1m';
24
+ const DIM = '\x1b[2m';
25
+ const CYAN = '\x1b[36m';
26
+ const GREEN = '\x1b[32m';
27
+ const YELLOW = '\x1b[33m';
28
+ function showWelcome() {
29
+ console.log();
30
+ console.log(` ${BOLD}${CYAN}soleri${RESET} ${DIM}v${version}${RESET}`);
31
+ console.log(` ${DIM}The agent forge${RESET}`);
32
+ console.log();
33
+ console.log(` ${GREEN}Get started${RESET}`);
34
+ console.log(` ${BOLD}soleri create${RESET} Scaffold a new agent`);
35
+ console.log(` ${BOLD}soleri doctor${RESET} Check system health`);
36
+ console.log();
37
+ console.log(` ${YELLOW}Working on an agent${RESET}`);
38
+ console.log(` ${BOLD}soleri dev${RESET} Run in development mode`);
39
+ console.log(` ${BOLD}soleri test${RESET} Run agent tests`);
40
+ console.log(` ${BOLD}soleri add-domain${RESET} Add a knowledge domain`);
41
+ console.log(` ${BOLD}soleri hooks${RESET} Manage editor hooks`);
42
+ console.log(` ${BOLD}soleri install${RESET} Register agent as MCP server`);
43
+ console.log(` ${BOLD}soleri uninstall${RESET} Remove agent MCP server entry`);
44
+ console.log();
45
+ console.log(` ${DIM}Run ${BOLD}soleri --help${RESET}${DIM} for all commands${RESET}`);
46
+ console.log();
47
+ }
17
48
  const program = new Command();
18
49
  program
19
50
  .name('soleri')
20
51
  .description('Developer CLI for creating and managing Soleri AI agents')
21
- .version(version);
52
+ .version(version)
53
+ .action(() => {
54
+ showWelcome();
55
+ });
22
56
  registerCreate(program);
23
57
  registerList(program);
24
58
  registerAddDomain(program);
@@ -30,5 +64,10 @@ registerGovernance(program);
30
64
  registerTest(program);
31
65
  registerUpgrade(program);
32
66
  registerExtend(program);
67
+ registerInstall(program);
68
+ registerUninstall(program);
69
+ registerPack(program);
70
+ registerSkills(program);
71
+ registerAgent(program);
33
72
  program.parse();
34
73
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,cAAc,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ export interface Archetype {
8
8
  value: string;
9
9
  label: string;
10
10
  hint: string;
11
+ tier: 'free' | 'premium';
11
12
  defaults: {
12
13
  role: string;
13
14
  description: string;