sequant 1.0.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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +237 -0
  3. package/dist/bin/cli.d.ts +8 -0
  4. package/dist/bin/cli.d.ts.map +1 -0
  5. package/dist/bin/cli.js +70 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/src/commands/doctor.d.ts +8 -0
  8. package/dist/src/commands/doctor.d.ts.map +1 -0
  9. package/dist/src/commands/doctor.js +171 -0
  10. package/dist/src/commands/doctor.js.map +1 -0
  11. package/dist/src/commands/init.d.ts +11 -0
  12. package/dist/src/commands/init.d.ts.map +1 -0
  13. package/dist/src/commands/init.js +124 -0
  14. package/dist/src/commands/init.js.map +1 -0
  15. package/dist/src/commands/run.d.ts +18 -0
  16. package/dist/src/commands/run.d.ts.map +1 -0
  17. package/dist/src/commands/run.js +229 -0
  18. package/dist/src/commands/run.js.map +1 -0
  19. package/dist/src/commands/status.d.ts +5 -0
  20. package/dist/src/commands/status.d.ts.map +1 -0
  21. package/dist/src/commands/status.js +45 -0
  22. package/dist/src/commands/status.js.map +1 -0
  23. package/dist/src/commands/update.d.ts +10 -0
  24. package/dist/src/commands/update.d.ts.map +1 -0
  25. package/dist/src/commands/update.js +124 -0
  26. package/dist/src/commands/update.js.map +1 -0
  27. package/dist/src/index.d.ts +15 -0
  28. package/dist/src/index.d.ts.map +1 -0
  29. package/dist/src/index.js +13 -0
  30. package/dist/src/index.js.map +1 -0
  31. package/dist/src/lib/fs.d.ts +10 -0
  32. package/dist/src/lib/fs.d.ts.map +1 -0
  33. package/dist/src/lib/fs.js +44 -0
  34. package/dist/src/lib/fs.js.map +1 -0
  35. package/dist/src/lib/manifest.d.ts +14 -0
  36. package/dist/src/lib/manifest.d.ts.map +1 -0
  37. package/dist/src/lib/manifest.js +37 -0
  38. package/dist/src/lib/manifest.js.map +1 -0
  39. package/dist/src/lib/stacks.d.ts +22 -0
  40. package/dist/src/lib/stacks.d.ts.map +1 -0
  41. package/dist/src/lib/stacks.js +131 -0
  42. package/dist/src/lib/stacks.js.map +1 -0
  43. package/dist/src/lib/templates.d.ts +16 -0
  44. package/dist/src/lib/templates.d.ts.map +1 -0
  45. package/dist/src/lib/templates.js +118 -0
  46. package/dist/src/lib/templates.js.map +1 -0
  47. package/dist/src/lib/workflow/cli-args.d.ts +138 -0
  48. package/dist/src/lib/workflow/cli-args.d.ts.map +1 -0
  49. package/dist/src/lib/workflow/cli-args.js +210 -0
  50. package/dist/src/lib/workflow/cli-args.js.map +1 -0
  51. package/dist/src/lib/workflow/execute-issues.d.ts +42 -0
  52. package/dist/src/lib/workflow/execute-issues.d.ts.map +1 -0
  53. package/dist/src/lib/workflow/execute-issues.js +463 -0
  54. package/dist/src/lib/workflow/execute-issues.js.map +1 -0
  55. package/dist/src/lib/workflow/logger.d.ts +168 -0
  56. package/dist/src/lib/workflow/logger.d.ts.map +1 -0
  57. package/dist/src/lib/workflow/logger.js +249 -0
  58. package/dist/src/lib/workflow/logger.js.map +1 -0
  59. package/dist/src/lib/workflow/types.d.ts +89 -0
  60. package/dist/src/lib/workflow/types.d.ts.map +1 -0
  61. package/dist/src/lib/workflow/types.js +23 -0
  62. package/dist/src/lib/workflow/types.js.map +1 -0
  63. package/package.json +69 -0
  64. package/stacks/go.yaml +22 -0
  65. package/stacks/nextjs.yaml +28 -0
  66. package/stacks/python.yaml +24 -0
  67. package/stacks/rust.yaml +23 -0
  68. package/templates/hooks/post-tool.sh +301 -0
  69. package/templates/hooks/pre-tool.sh +350 -0
  70. package/templates/memory/constitution.md +60 -0
  71. package/templates/scripts/cleanup-worktree.sh +78 -0
  72. package/templates/scripts/list-worktrees.sh +50 -0
  73. package/templates/scripts/new-feature.sh +156 -0
  74. package/templates/settings.json +26 -0
  75. package/templates/skills/assess/SKILL.md +428 -0
  76. package/templates/skills/clean/SKILL.md +196 -0
  77. package/templates/skills/docs/SKILL.md +323 -0
  78. package/templates/skills/exec/SKILL.md +426 -0
  79. package/templates/skills/fullsolve/SKILL.md +479 -0
  80. package/templates/skills/loop/SKILL.md +310 -0
  81. package/templates/skills/qa/SKILL.md +261 -0
  82. package/templates/skills/qa/references/code-quality-exemplars.md +112 -0
  83. package/templates/skills/qa/references/code-review-checklist.md +77 -0
  84. package/templates/skills/qa/references/quality-gates.md +95 -0
  85. package/templates/skills/qa/references/testing-requirements.md +109 -0
  86. package/templates/skills/qa/scripts/quality-checks.sh +109 -0
  87. package/templates/skills/reflect/SKILL.md +159 -0
  88. package/templates/skills/reflect/references/documentation-tiers.md +70 -0
  89. package/templates/skills/reflect/references/phase-reflection.md +95 -0
  90. package/templates/skills/reflect/scripts/workflow-queries.ts +165 -0
  91. package/templates/skills/security-review/SKILL.md +344 -0
  92. package/templates/skills/security-review/references/security-checklists.md +377 -0
  93. package/templates/skills/solve/SKILL.md +242 -0
  94. package/templates/skills/spec/SKILL.md +169 -0
  95. package/templates/skills/spec/references/parallel-groups.md +72 -0
  96. package/templates/skills/spec/references/verification-criteria.md +104 -0
  97. package/templates/skills/test/SKILL.md +508 -0
  98. package/templates/skills/testgen/SKILL.md +561 -0
  99. package/templates/skills/verify/SKILL.md +266 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Manifest management for tracking installed version
3
+ */
4
+ import { readFile, writeFile, fileExists } from "./fs.js";
5
+ const MANIFEST_PATH = ".sequant-manifest.json";
6
+ const PACKAGE_VERSION = "0.1.0";
7
+ export async function getManifest() {
8
+ if (!(await fileExists(MANIFEST_PATH))) {
9
+ return null;
10
+ }
11
+ try {
12
+ const content = await readFile(MANIFEST_PATH);
13
+ return JSON.parse(content);
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ export async function createManifest(stack) {
20
+ const manifest = {
21
+ version: PACKAGE_VERSION,
22
+ stack,
23
+ installedAt: new Date().toISOString(),
24
+ files: {},
25
+ };
26
+ await writeFile(MANIFEST_PATH, JSON.stringify(manifest, null, 2));
27
+ }
28
+ export async function updateManifest() {
29
+ const manifest = await getManifest();
30
+ if (!manifest) {
31
+ return;
32
+ }
33
+ manifest.version = PACKAGE_VERSION;
34
+ manifest.updatedAt = new Date().toISOString();
35
+ await writeFile(MANIFEST_PATH, JSON.stringify(manifest, null, 2));
36
+ }
37
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/lib/manifest.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,MAAM,eAAe,GAAG,OAAO,CAAC;AAUhC,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,MAAM,QAAQ,GAAa;QACzB,OAAO,EAAE,eAAe;QACxB,KAAK;QACL,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,OAAO,GAAG,eAAe,CAAC;IACnC,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE9C,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Stack detection and configuration
3
+ */
4
+ export interface StackConfig {
5
+ name: string;
6
+ displayName: string;
7
+ detection: {
8
+ files?: string[];
9
+ packageDeps?: string[];
10
+ };
11
+ commands: {
12
+ test: string;
13
+ build: string;
14
+ lint: string;
15
+ dev?: string;
16
+ };
17
+ variables: Record<string, string>;
18
+ }
19
+ export declare const STACKS: Record<string, StackConfig>;
20
+ export declare function detectStack(): Promise<string | null>;
21
+ export declare function getStackConfig(stack: string): StackConfig;
22
+ //# sourceMappingURL=stacks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stacks.d.ts","sourceRoot":"","sources":["../../../src/lib/stacks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IACF,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAsF9C,CAAC;AAEF,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuC1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAEzD"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Stack detection and configuration
3
+ */
4
+ import { fileExists, readFile } from "./fs.js";
5
+ export const STACKS = {
6
+ nextjs: {
7
+ name: "nextjs",
8
+ displayName: "Next.js",
9
+ detection: {
10
+ files: ["next.config.js", "next.config.mjs", "next.config.ts"],
11
+ packageDeps: ["next"],
12
+ },
13
+ commands: {
14
+ test: "npm test",
15
+ build: "npm run build",
16
+ lint: "npm run lint",
17
+ dev: "npm run dev",
18
+ },
19
+ variables: {
20
+ TEST_COMMAND: "npm test",
21
+ BUILD_COMMAND: "npm run build",
22
+ LINT_COMMAND: "npm run lint",
23
+ },
24
+ },
25
+ rust: {
26
+ name: "rust",
27
+ displayName: "Rust",
28
+ detection: {
29
+ files: ["Cargo.toml"],
30
+ },
31
+ commands: {
32
+ test: "cargo test",
33
+ build: "cargo build --release",
34
+ lint: "cargo clippy",
35
+ },
36
+ variables: {
37
+ TEST_COMMAND: "cargo test",
38
+ BUILD_COMMAND: "cargo build --release",
39
+ LINT_COMMAND: "cargo clippy",
40
+ },
41
+ },
42
+ python: {
43
+ name: "python",
44
+ displayName: "Python",
45
+ detection: {
46
+ files: ["pyproject.toml", "setup.py", "requirements.txt"],
47
+ },
48
+ commands: {
49
+ test: "pytest",
50
+ build: "python -m build",
51
+ lint: "ruff check .",
52
+ },
53
+ variables: {
54
+ TEST_COMMAND: "pytest",
55
+ BUILD_COMMAND: "python -m build",
56
+ LINT_COMMAND: "ruff check .",
57
+ },
58
+ },
59
+ go: {
60
+ name: "go",
61
+ displayName: "Go",
62
+ detection: {
63
+ files: ["go.mod"],
64
+ },
65
+ commands: {
66
+ test: "go test ./...",
67
+ build: "go build ./...",
68
+ lint: "golangci-lint run",
69
+ },
70
+ variables: {
71
+ TEST_COMMAND: "go test ./...",
72
+ BUILD_COMMAND: "go build ./...",
73
+ LINT_COMMAND: "golangci-lint run",
74
+ },
75
+ },
76
+ generic: {
77
+ name: "generic",
78
+ displayName: "Generic",
79
+ detection: {},
80
+ commands: {
81
+ test: "echo 'No test command configured'",
82
+ build: "echo 'No build command configured'",
83
+ lint: "echo 'No lint command configured'",
84
+ },
85
+ variables: {
86
+ TEST_COMMAND: "npm test",
87
+ BUILD_COMMAND: "npm run build",
88
+ LINT_COMMAND: "npm run lint",
89
+ },
90
+ },
91
+ };
92
+ export async function detectStack() {
93
+ // Check for Next.js
94
+ for (const file of STACKS.nextjs.detection.files || []) {
95
+ if (await fileExists(file)) {
96
+ return "nextjs";
97
+ }
98
+ }
99
+ // Check package.json for Next.js dependency
100
+ if (await fileExists("package.json")) {
101
+ try {
102
+ const pkg = JSON.parse(await readFile("package.json"));
103
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
104
+ if (deps.next) {
105
+ return "nextjs";
106
+ }
107
+ }
108
+ catch {
109
+ // Ignore parse errors
110
+ }
111
+ }
112
+ // Check for Rust
113
+ if (await fileExists("Cargo.toml")) {
114
+ return "rust";
115
+ }
116
+ // Check for Go
117
+ if (await fileExists("go.mod")) {
118
+ return "go";
119
+ }
120
+ // Check for Python
121
+ for (const file of STACKS.python.detection.files || []) {
122
+ if (await fileExists(file)) {
123
+ return "python";
124
+ }
125
+ }
126
+ return null;
127
+ }
128
+ export function getStackConfig(stack) {
129
+ return STACKS[stack] || STACKS.generic;
130
+ }
131
+ //# sourceMappingURL=stacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stacks.js","sourceRoot":"","sources":["../../../src/lib/stacks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Template management - copy and process templates
3
+ */
4
+ /**
5
+ * List all template files
6
+ */
7
+ export declare function listTemplateFiles(): Promise<string[]>;
8
+ /**
9
+ * Get content of a template file
10
+ */
11
+ export declare function getTemplateContent(templatePath: string): Promise<string>;
12
+ /**
13
+ * Copy all templates to .claude/ directory
14
+ */
15
+ export declare function copyTemplates(stack: string): Promise<void>;
16
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/lib/templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgCH;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAwB3D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DhE"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Template management - copy and process templates
3
+ */
4
+ import { readdir, chmod } from "fs/promises";
5
+ import { join, dirname, basename } from "path";
6
+ import { fileURLToPath } from "url";
7
+ import { readFile, writeFile, ensureDir, fileExists } from "./fs.js";
8
+ import { getStackConfig } from "./stacks.js";
9
+ // Get the package templates directory
10
+ function getTemplatesDir() {
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ // Compiled structure: dist/src/lib/templates.js
13
+ // So we need ../../../templates to reach project root templates/
14
+ const devPath = join(__dirname, "..", "..", "..", "templates");
15
+ return devPath;
16
+ }
17
+ /**
18
+ * Process template variables in content
19
+ */
20
+ function processTemplate(content, variables) {
21
+ let result = content;
22
+ for (const [key, value] of Object.entries(variables)) {
23
+ result = result.replace(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value);
24
+ }
25
+ return result;
26
+ }
27
+ /**
28
+ * List all template files
29
+ */
30
+ export async function listTemplateFiles() {
31
+ const templatesDir = getTemplatesDir();
32
+ const files = [];
33
+ async function walk(dir, prefix = "") {
34
+ try {
35
+ const entries = await readdir(dir, { withFileTypes: true });
36
+ for (const entry of entries) {
37
+ const relativePath = join(prefix, entry.name);
38
+ const fullPath = join(dir, entry.name);
39
+ if (entry.isDirectory()) {
40
+ await walk(fullPath, relativePath);
41
+ }
42
+ else {
43
+ files.push(join("templates", relativePath));
44
+ }
45
+ }
46
+ }
47
+ catch {
48
+ // Directory doesn't exist
49
+ }
50
+ }
51
+ await walk(templatesDir);
52
+ return files;
53
+ }
54
+ /**
55
+ * Get content of a template file
56
+ */
57
+ export async function getTemplateContent(templatePath) {
58
+ const templatesDir = getTemplatesDir();
59
+ const relativePath = templatePath.replace("templates/", "");
60
+ const fullPath = join(templatesDir, relativePath);
61
+ return readFile(fullPath);
62
+ }
63
+ /**
64
+ * Copy all templates to .claude/ directory
65
+ */
66
+ export async function copyTemplates(stack) {
67
+ const templatesDir = getTemplatesDir();
68
+ const stackConfig = getStackConfig(stack);
69
+ const variables = {
70
+ ...stackConfig.variables,
71
+ PROJECT_NAME: basename(process.cwd()) || "project",
72
+ STACK: stack,
73
+ };
74
+ async function copyDir(srcDir, destDir) {
75
+ try {
76
+ const entries = await readdir(srcDir, { withFileTypes: true });
77
+ await ensureDir(destDir);
78
+ for (const entry of entries) {
79
+ const srcPath = join(srcDir, entry.name);
80
+ const destPath = join(destDir, entry.name);
81
+ if (entry.isDirectory()) {
82
+ await copyDir(srcPath, destPath);
83
+ }
84
+ else {
85
+ // Read, process, and write
86
+ let content = await readFile(srcPath);
87
+ content = processTemplate(content, variables);
88
+ await writeFile(destPath, content);
89
+ // Make shell scripts executable
90
+ if (entry.name.endsWith(".sh")) {
91
+ await chmod(destPath, 0o755);
92
+ }
93
+ }
94
+ }
95
+ }
96
+ catch (error) {
97
+ // Skip if source doesn't exist
98
+ if (error.code !== "ENOENT") {
99
+ throw error;
100
+ }
101
+ }
102
+ }
103
+ // Copy skills
104
+ await copyDir(join(templatesDir, "skills"), ".claude/skills");
105
+ // Copy hooks
106
+ await copyDir(join(templatesDir, "hooks"), ".claude/hooks");
107
+ // Copy memory (constitution, etc.)
108
+ await copyDir(join(templatesDir, "memory"), ".claude/memory");
109
+ // Copy scripts (worktree helpers, etc.)
110
+ await copyDir(join(templatesDir, "scripts"), "scripts/dev");
111
+ // Copy settings.json
112
+ const settingsPath = join(templatesDir, "settings.json");
113
+ if (await fileExists(settingsPath)) {
114
+ const content = await readFile(settingsPath);
115
+ await writeFile(".claude/settings.json", processTemplate(content, variables));
116
+ }
117
+ }
118
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/lib/templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAY,KAAK,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,sCAAsC;AACtC,SAAS,eAAe;IACtB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,gDAAgD;IAChD,iEAAiE;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAE/D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,OAAe,EACf,SAAiC;IAEjC,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,QAAQ,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,SAAiB,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAAoB;IAEpB,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAElD,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa;IAC/C,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG;QAChB,GAAG,WAAW,CAAC,SAAS;QACxB,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,SAAS;QAClD,KAAK,EAAE,KAAK;KACb,CAAC;IAEF,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,OAAe;QACpD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YAEzB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,2BAA2B;oBAC3B,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACtC,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBAC9C,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAEnC,gCAAgC;oBAChC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/B,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+BAA+B;YAC/B,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,cAAc;IACd,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAE9D,aAAa;IACb,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;IAE5D,mCAAmC;IACnC,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAE9D,wCAAwC;IACxC,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;IAE5D,qBAAqB;IACrB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzD,IAAI,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,SAAS,CACb,uBAAuB,EACvB,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CACpC,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * CLI Argument Parser for Pipeline Scripts
3
+ *
4
+ * Typed argument parsing with support for common flags used across all scripts.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { parseArgs } from './lib/cli-args'
9
+ *
10
+ * const args = parseArgs(process.argv.slice(2))
11
+ * console.log(args.city) // 'nashville'
12
+ * console.log(args.limit) // 10
13
+ * console.log(args.dryRun) // true
14
+ * ```
15
+ */
16
+ /**
17
+ * Parsed command line arguments with typed fields.
18
+ */
19
+ export interface ParsedArgs {
20
+ /** City slug (e.g., 'nashville', 'new-york') */
21
+ city?: string;
22
+ /** Limit for number of items to process */
23
+ limit?: number;
24
+ /** Dry run mode - no database writes */
25
+ dryRun: boolean;
26
+ /** Verbose mode - enable debug logging */
27
+ verbose: boolean;
28
+ /** Auto-confirm prompts (skip confirmation) */
29
+ yes: boolean;
30
+ /** Positional arguments (non-flag arguments) */
31
+ positional: string[];
32
+ /** Any additional named arguments */
33
+ [key: string]: string | number | boolean | string[] | undefined;
34
+ }
35
+ /**
36
+ * Default values for parsed arguments.
37
+ */
38
+ export interface ParseDefaults {
39
+ city?: string;
40
+ limit?: number;
41
+ dryRun?: boolean;
42
+ verbose?: boolean;
43
+ yes?: boolean;
44
+ }
45
+ /**
46
+ * Parse command line arguments into a typed object.
47
+ *
48
+ * Supports two flag formats:
49
+ * - `--flag=value` (equals format)
50
+ * - `--flag value` (space-separated format)
51
+ *
52
+ * Boolean flags:
53
+ * - `--dry-run` or `--dryRun` → dryRun: true
54
+ * - `--verbose` or `-v` → verbose: true
55
+ * - `--yes` or `-y` → yes: true
56
+ *
57
+ * @param argv - Command line arguments (typically `process.argv.slice(2)`)
58
+ * @param defaults - Optional default values
59
+ * @returns Parsed arguments object
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * // With default city
64
+ * const args = parseArgs(['--limit', '5'], { city: 'nashville' })
65
+ * // args.city === 'nashville'
66
+ * // args.limit === 5
67
+ *
68
+ * // Boolean flags
69
+ * const args2 = parseArgs(['--dry-run', '--verbose'])
70
+ * // args2.dryRun === true
71
+ * // args2.verbose === true
72
+ * ```
73
+ */
74
+ export declare function parseArgs(argv: string[], defaults?: ParseDefaults): ParsedArgs;
75
+ /**
76
+ * Normalize a flag key to camelCase.
77
+ * Converts kebab-case to camelCase (e.g., 'dry-run' → 'dryRun').
78
+ *
79
+ * @param key - The flag key to normalize
80
+ * @returns Normalized key in camelCase
81
+ */
82
+ export declare function normalizeKey(key: string): string;
83
+ /**
84
+ * Parse a value based on expected type for known keys.
85
+ * Numbers are parsed for 'limit', 'count', 'max', 'min', 'timeout'.
86
+ *
87
+ * @param key - The normalized key
88
+ * @param value - The string value
89
+ * @returns Parsed value (number or string)
90
+ */
91
+ export declare function parseValue(key: string, value: string): string | number;
92
+ /**
93
+ * Get a required string argument, throwing an error if missing.
94
+ *
95
+ * @param args - Parsed arguments
96
+ * @param key - Argument key to get
97
+ * @param errorMessage - Custom error message if missing
98
+ * @returns The argument value
99
+ * @throws Error if argument is missing
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const city = getRequiredArg(args, 'city', 'Missing required --city argument')
104
+ * ```
105
+ */
106
+ export declare function getRequiredArg(args: ParsedArgs, key: keyof ParsedArgs | string, errorMessage?: string): string;
107
+ /**
108
+ * Check if help was requested via --help or -h flag.
109
+ *
110
+ * @param argv - Command line arguments
111
+ * @returns True if help was requested
112
+ */
113
+ export declare function isHelpRequested(argv: string[]): boolean;
114
+ /**
115
+ * Print usage information for a script.
116
+ *
117
+ * @param scriptName - Name of the script
118
+ * @param description - Brief description
119
+ * @param options - Available options with descriptions
120
+ * @param examples - Usage examples
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * if (isHelpRequested(process.argv)) {
125
+ * printUsage('discover-shops', 'Discover matcha shops for a city', {
126
+ * '--city <slug>': 'City slug (required)',
127
+ * '--limit <n>': 'Limit API calls',
128
+ * '--dry-run': 'Preview mode, no database writes',
129
+ * }, [
130
+ * 'npx tsx scripts/discover-shops.ts --city nashville',
131
+ * 'npx tsx scripts/discover-shops.ts --city nashville --limit 5',
132
+ * ])
133
+ * process.exit(0)
134
+ * }
135
+ * ```
136
+ */
137
+ export declare function printUsage(scriptName: string, description: string, options: Record<string, string>, examples?: string[]): void;
138
+ //# sourceMappingURL=cli-args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../../../../src/lib/workflow/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wCAAwC;IACxC,MAAM,EAAE,OAAO,CAAA;IACf,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAA;IAChB,+CAA+C;IAC/C,GAAG,EAAE,OAAO,CAAA;IACZ,gDAAgD;IAChD,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,qCAAqC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;CAChE;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,UAAU,CA0E9E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAStE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,MAAM,UAAU,GAAG,MAAM,EAC9B,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAYR;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAEvD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CACxB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,IAAI,CAoBN"}