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.
@@ -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":"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"}
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 {};
@@ -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;AAE5D,MAAM,OAAO,cAAc;IAEf;IACA;IACA;IAHV,YACU,KAAa,EACb,IAAY,EACZ,aAAqB;QAFrB,UAAK,GAAL,KAAK,CAAQ;QACb,SAAI,GAAJ,IAAI,CAAQ;QACZ,kBAAa,GAAb,aAAa,CAAQ;QAE7B,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAc;QAC3B,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAE9C,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9B,mBAAmB;YACnB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE;gBAC3C,OAAO;gBACP,QAAQ;gBACR,QAAQ;gBACR,QAAQ;gBACR,SAAS;gBACT,IAAI,CAAC,KAAK;gBACV,QAAQ;gBACR,kBAAkB,IAAI,CAAC,EAAE,eAAe,IAAI,CAAC,MAAM,iBAAiB,IAAI,CAAC,UAAU,EAAE;gBACrF,SAAS;gBACT,eAAe;aAChB,CAAC,CAAC;YACH,kDAAkD;YAClD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1F,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG;gBACf,OAAO;gBACP,MAAM;gBACN,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC;gBAChC,QAAQ;gBACR,QAAQ;gBACR,SAAS;gBACT,IAAI,CAAC,KAAK;gBACV,QAAQ;gBACR,kBAAkB,IAAI,CAAC,EAAE,eAAe,IAAI,CAAC,MAAM,iBAAiB,IAAI,CAAC,UAAU,EAAE;aACtF,CAAC;YACF,IAAI,WAAW,EAAE,CAAC;gBAChB,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC,mBAAmB,CAAC;QAClC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,WAAmB;QACjC,MAAM,aAAa,CAAC,IAAI,EAAE;YACxB,OAAO;YACP,OAAO;YACP,MAAM,CAAC,WAAW,CAAC;YACnB,QAAQ;YACR,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAAmB;QACzC,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CACzB;;;;eAIS,SAAS,EAAE,CACrB,CAAC;QAEF,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAkB,iEAAiE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QAClI,IAAI,YAAY,GAAG,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,UAAU,YAAY,oCAAoC,SAAS,2BAA2B,CAAC,CAAC;QAChH,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAA4B,CAAC;gBAEnE,IAAI,GAAG,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;oBAC/B,IAAI,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;wBAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC;4BAClB,EAAE,EAAE,GAAG,CAAC,SAAS;4BACjB,KAAK,EAAG,OAAO,CAAC,OAAO,CAAwB,IAAI,GAAG,CAAC,SAAS;4BAChE,MAAM,EAAG,OAAO,CAAC,QAAQ,CAAwB,IAAI,SAAS;4BAC9D,UAAU,EAAG,OAAO,CAAC,YAAY,CAAwB,IAAI,CAAC;4BAC9D,mBAAmB,EAAE,OAAO,CAAC,qBAAqB,CAAuB;yBAC1E,CAAC,CAAC;oBACL,CAAC;yBAAM,IAAI,GAAG,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;wBACrC,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAuB,CAAC;wBACzE,IAAI,WAAW,EAAE,CAAC;4BAChB,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;wBACpC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,KAAK,CAAC,GAAG,CACP,iEAAiE,EACjE,CAAC,GAAG,CAAC,EAAE,CAAC,CACT,CAAC;gBACF,MAAM,EAAE,CAAC;YACX,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,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,qCAAqC,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,aAAa,CAAC,MAAc;QAClC,MAAM,GAAG,GAA2B;YAClC,WAAW,EAAE,eAAe;YAC5B,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,cAAc;SACxB,CAAC;QACF,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC7B,CAAC;CACF"}
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/github/push.ts"],"names":[],"mappings":"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"}
@@ -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 labels (no custom fields labels are sufficient for visibility)
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: [], labelsCreated };
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":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/github/setup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forgepm",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Invisible PM layer for AI coding agents — EVM, tolerances, PDCA, calibration",
5
5
  "type": "module",
6
6
  "bin": {