@flydocs/cli 0.6.0-alpha.3 → 0.6.0-alpha.30

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 (151) hide show
  1. package/dist/cli.js +2054 -470
  2. package/package.json +1 -1
  3. package/template/.claude/CLAUDE.md +43 -48
  4. package/template/.claude/agents/implementation-agent.md +1 -1
  5. package/template/.claude/agents/pm-agent.md +1 -1
  6. package/template/.claude/commands/activate.md +1 -1
  7. package/template/.claude/commands/attach.md +1 -1
  8. package/template/.claude/commands/block.md +2 -2
  9. package/template/.claude/commands/capture.md +1 -1
  10. package/template/.claude/commands/close.md +1 -1
  11. package/template/.claude/commands/flydocs-setup.md +359 -72
  12. package/template/.claude/commands/flydocs-upgrade.md +26 -27
  13. package/template/.claude/commands/implement.md +1 -1
  14. package/template/.claude/commands/knowledge.md +61 -0
  15. package/template/.claude/commands/new-project.md +1 -1
  16. package/template/.claude/commands/onboard.md +275 -0
  17. package/template/.claude/commands/project-update.md +1 -1
  18. package/template/.claude/commands/refine.md +1 -1
  19. package/template/.claude/commands/review.md +1 -1
  20. package/template/.claude/commands/start-session.md +1 -1
  21. package/template/.claude/commands/status.md +1 -1
  22. package/template/.claude/commands/validate.md +1 -1
  23. package/template/.claude/commands/wrap-session.md +1 -1
  24. package/template/.claude/hooks/auto-approve.py +212 -0
  25. package/template/.claude/hooks/post-pr-check.py +108 -0
  26. package/template/.claude/hooks/post-transition-check.py +281 -0
  27. package/template/.claude/hooks/prompt-submit.py +554 -0
  28. package/template/.claude/hooks/session-start.py +262 -0
  29. package/template/.claude/hooks/stop-gate.py +162 -0
  30. package/template/.claude/settings.json +41 -4
  31. package/template/.claude/skills/README.md +23 -25
  32. package/template/.claude/skills/flydocs-workflow/SKILL.md +134 -42
  33. package/template/.claude/skills/flydocs-workflow/cursor-rule.mdc +9 -8
  34. package/template/.claude/skills/flydocs-workflow/reference/comment-templates.md +1 -0
  35. package/template/.claude/skills/flydocs-workflow/reference/golden-rules.md +28 -17
  36. package/template/.claude/skills/flydocs-workflow/reference/graph-schema.md +116 -0
  37. package/template/.claude/skills/flydocs-workflow/reference/pr-workflow.md +120 -0
  38. package/template/.claude/skills/flydocs-workflow/reference/priority-estimates.md +37 -15
  39. package/template/.claude/skills/flydocs-workflow/reference/service-descriptor-schema.md +260 -0
  40. package/template/.claude/skills/flydocs-workflow/reference/status-workflow.md +26 -26
  41. package/template/.claude/skills/flydocs-workflow/scripts/_local/__init__.py +0 -0
  42. package/template/.claude/skills/{flydocs-local/scripts/flydocs_api.py → flydocs-workflow/scripts/_local/file_store.py} +137 -47
  43. package/template/.claude/skills/flydocs-workflow/scripts/flydocs_api.py +724 -0
  44. package/template/{.flydocs → .claude/skills/flydocs-workflow}/scripts/generate_manifest.py +4 -4
  45. package/template/.claude/skills/{flydocs-context-graph → flydocs-workflow}/scripts/graph_build.py +132 -1
  46. package/template/.claude/skills/{flydocs-context-graph → flydocs-workflow}/scripts/graph_query.py +18 -5
  47. package/template/.claude/skills/{flydocs-context-graph → flydocs-workflow}/scripts/graph_session.py +1 -10
  48. package/template/.claude/skills/{flydocs-context-graph → flydocs-workflow}/scripts/graph_update.py +4 -4
  49. package/template/.claude/skills/{flydocs-context-graph → flydocs-workflow}/scripts/graph_utils.py +2 -1
  50. package/template/.claude/skills/flydocs-workflow/scripts/issues.py +738 -0
  51. package/template/.claude/skills/flydocs-workflow/scripts/projects.py +144 -0
  52. package/template/.claude/skills/flydocs-workflow/scripts/pull_services.py +128 -0
  53. package/template/.claude/skills/flydocs-workflow/scripts/push_service.py +132 -0
  54. package/template/.claude/skills/flydocs-workflow/scripts/session.py +54 -0
  55. package/template/.claude/skills/flydocs-workflow/scripts/test_enforcement.py +225 -0
  56. package/template/.claude/skills/flydocs-workflow/scripts/workspace.py +902 -0
  57. package/template/.claude/skills/flydocs-workflow/session.md +87 -29
  58. package/template/.claude/skills/flydocs-workflow/stages/activate.md +18 -7
  59. package/template/.claude/skills/flydocs-workflow/stages/capture.md +10 -5
  60. package/template/.claude/skills/flydocs-workflow/stages/close.md +4 -3
  61. package/template/.claude/skills/flydocs-workflow/stages/implement.md +33 -9
  62. package/template/.claude/skills/flydocs-workflow/stages/refine.md +22 -6
  63. package/template/.claude/skills/flydocs-workflow/stages/review.md +16 -4
  64. package/template/.claude/skills/flydocs-workflow/stages/validate.md +3 -1
  65. package/template/.claude/skills/flydocs-workflow/templates/pr/default.md +33 -0
  66. package/template/.cursor/agents/implementation-agent.md +1 -1
  67. package/template/.cursor/agents/pm-agent.md +2 -2
  68. package/template/.cursor/hooks.json +10 -3
  69. package/template/.env.example +6 -6
  70. package/template/.flydocs/config.json +5 -18
  71. package/template/.flydocs/templates/README.md +13 -14
  72. package/template/.flydocs/templates/bug.md +17 -153
  73. package/template/.flydocs/templates/chore.md +10 -98
  74. package/template/.flydocs/templates/feature.md +12 -158
  75. package/template/.flydocs/templates/idea.md +11 -111
  76. package/template/.flydocs/templates/quick-capture.md +4 -8
  77. package/template/.flydocs/version +1 -1
  78. package/template/AGENTS.md +44 -32
  79. package/template/CHANGELOG.md +37 -0
  80. package/template/flydocs/README.md +1 -3
  81. package/template/flydocs/context/project.md +6 -3
  82. package/template/flydocs/design-system/README.md +3 -3
  83. package/template/flydocs/knowledge/INDEX.md +38 -53
  84. package/template/flydocs/knowledge/README.md +60 -9
  85. package/template/flydocs/knowledge/templates/decision.md +47 -0
  86. package/template/flydocs/knowledge/templates/feature.md +35 -0
  87. package/template/flydocs/knowledge/templates/note.md +25 -0
  88. package/template/manifest.json +24 -20
  89. package/template/.claude/skills/flydocs-cloud/SKILL.md +0 -113
  90. package/template/.claude/skills/flydocs-cloud/cursor-rule.mdc +0 -50
  91. package/template/.claude/skills/flydocs-cloud/scripts/assign.py +0 -22
  92. package/template/.claude/skills/flydocs-cloud/scripts/assign_cycle.py +0 -28
  93. package/template/.claude/skills/flydocs-cloud/scripts/assign_milestone.py +0 -22
  94. package/template/.claude/skills/flydocs-cloud/scripts/comment.py +0 -29
  95. package/template/.claude/skills/flydocs-cloud/scripts/create_issue.py +0 -66
  96. package/template/.claude/skills/flydocs-cloud/scripts/create_milestone.py +0 -35
  97. package/template/.claude/skills/flydocs-cloud/scripts/create_project.py +0 -33
  98. package/template/.claude/skills/flydocs-cloud/scripts/create_team.py +0 -39
  99. package/template/.claude/skills/flydocs-cloud/scripts/estimate.py +0 -29
  100. package/template/.claude/skills/flydocs-cloud/scripts/flydocs_api.py +0 -210
  101. package/template/.claude/skills/flydocs-cloud/scripts/get_issue.py +0 -24
  102. package/template/.claude/skills/flydocs-cloud/scripts/link.py +0 -28
  103. package/template/.claude/skills/flydocs-cloud/scripts/list_cycles.py +0 -28
  104. package/template/.claude/skills/flydocs-cloud/scripts/list_issues.py +0 -44
  105. package/template/.claude/skills/flydocs-cloud/scripts/list_labels.py +0 -19
  106. package/template/.claude/skills/flydocs-cloud/scripts/list_milestones.py +0 -28
  107. package/template/.claude/skills/flydocs-cloud/scripts/list_projects.py +0 -31
  108. package/template/.claude/skills/flydocs-cloud/scripts/list_providers.py +0 -19
  109. package/template/.claude/skills/flydocs-cloud/scripts/list_teams.py +0 -19
  110. package/template/.claude/skills/flydocs-cloud/scripts/priority.py +0 -29
  111. package/template/.claude/skills/flydocs-cloud/scripts/project_update.py +0 -45
  112. package/template/.claude/skills/flydocs-cloud/scripts/set_labels.py +0 -68
  113. package/template/.claude/skills/flydocs-cloud/scripts/set_provider.py +0 -46
  114. package/template/.claude/skills/flydocs-cloud/scripts/set_team.py +0 -41
  115. package/template/.claude/skills/flydocs-cloud/scripts/transition.py +0 -26
  116. package/template/.claude/skills/flydocs-cloud/scripts/update_description.py +0 -36
  117. package/template/.claude/skills/flydocs-cloud/scripts/update_issue.py +0 -82
  118. package/template/.claude/skills/flydocs-context-graph/SKILL.md +0 -87
  119. package/template/.claude/skills/flydocs-context-graph/schema.md +0 -78
  120. package/template/.claude/skills/flydocs-context-graph/scripts/graph_context.py +0 -338
  121. package/template/.claude/skills/flydocs-context7/SKILL.md +0 -105
  122. package/template/.claude/skills/flydocs-context7/cursor-rule.mdc +0 -49
  123. package/template/.claude/skills/flydocs-context7/scripts/context7.py +0 -293
  124. package/template/.claude/skills/flydocs-estimates/SKILL.md +0 -384
  125. package/template/.claude/skills/flydocs-figma/SKILL.md +0 -377
  126. package/template/.claude/skills/flydocs-figma/references/PROMPTING.md +0 -108
  127. package/template/.claude/skills/flydocs-figma/references/TROUBLESHOOTING.md +0 -112
  128. package/template/.claude/skills/flydocs-local/SKILL.md +0 -103
  129. package/template/.claude/skills/flydocs-local/cursor-rule.mdc +0 -43
  130. package/template/.claude/skills/flydocs-local/scripts/assign.py +0 -20
  131. package/template/.claude/skills/flydocs-local/scripts/comment.py +0 -27
  132. package/template/.claude/skills/flydocs-local/scripts/create_issue.py +0 -44
  133. package/template/.claude/skills/flydocs-local/scripts/estimate.py +0 -37
  134. package/template/.claude/skills/flydocs-local/scripts/get_issue.py +0 -20
  135. package/template/.claude/skills/flydocs-local/scripts/link.py +0 -41
  136. package/template/.claude/skills/flydocs-local/scripts/list_issues.py +0 -34
  137. package/template/.claude/skills/flydocs-local/scripts/priority.py +0 -37
  138. package/template/.claude/skills/flydocs-local/scripts/project_update.py +0 -67
  139. package/template/.claude/skills/flydocs-local/scripts/status_summary.py +0 -16
  140. package/template/.claude/skills/flydocs-local/scripts/transition.py +0 -24
  141. package/template/.claude/skills/flydocs-local/scripts/update_description.py +0 -35
  142. package/template/.claude/skills/flydocs-local/scripts/update_issue.py +0 -84
  143. package/template/.flydocs/hooks/auto-approve.py +0 -71
  144. package/template/.flydocs/hooks/prompt-submit.py +0 -277
  145. package/template/.flydocs/scripts/skill_manager.py +0 -541
  146. /package/template/{.flydocs → .claude}/hooks/post-edit.py +0 -0
  147. /package/template/.claude/skills/{flydocs-estimates/references → flydocs-workflow/reference}/provider-costs.md +0 -0
  148. /package/template/.claude/skills/flydocs-workflow/templates/{bug.md → issues/bug.md} +0 -0
  149. /package/template/.claude/skills/flydocs-workflow/templates/{chore.md → issues/chore.md} +0 -0
  150. /package/template/.claude/skills/flydocs-workflow/templates/{feature.md → issues/feature.md} +0 -0
  151. /package/template/.claude/skills/flydocs-workflow/templates/{idea.md → issues/idea.md} +0 -0
@@ -186,8 +186,8 @@ def build_manifest(skills, loads_after=None):
186
186
  MARKER_START,
187
187
  "## Skills Index",
188
188
  "",
189
- "IMPORTANT: Prefer skill-led reasoning over pre-training reasoning.",
190
- "Consult the relevant skill BEFORE writing code or making workflow decisions.",
189
+ "Consult the workflow skill for **issue operations and status transitions only**.",
190
+ "For general coding tasks, skip this \u2014 just write code.",
191
191
  "",
192
192
  "| Skill | Triggers | Entry | Loads After |",
193
193
  "|-------|----------|-------|-------------|",
@@ -205,8 +205,8 @@ def build_manifest(skills, loads_after=None):
205
205
  MARKER_START,
206
206
  "## Skills Index",
207
207
  "",
208
- "IMPORTANT: Prefer skill-led reasoning over pre-training reasoning.",
209
- "Consult the relevant skill BEFORE writing code or making workflow decisions.",
208
+ "Consult the workflow skill for **issue operations and status transitions only**.",
209
+ "For general coding tasks, skip this \u2014 just write code.",
210
210
  "",
211
211
  "| Skill | Triggers | Entry |",
212
212
  "|-------|----------|-------|",
@@ -5,7 +5,7 @@ Scans skills (SKILL.md frontmatter) and ADRs (decisions/*.md cross-references)
5
5
  to produce flydocs/context/graph.json. Preserves manually-added nodes and edges.
6
6
 
7
7
  Usage:
8
- python3 .claude/skills/flydocs-context-graph/scripts/graph_build.py [--root PATH]
8
+ python3 .claude/skills/flydocs-workflow/scripts/graph_build.py [--root PATH]
9
9
  """
10
10
 
11
11
  import argparse
@@ -201,6 +201,129 @@ def classify_relationship(context):
201
201
  return "RELATES_TO"
202
202
 
203
203
 
204
+ # --- Service descriptor scanning ---
205
+
206
+
207
+ def scan_service_descriptor(root):
208
+ """Scan flydocs/context/service.json and return repo node + edges."""
209
+ nodes = {}
210
+ edges = []
211
+
212
+ service_file = root / "flydocs" / "context" / "service.json"
213
+ if not service_file.is_file():
214
+ return nodes, edges
215
+
216
+ import json
217
+ try:
218
+ data = json.loads(service_file.read_text(encoding="utf-8"))
219
+ except (json.JSONDecodeError, OSError):
220
+ return nodes, edges
221
+
222
+ if data.get("version") not in (1, 2):
223
+ return nodes, edges
224
+
225
+ repo_slug = data.get("repoSlug", "")
226
+ if not repo_slug:
227
+ return nodes, edges
228
+
229
+ node_id = f"repo:{repo_slug}"
230
+ nodes[node_id] = {
231
+ "type": "repo",
232
+ "label": data.get("name", repo_slug),
233
+ "path": "flydocs/context/service.json",
234
+ "purpose": data.get("purpose", ""),
235
+ "stack": data.get("stack", []),
236
+ }
237
+
238
+ # Create CONSUMES edges from dependencies
239
+ for dep in data.get("dependencies", []):
240
+ service = dep.get("service", "")
241
+ if not service:
242
+ continue
243
+ target_id = f"repo:{service}"
244
+ edges.append({
245
+ "from": node_id,
246
+ "to": target_id,
247
+ "rel": "CONSUMES",
248
+ "weight": 1.0,
249
+ "interface": dep.get("interface", ""),
250
+ "description": dep.get("description", ""),
251
+ })
252
+
253
+ return nodes, edges
254
+
255
+
256
+ def scan_sibling_descriptors(root):
257
+ """Scan sibling repos' service.json files for cross-repo edges.
258
+
259
+ Only reads descriptors from sibling directories that have .flydocs/ and
260
+ flydocs/context/service.json. Does NOT generate descriptors for other repos.
261
+ """
262
+ nodes = {}
263
+ edges = []
264
+
265
+ parent = root.parent
266
+ if not parent.is_dir():
267
+ return nodes, edges
268
+
269
+ try:
270
+ siblings = sorted(parent.iterdir())
271
+ except PermissionError:
272
+ return nodes, edges
273
+
274
+ for sibling in siblings:
275
+ if sibling == root or not sibling.is_dir():
276
+ continue
277
+ try:
278
+ if not (sibling / ".git").exists():
279
+ continue
280
+ except PermissionError:
281
+ continue
282
+
283
+ service_file = sibling / "flydocs" / "context" / "service.json"
284
+ if not service_file.is_file():
285
+ continue
286
+
287
+ import json
288
+ try:
289
+ data = json.loads(service_file.read_text(encoding="utf-8"))
290
+ except (json.JSONDecodeError, OSError):
291
+ continue
292
+
293
+ if data.get("version") not in (1, 2):
294
+ continue
295
+
296
+ repo_slug = data.get("repoSlug", "")
297
+ if not repo_slug:
298
+ continue
299
+
300
+ node_id = f"repo:{repo_slug}"
301
+ nodes[node_id] = {
302
+ "type": "repo",
303
+ "label": data.get("name", repo_slug),
304
+ "path": str(service_file),
305
+ "purpose": data.get("purpose", ""),
306
+ "stack": data.get("stack", []),
307
+ }
308
+
309
+ # Create CONSUMES edges from this sibling's dependencies
310
+ for dep in data.get("dependencies", []):
311
+ service = dep.get("service", "")
312
+ if not service:
313
+ continue
314
+ target_id = f"repo:{service}"
315
+ edges.append({
316
+ "from": node_id,
317
+ "to": target_id,
318
+ "rel": "CONSUMES",
319
+ "weight": 1.0,
320
+ "interface": dep.get("interface", ""),
321
+ "description": dep.get("description", ""),
322
+ })
323
+
324
+ return nodes, edges
325
+
326
+
204
327
  # --- Graph merge ---
205
328
 
206
329
 
@@ -263,15 +386,21 @@ def main():
263
386
  # Scan sources
264
387
  skill_nodes, skill_edges = scan_skills(root)
265
388
  adr_nodes, adr_edges = scan_adrs(root)
389
+ service_nodes, service_edges = scan_service_descriptor(root)
390
+ sibling_nodes, sibling_edges = scan_sibling_descriptors(root)
266
391
 
267
392
  # Merge all scanned nodes and edges
268
393
  all_nodes = {}
269
394
  all_nodes.update(skill_nodes)
270
395
  all_nodes.update(adr_nodes)
396
+ all_nodes.update(service_nodes)
397
+ all_nodes.update(sibling_nodes)
271
398
 
272
399
  all_edges = []
273
400
  all_edges.extend(skill_edges)
274
401
  all_edges.extend(adr_edges)
402
+ all_edges.extend(service_edges)
403
+ all_edges.extend(sibling_edges)
275
404
 
276
405
  # Merge with existing graph (preserving manual entries)
277
406
  graph = merge_graph(existing, all_nodes, all_edges)
@@ -280,6 +409,7 @@ def main():
280
409
  save_graph(root, graph)
281
410
 
282
411
  # Report
412
+ repo_count = len(service_nodes) + len(sibling_nodes)
283
413
  output_json({
284
414
  "success": True,
285
415
  "path": str(graph_path_for_report(root)),
@@ -287,6 +417,7 @@ def main():
287
417
  "edges": len(graph["edges"]),
288
418
  "skills": len(skill_nodes),
289
419
  "decisions": len(adr_nodes),
420
+ "repos": repo_count,
290
421
  })
291
422
 
292
423
 
@@ -5,7 +5,7 @@ Returns related nodes for a given starting node, filtered by depth and
5
5
  relationship type. Output as compressed markdown or JSON.
6
6
 
7
7
  Usage:
8
- python3 .claude/skills/flydocs-context-graph/scripts/graph_query.py \\
8
+ python3 .claude/skills/flydocs-workflow/scripts/graph_query.py \\
9
9
  --node decision:001 [--depth 2] [--rel EXTENDS] [--reverse] [--format md|json]
10
10
  """
11
11
 
@@ -91,6 +91,7 @@ def format_markdown(graph, start_node, results):
91
91
 
92
92
  # Type display order
93
93
  type_labels = {
94
+ "repo": "Repos",
94
95
  "decision": "Decisions",
95
96
  "skill": "Skills",
96
97
  "module": "Modules",
@@ -99,7 +100,7 @@ def format_markdown(graph, start_node, results):
99
100
  "concept": "Concepts",
100
101
  }
101
102
 
102
- for node_type in ["decision", "skill", "module", "issue", "session", "concept"]:
103
+ for node_type in ["repo", "decision", "skill", "module", "issue", "session", "concept"]:
103
104
  entries = by_type.get(node_type, [])
104
105
  if not entries:
105
106
  continue
@@ -109,9 +110,21 @@ def format_markdown(graph, start_node, results):
109
110
 
110
111
  for node_id, node, rel, depth in entries:
111
112
  node_label = node.get("label", node_id)
112
- status = node.get("status", "")
113
- status_str = f" [{status}]" if status else ""
114
- lines.append(f"- {node_id}: {node_label} ({rel}){status_str}")
113
+ # Repo nodes show purpose; others show status
114
+ if node_type == "repo":
115
+ purpose = node.get("purpose", "")
116
+ extra = f" — {purpose}" if purpose else ""
117
+ iface = ""
118
+ # Check if the edge that reached this node has interface info
119
+ for e in graph.get("edges", []):
120
+ if (e.get("from") == node_id or e.get("to") == node_id) and e.get("interface"):
121
+ iface = f" via {e['interface']}"
122
+ break
123
+ lines.append(f"- {node_id}: {node_label} ({rel}){iface}{extra}")
124
+ else:
125
+ status = node.get("status", "")
126
+ status_str = f" [{status}]" if status else ""
127
+ lines.append(f"- {node_id}: {node_label} ({rel}){status_str}")
115
128
 
116
129
  lines.append("")
117
130
 
@@ -6,7 +6,7 @@ worked on and decisions produced. Supports cross-session continuity by
6
6
  building the temporal layer that graph_context.py traverses.
7
7
 
8
8
  Usage:
9
- python3 .claude/skills/flydocs-context-graph/scripts/graph_session.py \
9
+ python3 .claude/skills/flydocs-workflow/scripts/graph_session.py \
10
10
  --summary "Completed Phase 1, started Phase 2" \
11
11
  [--issue FLY-56] [--issue FLY-174] \
12
12
  [--decision 006] \
@@ -35,15 +35,6 @@ from graph_utils import (
35
35
  DEFAULT_RETENTION_DAYS = 30
36
36
 
37
37
 
38
- def generate_session_id(session_date):
39
- """Generate a session ID like session:2026-02-17-a.
40
-
41
- If a session with the same date exists, increment the sequence letter.
42
- """
43
- base = f"session:{session_date}"
44
- return base
45
-
46
-
47
38
  def find_next_session_id(graph, session_date):
48
39
  """Find the next available session ID for a given date."""
49
40
  nodes = graph.get("nodes", {})
@@ -2,16 +2,16 @@
2
2
  """Incrementally add or remove nodes and edges in the context graph.
3
3
 
4
4
  Usage:
5
- python3 .claude/skills/flydocs-context-graph/scripts/graph_update.py \\
5
+ python3 .claude/skills/flydocs-workflow/scripts/graph_update.py \\
6
6
  add-node <ID> --type <TYPE> [--label STR] [--path STR]
7
7
 
8
- python3 .claude/skills/flydocs-context-graph/scripts/graph_update.py \\
8
+ python3 .claude/skills/flydocs-workflow/scripts/graph_update.py \\
9
9
  remove-node <ID>
10
10
 
11
- python3 .claude/skills/flydocs-context-graph/scripts/graph_update.py \\
11
+ python3 .claude/skills/flydocs-workflow/scripts/graph_update.py \\
12
12
  add-edge <FROM> <TO> <REL> [--weight N] [--manual]
13
13
 
14
- python3 .claude/skills/flydocs-context-graph/scripts/graph_update.py \\
14
+ python3 .claude/skills/flydocs-workflow/scripts/graph_update.py \\
15
15
  remove-edge <FROM> <TO> <REL>
16
16
  """
17
17
 
@@ -11,10 +11,11 @@ from pathlib import Path
11
11
 
12
12
  GRAPH_REL_PATH = os.path.join("flydocs", "context", "graph.json")
13
13
 
14
- VALID_NODE_TYPES = {"skill", "decision", "issue", "module", "session", "concept"}
14
+ VALID_NODE_TYPES = {"skill", "decision", "issue", "module", "session", "concept", "repo"}
15
15
  VALID_REL_TYPES = {
16
16
  "EXTENDS", "IMPLEMENTS", "DELEGATES_TO", "PRECEDES", "MODIFIES",
17
17
  "WORKED_ON", "PRODUCED", "RELATES_TO", "SUPERSEDES", "BLOCKS",
18
+ "PROVIDES", "CONSUMES",
18
19
  }
19
20
 
20
21