sequant 1.18.0 → 1.19.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.
@@ -87,6 +87,14 @@ export interface RunSettings {
87
87
  * Default: true
88
88
  */
89
89
  retry: boolean;
90
+ /**
91
+ * Threshold for stale branch detection in pre-flight checks.
92
+ * If feature branch is more than this many commits behind main,
93
+ * QA/test skills block execution and recommend rebase.
94
+ * exec skill warns but doesn't block.
95
+ * Default: 5
96
+ */
97
+ staleBranchThreshold: number;
90
98
  }
91
99
  /**
92
100
  * Scope assessment threshold configuration
@@ -85,6 +85,7 @@ export const DEFAULT_SETTINGS = {
85
85
  rotation: DEFAULT_ROTATION_SETTINGS,
86
86
  mcp: true, // Enable MCP servers by default in headless mode
87
87
  retry: true, // Enable automatic retry with MCP fallback by default
88
+ staleBranchThreshold: 5, // Block QA/test if feature is >5 commits behind main
88
89
  },
89
90
  agents: DEFAULT_AGENT_SETTINGS,
90
91
  scopeAssessment: DEFAULT_SCOPE_ASSESSMENT_SETTINGS,
@@ -28,7 +28,7 @@ export interface StackConfig_Persisted {
28
28
  /**
29
29
  * Supported package managers
30
30
  */
31
- export type PackageManager = "npm" | "bun" | "yarn" | "pnpm";
31
+ export type PackageManager = "npm" | "bun" | "yarn" | "pnpm" | "pip" | "poetry" | "uv";
32
32
  /**
33
33
  * Package manager command configuration
34
34
  */
@@ -44,8 +44,10 @@ export interface PackageManagerConfig {
44
44
  export declare const PM_CONFIG: Record<PackageManager, PackageManagerConfig>;
45
45
  /**
46
46
  * Detect package manager from lockfiles
47
- * Priority: bun > yarn > pnpm > npm
47
+ * Priority: bun > yarn > pnpm > npm (for JS)
48
+ * Priority: uv > poetry > pip (for Python)
48
49
  * Falls back to npm if no lockfile found but package.json exists
50
+ * Falls back to pip if no lockfile found but pyproject.toml/requirements.txt exists
49
51
  */
50
52
  export declare function detectPackageManager(): Promise<PackageManager | null>;
51
53
  /**
@@ -48,6 +48,25 @@ export const PM_CONFIG = {
48
48
  install: "pnpm install",
49
49
  installSilent: "pnpm install --silent",
50
50
  },
51
+ // Python package managers
52
+ pip: {
53
+ run: "python -m",
54
+ exec: "python -m",
55
+ install: "pip install",
56
+ installSilent: "pip install -q",
57
+ },
58
+ poetry: {
59
+ run: "poetry run",
60
+ exec: "poetry run",
61
+ install: "poetry install",
62
+ installSilent: "poetry install -q",
63
+ },
64
+ uv: {
65
+ run: "uv run",
66
+ exec: "uvx",
67
+ install: "uv pip install",
68
+ installSilent: "uv pip install -q",
69
+ },
51
70
  };
52
71
  /**
53
72
  * Lockfile to package manager mapping (priority order: bun > yarn > pnpm > npm)
@@ -59,13 +78,23 @@ const LOCKFILE_PRIORITY = [
59
78
  { file: "pnpm-lock.yaml", pm: "pnpm" },
60
79
  { file: "package-lock.json", pm: "npm" },
61
80
  ];
81
+ /**
82
+ * Python lockfile to package manager mapping (priority order: uv > poetry > pip)
83
+ */
84
+ const PYTHON_LOCKFILE_PRIORITY = [
85
+ { file: "uv.lock", pm: "uv" },
86
+ { file: "poetry.lock", pm: "poetry" },
87
+ // requirements.txt is a fallback when no lockfile is found
88
+ ];
62
89
  /**
63
90
  * Detect package manager from lockfiles
64
- * Priority: bun > yarn > pnpm > npm
91
+ * Priority: bun > yarn > pnpm > npm (for JS)
92
+ * Priority: uv > poetry > pip (for Python)
65
93
  * Falls back to npm if no lockfile found but package.json exists
94
+ * Falls back to pip if no lockfile found but pyproject.toml/requirements.txt exists
66
95
  */
67
96
  export async function detectPackageManager() {
68
- // Check lockfiles in priority order
97
+ // Check JS lockfiles in priority order
69
98
  for (const { file, pm } of LOCKFILE_PRIORITY) {
70
99
  if (await fileExists(file)) {
71
100
  return pm;
@@ -75,7 +104,18 @@ export async function detectPackageManager() {
75
104
  if (await fileExists("package.json")) {
76
105
  return "npm";
77
106
  }
78
- // Not a Node.js project
107
+ // Check Python lockfiles in priority order
108
+ for (const { file, pm } of PYTHON_LOCKFILE_PRIORITY) {
109
+ if (await fileExists(file)) {
110
+ return pm;
111
+ }
112
+ }
113
+ // Fallback to pip if pyproject.toml or requirements.txt exists
114
+ if ((await fileExists("pyproject.toml")) ||
115
+ (await fileExists("requirements.txt"))) {
116
+ return "pip";
117
+ }
118
+ // Not a recognized project type
79
119
  return null;
80
120
  }
81
121
  /**
@@ -137,10 +137,10 @@ export type ACStatus = z.infer<typeof ACStatusSchema>;
137
137
  * Acceptance criteria verification method
138
138
  */
139
139
  export declare const ACVerificationMethodSchema: z.ZodEnum<{
140
+ manual: "manual";
140
141
  unit_test: "unit_test";
141
142
  integration_test: "integration_test";
142
143
  browser_test: "browser_test";
143
- manual: "manual";
144
144
  }>;
145
145
  export type ACVerificationMethod = z.infer<typeof ACVerificationMethodSchema>;
146
146
  /**
@@ -150,10 +150,10 @@ export declare const AcceptanceCriterionSchema: z.ZodObject<{
150
150
  id: z.ZodString;
151
151
  description: z.ZodString;
152
152
  verificationMethod: z.ZodEnum<{
153
+ manual: "manual";
153
154
  unit_test: "unit_test";
154
155
  integration_test: "integration_test";
155
156
  browser_test: "browser_test";
156
- manual: "manual";
157
157
  }>;
158
158
  status: z.ZodEnum<{
159
159
  pending: "pending";
@@ -173,10 +173,10 @@ export declare const AcceptanceCriteriaSchema: z.ZodObject<{
173
173
  id: z.ZodString;
174
174
  description: z.ZodString;
175
175
  verificationMethod: z.ZodEnum<{
176
+ manual: "manual";
176
177
  unit_test: "unit_test";
177
178
  integration_test: "integration_test";
178
179
  browser_test: "browser_test";
179
- manual: "manual";
180
180
  }>;
181
181
  status: z.ZodEnum<{
182
182
  pending: "pending";
@@ -252,10 +252,10 @@ export declare const IssueStateSchema: z.ZodObject<{
252
252
  id: z.ZodString;
253
253
  description: z.ZodString;
254
254
  verificationMethod: z.ZodEnum<{
255
+ manual: "manual";
255
256
  unit_test: "unit_test";
256
257
  integration_test: "integration_test";
257
258
  browser_test: "browser_test";
258
- manual: "manual";
259
259
  }>;
260
260
  status: z.ZodEnum<{
261
261
  pending: "pending";
@@ -377,10 +377,10 @@ export declare const WorkflowStateSchema: z.ZodObject<{
377
377
  id: z.ZodString;
378
378
  description: z.ZodString;
379
379
  verificationMethod: z.ZodEnum<{
380
+ manual: "manual";
380
381
  unit_test: "unit_test";
381
382
  integration_test: "integration_test";
382
383
  browser_test: "browser_test";
383
- manual: "manual";
384
384
  }>;
385
385
  status: z.ZodEnum<{
386
386
  pending: "pending";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sequant",
3
- "version": "1.18.0",
3
+ "version": "1.19.0",
4
4
  "description": "Quantize your development workflow - Sequential AI phases with quality gates",
5
5
  "type": "module",
6
6
  "bin": {