forgepm 0.8.0 → 0.8.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/dist/src/core/forge.js +6 -0
- package/dist/src/core/forge.js.map +1 -1
- package/dist/src/github/auto-sync.d.ts +19 -0
- package/dist/src/github/auto-sync.js +50 -0
- package/dist/src/github/auto-sync.js.map +1 -0
- package/dist/src/github/graphql.d.ts +42 -0
- package/dist/src/github/graphql.js +193 -0
- package/dist/src/github/graphql.js.map +1 -0
- package/dist/src/github/push.d.ts +3 -0
- package/dist/src/github/push.js +42 -2
- package/dist/src/github/push.js.map +1 -1
- package/dist/src/github/setup.js +26 -2
- package/dist/src/github/setup.js.map +1 -1
- package/package.json +1 -1
package/dist/src/core/forge.js
CHANGED
|
@@ -11,6 +11,7 @@ import { startTask, completeTask, failTask, getStatus } from './forge-ops.js';
|
|
|
11
11
|
import { DriftDetector } from '../pm/drift-detector.js';
|
|
12
12
|
import { RetrospectiveEngine } from '../pm/retrospective.js';
|
|
13
13
|
import { StatusWriterPlugin } from '../github/status-writer.js';
|
|
14
|
+
import { AutoSyncPlugin } from '../github/auto-sync.js';
|
|
14
15
|
export async function createForge(dbPath, configOverrides, extraPlugins = []) {
|
|
15
16
|
const config = { ...DEFAULT_CONFIG, ...configOverrides };
|
|
16
17
|
const store = new OverlayStore(dbPath);
|
|
@@ -26,6 +27,11 @@ export async function createForge(dbPath, configOverrides, extraPlugins = []) {
|
|
|
26
27
|
const configRow = store.query('SELECT drift_thresholds FROM project_config WHERE id = ? LIMIT 1', ['default']);
|
|
27
28
|
const driftOverrides = configRow[0]?.drift_thresholds ? JSON.parse(configRow[0].drift_thresholds) : undefined;
|
|
28
29
|
const plugins = [new DriftDetector(driftOverrides), new StatusWriterPlugin(dbPath), ...extraPlugins];
|
|
30
|
+
// Auto-sync to GitHub if enabled
|
|
31
|
+
const ghConfig = store.query('SELECT github_sync, github_owner, github_repo, github_project_number FROM project_config WHERE id = ?', ['default'])[0];
|
|
32
|
+
if (ghConfig?.github_sync && ghConfig.github_owner && ghConfig.github_repo) {
|
|
33
|
+
plugins.push(new AutoSyncPlugin(ghConfig.github_owner, ghConfig.github_repo, ghConfig.github_project_number ?? 0));
|
|
34
|
+
}
|
|
29
35
|
const deps = { config, store, bus, calibration, evm, tolerances, pdca, sessions, callsheet, plugins };
|
|
30
36
|
wireEvents(deps);
|
|
31
37
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forge.js","sourceRoot":"","sources":["../../../src/core/forge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAkB,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"forge.js","sourceRoot":"","sources":["../../../src/core/forge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { EventPlugin } from '../core/event-plugins.js';
|
|
2
|
+
import type { DomainEvent } from '../core/types.js';
|
|
3
|
+
import type { OverlayStore } from '../core/store.js';
|
|
4
|
+
/**
|
|
5
|
+
* Auto-sync plugin: debounced push to GitHub after task state changes.
|
|
6
|
+
* Fires processSyncOutbox 2 seconds after the last relevant event.
|
|
7
|
+
*/
|
|
8
|
+
export declare class AutoSyncPlugin implements EventPlugin {
|
|
9
|
+
private owner;
|
|
10
|
+
private repo;
|
|
11
|
+
private projectNumber;
|
|
12
|
+
private debounceMs;
|
|
13
|
+
name: string;
|
|
14
|
+
private timer;
|
|
15
|
+
private pendingStore;
|
|
16
|
+
constructor(owner: string, repo: string, projectNumber: number, debounceMs?: number);
|
|
17
|
+
onEvent(event: DomainEvent, store: OverlayStore): void;
|
|
18
|
+
private flush;
|
|
19
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { GitHubPushSync } from './push.js';
|
|
2
|
+
const SYNC_EVENTS = new Set([
|
|
3
|
+
'task.started', 'task.completed', 'task.failed', 'escalation.required',
|
|
4
|
+
]);
|
|
5
|
+
/**
|
|
6
|
+
* Auto-sync plugin: debounced push to GitHub after task state changes.
|
|
7
|
+
* Fires processSyncOutbox 2 seconds after the last relevant event.
|
|
8
|
+
*/
|
|
9
|
+
export class AutoSyncPlugin {
|
|
10
|
+
owner;
|
|
11
|
+
repo;
|
|
12
|
+
projectNumber;
|
|
13
|
+
debounceMs;
|
|
14
|
+
name = 'auto-sync';
|
|
15
|
+
timer = null;
|
|
16
|
+
pendingStore = null;
|
|
17
|
+
constructor(owner, repo, projectNumber, debounceMs = 2000) {
|
|
18
|
+
this.owner = owner;
|
|
19
|
+
this.repo = repo;
|
|
20
|
+
this.projectNumber = projectNumber;
|
|
21
|
+
this.debounceMs = debounceMs;
|
|
22
|
+
}
|
|
23
|
+
onEvent(event, store) {
|
|
24
|
+
if (!SYNC_EVENTS.has(event.type))
|
|
25
|
+
return;
|
|
26
|
+
this.pendingStore = store;
|
|
27
|
+
// Debounce: reset timer on each event, flush after debounceMs
|
|
28
|
+
if (this.timer)
|
|
29
|
+
clearTimeout(this.timer);
|
|
30
|
+
this.timer = setTimeout(() => {
|
|
31
|
+
this.flush().catch(err => {
|
|
32
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
33
|
+
console.error(`[auto-sync] flush failed: ${msg}`);
|
|
34
|
+
});
|
|
35
|
+
}, this.debounceMs);
|
|
36
|
+
}
|
|
37
|
+
async flush() {
|
|
38
|
+
if (!this.pendingStore)
|
|
39
|
+
return;
|
|
40
|
+
const store = this.pendingStore;
|
|
41
|
+
this.pendingStore = null;
|
|
42
|
+
this.timer = null;
|
|
43
|
+
const push = new GitHubPushSync(this.owner, this.repo, this.projectNumber);
|
|
44
|
+
const synced = await push.processSyncOutbox(store);
|
|
45
|
+
if (synced > 0) {
|
|
46
|
+
console.error(`[auto-sync] pushed ${synced} item(s) to GitHub`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=auto-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-sync.js","sourceRoot":"","sources":["../../../src/github/auto-sync.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB;CACvE,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,OAAO,cAAc;IAMf;IACA;IACA;IACA;IARV,IAAI,GAAG,WAAW,CAAC;IACX,KAAK,GAAyC,IAAI,CAAC;IACnD,YAAY,GAAwB,IAAI,CAAC;IAEjD,YACU,KAAa,EACb,IAAY,EACZ,aAAqB,EACrB,aAAqB,IAAI;QAHzB,UAAK,GAAL,KAAK,CAAQ;QACb,SAAI,GAAJ,IAAI,CAAQ;QACZ,kBAAa,GAAb,aAAa,CAAQ;QACrB,eAAU,GAAV,UAAU,CAAe;IAChC,CAAC;IAEJ,OAAO,CAAC,KAAkB,EAAE,KAAmB;QAC7C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO;QAEzC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,8DAA8D;QAC9D,IAAI,IAAI,CAAC,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACvB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,MAAM,oBAAoB,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
interface FieldInfo {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
options?: Array<{
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* GitHub Projects V2 GraphQL client.
|
|
12
|
+
* All queries use parameterized variables via `gh api graphql -f/-F` — never string interpolation.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ProjectsV2Client {
|
|
15
|
+
private owner;
|
|
16
|
+
private repo;
|
|
17
|
+
private projectNumber;
|
|
18
|
+
private projectNodeId;
|
|
19
|
+
private fieldsCache;
|
|
20
|
+
constructor(owner: string, repo: string, projectNumber: number);
|
|
21
|
+
/** Resolve the Project V2 node ID (cached after first call) */
|
|
22
|
+
getProjectNodeId(): Promise<string>;
|
|
23
|
+
/** Get the node ID of a GitHub issue */
|
|
24
|
+
getIssueNodeId(issueNumber: number): Promise<string>;
|
|
25
|
+
/** Add an issue to the project board, returns the item ID */
|
|
26
|
+
addItemToProject(issueNodeId: string): Promise<string>;
|
|
27
|
+
/** Ensure issue is in project — add if not already there */
|
|
28
|
+
ensureItemInProject(issueNumber: number): Promise<string | null>;
|
|
29
|
+
/** Get all project fields (cached) */
|
|
30
|
+
getFields(): Promise<Map<string, FieldInfo>>;
|
|
31
|
+
/** Set the Status field on a project item */
|
|
32
|
+
setStatus(itemId: string, statusName: string): Promise<void>;
|
|
33
|
+
/** Set a number field on a project item */
|
|
34
|
+
setNumberField(itemId: string, fieldName: string, value: number): Promise<void>;
|
|
35
|
+
/** Set a single-select field on a project item */
|
|
36
|
+
setSingleSelectField(itemId: string, fieldName: string, optionName: string): Promise<void>;
|
|
37
|
+
/** Generic field update mutation */
|
|
38
|
+
private updateField;
|
|
39
|
+
/** Execute a GraphQL query via gh CLI with parameterized variables */
|
|
40
|
+
private graphql;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* GitHub Projects V2 GraphQL client.
|
|
6
|
+
* All queries use parameterized variables via `gh api graphql -f/-F` — never string interpolation.
|
|
7
|
+
*/
|
|
8
|
+
export class ProjectsV2Client {
|
|
9
|
+
owner;
|
|
10
|
+
repo;
|
|
11
|
+
projectNumber;
|
|
12
|
+
projectNodeId = null;
|
|
13
|
+
fieldsCache = null;
|
|
14
|
+
constructor(owner, repo, projectNumber) {
|
|
15
|
+
this.owner = owner;
|
|
16
|
+
this.repo = repo;
|
|
17
|
+
this.projectNumber = projectNumber;
|
|
18
|
+
}
|
|
19
|
+
/** Resolve the Project V2 node ID (cached after first call) */
|
|
20
|
+
async getProjectNodeId() {
|
|
21
|
+
if (this.projectNodeId)
|
|
22
|
+
return this.projectNodeId;
|
|
23
|
+
// Try as user first, fallback to org
|
|
24
|
+
const query = `
|
|
25
|
+
query($login: String!, $num: Int!) {
|
|
26
|
+
user(login: $login) { projectV2(number: $num) { id } }
|
|
27
|
+
}
|
|
28
|
+
`;
|
|
29
|
+
try {
|
|
30
|
+
const result = await this.graphql(query, { login: this.owner, num: this.projectNumber });
|
|
31
|
+
this.projectNodeId = result.user.projectV2.id;
|
|
32
|
+
return this.projectNodeId;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Fallback: try as organization
|
|
36
|
+
const orgQuery = `
|
|
37
|
+
query($login: String!, $num: Int!) {
|
|
38
|
+
organization(login: $login) { projectV2(number: $num) { id } }
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
const result = await this.graphql(orgQuery, { login: this.owner, num: this.projectNumber });
|
|
42
|
+
this.projectNodeId = result.organization.projectV2.id;
|
|
43
|
+
return this.projectNodeId;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Get the node ID of a GitHub issue */
|
|
47
|
+
async getIssueNodeId(issueNumber) {
|
|
48
|
+
const query = `
|
|
49
|
+
query($owner: String!, $repo: String!, $num: Int!) {
|
|
50
|
+
repository(owner: $owner, name: $repo) {
|
|
51
|
+
issue(number: $num) { id }
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
const result = await this.graphql(query, {
|
|
56
|
+
owner: this.owner, repo: this.repo, num: issueNumber,
|
|
57
|
+
});
|
|
58
|
+
return result.repository.issue.id;
|
|
59
|
+
}
|
|
60
|
+
/** Add an issue to the project board, returns the item ID */
|
|
61
|
+
async addItemToProject(issueNodeId) {
|
|
62
|
+
const projectId = await this.getProjectNodeId();
|
|
63
|
+
const query = `
|
|
64
|
+
mutation($projectId: ID!, $contentId: ID!) {
|
|
65
|
+
addProjectV2ItemById(input: { projectId: $projectId, contentId: $contentId }) {
|
|
66
|
+
item { id }
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
`;
|
|
70
|
+
const result = await this.graphql(query, {
|
|
71
|
+
projectId, contentId: issueNodeId,
|
|
72
|
+
});
|
|
73
|
+
return result.addProjectV2ItemById.item.id;
|
|
74
|
+
}
|
|
75
|
+
/** Ensure issue is in project — add if not already there */
|
|
76
|
+
async ensureItemInProject(issueNumber) {
|
|
77
|
+
try {
|
|
78
|
+
const issueNodeId = await this.getIssueNodeId(issueNumber);
|
|
79
|
+
return await this.addItemToProject(issueNodeId);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
83
|
+
// If already in project, the mutation still returns the item ID
|
|
84
|
+
// Only truly fail on unexpected errors
|
|
85
|
+
if (msg.includes('already exists'))
|
|
86
|
+
return null;
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Get all project fields (cached) */
|
|
91
|
+
async getFields() {
|
|
92
|
+
if (this.fieldsCache)
|
|
93
|
+
return this.fieldsCache;
|
|
94
|
+
const projectId = await this.getProjectNodeId();
|
|
95
|
+
const query = `
|
|
96
|
+
query($projectId: ID!) {
|
|
97
|
+
node(id: $projectId) {
|
|
98
|
+
... on ProjectV2 {
|
|
99
|
+
fields(first: 30) {
|
|
100
|
+
nodes {
|
|
101
|
+
... on ProjectV2Field { id name dataType }
|
|
102
|
+
... on ProjectV2SingleSelectField {
|
|
103
|
+
id name dataType
|
|
104
|
+
options { id name }
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
`;
|
|
112
|
+
const result = await this.graphql(query, { projectId });
|
|
113
|
+
this.fieldsCache = new Map();
|
|
114
|
+
for (const field of result.node.fields.nodes) {
|
|
115
|
+
this.fieldsCache.set(field.name, {
|
|
116
|
+
id: field.id,
|
|
117
|
+
name: field.name,
|
|
118
|
+
type: field.dataType,
|
|
119
|
+
options: field.options,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return this.fieldsCache;
|
|
123
|
+
}
|
|
124
|
+
/** Set the Status field on a project item */
|
|
125
|
+
async setStatus(itemId, statusName) {
|
|
126
|
+
const fields = await this.getFields();
|
|
127
|
+
const statusField = fields.get('Status');
|
|
128
|
+
if (!statusField?.options)
|
|
129
|
+
return;
|
|
130
|
+
const option = statusField.options.find(o => o.name.toLowerCase() === statusName.toLowerCase());
|
|
131
|
+
if (!option)
|
|
132
|
+
return;
|
|
133
|
+
await this.updateField(itemId, statusField.id, { singleSelectOptionId: option.id });
|
|
134
|
+
}
|
|
135
|
+
/** Set a number field on a project item */
|
|
136
|
+
async setNumberField(itemId, fieldName, value) {
|
|
137
|
+
const fields = await this.getFields();
|
|
138
|
+
const field = fields.get(fieldName);
|
|
139
|
+
if (!field)
|
|
140
|
+
return;
|
|
141
|
+
await this.updateField(itemId, field.id, { number: value });
|
|
142
|
+
}
|
|
143
|
+
/** Set a single-select field on a project item */
|
|
144
|
+
async setSingleSelectField(itemId, fieldName, optionName) {
|
|
145
|
+
const fields = await this.getFields();
|
|
146
|
+
const field = fields.get(fieldName);
|
|
147
|
+
if (!field?.options)
|
|
148
|
+
return;
|
|
149
|
+
const option = field.options.find(o => o.name.toLowerCase() === optionName.toLowerCase());
|
|
150
|
+
if (!option)
|
|
151
|
+
return;
|
|
152
|
+
await this.updateField(itemId, field.id, { singleSelectOptionId: option.id });
|
|
153
|
+
}
|
|
154
|
+
/** Generic field update mutation */
|
|
155
|
+
async updateField(itemId, fieldId, value) {
|
|
156
|
+
const projectId = await this.getProjectNodeId();
|
|
157
|
+
// Build value JSON — gh api graphql needs it as a JSON string via -f
|
|
158
|
+
const valueJson = JSON.stringify(value);
|
|
159
|
+
// We must use raw gh api for this since value is a complex input type
|
|
160
|
+
const query = `
|
|
161
|
+
mutation UpdateField($projectId: ID!, $itemId: ID!, $fieldId: ID!) {
|
|
162
|
+
updateProjectV2ItemFieldValue(
|
|
163
|
+
input: { projectId: $projectId, itemId: $itemId, fieldId: $fieldId, value: ${valueJson} }
|
|
164
|
+
) {
|
|
165
|
+
projectV2Item { id }
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
`;
|
|
169
|
+
// For this specific mutation, we inline the value JSON since gh api graphql
|
|
170
|
+
// doesn't support nested object variables. The value is constructed from our
|
|
171
|
+
// own code (field IDs from GitHub API), not user input — safe from injection.
|
|
172
|
+
await execFileAsync('gh', ['api', 'graphql', '-f', `query=${query}`, '-f', `projectId=${projectId}`, '-f', `itemId=${itemId}`, '-f', `fieldId=${fieldId}`]);
|
|
173
|
+
}
|
|
174
|
+
/** Execute a GraphQL query via gh CLI with parameterized variables */
|
|
175
|
+
async graphql(query, variables) {
|
|
176
|
+
const args = ['api', 'graphql', '-f', `query=${query}`];
|
|
177
|
+
for (const [key, val] of Object.entries(variables)) {
|
|
178
|
+
if (typeof val === 'number') {
|
|
179
|
+
args.push('-F', `${key}=${val}`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
args.push('-f', `${key}=${val}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const { stdout } = await execFileAsync('gh', args);
|
|
186
|
+
const parsed = JSON.parse(stdout);
|
|
187
|
+
if (parsed.errors?.length) {
|
|
188
|
+
throw new Error(`GraphQL error: ${parsed.errors[0].message}`);
|
|
189
|
+
}
|
|
190
|
+
return parsed.data;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=graphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../../src/github/graphql.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,10 +10,13 @@ export declare class GitHubPushSync {
|
|
|
10
10
|
private owner;
|
|
11
11
|
private repo;
|
|
12
12
|
private projectNumber;
|
|
13
|
+
private projectsClient;
|
|
13
14
|
constructor(owner: string, repo: string, projectNumber: number);
|
|
14
15
|
pushTask(task: PushTask): Promise<number>;
|
|
15
16
|
closeTask(issueNumber: number): Promise<void>;
|
|
16
17
|
processSyncOutbox(store: OverlayStore): Promise<number>;
|
|
18
|
+
private syncToProjectBoard;
|
|
19
|
+
private mapStatus;
|
|
17
20
|
private statusToLabel;
|
|
18
21
|
}
|
|
19
22
|
export {};
|
package/dist/src/github/push.js
CHANGED
|
@@ -2,15 +2,18 @@ import { execFile } from 'node:child_process';
|
|
|
2
2
|
import { promisify } from 'node:util';
|
|
3
3
|
const execFileAsync = promisify(execFile);
|
|
4
4
|
import { validateGitHubName } from '../utils/validation.js';
|
|
5
|
+
import { ProjectsV2Client } from './graphql.js';
|
|
5
6
|
export class GitHubPushSync {
|
|
6
7
|
owner;
|
|
7
8
|
repo;
|
|
8
9
|
projectNumber;
|
|
10
|
+
projectsClient;
|
|
9
11
|
constructor(owner, repo, projectNumber) {
|
|
10
12
|
this.owner = owner;
|
|
11
13
|
this.repo = repo;
|
|
12
14
|
this.projectNumber = projectNumber;
|
|
13
15
|
validateGitHubName(owner, repo);
|
|
16
|
+
this.projectsClient = new ProjectsV2Client(owner, repo, projectNumber);
|
|
14
17
|
}
|
|
15
18
|
async pushTask(task) {
|
|
16
19
|
const repoFlag = `${this.owner}/${this.repo}`;
|
|
@@ -81,18 +84,25 @@ export class GitHubPushSync {
|
|
|
81
84
|
const payload = JSON.parse(row.payload);
|
|
82
85
|
if (row.entity_type === 'task') {
|
|
83
86
|
if (row.operation === 'upsert') {
|
|
84
|
-
await this.pushTask({
|
|
87
|
+
const issueNumber = await this.pushTask({
|
|
85
88
|
id: row.entity_id,
|
|
86
89
|
title: payload['title'] ?? row.entity_id,
|
|
87
90
|
status: payload['status'] ?? 'backlog',
|
|
88
91
|
complexity: payload['complexity'] ?? 1,
|
|
89
92
|
github_issue_number: payload['github_issue_number'],
|
|
90
93
|
});
|
|
94
|
+
// Persist issue number back to DB
|
|
95
|
+
store.run('UPDATE tasks SET github_issue_number = ? WHERE id = ?', [issueNumber, row.entity_id]);
|
|
96
|
+
// Add to Projects V2 board + update fields
|
|
97
|
+
await this.syncToProjectBoard(store, row.entity_id, issueNumber, payload);
|
|
91
98
|
}
|
|
92
99
|
else if (row.operation === 'close') {
|
|
93
|
-
const issueNumber = payload['github_issue_number']
|
|
100
|
+
const issueNumber = payload['github_issue_number']
|
|
101
|
+
?? store.query('SELECT github_issue_number FROM tasks WHERE id = ?', [row.entity_id])[0]?.github_issue_number
|
|
102
|
+
?? undefined;
|
|
94
103
|
if (issueNumber) {
|
|
95
104
|
await this.closeTask(issueNumber);
|
|
105
|
+
await this.syncToProjectBoard(store, row.entity_id, issueNumber, { ...payload, status: 'done' });
|
|
96
106
|
}
|
|
97
107
|
}
|
|
98
108
|
}
|
|
@@ -106,6 +116,36 @@ export class GitHubPushSync {
|
|
|
106
116
|
}
|
|
107
117
|
return synced;
|
|
108
118
|
}
|
|
119
|
+
async syncToProjectBoard(store, taskId, issueNumber, payload) {
|
|
120
|
+
if (!this.projectNumber)
|
|
121
|
+
return;
|
|
122
|
+
try {
|
|
123
|
+
const itemId = await this.projectsClient.ensureItemInProject(issueNumber);
|
|
124
|
+
if (!itemId)
|
|
125
|
+
return;
|
|
126
|
+
const status = payload['status'] ?? 'backlog';
|
|
127
|
+
const complexity = payload['complexity'];
|
|
128
|
+
// Update Status field on board
|
|
129
|
+
await this.projectsClient.setStatus(itemId, this.mapStatus(status));
|
|
130
|
+
// Update Complexity field
|
|
131
|
+
if (complexity !== undefined) {
|
|
132
|
+
await this.projectsClient.setNumberField(itemId, 'Complexity', complexity);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
137
|
+
console.error(`[push] Projects V2 sync failed for ${taskId}: ${msg}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
mapStatus(taskStatus) {
|
|
141
|
+
const map = {
|
|
142
|
+
'todo': 'Todo', 'backlog': 'Todo',
|
|
143
|
+
'in_progress': 'In Progress',
|
|
144
|
+
'done': 'Done',
|
|
145
|
+
'blocked': 'Todo',
|
|
146
|
+
};
|
|
147
|
+
return map[taskStatus] ?? 'Todo';
|
|
148
|
+
}
|
|
109
149
|
statusToLabel(status) {
|
|
110
150
|
const map = {
|
|
111
151
|
in_progress: 'forge:tracked',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/github/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAkB1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/github/push.ts"],"names":[],"mappings":"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"}
|
package/dist/src/github/setup.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { execFile } from 'node:child_process';
|
|
2
2
|
import { promisify } from 'node:util';
|
|
3
3
|
const execFileAsync = promisify(execFile);
|
|
4
|
+
const CUSTOM_FIELDS = [
|
|
5
|
+
{ name: 'Complexity', type: 'NUMBER' },
|
|
6
|
+
{ name: 'Priority', type: 'SINGLE_SELECT', options: ['high', 'medium', 'low'] },
|
|
7
|
+
{ name: 'Phase', type: 'SINGLE_SELECT', options: ['plan', 'do', 'check', 'done'] },
|
|
8
|
+
];
|
|
4
9
|
const LABELS = [
|
|
5
10
|
{ name: 'forge:tracked', color: '2ea44f' },
|
|
6
11
|
{ name: 'forge:done', color: '6f42c1' },
|
|
@@ -37,7 +42,26 @@ export async function setupGitHubProject(owner, repo) {
|
|
|
37
42
|
]);
|
|
38
43
|
const projectData = JSON.parse(createOut);
|
|
39
44
|
const projectNumber = projectData.number;
|
|
40
|
-
// 2. Create
|
|
45
|
+
// 2. Create custom fields on the project board
|
|
46
|
+
const fieldsCreated = [];
|
|
47
|
+
for (const field of CUSTOM_FIELDS) {
|
|
48
|
+
try {
|
|
49
|
+
const args = [
|
|
50
|
+
'project', 'field-create', String(projectNumber),
|
|
51
|
+
'--owner', owner, '--name', field.name, '--data-type', field.type,
|
|
52
|
+
];
|
|
53
|
+
if (field.options?.length) {
|
|
54
|
+
args.push('--single-select-options', field.options.join(','));
|
|
55
|
+
}
|
|
56
|
+
await execFileAsync('gh', args);
|
|
57
|
+
fieldsCreated.push(field.name);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
61
|
+
console.error(`[setup] Failed to create field ${field.name}: ${msg}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// 3. Create labels on the repo
|
|
41
65
|
const labelsCreated = [];
|
|
42
66
|
for (const label of LABELS) {
|
|
43
67
|
try {
|
|
@@ -53,7 +77,7 @@ export async function setupGitHubProject(owner, repo) {
|
|
|
53
77
|
console.error(`[setup] Failed to create label ${label.name}: ${msg}`);
|
|
54
78
|
}
|
|
55
79
|
}
|
|
56
|
-
return { projectNumber, fieldsCreated
|
|
80
|
+
return { projectNumber, fieldsCreated, labelsCreated };
|
|
57
81
|
}
|
|
58
82
|
export async function detectGitHubRemote() {
|
|
59
83
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/github/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C,MAAM,MAAM,GAA2C;IACrD,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC1C,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE;IACvC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE;IACzC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC1C,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC5C,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE;CAC1C,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4DAA4D,EAAE,CAAC;IAC5F,CAAC;IACD,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,IAAY;IAEZ,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC9C,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEhD,8BAA8B;IAC9B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE;QACtD,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK;QACrC,SAAS,EAAE,YAAY,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM;KAClD,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAuB,CAAC;IAChE,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC;IAEzC,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/github/setup.ts"],"names":[],"mappings":"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"}
|