コンテンツにスキップ
検索語を入力してください

    Markdown / Terraform 連携

    dagaynはアプリケーションコードだけでなく、設計書とインフラ定義を同じグラフに載せる。ポリグロットリポジトリで コード ↔ 設計書 ↔ インフラ を横断クエリできるのがforkの主要な差分である。

    File (docs/architecture.md)
    └── DocSection (docs/arch.md::overview)
    ├── DocSection (docs/arch.md::api-design) [CONTAINS]
    └── DocBody (docs/arch.md::overview--body-1) [CONTAINS]
    要素qualified namekind
    ドキュメントファイルパスFile
    # Heading######file::slugDocSection
    Setext H1/H2同上DocSection
    段落・リスト・表・コードブロックfile::slug--body-NDocBody

    GitHub Markdown互換:

    • 英数字は小文字化
    • 空白・ハイフンは - に統一
    • その他記号は除去
    • 重複見出しは -1, -2 サフィックス

    例:## API Referenceapi-reference## user_id lookupuser_id-lookup

    kindトリガー
    CONTAINS見出しの親子関係
    REFERENCES[text](./other.md#section) または [text](#local)
    IMPORTS_FROM別ファイルへのリンク
    DEPENDS_ONdirective コメント
    CROSS_ARTIFACTインラインコードスパン(後処理で解決)

    外部URL(http://, mailto:)は無視する。

    HTMLコメント形式で文書間依存を機械可読にする。

    <!-- constrained-by ./decisions/adr-001.md#context -->
    <!-- blocked-by ./specs/open-issue.md -->
    <!-- supersedes ./old-api.md#endpoint-design -->
    <!-- derived-from ./research/background.md#findings -->
    directive意味典型用途
    constrained-by参照先が設計を制約ADR → 設計書
    blocked-by参照先解決まで実装ブロック未決 issue
    supersedesこの文書が参照先を置換旧 API doc
    derived-fromこのセクションが参照先から派生調査メモ → 設計

    各directiveは DEPENDS_ON エッジ。markdown_directive_kind 属性に種別が記録される。

    形式エッジ
    [text](./path.md#section)IMPORTS_FROM + REFERENCES
    [text](#local-section)同一ファイル内 REFERENCES
    [ref]: path 参照定義スタイル同上

    `BridgeDetector` のようなインラインコードはシンボル名として解決される。

    結果動作
    0 件エッジ破棄
    1 件CROSS_ARTIFACT(confidence HIGH)
    複数件エッジ破棄

    短い汎用語(list, parser 等)はフィルタされる。モジュール修飾名(module.Class)を使うと一意解決しやすい。

    query_graph_tool

    • docs_for — コード → 関連doc
    • implementations_of — doc → 実装コード

    upstream docs/MARKDOWN-AUTHORING.md にdagayn向けの執筆ガイドがある。directiveの置き場所、セクション依存の順序、コードスパンの選び方をまとめている。

    fork tree-sitter-terraform.tf / .tfvars をパースする。HCL全般ではなく Terraform 運用に必要な構造 を直接クエリする。

    blockqualified namekind
    resource "type" "name"resource.type.nameClass
    data "type" "name"data.type.nameClass
    variable "name"var.nameFunction
    locals { k = … }local.k(属性ごと)Function
    output "name"output.nameFunction
    module "name"module.nameClass
    provider "name"provider.nameClass
    terraform {}terraformClass
    check "name"check.nameTest
    ephemeral "type" "name"ephemeral.type.nameClass

    import {} / moved {} / removed {} はエッジのみ(ノードなし)。

    kind抽出元
    REFERENCESvar.x, local.x, module.x, data.type.name, resource.type.name 等の式
    CALLSmerge(), length() 等の組込関数
    IMPORTS_FROMmodulesourceterraform.required_providersimport block
    CONTAINSファイル → block
    DEPENDS_ONrequired_providers のバージョン制約

    組込プレフィックス(count, each, path, self, terraform)はREFERENCES抽出から除外する。

    module blockの source がローカルパスの場合:

    module.vpc ──IMPORTS_FROM──> modules/vpc/(ディレクトリ)

    impact radiusがモジュール境界を越えて追跡できる。

    トップレベル属性は var.name ノードとなり、対応する variable blockへ REFERENCES で接続される。変数の 定義と値 をグラフ上でつなげる。

    問いたどり方
    この ADR はどのコードを制約するかdoc DEPENDS_ONCROSS_ARTIFACT → callers
    この TF module 変更の影響はmodule.x の REFERENCES / IMPORTS_FROM を impact
    この関数の説明 doc はimplementations_of
    • directiveが意図どおり DEPENDS_ON になっているか
    • コードスパンが CROSS_ARTIFACT に一意解決するか
    • TF module source がグラフ上で追跡できるか
    • doc間リンクの #anchor が実在セクションを指すか