From anomalyarmor-agents
Explore data lineage and dependencies. Handles "what depends on this table", "where does this data come from", "impact analysis", "upstream dependencies", "downstream consumers".
npx claudepluginhub anomalyarmor/agents --plugin armorThis skill uses the workspace's default tool permissions.
Explore upstream dependencies and downstream consumers of your data assets.
Conducts multi-round deep research on GitHub repos via API and web searches, generating markdown reports with executive summaries, timelines, metrics, and Mermaid diagrams.
Dynamically discovers and combines enabled skills into cohesive, unexpected delightful experiences like interactive HTML or themed artifacts. Activates on 'surprise me', inspiration, or boredom cues.
Generates images from structured JSON prompts via Python script execution. Supports reference images and aspect ratios for characters, scenes, products, visuals.
Explore upstream dependencies and downstream consumers of your data assets.
~/.armor/config.yaml or ARMOR_API_KEY env var)pip install anomalyarmor)client.lineage.get() to fetch lineage graphfrom anomalyarmor import Client
client = Client()
# Get upstream lineage (where data comes from)
lineage = client.lineage.get(
asset_id="asset-uuid",
direction="upstream",
depth=2
)
print(f"Table: {lineage.root.qualified_name}")
print(f"\nUpstream Dependencies ({len(lineage.upstream)} tables):")
for node in lineage.upstream:
print(f" {node.qualified_name}")
if node.asset_type:
print(f" Type: {node.asset_type}")
# Get downstream lineage (what depends on this)
lineage = client.lineage.get(
asset_id="asset-uuid",
direction="downstream",
depth=2
)
print(f"Table: {lineage.root.qualified_name}")
print(f"\nDownstream Consumers ({len(lineage.downstream)} tables):")
for node in lineage.downstream:
print(f" {node.qualified_name}")
# Full impact analysis before making changes
lineage = client.lineage.get(
asset_id="asset-uuid",
direction="both",
depth=3
)
print("=== IMPACT ANALYSIS ===")
print(f"\nTable: {lineage.root.qualified_name}")
# Upstream (what feeds this table)
print(f"\nData Sources ({len(lineage.upstream)} tables):")
for node in lineage.upstream:
print(f" <- {node.qualified_name}")
# Downstream (what will be affected by changes)
print(f"\nWill Impact ({len(lineage.downstream)} tables):")
for node in lineage.downstream:
print(f" -> {node.qualified_name}")
# Edges show the relationships
print(f"\nRelationships ({len(lineage.edges)} edges):")
for edge in lineage.edges:
print(f" {edge.source} -> {edge.target}")
# List lineage summaries for multiple assets
lineage_list = client.lineage.list(limit=50)
for item in lineage_list:
print(f"{item.qualified_name}:")
print(f" Upstream: {item.upstream_count}")
print(f" Downstream: {item.downstream_count}")
=== IMPACT ANALYSIS ===
Table: warehouse.gold.fact_orders
Data Sources (4 tables):
<- warehouse.staging.orders_raw
<- warehouse.staging.customers
<- warehouse.staging.products
<- warehouse.raw.events
Will Impact (7 tables):
-> warehouse.gold.daily_revenue
-> warehouse.gold.customer_metrics
-> warehouse.reporting.exec_dashboard
-> warehouse.reporting.sales_report
-> warehouse.ml.churn_features
-> warehouse.ml.ltv_predictions
-> external.bi_tool.orders_view
Relationships (11 edges):
staging.orders_raw -> gold.fact_orders
staging.customers -> gold.fact_orders
...
/armor:investigate/armor:quality on critical paths