edsger 0.72.0 → 0.72.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/mcp-client.js +8 -1
- package/dist/commands/quality-benchmark/index.js +1 -1
- package/dist/commands/sync-terraform/index.js +8 -1
- package/dist/system/session-manager.js +9 -0
- package/package.json +7 -3
- package/.claude/settings.local.json +0 -28
- package/eslint.config.mjs +0 -26
- package/tsconfig.build.json +0 -4
- package/tsconfig.json +0 -19
- package/vitest.config.ts +0 -19
package/dist/api/mcp-client.js
CHANGED
|
@@ -21,8 +21,15 @@ export async function callMcpEndpoint(method, params) {
|
|
|
21
21
|
if (!mcpToken) {
|
|
22
22
|
throw new Error('Not authenticated. Run `edsger login` or set EDSGER_MCP_TOKEN environment variable.');
|
|
23
23
|
}
|
|
24
|
+
// The platform splits its JSON-RPC surface across two edge functions that
|
|
25
|
+
// share the same base URL and MCP-token auth:
|
|
26
|
+
// - `/mcp` — slash-notation methods (issues/list, github/org_repos, ...)
|
|
27
|
+
// - `/agents` — dot-notation methods (agents.*, services.*, skills.*, ...)
|
|
28
|
+
// Route by the method's separator so callers don't have to care which
|
|
29
|
+
// function owns a given method.
|
|
30
|
+
const endpoint = method.includes('.') ? 'agents' : 'mcp';
|
|
24
31
|
try {
|
|
25
|
-
const response = await fetch(`${mcpServerUrl}
|
|
32
|
+
const response = await fetch(`${mcpServerUrl}/${endpoint}`, {
|
|
26
33
|
method: 'POST',
|
|
27
34
|
headers: {
|
|
28
35
|
'Content-Type': 'application/json',
|
|
@@ -29,9 +29,16 @@ export async function runSyncTerraform(teamId, options = {}) {
|
|
|
29
29
|
repoFullName = result?.team?.terraform_repo_full_name ?? null;
|
|
30
30
|
}
|
|
31
31
|
catch {
|
|
32
|
-
// Fallback:
|
|
32
|
+
// Fallback: the caller (e.g. the desktop app) may have already resolved
|
|
33
|
+
// the team's repo and injected it as EDSGER_TERRAFORM_REPO, so MCP isn't
|
|
34
|
+
// strictly required.
|
|
33
35
|
logWarning('Could not fetch team via MCP, attempting to read terraform_repo_full_name from env');
|
|
34
36
|
}
|
|
37
|
+
// Env fallback works whether or not MCP returned a repo — it lets the
|
|
38
|
+
// desktop app drive the sync without depending on the MCP team endpoint.
|
|
39
|
+
if (!repoFullName) {
|
|
40
|
+
repoFullName = process.env.EDSGER_TERRAFORM_REPO ?? null;
|
|
41
|
+
}
|
|
35
42
|
if (!repoFullName) {
|
|
36
43
|
logError('No Terraform repo configured for this team. ' +
|
|
37
44
|
'Go to Team Settings and set a Terraform repo, or use --dir to point at a local directory.');
|
|
@@ -58,6 +58,9 @@ export async function registerSession(options) {
|
|
|
58
58
|
const sessionId = generateSessionId();
|
|
59
59
|
currentSessionId = sessionId;
|
|
60
60
|
const command = resolvedCommand(options);
|
|
61
|
+
// Full invocation (subcommand + args) for readable run history. `command`
|
|
62
|
+
// stays the stable, entity-scoped lookup key; this carries the variable args.
|
|
63
|
+
const invocation = process.argv.slice(2).join(' ') || undefined;
|
|
61
64
|
try {
|
|
62
65
|
const userId = getUserId();
|
|
63
66
|
if (hasSupabaseSession() && userId) {
|
|
@@ -73,6 +76,9 @@ export async function registerSession(options) {
|
|
|
73
76
|
if (command) {
|
|
74
77
|
row.command = command;
|
|
75
78
|
}
|
|
79
|
+
if (invocation) {
|
|
80
|
+
row.invocation = invocation;
|
|
81
|
+
}
|
|
76
82
|
if (options?.productId) {
|
|
77
83
|
row.product_id = options.productId;
|
|
78
84
|
}
|
|
@@ -93,6 +99,9 @@ export async function registerSession(options) {
|
|
|
93
99
|
if (command) {
|
|
94
100
|
payload.command = command;
|
|
95
101
|
}
|
|
102
|
+
if (invocation) {
|
|
103
|
+
payload.invocation = invocation;
|
|
104
|
+
}
|
|
96
105
|
if (options?.productId) {
|
|
97
106
|
payload.product_id = options.productId;
|
|
98
107
|
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "edsger",
|
|
3
|
-
"version": "0.72.
|
|
3
|
+
"version": "0.72.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"edsger": "dist/index.js"
|
|
7
7
|
},
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"README.md"
|
|
11
|
+
],
|
|
8
12
|
"scripts": {
|
|
9
13
|
"build": "tsc -p tsconfig.build.json && cp -r src/phases/app-store-generation/assets dist/phases/app-store-generation/ && cp src/phases/quality-benchmark/rubric.md dist/phases/quality-benchmark/rubric.md && rm -rf dist/skills && mkdir -p dist/skills && cp -r ../edsger-skills/skills/phase dist/skills/phase",
|
|
10
14
|
"dev": "tsc -p tsconfig.build.json --watch",
|
|
@@ -50,8 +54,8 @@
|
|
|
50
54
|
"commander": "^12.0.0",
|
|
51
55
|
"cosmiconfig": "^9.0.0",
|
|
52
56
|
"dotenv": "^16.4.5",
|
|
53
|
-
"edsger-contract": "0.
|
|
54
|
-
"edsger-tools": "0.9.
|
|
57
|
+
"edsger-contract": "0.9.1",
|
|
58
|
+
"edsger-tools": "0.9.1",
|
|
55
59
|
"gray-matter": "^4.0.3",
|
|
56
60
|
"zod": "^4.0.0"
|
|
57
61
|
},
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"Read(//Users/steven/development/edsger/**)",
|
|
5
|
-
"Bash(npm run build)",
|
|
6
|
-
"Bash(node:*)",
|
|
7
|
-
"Bash(git add:*)",
|
|
8
|
-
"Bash(git commit:*)",
|
|
9
|
-
"Bash(ls:*)",
|
|
10
|
-
"Bash(cat:*)",
|
|
11
|
-
"Bash(npm run typecheck:*)",
|
|
12
|
-
"Bash(git diff:*)",
|
|
13
|
-
"WebSearch",
|
|
14
|
-
"WebFetch(domain:supabase.com)",
|
|
15
|
-
"Bash(npm install:*)",
|
|
16
|
-
"Bash(grep:*)",
|
|
17
|
-
"Bash(npx supabase gen types typescript --help:*)",
|
|
18
|
-
"Bash(git -C /Users/steven/development/edsger status)",
|
|
19
|
-
"Bash(git -C /Users/steven/development/edsger diff)",
|
|
20
|
-
"Bash(git -C /Users/steven/development/edsger log --oneline -5)",
|
|
21
|
-
"Bash(git -C /Users/steven/development/edsger add supabase/migrations/20251231000000_drop_unused_views.sql)",
|
|
22
|
-
"Bash(git -C /Users/steven/development/edsger commit -m \"$\\(cat <<''EOF''\nchore: drop unused database views\n\nRemove test_report_summary and user_stories_with_context views that are defined but never used in the application.\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
|
23
|
-
"Bash(git -C /Users/steven/development/edsger commit -m \"$\\(cat <<''EOF''\nchore: drop unused database views\n\nRemove test_report_summary and user_stories_with_context views\nthat are defined but never used in the application.\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")"
|
|
24
|
-
],
|
|
25
|
-
"deny": [],
|
|
26
|
-
"ask": []
|
|
27
|
-
}
|
|
28
|
-
}
|
package/eslint.config.mjs
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
baseConfig,
|
|
3
|
-
node,
|
|
4
|
-
typeCheckedRules,
|
|
5
|
-
} from '../edsger-lint/eslint/index.mjs'
|
|
6
|
-
|
|
7
|
-
export default [
|
|
8
|
-
// Test-only infra (the node:test→vitest shim) lives outside the src TS
|
|
9
|
-
// project, so skip it for the type-checked lint.
|
|
10
|
-
{ ignores: ['test/**'] },
|
|
11
|
-
|
|
12
|
-
...baseConfig,
|
|
13
|
-
|
|
14
|
-
// Type-checked rules
|
|
15
|
-
...typeCheckedRules(import.meta.dirname),
|
|
16
|
-
|
|
17
|
-
// Node.js CLI
|
|
18
|
-
...node,
|
|
19
|
-
{
|
|
20
|
-
rules: {
|
|
21
|
-
'no-console': 'off',
|
|
22
|
-
// Legacy CLI code has extensive any usage — fix incrementally
|
|
23
|
-
'@typescript-eslint/no-explicit-any': 'warn',
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
]
|
package/tsconfig.build.json
DELETED
package/tsconfig.json
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "node",
|
|
6
|
-
"esModuleInterop": true,
|
|
7
|
-
"allowSyntheticDefaultImports": true,
|
|
8
|
-
"strict": true,
|
|
9
|
-
"skipLibCheck": true,
|
|
10
|
-
"forceConsistentCasingInFileNames": true,
|
|
11
|
-
"declaration": true,
|
|
12
|
-
"outDir": "./dist",
|
|
13
|
-
"rootDir": "./src",
|
|
14
|
-
"resolveJsonModule": true,
|
|
15
|
-
"types": ["node"]
|
|
16
|
-
},
|
|
17
|
-
"include": ["src/**/*"],
|
|
18
|
-
"exclude": ["node_modules", "dist"]
|
|
19
|
-
}
|
package/vitest.config.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { fileURLToPath } from 'node:url'
|
|
2
|
-
|
|
3
|
-
import { defineConfig } from 'vitest/config'
|
|
4
|
-
|
|
5
|
-
export default defineConfig({
|
|
6
|
-
test: {
|
|
7
|
-
// Run every test under src, including the many files written against the
|
|
8
|
-
// node:test API — those used to be silently skipped. The `node:test` alias
|
|
9
|
-
// below lets them run under vitest unchanged.
|
|
10
|
-
include: ['src/**/__tests__/**/*.test.ts'],
|
|
11
|
-
exclude: ['dist/**', 'node_modules/**'],
|
|
12
|
-
environment: 'node',
|
|
13
|
-
alias: {
|
|
14
|
-
'node:test': fileURLToPath(
|
|
15
|
-
new URL('./test/node-test-shim.ts', import.meta.url)
|
|
16
|
-
),
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
})
|